7 CONFIG
= 'game_config.xml'
8 PROTOCOL_FILE
= 'protocol.py'
10 WINDOW_SIZE
= (640, 480)
11 WINDOW_CAPTION
= "Testing stuff"
14 BROADCAST_BIND
= 50031
21 MULTICAST
= '234.0.0.1'
24 protocol_file
= open(PROTOCOL_FILE
)
34 sys
.path
.insert(0, 'pygame_gui')
38 from xml
.dom
.minidom
import parse
, parseString
39 from threading
import Lock
43 from twisted
.internet
.protocol
import DatagramProtocol
44 from twisted
.internet
import reactor
45 from twisted
.internet
import task
54 from OpenGL
.GL
import *
56 from OpenGL
.GLU
import *
58 from DerGUI
import GUISystem
60 the_event_receiver
= 0
67 def __init__(self
, config
):
75 video_flags
= OPENGL|DOUBLEBUF
78 self
.display
= pygame
.display
.set_mode(config
['window_size'], video_flags
)
79 self
.resize((config
['window_size']))
81 glShadeModel(GL_SMOOTH
)
82 glClearColor(self
.config
['background_color'][0],
83 self
.config
['background_color'][1],
84 self
.config
['background_color'][2],
85 self
.config
['background_color'][3])
88 glEnable(GL_DEPTH_TEST
)
89 glDepthFunc(GL_LEQUAL
)
90 glHint(GL_PERSPECTIVE_CORRECTION_HINT
, GL_NICEST
)
92 pygame
.display
.set_caption(config
['window_title'])
94 self
.gui_screen
= lamina
.LaminaScreenSurface()
96 self
.gui_system
= GUISystem('widgets.xml', 'theme_two.zip')
100 self
.events
= EventReceiver()
102 # self.files is a map of filename to file
105 # {parent, [children], {object_defs},
106 # {menu_defs}, {object_instances}, {menu_instances}}
110 for file in listdir(self
.config
['pack_dir']):
111 if (is_zipfile(os
.path
.join(self
.config
['pack_dir'], file))):
112 self
.zipfiles
.append(ZipFile(os
.path
.join(self
.config
['pack_dir'], file)))
114 self
.running
= self
.addFile(self
.config
['init'], '')
117 print "Engine.__init__(): Failed adding initial file"
125 self
.gui_screen
.refresh()
129 self
.process_events()
133 pygame
.display
.flip()
139 reactor
.callFromThread(self
.killThreadGame
)
143 def killThreadGame(self
):
149 def process_events(self
):
153 for e
in pygame
.event
.get():
156 print "Should be quitting..."
160 self
.change
= self
.gui_system
.event(e
)
162 new_event
= self
.convertEvent(e
)
163 self
.events
.addEvent(new_event
)
168 if self
.events
.size():
169 new_event
= self
.events
.getEvent()
177 for file in self
.files
.keys():
179 for name
in self
.files
[file]['object_instances'].keys():
181 self
.files
[file]['object_instances'][name
].event(new_event
[0], new_event
[1])
185 def convertEvent(self
, e
):
192 if e
.type == ACTIVEEVENT
:
193 data
['gain'] = e
.gain
194 data
['state'] = e
.state
196 if e
.type == KEYDOWN
:
197 data
['unicode'] = e
.unicode
205 if e
.type == MOUSEMOTION
:
208 data
['buttons'] = e
.buttons
210 if e
.type == MOUSEBUTTONUP
:
212 data
['button'] = e
.button
214 if e
.type == MOUSEBUTTONDOWN
:
216 data
['button'] = e
.button
218 if e
.type == JOYAXISMOTION
:
220 data
['axis'] = e
.axis
221 data
['value'] = e
.value
223 if e
.type == JOYBALLMOTION
:
225 data
['ball'] = e
.ball
228 if e
.type == JOYHATMOTION
:
231 data
['value'] = e
.value
233 if e
.type == JOYBUTTONUP
:
235 data
['button'] = e
.button
237 if e
.type == JOYBUTTONDOWN
:
239 data
['button'] = e
.button
241 if e
.type == VIDEORESIZE
:
242 data
['size'] = e
.size
246 if e
.type == VIDEOEXPOSE
:
249 if e
.type == USEREVENT
:
250 data
['code'] = e
.code
254 if e
.type == QUIT
: type = "QUIT"
255 if e
.type == ACTIVEEVENT
: type = "ACTIVEEVENT"
256 if e
.type == KEYDOWN
: type = "KEYDOWN"
257 if e
.type == KEYUP
: type = "KEYUP"
258 if e
.type == MOUSEMOTION
: type = "MOUSEMOTION"
259 if e
.type == MOUSEBUTTONUP
: type = "MOUSEBUTTONUP"
260 if e
.type == MOUSEBUTTONDOWN
: type = "MOUSEBUTTONDOWN"
261 if e
.type == JOYAXISMOTION
: type = "JOYAXISMOTION"
262 if e
.type == JOYBALLMOTION
: type = "JOYBALLMOTION"
263 if e
.type == JOYHATMOTION
: type = "JOYHATMOTION"
264 if e
.type == JOYBUTTONUP
: type = "JOYBUTTONUP"
265 if e
.type == JOYBUTTONDOWN
: type = "JOYBUTTONDOWN"
266 if e
.type == VIDEORESIZE
: type = "VIDEORESIZE"
267 if e
.type == VIDEOEXPOSE
: type = "VIDEOEXPOSE"
268 if e
.type == USEREVENT
: type = "USEREVENT"
274 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
)
282 self
.gui_system
.draw(self
.gui_screen
.surf
)
283 self
.gui_screen
.refresh()
284 self
.gui_screen
.display()
286 def resize(self
, (width
, height
)):
289 glViewport(0, 0, width
, height
)
290 glMatrixMode(GL_PROJECTION
)
292 gluPerspective(45, 1.0*width
/height
, 0.1, 100.0)
293 glMatrixMode(GL_MODELVIEW
)
298 def addFile(self
, filename
, parent
):
300 # Because I have alot of nesting in this function,
301 # I am using 2 space formatting
303 for zipfile
in self
.zipfiles
:
305 for file in zipfile
.namelist():
307 if (file == filename
):
308 dom
= parseString(zipfile
.read(file))
310 object_instances_d
= []
313 if dom
.childNodes
[0].nodeName
== 'game':
314 self
.files
[filename
] = {
318 'object_instances': {},
319 'menu_instances': {},
322 for node
in dom
.childNodes
[0].childNodes
:
324 if (node
.nodeName
== 'def'):
326 for sub_node
in node
.childNodes
:
328 if (sub_node
.nodeName
== 'object'):
332 for suber_node
in sub_node
.childNodes
:
334 if (suber_node
.nodeName
== 'name'):
335 if len(suber_node
.childNodes
):
336 temp_object_def
['name'] = suber_node
.childNodes
[0].nodeValue
338 if (suber_node
.nodeName
== 'script'):
339 if len(suber_node
.childNodes
):
340 temp_object_def
['script'] = suber_node
.childNodes
[0].nodeValue
342 if (suber_node
.nodeName
== 'tangible'):
343 if len(suber_node
.childNodes
):
344 temp_object_def
['tangible'] = suber_node
.childNodes
[0].nodeValue
346 if (suber_node
.nodeName
== 'type'):
347 if len(suber_node
.childNodes
):
348 temp_object_def
['type'] = suber_node
.childNodes
[0].nodeValue
350 self
.files
[filename
]['object_defs'][temp_object_def
['name']] = temp_object_def
353 if (sub_node
.nodeName
== 'menu'):
356 temp_menu_def
['elements'] = {}
358 temp_element_set
= {}
360 for suber_node
in sub_node
.childNodes
:
362 if (suber_node
.nodeName
== 'name'):
363 temp_menu_def
['name'] = suber_node
.childNodes
[0].nodeValue
365 if (suber_node
.nodeName
== 'elements'):
367 for suberer_node
in suber_node
.childNodes
:
369 if (suberer_node
.nodeType
!= 3 and suberer_node
.nodeType
!= 8):
370 if (suberer_node
.hasAttribute('name')):
371 temp_element_set
['name'] = suberer_node
.getAttribute('name')
373 if (suberer_node
.hasAttribute('x')):
374 temp_element_set
['x'] = int(suberer_node
.getAttribute('x'))
376 if (suberer_node
.hasAttribute('y')):
377 temp_element_set
['y'] = int(suberer_node
.getAttribute('y'))
379 if (suberer_node
.hasAttribute('width')):
380 temp_element_set
['width'] = int(suberer_node
.getAttribute('width'))
382 if (suberer_node
.hasAttribute('height')):
383 temp_element_set
['height'] = int(suberer_node
.getAttribute('height'))
385 if (suberer_node
.hasAttribute('parent')):
386 temp_element_set
['parent'] = suberer_node
.getAttribute('parent')
388 if (suberer_node
.hasAttribute('target')):
389 temp_element_set
['target'] = suberer_node
.getAttribute('target')
391 if (suberer_node
.hasAttribute('text')):
392 temp_element_set
['text'] = suberer_node
.getAttribute('text')
394 temp_element_set
['type'] = suberer_node
.nodeName
395 temp_menu_def
['elements'][temp_element_set
['name']] = temp_element_set
396 temp_element_set
= {}
398 self
.files
[filename
]['menu_defs'][temp_menu_def
['name']] = temp_menu_def
401 temp_element_set
= {}
403 if (node
.nodeName
== 'instance'):
405 for sub_node
in node
.childNodes
:
407 if (sub_node
.nodeName
== 'object'):
408 object_instances_d
.append(sub_node
.childNodes
[0].nodeValue
)
410 if (sub_node
.nodeName
== 'menu'):
411 menu_instances
.append(sub_node
.childNodes
[0].nodeValue
)
414 self
.files
[parent
]['children'].append(filename
)
415 self
.files
[filename
]['parent'] = parent
419 for menuname
, menu_data
in self
.files
[filename
]['menu_defs'].iteritems():
420 self
.files
[filename
]['menu_instances'][menuname
] = Menu(menu_def
=menu_data
)
422 for menuname
in menu_instances
:
423 if (self
.files
[filename
]['menu_instances'].has_key(menuname
)):
424 self
.files
[filename
]['menu_instances'][menuname
].show()
426 for file in self
.files
.keys():
427 if self
.files
[file]['menu_instances'].has_key(menuname
):
428 self
.files
[file]['menu_instances'][menuname
].show()
430 for objectname
in object_instances_d
:
431 self
.addObject(objectname
)
435 # ending 2-space formatting
437 def removeFile(self
, filename
):
439 if (self
.files
.has_key(filename
)):
441 for child
in self
.files
[filename
]['children']:
442 self
.removeFile(child
)
444 del self
.files
[filename
]['children']
446 parent
= self
.files
[filename
]['parent']
448 self
.files
[parent
]['children'].pop(self
.files
[parent
]['children'].index(filename
))
450 del self
.files
[filename
]
454 def getVisibleMenus(self
):
458 for file, contents
in self
.files
.iteritems():
459 for name
, menu
in contents
['menu_instances'].iteritems():
465 def hideAllMenus(self
):
467 for file, contents
in self
.files
.iteritems():
468 for name
, menu
in contents
['menu_instances'].iteritems():
473 def showMenu(self
, menu_name
):
475 for file, contents
in self
.files
.iteritems():
476 for name
, menu
in contents
['menu_instances'].iteritems():
477 if contents
['menu_instances'].has_key(menu_name
):
478 contents
['menu_instances'][menu_name
].show()
482 def hideMenu(self
, menu_name
):
484 for file, contents
in self
.files
:
485 for name
, menu
in contents
['menu_instances'].iteritems():
486 if contents
['menu_instances'].has_key(menu_name
):
487 contents
['menu_instances'][menu_name
].hide()
491 def setMenu(self
, menu_name
):
494 self
.showMenu(menu_name
)
498 def addObject(self
, objectname
):
500 for file in self
.files
.keys():
501 if self
.files
[file]['object_defs'].has_key(objectname
):
502 self
.files
[file]['object_instances'][objectname
] = GameObject(
503 self
.files
[file]['object_defs'][objectname
])
507 def removeObject(self
, objectname
):
509 for file in self
.files
.keys():
510 if self
.files
[file]['object_defs'].has_key(objectname
):
511 del self
.files
[file]['object_instances'][objectname
]
515 def addListItem(self
, menuname
, item
, data
, dvalue
):
517 print "Engine.addListItem(): Not implemented yet."
521 def getImage(self
, filename
):
523 the_buf
= pygame
.image
.load(self
.getStringIOFile(filename
))
527 def getStringIOFile(self
, filename
):
529 for zip_file
in self
.zipfiles
:
530 for file in zip_file
.namelist():
532 if (filename
== file):
534 the_string_io
= StringIO
.StringIO()
535 print >>the_string_io
, zip_file
.read(file)
536 the_string_io
.seek(0)
541 def getStringData(self
, filename
):
542 for zip_file
in self
.zipfiles
:
543 for file in zip_file
.namelist():
545 if (filename
== file):
546 return zip_file
.read(file)
551 def __init__(self
, menu_def
):
553 self
.menu_def
= menu_def
556 self
.gui_system
= the_engine
.gui_system
558 for name
, element
in menu_def
['elements'].iteritems():
560 multiplier_x
= float(the_engine
.config
['window_size'][0]) / 100
561 multiplier_y
= float(the_engine
.config
['window_size'][1]) / 100.00
563 dx
= float(element
['x']) * multiplier_x
564 dy
= float(element
['y']) * multiplier_y
566 dwidth
= float(element
['width']) * multiplier_x
567 dheight
= float(element
['height']) * multiplier_y
569 params
= {'x': dx
, 'y': dy
, 'width': dwidth
, 'height': dheight
}
571 if element
['type'] == 'image':
572 print "Widget.__init__(): 'image' widget type not implemented yet."
574 if element
['type'] == 'label':
575 params
['text'] = element
['text']
576 self
.widgets
[name
] = self
.gui_system
.makeWidget('label', params
)
578 if element
['type'] == 'button':
579 params
['text'] = element
['text']
580 self
.widgets
[name
] = self
.gui_system
.makeWidget('button', params
)
581 self
.widgets
[name
].connect('BUTTON_CLICKED', self
.clicked
, {'name': name
})
583 if element
['type'] == 'listbox':
584 print "Widget.__init__(): 'listbox' widget type not implemented yet."
586 if element
['type'] == 'textbox':
587 params
['type'] == element
['text']
588 self
.widgets
[name
] = self
.gui_system
.makeWidget('textbox', params
)
589 self
.widgets
[name
].connect('KEYDOWN', self
.key_pressed
, {'name': name
})
597 for widget
in self
.widgets
:
598 self
.widgets
[widget
].show()
606 for widget
in self
.widgets
:
607 self
.widgets
[widget
].hide()
613 def clicked(self
, params
, more_params
):
615 #if self.menu_def['elements'].has_key()
622 def __init__(self
, dmold
):
628 if self
.mold
['script'] != '':
632 the_file
= the_engine
.getStringData(self
.mold
['script'])
637 self
.my_functions
= the_functions
641 def event(self
, event
, data
):
643 if self
.my_functions
.has_key(event
):
645 self
.my_functions
[event
](data
)
649 class Multicast(DatagramProtocol
):
651 def startProtocol(self
):
652 self
.transport
.joinGroup(MULTICAST
)
654 def datagramReceived(self
, datagram
, address
):
662 self
.items_lock
= Lock()
666 return len(self
.items
)
670 self
.items_lock
.acquire()
671 the_item
= self
.items
.pop(0)
672 self
.items_lock
.release()
676 def addItem(self
, new_item
):
678 self
.items_lock
.acquire()
679 self
.items
.append(new_item
)
680 self
.items_lock
.release()
684 class EventReceiver(QueueLock
):
687 return self
.getItem()
688 def addEvent(self
, event
):
693 class CommandLine(QueueLock
):
695 def getCommand(self
):
696 return self
.getItem()
697 def addCommand(self
, command
):
698 self
.addItem(command
)
701 class Client(DatagramProtocol
):
703 def datagramReceived(self
, data
, (host
, port
)):
705 if data
[:len(YOUTHERE
)] == YOUTHERE
:
707 # print "Client.datagramReceived(): Recieved YOUTHERE, responding with IMHERE"
708 self
.transport
.write(IMHERE
, (host
, port
))
710 if data
[:len(SERVEROFFER
)] == SERVEROFFER
:
712 split_strings
= data
.split()
714 self
.servers
[split_strings
[2]] = (host
, int(split_strings
[1]))
716 event
= [SERVEROFFER
, {'server_name': split_strings
[2],
717 'server_address': self
.servers
[split_strings
[2]]}]
718 the_engine
.events
.addEvent(event
)
720 print "Client.datagramReceived(): Received SERVEROFFER"
722 if data
[:len(YOUREIN
)] == YOUREIN
:
724 if (host
, port
) == self
.requested_server
:
725 self
.current_server
= (host
, port
)
726 self
.requested_server
= ()
729 data
= {'server': self
.current_server
}
732 the_engine
.events
.addEvent(event
)
734 print "Client.datagramReceived(): Received YOUREIN, joined server"
738 if data
[:len(LIST
)] == LIST
:
740 print "Client.datagramReceived(): Received LIST"
742 split_strings
= data
.split()
746 for string
in split_strings
:
748 self
.members
.append(string
)
751 data
= {'names': self
.members
, 'server_address': (host
, port
)}
754 the_engine
.events
.addEvent(event
)
758 if data
[:len(SOMEONEJOINED
)] == SOMEONEJOINED
:
760 if (host
, port
) == self
.current_server
:
762 print "Client.datagramReceived(): Received SOMEONEJOINED"
766 for member
in self
.members
:
767 if member
== data
[len(SOMEONEJOINED
) + 1:]:
770 if left_member
== '':
771 self
.members
.append(data
[len(SOMEONEJOINED
) + 1:])
773 event
= [SOMEONEJOINED
]
774 data
= {'name': data
[len(SOMEONEJOINED
) + 1:]}
778 the_engine
.events
.addEvent(event
)
782 if data
[:len(SOMEONELEFT
)] == SOMEONELEFT
:
784 if (host
, port
) == self
.current_server
:
786 name
= data
[len(SOMEONELEFT
) + 1:]
788 if name
in self
.members
:
789 print "Client.datagramReceived(): Received SOMEONELEFT"
791 self
.members
.remove(name
)
793 event
= [SOMEONELEFT
]
794 data
= {'name': name
}
798 the_engine
.events
.addEvent(event
)
801 print "Client.datagramReceived(): Received SOMEONELEFT, but", name
, "not present in roster"
805 if data
[:len(YOUROUT
)] == YOUROUT
:
807 if (host
, port
) == self
.current_server
:
809 print "Client.datagramReceived(): Recieved YOUROUT"
811 self
.current_server
= ()
817 the_engine
.events
.addEvent(event
)
821 if data
[:len(LETTER
)] == LETTER
:
823 if (host
, port
) == self
.current_server
:
824 print "Client.datagramReceived(): Received LETTER"
826 split_strings
= data
.split(':')
828 message
= data
[data
.find(':', len(LETTER
) + 1) + 1:]
829 message_origin
= split_strings
[1]
832 data
= {'message': message
, 'origin': message_origin
}
835 the_engine
.events
.addEvent(event
)
839 if data
[:len(IMHERE
)] == IMHERE
:
841 if (host
, port
) == self
.current_server
:
842 print "Client.datagramReceived(): Received IMHERE from server"
844 self
.server_request
= 0
848 def init(self
, params
):
852 self
.current_server
= ()
853 self
.requested_server
= ()
860 def serverRequest(self
):
862 if self
.current_server
!= ():
864 if self
.server_request
> SERVER_TIMEOUT
:
865 the_engine
.events
.addEvent([SERVER_GONE
, {}])
866 self
.current_server
= ()
869 self
.server_request
+= 1
870 self
.transport
.write(YOUTHERE
, self
.current_server
)
874 def executeCommand(self
, command
, data
):
876 reactor
.callFromThread(self
.executeThreadedCommand
, command
, data
)
880 def executeThreadedCommand(self
, command
, data
):
881 if command
== SERVERKILL
:
883 if self
.current_server
!= ():
885 message
= ''.join([SERVERKILL
, ' '])
887 if data
.has_key('password'):
888 message
= ''.join([message
, data
['password']])
890 self
.transport
.write(message
, self
.current_server
)
892 if command
== SERVERREQUEST
:
894 message
= ''.join([SERVERREQUEST
, ' ', str(self
.params
['message_port'])])
896 the_multicast
.transport
.write(message
, (MULTICAST
, self
.params
['broadcast_port']))
897 # self.transport.write(message, ('255.255.255.255', self.params['broadcast_port']))
899 if command
== GETLIST
:
903 if data
.has_key('server'):
905 if self
.servers
.has_key(data
['server']):
906 self
.transport
.write(message
, self
.servers
[data
['server']])
910 if self
.current_server
!= ():
911 self
.transport
.write(message
, self
.current_server
)
915 if self
.current_server
!= ():
919 self
.transport
.write(message
, self
.current_server
)
921 self
.current_server
= ()
923 if command
== LETTER
:
925 if self
.current_server
!= ():
927 message
= ''.join([LETTER
, ':'])
929 for dest
in data
['destinations']:
930 if dest
in self
.members
:
931 message
= ''.join([message
, ' ' , dest
])
933 message
= ''.join([message
, ':', data
['message']])
935 self
.transport
.write(message
, self
.current_server
)
937 if command
== WANTIN
:
939 if data
.has_key('server'):
940 if self
.servers
.has_key(data
['server']):
942 self
.transport
.write(''.join([WANTIN
, ' ', self
.params
['name']]),
943 self
.servers
[data
['server']])
944 self
.current_server
= ()
945 self
.requested_server
= self
.servers
[data
['server']]
951 if len(sys
.argv
) > 1:
954 print "main(): No config specified, using", CONFIG
957 configuration
= parse_config(config
)
959 if (configuration
.has_key('error') and configuration
['error']):
960 print "main(): Error in parsing config."
962 the_event_receiver
= EventReceiver()
965 client_params
= {'broadcast_port':configuration
['broadcast_port'],
966 'broadcast_bind':configuration
['broadcast_bind'],
967 'message_port':configuration
['message_port'],
968 'name':configuration
['name'],
969 'echo_time': configuration
['echo_time']}
974 the_engine
= Engine(configuration
)
976 the_client
= Client()
977 the_client_thread
= threading
.Thread(target
=run_net
)
979 the_client
.server_request
= 0
981 the_client
.init(client_params
)
983 the_client_thread
.start()
986 the_engine
.killGame()
990 the_client_thread
.join()
999 the_multicast
= Multicast()
1000 config
= client_params
1002 reactor
.listenMulticast(config
['broadcast_bind'], the_multicast
)
1003 reactor
.listenUDP(config
['message_port'], the_client
)
1005 echo_request
= task
.LoopingCall(the_client
.serverRequest
)
1007 if client_params
['echo_time'] != None:
1008 echo_request
.start(client_params
['echo_time'])
1010 print "run_net(): No ECHO_TIME specified, using default of", ECHO_TIME
1011 echo_request
.start(ECHO_TIME
)
1013 reactor
.run(installSignalHandlers
=0)
1017 def parse_config(filename
):
1018 results
= {'error': 1}
1020 if (exists(filename
)):
1021 dom
= parse(filename
)
1023 print "parse_config():", filename
, "doesn't exist."
1026 results
= {'window_title': None,
1031 'message_port': None,
1032 'broadcast_port': None,
1033 'broadcast_bind': None,
1035 'background_color': None,
1036 'window_size': None,
1042 if (dom
.childNodes
[0].nodeName
== 'config'):
1043 for node
in dom
.childNodes
[0].childNodes
:
1045 if (node
.nodeName
== 'window_title'):
1046 results
['window_title'] = node
.childNodes
[0].nodeValue
1048 if (node
.nodeName
== 'log'):
1049 results
['log'] = node
.childNodes
[0].nodeValue
1051 if (node
.nodeName
== 'name'):
1052 results
['name'] = node
.childNodes
[0].nodeValue
1054 if (node
.nodeName
== 'font'):
1055 results
['font'] = node
.childNodes
[0].nodeValue
1057 if (node
.nodeName
== 'init'):
1058 results
['init'] = node
.childNodes
[0].nodeValue
1060 if (node
.nodeName
== 'message_port'):
1061 results
['message_port'] = int(node
.childNodes
[0].nodeValue
)
1063 if (node
.nodeName
== 'broadcast_port'):
1064 results
['broadcast_port'] = int(node
.childNodes
[0].nodeValue
)
1066 if (node
.nodeName
== 'broadcast_bind'):
1067 results
['broadcast_bind'] = int(node
.childNodes
[0].nodeValue
)
1069 if (node
.nodeName
== 'fullscreen'):
1070 results
['fullscreen'] = int(node
.childNodes
[0].nodeValue
)
1072 if (node
.nodeName
== 'background_color'):
1074 string_parts
= node
.childNodes
[0].nodeValue
.split()
1075 results
['background_color'] = [float(string_parts
[0]), float(string_parts
[1])]
1076 results
['background_color'].append(float(string_parts
[2]))
1077 results
['background_color'].append(float(string_parts
[3]))
1079 if (node
.nodeName
== 'window_size'):
1081 string_parts
= node
.childNodes
[0].nodeValue
.split()
1082 results
['window_size'] = ((int(string_parts
[0]), int(string_parts
[1])))
1084 if (node
.nodeName
== 'gravity'):
1086 string_parts
= node
.childNodes
[0].nodeValue
.split()
1087 results
['gravity'] = [float(string_parts
[0]), float(string_parts
[1])]
1088 results
['gravity'].append(float(string_parts
[2]))
1090 if (node
.nodeName
== 'step_size'):
1091 results
['step_size'] = float(node
.childNodes
[0].nodeValue
)
1093 if (node
.nodeName
== 'pack_dir'):
1094 results
['pack_dir'] = node
.childNodes
[0].nodeValue
1096 if (node
.nodeName
== 'echo_time'):
1097 results
['echo_time'] = int(node
.childNodes
[0].nodeValue
)
1099 results
['error'] = 0
1103 if __name__
== '__main__':