5 CONFIG
= 'game_config.xml'
7 WINDOW_SIZE
= (640, 480)
8 WINDOW_CAPTION
= "Testing stuff"
11 BROADCAST_BIND
= 50031
21 MULTICAST
= '234.0.0.1'
27 SERVERREQUEST
= "i_want_server"
28 SERVEROFFER
= "Want_server?"
29 SERVERKILL
= "DIE_server!!"
30 YOUTHERE
= "you_there?"
31 IMHERE
= "yeah,i'm_here"
36 LIST
= "peoples_on_server"
37 SOMEONEJOINED
= "dude,someone_joined"
38 SOMEONELEFT
= "someone_left"
39 YOUROUT
= "get_lost_punk"
40 LETTER
= "listen_to_me"
41 SERVER_GONE
= 'its_gone'
52 from xml
.dom
.minidom
import parse
, parseString
53 from threading
import Lock
57 from twisted
.internet
.protocol
import DatagramProtocol
58 from twisted
.internet
import reactor
59 from twisted
.internet
import task
65 from pgu
import gui
as pgui
71 from OpenGL
.GL
import *
73 from OpenGL
.GLU
import *
81 print "getBroadcast(): Broadcast is reported to be", ip
84 reactor
.resolve('<broadcast>').addCallback(getBroadcast
)
86 the_event_receiver
= 0
95 self
.items_lock
= Lock()
99 return len(self
.items
)
103 self
.items_lock
.acquire()
104 the_item
= self
.items
.pop(0)
105 self
.items_lock
.release()
109 def addItem(self
, new_item
):
111 self
.items_lock
.acquire()
112 self
.items
.append(new_item
)
113 self
.items_lock
.release()
117 class EventReceiver(QueueLock
):
120 return self
.getItem()
121 def addEvent(self
, event
):
126 class CommandLine(QueueLock
):
128 def getCommand(self
):
129 return self
.getItem()
130 def addCommand(self
, command
):
131 self
.addItem(command
)
134 class Multicast(DatagramProtocol
):
136 def startProtocol(self
):
137 self
.transport
.joinGroup(MULTICAST
)
139 def datagramReceived(self
, datagram
, address
):
143 class Client(DatagramProtocol
):
145 def datagramReceived(self
, data
, (host
, port
)):
147 if data
[:len(YOUTHERE
)] == YOUTHERE
:
149 # print "Client.datagramReceived(): Recieved YOUTHERE, responding with IMHERE"
150 self
.transport
.write(IMHERE
, (host
, port
))
152 if data
[:len(SERVEROFFER
)] == SERVEROFFER
:
154 split_strings
= data
.split()
156 self
.servers
[split_strings
[2]] = (host
, int(split_strings
[1]))
158 event
= [SERVEROFFER
, {'server_name': split_strings
[2],
159 'server_address': self
.servers
[split_strings
[2]]}]
160 the_engine
.events
.addEvent(event
)
162 print "Client.datagramReceived(): Received SERVEROFFER"
164 if data
[:len(YOUREIN
)] == YOUREIN
:
166 if (host
, port
) == self
.requested_server
:
167 self
.current_server
= (host
, port
)
168 self
.requested_server
= ()
171 data
= {'server': self
.current_server
}
174 the_engine
.events
.addEvent(event
)
176 print "Client.datagramReceived(): Received YOUREIN, joined server"
180 if data
[:len(LIST
)] == LIST
:
182 print "Client.datagramReceived(): Received LIST"
184 split_strings
= data
.split()
188 for string
in split_strings
:
190 self
.members
.append(string
)
193 data
= {'names': self
.members
, 'server_address': (host
, port
)}
196 the_engine
.events
.addEvent(event
)
200 if data
[:len(SOMEONEJOINED
)] == SOMEONEJOINED
:
202 if (host
, port
) == self
.current_server
:
204 print "Client.datagramReceived(): Received SOMEONEJOINED"
208 for member
in self
.members
:
209 if member
== data
[len(SOMEONEJOINED
) + 1:]:
212 if left_member
== '':
213 self
.members
.append(data
[len(SOMEONEJOINED
) + 1:])
215 event
= [SOMEONEJOINED
]
216 data
= {'name': data
[len(SOMEONEJOINED
) + 1:]}
220 the_engine
.events
.addEvent(event
)
224 if data
[:len(SOMEONELEFT
)] == SOMEONELEFT
:
226 if (host
, port
) == self
.current_server
:
228 name
= data
[len(SOMEONELEFT
) + 1:]
230 if name
in self
.members
:
231 print "Client.datagramReceived(): Received SOMEONELEFT"
233 self
.members
.remove(name
)
235 event
= [SOMEONELEFT
]
236 data
= {'name': name
}
240 the_engine
.events
.addEvent(event
)
243 print "Client.datagramReceived(): Received SOMEONELEFT, but", name
, "not present in roster"
247 if data
[:len(YOUROUT
)] == YOUROUT
:
249 if (host
, port
) == self
.current_server
:
251 print "Client.datagramReceived(): Recieved YOUROUT"
253 self
.current_server
= ()
259 the_engine
.events
.addEvent(event
)
263 if data
[:len(LETTER
)] == LETTER
:
265 if (host
, port
) == self
.current_server
:
266 print "Client.datagramReceived(): Received LETTER"
268 split_strings
= data
.split(':')
270 message
= data
[data
.find(':', len(LETTER
) + 1) + 1:]
271 message_origin
= split_strings
[1]
274 data
= {'message': message
, 'origin': message_origin
}
277 the_engine
.events
.addEvent(event
)
279 if data
[:len(IMHERE
)] == IMHERE
:
281 if (host
, port
) == self
.current_server
:
282 #print "Client.datagramReceived(): Received IMHERE from server"
284 self
.server_request
= 0
288 def init(self
, params
):
292 self
.current_server
= ()
293 self
.requested_server
= ()
300 def serverRequest(self
):
302 if self
.current_server
!= ():
304 if self
.server_request
> SERVER_TIMEOUT
:
305 the_engine
.events
.addEvent([SERVER_GONE
, {}])
306 self
.current_server
= ()
309 self
.server_request
+= 1
310 self
.transport
.write(YOUTHERE
, self
.current_server
)
314 def executeCommand(self
, command
, data
):
316 reactor
.callFromThread(self
.executeThreadedCommand
, command
, data
)
320 def executeThreadedCommand(self
, command
, data
):
321 if command
== SERVERKILL
:
323 if self
.current_server
!= ():
325 message
= ''.join([SERVERKILL
, ' '])
327 if data
.has_key('password'):
328 message
= ''.join([message
, data
['password']])
330 self
.transport
.write(message
, self
.current_server
)
332 if command
== SERVERREQUEST
:
334 message
= ''.join([SERVERREQUEST
, ' ', str(self
.params
['message_port'])])
336 the_multicast
.transport
.write(message
, (MULTICAST
, self
.params
['broadcast_port']))
337 # self.transport.write(message, ('255.255.255.255', self.params['broadcast_port']))
339 if command
== GETLIST
:
343 if data
.has_key('server'):
345 if self
.servers
.has_key(data
['server']):
346 self
.transport
.write(message
, self
.servers
[data
['server']])
350 if self
.current_server
!= ():
351 self
.transport
.write(message
, self
.current_server
)
355 if self
.current_server
!= ():
359 self
.transport
.write(message
, self
.current_server
)
361 self
.current_server
= ()
363 if command
== LETTER
:
365 if self
.current_server
!= ():
367 message
= ''.join([LETTER
, ':'])
369 for dest
in data
['destinations']:
370 if dest
in self
.members
:
371 message
= ''.join([message
, ' ' , dest
])
373 message
= ''.join([message
, ':', data
['message']])
375 self
.transport
.write(message
, self
.current_server
)
377 if command
== WANTIN
:
379 if data
.has_key('server'):
380 if self
.servers
.has_key(data
['server']):
382 self
.transport
.write(''.join([WANTIN
, ' ', self
.params
['name']]),
383 self
.servers
[data
['server']])
384 self
.current_server
= ()
385 self
.requested_server
= self
.servers
[data
['server']]
391 def __init__(self
, config
):
399 video_flags
= OPENGL|DOUBLEBUF
402 self
.display
= pygame
.display
.set_mode(config
['window_size'], video_flags
)
404 self
.font
= pygame
.font
.SysFont("default", 18)
405 self
.fontBig
= pygame
.font
.SysFont("default", 24)
406 self
.fontSub
= pygame
.font
.SysFont("default", 20)
407 self
.theme
= pgui
.Theme(['test_theme', 'gray', 'default'])
408 # self.theme = pgui.Theme('gray')
409 # self.theme = pgui.Theme('default')
411 self
.resize((config
['window_size']))
413 glShadeModel(GL_SMOOTH
)
414 glClearColor(self
.config
['background_color'][0],
415 self
.config
['background_color'][1],
416 self
.config
['background_color'][2],
417 self
.config
['background_color'][3])
419 glEnable(GL_DEPTH_TEST
)
420 glDepthFunc(GL_LEQUAL
)
421 glHint(GL_PERSPECTIVE_CORRECTION_HINT
, GL_NICEST
)
423 pygame
.display
.set_caption(config
['window_title'])
425 self
.gui_screen
= lamina
.LaminaScreenSurface()
427 self
.app
= pgui
.App(theme
=self
.theme
)
428 self
.app
._screen
= self
.gui_screen
.surf
429 self
.main_container
= pgui
.Container(width
=config
['window_size'][0])
433 self
.events
= EventReceiver()
435 # self.files is a map of filename to file
438 # {parent, [children], {object_defs},
439 # {menu_defs}, {object_instances}, {menu_instances}}
443 for file in listdir(self
.config
['pack_dir']):
444 if (is_zipfile(os
.path
.join(self
.config
['pack_dir'], file))):
445 self
.zipfiles
.append(ZipFile(os
.path
.join(self
.config
['pack_dir'], file)))
447 self
.running
= self
.addFile(self
.config
['init'], '')
448 self
.app
.init(self
.main_container
)
450 self
.ticks
= pygame
.time
.get_ticks()
453 if self
.running
== 0:
454 print "Engine.__init__(): Failed adding initial file"
462 self
.process_events()
466 pygame
.display
.flip()
472 self
.oldticks
= self
.ticks
473 self
.ticks
= pygame
.time
.get_ticks()
477 self
.fps
= (self
.frames
* 1000) / (self
.ticks
- self
.oldticks
) / 1000
479 pygame
.display
.set_caption(''.join([self
.config
['window_title'], ' ', str(self
.fps
)]))
483 def process_events(self
):
487 for e
in pygame
.event
.get():
490 print "Should be quitting..."
495 change
= self
.app
.update(self
.gui_screen
.surf
)
498 self
.gui_screen
.refresh(change
)
500 new_event
= self
.convertEvent(e
)
501 self
.events
.addEvent(new_event
)
506 if self
.events
.size():
507 new_event
= self
.events
.getEvent()
515 for file in self
.files
.keys():
517 for name
in self
.files
[file]['object_instances'].keys():
519 self
.files
[file]['object_instances'][name
].event(new_event
[0], new_event
[1])
523 def convertEvent(self
, e
):
530 if e
.type == ACTIVEEVENT
:
531 data
['gain'] = e
.gain
532 data
['state'] = e
.state
534 if e
.type == KEYDOWN
:
535 data
['unicode'] = e
.unicode
543 if e
.type == MOUSEMOTION
:
546 data
['buttons'] = e
.buttons
548 if e
.type == MOUSEBUTTONUP
:
550 data
['button'] = e
.button
552 if e
.type == MOUSEBUTTONDOWN
:
554 data
['button'] = e
.button
556 if e
.type == JOYAXISMOTION
:
558 data
['axis'] = e
.axis
559 data
['value'] = e
.value
561 if e
.type == JOYBALLMOTION
:
563 data
['ball'] = e
.ball
566 if e
.type == JOYHATMOTION
:
569 data
['value'] = e
.value
571 if e
.type == JOYBUTTONUP
:
573 data
['button'] = e
.button
575 if e
.type == JOYBUTTONDOWN
:
577 data
['button'] = e
.button
579 if e
.type == VIDEORESIZE
:
580 data
['size'] = e
.size
584 if e
.type == VIDEOEXPOSE
:
587 if e
.type == USEREVENT
:
588 data
['code'] = e
.code
592 if e
.type == QUIT
: type = "QUIT"
593 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
594 if e
.type == KEYDOWN
: type = "KEYDOWN"
595 if e
.type == KEYUP
: type = "KEYUP"
596 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
597 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
598 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
599 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
600 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
601 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
602 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
603 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
604 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
605 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
606 if e
.type == USEREVENT
: type = "USEREVENT"
612 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
)
618 self
.gui_screen
.display()
620 def resize(self
, (width
, height
)):
623 glViewport(0, 0, width
, height
)
624 glMatrixMode(GL_PROJECTION
)
626 gluPerspective(45, 1.0*width
/height
, 0.1, 100.0)
627 glMatrixMode(GL_MODELVIEW
)
632 def addFile(self
, filename
, parent
):
634 # Because I have alot of nesting in this function,
635 # I am using 2 space formatting
637 for zipfile
in self
.zipfiles
:
639 for file in zipfile
.namelist():
641 if (file == filename
):
642 dom
= parseString(zipfile
.read(file))
644 object_instances_d
= []
647 if dom
.childNodes
[0].nodeName
== 'game':
648 self
.files
[filename
] = {
652 'object_instances': {},
653 'menu_instances': {},
656 for node
in dom
.childNodes
[0].childNodes
:
658 if (node
.nodeName
== 'def'):
660 for sub_node
in node
.childNodes
:
662 if (sub_node
.nodeName
== 'object'):
666 for suber_node
in sub_node
.childNodes
:
668 if (suber_node
.nodeName
== 'name'):
669 if len(suber_node
.childNodes
):
670 temp_object_def
['name'] = suber_node
.childNodes
[0].nodeValue
672 if (suber_node
.nodeName
== 'script'):
673 if len(suber_node
.childNodes
):
674 temp_object_def
['script'] = suber_node
.childNodes
[0].nodeValue
676 if (suber_node
.nodeName
== 'tangible'):
677 if len(suber_node
.childNodes
):
678 temp_object_def
['tangible'] = suber_node
.childNodes
[0].nodeValue
680 if (suber_node
.nodeName
== 'type'):
681 if len(suber_node
.childNodes
):
682 temp_object_def
['type'] = suber_node
.childNodes
[0].nodeValue
684 self
.files
[filename
]['object_defs'][temp_object_def
['name']] = temp_object_def
687 if (sub_node
.nodeName
== 'menu'):
690 temp_menu_def
['elements'] = {}
692 temp_element_set
= {}
694 for suber_node
in sub_node
.childNodes
:
696 if (suber_node
.nodeName
== 'name'):
697 temp_menu_def
['name'] = suber_node
.childNodes
[0].nodeValue
699 if (suber_node
.nodeName
== 'elements'):
701 for suberer_node
in suber_node
.childNodes
:
703 if (suberer_node
.nodeType
!= 3 and suberer_node
.nodeType
!= 8):
704 if (suberer_node
.hasAttribute('name')):
705 temp_element_set
['name'] = suberer_node
.getAttribute('name')
707 if (suberer_node
.hasAttribute('x')):
708 temp_element_set
['x'] = int(suberer_node
.getAttribute('x'))
710 if (suberer_node
.hasAttribute('y')):
711 temp_element_set
['y'] = int(suberer_node
.getAttribute('y'))
713 if (suberer_node
.hasAttribute('width')):
714 temp_element_set
['width'] = int(suberer_node
.getAttribute('width'))
716 if (suberer_node
.hasAttribute('height')):
717 temp_element_set
['height'] = int(suberer_node
.getAttribute('height'))
719 if (suberer_node
.hasAttribute('parent')):
720 temp_element_set
['parent'] = suberer_node
.getAttribute('parent')
722 if (suberer_node
.hasAttribute('target')):
723 temp_element_set
['target'] = suberer_node
.getAttribute('target')
725 if (suberer_node
.hasAttribute('text')):
726 temp_element_set
['text'] = suberer_node
.getAttribute('text')
728 temp_element_set
['type'] = suberer_node
.nodeName
729 temp_menu_def
['elements'][temp_element_set
['name']] = temp_element_set
730 temp_element_set
= {}
732 self
.files
[filename
]['menu_defs'][temp_menu_def
['name']] = temp_menu_def
735 temp_element_set
= {}
737 if (node
.nodeName
== 'instance'):
739 for sub_node
in node
.childNodes
:
741 if (sub_node
.nodeName
== 'object'):
742 object_instances_d
.append(sub_node
.childNodes
[0].nodeValue
)
744 if (sub_node
.nodeName
== 'menu'):
745 menu_instances
.append(sub_node
.childNodes
[0].nodeValue
)
748 self
.files
[parent
]['children'].append(filename
)
749 self
.files
[filename
]['parent'] = parent
753 for menuname
, menu_data
in self
.files
[filename
]['menu_defs'].iteritems():
754 self
.files
[filename
]['menu_instances'][menuname
] = Menu(menu_def
=menu_data
)
756 for menuname
in menu_instances
:
757 if (self
.files
[filename
]['menu_instances'].has_key(menuname
)):
758 self
.files
[filename
]['menu_instances'][menuname
].show()
760 for file in self
.files
.keys():
761 if self
.files
[file]['menu_instances'].has_key(menuname
):
762 self
.files
[file]['menu_instances'][menuname
].show()
764 for objectname
in object_instances_d
:
765 self
.addObject(objectname
)
769 # ending 2-space formatting
771 def removeFile(self
, filename
):
773 if (self
.files
.has_key(filename
)):
775 for child
in self
.files
[filename
]['children']:
776 self
.removeFile(child
)
778 del self
.files
[filename
]['children']
780 parent
= self
.files
[filename
]['parent']
781 self
.files
[parent
].pop(self
.files
[parent
]['children'].index(filename
))
783 del self
.files
[filename
]
787 def getVisibleMenus(self
):
791 for file, contents
in self
.files
.iteritems():
792 for name
, menu
in contents
['menu_instances'].iteritems():
798 def hideAllMenus(self
):
800 for file, contents
in self
.files
.iteritems():
801 for name
, menu
in contents
['menu_instances'].iteritems():
806 def showMenu(self
, menu_name
):
808 for file, contents
in self
.files
.iteritems():
809 for name
, menu
in contents
['menu_instances'].iteritems():
810 if contents
['menu_instances'].has_key(menu_name
):
811 contents
['menu_instances'][menu_name
].show()
815 def hideMenu(self
, menu_name
):
817 for file, contents
in self
.files
:
818 for name
, menu
in contents
['menu_instances'].iteritems():
819 if contents
['menu_instances'].has_key(menu_name
):
820 contents
['menu_instances'][menu_name
].hide()
824 def setMenu(self
, menu_name
):
827 self
.showMenu(menu_name
)
831 def addObject(self
, objectname
):
833 for file in self
.files
.keys():
834 if self
.files
[file]['object_defs'].has_key(objectname
):
835 self
.files
[file]['object_instances'][objectname
] = GameObject(
836 self
.files
[file]['object_defs'][objectname
])
840 def removeObject(self
, objectname
):
842 for file in self
.files
.keys():
843 if self
.files
[file]['object_defs'].has_key(objectname
):
844 del self
.files
[file]['object_instances'][objectname
]
848 def addListItem(self
, menuname
, item
, data
, dvalue
):
850 for file in self
.files
:
851 if self
.files
[file]['menu_instances'].has_key(menuname
):
852 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
853 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
855 the_widget
.add(data
, value
=dvalue
)
861 def clearListItem(self
, menuname
, item
):
863 for file in self
.files
:
864 if self
.files
[file]['menu_instances'].has_key(menuname
):
865 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
866 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
874 def removeListItem(self
, menuname
, item
, value
):
876 for file in self
.files
:
877 if self
.files
[file]['menu_instances'].has_key(menuname
):
878 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
879 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
881 the_widget
.remove(value
)
887 def getListValue(self
, menuname
, item
):
889 for file in self
.files
:
890 if self
.files
[file]['menu_instances'].has_key(menuname
):
892 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
893 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
895 return the_widget
.value
899 def getEditboxValue(self
, menuname
, item
):
901 for file in self
.files
:
902 if self
.files
[file]['menu_instances'].has_key(menuname
):
904 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
905 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
907 return the_widget
.value
909 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
911 return the_widget
.value
913 def setEditboxValue(self
, menuname
, item
, new_value
):
915 for file in self
.files
:
916 if self
.files
[file]['menu_instances'].has_key(menuname
):
918 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
919 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
921 the_widget
.value
= new_value
925 def showMessageBox(self
, message
, title
, width
, height
):
927 # Modify width and height to your liking
930 the_engine
.messageBox(title
, message
)
934 def getImage(self
, filename
):
936 the_buf
= pygame
.image
.load(self
.getStringIOFile(filename
))
940 def getStringIOFile(self
, filename
):
942 for zip_file
in self
.zipfiles
:
943 for file in zip_file
.namelist():
945 if (filename
== file):
947 the_string_io
= StringIO
.StringIO()
948 print >>the_string_io
, zip_file
.read(file)
949 the_string_io
.seek(0)
954 def getStringData(self
, filename
):
955 for zip_file
in self
.zipfiles
:
956 for file in zip_file
.namelist():
958 if (filename
== file):
959 return zip_file
.read(file)
962 def killThreadGame(self
):
970 reactor
.callFromThread(self
.killThreadGame
)
976 def __init__(self
, menu_def
):
978 self
.menu_def
= menu_def
981 for name
, element
in menu_def
['elements'].iteritems():
983 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100.00
984 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
986 dx
= float(element
['x']) * multiplier_x
987 dy
= float(element
['y']) * multiplier_y
989 dwidth
= float(element
['width']) * multiplier_x
990 dheight
= float(element
['height']) * multiplier_y
992 if (element
['type'] == 'button'):
993 self
.widgets
[name
] = pgui
.Button(element
['text'].encode(), width
=dwidth
, height
=dheight
)
994 self
.widgets
[name
].connect(pgui
.CLICK
, self
.clicked
, name
)
996 if (element
['type'] == 'image'):
997 self
.widgets
[name
] = pgui
.Image(the_engine
.getImage(element
['text']))
999 if (element
['type'] == 'label'):
1000 self
.widgets
[name
] = pgui
.Label(element
['text'])
1002 if (element
['type'] == 'listbox'):
1003 self
.widgets
[name
] = pgui
.List(width
=dwidth
, height
=dheight
)
1004 self
.widgets
[name
].connect(pgui
.CLICK
, self
.clicked
, name
)
1006 if (element
['type'] == 'editbox'):
1007 self
.widgets
[name
] = pgui
.Input(value
=element
['text'], width
=dwidth
)
1008 self
.widgets
[name
].connect(pgui
.KEYDOWN
, self
.key_pressed
, name
)
1009 self
.widgets
[name
].connect(pgui
.KEYUP
, self
.key_up
, name
)
1011 if (self
.widgets
.has_key(name
)):
1012 self
.widgets
[name
].resize(width
=dwidth
, height
=dheight
)
1014 print "Menu.__init__(): Widget type", element
['type'], " not implemented yet, skipping."
1022 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100.00
1023 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
1025 if (self
.hidden
== 1):
1026 for name
, element
in self
.menu_def
['elements'].iteritems():
1027 dx
= float(element
['x']) * multiplier_x
1028 dy
= float(element
['y']) * multiplier_y
1030 if self
.widgets
.has_key(name
):
1031 the_engine
.main_container
.add(self
.widgets
[name
], dx
, dy
)
1041 if (self
.hidden
!= 1):
1042 for name
, element
in self
.menu_def
['elements'].iteritems():
1044 if (self
.widgets
.has_key(name
)):
1045 the_engine
.main_container
.remove(self
.widgets
[name
])
1051 def clicked(self
, widget
):
1053 if self
.menu_def
['elements'].has_key(widget
):
1055 if self
.menu_def
['elements'][widget
]['target'] != '':
1056 exec(self
.menu_def
['elements'][widget
]['target'])
1058 the_engine
.events
.addEvent(['WIDGET_CLICKED',
1059 {'name': widget
, 'menu_name': self
.menu_def
['name']}])
1063 def key_pressed(self
, widget
):
1065 if self
.menu_def
['elements'].has_key(widget
):
1067 the_engine
.events
.addEvent(['KEYDOWN',
1068 {'name': widget
, 'menu_name': self
.menu_def
['name']}])
1072 def key_up(self
, widget
):
1074 if self
.menu_def
['elements'].has_key(widget
):
1076 the_engine
.events
.addEvent(['KEYUP',
1077 {'name': widget
, 'menu_name': self
.menu_def
['name']}])
1081 class MessageBox(pgui
.Dialog
):
1083 def __init__(self
, title
, message
):
1085 self
.title
= pgui
.Label(title
)
1086 self
.main
= pgui
.Label(message
)
1092 def __init__(self
, dmold
):
1095 global the_functions
1098 if self
.mold
['script'] != '':
1102 the_file
= the_engine
.getStringData(self
.mold
['script'])
1107 self
.my_functions
= the_functions
1111 def event(self
, event
, data
):
1113 if self
.my_functions
.has_key(event
):
1115 self
.my_functions
[event
](data
)
1120 # parse command line stuff
1122 if (len(sys
.argv
) > 1):
1123 config
= sys
.argv
[1]
1125 print "main(): No config specified, using", CONFIG
1128 configuration
= parse_config(config
)
1130 if (configuration
.has_key('error') and configuration
['error']):
1131 print "main(): Error in parsing config."
1133 the_event_receiver
= EventReceiver()
1135 global client_params
1136 client_params
= {'broadcast_port':configuration
['broadcast_port'],
1137 'broadcast_bind':configuration
['broadcast_bind'],
1138 'message_port':configuration
['message_port'],
1139 'name':configuration
['name'],
1140 'echo_time': configuration
['echo_time']}
1145 the_engine
= Engine(configuration
)
1147 the_client
= Client()
1148 the_client_thread
= threading
.Thread(target
=run_net
)
1150 the_client
.server_request
= 0
1152 the_client
.init(client_params
)
1154 the_client_thread
.start()
1157 the_engine
.killGame()
1161 the_client_thread
.join()
1167 global client_params
1168 global the_multicast
1170 the_multicast
= Multicast()
1171 config
= client_params
1173 reactor
.listenMulticast(config
['broadcast_bind'], the_multicast
)
1174 reactor
.listenUDP(config
['message_port'], the_client
)
1176 echo_request
= task
.LoopingCall(the_client
.serverRequest
)
1178 if client_params
['echo_time'] != None:
1179 echo_request
.start(client_params
['echo_time'])
1181 print "run_net(): No ECHO_TIME specified, using default of", ECHO_TIME
1182 echo_request
.start(ECHO_TIME
)
1184 reactor
.run(installSignalHandlers
=0)
1188 def parse_config(filename
):
1189 results
= {'error': 1}
1191 if (exists(filename
)):
1192 dom
= parse(filename
)
1194 print "parse_config():", filename
, "doesn't exist."
1197 results
= {'window_title': None,
1202 'message_port': None,
1203 'broadcast_port': None,
1204 'broadcast_bind': None,
1206 'background_color': None,
1207 'window_size': None,
1213 if (dom
.childNodes
[0].nodeName
== 'config'):
1214 for node
in dom
.childNodes
[0].childNodes
:
1216 if (node
.nodeName
== 'window_title'):
1217 results
['window_title'] = node
.childNodes
[0].nodeValue
1219 if (node
.nodeName
== 'log'):
1220 results
['log'] = node
.childNodes
[0].nodeValue
1222 if (node
.nodeName
== 'name'):
1223 results
['name'] = node
.childNodes
[0].nodeValue
1225 if (node
.nodeName
== 'font'):
1226 results
['font'] = node
.childNodes
[0].nodeValue
1228 if (node
.nodeName
== 'init'):
1229 results
['init'] = node
.childNodes
[0].nodeValue
1231 if (node
.nodeName
== 'message_port'):
1232 results
['message_port'] = int(node
.childNodes
[0].nodeValue
)
1234 if (node
.nodeName
== 'broadcast_port'):
1235 results
['broadcast_port'] = int(node
.childNodes
[0].nodeValue
)
1237 if (node
.nodeName
== 'broadcast_bind'):
1238 results
['broadcast_bind'] = int(node
.childNodes
[0].nodeValue
)
1240 if (node
.nodeName
== 'fullscreen'):
1241 results
['fullscreen'] = int(node
.childNodes
[0].nodeValue
)
1243 if (node
.nodeName
== 'background_color'):
1245 string_parts
= node
.childNodes
[0].nodeValue
.split()
1246 results
['background_color'] = [float(string_parts
[0]), float(string_parts
[1])]
1247 results
['background_color'].append(float(string_parts
[2]))
1248 results
['background_color'].append(float(string_parts
[3]))
1250 if (node
.nodeName
== 'window_size'):
1252 string_parts
= node
.childNodes
[0].nodeValue
.split()
1253 results
['window_size'] = ((int(string_parts
[0]), int(string_parts
[1])))
1255 if (node
.nodeName
== 'gravity'):
1257 string_parts
= node
.childNodes
[0].nodeValue
.split()
1258 results
['gravity'] = [float(string_parts
[0]), float(string_parts
[1])]
1259 results
['gravity'].append(float(string_parts
[2]))
1261 if (node
.nodeName
== 'step_size'):
1262 results
['step_size'] = float(node
.childNodes
[0].nodeValue
)
1264 if (node
.nodeName
== 'pack_dir'):
1265 results
['pack_dir'] = node
.childNodes
[0].nodeValue
1267 if (node
.nodeName
== 'echo_time'):
1268 results
['echo_time'] = int(node
.childNodes
[0].nodeValue
)
1270 results
['error'] = 0
1274 if __name__
== '__main__':