6 CONFIG
= 'game_config.xml'
8 WINDOW_SIZE
= (640, 480)
9 WINDOW_CAPTION
= "Testing stuff"
12 BROADCAST_BIND
= 50031
22 MULTICAST
= '234.0.0.1'
26 GUI_THEME
= 'theme_two.zip'
27 WIDGETS_FILE
= 'widgets.xml'
36 from protocol
import *
42 sys
.path
.insert(0, 'pygame_gui')
46 from xml
.dom
.minidom
import parse
, parseString
47 from threading
import Lock
51 from twisted
.internet
.protocol
import DatagramProtocol
52 from twisted
.internet
import reactor
53 from twisted
.internet
import task
60 from DerGUI
import GUISystem
64 from OpenGL
.GL
import *
66 from OpenGL
.GLU
import *
69 from Dice3DS
import dom3ds
, util
71 NFUNC
= util
.calculate_normals_no_smoothing
78 # parse command line stuff
83 print "main(): No configuration file specified, using default of", CONFIG
86 configuration
= parse_config(config
)
88 if configuration
.has_key('error') and configuration
['error']:
89 print "main(): Error parsing configuration"
92 event_queue
= ThreadQueue()
94 multicast
= Multicast()
97 engine
= Engine(configuration
, event_queue
, client
)
99 client
.init(configuration
, event_queue
, engine
, multicast
)
101 net_thread
= threading
.Thread(target
=net_thread_func
, args
=(), kwargs
={'dmulticast': multicast
, 'dclient':client
, 'configs':configuration
})
110 def net_thread_func(dmulticast
, dclient
, configs
):
112 reactor
.listenMulticast(configs
['broadcast_port'], dmulticast
)
113 reactor
.listenUDP(configs
['message_port'], dclient
)
115 echo_request
= task
.LoopingCall(dclient
.serverRequest
)
117 if configs
.has_key('echo_time') and configs
['echo_time'] != None:
118 echo_request
.start(configs
['echo_time'])
120 print "net_thread_func(): No ECHO_TIME specified, using default of", ECHO_TIME
121 echo_request
.start(ECHO_TIME
)
123 reactor
.run(installSignalHandlers
=0)
127 def parse_config(filename
):
128 results
= {'error': 1}
130 if (exists(filename
)):
131 dom
= parse(filename
)
133 print "parse_config():", filename
, "doesn't exist."
136 results
= {'window_title': None,
141 'message_port': None,
142 'broadcast_port': None,
143 'broadcast_bind': None,
145 'background_color': None,
152 if (dom
.childNodes
[0].nodeName
== 'config'):
153 for node
in dom
.childNodes
[0].childNodes
:
155 if (node
.nodeName
== 'window_title'):
156 results
['window_title'] = node
.childNodes
[0].nodeValue
158 if (node
.nodeName
== 'log'):
159 results
['log'] = node
.childNodes
[0].nodeValue
161 if (node
.nodeName
== 'name'):
162 results
['name'] = node
.childNodes
[0].nodeValue
164 if (node
.nodeName
== 'font'):
165 results
['font'] = node
.childNodes
[0].nodeValue
167 if (node
.nodeName
== 'init'):
168 results
['init'] = node
.childNodes
[0].nodeValue
170 if (node
.nodeName
== 'message_port'):
171 results
['message_port'] = int(node
.childNodes
[0].nodeValue
)
173 if (node
.nodeName
== 'broadcast_port'):
174 results
['broadcast_port'] = int(node
.childNodes
[0].nodeValue
)
176 if (node
.nodeName
== 'broadcast_bind'):
177 results
['broadcast_bind'] = int(node
.childNodes
[0].nodeValue
)
179 if (node
.nodeName
== 'fullscreen'):
180 results
['fullscreen'] = int(node
.childNodes
[0].nodeValue
)
182 if (node
.nodeName
== 'background_color'):
184 string_parts
= node
.childNodes
[0].nodeValue
.split()
185 results
['background_color'] = [float(string_parts
[0]), float(string_parts
[1])]
186 results
['background_color'].append(float(string_parts
[2]))
187 results
['background_color'].append(float(string_parts
[3]))
189 if (node
.nodeName
== 'window_size'):
191 string_parts
= node
.childNodes
[0].nodeValue
.split()
192 results
['window_size'] = ((int(string_parts
[0]), int(string_parts
[1])))
194 if (node
.nodeName
== 'gravity'):
196 string_parts
= node
.childNodes
[0].nodeValue
.split()
197 results
['gravity'] = [float(string_parts
[0]), float(string_parts
[1])]
198 results
['gravity'].append(float(string_parts
[2]))
200 if (node
.nodeName
== 'step_size'):
201 results
['step_size'] = float(node
.childNodes
[0].nodeValue
)
203 if (node
.nodeName
== 'pack_dir'):
204 results
['pack_dir'] = node
.childNodes
[0].nodeValue
206 if (node
.nodeName
== 'echo_time'):
207 results
['echo_time'] = int(node
.childNodes
[0].nodeValue
)
217 self
.items_lock
= Lock()
219 def append(self
, new_item
):
220 self
.items_lock
.acquire()
221 self
.items
.append(new_item
)
222 self
.items_lock
.release()
225 self
.items_lock
.acquire()
227 the_item
= self
.items
.pop(0)
230 self
.items_lock
.release()
235 return len(self
.items
)
237 class Multicast(DatagramProtocol
):
239 def startProtocol(self
):
240 self
.transport
.joinGroup(MULTICAST
)
242 def datagramReceived(self
, datagram
, address
):
243 self
.transport
.write(final
, address
)
248 def __init__(self
, config
, event_queue
, client
):
252 self
.event_queue
= event_queue
256 video_flags
= OPENGL|DOUBLEBUF
258 assert config
.has_key('window_size')
259 self
.display
= pygame
.display
.set_mode(config
['window_size'], video_flags
)
261 self
.resize((config
['window_size']))
265 if not self
.config
.has_key('background_color') or self
.config
['background_color'] == None:
266 self
.config
['background_color'] = (0, 0, 0, 0)
267 print "Engine.__init__(): No background color specified, using default of (0, 0, 0, 0)"
269 glShadeModel(GL_SMOOTH
)
270 glClearColor(self
.config
['background_color'][0],
271 self
.config
['background_color'][1],
272 self
.config
['background_color'][2],
273 self
.config
['background_color'][3])
275 glEnable(GL_DEPTH_TEST
)
276 glDepthFunc(GL_LEQUAL
)
277 glHint(GL_PERSPECTIVE_CORRECTION_HINT
, GL_NICEST
)
281 self
.camera
= Camera((0, 0, 0), (0, 0, 0))
283 if not self
.config
.has_key('window_title') or self
.config
.has_key('window_title') == None:
284 self
.config
['window_title'] = WINDOW_CAPTION
285 print "Engine.__init__(): No window title specified, using default of", WINDOW_CAPTION
287 pygame
.display
.set_caption(self
.config
['window_title'])
289 self
.lamina_screen
= lamina
.LaminaScreenSurface()
290 self
.gui_system
= GUISystem(WIDGETS_FILE
, GUI_THEME
)
299 if not self
.config
.has_key('pack_dir') or self
.config
['pack_dir'] == None:
300 self
.config
['pack_dir'] = PACK_DIR
301 print "Engine.__init__(): No pack dir specified, using default of", PACK_DIR
303 for file in listdir(self
.config
['pack_dir']):
304 if is_zipfile(os
.path
.join(self
.config
['pack_dir'], file)):
305 self
.zipfiles
.append(ZipFile(os
.path
.join(self
.config
['pack_dir'], file)))
307 if not self
.config
.has_key('init') or self
.config
['init'] == None:
308 self
.config
['init'] = INIT
309 print "Engine.__init__(): No initial file specified, using default of", INIT
311 self
.running
= self
.addFile(self
.config
['init'])
313 print "Engine.__init__(): Failed adding initial file"
319 self
.gui_system
.draw(self
.lamina_screen
.surf
)
320 self
.lamina_screen
.refresh()
324 self
.process_events()
326 pygame
.display
.flip()
330 def process_events(self
):
332 for e
in pygame
.event
.get():
335 print "Engine.process_events(): Should be quitting..."
339 self
.change
= self
.gui_system
.event(e
)
341 new_event
= self
.convertEvent(e
)
342 self
.event_queue
.append(new_event
)
347 if len(self
.event_queue
):
348 new_event
= self
.event_queue
.pop()
352 for file in self
.files
:
353 for object in self
.files
[file]['object_instances']:
354 object.event(new_event
[0], new_event
[1])
360 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
)
365 for file in self
.files
:
366 for object in self
.files
[file]['object_instances']:
373 self
.lamina_screen
.clear()
374 self
.gui_system
.draw(self
.lamina_screen
.surf
)
375 self
.lamina_screen
.refresh()
376 self
.lamina_screen
.display()
381 reactor
.callFromThread(self
.killThreadGame
)
385 def killThreadGame(self
):
389 def convertEvent(self
, e
):
396 if e
.type == ACTIVEEVENT
:
397 data
['gain'] = e
.gain
398 data
['state'] = e
.state
400 if e
.type == KEYDOWN
:
401 data
['unicode'] = e
.unicode
409 if e
.type == MOUSEMOTION
:
412 data
['buttons'] = e
.buttons
414 if e
.type == MOUSEBUTTONUP
:
416 data
['button'] = e
.button
418 if e
.type == MOUSEBUTTONDOWN
:
420 data
['button'] = e
.button
422 if e
.type == JOYAXISMOTION
:
424 data
['axis'] = e
.axis
425 data
['value'] = e
.value
427 if e
.type == JOYBALLMOTION
:
429 data
['ball'] = e
.ball
432 if e
.type == JOYHATMOTION
:
435 data
['value'] = e
.value
437 if e
.type == JOYBUTTONUP
:
439 data
['button'] = e
.button
441 if e
.type == JOYBUTTONDOWN
:
443 data
['button'] = e
.button
445 if e
.type == VIDEORESIZE
:
446 data
['size'] = e
.size
450 if e
.type == VIDEOEXPOSE
:
453 if e
.type == USEREVENT
:
454 data
['code'] = e
.code
458 if e
.type == QUIT
: type = "QUIT"
459 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
460 if e
.type == KEYDOWN
: type = "KEYDOWN"
461 if e
.type == KEYUP
: type = "KEYUP"
462 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
463 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
464 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
465 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
466 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
467 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
468 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
469 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
470 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
471 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
472 if e
.type == USEREVENT
: type = "USEREVENT"
476 def resize(self
, (width
, height
)):
479 glViewport(0, 0, width
, height
)
480 glMatrixMode(GL_PROJECTION
)
482 gluPerspective(45, 1.0*width
/height
, 0.1, 100.0)
483 glMatrixMode(GL_MODELVIEW
)
488 def getVisisbleMenus(self
):
492 for file, contents
in self
.files
.iteritems():
493 for name
, menu
in contents
['menu_instances'].iteritems():
499 def hideAllMenus(self
):
501 for file, contents
in self
.files
.iteritems():
502 for name
, menu
in contents
['menu_instances'].iteritems():
507 def showMenu(self
, menu_name
):
511 for file, contents
in self
.files
.iteritems():
512 for name
, menu
in contents
['menu_instances'].iteritems():
513 if contents
['menu_instances'].has_key(menu_name
):
514 contents
['menu_instances'][menu_name
].show()
520 for file in self
.files
:
521 contents
= self
.files
[file]
522 for name
in contents
['menu_defs']:
523 menu
= contents
['menu_defs'][name
]
524 if name
== menu_name
:
525 new_menu
= Menu(name
, contents
['menu_defs'][name
]['elements'], self
)
528 self
.files
[file]['menu_instances'][name
] = new_menu
532 def hideMenu(self
, menu_name
):
534 for file, contents
in self
.files
:
535 for name
, menu
in contents
['menu_instances'].iteritems():
536 if contents
['menu_instances'].has_key(menu_name
):
537 contents
['menu_instances'][menu_name
].hide()
541 def setMenu(self
, menu_name
):
544 self
.showMenu(menu_name
)
550 def addFile(self
, filename
, parent
=''):
554 for zipfile
in self
.zipfiles
:
555 for file in zipfile
.namelist():
558 dom
= parseString(zipfile
.read(file))
562 if dom
.childNodes
[0].nodeName
== 'game':
563 self
.files
[filename
] = {
567 'object_instances': [],
568 'menu_instances': {},
571 object_instances_d
= []
574 for node
in dom
.childNodes
[0].childNodes
:
575 if node
.nodeName
== 'def':
576 for sub_node
in node
.childNodes
:
578 if sub_node
.nodeName
== 'object':
582 for suber_node
in sub_node
.childNodes
:
583 if suber_node
.nodeName
== 'name':
584 if len(suber_node
.childNodes
):
585 temp_object_def
['name'] = suber_node
.childNodes
[0].nodeValue
.encode()
587 if suber_node
.nodeName
== 'script':
588 if len(suber_node
.childNodes
):
589 temp_object_def
['script'] = suber_node
.childNodes
[0].nodeValue
591 if suber_node
.nodeName
== 'tangible':
592 if len(suber_node
.childNodes
):
593 temp_object_def
['tangible'] = suber_node
.childNodes
[0].nodeValue
595 if suber_node
.nodeName
== 'type':
596 if len(suber_node
.childNodes
):
597 temp_object_def
['type'] = suber_node
.childNodes
[0].nodeValue
599 if suber_node
.nodeName
== 'model':
600 if len(suber_node
.childNodes
):
601 temp_object_def
['model'] = suber_node
.childNodes
[0].nodeValue
603 self
.files
[filename
]['object_defs'][temp_object_def
['name']] = copy
.copy(temp_object_def
)
606 if sub_node
.nodeName
== 'menu':
609 temp_menu_def
['elements'] = {}
611 temp_element_set
= {}
613 for suber_node
in sub_node
.childNodes
:
615 if suber_node
.nodeName
== 'name':
616 temp_menu_def
['name'] = suber_node
.childNodes
[0].nodeValue
618 if (suber_node
.nodeName
== 'elements'):
620 for suberer_node
in suber_node
.childNodes
:
622 if (suberer_node
.nodeType
!= 3 and suberer_node
.nodeType
!= 8):
623 if (suberer_node
.hasAttribute('name')):
624 temp_element_set
['name'] = suberer_node
.getAttribute('name')
626 if (suberer_node
.hasAttribute('x')):
627 temp_element_set
['x'] = int(suberer_node
.getAttribute('x'))
629 if (suberer_node
.hasAttribute('y')):
630 temp_element_set
['y'] = int(suberer_node
.getAttribute('y'))
632 if (suberer_node
.hasAttribute('width')):
633 temp_element_set
['width'] = int(suberer_node
.getAttribute('width'))
635 if (suberer_node
.hasAttribute('height')):
636 temp_element_set
['height'] = int(suberer_node
.getAttribute('height'))
638 if (suberer_node
.hasAttribute('parent')):
639 temp_element_set
['parent'] = suberer_node
.getAttribute('parent')
641 if (suberer_node
.hasAttribute('target')):
642 temp_element_set
['target'] = suberer_node
.getAttribute('target')
644 if (suberer_node
.hasAttribute('text')):
645 temp_element_set
['text'] = suberer_node
.getAttribute('text')
647 temp_element_set
['type'] = suberer_node
.nodeName
648 temp_menu_def
['elements'][temp_element_set
['name']] = copy
.copy(temp_element_set
)
649 temp_element_set
= {}
651 self
.files
[filename
]['menu_defs'][temp_menu_def
['name']] = temp_menu_def
653 temp_element_set
= {}
655 if node
.nodeName
== 'instance':
657 for sub_node
in node
.childNodes
:
659 if sub_node
.nodeName
== 'object':
664 if sub_node
.hasAttribute("position"):
665 position
= eval(sub_node
.getAttribute('position'))
666 if sub_node
.hasAttribute("rotation"):
667 rotation
= eval(sub_node
.getAttribute('rotation'))
669 object_instances_d
.append([sub_node
.childNodes
[0].nodeValue
, position
, rotation
])
671 if sub_node
.nodeName
== 'menu':
676 if sub_node
.hasAttribute("position"):
677 position
= eval(sub_node
.getAttribute('position'))
678 if sub_node
.hasAttribute("rotation"):
679 rotation
= eval(sub_node
.getAttribute('rotation'));
681 menu_instances
.append([sub_node
.childNodes
[0].nodeValue
, position
, rotation
])
684 self
.files
[parent
]['children'].append(filename
)
686 self
.files
[filename
]['parent'] = parent
690 print "Engine.addFile(): Instance creation isn't done quite yet."
692 for menunamee
in menu_instances
:
697 menuname
= menunamee
[0]
699 if self
.files
[filename
]['menu_defs'].has_key(menuname
):
700 print "\tInstantiate menu:", menuname
701 the_def
= self
.files
[filename
]['menu_defs'][menuname
]
704 for file in self
.files
.keys():
706 if self
.files
[file]['menu_defs'].has_key(menuname
):
707 print "Instantiate menu:", menuname
708 the_def
= self
.files
[file]['menu_defs'][menuname
]
714 for file in self
.files
.keys():
715 if self
.files
[file]['menu_instances'].has_key(menuname
):
716 self
.files
[file]['menu_instances'][menuname
].show()
719 if not instance_found
:
720 self
.files
[filename
]['menu_instances'][menuname
] = Menu(menuname
, the_def
['elements'], self
)
721 self
.files
[filename
]['menu_instances'][menuname
].show()
723 for objectnamee
in object_instances_d
:
729 objectname
= objectnamee
[0]
731 if self
.files
[filename
]['object_defs'].has_key(objectname
):
732 print "\tInstantiate object:", objectname
733 the_def
= self
.files
[filename
]['object_defs'][objectname
]
736 for file in self
.files
.keys():
738 if self
.files
[file]['object_defs'].has_key(objectname
):
739 print "\tInstantiate object:", objectname
740 the_def
= self
.files
[file]['object_defs'][objectname
]
745 if objectnamee
[1] != '':
746 position
= objectnamee
[1]
750 if objectnamee
[2] != '':
751 rotation
= objectnamee
[2]
755 new_object
= Entity(the_def
, self
, rotation
, rotation
)
756 self
.files
[filename
]['object_instances'].append(new_object
)
760 def removeFile(self
, filename
):
762 if self
.files
.has_key(filename
):
764 for child
in self
.files
[filename
]['children']:
765 self
.removeFile(child
)
767 del self
.files
[filename
]['children']
768 parent
= self
.files
[filename
]['parent']
770 if self
.files
[parent
].has_key(filename
):
771 self
.files
[parent
]['children'].pop(self
.files
[parent
]['children'].index(filename
))
773 del self
.files
[filename
]
777 def getStringIOFile(self
, filename
):
779 for zip_file
in self
.zipfiles
:
780 for file in zip_file
.namelist():
782 if (filename
== file):
784 the_string_io
= StringIO
.StringIO()
785 print >>the_string_io
, zip_file
.read(file)
786 the_string_io
.seek(0)
794 def __init__(self
, (x
, y
, z
), (xrot
, yrot
, zrot
)):
797 self
.rot
= (xrot
, yrot
, zrot
)
803 glRotate(self
.rot
[0], 1.0, 0.0, 0.0)
804 glRotate(self
.rot
[1], 0.0, 1.0, 0.0)
805 glRotate(self
.rot
[2], 0.0, 0.0, 1.0)
807 glTranslatef(self
.pos
[0], self
.pos
[1], self
.pos
[2]);
811 def __init__(self
, info
, engine
, (x
, y
, z
)=(0, 0, 0), (xrot
, yrot
, zrot
)=(0, 0, 0)):
815 self
.rot
= (xrot
, yrot
, zrot
)
821 if self
.info
.has_key('script') and self
.info
['script'] != '':
823 exec(self
.engine
.getStringIOFile(self
.info
['script']))
825 print "Entity.__init__(): Error running script"
827 if self
.info
.has_key('model') and self
.info
['model'] != '':
828 for zip in self
.engine
.zipfiles
:
829 if self
.info
['model'] in zip.namelist():
830 self
.model
= load_model_from_zipfile(zip, self
.info
['model'], True, NFUNC
)
834 if self
.model
!= None:
837 def event(self
, event
, details
):
839 if self
.events
.has_key(event
):
842 self
.events
[event
](details
)
844 print "Entity.event(): Error running Entity script"
846 def setEvent(self
, event
, function
):
848 self
.events
[event
] = function
854 def __init__(self
, name
, elements
, engine
):
856 # elements is a dictionary with name:{element info}
861 self
.widget_info
= elements
863 self
.gui_system
= engine
.gui_system
864 self
.event_queue
= engine
.event_queue
868 config
= engine
.config
870 for name
, element
in elements
.iteritems():
872 multiplier_x
= float(config
['window_size'][0]) / 100.00
873 multiplier_y
= float(config
['window_size'][1]) / 100.00
875 dx
= float(element
['x']) * multiplier_x
876 dy
= float(element
['y']) * multiplier_y
878 dwidth
= float(element
['width']) * multiplier_x
879 dheight
= float(element
['height']) * multiplier_y
881 params
= {'x': dx
, 'y': dy
, 'width': dwidth
, 'height': dheight
}
883 if element
['type'] == 'button':
884 params
['text'] = element
['text']
885 self
.widgets
[name
] = self
.gui_system
.makeWidget('button', params
)
886 self
.widgets
[name
].connect('BUTTON_CLICKED', self
.clicked
, {'name': name
})
888 if element
['type'] == 'image':
889 print "Menu.__init__(): 'image' widget type not implemented yet."
891 if element
['type'] == 'label':
892 params
['text'] = element
['text']
893 self
.widgets
[name
] = self
.gui_system
.makeWidget('label', params
)
895 if element
['type'] == 'listbox':
896 print "Menu.__init__(): 'listbox' widget type not implemented yet."
898 if element
['type'] == 'textbox':
899 params
['type'] == element
['text']
900 self
.widgets
[name
] = self
.gui_system
.makeWidget('textbox', params
)
901 self
.widgets
[name
].connect('KEYDOWN', self
.key_pressed
, {'name': name
})
905 def clicked(self
, params
, more_params
):
907 if self
.widgets
.has_key(params
['name']):
908 self
.event_queue
.append(['WIDGET_CLICKED', {'name':params
['name']}])
910 if self
.widget_info
[params
['name']].has_key('target') and self
.widget_info
[params
['name']]['target'] != '':
912 exec(self
.widget_info
[params
['name']]['target'])
915 # print "Menu.clicked(): Error executing widget click callback"
919 def key_pressed(self
, params
, more_params
):
921 if self
.widgets
.has_key(params
['name']):
922 self
.event_queue
.append(['WIDGET_KEYDOWN', more_params
])
928 for widget
in self
.widgets
:
929 self
.widgets
[widget
].show()
937 for widget
in self
.widgets
:
938 self
.widgets
[widget
].hide()
945 final
= ''.join([dog
[0], dog
[4], dog
[6], dog
[-3], ' ', dog
[7], dog
[0], dog
[0]])
947 # Below this point, nothing really changes.
948 # A 'here be dragons' wouldn't really be appropriate, but same kind of
949 # idea. Aka, don't mess with below.
951 class Client(DatagramProtocol
):
953 def init(self
, config
, event_queue
, engine
, multicast
):
956 self
.event_queue
= event_queue
957 self
.multicast
= multicast
961 self
.current_server
= ()
962 self
.requested_server
= ()
964 self
.server_request
= 0
968 def datagramReceived(self
, data
, (host
, port
)):
970 if data
[:len(YOUTHERE
)] == YOUTHERE
:
972 # print "Client.datagramReceived(): Recieved YOUTHERE, responding with IMHERE"
973 self
.transport
.write(IMHERE
, (host
, port
))
975 if data
[:len(SERVEROFFER
)] == SERVEROFFER
:
977 split_strings
= data
.split()
979 self
.servers
[split_strings
[2]] = (host
, int(split_strings
[1]))
981 event
= [SERVEROFFER
, {'server_name': split_strings
[2],
982 'server_address': self
.servers
[split_strings
[2]]}]
983 self
.event_queue
.append(event
)
985 print "Client.datagramReceived(): Received SERVEROFFER"
987 if data
[:len(YOUREIN
)] == YOUREIN
:
989 if (host
, port
) == self
.requested_server
:
990 self
.current_server
= (host
, port
)
991 self
.requested_server
= ()
994 data
= {'server': self
.current_server
}
997 self
.event_queue
.append(event
)
999 print "Client.datagramReceived(): Received YOUREIN, joined server"
1003 if data
[:len(STILLIN
)] == STILLIN
:
1005 if (host
, port
) == self
.current_server
:
1006 # print "Client.datagramReceived(): Received STILLIN, responding with IMHERE"
1007 self
.transport
.write(IMHERE
, (host
, port
))
1011 if data
[:len(LIST
)] == LIST
:
1013 print "Client.datagramReceived(): Received LIST"
1015 split_strings
= data
.split()
1019 for string
in split_strings
:
1021 self
.members
.append(string
)
1024 data
= {'names': self
.members
, 'server_address': (host
, port
)}
1027 self
.event_queue
.append(event
)
1031 if data
[:len(SOMEONEJOINED
)] == SOMEONEJOINED
:
1033 if (host
, port
) == self
.current_server
:
1035 print "Client.datagramReceived(): Received SOMEONEJOINED"
1039 for member
in self
.members
:
1040 if member
== data
[len(SOMEONEJOINED
) + 1:]:
1041 left_member
= member
1043 if left_member
== '':
1044 self
.members
.append(data
[len(SOMEONEJOINED
) + 1:])
1046 event
= [SOMEONEJOINED
]
1047 data
= {'name': data
[len(SOMEONEJOINED
) + 1:]}
1051 self
.event_queue
.append(event
)
1055 if data
[:len(SOMEONELEFT
)] == SOMEONELEFT
:
1057 if (host
, port
) == self
.current_server
:
1059 name
= data
[len(SOMEONELEFT
) + 1:]
1061 if name
in self
.members
:
1062 print "Client.datagramReceived(): Received SOMEONELEFT"
1064 self
.members
.remove(name
)
1066 event
= [SOMEONELEFT
]
1067 data
= {'name': name
}
1071 self
.event_queue
.append(event
)
1074 print "Client.datagramReceived(): Received SOMEONELEFT, but", name
, "not present in roster"
1078 if data
[:len(YOUROUT
)] == YOUROUT
:
1080 if (host
, port
) == self
.current_server
:
1082 print "Client.datagramReceived(): Recieved YOUROUT"
1084 self
.current_server
= ()
1090 self
.event_queue
.append(event
)
1094 if data
[:len(LETTER
)] == LETTER
:
1096 if (host
, port
) == self
.current_server
:
1097 print "Client.datagramReceived(): Received LETTER"
1099 split_strings
= data
.split(':')
1101 message
= data
[data
.find(':', len(LETTER
) + 1) + 1:]
1102 message_origin
= split_strings
[1]
1105 data
= {'message': message
, 'origin': message_origin
}
1108 self
.event_queue
.append(event
)
1112 if data
[:len(IMHERE
)] == IMHERE
:
1114 if (host
, port
) == self
.current_server
:
1115 print "Client.datagramReceived(): Received IMHERE from server"
1117 self
.server_request
= 0
1121 def serverRequest(self
):
1123 if self
.current_server
!= ():
1125 if self
.server_request
> SERVER_TIMEOUT
:
1126 self
.event_queue
.append([SERVER_GONE
, {}])
1127 self
.current_server
= ()
1130 self
.server_request
+= 1
1131 self
.transport
.write(YOUTHERE
, self
.current_server
)
1135 def executeCommand(self
, command
, data
):
1137 reactor
.callFromThread(self
.executeThreadedCommand
, command
, data
)
1141 def executeThreadedCommand(self
, command
, data
):
1142 if command
== SERVERKILL
:
1144 if self
.current_server
!= ():
1146 message
= ''.join([SERVERKILL
, ' '])
1148 if data
.has_key('password'):
1149 message
= ''.join([message
, data
['password']])
1151 self
.transport
.write(message
, self
.current_server
)
1153 if command
== SERVERREQUEST
:
1155 message
= ''.join([SERVERREQUEST
, ' ', str(self
.params
['message_port'])])
1157 self
.multicast
.transport
.write(message
, (MULTICAST
, self
.params
['broadcast_port']))
1158 #self.transport.write(message, ('255.255.255.255', self.params['broadcast_port']))
1160 if command
== GETLIST
:
1164 if data
.has_key('server'):
1166 if self
.servers
.has_key(data
['server']):
1167 self
.transport
.write(message
, self
.servers
[data
['server']])
1171 if self
.current_server
!= ():
1172 self
.transport
.write(message
, self
.current_server
)
1174 if command
== IMOUT
:
1176 if self
.current_server
!= ():
1180 self
.transport
.write(message
, self
.current_server
)
1182 self
.current_server
= ()
1184 if command
== LETTER
:
1186 if self
.current_server
!= ():
1188 message
= ''.join([LETTER
, ':'])
1190 for dest
in data
['destinations']:
1191 if dest
in self
.members
:
1192 message
= ''.join([message
, ' ' , dest
])
1194 message
= ''.join([message
, ':', data
['message']])
1196 self
.transport
.write(message
, self
.current_server
)
1198 if command
== WANTIN
:
1200 if data
.has_key('server'):
1201 if self
.servers
.has_key(data
['server']):
1203 self
.transport
.write(''.join([WANTIN
, ' ', self
.params
['name']]),
1204 self
.servers
[data
['server']])
1205 self
.current_server
= ()
1206 self
.requested_server
= self
.servers
[data
['server']]
1212 glBegin(GL_TRIANGLES
)
1214 glColor3f(1.0,0.0,0.0)
1215 glVertex3f( 0.0, 1.0, 0.0)
1216 glColor3f(0.0,1.0,0.0)
1217 glVertex3f(-1.0,-1.0, 1.0)
1218 glColor3f(0.0,0.0,1.0)
1219 glVertex3f( 1.0,-1.0, 1.0)
1221 glColor3f(1.0,0.0,0.0)
1222 glVertex3f( 0.0, 1.0, 0.0)
1223 glColor3f(0.0,0.0,1.0)
1224 glVertex3f( 1.0,-1.0, 1.0)
1225 glColor3f(0.0,1.0,0.0)
1226 glVertex3f( 1.0,-1.0, -1.0)
1228 glColor3f(1.0,0.0,0.0)
1229 glVertex3f( 0.0, 1.0, 0.0)
1230 glColor3f(0.0,1.0,0.0)
1231 glVertex3f( 1.0,-1.0, -1.0)
1232 glColor3f(0.0,0.0,1.0)
1233 glVertex3f(-1.0,-1.0, -1.0)
1236 glColor3f(1.0,0.0,0.0)
1237 glVertex3f( 0.0, 1.0, 0.0)
1238 glColor3f(0.0,0.0,1.0)
1239 glVertex3f(-1.0,-1.0,-1.0)
1240 glColor3f(0.0,1.0,0.0)
1241 glVertex3f(-1.0,-1.0, 1.0)
1244 if __name__
== '__main__':