changeset 149:c2caca988a11 alpha

Traipse Alpha 'OpenRPG' {091124-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 (Cleaning up for 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 Gametree Recursion method, mapping, and context sensitivity. !Infinite Loops return error instead of freezing the software! New Syntax added for custom PC sheets Tip of the Day added, from Core and community Fixed Whiteboard ID to prevent random line or text deleting. Modified ID's to prevent non updated clients from ruining the fix.
author sirebral
date Tue, 24 Nov 2009 17:17:42 -0600
parents a771ba7b7875
children 06f10429eedc
files orpg/chat/chatwnd.py orpg/main.py orpg/orpg_version.py orpg/templates/feature.xml upmana/updatemana.py
diffstat 5 files changed, 190 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/orpg/chat/chatwnd.py	Mon Nov 23 20:34:04 2009 -0600
+++ b/orpg/chat/chatwnd.py	Tue Nov 24 17:17:42 2009 -0600
@@ -1882,7 +1882,7 @@
         grid = node.find('grid')
         rows = grid.findall('row')
         col = rows[int(self.ParseDice(cell[0]))].findall('cell')
-        try: self.data = self.NormalizeParse(col[int(self.ParseDice(cell[1]))].text) or 'No Cell Data'
+        try: self.data = self.ParseMap(col[int(self.ParseDice(cell[1]))].text, node) or 'No Cell Data'
         except: self.data = 'Invalid Grid Reference!'
         return
 
--- a/orpg/main.py	Mon Nov 23 20:34:04 2009 -0600
+++ b/orpg/main.py	Tue Nov 24 17:17:42 2009 -0600
@@ -637,7 +637,7 @@
         # Update Manager 
         #self.manifest = manifest.ManifestChanges()
         self.updateMana = upmana.updatemana.updaterFrame(self, 
-            "OpenRPG Update Manager (final beta)", component, manifest, True)
+            "OpenRPG Update Manager 1.0", component, manifest, True)
         logger.debug("Menu Created")
         h = int(xml_dom.get("height"))
         w = int(xml_dom.get("width"))
--- a/orpg/orpg_version.py	Mon Nov 23 20:34:04 2009 -0600
+++ b/orpg/orpg_version.py	Tue Nov 24 17:17:42 2009 -0600
@@ -4,7 +4,7 @@
 #BUILD NUMBER FORMAT: "YYMMDD-##" where ## is the incremental daily build index (if needed)
 DISTRO = "Traipse Alpha"
 DIS_VER = "Ornery Orc"
-BUILD = "091123-04"
+BUILD = "091124-00"
 
 # This version is for network capability.
 PROTOCOL_VERSION = "1.2"
--- a/orpg/templates/feature.xml	Mon Nov 23 20:34:04 2009 -0600
+++ b/orpg/templates/feature.xml	Tue Nov 24 17:17:42 2009 -0600
@@ -1,24 +1,92 @@
 <nodehandler class="tabber_handler" icon="help" module="containers" name="Traipse OpenRPG" version="1.0">
-  <nodehandler border="1" class="group_handler" cols="1" icon="labtop" map="Traipse OpenRPG" module="containers" name="User Manual" version="1.0">
+  <nodehandler border="0" class="group_handler" cols="1" icon="goblin" map="Traipse OpenRPG" module="containers" name="Bonus Nodes" version="1.0">
+  <nodehandler border="1" class="group_handler" cols="1" map="Traipse OpenRPG::Bonus Nodes" module="containers" name="Encounters" version="1.0">
+  <nodehandler class="textctrl_handler" frame="400,400,0,48" icon="note" map="Traipse OpenRPG::Bonus Nodes::Encounters" module="forms" name="Roll" version="1.0">
+  <text multiline="1" raw_mode="1" send_button="1">!!Random::([#1d3-1],0)!!</text>
+</nodehandler><nodehandler class="rpg_grid_handler" icon="grid" map="Traipse OpenRPG::Bonus Nodes::Encounters" module="rpg_grid" name="Random" version="1.0">
+  <grid autosize="0" border="1">
+    <row version="1.0">
+      <cell>!!Set 1::Enc 1!!</cell>
+      </row>
+    <row version="1.0">
+      <cell>!!Set 1::Enc 2!!</cell>
+      </row>
+  <row version="1.0"><cell>!!Set 1::Enc 3!!</cell></row></grid>
+  <macros>
+    <macro name="" />
+  </macros>
+</nodehandler><nodehandler border="1" class="group_handler" cols="1" map="Traipse OpenRPG::Bonus Nodes::Encounters" module="containers" name="Set 1" version="1.0">
+  <nodehandler class="textctrl_handler" frame="400,400,0,48" icon="note" map="Traipse OpenRPG::Bonus Nodes::Encounters::Set 1" module="forms" name="Enc 2" version="1.0">
+  <text multiline="1" send_button="1">Dark Elves.  Watch out!</text>
+</nodehandler><nodehandler class="textctrl_handler" frame="400,400,0,48" icon="note" map="Traipse OpenRPG::Bonus Nodes::Encounters::Set 1" module="forms" name="Enc 3" version="1.0">
+  <text multiline="1" send_button="1">Kobolds a plenty.</text>
+</nodehandler><nodehandler class="textctrl_handler" frame="400,400,0,48" icon="note" map="Traipse OpenRPG::Bonus Nodes::Encounters::Set 1" module="forms" name="Enc 1" version="1.0">
+  <text multiline="1" send_button="1">A Wandering Minotaur</text>
+</nodehandler><group_atts border="1" cols="1" />
+</nodehandler><group_atts border="1" cols="1" />
+</nodehandler><nodehandler border="1" class="group_handler" cols="1" map="Traipse OpenRPG::Bonus Nodes" module="containers" name="Book" version="1.0">
+  <nodehandler class="listbox_handler" frame="400,400,0,48" icon="gear" map="Traipse OpenRPG::Bonus Nodes::Book" module="forms" name="Index" version="1.0">
+  <list hide_title="0" raw_mode="1" send_button="1" type="1">
+    <option selected="1" value="">!!Chapter 1::Part 1!!</option>
+    <option selected="0" value="">!!Chapter 1::Part 2!!</option>
+    <option selected="0" value="">!!Chapter 1::Part 3!!</option>
+  </list>
+</nodehandler><nodehandler border="1" class="group_handler" cols="1" map="Traipse OpenRPG::Bonus Nodes::Book" module="containers" name="Chapter 1" version="1.0">
+  <nodehandler class="textctrl_handler" frame="400,400,543,68" icon="note" map="Traipse OpenRPG::Bonus Nodes::Book::Chapter 1" module="forms" name="Part 2" version="1.0">
+  <text multiline="1" raw_mode="0" send_button="1">Chapter 1 Part 2
+
+The adventurers have come this far.</text>
+</nodehandler><nodehandler class="textctrl_handler" frame="400,400,543,68" icon="note" map="Traipse OpenRPG::Bonus Nodes::Book::Chapter 1" module="forms" name="Part 3" version="1.0">
+  <text multiline="1" raw_mode="0" send_button="1">Chapter 1 Part 3
+
+Is this the end already?</text>
+</nodehandler><nodehandler class="textctrl_handler" frame="400,400,543,68" icon="note" map="Traipse OpenRPG::Bonus Nodes::Book::Chapter 1" module="forms" name="Part 1" version="1.0">
+  <text multiline="1" raw_mode="0" send_button="1">Chapter 1 Part 1
+
+An introduction to your adventure module can be placed here.</text>
+</nodehandler><group_atts border="1" cols="1" />
+</nodehandler><group_atts border="1" cols="1" />
+</nodehandler><nodehandler border="1" class="group_handler" cols="1" map="Traipse OpenRPG::Bonus Nodes" module="containers" name="Deck" version="1.0">
+  <nodehandler class="textctrl_handler" frame="400,400,66,87" icon="note" map="Traipse OpenRPG::Bonus Nodes::Deck" module="forms" name="Draw" version="1.0">
+  <text multiline="1" raw_mode="1" send_button="1">!!52 Card Deck::([#1d13-1], [#1d4-1])!!</text>
+</nodehandler><nodehandler class="rpg_grid_handler" icon="grid" map="Traipse OpenRPG::Bonus Nodes::Deck" module="rpg_grid" name="52 Card Deck" version="1.0">
+  <grid autosize="1" border="1">
+    <row version="1.0">
+      <cell>AS</cell>
+      <cell>AD</cell>
+    <cell>AC</cell><cell>AH</cell></row>
+    <row version="1.0">
+      <cell>KS</cell>
+      <cell>KD</cell>
+    <cell>KC</cell><cell>KH</cell></row>
+  <row version="1.0"><cell>QS</cell><cell>QD</cell><cell>QC</cell><cell>QH</cell></row><row version="1.0"><cell>JS</cell><cell>JD</cell><cell>JC</cell><cell>JH</cell></row><row version="1.0"><cell>10S</cell><cell>10D</cell><cell>10C</cell><cell>10H</cell></row><row version="1.0"><cell>9S</cell><cell>9D</cell><cell>9C</cell><cell>9H</cell></row><row version="1.0"><cell>8S</cell><cell>8D</cell><cell>8C</cell><cell>8H</cell></row><row version="1.0"><cell>7S</cell><cell>7D</cell><cell>7C</cell><cell>7H</cell></row><row version="1.0"><cell>6S</cell><cell>6D</cell><cell>6C</cell><cell>6H</cell></row><row version="1.0"><cell>5S</cell><cell>5D</cell><cell>5C</cell><cell>5H</cell></row><row version="1.0"><cell>4S</cell><cell>4D</cell><cell>4C</cell><cell>4H</cell></row><row version="1.0"><cell>3S</cell><cell>3D</cell><cell>3C</cell><cell>3H</cell></row><row version="1.0"><cell>2S</cell><cell>2D</cell><cell>2C</cell><cell>2H</cell></row></grid>
+  <macros>
+    <macro name="" />
+  </macros>
+</nodehandler><group_atts border="1" cols="1" />
+</nodehandler><group_atts border="1" cols="1" />
+</nodehandler><nodehandler border="1" class="group_handler" cols="1" icon="labtop" map="Traipse OpenRPG" module="containers" name="User Manual" version="1.0">
   <nodehandler class="link_handler" icon="html" map="Traipse OpenRPG::User Manual" module="forms" name="Traipse User Guide" version="1.0">
     <link href="http://www.assembla.com/wiki/show/traipse/User_Manual" />
   </nodehandler>
   <nodehandler class="link_handler" icon="html" map="Traipse OpenRPG::User Manual" module="forms" name="Release Notes" version="1.0">
     <link href="http://www.assembla.com/wiki/show/traipse" />
   </nodehandler>
-  <nodehandler class="textctrl_handler" frame="400,400,139,110" icon="note" map="Traipse OpenRPG::User Manual" module="forms" name="Node Referencing" version="1.0"><text hide_title="0" multiline="1" raw_mode="0" send_button="0">Traipse node referencing is unlike other distributions of OpenRPG.  The gametree mapping is a fluid map that changes with the location of your nodes.  This allows you to create a reference node that will stay with your character sheet, and if you change the location of your character sheet the reference will still work.
+  <nodehandler class="textctrl_handler" frame="400,400,393,95" icon="note" map="Traipse OpenRPG::User Manual" module="forms" name="Node Referencing" version="1.0"><text hide_title="0" multiline="1" raw_mode="0" send_button="0">  Traipse node referencing is unlike other distributions of OpenRPG.  The gametree mapping is a fluid map that changes with the location of your nodes.  This allows you to create a reference node that will stay with your character sheet, and if you change the location of your character sheet the reference will still work.
 
-(Note: Renaming your node causes problems with the mapping until you restart the software. You can just move the node and the software will reset the map)
+(Note: Renaming your node causes problems with the tree mapping until you restart the software. You can just move the node and the software will reset the gametree map)
 
 Reference Types:
   There are two ways of references node data. A Root Reference and a Child Reference.
 
-Root Reference: A node reference that starts at the gametree. The location of the node must be exact or you will return an Invalid Reference!
+Root Reference: 
+  A node reference that starts at the gametree. The location of the node must be exact or you will return an Invalid Reference!
 
 A Root Reference uses this syntax:
 !@Node::Child::Data@!
 
-Child Reference: a node reference syntax that starts by looking at within the current container node. As long as the Child Reference is in the same container as the node, the container can change location and the reference will not be damaged. Child References work from within a PC Sheet node as well.
+Child Reference: 
+  A node reference syntax that starts by looking at within the current container node. As long as the Child Reference is in the same container as the node, the container can change location and the reference will not be damaged. Child References work from within a PC Sheet node as well.
 
 A Child Reference uses this syntax:
 !!Node::Child::Data!!
@@ -28,6 +96,7 @@
 
 Skills, Saves, and Abilities:
   Skills, Saves, and Abilities all have a similar referencing syntax.  You can return the base value of each by using the correct syntax.
+
 Examples:
 !@Jonethan::Skill::Jump@! (Returns Jump ranks)
 !@Mikael::Strength@! (Returns Ability Score and Mod)
@@ -35,7 +104,7 @@
 
 (Saves and Abilities have a short hand and a long hand. Abilities can use the three letter abbreviation, while saves short hand are Fort, Ref, and Will)
 
-You can append Check to check each of these against a 1d20 roll, or you can append Mod to discover the Modifier. The Mod can be useful in other nodes
+  You can append Check to check each of these against a 1d20 roll, or you can append Mod to discover the Modifier. The Mod can be useful in other nodes
 
 Combat:
   You can now reference your attacks easily with the gametree.  Using the Attack syntax you can select modifier type, and a weapon to attack with.
@@ -51,34 +120,38 @@
 !@Kammen-Pai::Cast::Ray of Frost@!
 !@Kammen-Pai::Feat::Ability Focus@!
 
-</text></nodehandler><nodehandler class="textctrl_handler" frame="400,400,350,33" icon="note" map="Traipse OpenRPG::User Manual" module="forms" name="Gametree Additions &amp; Tips" version="1.0"><text hide_title="0" multiline="1" raw_mode="0" send_button="0">With the new additions to the gametree using nodes has never been easier nor has it ever been more fluid. Included here is a list of the additions to the gametree referencing model as well as some tips on how to make the gametree work the way it was intended.
+</text></nodehandler><nodehandler class="textctrl_handler" frame="400,400,452,36" icon="note" map="Traipse OpenRPG::User Manual" module="forms" name="Gametree Additions &amp; Tips" version="1.0"><text hide_title="0" multiline="1" raw_mode="0" send_button="0">  With the new additions to the gametree using nodes has never been easier nor has it ever been more fluid. Included here is a list of the additions to the gametree referencing model as well as some tips on how to make the gametree work the way it was intended.
 
 Grid Nodes:
-Grid nodes are now referenceable with the coordinates of the grid. Example: !@Grid::(0,0)@!
+  Grid nodes are now referenceable with the coordinates of the grid. Example: !@Grid::(0,0)@!
 The example will return the top left most cell data. The grid understands coordinates like this (Row, Column)
 
-Grid nodes can reference node data just like any other node can.  With a new added feature grids are even more useful. By using a new die rolling syntax you can draw just the number of the modified roll.  While this will not pass during game play, you can use it with the grid node to create a random chart. The new die roll syntax is [#XdY].
+  Grid nodes can reference node data just like any other node can.  With a new added feature grids are even more useful. By using a new die rolling syntax you can draw just the number of the modified roll.  While this will not pass during game play, you can use it with the grid node to create a random chart. The new die roll syntax is [#XdY]. # works just like q, yet it returns only the modified die result. 
 
-# works just like q, yet it returns only the modified die result. Here is an example with a 3 x 3 Grid
+  Here is an example with a 3 x 3 Grid
 Example: !@Grid::([#1d3-1], [#1d3-1])@!
 
 The result will be a random event from the grid.
 
-Bonus: Make a 52 Card deck with 4 columns and 13 rows. (4 * 13 = 52)
+Bonus Node Included: A 52 Card Deck with 4 columns and 13 rows. (4 * 13 = 52)
 
 List Nodes:
-List nodes now have a check box that allows users to send the content as a macro. List nodes are a prime reference holder because users can place a lot of references into one small node.
+  List nodes now have a check box that allows users to send the content as a macro. List nodes are a prime reference holder because users can place a lot of references into one small node.
+
+  For the best results from a list node my tip to users would be to create a list node and place it next to the character sheet they are using, inside a the PC Sheet. The list will then use the Child Referencing syntax, but the PC Sheet can go anywhere in the tree and the player will have easy access to all the references.
 
-For the best results from a list node my tip to users would be to create a list node and place it inside the character sheet they are using.  Then all references will use the Child Referencing syntax, but the character sheet can go anywhere in the tree and the player will have easy access to all the references.
+(List Nodes inside a Tool created PC sheet vanish when moved, or I would recommend the list be placed inside these sheets also.)
 
-Here is an example of a Fortitude save inside the recommended list node: !!Fort::Check!!
+  Here is an example of a Fortitude save inside the recommended list node: !!Fort::Check!!
 
 Text Nodes:
-Text nodes remain little changed.  I agree with all the 1.7.1 users who tell me, if it's not broke don't fix it. With that in mind I have some good tips for text nodes.
+  Text nodes remain little changed.  I agree with all the 1.7.1 users who tell me, if it's not broke don't fix it. With that in mind I have some good tips for text nodes.
+
+  Text nodes can be used in conjuction with the new grid features to create random encounters. A GM could place a list of text nodes into a folder and the grid could reference the nodes.
 
-Text nodes can be used in conjuction with the new grid features to create random encounters. A GM could place a list of text nodes into a folder and the grid could reference them.
+  Text nodes also work great when you need to have story text at hand that you don't want to type out during play.  Create chapters with folder nodes and add the adventure text to different nodes.  You can then use a List Node or a Grid Node to reference the different chapters.
 
-Text nodes also work great when you need to have story text at hand that you don't want to type out during play.</text></nodehandler><group_atts border="1" cols="1" />
+Bonus Node Included: A small book node with 1 Chapter and 3 Parts.</text></nodehandler><group_atts border="1" cols="1" />
 </nodehandler><nodehandler class="file_loader" icon="help" map="Traipse OpenRPG" module="core" name="Load Die Roller Notes" version="1.0">
     <file name="die_roller_notes.xml" />
   </nodehandler>
--- a/upmana/updatemana.py	Mon Nov 23 20:34:04 2009 -0600
+++ b/upmana/updatemana.py	Tue Nov 24 17:17:42 2009 -0600
@@ -15,7 +15,7 @@
     def write(self, text):
         statbar.SetStatusText(text)
         wx.Yield()
-        #sys.__stdout__.write(text)
+        sys.__stdout__.write(text)
 
 class Updater(wx.Panel):
     @debugging
@@ -105,11 +105,23 @@
         self.mana = self.LoadDoc()
         temp = dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep
         for ignore in self.ignorelist:
-            shutil.copy(ignore, temp + ignore.split('/')[len(ignore.split('/')) - 1])
+            if len(ignore.split('/')) > 1:
+                gets = 0; dir1 = ''
+                while gets != len(ignore.split('/'))-1:
+                    dir1 += ignore.split('/')[gets] + os.sep
+                    gets += 1
+                os.makedirs(temp+dir1)
+            shutil.copy(ignore, temp + dir1 + ignore.split('/')[len(ignore.split('/')) - 1])
         hg.clean(self.repo, self.current)
         for ignore in self.ignorelist:
             shutil.copyfile(temp + ignore.split('/')[len(ignore.split('/')) - 1], ignore)
             os.remove(temp + ignore.split('/')[len(ignore.split('/')) - 1])
+            if len(ignore.split('/')) > 1:
+                gets = 0; dir1 = ''
+                while gets != len(ignore.split('/'))-1:
+                    dir1 += ignore.split('/')[gets] + os.sep
+                    gets += 1
+                os.removedirs(temp+dir1)
 
     def LoadDoc(self):
         ignore = open(self.filename)
@@ -597,6 +609,73 @@
         if self.package_list == None: return None
         return None
 
+class Help(wx.Panel):
+    def __init__(self, parent):
+        wx.Panel.__init__(self, parent)
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        self.help = wx.TextCtrl(self, wx.ID_ANY, size=(-1, -1), 
+                                    style=wx.TE_MULTILINE | wx.TE_READONLY)
+        sizer.Add(self.help, 1, wx.EXPAND)
+        self.build_help()
+        self.SetSizer(sizer)
+        self.Layout()
+
+    def build_help(self):
+        help = """'Traipse' OpenRPG Update Manager Help:
+The Traipse Update Manager can be confusing at first glance. There is alot involved in the new addition so it is easy to by pass the finer details. This small page will help a new user understand how to use the new Update Manager to it's full capability.\n\n"""
+        self.help.AppendText(help)
+        help = """The Different Tabs: There are 5 different tabs available to users, and each tab has a different purpose. These five tabs are: Updater, Repos, Manifest, Control and Help.
+---
+
+The Updater Tab:
+The Updater tab is divided into three sections. The left section shows a description of the your current or selected version.  The right top section shows the files that have been updated in your current or selected version.  Underneath is a selection of buttons and check boxes.
+
+Package Select: 
+When you press this button a small window pops up showing you the available packages to update too. You can select a package and the Updater's detail sections will reflect the change.
+
+Update Now: 
+Press this button when you want to update to the selected package
+
+Auto Update: 
+Check this if want to update when you start the software. You need to have a default Repository checked in the Repo tab.
+
+No Update: 
+Check this if you do not want to see the Update Manager when you start the software.
+---\n\n"""
+        self.help.AppendText(help)
+        help = """The Repos Tab:
+The Repos tab has two parts to it. The top most part is a section is where you name and create repositories.  The second part shows you a list of all your available repositories.
+
+What is a repostiory? 
+1: a place, room, or container where something is deposited or stored (Merriam-Webster). A repository, or repo for short, is a place to hold source code so others can download it.
+
+Creating new Repos:
+Creating a new repos is really easy. First you need to give your repo a name, any name will work, then press the New button. You will see that your named repo shows up in your list immediately.
+
+You will then need to connect the named repo to a URL so you can download source code.  Enter a URL (http://hg.assembla.com/traipse) into the new entry and press the Refresh button. This downloads the new source code to your computer only. Refreshing a repo does not update your software.
+
+Default: 
+You can set any repo as your default repository. This is the repo the software will update from if you Auto Update.
+---\n\n"""
+        self.help.AppendText(help)
+        help = """The Manifest Tab:
+The Manifest Tab is really easy to understand, it's just named differently. The manifest shows a list of all the files that are being tracked by your current package. Checking files in the list will place them into a list that prevents these files from being changed when you update to a new package.
+
+The manifest can cause problems with compatibility if the newer source does not understand the unchanged files, so it would be smart to test out a new package in a different folder.
+---\n\n"""
+        self.help.AppendText(help)
+        help = """The Control Tab:
+The control tab is recommended for developers only. The control tab contains the two details elements from the Updater tab and a new section that contains all of the revisions for your selected package.
+
+You can select any of the available packages from the drop down and the list of revisions will change. You can also select any of the revisions in the list and the details on the left side will change to reflect the details of that revision.
+
+You are also allowed to update to any of the selected revisions. Older revisions often times contain bugs and newer methods of coding, so revision updates commonly cause problems with software.
+
+What is the Control Tab for?
+The control tab is for developers who want to see how the source code has changed from revision to revision. When a user downloads the software they also download all past revisions made to that software. This tab allows users to roll back if a problem has been created with new source, or for developers they can watch the software evolve.
+---"""
+        self.help.AppendText(help)
+
 class updaterFrame(wx.Frame):
     def __init__(self, parent, title, openrpg, manifest, main):
 
@@ -619,12 +698,14 @@
         page2 = Repos(nb, openrpg)
         page3 = Manifest(nb)
         page4 = Control(nb)
+        page5 = Help(nb)
 
         # add the pages to the notebook with the label to show on the tab
         nb.AddPage(page1, "Updater")
         nb.AddPage(page2, "Repos")
         nb.AddPage(page3, "Manifest")
         nb.AddPage(page4, "Control")
+        nb.AddPage(page5, 'Help')
 
         # finally, put the notebook in a sizer for the panel to manage
         # the layout
@@ -646,7 +727,7 @@
         logger._set_log_to_console(False)
         logger.note("Updater Start")
         component.add('validate', validate)
-        self.updater = updaterFrame(self, "OpenRPG Update Manager 0.9 (final beta)", 
+        self.updater = updaterFrame(self, "OpenRPG Update Manager 1.0", 
                                 component, manifest, self.main)
         if manifest.GetString("updatemana", "auto_update", "") == 'on' and self.main == False:
             self.AutoUpdate(); self.OnExit()
@@ -675,11 +756,23 @@
             self.mana = self.LoadDoc()
             temp = dir_struct["home"] + 'upmana' + os.sep + 'tmp' + os.sep
             for ignore in self.ignorelist:
-                shutil.copy(ignore, temp + ignore.split('/')[len(ignore.split('/')) - 1])
+                if len(ignore.split('/')) > 1:
+                    gets = 0; dir1 = ''
+                    while gets != len(ignore.split('/'))-1:
+                        dir1 += ignore.split('/')[gets] + os.sep
+                        gets += 1
+                    os.makedirs(temp+dir1)
+                shutil.copy(ignore, temp + dir1 + ignore.split('/')[len(ignore.split('/')) - 1])
             hg.clean(self.repo, self.current)
             for ignore in self.ignorelist:
                 shutil.copyfile(temp + ignore.split('/')[len(ignore.split('/')) - 1], ignore)
                 os.remove(temp + ignore.split('/')[len(ignore.split('/')) - 1])
+                if len(ignore.split('/')) > 1:
+                    gets = 0; dir1 = ''
+                    while gets != len(ignore.split('/'))-1:
+                        dir1 += ignore.split('/')[gets] + os.sep
+                        gets += 1
+                    os.removedirs(temp+dir1)
         else: wx.MessageBox('No default Rpository set.  Skipping Auto Update!', 'Info')
 
     def LoadDoc(self):