# HG changeset patch
# User sirebral
# Date 1259104720 21600
# Node ID 6c5f46a5924bfdc529606e38202c5efa376e02cb
# Parent 9f4d6f7eab8d9b67389522109c33d6bc739e7c7f
Traipse Beta '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 (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, , , , , , , 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.
diff -r 9f4d6f7eab8d -r 6c5f46a5924b orpg/chat/chatwnd.py
--- a/orpg/chat/chatwnd.py Mon Nov 23 20:34:38 2009 -0600
+++ b/orpg/chat/chatwnd.py Tue Nov 24 17:18:40 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
diff -r 9f4d6f7eab8d -r 6c5f46a5924b orpg/main.py
--- a/orpg/main.py Mon Nov 23 20:34:38 2009 -0600
+++ b/orpg/main.py Tue Nov 24 17:18:40 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"))
diff -r 9f4d6f7eab8d -r 6c5f46a5924b orpg/orpg_version.py
--- a/orpg/orpg_version.py Mon Nov 23 20:34:38 2009 -0600
+++ b/orpg/orpg_version.py Tue Nov 24 17:18:40 2009 -0600
@@ -4,7 +4,7 @@
#BUILD NUMBER FORMAT: "YYMMDD-##" where ## is the incremental daily build index (if needed)
DISTRO = "Traipse Beta"
DIS_VER = "Ornery Orc"
-BUILD = "091123-04"
+BUILD = "091124-00"
# This version is for network capability.
PROTOCOL_VERSION = "1.2"
diff -r 9f4d6f7eab8d -r 6c5f46a5924b orpg/templates/feature.xml
--- a/orpg/templates/feature.xml Mon Nov 23 20:34:38 2009 -0600
+++ b/orpg/templates/feature.xml Tue Nov 24 17:18:40 2009 -0600
@@ -1,24 +1,92 @@
-
+
+
+
+ !!Random::([#1d3-1],0)!!
+
+
+
+ !!Set 1::Enc 1!!
+
+
+ !!Set 1::Enc 2!!
+
+ !!Set 1::Enc 3!!
+
+
+
+
+
+ Dark Elves. Watch out!
+
+ Kobolds a plenty.
+
+ A Wandering Minotaur
+
+
+
+
+
+
+
+
+
+
+
+ Chapter 1 Part 2
+
+The adventurers have come this far.
+
+ Chapter 1 Part 3
+
+Is this the end already?
+
+ Chapter 1 Part 1
+
+An introduction to your adventure module can be placed here.
+
+
+
+
+ !!52 Card Deck::([#1d13-1], [#1d4-1])!!
+
+
+
+ AS
+ AD
+ ACAH
+
+ KS
+ KD
+ KCKH
+ QSQDQCQHJSJDJCJH10S10D10C10H9S9D9C9H8S8D8C8H7S7D7C7H6S6D6C6H5S5D5C5H4S4D4C4H3S3D3C3H2S2D2C2H
+
+
+
+
+
+
- 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.
+ 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@!
-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.
+ 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.
+Bonus Node Included: A small book node with 1 Chapter and 3 Parts.
diff -r 9f4d6f7eab8d -r 6c5f46a5924b upmana/updatemana.py
--- a/upmana/updatemana.py Mon Nov 23 20:34:38 2009 -0600
+++ b/upmana/updatemana.py Tue Nov 24 17:18:40 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):