comparison orpg/gametree/nodehandlers/dnd3e.py @ 135:dcf4fbe09b70 beta

Traipse Beta 'OpenRPG' {091010-00} Traipse is a distribution of OpenRPG that is designed to be easy to setup and go. Traipse also makes it easy for developers to work on code without fear of sacrifice. 'Ornery-Orc' continues the trend of 'Grumpy' and adds fixes to the code. 'Ornery-Orc's main goal is to offer more advanced features and enhance the productivity of the user. Update Summary (Beta) Added Bookmarks Fix to Remote Admin Commands Minor fix to text based Server Fix to Pretty Print, from Core Fix to Splitter Nodes not being created Fix to massive amounts of images loading, from Core Added 'boot' command to remote admin Added confirmation window for sent nodes Minor changes to allow for portability to an OpenSUSE linux OS Miniatures Layer pop up box allows users to turn off Mini labels, from FlexiRPG Zoom Mouse plugin added Images added to Plugin UI Switching to Element Tree Map efficiency, from FlexiRPG Added Status Bar to Update Manager default_manifest.xml renamed to default_upmana.xml Cleaner clode for saved repositories New TrueDebug Class in orpg_log (See documentation for usage) Mercurial's hgweb folder is ported to upmana **Pretty important update that can help remove thousands of dead children from your gametree. **Children, <forms />, <group_atts />, <horizontal />, <cols />, <rows />, <height />, etc... are all tags now. Check your gametree and look for dead children!! **New Gamtree Recusion method, mapping, and context sensitivity. !!Alpha - Watch out for infinite loops!!
author sirebral
date Tue, 10 Nov 2009 14:11:28 -0600
parents 2fa8bd6785a5
children 06f10429eedc
comparison
equal deleted inserted replaced
101:394ebb3b6a0f 135:dcf4fbe09b70
149 from core import * 149 from core import *
150 from containers import * 150 from containers import *
151 from string import * #a 1.6003 151 from string import * #a 1.6003
152 from inspect import * #a 1.9001 152 from inspect import * #a 1.9001
153 from orpg.dirpath import dir_struct 153 from orpg.dirpath import dir_struct
154 from orpg.tools.orpg_log import debug
155 from xml.etree.ElementTree import parse
154 156
155 dnd3e_EXPORT = wx.NewId() 157 dnd3e_EXPORT = wx.NewId()
156 ############Global Stuff############## 158 ############Global Stuff##############
157 159
158 HP_CUR = wx.NewId() 160 HP_CUR = wx.NewId()
207 #d 1.6000 not used. 209 #d 1.6000 not used.
208 #def getCharacterProp(forgetIt): 210 #def getCharacterProp(forgetIt):
209 # return None 211 # return None
210 212
211 #a 1.6 convinience function added safeGetAttr 213 #a 1.6 convinience function added safeGetAttr
212 def safeGetAttr(node,lable,defRetV=None): 214 def safeGetAttr(node, label, defRetV=None):
213 cna=node.attributes 215 cna=node.attrib
214 for i2 in range(len(cna)): 216 for key in cna:
215 if cna.item(i2).name == lable: 217 if key == label:
216 return cna.item(i2).value 218 return cna[key]
217 #retV=node.getAttribute(lable) # getAttribute does not distingish between 219 #retV=node.get(lable) # get does not distingish between
218 # the attribute not being present vs it having a value of "" 220 # the attribute not being present vs it having a value of ""
219 # This is bad for this routine, thus not used. 221 # This is bad for this routine, thus not used.
220 return defRetV 222 return defRetV
221 #a 1.6... safeGetAttr end. 223 #a 1.6... safeGetAttr end.
222 224
228 """ 230 """
229 def __init__(self,xml_dom,tree_node): 231 def __init__(self,xml_dom,tree_node):
230 node_handler.__init__(self,xml_dom,tree_node) 232 node_handler.__init__(self,xml_dom,tree_node)
231 self.Version = "v1.901" #a 1.6000 general documentation, usage. 233 self.Version = "v1.901" #a 1.6000 general documentation, usage.
232 234
233 print "dnd3echar_handler - version:",self.Version #m 1.6000 235 print "dnd3echar_handler - version:", self.Version #m 1.6000
234 236
235 self.hparent = None #a 1.5002 allow ability to run up tree, this is the 237 self.hparent = None #a 1.5002 allow ability to run up tree, this is the
236 #a 1.5002 top of the handler tree, this is used to flag where to stop 238 #a 1.5002 top of the handler tree, this is used to flag where to stop
237 #a 1.5002 on the way up. Changing this will break getRoot(self) 239 #a 1.5002 on the way up. Changing this will break getRoot(self)
238 240
250 # "self.child_handlers:",self.child_handlers # a (debug) 1.5002 252 # "self.child_handlers:",self.child_handlers # a (debug) 1.5002
251 self.myeditor = None 253 self.myeditor = None
252 254
253 255
254 def new_child_handler(self,tag,text,handler_class,icon='gear'): 256 def new_child_handler(self,tag,text,handler_class,icon='gear'):
255 node_list = self.master_dom.getElementsByTagName(tag) 257 node_list = self.xml.findall(tag)
256 tree = self.tree 258 tree = self.tree
257 i = self.tree.icons[icon] 259 i = self.tree.icons[icon]
258 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i) 260 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i)
259 handler = handler_class(node_list[0],new_tree_node,self) 261 handler = handler_class(node_list[0],new_tree_node,self)
260 tree.SetPyData(new_tree_node,handler) 262 tree.SetPyData(new_tree_node,handler)
351 return 353 return
352 354
353 def on_html(self,evt): 355 def on_html(self,evt):
354 html_str = self.tohtml() 356 html_str = self.tohtml()
355 wnd = http_html_window(self.frame.note,-1) 357 wnd = http_html_window(self.frame.note,-1)
356 wnd.title = self.master_dom.getAttribute('name') 358 wnd.title = self.xml.get('name')
357 self.frame.add_panel(wnd) 359 self.frame.add_panel(wnd)
358 wnd.SetPage(html_str) 360 wnd.SetPage(html_str)
359 361
360 def get_design_panel(self,parent): 362 def get_design_panel(self,parent):
361 pass 363 pass
382 384
383 class howto_panel(wx.Panel): 385 class howto_panel(wx.Panel):
384 def __init__(self, parent, handler): 386 def __init__(self, parent, handler):
385 wx.Panel.__init__(self, parent, -1) 387 wx.Panel.__init__(self, parent, -1)
386 388
387 pname = handler.master_dom.setAttribute("name", 'How To') 389 pname = handler.xml.set("name", 'How To')
388 self.sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, 'How To'), wx.VERTICAL) 390 self.sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, 'How To'), wx.VERTICAL)
389 self.master_dom = handler.master_dom 391 self.xml = handler.xml
390 n_list = self.master_dom._get_childNodes() 392 n_list = self.xml.getchildren()
391 for n in n_list: 393 for n in n_list:
392 t_node = component.get('xml').safe_get_text_node(n) 394 self.sizer.Add(wx.StaticText(self, -1, n.text), 1, wx.EXPAND)
393 self.sizer.Add(wx.StaticText(self, -1, t_node._get_nodeValue()), 1, wx.EXPAND)
394 self.SetSizer(self.sizer) 395 self.SetSizer(self.sizer)
395 self.SetAutoLayout(True) 396 self.SetAutoLayout(True)
396 self.Fit() 397 self.Fit()
397 398
398 class dnd3egeneral(dnd3e_char_child): 399 class dnd3egeneral(dnd3e_char_child):
410 wnd = outline_panel(parent,self,gen_grid,"General Information") 411 wnd = outline_panel(parent,self,gen_grid,"General Information")
411 wnd.title = "General Info" 412 wnd.title = "General Info"
412 return wnd 413 return wnd
413 414
414 def tohtml(self): 415 def tohtml(self):
415 n_list = self.master_dom._get_childNodes() 416 n_list = self.xml.getchildren()
416 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>" 417 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>"
417 for n in n_list: 418 for n in n_list:
418 t_node = component.get('xml').safe_get_text_node(n) 419 debug(n)
419 html_str += "<B>"+n._get_tagName().capitalize() +":</B> " 420 html_str += "<B>"+n.tag.capitalize() +":</B> "
420 html_str += t_node._get_nodeValue() + ", " 421 html_str += n.text + ", "
421 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 422 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
422 return html_str 423 return html_str
423 424
424 def on_name_change(self,name): 425 def on_name_change(self,name):
425 self.char_hander.rename(name) 426 self.char_hander.rename(name)
426 #o 1.5002 self.char_hander = parent in this case. 427 #o 1.5002 self.char_hander = parent in this case.
427 self.charName = name #a 1.5002 make getting name easier. 428 self.charName = name #a 1.5002 make getting name easier.
428 429
429 430
430 def get_char_name( self ): 431 def get_char_name( self ):
431 node = self.master_dom.getElementsByTagName( 'name' )[0] 432 node = self.xml.findall( 'name' )[0]
432 t_node = component.get('xml').safe_get_text_node( node ) 433 return node.text
433 return t_node._get_nodeValue()
434 434
435 class gen_grid(wx.grid.Grid): 435 class gen_grid(wx.grid.Grid):
436 """grid for gen info""" 436 """grid for gen info"""
437 def __init__(self, parent, handler): 437 def __init__(self, parent, handler):
438 pname = handler.master_dom.setAttribute("name", 'General') 438 pname = handler.xml.set("name", 'General')
439 self.hparent = handler #a 1.5002 allow ability to run up tree, needed 439 self.hparent = handler #a 1.5002 allow ability to run up tree, needed
440 # a 1.5002 parent is functional parent, not invoking parent. 440 # a 1.5002 parent is functional parent, not invoking parent.
441 441
442 442
443 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 443 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
444 #self.Bind(wx.EVT_SIZE, self.on_size) 444 #self.Bind(wx.EVT_SIZE, self.on_size)
445 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 445 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
446 self.handler = handler 446 self.handler = handler
447 n_list = handler.master_dom._get_childNodes() 447 n_list = handler.xml.getchildren()
448 self.CreateGrid(len(n_list),2) 448 self.CreateGrid(len(n_list),2)
449 self.SetRowLabelSize(0) 449 self.SetRowLabelSize(0)
450 self.SetColLabelSize(0) 450 self.SetColLabelSize(0)
451 self.n_list = n_list 451 self.n_list = n_list
452 i = 0 452 i = 0
455 455
456 def on_cell_change(self,evt): 456 def on_cell_change(self,evt):
457 row = evt.GetRow() 457 row = evt.GetRow()
458 col = evt.GetCol() 458 col = evt.GetCol()
459 value = self.GetCellValue(row,col) 459 value = self.GetCellValue(row,col)
460 t_node = self.n_list[row]._get_firstChild() 460 self.n_list[row].text = value
461 t_node._set_nodeValue(value)
462 if row==0: 461 if row==0:
463 self.handler.on_name_change(value) 462 self.handler.on_name_change(value)
464 #self.AutoSizeColumn(1) 463 #self.AutoSizeColumn(1)
465 464
466 def refresh_row(self,rowi): 465 def refresh_row(self,rowi):
467 t_node = component.get('xml').safe_get_text_node(self.n_list[rowi]) 466 self.SetCellValue(rowi,0,self.n_list[rowi].tag)
468
469 self.SetCellValue(rowi,0,self.n_list[rowi]._get_tagName())
470 self.SetReadOnly(rowi,0) 467 self.SetReadOnly(rowi,0)
471 self.SetCellValue(rowi,1,t_node._get_nodeValue()) 468 self.SetCellValue(rowi,1,self.n_list[rowi].text)
472 self.AutoSizeColumn(1) 469 self.AutoSizeColumn(1)
473 470
474 class dnd3einventory(dnd3e_char_child): 471 class dnd3einventory(dnd3e_char_child):
475 """ Node Handler for general information. This handler will be 472 """ Node Handler for general information. This handler will be
476 created by dnd3echar_handler. 473 created by dnd3echar_handler.
485 wnd = inventory_pane(parent, self) #outline_panel(parent,self,inventory_grid,"Inventory") 482 wnd = inventory_pane(parent, self) #outline_panel(parent,self,inventory_grid,"Inventory")
486 wnd.title = "General Info" 483 wnd.title = "General Info"
487 return wnd 484 return wnd
488 485
489 def tohtml(self): 486 def tohtml(self):
490 n_list = self.master_dom._get_childNodes() 487 n_list = self.xml.getchildren()
491 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>" 488 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>General Information</th></tr><tr><td>"
492 for n in n_list: 489 for n in n_list:
493 t_node = component.get('xml').safe_get_text_node(n) 490 debug((n))
494 html_str += "<B>"+n._get_tagName().capitalize() +":</B> " 491 html_str += "<B>"+n.tag.capitalize() +":</B> "
495 html_str += t_node._get_nodeValue() + "<br>" 492 html_str += n.text + "<br>"
496 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 493 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
497 return html_str 494 return html_str
498 495
499 class inventory_pane(wx.Panel): 496 class inventory_pane(wx.Panel):
500 def __init__(self, parent, handler): 497 def __init__(self, parent, handler):
501 wx.Panel.__init__(self, parent, wx.ID_ANY) 498 wx.Panel.__init__(self, parent, wx.ID_ANY)
502 499 self.n_list = handler.xml.getchildren()
503 self.n_list = handler.master_dom._get_childNodes()
504 self.autosize = False 500 self.autosize = False
505
506 self.sizer = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, "Inventroy"), wx.VERTICAL) 501 self.sizer = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, "Inventroy"), wx.VERTICAL)
507
508 self.lang = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_BESTWRAP, name="Languages") 502 self.lang = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_BESTWRAP, name="Languages")
509 self.gear = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_BESTWRAP, name="Gear") 503 self.gear = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_BESTWRAP, name="Gear")
510 self.magic = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_BESTWRAP, name="Magic") 504 self.magic = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_BESTWRAP, name="Magic")
511 self.grid = wx.grid.Grid(self, wx.ID_ANY, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 505 self.grid = wx.grid.Grid(self, wx.ID_ANY, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
512
513 self.grid.CreateGrid(len(self.n_list)-3,2) 506 self.grid.CreateGrid(len(self.n_list)-3,2)
514 self.grid.SetRowLabelSize(0) 507 self.grid.SetRowLabelSize(0)
515 self.grid.SetColLabelSize(0) 508 self.grid.SetColLabelSize(0)
516
517 for i in xrange(len(self.n_list)): 509 for i in xrange(len(self.n_list)):
518 self.refresh_row(i) 510 self.refresh_row(i)
519
520 sizer1 = wx.BoxSizer(wx.HORIZONTAL) 511 sizer1 = wx.BoxSizer(wx.HORIZONTAL)
521 sizer1.Add(self.grid, 1, wx.EXPAND) 512 sizer1.Add(self.grid, 1, wx.EXPAND)
522 sizer1.Add(self.lang, 1, wx.EXPAND) 513 sizer1.Add(self.lang, 1, wx.EXPAND)
523
524 self.sizer.Add(sizer1, 0, wx.EXPAND) 514 self.sizer.Add(sizer1, 0, wx.EXPAND)
525
526 sizer2 = wx.BoxSizer(wx.HORIZONTAL) 515 sizer2 = wx.BoxSizer(wx.HORIZONTAL)
527 sizer2.Add(self.gear, 1, wx.EXPAND) 516 sizer2.Add(self.gear, 1, wx.EXPAND)
528 sizer2.Add(self.magic, 1, wx.EXPAND) 517 sizer2.Add(self.magic, 1, wx.EXPAND)
529
530 self.sizer.Add(sizer2, 1, wx.EXPAND) 518 self.sizer.Add(sizer2, 1, wx.EXPAND)
531
532 self.SetSizer(self.sizer) 519 self.SetSizer(self.sizer)
533 self.SetAutoLayout(True) 520 self.SetAutoLayout(True)
534 self.Fit() 521 self.Fit()
535
536 self.Bind(wx.EVT_TEXT, self.onTextNodeChange, self.lang) 522 self.Bind(wx.EVT_TEXT, self.onTextNodeChange, self.lang)
537 self.Bind(wx.EVT_TEXT, self.onTextNodeChange, self.gear) 523 self.Bind(wx.EVT_TEXT, self.onTextNodeChange, self.gear)
538 self.Bind(wx.EVT_TEXT, self.onTextNodeChange, self.magic) 524 self.Bind(wx.EVT_TEXT, self.onTextNodeChange, self.magic)
539 self.Bind(wx.grid.EVT_GRID_EDITOR_HIDDEN, self.on_cell_change, self.grid) 525 self.Bind(wx.grid.EVT_GRID_EDITOR_HIDDEN, self.on_cell_change, self.grid)
540 526
541
542 def fillTextNode(self, name, value): 527 def fillTextNode(self, name, value):
543 if name == 'Languages': 528 if name == 'Languages': self.lang.SetValue(value)
544 self.lang.SetValue(value) 529 elif name == 'Gear': self.gear.SetValue(value)
545 elif name == 'Gear': 530 elif name == 'Magic': self.magic.SetValue(value)
546 self.gear.SetValue(value)
547 elif name == 'Magic':
548 self.magic.SetValue(value)
549 531
550 def onTextNodeChange(self, event): 532 def onTextNodeChange(self, event):
551 id = event.GetId() 533 id = event.GetId()
552
553 if id == self.gear.GetId(): 534 if id == self.gear.GetId():
554 nodeName = 'Gear' 535 nodeName = 'Gear'
555 value = self.gear.GetValue() 536 value = self.gear.GetValue()
556 elif id == self.magic.GetId(): 537 elif id == self.magic.GetId():
557 nodeName = 'Magic' 538 nodeName = 'Magic'
558 value = self.magic.GetValue() 539 value = self.magic.GetValue()
559 elif id == self.lang.GetId(): 540 elif id == self.lang.GetId():
560 nodeName = 'Languages' 541 nodeName = 'Languages'
561 value = self.lang.GetValue() 542 value = self.lang.GetValue()
562
563 for node in self.n_list: 543 for node in self.n_list:
564 if node._get_tagName() == nodeName: 544 if node.tag == nodeName:
565 t_node = component.get('xml').safe_get_text_node(node) 545 debug(node)
566 t_node._set_nodeValue(value) 546 node.text = value
567 547
568 def saveMoney(self, row, col): 548 def saveMoney(self, row, col):
569 value = self.grid.GetCellValue(row, col) 549 value = self.grid.GetCellValue(row, col)
570 t_node = component.get('xml').safe_get_text_node(self.n_list[row]) 550 debug(self.n_list[row])
571 t_node._set_nodeValue(value) 551 self.n_list[row].text = value
572 552
573 def on_cell_change(self, evt): 553 def on_cell_change(self, evt):
574 row = evt.GetRow() 554 row = evt.GetRow()
575 col = evt.GetCol() 555 col = evt.GetCol()
576 self.grid.AutoSizeColumn(col) 556 self.grid.AutoSizeColumn(col)
577 wx.CallAfter(self.saveMoney, row, col) 557 wx.CallAfter(self.saveMoney, row, col)
578 558
579
580
581 def refresh_row(self, row): 559 def refresh_row(self, row):
582 t_node = component.get('xml').safe_get_text_node(self.n_list[row]) 560 tagname = self.n_list[row].tag
583 tagname = self.n_list[row]._get_tagName() 561 value = self.n_list[row].text
584 value = t_node._get_nodeValue() 562 if tagname == 'Gear': self.fillTextNode(tagname, value)
585 if tagname == 'Gear': 563 elif tagname == 'Magic': self.fillTextNode(tagname, value)
586 self.fillTextNode(tagname, value) 564 elif tagname == 'Languages': self.fillTextNode(tagname, value)
587 elif tagname == 'Magic':
588 self.fillTextNode(tagname, value)
589 elif tagname == 'Languages':
590 self.fillTextNode(tagname, value)
591 else: 565 else:
592 self.grid.SetCellValue(row, 0, tagname) 566 self.grid.SetCellValue(row, 0, tagname)
593 self.grid.SetReadOnly(row, 0) 567 self.grid.SetReadOnly(row, 0)
594 self.grid.SetCellValue(row, 1, value) 568 self.grid.SetCellValue(row, 1, value)
595 self.grid.AutoSize() 569 self.grid.AutoSize()
610 self.new_child_handler('saves','Saves',dnd3esaves,'skull') 584 self.new_child_handler('saves','Saves',dnd3esaves,'skull')
611 self.myeditor = None 585 self.myeditor = None
612 586
613 587
614 def new_child_handler(self,tag,text,handler_class,icon='gear'): 588 def new_child_handler(self,tag,text,handler_class,icon='gear'):
615 node_list = self.master_dom.getElementsByTagName(tag) 589 node_list = self.xml.findall(tag)
616 tree = self.tree 590 tree = self.tree
617 i = self.tree.icons[icon] 591 i = self.tree.icons[icon]
618 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i) 592 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i)
619 handler = handler_class(node_list[0],new_tree_node,self) 593 handler = handler_class(node_list[0],new_tree_node,self)
620 tree.SetPyData(new_tree_node,handler) 594 tree.SetPyData(new_tree_node,handler)
648 return 622 return
649 623
650 def on_html(self,evt): 624 def on_html(self,evt):
651 html_str = self.tohtml() 625 html_str = self.tohtml()
652 wnd = http_html_window(self.frame.note,-1) 626 wnd = http_html_window(self.frame.note,-1)
653 wnd.title = self.master_dom.getAttribute('name') 627 wnd.title = self.xml.get('name')
654 self.frame.add_panel(wnd) 628 self.frame.add_panel(wnd)
655 wnd.SetPage(html_str) 629 wnd.SetPage(html_str)
656 630
657 def get_design_panel(self,parent): 631 def get_design_panel(self,parent):
658 pass 632 pass
670 def __init__(self,xml_dom,tree_node,parent): 644 def __init__(self,xml_dom,tree_node,parent):
671 class_char_child.__init__(self,xml_dom,tree_node,parent) 645 class_char_child.__init__(self,xml_dom,tree_node,parent)
672 self.hparent = parent #a 1.5002 allow ability to run up tree. 646 self.hparent = parent #a 1.5002 allow ability to run up tree.
673 self.root = getRoot(self) #a 1.5002 get top of our local function tree. 647 self.root = getRoot(self) #a 1.5002 get top of our local function tree.
674 self.root.abilities = self #a 1.5002 let other classes find me. 648 self.root.abilities = self #a 1.5002 let other classes find me.
675
676 self.abilities = {} 649 self.abilities = {}
677 node_list = self.master_dom.getElementsByTagName('stat') 650 node_list = self.xml.findall('stat')
678 tree = self.tree 651 tree = self.tree
679 icons = tree.icons 652 icons = tree.icons
680
681 for n in node_list: 653 for n in node_list:
682 name = n.getAttribute('abbr') 654 name = n.get('abbr')
683 self.abilities[name] = n 655 self.abilities[name] = n
684 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['gear'], icons['gear'] ) 656 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['gear'], icons['gear'] )
685 tree.SetPyData( new_tree_node, self ) 657 tree.SetPyData( new_tree_node, self )
686 #print "dnd3eability - init self.abilities",self.abilities #a (debug) 1.5002 658 #print "dnd3eability - init self.abilities",self.abilities #a (debug) 1.5002
687 659
700 chat = self.chat 672 chat = self.chat
701 txt = '%s check: [1d20%s%s]' % ( name, mod1, mod ) 673 txt = '%s check: [1d20%s%s]' % ( name, mod1, mod )
702 chat.ParsePost( txt, True, True ) 674 chat.ParsePost( txt, True, True )
703 675
704 def get_mod(self,abbr): 676 def get_mod(self,abbr):
705 score = int(self.abilities[abbr].getAttribute('base')) 677 score = int(self.abilities[abbr].get('base'))
706 mod = (score - 10) / 2 678 mod = (score - 10) / 2
707 mod = int(mod) 679 mod = int(mod)
708 return mod 680 return mod
709 681
710 def set_score(self,abbr,score): 682 def set_score(self,abbr,score):
711 if score >= 0: 683 if score >= 0:
712 self.abilities[abbr].setAttribute("base",str(score)) 684 self.abilities[abbr].set("base",str(score))
713 685
714 def get_design_panel(self,parent): 686 def get_design_panel(self,parent):
715 wnd = outline_panel(parent,self,abil_grid,"Abilities") 687 wnd = outline_panel(parent,self,abil_grid,"Abilities")
716 wnd.title = "Abilities (edit)" 688 wnd.title = "Abilities (edit)"
717 return wnd 689 return wnd
718 690
719 def tohtml(self): 691 def tohtml(self):
720 html_str = """<table border='1' width=100%><tr BGCOLOR=#E9E9E9 ><th width='50%'>Ability</th> 692 html_str = """<table border='1' width=100%><tr BGCOLOR=#E9E9E9 ><th width='50%'>Ability</th>
721 <th>Base</th><th>Modifier</th></tr>""" 693 <th>Base</th><th>Modifier</th></tr>"""
722 node_list = self.master_dom.getElementsByTagName('stat') 694 node_list = self.xml.findall('stat')
723 for n in node_list: 695 for n in node_list:
724 name = n.getAttribute('name') 696 name = n.get('name')
725 abbr = n.getAttribute('abbr') 697 abbr = n.get('abbr')
726 base = n.getAttribute('base') 698 base = n.get('base')
727 mod = str(self.get_mod(abbr)) 699 mod = str(self.get_mod(abbr))
728 if int(mod) >= 0: #m 1.6013 added "int(" and ")" 700 if int(mod) >= 0: #m 1.6013 added "int(" and ")"
729 mod1 = "+" 701 mod1 = "+"
730 else: 702 else:
731 mod1 = "" 703 mod1 = ""
735 return html_str 707 return html_str
736 708
737 class abil_grid(wx.grid.Grid): 709 class abil_grid(wx.grid.Grid):
738 """grid for abilities""" 710 """grid for abilities"""
739 def __init__(self, parent, handler): 711 def __init__(self, parent, handler):
740 pname = handler.master_dom.setAttribute("name", 'Stats') 712 pname = handler.xml.set("name", 'Stats')
741 self.hparent = handler #a 1.5002 allow ability to run up tree. 713 self.hparent = handler #a 1.5002 allow ability to run up tree.
742 self.root = getRoot(self) 714 self.root = getRoot(self)
743 #a 1.5002 in this case, we need the functional parent, not the invoking parent. 715 #a 1.5002 in this case, we need the functional parent, not the invoking parent.
744 716
745 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 717 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
746 self.Bind(wx.EVT_SIZE, self.on_size) 718 self.Bind(wx.EVT_SIZE, self.on_size)
747 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 719 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
748 self.handler = handler 720 self.handler = handler
749 stats = handler.master_dom.getElementsByTagName('stat') 721 stats = handler.xml.findall('stat')
750 self.CreateGrid(len(stats),3) 722 self.CreateGrid(len(stats),3)
751 self.SetRowLabelSize(0) 723 self.SetRowLabelSize(0)
752 col_names = ['Ability','Score','Modifier'] 724 col_names = ['Ability','Score','Modifier']
753 for i in range(len(col_names)): 725 for i in range(len(col_names)):
754 self.SetColLabelValue(i,col_names[i]) 726 self.SetColLabelValue(i,col_names[i])
763 col = evt.GetCol() 735 col = evt.GetCol()
764 value = self.GetCellValue(row,col) 736 value = self.GetCellValue(row,col)
765 #print value 737 #print value
766 try: 738 try:
767 int(value) 739 int(value)
768 self.stats[row].setAttribute('base',value) 740 self.stats[row].set('base',value)
769 self.refresh_row(row) 741 self.refresh_row(row)
770 except: 742 except:
771 self.SetCellValue(row,col,"0") 743 self.SetCellValue(row,col,"0")
772 if self.char_wnd: 744 if self.char_wnd:
773 self.char_wnd.refresh_data() 745 self.char_wnd.refresh_data()
774 746
775 #mark5
776
777 def refresh_row(self,rowi): 747 def refresh_row(self,rowi):
778 s = self.stats[rowi] 748 s = self.stats[rowi]
779 749
780 name = s.getAttribute('name') 750 name = s.get('name')
781 abbr = s.getAttribute('abbr') 751 abbr = s.get('abbr')
782 self.SetCellValue(rowi,0,name) 752 self.SetCellValue(rowi,0,name)
783 self.SetReadOnly(rowi,0) 753 self.SetReadOnly(rowi,0)
784 self.SetCellValue(rowi,1,s.getAttribute('base')) 754 self.SetCellValue(rowi,1,s.get('base'))
785 self.SetCellValue(rowi,2,str(self.handler.get_mod(abbr))) 755 self.SetCellValue(rowi,2,str(self.handler.get_mod(abbr)))
786 self.SetReadOnly(rowi,2) 756 self.SetReadOnly(rowi,2)
787 #if self.root.saves.saveGrid: #a 1.6018 d 1.9002 whole if clause 757 #if self.root.saves.saveGrid: #a 1.6018 d 1.9002 whole if clause
788 #print getmembers(self.root.saves.saveGrid) 758 #print getmembers(self.root.saves.saveGrid)
789 #self.root.saves.saveGrid.refresh_data() #a 1.6018 759 #self.root.saves.saveGrid.refresh_data() #a 1.6018
821 wnd.title = "Classes" 791 wnd.title = "Classes"
822 return wnd 792 return wnd
823 793
824 def tohtml(self): 794 def tohtml(self):
825 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Classes</th></tr><tr><td>" 795 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Classes</th></tr><tr><td>"
826 n_list = self.master_dom._get_childNodes() 796 n_list = self.xml.getchildren()
827 for n in n_list: 797 for n in n_list:
828 html_str += n.getAttribute('name') + " ("+n.getAttribute('level')+"), " 798 html_str += n.get('name') + " ("+n.get('level')+"), "
829 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 799 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
830 return html_str 800 return html_str
831 801
832 def get_char_lvl( self, attr ): 802 def get_char_lvl( self, attr ):
833 node_list = self.master_dom.getElementsByTagName('class') 803 node_list = self.xml.findall('class')
834 # print "eclasses - get_char_lvl node_list",node_list 804 # print "eclasses - get_char_lvl node_list",node_list
835 tot = 0 #a 1.5009 actually, slipping in a quick enhancement ;-) 805 tot = 0 #a 1.5009 actually, slipping in a quick enhancement ;-)
836 for n in node_list: 806 for n in node_list:
837 lvl = n.getAttribute('level') #o 1.5009 not sure of the value of this 807 lvl = n.get('level') #o 1.5009 not sure of the value of this
838 tot += int(lvl) #a 1.5009 808 tot += int(lvl) #a 1.5009
839 type = n.getAttribute('name') #o 1.5009 not sure of the value of this 809 type = n.get('name') #o 1.5009 not sure of the value of this
840 #print type,lvl #a (debug) 1.5009 810 #print type,lvl #a (debug) 1.5009
841 if attr == "level": 811 if attr == "level":
842 return lvl #o 1.5009 this returns the level of someone's first class. ??? 812 return lvl #o 1.5009 this returns the level of someone's first class. ???
843 elif attr == "class": 813 elif attr == "class":
844 return type #o 1.5009 this returns one of the char's classes. ??? 814 return type #o 1.5009 this returns one of the char's classes. ???
845 if attr == "lvl": #a 1.5009 this has value, adding this. 815 if attr == "lvl": #a 1.5009 this has value, adding this.
846 return tot #a 1.5009 return character's "overall" level. 816 return tot #a 1.5009 return character's "overall" level.
847 817
848 def get_class_lvl( self, classN ): #a 1.5009 need to be able to get monk lvl 818 def get_class_lvl( self, classN ): #a 1.5009 need to be able to get monk lvl
849 #a 1.5009 this function is new. 819 #a 1.5009 this function is new.
850 node_list = self.master_dom.getElementsByTagName('class') 820 node_list = self.xml.findall('class')
851 #print "eclasses - get_class_lvl node_list",node_list 821 #print "eclasses - get_class_lvl node_list",node_list
852 for n in node_list: 822 for n in node_list:
853 lvl = n.getAttribute('level') 823 lvl = n.get('level')
854 type = n.getAttribute('name') 824 type = n.get('name')
855 if classN == type: 825 if classN == type:
856 return lvl 826 return lvl
857 827
858 class class_panel(wx.Panel): 828 class class_panel(wx.Panel):
859 def __init__(self, parent, handler): 829 def __init__(self, parent, handler):
860 pname = handler.master_dom.setAttribute("name", 'Class') 830 pname = handler.xml.set("name", 'Class')
861 831
862 wx.Panel.__init__(self, parent, -1) 832 wx.Panel.__init__(self, parent, -1)
863 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 833 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
864 sizer = wx.BoxSizer(wx.VERTICAL) 834 sizer = wx.BoxSizer(wx.VERTICAL)
865 sizer.Add(self.grid, 1, wx.EXPAND) 835 sizer.Add(self.grid, 1, wx.EXPAND)
878 #self.Bind(wx.EVT_SIZE, self.on_size) 848 #self.Bind(wx.EVT_SIZE, self.on_size)
879 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 849 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
880 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 850 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
881 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 851 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
882 852
883 n_list = handler.master_dom._get_childNodes() 853 n_list = handler.xml.getchildren()
884 self.n_list = n_list 854 self.n_list = n_list
885 self.master_dom = handler.master_dom 855 self.xml = handler.xml
886 self.grid.CreateGrid(len(n_list),2,1) 856 self.grid.CreateGrid(len(n_list),2,1)
887 self.grid.SetRowLabelSize(0) 857 self.grid.SetRowLabelSize(0)
888 self.grid.SetColLabelValue(0,"Class") 858 self.grid.SetColLabelValue(0,"Class")
889 self.grid.SetColLabelValue(1,"Level") 859 self.grid.SetColLabelValue(1,"Level")
890 for i in range(len(n_list)): 860 for i in range(len(n_list)):
895 row = evt.GetRow() 865 row = evt.GetRow()
896 col = evt.GetCol() 866 col = evt.GetCol()
897 value = self.grid.GetCellValue(row,col) 867 value = self.grid.GetCellValue(row,col)
898 try: 868 try:
899 int(value) 869 int(value)
900 self.n_list[row].setAttribute('level',value) 870 self.n_list[row].set('level',value)
901 except: 871 except: self.grid.SetCellValue(row,col,"1")
902 self.grid.SetCellValue(row,col,"1")
903
904 872
905 def refresh_row(self,i): 873 def refresh_row(self,i):
906 n = self.n_list[i] 874 n = self.n_list[i]
907 875 name = n.get('name')
908 name = n.getAttribute('name') 876 level = n.get('level')
909 level = n.getAttribute('level')
910 self.grid.SetCellValue(i,0,name) 877 self.grid.SetCellValue(i,0,name)
911 self.grid.SetReadOnly(i,0) 878 self.grid.SetReadOnly(i,0)
912 self.grid.SetCellValue(i,1,level) 879 self.grid.SetCellValue(i,1,level)
913 #self.grid.SetReadOnly(i,1) 880 #self.grid.SetReadOnly(i,1)
914 881
915 def on_remove(self,evt): 882 def on_remove(self,evt):
916 rows = self.grid.GetNumberRows() 883 rows = self.grid.GetNumberRows()
917 for i in range(rows): 884 for i in range(rows):
918 if self.grid.IsInSelection(i,0): 885 if self.grid.IsInSelection(i,0):
919 self.grid.DeleteRows(i) 886 self.grid.DeleteRows(i)
920 self.master_dom.removeChild(self.n_list[i]) 887 self.xml.remove(self.n_list[i])
921 888
922 def on_add(self,evt): 889 def on_add(self,evt):
923 if not self.temp_dom: 890 if not self.temp_dom:
924 tmp = open(dir_struct["dnd3e"]+"dnd3eclasses.xml","r") 891 tree = parse(dir_struct["dnd3e"]+"dnd3eclasses.xml")
925 xml_dom = parseXml_with_dlg(self,tmp.read()) 892 xml_dom = tree.getroot()
926 xml_dom = xml_dom._get_firstChild()
927 tmp.close()
928 self.temp_dom = xml_dom 893 self.temp_dom = xml_dom
929 f_list = self.temp_dom.getElementsByTagName('class') 894 f_list = self.temp_dom.findall('class')
930 opts = [] 895 opts = []
931 for f in f_list: 896 for f in f_list:
932 opts.append(f.getAttribute('name')) 897 opts.append(f.get('name'))
933 dlg = wx.SingleChoiceDialog(self,'Choose Class','Classes',opts) 898 dlg = wx.SingleChoiceDialog(self,'Choose Class','Classes',opts)
934 if dlg.ShowModal() == wx.ID_OK: 899 if dlg.ShowModal() == wx.ID_OK:
935 i = dlg.GetSelection() 900 i = dlg.GetSelection()
936 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 901 new_node = self.xml.append(f_list[i])
937 self.grid.AppendRows(1) 902 self.grid.AppendRows(1)
938 self.refresh_row(self.grid.GetNumberRows()-1) 903 self.refresh_row(self.grid.GetNumberRows()-1)
939 dlg.Destroy() 904 dlg.Destroy()
940
941 905
942 def on_size(self,event): 906 def on_size(self,event):
943 s = self.GetClientSizeTuple() 907 s = self.GetClientSizeTuple()
944 self.grid.SetDimensions(0,0,s[0],s[1]-25) 908 self.grid.SetDimensions(0,0,s[0],s[1]-25)
945 self.sizer.SetDimension(0,s[1]-25,s[0],25) 909 self.sizer.SetDimension(0,s[1]-25,s[0],25)
963 tree = self.tree 927 tree = self.tree
964 icons = self.tree.icons 928 icons = self.tree.icons
965 929
966 self.root = getRoot(self) #a 1.5002 930 self.root = getRoot(self) #a 1.5002
967 self.root.saves = self #a 1.6009 931 self.root.saves = self #a 1.6009
968 node_list = self.master_dom.getElementsByTagName('save') 932 node_list = self.xml.findall('save')
969 self.saves={} 933 self.saves={}
970 for n in node_list: 934 for n in node_list:
971 name = n.getAttribute('name') 935 name = n.get('name')
972 self.saves[name] = n 936 self.saves[name] = n
973 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear']) 937 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear'])
974 tree.SetPyData(new_tree_node,self) 938 tree.SetPyData(new_tree_node,self)
975 939
976 #a 1.9002 this whole method 940 #a 1.9002 this whole method
984 else: 948 else:
985 self.saveGridFrame.remove(x) 949 self.saveGridFrame.remove(x)
986 950
987 def get_mod(self,name): 951 def get_mod(self,name):
988 save = self.saves[name] 952 save = self.saves[name]
989 stat = save.getAttribute('stat') 953 stat = save.get('stat')
990 #print "dnd3esaves, get_mod: self,root",self,self.root #a (debug) 1.5002 954 #print "dnd3esaves, get_mod: self,root",self,self.root #a (debug) 1.5002
991 #print "and abilities",self.root.abilities #a (debug) 1.5002 955 #print "and abilities",self.root.abilities #a (debug) 1.5002
992 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002 956 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002
993 base = int(save.getAttribute('base')) 957 base = int(save.get('base'))
994 miscmod = int(save.getAttribute('miscmod')) 958 miscmod = int(save.get('miscmod'))
995 magmod = int(save.getAttribute('magmod')) 959 magmod = int(save.get('magmod'))
996 total = stat_mod + base + miscmod + magmod 960 total = stat_mod + base + miscmod + magmod
997 return total 961 return total
998 962
999 def on_rclick(self,evt): 963 def on_rclick(self,evt):
1000
1001 item = self.tree.GetSelection() 964 item = self.tree.GetSelection()
1002 name = self.tree.GetItemText(item) 965 name = self.tree.GetItemText(item)
1003 if item == self.mytree_node: 966 if item == self.mytree_node:
1004 pass #a 1.5003 syntatic place holder 967 pass #a 1.5003 syntatic place holder
1005 return #a 1.5003 968 return #a 1.5003
1008 #wnd = save_grid(self.frame.note,self) 971 #wnd = save_grid(self.frame.note,self)
1009 #wnd.title = "Saves" 972 #wnd.title = "Saves"
1010 #self.frame.add_panel(wnd) 973 #self.frame.add_panel(wnd)
1011 else: 974 else:
1012 mod = self.get_mod(name) 975 mod = self.get_mod(name)
1013 if mod >= 0: 976 if mod >= 0: mod1 = "+"
1014 mod1 = "+" 977 else: mod1 = ""
1015 else:
1016 mod1 = ""
1017 chat = self.chat 978 chat = self.chat
1018 txt = '%s save: [1d20%s%s]' % (name, mod1, mod) 979 txt = '%s save: [1d20%s%s]' % (name, mod1, mod)
1019 chat.ParsePost( txt, True, True ) 980 chat.ParsePost( txt, True, True )
1020 981
1021 def get_design_panel(self,parent): 982 def get_design_panel(self,parent):
1026 def tohtml(self): 987 def tohtml(self):
1027 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 > 988 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 >
1028 <th width='30%'>Save</th> 989 <th width='30%'>Save</th>
1029 <th>Key</th><th>Base</th><th>Abil</th><th>Magic</th> 990 <th>Key</th><th>Base</th><th>Abil</th><th>Magic</th>
1030 <th>Misc</th><th>Total</th></tr>""" 991 <th>Misc</th><th>Total</th></tr>"""
1031 node_list = self.master_dom.getElementsByTagName('save') 992 node_list = self.xml.findall('save')
1032 for n in node_list: 993 for n in node_list:
1033 name = n.getAttribute('name') 994 name = n.get('name')
1034 stat = n.getAttribute('stat') 995 stat = n.get('stat')
1035 base = n.getAttribute('base') 996 base = n.get('base')
1036 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+stat+"</td><td>"+base+"</td>" 997 html_str = html_str + "<tr ALIGN='center'><td>"+name+"</td><td>"+stat+"</td><td>"+base+"</td>"
1037 #stat_mod = str(dnd_globals["stats"][stat]) #d 1.5002 998 #stat_mod = str(dnd_globals["stats"][stat]) #d 1.5002
1038 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002 999 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002
1039 1000
1040 mag = n.getAttribute('magmod') 1001 mag = n.get('magmod')
1041 misc = n.getAttribute('miscmod') 1002 misc = n.get('miscmod')
1042 mod = str(self.get_mod(name)) 1003 mod = str(self.get_mod(name))
1043 if mod >= 0: 1004 if mod >= 0:
1044 mod1 = "+" 1005 mod1 = "+"
1045 else: 1006 else:
1046 mod1 = "" 1007 mod1 = ""
1052 1013
1053 #mark6 1014 #mark6
1054 class save_grid(wx.grid.Grid): 1015 class save_grid(wx.grid.Grid):
1055 """grid for saves""" 1016 """grid for saves"""
1056 def __init__(self, parent, handler): 1017 def __init__(self, parent, handler):
1057 pname = handler.master_dom.setAttribute("name", 'Saves') 1018 pname = handler.xml.set("name", 'Saves')
1058 self.hparent = handler #a 1.5002 allow ability to run up tree. 1019 self.hparent = handler #a 1.5002 allow ability to run up tree.
1059 #a 1.5002 in this case, we need the functional parent, not the invoking parent. 1020 #a 1.5002 in this case, we need the functional parent, not the invoking parent.
1060 self.root = getRoot(self) 1021 self.root = getRoot(self)
1061
1062 #self.hparent.saveGrid = self #a 1.6018 d 1.9001 1022 #self.hparent.saveGrid = self #a 1.6018 d 1.9001
1063
1064
1065 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1023 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1066 self.Bind(wx.EVT_SIZE, self.on_size) 1024 self.Bind(wx.EVT_SIZE, self.on_size)
1067 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1025 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1068 self.handler = handler 1026 self.handler = handler
1069 saves = handler.master_dom.getElementsByTagName('save') 1027 saves = handler.xml.findall('save')
1070 self.CreateGrid(len(saves),7) 1028 self.CreateGrid(len(saves),7)
1071 self.SetRowLabelSize(0) 1029 self.SetRowLabelSize(0)
1072 col_names = ['Save','Key','base','Abil','Magic','Misc','Total'] 1030 col_names = ['Save','Key','base','Abil','Magic','Misc','Total']
1073 for i in range(len(col_names)): 1031 for i in range(len(col_names)):
1074 self.SetColLabelValue(i,col_names[i]) 1032 self.SetColLabelValue(i,col_names[i])
1075 self.saves = saves 1033 self.saves = saves
1076 i = 0 1034 i = 0
1077 for i in range(len(saves)): 1035 for i in range(len(saves)): self.refresh_row(i)
1078 self.refresh_row(i)
1079
1080
1081 #a 1.9002 remainder of code in this method. 1036 #a 1.9002 remainder of code in this method.
1082 climber = parent 1037 climber = parent
1083 nameNode = climber.GetClassName() 1038 nameNode = climber.GetClassName()
1084 while nameNode != 'wxFrame': 1039 while nameNode != 'wxFrame':
1085 climber = climber.parent 1040 climber = climber.parent
1086 nameNode = climber.GetClassName() 1041 nameNode = climber.GetClassName()
1087 masterFrame=climber 1042 masterFrame=climber
1088 masterFrame.refresh_data=self.refresh_data 1043 masterFrame.refresh_data=self.refresh_data
1089 #print getmembers(masterFrame) 1044 #print getmembers(masterFrame)
1090
1091 handler.saveGridFrame.append(masterFrame) 1045 handler.saveGridFrame.append(masterFrame)
1092 1046
1093 def on_cell_change(self,evt): 1047 def on_cell_change(self,evt):
1094 row = evt.GetRow() 1048 row = evt.GetRow()
1095 col = evt.GetCol() 1049 col = evt.GetCol()
1096 value = self.GetCellValue(row,col) 1050 value = self.GetCellValue(row,col)
1097 try: 1051 try:
1098 int(value) 1052 int(value)
1099 if col == 2: 1053 if col == 2:
1100 self.saves[row].setAttribute('base',value) 1054 self.saves[row].set('base',value)
1101 elif col ==4: 1055 elif col ==4:
1102 self.saves[row].setAttribute('magmod',value) 1056 self.saves[row].set('magmod',value)
1103 elif col ==5: # 1.5001 1057 elif col ==5: # 1.5001
1104 self.saves[row].setAttribute('miscmod',value) 1058 self.saves[row].set('miscmod',value)
1105 self.refresh_row(row) 1059 self.refresh_row(row)
1106 except: 1060 except:
1107 self.SetCellValue(row,col,"0") 1061 self.SetCellValue(row,col,"0")
1108 1062
1109 def refresh_row(self,rowi): 1063 def refresh_row(self,rowi):
1110 s = self.saves[rowi] 1064 s = self.saves[rowi]
1111 1065 name = s.get('name')
1112 name = s.getAttribute('name')
1113 self.SetCellValue(rowi,0,name) 1066 self.SetCellValue(rowi,0,name)
1114 self.SetReadOnly(rowi,0) 1067 self.SetReadOnly(rowi,0)
1115 stat = s.getAttribute('stat') 1068 stat = s.get('stat')
1116 self.SetCellValue(rowi,1,stat) 1069 self.SetCellValue(rowi,1,stat)
1117 self.SetReadOnly(rowi,1) 1070 self.SetReadOnly(rowi,1)
1118 self.SetCellValue(rowi,2,s.getAttribute('base')) 1071 self.SetCellValue(rowi,2,s.get('base'))
1119 self.SetCellValue(rowi,3,str(self.root.abilities.get_mod(stat))) 1072 self.SetCellValue(rowi,3,str(self.root.abilities.get_mod(stat)))
1120 self.SetReadOnly(rowi,3) 1073 self.SetReadOnly(rowi,3)
1121 self.SetCellValue(rowi,4,s.getAttribute('magmod')) 1074 self.SetCellValue(rowi,4,s.get('magmod'))
1122 self.SetCellValue(rowi,5,s.getAttribute('miscmod')) 1075 self.SetCellValue(rowi,5,s.get('miscmod'))
1123 mod = str(self.handler.get_mod(name)) 1076 mod = str(self.handler.get_mod(name))
1124 self.SetCellValue(rowi,6,mod) 1077 self.SetCellValue(rowi,6,mod)
1125 self.SetReadOnly(rowi,6) 1078 self.SetReadOnly(rowi,6)
1126 1079
1127 def on_size(self,evt): 1080 def on_size(self,evt):
1157 self.new_child_handler('skills','Skills',dnd3eskill,'book') 1110 self.new_child_handler('skills','Skills',dnd3eskill,'book')
1158 self.new_child_handler('feats','Feats',dnd3efeats,'book') 1111 self.new_child_handler('feats','Feats',dnd3efeats,'book')
1159 #wxMenuItem(self.tree.std_menu, dnd3e_EXPORT, "Export...", "Export") 1112 #wxMenuItem(self.tree.std_menu, dnd3e_EXPORT, "Export...", "Export")
1160 self.myeditor = None 1113 self.myeditor = None
1161 1114
1162
1163 def new_child_handler(self,tag,text,handler_class,icon='gear'): 1115 def new_child_handler(self,tag,text,handler_class,icon='gear'):
1164 node_list = self.master_dom.getElementsByTagName(tag) 1116 node_list = self.xml.findall(tag)
1165 tree = self.tree 1117 tree = self.tree
1166 i = self.tree.icons[icon] 1118 i = self.tree.icons[icon]
1167 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i) 1119 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i)
1168 handler = handler_class(node_list[0],new_tree_node,self) 1120 handler = handler_class(node_list[0],new_tree_node,self)
1169 tree.SetPyData(new_tree_node,handler) 1121 tree.SetPyData(new_tree_node,handler)
1170 self.child_handlers[tag] = handler 1122 self.child_handlers[tag] = handler
1171 1123
1172 def get_design_panel(self,parent): 1124 def get_design_panel(self,parent):
1173 return tabbed_panel(parent,self,1) 1125 return tabbed_panel(parent,self,1)
1174
1175 1126
1176 def get_use_panel(self,parent): 1127 def get_use_panel(self,parent):
1177 return tabbed_panel(parent,self,2) 1128 return tabbed_panel(parent,self,2)
1178 1129
1179 class skills_char_child(node_handler): 1130 class skills_char_child(node_handler):
1185 self.char_hander = parent 1136 self.char_hander = parent
1186 self.drag = False 1137 self.drag = False
1187 self.frame = component.get('frame') 1138 self.frame = component.get('frame')
1188 self.myeditor = None 1139 self.myeditor = None
1189 1140
1190
1191
1192 def on_drop(self,evt): 1141 def on_drop(self,evt):
1193 pass 1142 pass
1194 1143
1195 def on_rclick(self,evt): 1144 def on_rclick(self,evt):
1196 pass 1145 pass
1199 return 1148 return
1200 1149
1201 def on_html(self,evt): 1150 def on_html(self,evt):
1202 html_str = self.tohtml() 1151 html_str = self.tohtml()
1203 wnd = http_html_window(self.frame.note,-1) 1152 wnd = http_html_window(self.frame.note,-1)
1204 wnd.title = self.master_dom.getAttribute('name') 1153 wnd.title = self.xml.get('name')
1205 self.frame.add_panel(wnd) 1154 self.frame.add_panel(wnd)
1206 wnd.SetPage(html_str) 1155 wnd.SetPage(html_str)
1207 1156
1208 def get_design_panel(self,parent): 1157 def get_design_panel(self,parent):
1209 pass 1158 pass
1225 self.root.skills = self #a 1.6009 1174 self.root.skills = self #a 1.6009
1226 1175
1227 skills_char_child.__init__(self,xml_dom,tree_node,parent) 1176 skills_char_child.__init__(self,xml_dom,tree_node,parent)
1228 tree = self.tree 1177 tree = self.tree
1229 icons = self.tree.icons 1178 icons = self.tree.icons
1230 node_list = self.master_dom.getElementsByTagName('skill') 1179 node_list = self.xml.findall('skill')
1231 1180
1232 self.skills={} 1181 self.skills={}
1233 #Adding code to not display skills you can not use -mgt 1182 #Adding code to not display skills you can not use -mgt
1234 for n in node_list: 1183 for n in node_list:
1235 name = n.getAttribute('name') 1184 name = n.get('name')
1236 self.skills[name] = n 1185 self.skills[name] = n
1237 skill_check = self.skills[name] 1186 skill_check = self.skills[name]
1238 ranks = int(skill_check.getAttribute('rank')) 1187 ranks = int(skill_check.get('rank'))
1239 trained = int(skill_check.getAttribute('untrained')) 1188 trained = int(skill_check.get('untrained'))
1240 1189
1241 if ranks > 0 or trained == 1: 1190 if ranks > 0 or trained == 1:
1242 new_tree_node = tree.AppendItem(self.mytree_node,name, 1191 new_tree_node = tree.AppendItem(self.mytree_node,name,
1243 icons['gear'],icons['gear']) 1192 icons['gear'],icons['gear'])
1244 else: 1193 else: continue
1245 continue
1246
1247 tree.SetPyData(new_tree_node,self) 1194 tree.SetPyData(new_tree_node,self)
1248 1195
1249 1196
1250
1251 def refresh_skills(self): 1197 def refresh_skills(self):
1252 #Adding this so when you update the grid the tree will reflect 1198 #Adding this so when you update the grid the tree will reflect
1253 #The change. -mgt 1199 #The change. -mgt
1254 tree = self.tree 1200 tree = self.tree
1255 icons = self.tree.icons 1201 icons = self.tree.icons
1256 tree.CollapseAndReset(self.mytree_node) 1202 tree.CollapseAndReset(self.mytree_node)
1257 node_list = self.master_dom.getElementsByTagName('skill') 1203 node_list = self.xml.findall('skill')
1258 1204
1259 self.skills={} 1205 self.skills={}
1260 for n in node_list: 1206 for n in node_list:
1261 name = n.getAttribute('name') 1207 name = n.get('name')
1262 self.skills[name] = n 1208 self.skills[name] = n
1263 skill_check = self.skills[name] 1209 skill_check = self.skills[name]
1264 ranks = int(skill_check.getAttribute('rank')) 1210 ranks = int(skill_check.get('rank'))
1265 trained = int(skill_check.getAttribute('untrained')) 1211 trained = int(skill_check.get('untrained'))
1266 1212
1267 if ranks > 0 or trained == 1: 1213 if ranks > 0 or trained == 1:
1268 new_tree_node = tree.AppendItem(self.mytree_node,name, 1214 new_tree_node = tree.AppendItem(self.mytree_node,name,
1269 icons['gear'],icons['gear']) 1215 icons['gear'],icons['gear'])
1270 else: 1216 else: continue
1271 continue
1272
1273 tree.SetPyData(new_tree_node,self) 1217 tree.SetPyData(new_tree_node,self)
1274 1218
1275 def get_mod(self,name): 1219 def get_mod(self,name):
1276 skill = self.skills[name] 1220 skill = self.skills[name]
1277 stat = skill.getAttribute('stat') 1221 stat = skill.get('stat')
1278 #stat_mod = int(dnd_globals["stats"][stat]) #d 1.5002 1222 #stat_mod = int(dnd_globals["stats"][stat]) #d 1.5002
1279 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002 1223 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002
1280 rank = int(skill.getAttribute('rank')) 1224 rank = int(skill.get('rank'))
1281 misc = int(skill.getAttribute('misc')) 1225 misc = int(skill.get('misc'))
1282 total = stat_mod + rank + misc 1226 total = stat_mod + rank + misc
1283 return total 1227 return total
1284 1228
1285 def on_rclick(self,evt): 1229 def on_rclick(self,evt):
1286 item = self.tree.GetSelection() 1230 item = self.tree.GetSelection()
1292 return 1236 return
1293 # following line fails, 1237 # following line fails,
1294 #dnd3e_char_child.on_ldclick(self,evt) #d 1.6014 1238 #dnd3e_char_child.on_ldclick(self,evt) #d 1.6014
1295 # it's what it used to try to do. 1239 # it's what it used to try to do.
1296 ac = self.root.ac.get_check_pen() #a 1.5002 for 1.5004 verify fix. 1240 ac = self.root.ac.get_check_pen() #a 1.5002 for 1.5004 verify fix.
1297
1298 skill = self.skills[name] 1241 skill = self.skills[name]
1299 1242 untr = skill.get('untrained') #a 1.6004
1300 untr = skill.getAttribute('untrained') #a 1.6004 1243 rank = skill.get('rank') #a 1.6004
1301 rank = skill.getAttribute('rank') #a 1.6004
1302 if eval('%s == 0' % (untr)): #a 1.6004 1244 if eval('%s == 0' % (untr)): #a 1.6004
1303 if eval('%s == 0' % (rank)): #a 1.6004 1245 if eval('%s == 0' % (rank)): #a 1.6004
1304 res = 'You fumble around, accomplishing nothing' #a 1.6004 1246 res = 'You fumble around, accomplishing nothing' #a 1.6004
1305 txt = '%s Skill Check: %s' % (name, res) #a 1.6004 1247 txt = '%s Skill Check: %s' % (name, res) #a 1.6004
1306 chat = self.chat #a 1.6004 1248 chat = self.chat #a 1.6004
1308 return #a 1.6004 1250 return #a 1.6004
1309 1251
1310 armor = '' 1252 armor = ''
1311 acCp = '' 1253 acCp = ''
1312 if ac < 0: #acCp >= 1 #m 1.5004 this is stored as negatives. 1254 if ac < 0: #acCp >= 1 #m 1.5004 this is stored as negatives.
1313 armorCheck = int(skill.getAttribute('armorcheck')) 1255 armorCheck = int(skill.get('armorcheck'))
1314 #print "ac,armorCheck",ac,armorCheck 1256 #print "ac,armorCheck",ac,armorCheck
1315 if armorCheck == 1: 1257 if armorCheck == 1:
1316 acCp=ac 1258 acCp=ac
1317 armor = '(includes Armor Penalty of %s)' % (acCp) 1259 armor = '(includes Armor Penalty of %s)' % (acCp)
1318 if item == self.mytree_node: 1260 if item == self.mytree_node:
1320 #wnd = skill_grid(self.frame.note,self) 1262 #wnd = skill_grid(self.frame.note,self)
1321 #wnd.title = "Skills" 1263 #wnd.title = "Skills"
1322 #self.frame.add_panel(wnd) 1264 #self.frame.add_panel(wnd)
1323 else: 1265 else:
1324 mod = self.get_mod(name) 1266 mod = self.get_mod(name)
1325 if mod >= 0: 1267 if mod >= 0: mod1 = "+"
1326 mod1 = "+" 1268 else: mod1 = ""
1327 else:
1328 mod1 = ""
1329 chat = self.chat 1269 chat = self.chat
1330 txt = '%s Skill Check: [1d20%s%s%s] %s' % ( 1270 txt = '%s Skill Check: [1d20%s%s%s] %s' % (
1331 name, mod1, mod, acCp, armor) 1271 name, mod1, mod, acCp, armor)
1332 chat.ParsePost(txt,True,True) 1272 chat.ParsePost(txt,True,True)
1333 1273
1338 1278
1339 def tohtml(self): 1279 def tohtml(self):
1340 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 > 1280 html_str = """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 >
1341 <th width='30%'>Skill</th><th>Key</th> 1281 <th width='30%'>Skill</th><th>Key</th>
1342 <th>Rank</th><th>Abil</th><th>Misc</th><th>Total</th></tr>""" 1282 <th>Rank</th><th>Abil</th><th>Misc</th><th>Total</th></tr>"""
1343 node_list = self.master_dom.getElementsByTagName('skill') 1283 node_list = self.xml.findall('skill')
1344 1284
1345 for n in node_list: 1285 for n in node_list:
1346 name = n.getAttribute('name') 1286 name = n.get('name')
1347 stat = n.getAttribute('stat') 1287 stat = n.get('stat')
1348 rank = n.getAttribute('rank') 1288 rank = n.get('rank')
1349 untr = n.getAttribute('untrained') #a 1.6004 1289 untr = n.get('untrained') #a 1.6004
1350 #Filter unsuable skills out of pretty print -mgt 1290 #Filter unsuable skills out of pretty print -mgt
1351 if eval('%s > 0' % (rank)) or eval('%s == 1' % (untr)): 1291 if eval('%s > 0' % (rank)) or eval('%s == 1' % (untr)):
1352 if eval('%s >=1' % (rank)): 1292 if eval('%s >=1' % (rank)):
1353 html_str += "<tr ALIGN='center' bgcolor='#CCCCFF'><td>" #a 1.6004 1293 html_str += "<tr ALIGN='center' bgcolor='#CCCCFF'><td>" #a 1.6004
1354 #html_str += "<tr ALIGN='center' bgcolor='green'><td>" #d 1.6004 1294 #html_str += "<tr ALIGN='center' bgcolor='green'><td>" #d 1.6004
1361 html_str += stat+"</td><td>"+rank+"</td>" 1301 html_str += stat+"</td><td>"+rank+"</td>"
1362 else: 1302 else:
1363 continue 1303 continue
1364 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002 1304 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002
1365 #stat_mod = str(dnd_globals["stats"][stat]) #d 1.5002 1305 #stat_mod = str(dnd_globals["stats"][stat]) #d 1.5002
1366 misc = n.getAttribute('misc') 1306 misc = n.get('misc')
1367 mod = str(self.get_mod(name)) 1307 mod = str(self.get_mod(name))
1368 if mod >= 0: 1308 if mod >= 0:
1369 mod1 = "+" 1309 mod1 = "+"
1370 else: 1310 else:
1371 mod1 = "" 1311 mod1 = ""
1378 class skill_grid(wx.grid.Grid): 1318 class skill_grid(wx.grid.Grid):
1379 """ panel for skills """ 1319 """ panel for skills """
1380 def __init__(self, parent, handler): 1320 def __init__(self, parent, handler):
1381 self.hparent = handler #a 1.5002 need function parent, not invoker 1321 self.hparent = handler #a 1.5002 need function parent, not invoker
1382 self.root = getRoot(self) #a 1.5002 1322 self.root = getRoot(self) #a 1.5002
1383 pname = handler.master_dom.setAttribute("name", 'Skills') 1323 pname = handler.xml.set("name", 'Skills')
1384 1324
1385 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1325 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1386 self.Bind(wx.EVT_SIZE, self.on_size) 1326 self.Bind(wx.EVT_SIZE, self.on_size)
1387 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 1327 self.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
1388 self.handler = handler 1328 self.handler = handler
1389 skills = handler.master_dom.getElementsByTagName('skill') 1329 skills = handler.xml.findall('skill')
1390 #xelf.stats = dnd_globals["stats"] #d 1.5002 1330 #xelf.stats = dnd_globals["stats"] #d 1.5002
1391 1331
1392 self.CreateGrid(len(skills),6) 1332 self.CreateGrid(len(skills),6)
1393 self.SetRowLabelSize(0) 1333 self.SetRowLabelSize(0)
1394 col_names = ['Skill','Key','Rank','Abil','Misc','Total'] 1334 col_names = ['Skill','Key','Rank','Abil','Misc','Total']
1405 value = self.GetCellValue(row,col) 1345 value = self.GetCellValue(row,col)
1406 #print value 1346 #print value
1407 try: 1347 try:
1408 int(value) 1348 int(value)
1409 if col == 2: 1349 if col == 2:
1410 self.skills[row].setAttribute('rank',value) 1350 self.skills[row].set('rank',value)
1411 elif col ==4: 1351 elif col ==4:
1412 self.skills[row].setAttribute('misc',value) 1352 self.skills[row].set('misc',value)
1413 self.refresh_row(row) 1353 self.refresh_row(row)
1414 except: 1354 except:
1415 self.SetCellValue(row,col,"0") 1355 self.SetCellValue(row,col,"0")
1416 1356
1417 #call refresh_skills 1357 #call refresh_skills
1418 self.handler.refresh_skills() 1358 self.handler.refresh_skills()
1419 1359
1420 def refresh_row(self,rowi): 1360 def refresh_row(self,rowi):
1421 s = self.skills[rowi] 1361 s = self.skills[rowi]
1422 name = s.getAttribute('name') 1362 name = s.get('name')
1423 self.SetCellValue(rowi,0,name) 1363 self.SetCellValue(rowi,0,name)
1424 self.SetReadOnly(rowi,0) 1364 self.SetReadOnly(rowi,0)
1425 stat = s.getAttribute('stat') 1365 stat = s.get('stat')
1426 self.SetCellValue(rowi,1,stat) 1366 self.SetCellValue(rowi,1,stat)
1427 self.SetReadOnly(rowi,1) 1367 self.SetReadOnly(rowi,1)
1428 self.SetCellValue(rowi,2,s.getAttribute('rank')) 1368 self.SetCellValue(rowi,2,s.get('rank'))
1429 #self.SetCellValue(rowi,3,str(dnd_globals["stats"][stat])) #d 1.5002 1369 #self.SetCellValue(rowi,3,str(dnd_globals["stats"][stat])) #d 1.5002
1430 if self.root.abilities: #a 1.5002 sanity check. 1370 if self.root.abilities: #a 1.5002 sanity check.
1431 stat_mod=self.root.abilities.get_mod(stat) #a 1.5002 1371 stat_mod=self.root.abilities.get_mod(stat) #a 1.5002
1432 else: #a 1.5002 1372 else: #a 1.5002
1433 stat_mod = -6 #a 1.5002 this can happen if code is changed so 1373 stat_mod = -6 #a 1.5002 this can happen if code is changed so
1434 #a 1.5002 that abilities are not defined prior invokation of init. 1374 #a 1.5002 that abilities are not defined prior invokation of init.
1435 print "Please advise dnd3e maintainer alert 1.5002 raised" 1375 print "Please advise dnd3e maintainer alert 1.5002 raised"
1436 1376
1437 self.SetCellValue(rowi,3,str(stat_mod)) #a 1.5002 1377 self.SetCellValue(rowi,3,str(stat_mod)) #a 1.5002
1438 self.SetReadOnly(rowi,3) 1378 self.SetReadOnly(rowi,3)
1439 self.SetCellValue(rowi,4,s.getAttribute('misc')) 1379 self.SetCellValue(rowi,4,s.get('misc'))
1440 mod = str(self.handler.get_mod(name)) 1380 mod = str(self.handler.get_mod(name))
1441 self.SetCellValue(rowi,5,mod) 1381 self.SetCellValue(rowi,5,mod)
1442 self.SetReadOnly(rowi,5) 1382 self.SetReadOnly(rowi,5)
1443 1383
1444 def on_size(self,evt): 1384 def on_size(self,evt):
1478 #wnd.title = "Feats - " + self.charName 1418 #wnd.title = "Feats - " + self.charName
1479 return wnd 1419 return wnd
1480 1420
1481 def tohtml(self): 1421 def tohtml(self):
1482 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Feats</th></tr><tr><td>" 1422 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Feats</th></tr><tr><td>"
1483 n_list = self.master_dom._get_childNodes() 1423 n_list = self.xml.getchildren()
1484 for n in n_list: 1424 for n in n_list:
1485 html_str += n.getAttribute('name')+ ", " 1425 html_str += n.get('name')+ ", "
1486 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 1426 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
1487 return html_str 1427 return html_str
1488 1428
1489 class feat_panel(wx.Panel): 1429 class feat_panel(wx.Panel):
1490 def __init__(self, parent, handler): 1430 def __init__(self, parent, handler):
1491 1431
1492 self.hparent = handler #a 1.5002 allow ability to run up tree. 1432 self.hparent = handler #a 1.5002 allow ability to run up tree.
1493 #a 1.5002 in this case, we need the functional parent, not the invoking parent. 1433 #a 1.5002 in this case, we need the functional parent, not the invoking parent.
1494 self.root = getRoot(self) #a 1.5002 1434 self.root = getRoot(self) #a 1.5002
1495 #tempTitle= 'Feats - ' + self.root.general.charName #a 1.5010 1435 #tempTitle= 'Feats - ' + self.root.general.charName #a 1.5010
1496 #pname = handler.master_dom.setAttribute("name", tempTitle) #a 1.5010 1436 #pname = handler.xml.set("name", tempTitle) #a 1.5010
1497 pname = handler.master_dom.setAttribute("name", 'Feats') #d 1.5010 1437 pname = handler.xml.set("name", 'Feats') #d 1.5010
1498 1438
1499 wx.Panel.__init__(self, parent, -1) 1439 wx.Panel.__init__(self, parent, -1)
1500 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 1440 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
1501 sizer = wx.BoxSizer(wx.VERTICAL) 1441 sizer = wx.BoxSizer(wx.VERTICAL)
1502 sizer.Add(self.grid, 1, wx.EXPAND) 1442 sizer.Add(self.grid, 1, wx.EXPAND)
1515 1455
1516 #self.Bind(wx.EVT_SIZE, self.on_size) 1456 #self.Bind(wx.EVT_SIZE, self.on_size)
1517 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 1457 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
1518 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 1458 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
1519 1459
1520 n_list = handler.master_dom._get_childNodes() 1460 n_list = handler.xml.getchildren()
1521 self.n_list = n_list 1461 self.n_list = n_list
1522 self.master_dom = handler.master_dom 1462 self.xml = handler.xml
1523 self.grid.CreateGrid(len(n_list),3,1) 1463 self.grid.CreateGrid(len(n_list),3,1)
1524 self.grid.SetRowLabelSize(0) 1464 self.grid.SetRowLabelSize(0)
1525 self.grid.SetColLabelValue(0,"Feat") 1465 self.grid.SetColLabelValue(0,"Feat")
1526 self.grid.SetColLabelValue(1,"Type") 1466 self.grid.SetColLabelValue(1,"Type")
1527 self.grid.SetColLabelValue(2,"Reference") #m 1.6 typo correction. 1467 self.grid.SetColLabelValue(2,"Reference") #m 1.6 typo correction.
1530 self.temp_dom = None 1470 self.temp_dom = None
1531 1471
1532 def refresh_row(self,i): 1472 def refresh_row(self,i):
1533 feat = self.n_list[i] 1473 feat = self.n_list[i]
1534 1474
1535 name = feat.getAttribute('name') 1475 name = feat.get('name')
1536 type = feat.getAttribute('type') 1476 type = feat.get('type')
1537 desc = feat.getAttribute('desc') #m 1.6 correct typo 1477 desc = feat.get('desc') #m 1.6 correct typo
1538 self.grid.SetCellValue(i,0,name) 1478 self.grid.SetCellValue(i,0,name)
1539 self.grid.SetReadOnly(i,0) 1479 self.grid.SetReadOnly(i,0)
1540 self.grid.SetCellValue(i,1,type) 1480 self.grid.SetCellValue(i,1,type)
1541 self.grid.SetReadOnly(i,1) 1481 self.grid.SetReadOnly(i,1)
1542 self.grid.SetCellValue(i,2,desc) #m 1.6 correct typo 1482 self.grid.SetCellValue(i,2,desc) #m 1.6 correct typo
1545 def on_remove(self,evt): 1485 def on_remove(self,evt):
1546 rows = self.grid.GetNumberRows() 1486 rows = self.grid.GetNumberRows()
1547 for i in range(rows): 1487 for i in range(rows):
1548 if self.grid.IsInSelection(i,0): 1488 if self.grid.IsInSelection(i,0):
1549 self.grid.DeleteRows(i) 1489 self.grid.DeleteRows(i)
1550 self.master_dom.removeChild(self.n_list[i]) 1490 self.xml.remove(self.n_list[i])
1551 1491
1552 def on_add(self,evt): 1492 def on_add(self,evt):
1553 1493
1554 if not self.temp_dom: 1494 if not self.temp_dom:
1555 tmp = open(dir_struct["dnd3e"]+"dnd3efeats.xml","r") 1495 tree = parse(dir_struct["dnd3e"]+"dnd3efeats.xml")
1556 xml_dom = parseXml_with_dlg(self,tmp.read()) 1496 temp_dom = tree.getroot()
1557 xml_dom = xml_dom._get_firstChild() 1497 f_list = temp_dom.findall('feat')
1558 tmp.close()
1559 temp_dom = xml_dom
1560 f_list = temp_dom.getElementsByTagName('feat')
1561 opts = [] 1498 opts = []
1562 for f in f_list: 1499 for f in f_list:
1563 opts.append(f.getAttribute('name') + " - [" + 1500 opts.append(f.get('name') + " - [" +
1564 f.getAttribute('type') + "] - " + f.getAttribute('desc')) 1501 f.get('type') + "] - " + f.get('desc'))
1565 dlg = wx.SingleChoiceDialog(self,'Choose Feat','Feats',opts) 1502 dlg = wx.SingleChoiceDialog(self,'Choose Feat','Feats',opts)
1566 if dlg.ShowModal() == wx.ID_OK: 1503 if dlg.ShowModal() == wx.ID_OK:
1567 i = dlg.GetSelection() 1504 i = dlg.GetSelection()
1568 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 1505 new_node = self.xml.append(f_list[i])
1569 self.grid.AppendRows(1) 1506 self.grid.AppendRows(1)
1570 self.refresh_row(self.grid.GetNumberRows()-1) 1507 self.refresh_row(self.grid.GetNumberRows()-1)
1571 dlg.Destroy() 1508 dlg.Destroy()
1572 1509
1573 1510
1605 #wxMenuItem(self.tree.std_menu, dnd3e_EXPORT, "Export...", "Export") 1542 #wxMenuItem(self.tree.std_menu, dnd3e_EXPORT, "Export...", "Export")
1606 self.myeditor = None 1543 self.myeditor = None
1607 1544
1608 1545
1609 def new_child_handler(self,tag,text,handler_class,icon='gear'): 1546 def new_child_handler(self,tag,text,handler_class,icon='gear'):
1610 node_list = self.master_dom.getElementsByTagName(tag) 1547 node_list = self.xml.findall(tag)
1611 tree = self.tree 1548 tree = self.tree
1612 i = self.tree.icons[icon] 1549 i = self.tree.icons[icon]
1613 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i) 1550 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i)
1614 handler = handler_class(node_list[0],new_tree_node,self) 1551 handler = handler_class(node_list[0],new_tree_node,self)
1615 tree.SetPyData(new_tree_node,handler) 1552 tree.SetPyData(new_tree_node,handler)
1644 return 1581 return
1645 1582
1646 def on_html(self,evt): 1583 def on_html(self,evt):
1647 html_str = self.tohtml() 1584 html_str = self.tohtml()
1648 wnd = http_html_window(self.frame.note,-1) 1585 wnd = http_html_window(self.frame.note,-1)
1649 wnd.title = self.master_dom.getAttribute('name') 1586 wnd.title = self.xml.get('name')
1650 self.frame.add_panel(wnd) 1587 self.frame.add_panel(wnd)
1651 wnd.SetPage(html_str) 1588 wnd.SetPage(html_str)
1652 1589
1653 def get_design_panel(self,parent): 1590 def get_design_panel(self,parent):
1654 pass 1591 pass
1673 wnd = outline_panel(parent,self,hp_panel,"Hit Points") 1610 wnd = outline_panel(parent,self,hp_panel,"Hit Points")
1674 wnd.title = "Hit Points" 1611 wnd.title = "Hit Points"
1675 return wnd 1612 return wnd
1676 1613
1677 def on_rclick( self, evt ): 1614 def on_rclick( self, evt ):
1678 chp = self.master_dom.getAttribute('current') 1615 chp = self.xml.get('current')
1679 mhp = self.master_dom.getAttribute('max') 1616 mhp = self.xml.get('max')
1680 txt = '((HP: %s / %s))' % ( chp, mhp ) 1617 txt = '((HP: %s / %s))' % ( chp, mhp )
1681 self.chat.ParsePost( txt, True, True ) 1618 self.chat.ParsePost( txt, True, True )
1682 1619
1683 def tohtml(self): 1620 def tohtml(self):
1684 html_str = "<table width=100% border=1 >" 1621 html_str = "<table width=100% border=1 >"
1685 html_str += "<tr BGCOLOR=#E9E9E9 ><th colspan=4>Hit Points</th></tr>" 1622 html_str += "<tr BGCOLOR=#E9E9E9 ><th colspan=4>Hit Points</th></tr>"
1686 html_str += "<tr><th>Max:</th>" 1623 html_str += "<tr><th>Max:</th>"
1687 html_str += "<td>"+self.master_dom.getAttribute('max')+"</td>" 1624 html_str += "<td>"+self.xml.get('max')+"</td>"
1688 html_str += "<th>Current:</th>" 1625 html_str += "<th>Current:</th>"
1689 html_str += "<td>"+self.master_dom.getAttribute('current')+"</td>" 1626 html_str += "<td>"+self.xml.get('current')+"</td>"
1690 html_str += "</tr></table>" 1627 html_str += "</tr></table>"
1691 return html_str 1628 return html_str
1692 1629
1693 class hp_panel(wx.Panel): 1630 class hp_panel(wx.Panel):
1694 def __init__(self, parent, handler): 1631 def __init__(self, parent, handler):
1695 wx.Panel.__init__(self, parent, -1) 1632 wx.Panel.__init__(self, parent, -1)
1696 self.hparent = handler #a 1.5002 allow ability to run up tree. In this 1633 self.hparent = handler #a 1.5002 allow ability to run up tree. In this
1697 #a 1.5002 case, we need the functional parent, not the invoking parent. 1634 #a 1.5002 case, we need the functional parent, not the invoking parent.
1698 1635
1699 pname = handler.master_dom.setAttribute("name", 'HitPoints') 1636 pname = handler.xml.set("name", 'HitPoints')
1700 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap 1637 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap
1701 self.master_dom = handler.master_dom 1638 self.xml = handler.xml
1702 self.sizer.AddMany([ (wx.StaticText(self, -1, "HP Current:"), 0, 1639 self.sizer.AddMany([ (wx.StaticText(self, -1, "HP Current:"), 0,
1703 wx.ALIGN_CENTER_VERTICAL), 1640 wx.ALIGN_CENTER_VERTICAL),
1704 (wx.TextCtrl(self, HP_CUR, 1641 (wx.TextCtrl(self, HP_CUR,
1705 self.master_dom.getAttribute('current')), 0, wx.EXPAND), 1642 self.xml.get('current')), 0, wx.EXPAND),
1706 (wx.StaticText(self, -1, "HP Max:"), 0, wx.ALIGN_CENTER_VERTICAL), 1643 (wx.StaticText(self, -1, "HP Max:"), 0, wx.ALIGN_CENTER_VERTICAL),
1707 (wx.TextCtrl(self, HP_MAX, self.master_dom.getAttribute('max')), 1644 (wx.TextCtrl(self, HP_MAX, self.xml.get('max')),
1708 0, wx.EXPAND), 1645 0, wx.EXPAND),
1709 ]) 1646 ])
1710 self.sizer.AddGrowableCol(1) 1647 self.sizer.AddGrowableCol(1)
1711 self.SetSizer(self.sizer) 1648 self.SetSizer(self.sizer)
1712 self.SetAutoLayout(True) 1649 self.SetAutoLayout(True)
1717 self.Bind(wx.EVT_TEXT, self.on_text, id=HP_CUR) 1654 self.Bind(wx.EVT_TEXT, self.on_text, id=HP_CUR)
1718 1655
1719 def on_text(self,evt): 1656 def on_text(self,evt):
1720 id = evt.GetId() 1657 id = evt.GetId()
1721 if id == HP_CUR: 1658 if id == HP_CUR:
1722 self.master_dom.setAttribute('current',evt.GetString()) 1659 self.xml.set('current',evt.GetString())
1723 elif id == HP_MAX: 1660 elif id == HP_MAX:
1724 self.master_dom.setAttribute('max',evt.GetString()) 1661 self.xml.set('max',evt.GetString())
1725 1662
1726 def on_size(self,evt): 1663 def on_size(self,evt):
1727 s = self.GetClientSizeTuple() 1664 s = self.GetClientSizeTuple()
1728 self.sizer.SetDimension(0,0,s[0],s[1]) 1665 self.sizer.SetDimension(0,0,s[0],s[1])
1729 1666
1759 """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 > 1696 """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 >
1760 <th width='80%'>Weapon Name</th><th>Added Footnote</th></tr>\n""") 1697 <th width='80%'>Weapon Name</th><th>Added Footnote</th></tr>\n""")
1761 self.temp_dom={} 1698 self.temp_dom={}
1762 #a 1.5012 end a1b 1699 #a 1.5012 end a1b
1763 1700
1764 node_list = self.master_dom.getElementsByTagName('melee') 1701 node_list = self.xml.findall('melee')
1765 self.melee = node_list[0] 1702 self.melee = node_list[0]
1766 node_list = self.master_dom.getElementsByTagName('ranged') 1703 node_list = self.xml.findall('ranged')
1767 self.ranged = node_list[0] 1704 self.ranged = node_list[0]
1768 self.refresh_weapons() # this causes self.weapons to be loaded. 1705 self.refresh_weapons() # this causes self.weapons to be loaded.
1769 1706
1770 #a 1.5012 this whole if clause. 1707 #a 1.5012 this whole if clause.
1771 if self.updateFootNotes == True: 1708 if self.updateFootNotes == True:
1779 fnFrame = wx.Frame(masterFrame, -1, title) 1716 fnFrame = wx.Frame(masterFrame, -1, title)
1780 fnFrame.panel = wx.html.HtmlWindow(fnFrame,-1) 1717 fnFrame.panel = wx.html.HtmlWindow(fnFrame,-1)
1781 fnFrame.panel.SetPage(self.html_str) 1718 fnFrame.panel.SetPage(self.html_str)
1782 fnFrame.Show() 1719 fnFrame.Show()
1783 1720
1784 #weaponsH = self.master_dom.getElementsByTagName('attacks') 1721 #weaponsH = self.xml.findall('attacks')
1785 #mark7 1722 #mark7
1786 1723
1787 #a 1.9001 this whole method 1724 #a 1.9001 this whole method
1788 def refreshMRdata(self): # refresh the data in the melee/ranged section 1725 def refreshMRdata(self): # refresh the data in the melee/ranged section
1789 # of the attack chart. 1726 # of the attack chart.
1799 self.weapons = {} 1736 self.weapons = {}
1800 1737
1801 tree = self.tree 1738 tree = self.tree
1802 icons = self.tree.icons 1739 icons = self.tree.icons
1803 tree.CollapseAndReset(self.mytree_node) 1740 tree.CollapseAndReset(self.mytree_node)
1804 node_list = self.master_dom.getElementsByTagName('weapon') 1741 node_list = self.xml.findall('weapon')
1805 for n in node_list: 1742 for n in node_list:
1806 name = n.getAttribute('name') 1743 name = n.get('name')
1807 fn = safeGetAttr(n,'fn') #a 1.5012 can be removed when 1744 fn = safeGetAttr(n,'fn') #a 1.5012 can be removed when
1808 #a 1.5012 confident all characters in the world have footnotes. 1745 #a 1.5012 confident all characters in the world have footnotes.
1809 #if self.updateFootNotes: 1746 #if self.updateFootNotes:
1810 if fn == None:#a 1.5012 1747 if fn == None:#a 1.5012
1811 self.updateFootNotes=True 1748 self.updateFootNotes=True
1815 tree.SetPyData(new_tree_node,self) 1752 tree.SetPyData(new_tree_node,self)
1816 self.weapons[name]=n 1753 self.weapons[name]=n
1817 1754
1818 def updateFootN(self,n):#a 1.5012 this whole function 1755 def updateFootN(self,n):#a 1.5012 this whole function
1819 if not self.temp_dom: 1756 if not self.temp_dom:
1820 tmp = open(dir_struct["dnd3e"]+"dnd3eweapons.xml","r") 1757 tree = parse(dir_struct["dnd3e"]+"dnd3eweapons.xml")
1821 #tmp = open("c:\clh\codeSamples\sample1.xml","r") #a (debug) 1.5012 1758 self.temp_dom = tree.getroot()
1822 self.temp_dom = xml.dom.minidom.parse(tmp) 1759 nameF = n.get('name')
1823 1760 w_list = self.temp_dom.findall('weapon')
1824 #self.temp_dom = parseXml_with_dlg(self,tmp.read())
1825 self.temp_dom = self.temp_dom._get_firstChild()
1826 tmp.close()
1827 nameF = n.getAttribute('name')
1828 w_list = self.temp_dom.getElementsByTagName('weapon')
1829 found = False 1761 found = False
1830 for w in w_list: 1762 for w in w_list:
1831 if nameF == w.getAttribute('name'): 1763 if nameF == w.get('name'):
1832 found = True 1764 found = True
1833 fnN = safeGetAttr(n,'fn') 1765 fnN = safeGetAttr(n,'fn')
1834 if fnN == None or fnN == 'None': 1766 if fnN == None or fnN == 'None':
1835 fnW = w.getAttribute('fn') 1767 fnW = w.get('fn')
1836 #print "weapon",nameF,"footnotes are updated to",fnW 1768 #print "weapon",nameF,"footnotes are updated to",fnW
1837 self.html_str += ("<tr ALIGN='center'><td>"+nameF+"</td>"+ 1769 self.html_str += ("<tr ALIGN='center'><td>"+nameF+"</td>"+
1838 "<td>"+fnW+"</td></tr>\n") 1770 "<td>"+fnW+"</td></tr>\n")
1839 n.setAttribute('fn',fnW) 1771 n.set('fn',fnW)
1840 break 1772 break
1841 if not found: 1773 if not found:
1842 self.html_str += ("<tr ALIGN='center'><td>"+nameF+" - Custom "+ 1774 self.html_str += ("<tr ALIGN='center'><td>"+nameF+" - Custom "+
1843 "Weapon, research "+ 1775 "Weapon, research "+
1844 "and update manually; setting footnote to indicate custom</td>"+ 1776 "and update manually; setting footnote to indicate custom</td>"+
1845 "<td>"+'X'+"</td></tr>\n") 1777 "<td>"+'X'+"</td></tr>\n")
1846 n.setAttribute('fn','X') 1778 n.set('fn','X')
1847 1779
1848 1780
1849 def get_mod(self,type='m'): 1781 def get_mod(self,type='m'):
1850 (base, base2, base3, base4, base5, base6, stat_mod, misc) \ 1782 (base, base2, base3, base4, base5, base6, stat_mod, misc) \
1851 = self.get_attack_data(type) 1783 = self.get_attack_data(type)
1859 stat = 'Dex' #m was dnd_globals["stats"]['Dex'] 1.5002 1791 stat = 'Dex' #m was dnd_globals["stats"]['Dex'] 1.5002
1860 temp = self.ranged 1792 temp = self.ranged
1861 stat_mod = -7 1793 stat_mod = -7
1862 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002 1794 stat_mod = self.root.abilities.get_mod(stat) #a 1.5002
1863 #print "Big test - stat_mod",stat_mod #a (debug) 1.6000 1795 #print "Big test - stat_mod",stat_mod #a (debug) 1.6000
1864 base = int(temp.getAttribute('base')) 1796 base = int(temp.get('base'))
1865 base2 = int(temp.getAttribute('second')) 1797 base2 = int(temp.get('second'))
1866 base3 = int(temp.getAttribute('third')) 1798 base3 = int(temp.get('third'))
1867 base4 = int(temp.getAttribute('forth')) 1799 base4 = int(temp.get('forth'))
1868 base5 = int(temp.getAttribute('fifth')) 1800 base5 = int(temp.get('fifth'))
1869 base6 = int(temp.getAttribute('sixth')) 1801 base6 = int(temp.get('sixth'))
1870 misc = int(temp.getAttribute('misc')) 1802 misc = int(temp.get('misc'))
1871 return (base, base2, base3, base4, base5, base6, stat_mod ,misc) 1803 return (base, base2, base3, base4, base5, base6, stat_mod ,misc)
1872 1804
1873 def on_rclick(self,evt): 1805 def on_rclick(self,evt):
1874 item = self.tree.GetSelection() 1806 item = self.tree.GetSelection()
1875 1807
1879 return #a 1.6015 1811 return #a 1.6015
1880 #dnd3e_char_child.on_ldclick(self,evt)#d 1.6015 1812 #dnd3e_char_child.on_ldclick(self,evt)#d 1.6015
1881 #self.frame.add_panel(self.get_design_panel(self.frame.note)) 1813 #self.frame.add_panel(self.get_design_panel(self.frame.note))
1882 else: 1814 else:
1883 #print "entering attack phase" 1815 #print "entering attack phase"
1884 mod = int(self.weapons[name].getAttribute('mod')) 1816 mod = int(self.weapons[name].get('mod'))
1885 wepMod = mod #a 1.5008 1817 wepMod = mod #a 1.5008
1886 footNotes = safeGetAttr(self.weapons[name],'fn','') 1818 footNotes = safeGetAttr(self.weapons[name],'fn','')
1887 cat = self.weapons[name].getAttribute('category') #a1.6001 1819 cat = self.weapons[name].get('category') #a1.6001
1888 result = split(cat,"-",2) #a 1.6001 1820 result = split(cat,"-",2) #a 1.6001
1889 if len(result) < 2: #a 1.6021 this if & else 1821 if len(result) < 2: #a 1.6021 this if & else
1890 print "warning: 1.6002 unable to interpret weapon category" 1822 print "warning: 1.6002 unable to interpret weapon category"
1891 print "format 'type weapon-[Range|Melee]', probably missing" 1823 print "format 'type weapon-[Range|Melee]', probably missing"
1892 print "the hyphen. Assuming Melee" 1824 print "the hyphen. Assuming Melee"
1894 tres="Melee" 1826 tres="Melee"
1895 else: 1827 else:
1896 tres=result[1] 1828 tres=result[1]
1897 #print "print FootNotes,tres",footNotes,tres 1829 #print "print FootNotes,tres",footNotes,tres
1898 if tres == 'Melee': #a 1.6001 #m 1.6022 use of tres here and... 1830 if tres == 'Melee': #a 1.6001 #m 1.6022 use of tres here and...
1899 #if self.weapons[name].getAttribute('range') == '0':#d 1.6001 1831 #if self.weapons[name].get('range') == '0':#d 1.6001
1900 rangeOrMelee = 'm' #a 1.5008 code demote for next comment block 1832 rangeOrMelee = 'm' #a 1.5008 code demote for next comment block
1901 elif tres == 'Ranged': #m 1.6001 (was just else) #m 1.6022 here 1833 elif tres == 'Ranged': #m 1.6001 (was just else) #m 1.6022 here
1902 rangeOrMelee = 'r' #a 1.5008 1834 rangeOrMelee = 'r' #a 1.5008
1903 else:#a 1.6001 add this whole else clause. 1835 else:#a 1.6001 add this whole else clause.
1904 print "warning: 1.6001 unable to interpret weapon category" 1836 print "warning: 1.6001 unable to interpret weapon category"
1905 print "treating weapon as Melee, please correct xml" 1837 print "treating weapon as Melee, please correct xml"
1906 print "weapon name:",name 1838 print "weapon name:",name
1907 rangeOrMelee ='m' 1839 rangeOrMelee ='m'
1908 mod = mod + self.get_mod(rangeOrMelee) #a 1.5008 1840 mod = mod + self.get_mod(rangeOrMelee) #a 1.5008
1909 chat = self.chat 1841 chat = self.chat
1910 dmg = self.weapons[name].getAttribute('damage') 1842 dmg = self.weapons[name].get('damage')
1911 1843
1912 #a 1.6003 start code fix instance a 1844 #a 1.6003 start code fix instance a
1913 result = split(dmg,"/",2) 1845 result = split(dmg,"/",2)
1914 dmg = result[0] 1846 dmg = result[0]
1915 #print "1.6003 check:dmg",dmg,";result",result 1847 #print "1.6003 check:dmg",dmg,";result",result
2035 html_str += "<td>"+str(ranged[0]+ranged[1]+ranged[2])+"</td>" 1967 html_str += "<td>"+str(ranged[0]+ranged[1]+ranged[2])+"</td>"
2036 html_str += "<td>"+str(ranged[0])+"</td>" 1968 html_str += "<td>"+str(ranged[0])+"</td>"
2037 html_str += "<td>"+str(ranged[1])+"</td>" 1969 html_str += "<td>"+str(ranged[1])+"</td>"
2038 html_str += "<td>"+str(ranged[2])+"</td></tr></table>" 1970 html_str += "<td>"+str(ranged[2])+"</td></tr></table>"
2039 1971
2040 n_list = self.master_dom.getElementsByTagName('weapon') 1972 n_list = self.xml.findall('weapon')
2041 for n in n_list: 1973 for n in n_list:
2042 mod = n.getAttribute('mod') 1974 mod = n.get('mod')
2043 if mod >= 0: 1975 if mod >= 0:
2044 mod1 = "+" 1976 mod1 = "+"
2045 else: 1977 else:
2046 mod1 = "" 1978 mod1 = ""
2047 ran = n.getAttribute('range') 1979 ran = n.get('range')
2048 total = str(int(mod) + self.get_mod(ran)) 1980 total = str(int(mod) + self.get_mod(ran))
2049 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 > 1981 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 >
2050 <th colspan=2>Weapon</th> 1982 <th colspan=2>Weapon</th>
2051 <th>Attack</th><th >Damage</th><th>Critical</th></tr>""" 1983 <th>Attack</th><th >Damage</th><th>Critical</th></tr>"""
2052 html_str += "<tr ALIGN='center' ><td colspan=2>" 1984 html_str += "<tr ALIGN='center' ><td colspan=2>"
2053 html_str += n.getAttribute('name')+"</td><td>"+total+"</td>" 1985 html_str += n.get('name')+"</td><td>"+total+"</td>"
2054 html_str += "<td>"+n.getAttribute('damage')+"</td><td>" 1986 html_str += "<td>"+n.get('damage')+"</td><td>"
2055 html_str += n.getAttribute('critical')+"</td></tr>" 1987 html_str += n.get('critical')+"</td></tr>"
2056 html_str += """<tr BGCOLOR=#E9E9E9 ><th>Range</th><th>Weight</th> 1988 html_str += """<tr BGCOLOR=#E9E9E9 ><th>Range</th><th>Weight</th>
2057 <th>Type</th><th>Size</th><th>Misc Mod</th></tr>""" 1989 <th>Type</th><th>Size</th><th>Misc Mod</th></tr>"""
2058 html_str += "<tr ALIGN='center'><td>"+ran+"</td><td>" 1990 html_str += "<tr ALIGN='center'><td>"+ran+"</td><td>"
2059 html_str += n.getAttribute('weight')+"</td>" 1991 html_str += n.get('weight')+"</td>"
2060 html_str += "<td>"+n.getAttribute('type')+"</td><td>" 1992 html_str += "<td>"+n.get('type')+"</td><td>"
2061 html_str += n.getAttribute('size')+"</td>" 1993 html_str += n.get('size')+"</td>"
2062 html_str += '<td>%s%s</td></tr>' % (mod1, mod) 1994 html_str += '<td>%s%s</td></tr>' % (mod1, mod)
2063 #a 1.5012 add next two lines to pretty print footnotes. 1995 #a 1.5012 add next two lines to pretty print footnotes.
2064 html_str += """<tr><th BGCOLOR=#E9E9E9 colspan=2>Footnotes:</th>""" 1996 html_str += """<tr><th BGCOLOR=#E9E9E9 colspan=2>Footnotes:</th>"""
2065 html_str += "<th colspan=3>"+safeGetAttr(n,'fn','')+"</th></tr>" 1997 html_str += "<th colspan=3>"+safeGetAttr(n,'fn','')+"</th></tr>"
2066 html_str += '</table>' 1998 html_str += '</table>'
2067 return html_str 1999 return html_str
2068 2000
2069 class attack_grid(wx.grid.Grid): 2001 class attack_grid(wx.grid.Grid):
2070 """grid for attacks""" 2002 """grid for attacks"""
2071 def __init__(self, parent, handler): 2003 def __init__(self, parent, handler):
2072 pname = handler.master_dom.setAttribute("name", 'Melee') 2004 pname = handler.xml.set("name", 'Melee')
2073 self.hparent = handler #a 1.5002 allow ability to run up tree. 2005 self.hparent = handler #a 1.5002 allow ability to run up tree.
2074 #a 1.5002 we need the functional parent, not the invoking parent. 2006 #a 1.5002 we need the functional parent, not the invoking parent.
2075 2007
2076 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 2008 wx.grid.Grid.__init__(self, parent, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
2077 2009
2126 col = evt.GetCol() 2058 col = evt.GetCol()
2127 value = self.GetCellValue(row,col) 2059 value = self.GetCellValue(row,col)
2128 try: 2060 try:
2129 int(value) 2061 int(value)
2130 if col==1: 2062 if col==1:
2131 self.rows[row].setAttribute('base',value) 2063 self.rows[row].set('base',value)
2132 elif col==2: 2064 elif col==2:
2133 self.rows[row].setAttribute('second',value) 2065 self.rows[row].set('second',value)
2134 elif col==3: 2066 elif col==3:
2135 self.rows[row].setAttribute('third',value) 2067 self.rows[row].set('third',value)
2136 elif col==4: 2068 elif col==4:
2137 self.rows[row].setAttribute('forth',value) 2069 self.rows[row].set('forth',value)
2138 elif col==5: 2070 elif col==5:
2139 self.rows[row].setAttribute('fifth',value) 2071 self.rows[row].set('fifth',value)
2140 elif col==6: 2072 elif col==6:
2141 self.rows[row].setAttribute('sixth',value) 2073 self.rows[row].set('sixth',value)
2142 elif col==8: 2074 elif col==8:
2143 self.rows[row].setAttribute('misc',value) 2075 self.rows[row].set('misc',value)
2144 #print "row:",row,"value",value,self.rows[row] 2076 #print "row:",row,"value",value,self.rows[row]
2145 self.parent.refresh_data() 2077 self.parent.refresh_data()
2146 except: 2078 except:
2147 self.SetCellValue(row,col,"0") 2079 self.SetCellValue(row,col,"0")
2148 2080
2179 class weapon_panel(wx.Panel): 2111 class weapon_panel(wx.Panel):
2180 def __init__(self, parent, handler): 2112 def __init__(self, parent, handler):
2181 self.hparent = handler #a 1.5012 2113 self.hparent = handler #a 1.5012
2182 self.root = getRoot(self) 2114 self.root = getRoot(self)
2183 2115
2184 pname = handler.master_dom.setAttribute("name", 'Weapons') 2116 pname = handler.xml.set("name", 'Weapons')
2185 2117
2186 wx.Panel.__init__(self, parent, -1) 2118 wx.Panel.__init__(self, parent, -1)
2187 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 2119 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
2188 sizer = wx.BoxSizer(wx.VERTICAL) 2120 sizer = wx.BoxSizer(wx.VERTICAL)
2189 sizer.Add(self.grid, 1, wx.EXPAND) 2121 sizer.Add(self.grid, 1, wx.EXPAND)
2205 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 2137 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
2206 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 2138 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
2207 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 2139 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
2208 self.grid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.on_gridRclick)#a 1.5012 2140 self.grid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.on_gridRclick)#a 1.5012
2209 2141
2210 n_list = handler.master_dom.getElementsByTagName('weapon') 2142 n_list = handler.xml.findall('weapon')
2211 self.n_list = n_list 2143 self.n_list = n_list
2212 self.master_dom = handler.master_dom 2144 self.xml = handler.xml
2213 self.handler = handler 2145 self.handler = handler
2214 #trash=input("weapon panel init colnames") 2146 #trash=input("weapon panel init colnames")
2215 self.colAttr = ['name','damage','mod','critical','type','weight', 2147 self.colAttr = ['name','damage','mod','critical','type','weight',
2216 'range','size','Total','fn', 'comment'] #a 1.5012 2148 'range','size','Total','fn', 'comment'] #a 1.5012
2217 col_names = ['Name','Damage','To hit\nmod','Critical','Type','Weight', 2149 col_names = ['Name','Damage','To hit\nmod','Critical','Type','Weight',
2236 col = evt.GetCol() 2168 col = evt.GetCol()
2237 value = self.grid.GetCellValue(row,col) 2169 value = self.grid.GetCellValue(row,col)
2238 #print "wp, on rclick,grid row,col,value",row,col,value 2170 #print "wp, on rclick,grid row,col,value",row,col,value
2239 if col == 9 and value != 'None': 2171 if col == 9 and value != 'None':
2240 n = self.n_list[row] 2172 n = self.n_list[row]
2241 name = n.getAttribute('name') 2173 name = n.get('name')
2242 #print "we want a panel!" 2174 #print "we want a panel!"
2243 handler = self.hparent 2175 handler = self.hparent
2244 #print "handler:",handler 2176 #print "handler:",handler
2245 # A handler is a node, and nodes have a reference to 2177 # A handler is a node, and nodes have a reference to
2246 # the master frame 2178 # the master frame
2248 #print "masterFrame:",masterFrame 2180 #print "masterFrame:",masterFrame
2249 title = name+"'s Special Weapon Characteristics" 2181 title = name+"'s Special Weapon Characteristics"
2250 fnFrame = wx.Frame(masterFrame, -1, title) 2182 fnFrame = wx.Frame(masterFrame, -1, title)
2251 fnFrame.panel = wx.html.HtmlWindow(fnFrame,-1) 2183 fnFrame.panel = wx.html.HtmlWindow(fnFrame,-1)
2252 if not self.temp_dom: 2184 if not self.temp_dom:
2253 tmp = open(dir_struct["dnd3e"]+ 2185 tree = parse(dir_struct["dnd3e"]+"dnd3eweapons.xml")
2254 "dnd3eweapons.xml","r") 2186 xml_dom = tree.getroot()
2255 #tmp = open("c:\clh\codeSamples\sample1.xml","r")
2256 xml_dom = parseXml_with_dlg(self,tmp.read())
2257 xml_dom = xml_dom._get_firstChild()
2258 tmp.close()
2259 self.temp_dom = xml_dom 2187 self.temp_dom = xml_dom
2260 f_list = self.temp_dom.getElementsByTagName('f') # the footnotes 2188 f_list = self.temp_dom.findall('f') # the footnotes
2261 #print "weapon_panel - on_rclick f_list",f_list#a 1.6 2189 #print "weapon_panel - on_rclick f_list",f_list#a 1.6
2262 n = self.n_list[row] 2190 n = self.n_list[row]
2263 name = n.getAttribute('name') 2191 name = n.get('name')
2264 footnotes = n.getAttribute('fn') 2192 footnotes = n.get('fn')
2265 html_str = "<html><body>" 2193 html_str = "<html><body>"
2266 html_str += """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 > 2194 html_str += """<table border='1' width=100% ><tr BGCOLOR=#E9E9E9 >
2267 <th width='10%'>Note</th><th>Description</th></tr>\n""" 2195 <th width='10%'>Note</th><th>Description</th></tr>\n"""
2268 #print "rclick,name,fn",name,footnotes 2196 #print "rclick,name,fn",name,footnotes
2269 if footnotes == "": 2197 if footnotes == "":
2271 html_str += " <td>This weapon has no footnotes</td></tr>" 2199 html_str += " <td>This weapon has no footnotes</td></tr>"
2272 for i in range(len(footnotes)): 2200 for i in range(len(footnotes)):
2273 aNote=footnotes[i] 2201 aNote=footnotes[i]
2274 found=False 2202 found=False
2275 for f in f_list: 2203 for f in f_list:
2276 if f.getAttribute('mark') == aNote: 2204 if f.get('mark') == aNote:
2277 found=True 2205 found=True
2278 text=f.getAttribute('txt') 2206 text=f.get('txt')
2279 html_str += ("<tr ALIGN='center'><td>"+aNote+"</td>"+ 2207 html_str += ("<tr ALIGN='center'><td>"+aNote+"</td>"+
2280 "<td>"+text+"</td></tr>\n") 2208 "<td>"+text+"</td></tr>\n")
2281 if not found: 2209 if not found:
2282 html_str += ("<tr ALIGN='center'><td>"+aNote+"</td>"+ 2210 html_str += ("<tr ALIGN='center'><td>"+aNote+"</td>"+
2283 "<td>is not a recognized footnote</td></tr>\n") 2211 "<td>is not a recognized footnote</td></tr>\n")
2297 row = evt.GetRow() 2225 row = evt.GetRow()
2298 col = evt.GetCol() 2226 col = evt.GetCol()
2299 value = self.grid.GetCellValue(row,col) 2227 value = self.grid.GetCellValue(row,col)
2300 if col == 2 and not int(value): # special case for mod, demoted 2228 if col == 2 and not int(value): # special case for mod, demoted
2301 value = "0" #a 5.012 demoted 2229 value = "0" #a 5.012 demoted
2302 self.n_list[row].setAttribute('mod',value) # a 5.012 demoted 2230 self.n_list[row].set('mod',value) # a 5.012 demoted
2303 if not (col == 9 and value == "None" and 2231 if not (col == 9 and value == "None" and
2304 self.n_list[row].getAttribute('fn') == "None" 2232 self.n_list[row].get('fn') == "None"
2305 ): #a 5.012 special case for footnotes 2233 ): #a 5.012 special case for footnotes
2306 self.n_list[row].setAttribute(self.colAttr[col],value)#a 5.012 2234 self.n_list[row].set(self.colAttr[col],value)#a 5.012
2307 #print "cell change",row,col,value 2235 #print "cell change",row,col,value
2308 #if col == 0:#d 5.012 use of colAttr removed need for this. 2236 #if col == 0:#d 5.012 use of colAttr removed need for this.
2309 # self.n_list[row].setAttribute('name',value) #d 5.012 2237 # self.n_list[row].set('name',value) #d 5.012
2310 #elif col == 2: #d 5.012 2238 #elif col == 2: #d 5.012
2311 # try:#d 5.012 simplifying... remove this block. 2239 # try:#d 5.012 simplifying... remove this block.
2312 # int(value) 2240 # int(value)
2313 # self.n_list[row].setAttribute('mod',value) 2241 # self.n_list[row].set('mod',value)
2314 # #self.refresh_row(row) #d 5.012 did nothing. 2242 # #self.refresh_row(row) #d 5.012 did nothing.
2315 # except: 2243 # except:
2316 # value = "0" 2244 # value = "0"
2317 # self.n_list[row].setAttribute('mod',value) 2245 # self.n_list[row].set('mod',value)
2318 #else: #d 5.012 demoted self.n set. 2246 #else: #d 5.012 demoted self.n set.
2319 # self.n_list[row].setAttribute(self.grid.GetColLabelValue(col),value) 2247 # self.n_list[row].set(self.grid.GetColLabelValue(col),value)
2320 2248
2321 2249
2322 def refresh_row(self,i): 2250 def refresh_row(self,i):
2323 n = self.n_list[i] 2251 n = self.n_list[i]
2324 fn = n.getAttribute('fn') 2252 fn = n.get('fn')
2325 #print "fn=",fn 2253 #print "fn=",fn
2326 name = n.getAttribute('name') 2254 name = n.get('name')
2327 mod = n.getAttribute('mod') 2255 mod = n.get('mod')
2328 ran = n.getAttribute('range') 2256 ran = n.get('range')
2329 total = str(int(mod) + self.handler.get_mod(ran)) 2257 total = str(int(mod) + self.handler.get_mod(ran))
2330 self.grid.SetCellValue(i,0,name) 2258 self.grid.SetCellValue(i,0,name)
2331 self.grid.SetCellValue(i,1,n.getAttribute('damage')) 2259 self.grid.SetCellValue(i,1,n.get('damage'))
2332 self.grid.SetCellValue(i,2,mod) 2260 self.grid.SetCellValue(i,2,mod)
2333 self.grid.SetCellValue(i,3,n.getAttribute('critical')) 2261 self.grid.SetCellValue(i,3,n.get('critical'))
2334 self.grid.SetCellValue(i,4,n.getAttribute('type')) 2262 self.grid.SetCellValue(i,4,n.get('type'))
2335 self.grid.SetCellValue(i,5,n.getAttribute('weight')) 2263 self.grid.SetCellValue(i,5,n.get('weight'))
2336 self.grid.SetCellValue(i,6,ran) 2264 self.grid.SetCellValue(i,6,ran)
2337 self.grid.SetCellValue(i,7,n.getAttribute('size') ) 2265 self.grid.SetCellValue(i,7,n.get('size') )
2338 self.grid.SetCellValue(i,8,total) 2266 self.grid.SetCellValue(i,8,total)
2339 self.grid.SetCellValue(i,9,safeGetAttr(n,'fn','None')) #a 1.5012 2267 self.grid.SetCellValue(i,9,safeGetAttr(n,'fn','None')) #a 1.5012
2340 self.grid.SetCellValue(i,10,safeGetAttr(n,'comment','')) #a 1.5012 2268 self.grid.SetCellValue(i,10,safeGetAttr(n,'comment','')) #a 1.5012
2341 #fn=safeGetAttr(n,'fn','None') #a (debug) 1.5012 2269 #fn=safeGetAttr(n,'fn','None') #a (debug) 1.5012
2342 #print "fn ",fn,"<" #a (debug) 1.5012 2270 #print "fn ",fn,"<" #a (debug) 1.5012
2348 rows = self.grid.GetNumberRows() 2276 rows = self.grid.GetNumberRows()
2349 #for i in range(rows): #d 1.6011 do it backwards, 2277 #for i in range(rows): #d 1.6011 do it backwards,
2350 for i in range(rows-1,-1,-1): #a 1.6011 or you lose context 2278 for i in range(rows-1,-1,-1): #a 1.6011 or you lose context
2351 if self.grid.IsInSelection(i,0): 2279 if self.grid.IsInSelection(i,0):
2352 self.grid.DeleteRows(i) 2280 self.grid.DeleteRows(i)
2353 self.master_dom.removeChild(self.n_list[i]) 2281 self.xml.remove(self.n_list[i])
2354 self.n_list = self.master_dom.getElementsByTagName('weapon') 2282 self.n_list = self.xml.findall('weapon')
2355 self.handler.refresh_weapons() 2283 self.handler.refresh_weapons()
2356 2284
2357 def on_add(self,evt): 2285 def on_add(self,evt):
2358 if not self.temp_dom: 2286 if not self.temp_dom:
2359 tmp = open(dir_struct["dnd3e"]+"dnd3eweapons.xml","r") 2287 tree = parse(dir_struct["dnd3e"]+"dnd3eweapons.xml")
2360 #tmp = open("c:\clh\codeSamples\sample1.xml","r") #a (debug) 1.5012 2288 xml_dom = tree.getroot()
2361 xml_dom = parseXml_with_dlg(self,tmp.read())
2362 xml_dom = xml_dom._get_firstChild()
2363 tmp.close()
2364 self.temp_dom = xml_dom 2289 self.temp_dom = xml_dom
2365 f_list = self.temp_dom.getElementsByTagName('weapon') 2290 f_list = self.temp_dom.findall('weapon')
2366 opts = [] 2291 opts = []
2367 #print "weapon_panel - on_add f_list",f_list#a 1.6 2292 #print "weapon_panel - on_add f_list",f_list#a 1.6
2368 for f in f_list: 2293 for f in f_list:
2369 opts.append(f.getAttribute('name')) 2294 opts.append(f.get('name'))
2370 dlg = wx.SingleChoiceDialog(self,'Choose Weapon','Weapon List',opts) 2295 dlg = wx.SingleChoiceDialog(self,'Choose Weapon','Weapon List',opts)
2371 if dlg.ShowModal() == wx.ID_OK: 2296 if dlg.ShowModal() == wx.ID_OK:
2372 i = dlg.GetSelection() 2297 i = dlg.GetSelection()
2373 #print f_list[i] # DOM Element: weapon. 2298 #print f_list[i] # DOM Element: weapon.
2374 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 2299 new_node = self.xml.append(f_list[i])
2375 #print self.grid.AppendRows # a bound method of wxGrid 2300 #print self.grid.AppendRows # a bound method of wxGrid
2376 self.grid.AppendRows(1) 2301 self.grid.AppendRows(1)
2377 self.n_list = self.master_dom.getElementsByTagName('weapon') 2302 self.n_list = self.xml.findall('weapon')
2378 #print "self.n_list",self.n_list # list of DOM weapons 2303 #print "self.n_list",self.n_list # list of DOM weapons
2379 self.refresh_row(self.grid.GetNumberRows()-1) 2304 self.refresh_row(self.grid.GetNumberRows()-1)
2380 self.handler.refresh_weapons() 2305 self.handler.refresh_weapons()
2381 dlg.Destroy() 2306 dlg.Destroy()
2382 2307
2398 self.refresh_row(i) 2323 self.refresh_row(i)
2399 2324
2400 2325
2401 class attack_panel(wx.Panel): 2326 class attack_panel(wx.Panel):
2402 def __init__(self, parent, handler): 2327 def __init__(self, parent, handler):
2403 pname = handler.master_dom.setAttribute("name", 'Melee') 2328 pname = handler.xml.set("name", 'Melee')
2404 self.parent = parent #a 1.9001 2329 self.parent = parent #a 1.9001
2405 2330
2406 wx.Panel.__init__(self, parent, -1) 2331 wx.Panel.__init__(self, parent, -1)
2407 2332
2408 self.a_grid = attack_grid(self, handler) 2333 self.a_grid = attack_grid(self, handler)
2454 else: 2379 else:
2455 ac_total += max_dex 2380 ac_total += max_dex
2456 return ac_total 2381 return ac_total
2457 2382
2458 def get_max_dex(self): 2383 def get_max_dex(self):
2459 armor_list = self.master_dom.getElementsByTagName('armor') 2384 armor_list = self.xml.findall('armor')
2460 dex = 10 2385 dex = 10
2461 for a in armor_list: 2386 for a in armor_list:
2462 temp = int(a.getAttribute("maxdex")) 2387 temp = int(a.get("maxdex"))
2463 if temp < dex: 2388 if temp < dex:
2464 dex = temp 2389 dex = temp
2465 return dex 2390 return dex
2466 2391
2467 def get_total(self,attr): 2392 def get_total(self,attr):
2468 armor_list = self.master_dom.getElementsByTagName('armor') 2393 armor_list = self.xml.findall('armor')
2469 total = 0 2394 total = 0
2470 for a in armor_list: 2395 for a in armor_list:
2471 total += int(a.getAttribute(attr)) 2396 total += int(a.get(attr))
2472 return total 2397 return total
2473 2398
2474 def get_design_panel(self,parent): 2399 def get_design_panel(self,parent):
2475 wnd = outline_panel(parent,self,ac_panel,"Armor") 2400 wnd = outline_panel(parent,self,ac_panel,"Armor")
2476 wnd.title = "Armor" 2401 wnd.title = "Armor"
2491 html_str += "<td>"+str(self.get_armor_class())+"</td>" 2416 html_str += "<td>"+str(self.get_armor_class())+"</td>"
2492 html_str += "<td>"+str(self.get_check_pen())+"</td>" 2417 html_str += "<td>"+str(self.get_check_pen())+"</td>"
2493 html_str += "<td>"+str(self.get_spell_failure())+"</td>" 2418 html_str += "<td>"+str(self.get_spell_failure())+"</td>"
2494 html_str += "<td>"+str(self.get_max_dex())+"</td>" 2419 html_str += "<td>"+str(self.get_max_dex())+"</td>"
2495 html_str += "<td>"+str(self.get_total_weight())+"</td></tr></table>" 2420 html_str += "<td>"+str(self.get_total_weight())+"</td></tr></table>"
2496 n_list = self.master_dom._get_childNodes() 2421 n_list = self.xml.getchildren()
2497 for n in n_list: 2422 for n in n_list:
2498 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 > 2423 html_str += """<P><table width=100% border=1 ><tr BGCOLOR=#E9E9E9 >
2499 <th colspan=3>Armor</th><th>Type</th><th >Bonus</th></tr>""" 2424 <th colspan=3>Armor</th><th>Type</th><th >Bonus</th></tr>"""
2500 html_str += "<tr ALIGN='center' >" 2425 html_str += "<tr ALIGN='center' >"
2501 html_str += "<td colspan=3>"+n.getAttribute('name')+"</td>" 2426 html_str += "<td colspan=3>"+n.get('name')+"</td>"
2502 html_str += "<td>"+n.getAttribute('type')+"</td>" 2427 html_str += "<td>"+n.get('type')+"</td>"
2503 html_str += "<td>"+n.getAttribute('bonus')+"</td></tr>" 2428 html_str += "<td>"+n.get('bonus')+"</td></tr>"
2504 html_str += """<tr BGCOLOR=#E9E9E9 >""" 2429 html_str += """<tr BGCOLOR=#E9E9E9 >"""
2505 html_str += "<th>Check Penalty</th><th>Spell Failure</th>" 2430 html_str += "<th>Check Penalty</th><th>Spell Failure</th>"
2506 html_str += "<th>Max Dex</th><th>Speed</th><th>Weight</th></tr>" 2431 html_str += "<th>Max Dex</th><th>Speed</th><th>Weight</th></tr>"
2507 html_str += "<tr ALIGN='center'>" 2432 html_str += "<tr ALIGN='center'>"
2508 html_str += "<td>"+n.getAttribute('checkpenalty')+"</td>" 2433 html_str += "<td>"+n.get('checkpenalty')+"</td>"
2509 html_str += "<td>"+n.getAttribute('spellfailure')+"</td>" 2434 html_str += "<td>"+n.get('spellfailure')+"</td>"
2510 html_str += "<td>"+n.getAttribute('maxdex')+"</td>" 2435 html_str += "<td>"+n.get('maxdex')+"</td>"
2511 html_str += "<td>"+n.getAttribute('speed')+"</td>" 2436 html_str += "<td>"+n.get('speed')+"</td>"
2512 html_str += "<td>"+n.getAttribute('weight')+"</td></tr></table>" 2437 html_str += "<td>"+n.get('weight')+"</td></tr></table>"
2513 return html_str 2438 return html_str
2514 2439
2515 2440
2516 class ac_panel(wx.Panel): 2441 class ac_panel(wx.Panel):
2517 def __init__(self, parent, handler): 2442 def __init__(self, parent, handler):
2518 pname = handler.master_dom.setAttribute("name", 'Armor') 2443 pname = handler.xml.set("name", 'Armor')
2519 self.hparent = handler #a 1.5002 allow ability to run up tree. 2444 self.hparent = handler #a 1.5002 allow ability to run up tree.
2520 #a 1.5002 we need the functional parent, not the invoking parent. 2445 #a 1.5002 we need the functional parent, not the invoking parent.
2521 2446
2522 wx.Panel.__init__(self, parent, -1) 2447 wx.Panel.__init__(self, parent, -1)
2523 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 2448 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
2538 2463
2539 #self.Bind(wx.EVT_SIZE, self.on_size) 2464 #self.Bind(wx.EVT_SIZE, self.on_size)
2540 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 2465 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
2541 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 2466 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
2542 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 2467 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
2543 self.master_dom = handler.master_dom 2468 self.xml = handler.xml
2544 n_list = handler.master_dom._get_childNodes() 2469 n_list = handler.xml.getchildren()
2545 self.n_list = n_list 2470 self.n_list = n_list
2546 col_names = ['Armor','bonus','maxdex','cp','sf','weight','speed','type'] 2471 col_names = ['Armor','bonus','maxdex','cp','sf','weight','speed','type']
2547 self.grid.CreateGrid(len(n_list),len(col_names),1) 2472 self.grid.CreateGrid(len(n_list),len(col_names),1)
2548 self.grid.SetRowLabelSize(0) 2473 self.grid.SetRowLabelSize(0)
2549 for i in range(len(col_names)): 2474 for i in range(len(col_names)):
2560 col = evt.GetCol() 2485 col = evt.GetCol()
2561 value = self.grid.GetCellValue(row,col) 2486 value = self.grid.GetCellValue(row,col)
2562 if col >= 1 and col <= 5: 2487 if col >= 1 and col <= 5:
2563 try: 2488 try:
2564 int(value) 2489 int(value)
2565 self.n_list[row].setAttribute(self.atts[col],value) 2490 self.n_list[row].set(self.atts[col],value)
2566 except: 2491 except:
2567 self.grid.SetCellValue(row,col,"0") 2492 self.grid.SetCellValue(row,col,"0")
2568 else: 2493 else:
2569 self.n_list[row].setAttribute(self.atts[col],value) 2494 self.n_list[row].set(self.atts[col],value)
2570 2495
2571 def refresh_row(self,i): 2496 def refresh_row(self,i):
2572 n = self.n_list[i] 2497 n = self.n_list[i]
2573 2498
2574 for y in range(len(self.atts)): 2499 for y in range(len(self.atts)):
2575 self.grid.SetCellValue(i,y,n.getAttribute(self.atts[y])) 2500 self.grid.SetCellValue(i,y,n.get(self.atts[y]))
2576 2501
2577 def on_remove(self,evt): 2502 def on_remove(self,evt):
2578 rows = self.grid.GetNumberRows() 2503 rows = self.grid.GetNumberRows()
2579 for i in range(rows): 2504 for i in range(rows):
2580 if self.grid.IsInSelection(i,0): 2505 if self.grid.IsInSelection(i,0):
2581 self.grid.DeleteRows(i) 2506 self.grid.DeleteRows(i)
2582 self.master_dom.removeChild(self.n_list[i]) 2507 self.xml.remove(self.n_list[i])
2583 2508
2584 def on_add(self,evt): 2509 def on_add(self,evt):
2585 if not self.temp_dom: 2510 if not self.temp_dom:
2586 tmp = open(dir_struct["dnd3e"]+"dnd3earmor.xml","r") 2511 tree = parse(dir_struct["dnd3e"]+"dnd3earmor.xml")
2587 xml_dom = parseXml_with_dlg(self,tmp.read()) 2512 xml_dom = tree.getroot()
2588 xml_dom = xml_dom._get_firstChild()
2589 tmp.close()
2590 self.temp_dom = xml_dom 2513 self.temp_dom = xml_dom
2591 f_list = self.temp_dom.getElementsByTagName('armor') 2514 f_list = self.temp_dom.findall('armor')
2592 opts = [] 2515 opts = []
2593 for f in f_list: 2516 for f in f_list:
2594 opts.append(f.getAttribute('name')) 2517 opts.append(f.get('name'))
2595 dlg = wx.SingleChoiceDialog(self,'Choose Armor:','Armor List',opts) 2518 dlg = wx.SingleChoiceDialog(self,'Choose Armor:','Armor List',opts)
2596 if dlg.ShowModal() == wx.ID_OK: 2519 if dlg.ShowModal() == wx.ID_OK:
2597 i = dlg.GetSelection() 2520 i = dlg.GetSelection()
2598 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 2521 new_node = self.xml.append(f_list[i])
2599 self.grid.AppendRows(1) 2522 self.grid.AppendRows(1)
2600 self.refresh_row(self.grid.GetNumberRows()-1) 2523 self.refresh_row(self.grid.GetNumberRows()-1)
2601 dlg.Destroy() 2524 dlg.Destroy()
2602 2525
2603 def on_size(self,event): 2526 def on_size(self,event):
2629 self.new_child_handler('powers','Powers',dnd3epowers,'book') 2552 self.new_child_handler('powers','Powers',dnd3epowers,'book')
2630 self.new_child_handler('pp','Power Points',dnd3epp,'gear') 2553 self.new_child_handler('pp','Power Points',dnd3epp,'gear')
2631 self.myeditor = None 2554 self.myeditor = None
2632 2555
2633 def new_child_handler(self,tag,text,handler_class,icon='gear'): 2556 def new_child_handler(self,tag,text,handler_class,icon='gear'):
2634 node_list = self.master_dom.getElementsByTagName(tag) 2557 node_list = self.xml.findall(tag)
2635 tree = self.tree 2558 tree = self.tree
2636 i = self.tree.icons[icon] 2559 i = self.tree.icons[icon]
2637 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i) 2560 new_tree_node = tree.AppendItem(self.mytree_node,text,i,i)
2638 handler = handler_class(node_list[0],new_tree_node,self) 2561 handler = handler_class(node_list[0],new_tree_node,self)
2639 tree.SetPyData(new_tree_node,handler) 2562 tree.SetPyData(new_tree_node,handler)
2675 return 2598 return
2676 2599
2677 def on_html(self,evt): 2600 def on_html(self,evt):
2678 html_str = self.tohtml() 2601 html_str = self.tohtml()
2679 wnd = http_html_window(self.frame.note,-1) 2602 wnd = http_html_window(self.frame.note,-1)
2680 wnd.title = self.master_dom.getAttribute('name') 2603 wnd.title = self.xml.get('name')
2681 self.frame.add_panel(wnd) 2604 self.frame.add_panel(wnd)
2682 wnd.SetPage(html_str) 2605 wnd.SetPage(html_str)
2683 2606
2684 def get_design_panel(self,parent): 2607 def get_design_panel(self,parent):
2685 pass 2608 pass
2700 self.hparent = parent #a 1.5002 allow ability to run up tree. 2623 self.hparent = parent #a 1.5002 allow ability to run up tree.
2701 self.root = getRoot(self) #a 1.5002 2624 self.root = getRoot(self) #a 1.5002
2702 self.root.spells = self #a 1.6009 2625 self.root.spells = self #a 1.6009
2703 2626
2704 2627
2705 node_list = self.master_dom.getElementsByTagName( 'spell' ) 2628 node_list = self.xml.findall( 'spell' )
2706 self.spells = {} 2629 self.spells = {}
2707 tree = self.tree 2630 tree = self.tree
2708 icons = self.tree.icons 2631 icons = self.tree.icons
2709 for n in node_list: 2632 for n in node_list:
2710 name = n.getAttribute('name') 2633 name = n.get('name')
2711 self.spells[ name ] = n 2634 self.spells[ name ] = n
2712 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['gear'], icons['gear'] ) 2635 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['gear'], icons['gear'] )
2713 tree.SetPyData( new_tree_node, self ) 2636 tree.SetPyData( new_tree_node, self )
2714 2637
2715 def on_rclick( self, evt ): 2638 def on_rclick( self, evt ):
2716 item = self.tree.GetSelection() 2639 item = self.tree.GetSelection()
2717 name = self.tree.GetItemText( item ) 2640 name = self.tree.GetItemText( item )
2718 if item == self.mytree_node: 2641 if item == self.mytree_node:
2719 dnd3e_char_child.on_ldclick( self, evt ) 2642 dnd3e_char_child.on_ldclick( self, evt )
2720 else: 2643 else:
2721 level = self.spells[ name ].getAttribute( 'level' ) 2644 level = self.spells[ name ].get( 'level' )
2722 descr = self.spells[ name ].getAttribute( 'desc' ) 2645 descr = self.spells[ name ].get( 'desc' )
2723 use = self.spells[ name ].getAttribute( 'used' ) 2646 use = self.spells[ name ].get( 'used' )
2724 memrz = self.spells[ name ].getAttribute( 'memrz' ) 2647 memrz = self.spells[ name ].get( 'memrz' )
2725 use += '+1' 2648 use += '+1'
2726 charNameL=self.root.general.charName #a 1.5002 2649 charNameL=self.root.general.charName #a 1.5002
2727 left = eval( '%s - ( %s )' % ( memrz, use ) ) 2650 left = eval( '%s - ( %s )' % ( memrz, use ) )
2728 if left < 0: 2651 if left < 0:
2729 txt = '%s Tried to cast %s but has used all of them for today,' 2652 txt = '%s Tried to cast %s but has used all of them for today,'
2738 if left != 1: 2661 if left != 1:
2739 s = 's' 2662 s = 's'
2740 #txt = '%s can cast %s %d more time%s' % ( dnd_globals["gen"]["Name"], name, left, s )#d 1.5002 2663 #txt = '%s can cast %s %d more time%s' % ( dnd_globals["gen"]["Name"], name, left, s )#d 1.5002
2741 txt = '%s can cast %s %d more time%s' % ( charNameL, name, left, s ) #a 1.5002 2664 txt = '%s can cast %s %d more time%s' % ( charNameL, name, left, s ) #a 1.5002
2742 self.chat.ParsePost( txt, False, False ) 2665 self.chat.ParsePost( txt, False, False )
2743 self.spells[ name ].setAttribute( 'used', `eval( use )` ) 2666 self.spells[ name ].set( 'used', `eval( use )` )
2744 2667
2745 def refresh_spells(self): 2668 def refresh_spells(self):
2746 self.spells = {} 2669 self.spells = {}
2747 tree = self.tree 2670 tree = self.tree
2748 icons = self.tree.icons 2671 icons = self.tree.icons
2749 tree.CollapseAndReset(self.mytree_node) 2672 tree.CollapseAndReset(self.mytree_node)
2750 node_list = self.master_dom.getElementsByTagName('spell') 2673 node_list = self.xml.findall('spell')
2751 for n in node_list: 2674 for n in node_list:
2752 name = n.getAttribute('name') 2675 name = n.get('name')
2753 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear']) 2676 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear'])
2754 tree.SetPyData(new_tree_node,self) 2677 tree.SetPyData(new_tree_node,self)
2755 self.spells[name]=n 2678 self.spells[name]=n
2756 2679
2757 def get_design_panel(self,parent): 2680 def get_design_panel(self,parent):
2759 wnd.title = "Spells" 2682 wnd.title = "Spells"
2760 return wnd 2683 return wnd
2761 2684
2762 def tohtml(self): 2685 def tohtml(self):
2763 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Arcane Spells</th></tr><tr><td><br>" 2686 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Arcane Spells</th></tr><tr><td><br>"
2764 n_list = self.master_dom._get_childNodes() 2687 n_list = self.xml.getchildren()
2765 for n in n_list: 2688 for n in n_list:
2766 html_str += "(" + n.getAttribute('level') + ") " + n.getAttribute('name')+ ", " 2689 html_str += "(" + n.get('level') + ") " + n.get('name')+ ", "
2767 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 2690 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
2768 return html_str 2691 return html_str
2769 2692
2770 def get_char_lvl( self, attr ): 2693 def get_char_lvl( self, attr ):
2771 return self.char_hander.get_char_lvl(attr) 2694 return self.char_hander.get_char_lvl(attr)
2772 2695
2773 class spells_panel(wx.Panel): 2696 class spells_panel(wx.Panel):
2774 def __init__(self, parent, handler): 2697 def __init__(self, parent, handler):
2775 pname = handler.master_dom.setAttribute("name", 'Arcane Spells') 2698 pname = handler.xml.set("name", 'Arcane Spells')
2776 self.hparent = handler #a 1.5002 allow ability to run up tree. 2699 self.hparent = handler #a 1.5002 allow ability to run up tree.
2777 #a 1.5002 in this case, we need the functional parent, not the invoking parent. 2700 #a 1.5002 in this case, we need the functional parent, not the invoking parent.
2778 2701
2779 wx.Panel.__init__(self, parent, -1) 2702 wx.Panel.__init__(self, parent, -1)
2780 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 2703 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
2798 #self.Bind(wx.EVT_SIZE, self.on_size) 2721 #self.Bind(wx.EVT_SIZE, self.on_size)
2799 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 2722 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
2800 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 2723 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
2801 self.Bind(wx.EVT_BUTTON, self.on_refresh_spells, id=30) 2724 self.Bind(wx.EVT_BUTTON, self.on_refresh_spells, id=30)
2802 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 2725 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
2803 n_list = handler.master_dom._get_childNodes() 2726 n_list = handler.xml.getchildren()
2804 self.n_list = n_list 2727 self.n_list = n_list
2805 self.master_dom = handler.master_dom 2728 self.xml = handler.xml
2806 self.grid.CreateGrid(len(n_list),4,1) 2729 self.grid.CreateGrid(len(n_list),4,1)
2807 self.grid.SetRowLabelSize(0) 2730 self.grid.SetRowLabelSize(0)
2808 self.grid.SetColLabelValue(0,"No.") 2731 self.grid.SetColLabelValue(0,"No.")
2809 self.grid.SetColLabelValue(1,"Lvl") 2732 self.grid.SetColLabelValue(1,"Lvl")
2810 self.grid.SetColLabelValue(2,"Spell") 2733 self.grid.SetColLabelValue(2,"Spell")
2816 def on_cell_change(self,evt): 2739 def on_cell_change(self,evt):
2817 row = evt.GetRow() 2740 row = evt.GetRow()
2818 col = evt.GetCol() 2741 col = evt.GetCol()
2819 value = self.grid.GetCellValue(row,col) 2742 value = self.grid.GetCellValue(row,col)
2820 if col == 0: 2743 if col == 0:
2821 self.n_list[row].setAttribute('memrz',value) 2744 self.n_list[row].set('memrz',value)
2822 2745
2823 2746
2824 def refresh_row(self,i): 2747 def refresh_row(self,i):
2825 spell = self.n_list[i] 2748 spell = self.n_list[i]
2826 2749
2827 memrz = spell.getAttribute('memrz') 2750 memrz = spell.get('memrz')
2828 name = spell.getAttribute('name') 2751 name = spell.get('name')
2829 type = spell.getAttribute('desc') 2752 type = spell.get('desc')
2830 level = spell.getAttribute('level') 2753 level = spell.get('level')
2831 self.grid.SetCellValue(i,0,memrz) 2754 self.grid.SetCellValue(i,0,memrz)
2832 self.grid.SetCellValue(i,2,name) 2755 self.grid.SetCellValue(i,2,name)
2833 self.grid.SetReadOnly(i,2) 2756 self.grid.SetReadOnly(i,2)
2834 self.grid.SetCellValue(i,3,type) 2757 self.grid.SetCellValue(i,3,type)
2835 self.grid.SetReadOnly(i,3) 2758 self.grid.SetReadOnly(i,3)
2839 def on_remove(self,evt): 2762 def on_remove(self,evt):
2840 rows = self.grid.GetNumberRows() 2763 rows = self.grid.GetNumberRows()
2841 for i in range(rows): 2764 for i in range(rows):
2842 if self.grid.IsInSelection(i,0): 2765 if self.grid.IsInSelection(i,0):
2843 self.grid.DeleteRows(i) 2766 self.grid.DeleteRows(i)
2844 self.master_dom.removeChild(self.n_list[i]) 2767 self.xml.remove(self.n_list[i])
2845 2768
2846 def on_add(self,evt): 2769 def on_add(self,evt):
2847 2770 debug()
2848 if not self.temp_dom: 2771 if not self.temp_dom:
2849 tmp = open(dir_struct["dnd3e"]+"dnd3espells.xml","r") 2772 tree = parse(dir_struct["dnd3e"]+"dnd3espells.xml")
2850 xml_dom = parseXml_with_dlg(self,tmp.read()) 2773 xml_dom = tree.getroot()
2851 xml_dom = xml_dom._get_firstChild()
2852 tmp.close()
2853 self.temp_dom = xml_dom 2774 self.temp_dom = xml_dom
2854 f_list = self.temp_dom.getElementsByTagName('spell') 2775 debug(self.temp_dom)
2776 f_list = self.temp_dom.findall('spell')
2855 opts = [] 2777 opts = []
2856 #lvl = int(dnd3e_char_child.get_char_lvl('level')) 2778 #lvl = int(dnd3e_char_child.get_char_lvl('level'))
2857 #castlvl = eval('%s/2' % (lvl)) 2779 #castlvl = eval('%s/2' % (lvl))
2858 for f in f_list: 2780 for f in f_list:
2859 spelllvl = f.getAttribute('level') 2781 spelllvl = f.get('level')
2860 #if spelllvl <= "1": 2782 #if spelllvl <= "1":
2861 # opts.append("(" + f.getAttribute('level') + ")" + f.getAttribute('name')) 2783 # opts.append("(" + f.get('level') + ")" + f.get('name'))
2862 #else: 2784 #else:
2863 # if eval('%d >= %s' %(castlvl, spelllvl)): 2785 # if eval('%d >= %s' %(castlvl, spelllvl)):
2864 opts.append("(" + f.getAttribute('level') + ")" + f.getAttribute('name')) 2786 opts.append("(" + f.get('level') + ")" + f.get('name'))
2865 dlg = wx.SingleChoiceDialog(self,'Choose Spell','Spells',opts) 2787 dlg = wx.SingleChoiceDialog(self,'Choose Spell','Spells',opts)
2866 if dlg.ShowModal() == wx.ID_OK: 2788 if dlg.ShowModal() == wx.ID_OK:
2867 i = dlg.GetSelection() 2789 i = dlg.GetSelection()
2868 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 2790 new_node = self.xml.append(f_list[i])
2869 self.grid.AppendRows(1) 2791 self.grid.AppendRows(1)
2870 self.n_list = self.master_dom.getElementsByTagName('spell') 2792 self.n_list = self.xml.findall('spell')
2871 self.refresh_row(self.grid.GetNumberRows()-1) 2793 self.refresh_row(self.grid.GetNumberRows()-1)
2872 self.handler.refresh_spells() 2794 self.handler.refresh_spells()
2873 dlg.Destroy() 2795 dlg.Destroy()
2874 2796
2875 def on_refresh_spells( self, evt ): 2797 def on_refresh_spells( self, evt ):
2876 f_list = self.master_dom.getElementsByTagName('spell') 2798 f_list = self.xml.findall('spell')
2877 2799
2878 for spell in f_list: 2800 for spell in f_list:
2879 spell.setAttribute( 'used', '0' ) 2801 spell.set( 'used', '0' )
2880 2802
2881 def on_size(self,event): 2803 def on_size(self,event):
2882 s = self.GetClientSizeTuple() 2804 s = self.GetClientSizeTuple()
2883 self.grid.SetDimensions(0,0,s[0],s[1]-25) 2805 self.grid.SetDimensions(0,0,s[0],s[1]-25)
2884 self.sizer.SetDimension(0,s[1]-25,s[0],25) 2806 self.sizer.SetDimension(0,s[1]-25,s[0],25)
2905 self.hparent = parent #a 1.5002 allow ability to run up tree. 2827 self.hparent = parent #a 1.5002 allow ability to run up tree.
2906 self.root = getRoot(self) #a 1.5002 2828 self.root = getRoot(self) #a 1.5002
2907 self.root.divine = self #a 1.6009 2829 self.root.divine = self #a 1.6009
2908 2830
2909 2831
2910 node_list = self.master_dom.getElementsByTagName( 'gift' ) 2832 node_list = self.xml.findall( 'gift' )
2911 self.spells = {} 2833 self.spells = {}
2912 tree = self.tree 2834 tree = self.tree
2913 icons = self.tree.icons 2835 icons = self.tree.icons
2914 for n in node_list: 2836 for n in node_list:
2915 name = n.getAttribute('name') 2837 name = n.get('name')
2916 self.spells[ name ] = n 2838 self.spells[ name ] = n
2917 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['flask'], icons['flask'] ) 2839 new_tree_node = tree.AppendItem( self.mytree_node, name, icons['flask'], icons['flask'] )
2918 tree.SetPyData( new_tree_node, self ) 2840 tree.SetPyData( new_tree_node, self )
2919 2841
2920 def on_rclick( self, evt ): 2842 def on_rclick( self, evt ):
2922 item = self.tree.GetSelection() 2844 item = self.tree.GetSelection()
2923 name = self.tree.GetItemText( item ) 2845 name = self.tree.GetItemText( item )
2924 if item == self.mytree_node: 2846 if item == self.mytree_node:
2925 dnd3e_char_child.on_ldclick( self, evt ) 2847 dnd3e_char_child.on_ldclick( self, evt )
2926 else: 2848 else:
2927 level = self.spells[ name ].getAttribute( 'level' ) 2849 level = self.spells[ name ].get( 'level' )
2928 descr = self.spells[ name ].getAttribute( 'desc' ) 2850 descr = self.spells[ name ].get( 'desc' )
2929 use = self.spells[ name ].getAttribute( 'used' ) 2851 use = self.spells[ name ].get( 'used' )
2930 memrz = self.spells[ name ].getAttribute( 'memrz' ) 2852 memrz = self.spells[ name ].get( 'memrz' )
2931 use += '+1' 2853 use += '+1'
2932 left = eval( '%s - ( %s )' % ( memrz, use ) ) 2854 left = eval( '%s - ( %s )' % ( memrz, use ) )
2933 if left < 0: 2855 if left < 0:
2934 txt = '%s Tried to cast %s but has used all of them for today,' #m 1.5002 break in 2. 2856 txt = '%s Tried to cast %s but has used all of them for today,' #m 1.5002 break in 2.
2935 txt += "Please rest so I can cast more."' % ( charNameL, name )' #a 1.5002 2857 txt += "Please rest so I can cast more."' % ( charNameL, name )' #a 1.5002
2943 if left != 1: 2865 if left != 1:
2944 s = 's' 2866 s = 's'
2945 #txt = '%s can cast %s %d more time%s' % ( dnd_globals["gen"]["Name"], name, left, s ) #d 1.5002 2867 #txt = '%s can cast %s %d more time%s' % ( dnd_globals["gen"]["Name"], name, left, s ) #d 1.5002
2946 txt = '%s can cast %s %d more time%s' % ( charNameL, name, left, s ) #a 1.5002 2868 txt = '%s can cast %s %d more time%s' % ( charNameL, name, left, s ) #a 1.5002
2947 self.chat.ParsePost( txt, False, False ) 2869 self.chat.ParsePost( txt, False, False )
2948 self.spells[ name ].setAttribute( 'used', `eval( use )` ) 2870 self.spells[ name ].set( 'used', `eval( use )` )
2949 2871
2950 def refresh_spells(self): 2872 def refresh_spells(self):
2951 self.spells = {} 2873 self.spells = {}
2952 tree = self.tree 2874 tree = self.tree
2953 icons = self.tree.icons 2875 icons = self.tree.icons
2954 tree.CollapseAndReset(self.mytree_node) 2876 tree.CollapseAndReset(self.mytree_node)
2955 2877
2956 node_list = self.master_dom.getElementsByTagName('gift') 2878 node_list = self.xml.findall('gift')
2957 for n in node_list: 2879 for n in node_list:
2958 name = n.getAttribute('name') 2880 name = n.get('name')
2959 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['flask'],icons['flask']) 2881 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['flask'],icons['flask'])
2960 tree.SetPyData(new_tree_node,self) 2882 tree.SetPyData(new_tree_node,self)
2961 self.spells[name]=n 2883 self.spells[name]=n
2962 2884
2963 def get_design_panel(self,parent): 2885 def get_design_panel(self,parent):
2965 wnd.title = "Spells" 2887 wnd.title = "Spells"
2966 return wnd 2888 return wnd
2967 2889
2968 def tohtml(self): 2890 def tohtml(self):
2969 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Divine Spells</th></tr><tr><td><br>" 2891 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Divine Spells</th></tr><tr><td><br>"
2970 n_list = self.master_dom._get_childNodes() 2892 n_list = self.xml.getchildren()
2971 for n in n_list: 2893 for n in n_list:
2972 html_str += "(" + n.getAttribute('level') + ") " + n.getAttribute('name')+ ", " 2894 html_str += "(" + n.get('level') + ") " + n.get('name')+ ", "
2973 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 2895 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
2974 return html_str 2896 return html_str
2975 2897
2976 def get_char_lvl( self, attr ): 2898 def get_char_lvl( self, attr ):
2977 return self.char_hander.get_char_lvl(attr) 2899 return self.char_hander.get_char_lvl(attr)
2978 2900
2979 class divine_panel(wx.Panel): 2901 class divine_panel(wx.Panel):
2980 def __init__(self, parent, handler): 2902 def __init__(self, parent, handler):
2981 pname = handler.master_dom.setAttribute("name", 'Divine Spells') 2903 pname = handler.xml.set("name", 'Divine Spells')
2982 self.hparent = handler #a 1.5002 allow ability to run up tree. 2904 self.hparent = handler #a 1.5002 allow ability to run up tree.
2983 #a 1.5002 in this case, we need the functional parent, not the invoking parent. 2905 #a 1.5002 in this case, we need the functional parent, not the invoking parent.
2984 2906
2985 wx.Panel.__init__(self, parent, -1) 2907 wx.Panel.__init__(self, parent, -1)
2986 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS) 2908 self.grid =wx.grid.Grid(self, -1, style=wx.SUNKEN_BORDER | wx.WANTS_CHARS)
3005 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 2927 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
3006 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 2928 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
3007 self.Bind(wx.EVT_BUTTON, self.on_refresh_spells, id=30) 2929 self.Bind(wx.EVT_BUTTON, self.on_refresh_spells, id=30)
3008 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 2930 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
3009 2931
3010 n_list = handler.master_dom._get_childNodes() 2932 n_list = handler.xml.getchildren()
3011 self.n_list = n_list 2933 self.n_list = n_list
3012 self.master_dom = handler.master_dom 2934 self.xml = handler.xml
3013 self.grid.CreateGrid(len(n_list),4,1) 2935 self.grid.CreateGrid(len(n_list),4,1)
3014 self.grid.SetRowLabelSize(0) 2936 self.grid.SetRowLabelSize(0)
3015 self.grid.SetColLabelValue(0,"No.") 2937 self.grid.SetColLabelValue(0,"No.")
3016 self.grid.SetColLabelValue(1,"Lvl") 2938 self.grid.SetColLabelValue(1,"Lvl")
3017 self.grid.SetColLabelValue(2,"Spell") 2939 self.grid.SetColLabelValue(2,"Spell")
3024 row = evt.GetRow() 2946 row = evt.GetRow()
3025 2947
3026 col = evt.GetCol() 2948 col = evt.GetCol()
3027 value = self.grid.GetCellValue(row,col) 2949 value = self.grid.GetCellValue(row,col)
3028 if col == 0: 2950 if col == 0:
3029 self.n_list[row].setAttribute('memrz',value) 2951 self.n_list[row].set('memrz',value)
3030 2952
3031 2953
3032 def refresh_row(self,i): 2954 def refresh_row(self,i):
3033 spell = self.n_list[i] 2955 spell = self.n_list[i]
3034 2956
3035 memrz = spell.getAttribute('memrz') 2957 memrz = spell.get('memrz')
3036 name = spell.getAttribute('name') 2958 name = spell.get('name')
3037 type = spell.getAttribute('desc') 2959 type = spell.get('desc')
3038 level = spell.getAttribute('level') 2960 level = spell.get('level')
3039 self.grid.SetCellValue(i,0,memrz) 2961 self.grid.SetCellValue(i,0,memrz)
3040 self.grid.SetCellValue(i,2,name) 2962 self.grid.SetCellValue(i,2,name)
3041 self.grid.SetReadOnly(i,2) 2963 self.grid.SetReadOnly(i,2)
3042 self.grid.SetCellValue(i,3,type) 2964 self.grid.SetCellValue(i,3,type)
3043 self.grid.SetReadOnly(i,3) 2965 self.grid.SetReadOnly(i,3)
3047 def on_remove(self,evt): 2969 def on_remove(self,evt):
3048 rows = self.grid.GetNumberRows() 2970 rows = self.grid.GetNumberRows()
3049 for i in range(rows): 2971 for i in range(rows):
3050 if self.grid.IsInSelection(i,0): 2972 if self.grid.IsInSelection(i,0):
3051 self.grid.DeleteRows(i) 2973 self.grid.DeleteRows(i)
3052 self.master_dom.removeChild(self.n_list[i]) 2974 self.xml.remove(self.n_list[i])
3053 2975
3054 def on_add(self,evt): 2976 def on_add(self,evt):
3055 if not self.temp_dom: 2977 if not self.temp_dom:
3056 tmp = open(dir_struct["dnd3e"]+"dnd3edivine.xml","r") 2978 tree = parse(dir_struct["dnd3e"]+"dnd3edivine.xml")
3057 2979 xml_dom = tree.getroot()
3058 xml_dom = parseXml_with_dlg(self,tmp.read())
3059 xml_dom = xml_dom._get_firstChild()
3060 tmp.close()
3061 self.temp_dom = xml_dom 2980 self.temp_dom = xml_dom
3062 f_list = self.temp_dom.getElementsByTagName('gift') 2981 f_list = self.temp_dom.findall('gift')
3063 opts = [] 2982 opts = []
3064 #lvl = int(dnd3e_char_child.get_char_lvl('level')) 2983 #lvl = int(dnd3e_char_child.get_char_lvl('level'))
3065 #castlvl = lvl / 2 2984 #castlvl = lvl / 2
3066 for f in f_list: 2985 for f in f_list:
3067 spelllvl = f.getAttribute('level') 2986 spelllvl = f.get('level')
3068 #if spelllvl <= "1": 2987 #if spelllvl <= "1":
3069 # opts.append("(" + f.getAttribute('level') + ")" + f.getAttribute('name')) 2988 # opts.append("(" + f.get('level') + ")" + f.get('name'))
3070 #else: 2989 #else:
3071 # if eval('%d >= %s' %(castlvl, spelllvl)): 2990 # if eval('%d >= %s' %(castlvl, spelllvl)):
3072 opts.append("(" + f.getAttribute('level') + ")" + f.getAttribute('name')) 2991 opts.append("(" + f.get('level') + ")" + f.get('name'))
3073 dlg = wx.SingleChoiceDialog(self,'Choose Spell','Spells',opts) 2992 dlg = wx.SingleChoiceDialog(self,'Choose Spell','Spells',opts)
3074 if dlg.ShowModal() == wx.ID_OK: 2993 if dlg.ShowModal() == wx.ID_OK:
3075 i = dlg.GetSelection() 2994 i = dlg.GetSelection()
3076 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 2995 new_node = self.xml.append(f_list[i])
3077 self.grid.AppendRows(1) 2996 self.grid.AppendRows(1)
3078 self.n_list = self.master_dom.getElementsByTagName('gift') 2997 self.n_list = self.xml.findall('gift')
3079 self.refresh_row(self.grid.GetNumberRows()-1) 2998 self.refresh_row(self.grid.GetNumberRows()-1)
3080 self.handler.refresh_spells() 2999 self.handler.refresh_spells()
3081 dlg.Destroy() 3000 dlg.Destroy()
3082 3001
3083 def on_refresh_spells( self, evt ): 3002 def on_refresh_spells( self, evt ):
3084 f_list = self.master_dom.getElementsByTagName('gift') 3003 f_list = self.xml.findall('gift')
3085 for spell in f_list: 3004 for spell in f_list:
3086 spell.setAttribute( 'used', '0' ) 3005 spell.set( 'used', '0' )
3087 3006
3088 def on_size(self,event): 3007 def on_size(self,event):
3089 s = self.GetClientSizeTuple() 3008 s = self.GetClientSizeTuple()
3090 self.grid.SetDimensions(0,0,s[0],s[1]-25) 3009 self.grid.SetDimensions(0,0,s[0],s[1]-25)
3091 self.sizer.SetDimension(0,s[1]-25,s[0],25) 3010 self.sizer.SetDimension(0,s[1]-25,s[0],25)
3113 snp_char_child.__init__(self,xml_dom,tree_node,parent) 3032 snp_char_child.__init__(self,xml_dom,tree_node,parent)
3114 self.hparent = parent #a 1.5002 allow ability to run up tree. 3033 self.hparent = parent #a 1.5002 allow ability to run up tree.
3115 self.root = getRoot(self) #a 1.5002 3034 self.root = getRoot(self) #a 1.5002
3116 self.root.powers = self #a 1.6009 3035 self.root.powers = self #a 1.6009
3117 3036
3118 node_list = self.master_dom.getElementsByTagName( 'power' ) 3037 node_list = self.xml.findall( 'power' )
3119 self.powers = {} 3038 self.powers = {}
3120 tree = self.tree 3039 tree = self.tree
3121 icons = self.tree.icons 3040 icons = self.tree.icons
3122 for n in node_list: 3041 for n in node_list:
3123 name = n.getAttribute('name') 3042 name = n.get('name')
3124 self.powers[ name ] = n 3043 self.powers[ name ] = n
3125 new_tree_node = tree.AppendItem( self.mytree_node, name, 3044 new_tree_node = tree.AppendItem( self.mytree_node, name,
3126 icons['gear'], icons['gear'] ) 3045 icons['gear'], icons['gear'] )
3127 tree.SetPyData( new_tree_node, self ) 3046 tree.SetPyData( new_tree_node, self )
3128 3047
3133 name = self.tree.GetItemText( item ) 3052 name = self.tree.GetItemText( item )
3134 charNameL = self.root.general.charName #a 1.5002 3053 charNameL = self.root.general.charName #a 1.5002
3135 if item == self.mytree_node: 3054 if item == self.mytree_node:
3136 dnd3e_char_child.on_ldclick( self, evt ) 3055 dnd3e_char_child.on_ldclick( self, evt )
3137 else: 3056 else:
3138 level = int(self.powers[ name ].getAttribute( 'level' )) 3057 level = int(self.powers[ name ].get( 'level' ))
3139 descr = self.powers[ name ].getAttribute( 'desc' ) 3058 descr = self.powers[ name ].get( 'desc' )
3140 #use can be removed -mgt 3059 #use can be removed -mgt
3141 #use = self.powers[ name ].getAttribute( 'used' ) 3060 #use = self.powers[ name ].get( 'used' )
3142 points = self.powers[ name ].getAttribute( 'point' ) 3061 points = self.powers[ name ].get( 'point' )
3143 #cpp and fre are strings without the eval -mgt 3062 #cpp and fre are strings without the eval -mgt
3144 cpp = eval(self.root.pp.get_char_pp('current1')) #a 1.5002 3063 cpp = eval(self.root.pp.get_char_pp('current1')) #a 1.5002
3145 fre = eval(self.root.pp.get_char_pp('free')) #a 1.5002 3064 fre = eval(self.root.pp.get_char_pp('free')) #a 1.5002
3146 if level == 0 and fre > 0: 3065 if level == 0 and fre > 0:
3147 left = eval('%s - ( %s )' % ( fre, points )) 3066 left = eval('%s - ( %s )' % ( fre, points ))
3184 self.powers = {} 3103 self.powers = {}
3185 3104
3186 tree = self.tree 3105 tree = self.tree
3187 icons = self.tree.icons 3106 icons = self.tree.icons
3188 tree.CollapseAndReset(self.mytree_node) 3107 tree.CollapseAndReset(self.mytree_node)
3189 node_list = self.master_dom.getElementsByTagName('power') 3108 node_list = self.xml.findall('power')
3190 for n in node_list: 3109 for n in node_list:
3191 name = n.getAttribute('name') 3110 name = n.get('name')
3192 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear']) 3111 new_tree_node = tree.AppendItem(self.mytree_node,name,icons['gear'],icons['gear'])
3193 tree.SetPyData(new_tree_node,self) 3112 tree.SetPyData(new_tree_node,self)
3194 self.powers[name]=n 3113 self.powers[name]=n
3195 3114
3196 def get_design_panel(self,parent): 3115 def get_design_panel(self,parent):
3198 wnd.title = "Powers" 3117 wnd.title = "Powers"
3199 return wnd 3118 return wnd
3200 3119
3201 def tohtml(self): 3120 def tohtml(self):
3202 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Powers</th></tr><tr><td><br>" 3121 html_str = "<table width=100% border=1 ><tr BGCOLOR=#E9E9E9 ><th>Powers</th></tr><tr><td><br>"
3203 n_list = self.master_dom._get_childNodes() 3122 n_list = self.xml.getchildren()
3204 for n in n_list: 3123 for n in n_list:
3205 html_str += "(" + n.getAttribute('level') + ") " + n.getAttribute('name')+ ", " 3124 html_str += "(" + n.get('level') + ") " + n.get('name')+ ", "
3206 html_str = html_str[:len(html_str)-2] + "</td></tr></table>" 3125 html_str = html_str[:len(html_str)-2] + "</td></tr></table>"
3207 return html_str 3126 return html_str
3208 3127
3209 3128
3210 class power_panel(wx.Panel): 3129 class power_panel(wx.Panel):
3211 def __init__(self, parent, handler): 3130 def __init__(self, parent, handler):
3212 #m 1.5015 corrected typo, was Pionic. 3131 #m 1.5015 corrected typo, was Pionic.
3213 pname = handler.master_dom.setAttribute("name", 'Psionic Powers') 3132 pname = handler.xml.set("name", 'Psionic Powers')
3214 self.hparent = handler #a 1.5002 allow ability to run up tree. In this 3133 self.hparent = handler #a 1.5002 allow ability to run up tree. In this
3215 #a 1.5002 case, we need the functional parent, not the invoking parent. 3134 #a 1.5002 case, we need the functional parent, not the invoking parent.
3216 self.root = getRoot(self) #a (debug) 1.5002,1.5014 3135 self.root = getRoot(self) #a (debug) 1.5002,1.5014
3217 3136
3218 wx.Panel.__init__(self, parent, -1) 3137 wx.Panel.__init__(self, parent, -1)
3237 3156
3238 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10) 3157 self.Bind(wx.EVT_BUTTON, self.on_remove, id=10)
3239 self.Bind(wx.EVT_BUTTON, self.on_add, id=20) 3158 self.Bind(wx.EVT_BUTTON, self.on_add, id=20)
3240 self.Bind(wx.EVT_BUTTON, self.on_refresh_powers, id=30) 3159 self.Bind(wx.EVT_BUTTON, self.on_refresh_powers, id=30)
3241 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change) 3160 self.grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_change)
3242 n_list = handler.master_dom._get_childNodes() 3161 n_list = handler.xml.getchildren()
3243 self.n_list = n_list 3162 self.n_list = n_list
3244 self.master_dom = handler.master_dom 3163 self.xml = handler.xml
3245 self.grid.CreateGrid(len(n_list),5,1) 3164 self.grid.CreateGrid(len(n_list),5,1)
3246 self.grid.SetRowLabelSize(0) 3165 self.grid.SetRowLabelSize(0)
3247 self.grid.SetColLabelValue(0,"PP") 3166 self.grid.SetColLabelValue(0,"PP")
3248 self.grid.SetColLabelValue(1,"Lvl") 3167 self.grid.SetColLabelValue(1,"Lvl")
3249 self.grid.SetColLabelValue(2,"Power") 3168 self.grid.SetColLabelValue(2,"Power")
3257 def on_cell_change(self,evt): 3176 def on_cell_change(self,evt):
3258 row = evt.GetRow() 3177 row = evt.GetRow()
3259 col = evt.GetCol() 3178 col = evt.GetCol()
3260 value = self.grid.GetCellValue(row,col) 3179 value = self.grid.GetCellValue(row,col)
3261 """if col == 0: 3180 """if col == 0:
3262 self.n_list[row].setAttribute('memrz',value)""" 3181 self.n_list[row].set('memrz',value)"""
3263 3182
3264 3183
3265 def refresh_row(self,i): 3184 def refresh_row(self,i):
3266 power = self.n_list[i] 3185 power = self.n_list[i]
3267 3186
3268 point = power.getAttribute('point') 3187 point = power.get('point')
3269 name = power.getAttribute('name') 3188 name = power.get('name')
3270 type = power.getAttribute('desc') 3189 type = power.get('desc')
3271 test = power.getAttribute('test') 3190 test = power.get('test')
3272 level = power.getAttribute('level') 3191 level = power.get('level')
3273 self.grid.SetCellValue(i,0,point) 3192 self.grid.SetCellValue(i,0,point)
3274 self.grid.SetReadOnly(i,0) 3193 self.grid.SetReadOnly(i,0)
3275 self.grid.SetCellValue(i,1,level) 3194 self.grid.SetCellValue(i,1,level)
3276 self.grid.SetReadOnly(i,1) 3195 self.grid.SetReadOnly(i,1)
3277 self.grid.SetCellValue(i,2,name) 3196 self.grid.SetCellValue(i,2,name)
3284 def on_remove(self,evt): 3203 def on_remove(self,evt):
3285 rows = self.grid.GetNumberRows() 3204 rows = self.grid.GetNumberRows()
3286 for i in range(rows): 3205 for i in range(rows):
3287 if self.grid.IsInSelection(i,0): 3206 if self.grid.IsInSelection(i,0):
3288 self.grid.DeleteRows(i) 3207 self.grid.DeleteRows(i)
3289 self.master_dom.removeChild(self.n_list[i]) 3208 self.xml.remove(self.n_list[i])
3290 3209
3291 def on_add(self,evt): 3210 def on_add(self,evt):
3211 debug()
3292 if not self.temp_dom: 3212 if not self.temp_dom:
3293 tmp = open(dir_struct["dnd3e"]+"dnd3epowers.xml","r") 3213 tree = parse(dir_struct["dnd3e"]+"dnd3epowers.xml")
3294 3214 xml_dom = tree.getroot()
3295 xml_dom = parseXml_with_dlg(self,tmp.read())
3296 xml_dom = xml_dom._get_firstChild()
3297 tmp.close()
3298 self.temp_dom = xml_dom 3215 self.temp_dom = xml_dom
3299 f_list = self.temp_dom.getElementsByTagName('power') 3216 debug(self.temp)
3217 f_list = self.temp_dom.findall('power')
3300 opts = [] 3218 opts = []
3301 #lvl = int(dnd3e_char_child.get_char_lvl('level')) 3219 #lvl = int(dnd3e_char_child.get_char_lvl('level'))
3302 #castlvl = lvl / 2 3220 #castlvl = lvl / 2
3303 for f in f_list: 3221 for f in f_list:
3304 spelllvl = f.getAttribute('level') 3222 spelllvl = f.get('level')
3305 #if spelllvl <= "1": 3223 #if spelllvl <= "1":
3306 # opts.append("(" + f.getAttribute('level') + ") - " + f.getAttribute('name') + " - " + f.getAttribute('test')) 3224 # opts.append("(" + f.get('level') + ") - " + f.get('name') + " - " + f.get('test'))
3307 #else: 3225 #else:
3308 # if eval('%d >= %s' %(castlvl, spelllvl)): 3226 # if eval('%d >= %s' %(castlvl, spelllvl)):
3309 opts.append("(" + f.getAttribute('level') + ") - " + 3227 opts.append("(" + f.get('level') + ") - " +
3310 f.getAttribute('name') + " - " + f.getAttribute('test')) 3228 f.get('name') + " - " + f.get('test'))
3311 dlg = wx.SingleChoiceDialog(self,'Choose Power','Powers',opts) 3229 dlg = wx.SingleChoiceDialog(self,'Choose Power','Powers',opts)
3312 if dlg.ShowModal() == wx.ID_OK: 3230 if dlg.ShowModal() == wx.ID_OK:
3313 i = dlg.GetSelection() 3231 i = dlg.GetSelection()
3314 new_node = self.master_dom.appendChild(f_list[i].cloneNode(False)) 3232 new_node = self.xml.append(f_list[i])
3315 self.grid.AppendRows(1) 3233 self.grid.AppendRows(1)
3316 self.n_list = self.master_dom.getElementsByTagName('power') 3234 self.n_list = self.xml.findall('power')
3317 self.refresh_row(self.grid.GetNumberRows()-1) 3235 self.refresh_row(self.grid.GetNumberRows()-1)
3318 self.handler.refresh_powers() 3236 self.handler.refresh_powers()
3319 dlg.Destroy() 3237 dlg.Destroy()
3320 3238
3321 def on_remove(self,evt): 3239 def on_remove(self,evt):
3322 rows = self.grid.GetNumberRows() 3240 rows = self.grid.GetNumberRows()
3323 for i in range(rows): 3241 for i in range(rows):
3324 if self.grid.IsInSelection(i,0): 3242 if self.grid.IsInSelection(i,0):
3325 self.grid.DeleteRows(i) 3243 self.grid.DeleteRows(i)
3326 self.master_dom.removeChild(self.n_list[i]) 3244 self.xml.remove(self.n_list[i])
3327 self.n_list = self.master_dom.getElementsByTagName('weapon') 3245 self.n_list = self.xml.findall('weapon')
3328 self.handler.refresh_powers() 3246 self.handler.refresh_powers()
3329 3247
3330 def on_refresh_powers( self, evt ): 3248 def on_refresh_powers( self, evt ):
3331 #a 1.5002,1.5014 s 3249 #a 1.5002,1.5014 s
3332 self.root.pp.set_char_pp('current1',self.root.pp.get_char_pp('max1')) 3250 self.root.pp.set_char_pp('current1',self.root.pp.get_char_pp('max1'))
3378 #html_str += "<th colspan=8>Power Points</th></tr>" #d 1.6010 3296 #html_str += "<th colspan=8>Power Points</th></tr>" #d 1.6010
3379 html_str += "<th colspan=7>Power Points</th>" #a 1.6010 3297 html_str += "<th colspan=7>Power Points</th>" #a 1.6010
3380 #m 1.6010 rearanged everything below to "return html_str" 3298 #m 1.6010 rearanged everything below to "return html_str"
3381 html_str += "</tr><tr>" 3299 html_str += "</tr><tr>"
3382 html_str += "<th colspan=2>Max:</th>" 3300 html_str += "<th colspan=2>Max:</th>"
3383 html_str += "<td>"+self.master_dom.getAttribute('max1')+"</td>" 3301 html_str += "<td>"+self.xml.get('max1')+"</td>"
3384 html_str += "<th colspan=3>Max Talents/day:</th>" 3302 html_str += "<th colspan=3>Max Talents/day:</th>"
3385 html_str += "<td>"+self.master_dom.getAttribute('maxfree')+"</td>" 3303 html_str += "<td>"+self.xml.get('maxfree')+"</td>"
3386 html_str += "</tr><tr>" 3304 html_str += "</tr><tr>"
3387 html_str += "<th colspan=2>Current:</th>" 3305 html_str += "<th colspan=2>Current:</th>"
3388 html_str += "<td>"+self.master_dom.getAttribute('current1')+"</td>" 3306 html_str += "<td>"+self.xml.get('current1')+"</td>"
3389 html_str += "<th colspan=3>Current Talents/day:</th>" 3307 html_str += "<th colspan=3>Current Talents/day:</th>"
3390 html_str += "<td>"+self.master_dom.getAttribute('free')+"</td>" 3308 html_str += "<td>"+self.xml.get('free')+"</td>"
3391 html_str += "</tr></table>" 3309 html_str += "</tr></table>"
3392 return html_str 3310 return html_str
3393 3311
3394 def get_char_pp( self, attr ): 3312 def get_char_pp( self, attr ):
3395 pp = self.master_dom.getAttribute(attr) 3313 pp = self.xml.get(attr)
3396 #print "dnd3epp -get_char_pp: attr,pp",attr,pp 3314 #print "dnd3epp -get_char_pp: attr,pp",attr,pp
3397 return pp 3315 return pp
3398 3316
3399 def set_char_pp( self, attr, evl ): 3317 def set_char_pp( self, attr, evl ):
3400 qSub = str(evl) #a 1.5014 must force it to be a string for next call. 3318 qSub = str(evl) #a 1.5014 must force it to be a string for next call.
3401 self.master_dom.setAttribute(attr, qSub) 3319 self.xml.set(attr, qSub)
3402 #This function needs to be looked at the idea is to refresh the power panel 3320 #This function needs to be looked at the idea is to refresh the power panel
3403 #But it causes a seg fault when you refresh from powers -mgt 3321 #But it causes a seg fault when you refresh from powers -mgt
3404 #if self.ppPanel: #a 1.5015 3322 #if self.ppPanel: #a 1.5015
3405 # self.ppPanel.on_refresh(attr,qSub) #a 1.5015 3323 # self.ppPanel.on_refresh(attr,qSub) #a 1.5015
3406 3324
3410 wx.Panel.__init__(self, parent, -1) 3328 wx.Panel.__init__(self, parent, -1)
3411 self.hparent = handler #a 1.5002 allow ability to run up tree. 3329 self.hparent = handler #a 1.5002 allow ability to run up tree.
3412 #a 1.5002 we need the functional parent, not the invoking parent. 3330 #a 1.5002 we need the functional parent, not the invoking parent.
3413 self.hparent.ppPanel=self #a 1.5xx 3331 self.hparent.ppPanel=self #a 1.5xx
3414 3332
3415 pname = handler.master_dom.setAttribute("name", 'PowerPoints') 3333 pname = handler.xml.set("name", 'PowerPoints')
3416 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap 3334 self.sizer = wx.FlexGridSizer(2, 4, 2, 2) # rows, cols, hgap, vgap
3417 self.master_dom = handler.master_dom 3335 self.xml = handler.xml
3418 3336
3419 self.static1= wx.StaticText(self, -1, "PP Current:") #a 1.5015 3337 self.static1= wx.StaticText(self, -1, "PP Current:") #a 1.5015
3420 self.dyn1= wx.TextCtrl(self, PP_CUR, 3338 self.dyn1= wx.TextCtrl(self, PP_CUR,
3421 self.master_dom.getAttribute('current1')) #a 1.5015 3339 self.xml.get('current1')) #a 1.5015
3422 self.dyn3= wx.TextCtrl(self, PP_FRE, 3340 self.dyn3= wx.TextCtrl(self, PP_FRE,
3423 self.master_dom.getAttribute('free')) #a 1.5015 3341 self.xml.get('free')) #a 1.5015
3424 # self.sizer.AddMany([ (wx.StaticText(self, -1, "PP Current:"), #d 1.5015 3342 # self.sizer.AddMany([ (wx.StaticText(self, -1, "PP Current:"), #d 1.5015
3425 # 0, wx.ALIGN_CENTER_VERTICAL), 3343 # 0, wx.ALIGN_CENTER_VERTICAL),
3426 # (wx.TextCtrl(self, PP_CUR, #d 1.5015 3344 # (wx.TextCtrl(self, PP_CUR, #d 1.5015
3427 # self.master_dom.getAttribute('current1')), 0, wx.EXPAND), 3345 # self.xml.get('current1')), 0, wx.EXPAND),
3428 self.sizer.AddMany([ (self.static1, 0, wx.ALIGN_CENTER_VERTICAL), 3346 self.sizer.AddMany([ (self.static1, 0, wx.ALIGN_CENTER_VERTICAL),
3429 (self.dyn1, 0, wx.EXPAND), 3347 (self.dyn1, 0, wx.EXPAND),
3430 (wx.StaticText(self, -1, "PP Max:"), 0, wx.ALIGN_CENTER_VERTICAL), 3348 (wx.StaticText(self, -1, "PP Max:"), 0, wx.ALIGN_CENTER_VERTICAL),
3431 (wx.TextCtrl(self, PP_MAX, 3349 (wx.TextCtrl(self, PP_MAX,
3432 self.master_dom.getAttribute('max1')), 0, wx.EXPAND), 3350 self.xml.get('max1')), 0, wx.EXPAND),
3433 (wx.StaticText(self, -1, "Current Free Talants per day:"), 3351 (wx.StaticText(self, -1, "Current Free Talants per day:"),
3434 0, wx.ALIGN_CENTER_VERTICAL), 3352 0, wx.ALIGN_CENTER_VERTICAL),
3435 (self.dyn3, 0, wx.EXPAND), #a 1.5015 3353 (self.dyn3, 0, wx.EXPAND), #a 1.5015
3436 # (wx.TextCtrl(self, PP_FRE, 3354 # (wx.TextCtrl(self, PP_FRE,
3437 # self.master_dom.getAttribute('free')), 0, wx.EXPAND),#d 1.5015 3355 # self.xml.get('free')), 0, wx.EXPAND),#d 1.5015
3438 (wx.StaticText(self, -1, "Max Free Talants per day:"), 3356 (wx.StaticText(self, -1, "Max Free Talants per day:"),
3439 0, wx.ALIGN_CENTER_VERTICAL), 3357 0, wx.ALIGN_CENTER_VERTICAL),
3440 (wx.TextCtrl(self, PP_MFRE, 3358 (wx.TextCtrl(self, PP_MFRE,
3441 self.master_dom.getAttribute('maxfree')), 0, wx.EXPAND), 3359 self.xml.get('maxfree')), 0, wx.EXPAND),
3442 ]) 3360 ])
3443 3361
3444 self.sizer.AddGrowableCol(1) 3362 self.sizer.AddGrowableCol(1)
3445 self.SetSizer(self.sizer) 3363 self.SetSizer(self.sizer)
3446 self.SetAutoLayout(True) 3364 self.SetAutoLayout(True)
3453 self.Bind(wx.EVT_TEXT, self.on_text, id=PP_MFRE) 3371 self.Bind(wx.EVT_TEXT, self.on_text, id=PP_MFRE)
3454 3372
3455 def on_text(self,evt): 3373 def on_text(self,evt):
3456 id = evt.GetId() 3374 id = evt.GetId()
3457 if id == PP_CUR: 3375 if id == PP_CUR:
3458 self.master_dom.setAttribute('current1',evt.GetString()) 3376 self.xml.set('current1',evt.GetString())
3459 elif id == PP_MAX: 3377 elif id == PP_MAX:
3460 self.master_dom.setAttribute('max1',evt.GetString()) 3378 self.xml.set('max1',evt.GetString())
3461 elif id == PP_FRE: 3379 elif id == PP_FRE:
3462 self.master_dom.setAttribute('free',evt.GetString()) 3380 self.xml.set('free',evt.GetString())
3463 elif id == PP_MFRE: 3381 elif id == PP_MFRE:
3464 self.master_dom.setAttribute('maxfree',evt.GetString()) 3382 self.xml.set('maxfree',evt.GetString())
3465 3383
3466 def on_size(self,evt): 3384 def on_size(self,evt):
3467 s = self.GetClientSizeTuple() 3385 s = self.GetClientSizeTuple()
3468 self.sizer.SetDimension(0,0,s[0],s[1]) 3386 self.sizer.SetDimension(0,0,s[0],s[1])
3469 3387