5 CONFIG
= 'game_config.xml'
7 WINDOW_SIZE
= (640, 480)
8 WINDOW_CAPTION
= "Testing stuff"
11 BROADCAST_BIND
= 50031
19 MULTICAST
= '234.0.0.1'
23 SERVERREQUEST
= "i_want_server"
24 SERVEROFFER
= "Want_server?"
25 SERVERKILL
= "DIE_server!!"
26 YOUTHERE
= "you_there?"
27 IMHERE
= "yeah,i'm_here"
32 LIST
= "peoples_on_server"
33 SOMEONEJOINED
= "dude,someone_joined"
34 SOMEONELEFT
= "someone_left"
35 YOUROUT
= "get_lost_punk"
36 LETTER
= "listen_to_me"
47 from xml
.dom
.minidom
import parse
, parseString
48 from threading
import Lock
52 from twisted
.internet
.protocol
import DatagramProtocol
53 from twisted
.internet
import reactor
54 from twisted
.internet
import task
60 from pgu
import gui
as pgui
66 from OpenGL
.GL
import *
68 from OpenGL
.GLU
import *
76 print "getBroadcast(): Broadcast is reported to be", ip
79 reactor
.resolve('<broadcast>').addCallback(getBroadcast
)
81 the_event_receiver
= 0
90 self
.items_lock
= Lock()
94 return len(self
.items
)
98 self
.items_lock
.acquire()
99 the_item
= self
.items
.pop(0)
100 self
.items_lock
.release()
104 def addItem(self
, new_item
):
106 self
.items_lock
.acquire()
107 self
.items
.append(new_item
)
108 self
.items_lock
.release()
112 class EventReceiver(QueueLock
):
115 return self
.getItem()
116 def addEvent(self
, event
):
120 class CommandLine(QueueLock
):
122 def getCommand(self
):
123 return self
.getItem()
124 def addCommand(self
, command
):
125 self
.addItem(command
)
128 class Multicast(DatagramProtocol
):
130 def startProtocol(self
):
131 self
.transport
.joinGroup(MULTICAST
)
133 def datagramReceived(self
, datagram
, address
):
137 class Client(DatagramProtocol
):
139 def datagramReceived(self
, data
, (host
, port
)):
141 if data
[:len(YOUTHERE
)] == YOUTHERE
:
143 # print "Client.datagramReceived(): Recieved YOUTHERE, responding with IMHERE"
144 self
.transport
.write(IMHERE
, (host
, port
))
146 if data
[:len(SERVEROFFER
)] == SERVEROFFER
:
148 split_strings
= data
.split()
150 self
.servers
[split_strings
[2]] = (host
, int(split_strings
[1]))
152 event
= [SERVEROFFER
, {'server_name': split_strings
[2],
153 'server_address': self
.servers
[split_strings
[2]]}]
154 the_engine
.events
.addEvent(event
)
156 print "Client.datagramReceived(): Received SERVEROFFER"
158 if data
[:len(YOUREIN
)] == YOUREIN
:
160 if (host
, port
) == self
.requested_server
:
161 self
.current_server
= (host
, port
)
162 self
.requested_server
= ()
165 data
= {'server': self
.current_server
}
168 the_engine
.events
.addEvent(event
)
170 print "Client.datagramReceived(): Received YOUREIN, joined server"
174 if data
[:len(LIST
)] == LIST
:
176 print "Client.datagramReceived(): Received LIST"
178 split_strings
= data
.split()
182 for string
in split_strings
:
184 self
.members
.append(string
)
187 data
= {'names': self
.members
, 'server_address': (host
, port
)}
190 the_engine
.events
.addEvent(event
)
194 if data
[:len(SOMEONEJOINED
)] == SOMEONEJOINED
:
196 if (host
, port
) == self
.current_server
:
198 print "Client.datagramReceived(): Received SOMEONEJOINED"
202 for member
in self
.members
:
203 if member
== data
[len(SOMEONEJOINED
) + 1:]:
206 if left_member
== '':
207 self
.members
.append(left_member
)
209 event
= [SOMEONEJOINED
]
210 data
= {'name': data
[len(SOMEONEJOINED
) + 1:]}
214 the_engine
.events
.addEvent(event
)
218 if data
[:len(SOMEONELEFT
)] == SOMEONELEFT
:
220 if (host
, port
) == self
.current_server
:
222 name
= data
[len(SOMEONELEFT
) + 1:]
224 print "debug", name
, self
.members
226 if name
in self
.members
:
227 print "Client.datagramReceived(): Received SOMEONELEFT"
229 self
.members
.remove(name
)
231 event
= [SOMEONELEFT
]
232 data
= {'name': name
}
236 the_engine
.events
.addEvent(event
)
239 print "Client.datagramReceived(): Received SOMEONELEFT, but", name
, "not present in roster"
242 if data
[:len(YOUROUT
)] == YOUROUT
:
244 if (host
, port
) == self
.current_server
:
246 print "Client.datagramReceived(): Recieved YOUROUT"
248 self
.current_server
= ()
254 the_engine
.events
.addEvent(event
)
258 if data
[:len(LETTER
)] == LETTER
:
260 if (host
, port
) == self
.current_server
:
261 print "Client.datagramReceived(): Received LETTER"
263 split_strings
= data
.split(':')
265 message
= data
[data
.find(':', len(LETTER
) + 1) + 1:]
266 message_origin
= split_strings
[1]
269 data
= {'message': message
, 'origin': message_origin
}
272 the_engine
.events
.addEvent(event
)
276 def init(self
, params
):
280 self
.current_server
= ()
281 self
.requested_server
= ()
288 def executeCommand(self
, command
, data
):
290 reactor
.callFromThread(self
.executeThreadCommand
, command
, data
)
294 def executeThreadCommand(self
, command
, data
):
296 if command
== SERVERKILL
:
298 if self
.current_server
!= ():
300 message
= ''.join([SERVERKILL
, ' '])
302 if data
.has_key('password'):
303 message
= ''.join([message
, data
['password']])
305 self
.transport
.write(message
, self
.current_server
)
307 if command
== SERVERREQUEST
:
309 message
= ''.join([SERVERREQUEST
, ' ', str(self
.params
['message_port'])])
311 the_multicast
.transport
.write(message
, (MULTICAST
, self
.params
['broadcast_port']))
312 # self.transport.write(message, ('255.255.255.255', self.params['broadcast_port']))
314 if command
== GETLIST
:
318 if data
.has_key('server'):
320 if self
.servers
.has_key(data
['server']):
321 self
.transport
.write(message
, self
.servers
[data
['server']])
325 if self
.current_server
!= ():
326 self
.transport
.write(message
, self
.current_server
)
330 if self
.current_server
!= ():
334 self
.transport
.write(message
, self
.current_server
)
336 self
.current_server
= ()
338 if command
== LETTER
:
340 if self
.current_server
!= ():
342 message
= ''.join([LETTER
, ':'])
344 for dest
in data
['destinations']:
345 if dest
in self
.members
:
346 message
= ''.join([message
, ' ' , dest
])
348 message
= ''.join([message
, ':', data
['message']])
350 self
.transport
.write(message
, self
.current_server
)
352 if command
== WANTIN
:
354 if data
.has_key('server'):
355 if self
.servers
.has_key(data
['server']):
357 self
.transport
.write(''.join([WANTIN
, ' ', self
.params
['name']]),
358 self
.servers
[data
['server']])
359 self
.current_server
= ()
360 self
.requested_server
= self
.servers
[data
['server']]
366 def __init__(self
, config
):
374 video_flags
= OPENGL|DOUBLEBUF
377 self
.display
= pygame
.display
.set_mode(config
['window_size'], video_flags
)
379 self
.font
= pygame
.font
.SysFont("default", 18)
380 self
.fontBig
= pygame
.font
.SysFont("default", 24)
381 self
.fontSub
= pygame
.font
.SysFont("default", 20)
382 self
.theme
= pgui
.Theme(['test_theme', 'gray', 'default'])
383 # self.theme = pgui.Theme('gray')
384 # self.theme = pgui.Theme('default')
386 self
.resize((config
['window_size']))
388 glShadeModel(GL_SMOOTH
)
389 glClearColor(self
.config
['background_color'][0],
390 self
.config
['background_color'][1],
391 self
.config
['background_color'][2],
392 self
.config
['background_color'][3])
394 glEnable(GL_DEPTH_TEST
)
395 glDepthFunc(GL_LEQUAL
)
396 glHint(GL_PERSPECTIVE_CORRECTION_HINT
, GL_NICEST
)
398 pygame
.display
.set_caption(config
['window_title'])
400 self
.gui_screen
= lamina
.LaminaScreenSurface()
402 self
.app
= pgui
.App(theme
=self
.theme
)
403 self
.app
._screen
= self
.gui_screen
.surf
404 self
.main_container
= pgui
.Container(width
=config
['window_size'][0])
408 self
.events
= EventReceiver()
410 # self.files is a map of filename to file
413 # {parent, [children], {object_defs},
414 # {menu_defs}, {object_instances}, {menu_instances}}
418 for file in listdir(self
.config
['pack_dir']):
419 if (is_zipfile(os
.path
.join(self
.config
['pack_dir'], file))):
420 self
.zipfiles
.append(ZipFile(os
.path
.join(self
.config
['pack_dir'], file)))
422 self
.running
= self
.addFile(self
.config
['init'], '')
423 self
.app
.init(self
.main_container
)
425 self
.ticks
= pygame
.time
.get_ticks()
428 if self
.running
== 0:
429 print "Engine.__init__(): Failed adding initial file"
437 self
.process_events()
441 pygame
.display
.flip()
447 self
.oldticks
= self
.ticks
448 self
.ticks
= pygame
.time
.get_ticks()
452 self
.fps
= (self
.frames
* 1000) / (self
.ticks
- self
.oldticks
) / 1000
454 pygame
.display
.set_caption(''.join([self
.config
['window_title'], ' ', str(self
.fps
)]))
458 def process_events(self
):
462 for e
in pygame
.event
.get():
465 print "Should be quitting..."
470 change
= self
.app
.update(self
.gui_screen
.surf
)
473 self
.gui_screen
.refresh(change
)
475 new_event
= self
.convertEvent(e
)
476 self
.events
.addEvent(new_event
)
481 if self
.events
.size():
482 new_event
= self
.events
.getEvent()
490 for file in self
.files
.keys():
492 for name
in self
.files
[file]['object_instances'].keys():
494 self
.files
[file]['object_instances'][name
].event(new_event
[0], new_event
[1])
498 def convertEvent(self
, e
):
505 if e
.type == ACTIVEEVENT
:
506 data
['gain'] = e
.gain
507 data
['state'] = e
.state
509 if e
.type == KEYDOWN
:
510 data
['unicode'] = e
.unicode
518 if e
.type == MOUSEMOTION
:
521 data
['buttons'] = e
.buttons
523 if e
.type == MOUSEBUTTONUP
:
525 data
['button'] = e
.button
527 if e
.type == MOUSEBUTTONDOWN
:
529 data
['button'] = e
.button
531 if e
.type == JOYAXISMOTION
:
533 data
['axis'] = e
.axis
534 data
['value'] = e
.value
536 if e
.type == JOYBALLMOTION
:
538 data
['ball'] = e
.ball
541 if e
.type == JOYHATMOTION
:
544 data
['value'] = e
.value
546 if e
.type == JOYBUTTONUP
:
548 data
['button'] = e
.button
550 if e
.type == JOYBUTTONDOWN
:
552 data
['button'] = e
.button
554 if e
.type == VIDEORESIZE
:
555 data
['size'] = e
.size
559 if e
.type == VIDEOEXPOSE
:
562 if e
.type == USEREVENT
:
563 data
['code'] = e
.code
567 if e
.type == QUIT
: type = "QUIT"
568 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
569 if e
.type == KEYDOWN
: type = "KEYDOWN"
570 if e
.type == KEYUP
: type = "KEYUP"
571 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
572 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
573 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
574 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
575 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
576 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
577 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
578 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
579 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
580 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
581 if e
.type == USEREVENT
: type = "USEREVENT"
587 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
)
593 self
.gui_screen
.display()
595 def resize(self
, (width
, height
)):
598 glViewport(0, 0, width
, height
)
599 glMatrixMode(GL_PROJECTION
)
601 gluPerspective(45, 1.0*width
/height
, 0.1, 100.0)
602 glMatrixMode(GL_MODELVIEW
)
607 def addFile(self
, filename
, parent
):
609 # Because I have alot of nesting in this function,
610 # I am using 2 space formatting
612 for zipfile
in self
.zipfiles
:
614 for file in zipfile
.namelist():
616 if (file == filename
):
617 dom
= parseString(zipfile
.read(file))
619 object_instances_d
= []
622 if dom
.childNodes
[0].nodeName
== 'game':
623 self
.files
[filename
] = {
627 'object_instances': {},
628 'menu_instances': {},
631 for node
in dom
.childNodes
[0].childNodes
:
633 if (node
.nodeName
== 'def'):
635 for sub_node
in node
.childNodes
:
637 if (sub_node
.nodeName
== 'object'):
641 for suber_node
in sub_node
.childNodes
:
643 if (suber_node
.nodeName
== 'name'):
644 if len(suber_node
.childNodes
):
645 temp_object_def
['name'] = suber_node
.childNodes
[0].nodeValue
647 if (suber_node
.nodeName
== 'script'):
648 if len(suber_node
.childNodes
):
649 temp_object_def
['script'] = suber_node
.childNodes
[0].nodeValue
651 if (suber_node
.nodeName
== 'tangible'):
652 if len(suber_node
.childNodes
):
653 temp_object_def
['tangible'] = suber_node
.childNodes
[0].nodeValue
655 if (suber_node
.nodeName
== 'type'):
656 if len(suber_node
.childNodes
):
657 temp_object_def
['type'] = suber_node
.childNodes
[0].nodeValue
659 self
.files
[filename
]['object_defs'][temp_object_def
['name']] = temp_object_def
662 if (sub_node
.nodeName
== 'menu'):
665 temp_menu_def
['elements'] = {}
667 temp_element_set
= {}
669 for suber_node
in sub_node
.childNodes
:
671 if (suber_node
.nodeName
== 'name'):
672 temp_menu_def
['name'] = suber_node
.childNodes
[0].nodeValue
674 if (suber_node
.nodeName
== 'elements'):
676 for suberer_node
in suber_node
.childNodes
:
678 if (suberer_node
.nodeType
!= 3 and suberer_node
.nodeType
!= 8):
679 if (suberer_node
.hasAttribute('name')):
680 temp_element_set
['name'] = suberer_node
.getAttribute('name')
682 if (suberer_node
.hasAttribute('x')):
683 temp_element_set
['x'] = int(suberer_node
.getAttribute('x'))
685 if (suberer_node
.hasAttribute('y')):
686 temp_element_set
['y'] = int(suberer_node
.getAttribute('y'))
688 if (suberer_node
.hasAttribute('width')):
689 temp_element_set
['width'] = int(suberer_node
.getAttribute('width'))
691 if (suberer_node
.hasAttribute('height')):
692 temp_element_set
['height'] = int(suberer_node
.getAttribute('height'))
694 if (suberer_node
.hasAttribute('parent')):
695 temp_element_set
['parent'] = suberer_node
.getAttribute('parent')
697 if (suberer_node
.hasAttribute('target')):
698 temp_element_set
['target'] = suberer_node
.getAttribute('target')
700 if (suberer_node
.hasAttribute('text')):
701 temp_element_set
['text'] = suberer_node
.getAttribute('text')
703 temp_element_set
['type'] = suberer_node
.nodeName
704 temp_menu_def
['elements'][temp_element_set
['name']] = temp_element_set
705 temp_element_set
= {}
707 self
.files
[filename
]['menu_defs'][temp_menu_def
['name']] = temp_menu_def
710 temp_element_set
= {}
712 if (node
.nodeName
== 'instance'):
714 for sub_node
in node
.childNodes
:
716 if (sub_node
.nodeName
== 'object'):
717 object_instances_d
.append(sub_node
.childNodes
[0].nodeValue
)
719 if (sub_node
.nodeName
== 'menu'):
720 menu_instances
.append(sub_node
.childNodes
[0].nodeValue
)
723 self
.files
[parent
]['children'].append(filename
)
724 self
.files
[filename
]['parent'] = parent
728 for menuname
, menu_data
in self
.files
[filename
]['menu_defs'].iteritems():
729 self
.files
[filename
]['menu_instances'][menuname
] = Menu(menu_def
=menu_data
)
731 for menuname
in menu_instances
:
732 if (self
.files
[filename
]['menu_instances'].has_key(menuname
)):
733 self
.files
[filename
]['menu_instances'][menuname
].show()
735 for file in self
.files
.keys():
736 if self
.files
[file]['menu_instances'].has_key(menuname
):
737 self
.files
[file]['menu_instances'][menuname
].show()
739 for objectname
in object_instances_d
:
740 self
.addObject(objectname
)
744 # ending 2-space formatting
746 def removeFile(self
, filename
):
748 if (self
.files
.has_key(filename
)):
750 for child
in self
.files
[filename
]['children']:
751 self
.removeFile(child
)
753 del self
.files
[filename
]['children']
755 parent
= self
.files
[filename
]['parent']
756 self
.files
[parent
].pop(self
.files
[parent
]['children'].index(filename
))
758 del self
.files
[filename
]
762 def getVisibleMenus(self
):
766 for file, contents
in self
.files
.iteritems():
767 for name
, menu
in contents
['menu_instances'].iteritems():
773 def hideAllMenus(self
):
775 for file, contents
in self
.files
.iteritems():
776 for name
, menu
in contents
['menu_instances'].iteritems():
781 def showMenu(self
, menu_name
):
783 for file, contents
in self
.files
.iteritems():
784 for name
, menu
in contents
['menu_instances'].iteritems():
785 if contents
['menu_instances'].has_key(menu_name
):
786 contents
['menu_instances'][menu_name
].show()
790 def hideMenu(self
, menu_name
):
792 for file, contents
in self
.files
:
793 for name
, menu
in contents
['menu_instances'].iteritems():
794 if contents
['menu_instances'].has_key(menu_name
):
795 contents
['menu_instances'][menu_name
].hide()
799 def setMenu(self
, menu_name
):
802 self
.showMenu(menu_name
)
806 def addObject(self
, objectname
):
808 for file in self
.files
.keys():
809 if self
.files
[file]['object_defs'].has_key(objectname
):
810 self
.files
[file]['object_instances'][objectname
] = GameObject(
811 self
.files
[file]['object_defs'][objectname
])
815 def removeObject(self
, objectname
):
817 for file in self
.files
.keys():
818 if self
.files
[file]['object_defs'].has_key(objectname
):
819 del self
.files
[file]['object_instances'][objectname
]
823 def addListItem(self
, menuname
, item
, data
, dvalue
):
825 for file in self
.files
:
826 if self
.files
[file]['menu_instances'].has_key(menuname
):
827 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
828 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
830 the_widget
.add(data
, value
=dvalue
)
836 def clearListItem(self
, menuname
, item
):
838 for file in self
.files
:
839 if self
.files
[file]['menu_instances'].has_key(menuname
):
840 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
841 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
849 def removeListItem(self
, menuname
, item
, value
):
851 for file in self
.files
:
852 if self
.files
[file]['menu_instances'].has_key(menuname
):
853 if self
.files
[file]['menu_instances'][menuname
].has_key(item
):
854 the_widget
= self
.files
[file]['menu_instances'][menuname
][item
]
856 the_widget
.remove(value
)
862 def getListValue(self
, menuname
, item
):
864 for file in self
.files
:
865 if self
.files
[file]['menu_instances'].has_key(menuname
):
867 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
868 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
870 return the_widget
.value
874 def getImage(self
, filename
):
876 the_buf
= pygame
.image
.load(self
.getStringIOFile(filename
))
880 def getStringIOFile(self
, filename
):
882 for zip_file
in self
.zipfiles
:
883 for file in zip_file
.namelist():
885 if (filename
== file):
887 the_string_io
= StringIO
.StringIO()
888 print >>the_string_io
, zip_file
.read(file)
889 the_string_io
.seek(0)
894 def getStringData(self
, filename
):
895 for zip_file
in self
.zipfiles
:
896 for file in zip_file
.namelist():
898 if (filename
== file):
899 return zip_file
.read(file)
902 def killThreadGame(self
):
910 reactor
.callFromThread(self
.killThreadGame
)
916 def __init__(self
, menu_def
):
918 self
.menu_def
= menu_def
921 for name
, element
in menu_def
['elements'].iteritems():
923 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100.00
924 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
926 dx
= float(element
['x']) * multiplier_x
927 dy
= float(element
['y']) * multiplier_y
929 dwidth
= float(element
['width']) * multiplier_x
930 dheight
= float(element
['height']) * multiplier_y
932 if (element
['type'] == 'button'):
933 self
.widgets
[name
] = pgui
.Button(element
['text'].encode(), width
=dwidth
, height
=dheight
)
934 self
.widgets
[name
].connect(pgui
.CLICK
, self
.clicked
, name
)
936 if (element
['type'] == 'image'):
937 self
.widgets
[name
] = pgui
.Image(the_engine
.getImage(element
['text']))
939 if (element
['type'] == 'label'):
940 self
.widgets
[name
] = pgui
.Label(element
['text'])
942 if (element
['type'] == 'listbox'):
943 self
.widgets
[name
] = pgui
.List(width
=dwidth
, height
=dheight
)
944 self
.widgets
[name
].connect(pgui
.CLICK
, self
.clicked
, name
)
946 if (self
.widgets
.has_key(name
)):
947 self
.widgets
[name
].resize(width
=dwidth
, height
=dheight
)
949 print "Menu.__init__(): Widget type", element
['type'], " not implemented yet, skipping."
957 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100.00
958 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
960 if (self
.hidden
== 1):
961 for name
, element
in self
.menu_def
['elements'].iteritems():
962 dx
= float(element
['x']) * multiplier_x
963 dy
= float(element
['y']) * multiplier_y
965 if self
.widgets
.has_key(name
):
966 the_engine
.main_container
.add(self
.widgets
[name
], dx
, dy
)
976 if (self
.hidden
!= 1):
977 for name
, element
in self
.menu_def
['elements'].iteritems():
979 if (self
.widgets
.has_key(name
)):
980 the_engine
.main_container
.remove(self
.widgets
[name
])
986 def clicked(self
, widget
):
988 if self
.menu_def
['elements'].has_key(widget
):
990 if self
.menu_def
['elements'][widget
]['target'] != '':
991 exec(self
.menu_def
['elements'][widget
]['target'])
993 the_engine
.events
.addEvent(['WIDGET_CLICKED',
994 {'name': widget
, 'menu_name': self
.menu_def
['name']}])
1000 def __init__(self
, dmold
):
1003 global the_functions
1006 if self
.mold
['script'] != '':
1010 the_file
= the_engine
.getStringData(self
.mold
['script'])
1015 self
.my_functions
= the_functions
1019 def event(self
, event
, data
):
1021 if self
.my_functions
.has_key(event
):
1023 self
.my_functions
[event
](data
)
1028 # parse command line stuff
1030 if (len(sys
.argv
) > 1):
1031 config
= sys
.argv
[1]
1033 print "main(): No config specified, using", CONFIG
1036 configuration
= parse_config(config
)
1038 if (configuration
.has_key('error') and configuration
['error']):
1039 print "main(): Error in parsing config."
1041 the_event_receiver
= EventReceiver()
1043 global client_params
1044 client_params
= {'broadcast_port':configuration
['broadcast_port'],
1045 'broadcast_bind':configuration
['broadcast_bind'],
1046 'message_port':configuration
['message_port'],
1047 'name':configuration
['name']}
1052 the_engine
= Engine(configuration
)
1054 the_client
= Client()
1055 the_client_thread
= threading
.Thread(target
=run_net
)
1057 the_client
.init(client_params
)
1059 the_client_thread
.start()
1062 the_engine
.killGame()
1066 the_client_thread
.join()
1072 global client_params
1073 global the_multicast
1075 the_multicast
= Multicast()
1076 config
= client_params
1078 reactor
.listenMulticast(config
['broadcast_bind'], the_multicast
)
1079 reactor
.listenUDP(config
['message_port'], the_client
)
1081 reactor
.run(installSignalHandlers
=0)
1085 def parse_config(filename
):
1086 results
= {'error': 1}
1088 if (exists(filename
)):
1089 dom
= parse(filename
)
1091 print "parse_config():", filename
, "doesn't exist."
1094 if (dom
.childNodes
[0].nodeName
== 'config'):
1095 for node
in dom
.childNodes
[0].childNodes
:
1097 if (node
.nodeName
== 'window_title'):
1098 results
['window_title'] = node
.childNodes
[0].nodeValue
1100 if (node
.nodeName
== 'log'):
1101 results
['log'] = node
.childNodes
[0].nodeValue
1103 if (node
.nodeName
== 'name'):
1104 results
['name'] = node
.childNodes
[0].nodeValue
1106 if (node
.nodeName
== 'font'):
1107 results
['font'] = node
.childNodes
[0].nodeValue
1109 if (node
.nodeName
== 'init'):
1110 results
['init'] = node
.childNodes
[0].nodeValue
1112 if (node
.nodeName
== 'message_port'):
1113 results
['message_port'] = int(node
.childNodes
[0].nodeValue
)
1115 if (node
.nodeName
== 'broadcast_port'):
1116 results
['broadcast_port'] = int(node
.childNodes
[0].nodeValue
)
1118 if (node
.nodeName
== 'broadcast_bind'):
1119 results
['broadcast_bind'] = int(node
.childNodes
[0].nodeValue
)
1121 if (node
.nodeName
== 'fullscreen'):
1122 results
['fullscreen'] = int(node
.childNodes
[0].nodeValue
)
1124 if (node
.nodeName
== 'background_color'):
1126 string_parts
= node
.childNodes
[0].nodeValue
.split()
1127 results
['background_color'] = [float(string_parts
[0]), float(string_parts
[1])]
1128 results
['background_color'].append(float(string_parts
[2]))
1129 results
['background_color'].append(float(string_parts
[3]))
1131 if (node
.nodeName
== 'window_size'):
1133 string_parts
= node
.childNodes
[0].nodeValue
.split()
1134 results
['window_size'] = ((int(string_parts
[0]), int(string_parts
[1])))
1136 if (node
.nodeName
== 'gravity'):
1138 string_parts
= node
.childNodes
[0].nodeValue
.split()
1139 results
['gravity'] = [float(string_parts
[0]), float(string_parts
[1])]
1140 results
['gravity'].append(float(string_parts
[2]))
1142 if (node
.nodeName
== 'step_size'):
1143 results
['step_size'] = float(node
.childNodes
[0].nodeValue
)
1145 if (node
.nodeName
== 'pack_dir'):
1146 results
['pack_dir'] = node
.childNodes
[0].nodeValue
1148 results
['error'] = 0
1152 if __name__
== '__main__':