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
)
281 if data
[:len(IMHERE
)] == IMHERE
:
283 if (host
, port
) == self
.current_server
:
284 print "Client.datagramReceived(): Received IMHERE from server"
286 self
.server_request
= 0
290 def init(self
, params
):
294 self
.current_server
= ()
295 self
.requested_server
= ()
302 def serverRequest(self
):
304 if self
.current_server
!= ():
306 if self
.server_request
> SERVER_TIMEOUT
:
307 the_engine
.events
.addEvent([SERVER_GONE
, {}])
308 self
.current_server
= ()
311 self
.server_request
+= 1
312 self
.transport
.write(YOUTHERE
, self
.current_server
)
316 def executeCommand(self
, command
, data
):
318 reactor
.callFromThread(self
.executeThreadedCommand
, command
, data
)
322 def executeThreadedCommand(self
, command
, data
):
323 if command
== SERVERKILL
:
325 if self
.current_server
!= ():
327 message
= ''.join([SERVERKILL
, ' '])
329 if data
.has_key('password'):
330 message
= ''.join([message
, data
['password']])
332 self
.transport
.write(message
, self
.current_server
)
334 if command
== SERVERREQUEST
:
336 message
= ''.join([SERVERREQUEST
, ' ', str(self
.params
['message_port'])])
338 the_multicast
.transport
.write(message
, (MULTICAST
, self
.params
['broadcast_port']))
339 # self.transport.write(message, ('255.255.255.255', self.params['broadcast_port']))
341 if command
== GETLIST
:
345 if data
.has_key('server'):
347 if self
.servers
.has_key(data
['server']):
348 self
.transport
.write(message
, self
.servers
[data
['server']])
352 if self
.current_server
!= ():
353 self
.transport
.write(message
, self
.current_server
)
357 if self
.current_server
!= ():
361 self
.transport
.write(message
, self
.current_server
)
363 self
.current_server
= ()
365 if command
== LETTER
:
367 if self
.current_server
!= ():
369 message
= ''.join([LETTER
, ':'])
371 for dest
in data
['destinations']:
372 if dest
in self
.members
:
373 message
= ''.join([message
, ' ' , dest
])
375 message
= ''.join([message
, ':', data
['message']])
377 self
.transport
.write(message
, self
.current_server
)
379 if command
== WANTIN
:
381 if data
.has_key('server'):
382 if self
.servers
.has_key(data
['server']):
384 self
.transport
.write(''.join([WANTIN
, ' ', self
.params
['name']]),
385 self
.servers
[data
['server']])
386 self
.current_server
= ()
387 self
.requested_server
= self
.servers
[data
['server']]
393 def __init__(self
, config
):
401 video_flags
= OPENGL|DOUBLEBUF
404 self
.display
= pygame
.display
.set_mode(config
['window_size'], video_flags
)
406 self
.font
= pygame
.font
.SysFont("default", 18)
407 self
.fontBig
= pygame
.font
.SysFont("default", 24)
408 self
.fontSub
= pygame
.font
.SysFont("default", 20)
409 self
.theme
= pgui
.Theme(['test_theme', 'gray', 'default'])
410 # self.theme = pgui.Theme('gray')
411 # self.theme = pgui.Theme('default')
413 self
.resize((config
['window_size']))
415 glShadeModel(GL_SMOOTH
)
416 glClearColor(self
.config
['background_color'][0],
417 self
.config
['background_color'][1],
418 self
.config
['background_color'][2],
419 self
.config
['background_color'][3])
421 glEnable(GL_DEPTH_TEST
)
422 glDepthFunc(GL_LEQUAL
)
423 glHint(GL_PERSPECTIVE_CORRECTION_HINT
, GL_NICEST
)
425 pygame
.display
.set_caption(config
['window_title'])
427 self
.gui_screen
= lamina
.LaminaScreenSurface()
429 self
.app
= pgui
.App(theme
=self
.theme
)
430 self
.app
._screen
= self
.gui_screen
.surf
431 self
.main_container
= pgui
.Container(width
=config
['window_size'][0])
435 self
.events
= EventReceiver()
437 # self.files is a map of filename to file
440 # {parent, [children], {object_defs},
441 # {menu_defs}, {object_instances}, {menu_instances}}
445 for file in listdir(self
.config
['pack_dir']):
446 if (is_zipfile(os
.path
.join(self
.config
['pack_dir'], file))):
447 self
.zipfiles
.append(ZipFile(os
.path
.join(self
.config
['pack_dir'], file)))
449 self
.running
= self
.addFile(self
.config
['init'], '')
450 self
.app
.init(self
.main_container
)
452 self
.ticks
= pygame
.time
.get_ticks()
455 if self
.running
== 0:
456 print "Engine.__init__(): Failed adding initial file"
458 self
.message_boxen
= []
466 self
.process_events()
470 pygame
.display
.flip()
476 self
.oldticks
= self
.ticks
477 self
.ticks
= pygame
.time
.get_ticks()
481 self
.fps
= (self
.frames
* 1000) / (self
.ticks
- self
.oldticks
) / 1000
483 pygame
.display
.set_caption(''.join([self
.config
['window_title'], ' ', str(self
.fps
)]))
487 def process_events(self
):
491 for e
in pygame
.event
.get():
494 print "Should be quitting..."
499 change
= self
.app
.update(self
.gui_screen
.surf
)
502 self
.gui_screen
.refresh(change
)
504 new_event
= self
.convertEvent(e
)
505 self
.events
.addEvent(new_event
)
510 if self
.events
.size():
511 new_event
= self
.events
.getEvent()
519 for file in self
.files
.keys():
521 for name
in self
.files
[file]['object_instances'].keys():
523 self
.files
[file]['object_instances'][name
].event(new_event
[0], new_event
[1])
527 def convertEvent(self
, e
):
534 if e
.type == ACTIVEEVENT
:
535 data
['gain'] = e
.gain
536 data
['state'] = e
.state
538 if e
.type == KEYDOWN
:
539 data
['unicode'] = e
.unicode
547 if e
.type == MOUSEMOTION
:
550 data
['buttons'] = e
.buttons
552 if e
.type == MOUSEBUTTONUP
:
554 data
['button'] = e
.button
556 if e
.type == MOUSEBUTTONDOWN
:
558 data
['button'] = e
.button
560 if e
.type == JOYAXISMOTION
:
562 data
['axis'] = e
.axis
563 data
['value'] = e
.value
565 if e
.type == JOYBALLMOTION
:
567 data
['ball'] = e
.ball
570 if e
.type == JOYHATMOTION
:
573 data
['value'] = e
.value
575 if e
.type == JOYBUTTONUP
:
577 data
['button'] = e
.button
579 if e
.type == JOYBUTTONDOWN
:
581 data
['button'] = e
.button
583 if e
.type == VIDEORESIZE
:
584 data
['size'] = e
.size
588 if e
.type == VIDEOEXPOSE
:
591 if e
.type == USEREVENT
:
592 data
['code'] = e
.code
596 if e
.type == QUIT
: type = "QUIT"
597 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
598 if e
.type == KEYDOWN
: type = "KEYDOWN"
599 if e
.type == KEYUP
: type = "KEYUP"
600 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
601 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
602 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
603 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
604 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
605 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
606 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
607 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
608 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
609 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
610 if e
.type == USEREVENT
: type = "USEREVENT"
616 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
)
622 self
.gui_screen
.display()
624 def resize(self
, (width
, height
)):
627 glViewport(0, 0, width
, height
)
628 glMatrixMode(GL_PROJECTION
)
630 gluPerspective(45, 1.0*width
/height
, 0.1, 100.0)
631 glMatrixMode(GL_MODELVIEW
)
636 def addFile(self
, filename
, parent
):
638 # Because I have alot of nesting in this function,
639 # I am using 2 space formatting
641 for zipfile
in self
.zipfiles
:
643 for file in zipfile
.namelist():
645 if (file == filename
):
646 dom
= parseString(zipfile
.read(file))
648 object_instances_d
= []
651 if dom
.childNodes
[0].nodeName
== 'game':
652 self
.files
[filename
] = {
656 'object_instances': {},
657 'menu_instances': {},
660 for node
in dom
.childNodes
[0].childNodes
:
662 if (node
.nodeName
== 'def'):
664 for sub_node
in node
.childNodes
:
666 if (sub_node
.nodeName
== 'object'):
670 for suber_node
in sub_node
.childNodes
:
672 if (suber_node
.nodeName
== 'name'):
673 if len(suber_node
.childNodes
):
674 temp_object_def
['name'] = suber_node
.childNodes
[0].nodeValue
676 if (suber_node
.nodeName
== 'script'):
677 if len(suber_node
.childNodes
):
678 temp_object_def
['script'] = suber_node
.childNodes
[0].nodeValue
680 if (suber_node
.nodeName
== 'tangible'):
681 if len(suber_node
.childNodes
):
682 temp_object_def
['tangible'] = suber_node
.childNodes
[0].nodeValue
684 if (suber_node
.nodeName
== 'type'):
685 if len(suber_node
.childNodes
):
686 temp_object_def
['type'] = suber_node
.childNodes
[0].nodeValue
688 self
.files
[filename
]['object_defs'][temp_object_def
['name']] = temp_object_def
691 if (sub_node
.nodeName
== 'menu'):
694 temp_menu_def
['elements'] = {}
696 temp_element_set
= {}
698 for suber_node
in sub_node
.childNodes
:
700 if (suber_node
.nodeName
== 'name'):
701 temp_menu_def
['name'] = suber_node
.childNodes
[0].nodeValue
703 if (suber_node
.nodeName
== 'elements'):
705 for suberer_node
in suber_node
.childNodes
:
707 if (suberer_node
.nodeType
!= 3 and suberer_node
.nodeType
!= 8):
708 if (suberer_node
.hasAttribute('name')):
709 temp_element_set
['name'] = suberer_node
.getAttribute('name')
711 if (suberer_node
.hasAttribute('x')):
712 temp_element_set
['x'] = int(suberer_node
.getAttribute('x'))
714 if (suberer_node
.hasAttribute('y')):
715 temp_element_set
['y'] = int(suberer_node
.getAttribute('y'))
717 if (suberer_node
.hasAttribute('width')):
718 temp_element_set
['width'] = int(suberer_node
.getAttribute('width'))
720 if (suberer_node
.hasAttribute('height')):
721 temp_element_set
['height'] = int(suberer_node
.getAttribute('height'))
723 if (suberer_node
.hasAttribute('parent')):
724 temp_element_set
['parent'] = suberer_node
.getAttribute('parent')
726 if (suberer_node
.hasAttribute('target')):
727 temp_element_set
['target'] = suberer_node
.getAttribute('target')
729 if (suberer_node
.hasAttribute('text')):
730 temp_element_set
['text'] = suberer_node
.getAttribute('text')
732 temp_element_set
['type'] = suberer_node
.nodeName
733 temp_menu_def
['elements'][temp_element_set
['name']] = temp_element_set
734 temp_element_set
= {}
736 self
.files
[filename
]['menu_defs'][temp_menu_def
['name']] = temp_menu_def
739 temp_element_set
= {}
741 if (node
.nodeName
== 'instance'):
743 for sub_node
in node
.childNodes
:
745 if (sub_node
.nodeName
== 'object'):
746 object_instances_d
.append(sub_node
.childNodes
[0].nodeValue
)
748 if (sub_node
.nodeName
== 'menu'):
749 menu_instances
.append(sub_node
.childNodes
[0].nodeValue
)
752 self
.files
[parent
]['children'].append(filename
)
753 self
.files
[filename
]['parent'] = parent
757 for menuname
, menu_data
in self
.files
[filename
]['menu_defs'].iteritems():
758 self
.files
[filename
]['menu_instances'][menuname
] = Menu(menu_def
=menu_data
)
760 for menuname
in menu_instances
:
761 if (self
.files
[filename
]['menu_instances'].has_key(menuname
)):
762 self
.files
[filename
]['menu_instances'][menuname
].show()
764 for file in self
.files
.keys():
765 if self
.files
[file]['menu_instances'].has_key(menuname
):
766 self
.files
[file]['menu_instances'][menuname
].show()
768 for objectname
in object_instances_d
:
769 self
.addObject(objectname
)
773 # ending 2-space formatting
775 def removeFile(self
, filename
):
777 if (self
.files
.has_key(filename
)):
779 for child
in self
.files
[filename
]['children']:
780 self
.removeFile(child
)
782 del self
.files
[filename
]['children']
784 parent
= self
.files
[filename
]['parent']
785 self
.files
[parent
].pop(self
.files
[parent
]['children'].index(filename
))
787 del self
.files
[filename
]
791 def getVisibleMenus(self
):
795 for file, contents
in self
.files
.iteritems():
796 for name
, menu
in contents
['menu_instances'].iteritems():
802 def hideAllMenus(self
):
804 for file, contents
in self
.files
.iteritems():
805 for name
, menu
in contents
['menu_instances'].iteritems():
810 def showMenu(self
, menu_name
):
812 for file, contents
in self
.files
.iteritems():
813 for name
, menu
in contents
['menu_instances'].iteritems():
814 if contents
['menu_instances'].has_key(menu_name
):
815 contents
['menu_instances'][menu_name
].show()
819 def hideMenu(self
, menu_name
):
821 for file, contents
in self
.files
:
822 for name
, menu
in contents
['menu_instances'].iteritems():
823 if contents
['menu_instances'].has_key(menu_name
):
824 contents
['menu_instances'][menu_name
].hide()
828 def setMenu(self
, menu_name
):
831 self
.showMenu(menu_name
)
835 def addObject(self
, objectname
):
837 for file in self
.files
.keys():
838 if self
.files
[file]['object_defs'].has_key(objectname
):
839 self
.files
[file]['object_instances'][objectname
] = GameObject(
840 self
.files
[file]['object_defs'][objectname
])
844 def removeObject(self
, objectname
):
846 for file in self
.files
.keys():
847 if self
.files
[file]['object_defs'].has_key(objectname
):
848 del self
.files
[file]['object_instances'][objectname
]
852 def addListItem(self
, menuname
, item
, data
, dvalue
):
854 for file in self
.files
:
855 if self
.files
[file]['menu_instances'].has_key(menuname
):
856 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
857 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
859 the_widget
.add(data
.encode(), value
=dvalue
)
865 def clearListItem(self
, menuname
, item
):
867 for file in self
.files
:
868 if self
.files
[file]['menu_instances'].has_key(menuname
):
869 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
870 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
878 def removeListItem(self
, menuname
, item
, value
):
880 for file in self
.files
:
881 if self
.files
[file]['menu_instances'].has_key(menuname
):
882 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
883 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
885 the_widget
.remove(value
)
891 def getListValue(self
, menuname
, item
):
893 for file in self
.files
:
894 if self
.files
[file]['menu_instances'].has_key(menuname
):
896 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
897 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
899 return the_widget
.value
903 def getEditboxValue(self
, menuname
, item
):
905 for file in self
.files
:
906 if self
.files
[file]['menu_instances'].has_key(menuname
):
908 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
909 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
911 return the_widget
.value
913 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
915 return the_widget
.value
917 def setEditboxValue(self
, menuname
, item
, new_value
):
919 for file in self
.files
:
920 if self
.files
[file]['menu_instances'].has_key(menuname
):
922 if self
.files
[file]['menu_instances'][menuname
].widgets
.has_key(item
):
923 the_widget
= self
.files
[file]['menu_instances'][menuname
].widgets
[item
]
925 the_widget
.value
= new_value
929 def showMessageBox(self
, message
, title
, width
, height
):
931 # Modify width and height to your liking
934 the_engine
.messageBox(title
, message
)
938 def getImage(self
, filename
):
940 the_buf
= pygame
.image
.load(self
.getStringIOFile(filename
))
944 def getStringIOFile(self
, filename
):
946 for zip_file
in self
.zipfiles
:
947 for file in zip_file
.namelist():
949 if (filename
== file):
951 the_string_io
= StringIO
.StringIO()
952 print >>the_string_io
, zip_file
.read(file)
953 the_string_io
.seek(0)
958 def getStringData(self
, filename
):
959 for zip_file
in self
.zipfiles
:
960 for file in zip_file
.namelist():
962 if (filename
== file):
963 return zip_file
.read(file)
966 def killThreadGame(self
):
974 reactor
.callFromThread(self
.killThreadGame
)
980 def __init__(self
, menu_def
):
982 self
.menu_def
= menu_def
985 for name
, element
in menu_def
['elements'].iteritems():
987 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100.00
988 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
990 dx
= float(element
['x']) * multiplier_x
991 dy
= float(element
['y']) * multiplier_y
993 dwidth
= float(element
['width']) * multiplier_x
994 dheight
= float(element
['height']) * multiplier_y
996 if (element
['type'] == 'button'):
997 self
.widgets
[name
] = pgui
.Button(element
['text'].encode(), width
=dwidth
, height
=dheight
)
998 self
.widgets
[name
].connect(pgui
.CLICK
, self
.clicked
, name
)
1000 if (element
['type'] == 'image'):
1001 self
.widgets
[name
] = pgui
.Image(the_engine
.getImage(element
['text']))
1003 if (element
['type'] == 'label'):
1004 self
.widgets
[name
] = pgui
.Label(element
['text'])
1006 if (element
['type'] == 'listbox'):
1007 self
.widgets
[name
] = pgui
.List(width
=dwidth
, height
=dheight
)
1008 self
.widgets
[name
].connect(pgui
.CLICK
, self
.clicked
, name
)
1010 if (element
['type'] == 'editbox'):
1011 self
.widgets
[name
] = pgui
.Input(value
=element
['text'], width
=dwidth
)
1012 self
.widgets
[name
].connect(pgui
.KEYDOWN
, self
.key_pressed
, name
)
1013 self
.widgets
[name
].connect(pgui
.KEYUP
, self
.key_up
, name
)
1015 if (self
.widgets
.has_key(name
)):
1016 self
.widgets
[name
].resize(width
=dwidth
, height
=dheight
)
1018 print "Menu.__init__(): Widget type", element
['type'], " not implemented yet, skipping."
1026 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100.00
1027 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
1029 if (self
.hidden
== 1):
1030 for name
, element
in self
.menu_def
['elements'].iteritems():
1031 dx
= float(element
['x']) * multiplier_x
1032 dy
= float(element
['y']) * multiplier_y
1034 if self
.widgets
.has_key(name
):
1035 the_engine
.main_container
.add(self
.widgets
[name
], dx
, dy
)
1045 if (self
.hidden
!= 1):
1046 for name
, element
in self
.menu_def
['elements'].iteritems():
1048 if (self
.widgets
.has_key(name
)):
1049 the_engine
.main_container
.remove(self
.widgets
[name
])
1055 def clicked(self
, widget
, _event
):
1057 if self
.menu_def
['elements'].has_key(widget
):
1059 if self
.menu_def
['elements'][widget
]['target'] != '':
1060 exec(self
.menu_def
['elements'][widget
]['target'])
1062 the_engine
.events
.addEvent(['WIDGET_CLICKED',
1064 'menu_name': self
.menu_def
['name'],
1065 event
: the_engine
.convertEvent(_event
)}])
1069 def key_pressed(self
, widget
, _event
):
1071 if self
.menu_def
['elements'].has_key(widget
):
1073 new_event
= the_engine
.convertEvent(_event
)
1075 the_engine
.events
.addEvent(['KEYDOWN',
1077 'menu_name': self
.menu_def
['name'],
1078 'event': new_event
}])
1082 def key_up(self
, widget
, _event
):
1084 if self
.menu_def
['elements'].has_key(widget
):
1086 the_engine
.events
.addEvent(['KEYUP',
1088 'menu_name': self
.menu_def
['name'],
1089 event
: the_engine
.convertEvent(_event
)}])
1093 class MessageBox(pgui
.Dialog
):
1095 def __init__(self
, title
, message
):
1097 self
.title
= pgui
.Label(title
)
1098 self
.main
= pgui
.Label(message
)
1104 def __init__(self
, dmold
):
1107 global the_functions
1110 if self
.mold
['script'] != '':
1114 the_file
= the_engine
.getStringData(self
.mold
['script'])
1119 self
.my_functions
= the_functions
1123 def event(self
, event
, data
):
1125 if self
.my_functions
.has_key(event
):
1127 self
.my_functions
[event
](data
)
1132 # parse command line stuff
1134 if (len(sys
.argv
) > 1):
1135 config
= sys
.argv
[1]
1137 print "main(): No config specified, using", CONFIG
1140 configuration
= parse_config(config
)
1142 if (configuration
.has_key('error') and configuration
['error']):
1143 print "main(): Error in parsing config."
1145 the_event_receiver
= EventReceiver()
1147 global client_params
1148 client_params
= {'broadcast_port':configuration
['broadcast_port'],
1149 'broadcast_bind':configuration
['broadcast_bind'],
1150 'message_port':configuration
['message_port'],
1151 'name':configuration
['name'],
1152 'echo_time': configuration
['echo_time']}
1157 the_engine
= Engine(configuration
)
1159 the_client
= Client()
1160 the_client_thread
= threading
.Thread(target
=run_net
)
1162 the_client
.server_request
= 0
1164 the_client
.init(client_params
)
1166 the_client_thread
.start()
1169 the_engine
.killGame()
1173 the_client_thread
.join()
1179 global client_params
1180 global the_multicast
1182 the_multicast
= Multicast()
1183 config
= client_params
1185 reactor
.listenMulticast(config
['broadcast_bind'], the_multicast
)
1186 reactor
.listenUDP(config
['message_port'], the_client
)
1188 echo_request
= task
.LoopingCall(the_client
.serverRequest
)
1190 if client_params
['echo_time'] != None:
1191 echo_request
.start(client_params
['echo_time'])
1193 print "run_net(): No ECHO_TIME specified, using default of", ECHO_TIME
1194 echo_request
.start(ECHO_TIME
)
1196 reactor
.run(installSignalHandlers
=0)
1200 def parse_config(filename
):
1201 results
= {'error': 1}
1203 if (exists(filename
)):
1204 dom
= parse(filename
)
1206 print "parse_config():", filename
, "doesn't exist."
1209 results
= {'window_title': None,
1214 'message_port': None,
1215 'broadcast_port': None,
1216 'broadcast_bind': None,
1218 'background_color': None,
1219 'window_size': None,
1225 if (dom
.childNodes
[0].nodeName
== 'config'):
1226 for node
in dom
.childNodes
[0].childNodes
:
1228 if (node
.nodeName
== 'window_title'):
1229 results
['window_title'] = node
.childNodes
[0].nodeValue
1231 if (node
.nodeName
== 'log'):
1232 results
['log'] = node
.childNodes
[0].nodeValue
1234 if (node
.nodeName
== 'name'):
1235 results
['name'] = node
.childNodes
[0].nodeValue
1237 if (node
.nodeName
== 'font'):
1238 results
['font'] = node
.childNodes
[0].nodeValue
1240 if (node
.nodeName
== 'init'):
1241 results
['init'] = node
.childNodes
[0].nodeValue
1243 if (node
.nodeName
== 'message_port'):
1244 results
['message_port'] = int(node
.childNodes
[0].nodeValue
)
1246 if (node
.nodeName
== 'broadcast_port'):
1247 results
['broadcast_port'] = int(node
.childNodes
[0].nodeValue
)
1249 if (node
.nodeName
== 'broadcast_bind'):
1250 results
['broadcast_bind'] = int(node
.childNodes
[0].nodeValue
)
1252 if (node
.nodeName
== 'fullscreen'):
1253 results
['fullscreen'] = int(node
.childNodes
[0].nodeValue
)
1255 if (node
.nodeName
== 'background_color'):
1257 string_parts
= node
.childNodes
[0].nodeValue
.split()
1258 results
['background_color'] = [float(string_parts
[0]), float(string_parts
[1])]
1259 results
['background_color'].append(float(string_parts
[2]))
1260 results
['background_color'].append(float(string_parts
[3]))
1262 if (node
.nodeName
== 'window_size'):
1264 string_parts
= node
.childNodes
[0].nodeValue
.split()
1265 results
['window_size'] = ((int(string_parts
[0]), int(string_parts
[1])))
1267 if (node
.nodeName
== 'gravity'):
1269 string_parts
= node
.childNodes
[0].nodeValue
.split()
1270 results
['gravity'] = [float(string_parts
[0]), float(string_parts
[1])]
1271 results
['gravity'].append(float(string_parts
[2]))
1273 if (node
.nodeName
== 'step_size'):
1274 results
['step_size'] = float(node
.childNodes
[0].nodeValue
)
1276 if (node
.nodeName
== 'pack_dir'):
1277 results
['pack_dir'] = node
.childNodes
[0].nodeValue
1279 if (node
.nodeName
== 'echo_time'):
1280 results
['echo_time'] = int(node
.childNodes
[0].nodeValue
)
1282 results
['error'] = 0
1286 if __name__
== '__main__':