On 8/5/2013 12:47 PM, Fidel Pérez wrote:
About the example, are there more files like that around? I find that
extremely useful to learn Leo ways from people who has used it long time.
Also, is there a full version of the rpg thing? I download that
version and wont open (opens but closes instantly), and the one I can
get by copy-paste in Leo in the git doesnt have any template to play
with/doesnt work, I keep getting the message
"This script only works on @template nodes."
Thank you.
Attached is what *should* be on github. Not sure why your downloaded
copy is broken.
There are templates under the "Templates" top-level node.
The template code is ugly as sin, but it serves its purpose.
-->Jake
On Monday, August 5, 2013 5:28:19 PM UTC+2, [email protected] wrote:
While I have not yet fixed the key binding problem, which prevents
me from actually testing Lea, I have thought up some questions.
Please, forgive me if I ask too many questions, but I am very
curious about Leo.
What I am trying to understand at this early stage is how powerful
can Leo be as a PIM.
Could you please comment on the following points?
1) are tags supported (attached to nodes, or branches, or trees)?
2) can images be included within a node, and be displayed along
with the text?
3) can external files (pdfs, etc) be linked to nodes, so that by
clicking on their link the external file is opened?
4) do Python plugins have access to the whole program API or just
to a restricted subset of commands?
5) can key shortcuts be defined for all commands in the API (or at
least, for all menu commands)?
6) can the user freely redefine key shortcuts? (without having to
go to the program's source).
Thanks
--
You received this message because you are subscribed to the Google
Groups "leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/groups/opt_out.
--
You received this message because you are subscribed to the Google Groups
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/groups/opt_out.
<?xml version="1.0" encoding="utf-8"?>
<!-- Created by Leo (http://webpages.charter.net/edreamleo/front.html) -->
<?xml-stylesheet ekr_test?>
<leo_file xmlns:leo="http://www.leo-editor.org/2011/leo" >
<leo_header file_format="2" tnodes="0" max_tnode_index="0" clone_windows="0"/>
<globals body_outline_ratio="0.5" body_secondary_ratio="0.5">
<global_window_position top="50" left="50" height="500" width="700"/>
<global_log_window_position top="0" left="0" height="0" width="0"/>
</globals>
<preferences/>
<find_panel_settings/>
<vnodes>
<v t="peckj.20130130110049.5559" a="E"><vh>Startup</vh>
<v t="peckj.20130130133524.1374"><vh>Buttons</vh>
<v t="peckj.20130204145403.7687"><vh>Table buttons</vh>
<v t="peckj.20130204145403.7688"><vh>@button roll-on-table</vh></v>
</v>
<v t="peckj.20130430085426.12554"><vh>Template buttons</vh>
<v t="peckj.20130430085426.12555" a="E"><vh>@button copy-template</vh>
<v t="peckj.20130430085426.13093"><vh>@rclick new-session</vh></v>
<v t="peckj.20130430085426.13094"><vh>@rclick new-character-sheet</vh></v>
<v t="peckj.20130501111619.2316"><vh>@rclick new-3-line-npc</vh></v>
</v>
</v>
<v t="peckj.20130130135139.1384"><vh>Tag-finding buttons</vh>
<v t="peckj.20130131083021.1418" a="E"><vh>Unused</vh>
<v t="peckj.20130130135455.1409"><vh>@@button pcs</vh></v>
<v t="peckj.20130130122926.1372"><vh>@@button npcs</vh></v>
<v t="peckj.20130130135455.1405"><vh>@@button locations</vh></v>
<v t="peckj.20130130135455.1407"><vh>@@button items</vh></v>
<v t="peckj.20130130135455.1406"><vh>@@button events</vh></v>
<v t="peckj.20130130135455.1408"><vh>@@button rules</vh></v>
</v>
<v t="peckj.20130201100641.14832" a="E"><vh>@button find</vh>
<v t="peckj.20130201100641.14821"><vh>@rclick pcs</vh></v>
<v t="peckj.20130201100641.14822"><vh>@rclick npcs</vh></v>
<v t="peckj.20130201100641.14823"><vh>@rclick locations</vh></v>
<v t="peckj.20130201100641.14824"><vh>@rclick items</vh></v>
<v t="peckj.20130201100641.14825"><vh>@rclick events</vh></v>
<v t="peckj.20130201100641.14826"><vh>@rclick rules</vh></v>
</v>
</v>
<v t="peckj.20130130135139.1385"><vh>Die-rolling buttons</vh>
<v t="peckj.20130131083021.1417"><vh>Unused</vh>
<v t="peckj.20130130160613.1417"><vh>@@button 1d20</vh></v>
<v t="peckj.20130130160613.1414"><vh>@@button 2df</vh></v>
<v t="peckj.20130131083021.1416"><vh>@@button 2d6</vh></v>
<v t="peckj.20130130135139.1386"><vh>@@button 3d6</vh></v>
<v t="peckj.20130130160613.1415"><vh>@@button 1df</vh></v>
</v>
<v t="peckj.20130130134116.1382"><vh>@button 4df</vh>
<v t="peckj.20130201100641.14999"><vh>@rclick 2df</vh></v>
<v t="peckj.20130201100641.14831"><vh>@rclick 1df</vh></v>
</v>
<v t="peckj.20130130160613.1418"><vh>@button 1d6</vh>
<v t="peckj.20130201100641.14997"><vh>@rclick 2d6</vh></v>
<v t="peckj.20130201100641.14829"><vh>@rclick 3d6</vh></v>
</v>
<v t="peckj.20130130160613.1416"><vh>@button 1d100</vh></v>
<v t="peckj.20130201100641.14995"><vh>@button roll-dice</vh>
<v t="peckj.20130201100641.14827"><vh>@rclick 1d100</vh></v>
<v t="peckj.20130201100641.15001"><vh>@rclick 1d20</vh></v>
<v t="peckj.20130201100641.14828"><vh>@rclick 1d6</vh></v>
<v t="peckj.20130201100641.14997"></v>
<v t="peckj.20130201100641.14829"></v>
<v t="peckj.20130201100641.14830"><vh>@rclick 4df</vh></v>
<v t="peckj.20130201100641.14999"></v>
<v t="peckj.20130201100641.14831"></v>
</v>
</v>
</v>
<v t="peckj.20130130133524.1373"><vh>Scripts</vh>
<v t="peckj.20130130110049.5563" a="E"><vh>@common code</vh>
<v t="peckj.20130430085426.12556"><vh>tags</vh></v>
<v t="peckj.20130430085426.12557"><vh>dice</vh></v>
<v t="peckj.20130430085426.12558"><vh>tables</vh></v>
<v t="peckj.20130430085426.12559" a="E"><vh>templates</vh>
<v t="peckj.20130430085426.12561"><vh>string variable replacement</vh></v>
<v t="peckj.20130430085426.12560"><vh>node to list</vh></v>
<v t="peckj.20130430085426.12929"><vh>list to node</vh></v>
</v>
</v>
</v>
</v>
<v t="peckj.20130130140936.1402"><vh>ScratchPad</vh></v>
<v t="peckj.20130130140936.1403"><vh>ScriptPad</vh></v>
<v t="peckj.20130130140936.1400"><vh>NPCs</vh>
<v t="peckj.20130130110049.5561"><vh>John Doe #npc</vh></v>
<v t="peckj.20130130110049.5562"><vh>Jane Smith #npc</vh></v>
</v>
<v t="peckj.20130204145403.1454"><vh>Tables</vh>
<v t="peckj.20130204145403.1455" a="E"><vh>@table Example Treasure Table</vh>
<v t="peckj.20130204145403.1456"><vh>1. 2d6 copper</vh></v>
<v t="peckj.20130204145403.1457"><vh>2. 1 minor magic item</vh></v>
<v t="peckj.20130204145403.1458"><vh>3. 1d4 gold</vh></v>
<v t="peckj.20130204145403.1459"><vh>4. 1 major magic item</vh></v>
<v t="peckj.20130204145403.1460"><vh>5. Reroll twice</vh></v>
<v t="peckj.20130204145403.1461"><vh>6. Reroll, double</vh></v>
</v>
</v>
<v t="peckj.20130430085426.1693"><vh>Templates</vh>
<v t="peckj.20130430085426.1692"><vh>Session Planning Template</vh>
<v t="peckj.20130430085426.1694"><vh>@template <$campaign> Session #<$num> (<$date>)</vh>
<v t="peckj.20130430085426.1704"><vh>@destination Sessions</vh></v>
<v t="peckj.20130430085426.13024"><vh>@default <$campaign></vh></v>
<v t="peckj.20130430085426.1695"><vh>@item Who's Coming?</vh></v>
<v t="peckj.20130430085426.1696"><vh>@item In-World Start Date?</vh></v>
<v t="peckj.20130430085426.1697"><vh>@item Log</vh></v>
<v t="peckj.20130430085426.1698"><vh>@item Threads</vh>
<v t="peckj.20130430085426.1699"><vh>@item High Priority</vh></v>
<v t="peckj.20130430085426.1700"><vh>@item Low Priority</vh></v>
</v>
<v t="peckj.20130430085426.1701"><vh>@item News</vh>
<v t="peckj.20130430085426.1703"><vh>@item Out of Character</vh></v>
<v t="peckj.20130430085426.1702"><vh>@item In Character</vh></v>
</v>
</v>
</v>
<v t="peckj.20130430085426.13075"><vh>Character Sheet Template</vh>
<v t="peckj.20130430085426.13076"><vh>@template Character Sheet: <$name> (<$playername>) #pc</vh>
<v t="peckj.20130430085426.13081"><vh>@destination Player Characters</vh></v>
<v t="peckj.20130430085426.13077"><vh>@item Attributes</vh></v>
<v t="peckj.20130430085426.13078"><vh>@item Inventory</vh></v>
<v t="peckj.20130430085426.13079"><vh>@item Abilities</vh></v>
<v t="peckj.20130430085426.13080"><vh>@item Notes</vh></v>
</v>
</v>
<v t="peckj.20130501111619.2309"><vh>Quick 3-Line NPC Template</vh>
<v t="peckj.20130501111619.2310"><vh>@template <$name> #npc</vh>
<v t="peckj.20130501111619.2311"><vh>@destination NPCs</vh></v>
<v t="peckj.20130501111619.2312"><vh>@item What you see (appearance and activity)</vh></v>
<v t="peckj.20130501111619.2313"><vh>@item Who they are (job and personality)</vh></v>
<v t="peckj.20130501111619.2314"><vh>@item Story hook</vh></v>
</v>
</v>
</v>
<v t="peckj.20130430085426.12926"><vh>Sessions</vh></v>
<v t="peckj.20130430085426.13082"><vh>Player Characters</vh></v>
</vnodes>
<tnodes>
<t tx="peckj.20130130110049.5559">@ please see the Scripts node for more information
@c
@color
@language python
@tabwidth -2
</t>
<t tx="peckj.20130130110049.5561"></t>
<t tx="peckj.20130130110049.5562"></t>
<t tx="peckj.20130130110049.5563">## this script creates a few functions
## for later retrieval/use by buttons/minibuffer commands
@others
</t>
<t tx="peckj.20130130122926.1372">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('npc')</t>
<t tx="peckj.20130130133524.1373">@ The node Startup -> Scripts -> @common code contains the following
function definitions:
## rpg_find_by_tag(tag)
This function, when called, uses the Nav pane to search for #tag.
For example, to search for nodes with the tag "#npc", call
rpg_find_by_tag('npc').
## rpg_roll_dice(dstring)
This function, when called, outputs the results of rolling some
dice (defined by dstring, a common die-notation string such as
3d6+4) to a pane called Dice.
To use the functions included in @common code, you need to add
this line to the top of any script in which they are to be used:
exec(g.findTestScript(c,'@common code'))
That will find and load the script, ensuring that the functions
are in scope and able to be used.
@c</t>
<t tx="peckj.20130130133524.1374">@ To enable buttons, make sure they only have a single @ in their headlines.
Likewise, to disable them, make sure their headline starts with @@.
@c</t>
<t tx="peckj.20130130134116.1382">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('4d3-8')
# equivalent to 4dF: 1dF is 1d3-2.
# A dF is a Fudge/Fate die, a six-sided die
# marked with +,+,0,0,-,-.</t>
<t tx="peckj.20130130135139.1384"></t>
<t tx="peckj.20130130135139.1385"></t>
<t tx="peckj.20130130135139.1386">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('3d6')</t>
<t tx="peckj.20130130135455.1405">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('location')</t>
<t tx="peckj.20130130135455.1406">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('event')</t>
<t tx="peckj.20130130135455.1407">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('item')</t>
<t tx="peckj.20130130135455.1408">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('rule')</t>
<t tx="peckj.20130130135455.1409">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('pc')</t>
<t tx="peckj.20130130140936.1400"></t>
<t tx="peckj.20130130140936.1402">@ use this node as a scratch pad for quick notes or tracking ephemeral data
@c
</t>
<t tx="peckj.20130130140936.1403">@color
@language python
@tabwidth -2
## this line is required to use the functions provided by the script
exec(g.findTestScript(c,'@common code'))
## use this node to write quick scripts, such as complex dierolls
## run with Ctrl+B
## your code here
rpg_roll_dice("2d3-4+1d5-3")
</t>
<t tx="peckj.20130130160613.1414">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('2d3-4')
# equivalent to 2dF: 1dF is 1d3-2.
# A dF is a Fudge/Fate die, a six-sided die
# marked with +,+,0,0,-,-.</t>
<t tx="peckj.20130130160613.1415">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d3-2')
# A dF is a Fudge/Fate die, a six-sided die
# marked with +,+,0,0,-,-.</t>
<t tx="peckj.20130130160613.1416">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d100')
</t>
<t tx="peckj.20130130160613.1417">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d20')</t>
<t tx="peckj.20130130160613.1418">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d6')
</t>
<t tx="peckj.20130131083021.1416">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('2d6')</t>
<t tx="peckj.20130131083021.1417"></t>
<t tx="peckj.20130131083021.1418"></t>
<t tx="peckj.20130201100641.14821">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('pc')</t>
<t tx="peckj.20130201100641.14822">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('npc')</t>
<t tx="peckj.20130201100641.14823">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('location')</t>
<t tx="peckj.20130201100641.14824">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('item')</t>
<t tx="peckj.20130201100641.14825">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('event')</t>
<t tx="peckj.20130201100641.14826">exec(g.findTestScript(c,'@common code'))
rpg_find_by_tag('rule')</t>
<t tx="peckj.20130201100641.14827">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d100')
</t>
<t tx="peckj.20130201100641.14828">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d6')
</t>
<t tx="peckj.20130201100641.14829">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('3d6')</t>
<t tx="peckj.20130201100641.14830">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('4d3-8')
# equivalent to 4dF: 1dF is 1d3-2.
# A dF is a Fudge/Fate die, a six-sided die
# marked with +,+,0,0,-,-.</t>
<t tx="peckj.20130201100641.14831">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d3-2')
# A dF is a Fudge/Fate die, a six-sided die
# marked with +,+,0,0,-,-.</t>
<t tx="peckj.20130201100641.14832">g.es('Right click the button for options.')</t>
<t tx="peckj.20130201100641.14995">g.es('Right click the button for options.')</t>
<t tx="peckj.20130201100641.14997">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('2d6')</t>
<t tx="peckj.20130201100641.14999">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('2d3-4')
# equivalent to 2dF: 1dF is 1d3-2.
# A dF is a Fudge/Fate die, a six-sided die
# marked with +,+,0,0,-,-.</t>
<t tx="peckj.20130201100641.15001">exec(g.findTestScript(c,'@common code'))
rpg_roll_dice('1d20')</t>
<t tx="peckj.20130204145403.1454"></t>
<t tx="peckj.20130204145403.1455"></t>
<t tx="peckj.20130204145403.1456">You find 2d6 copper</t>
<t tx="peckj.20130204145403.1457">1 minor magic item, with 2 minor powers</t>
<t tx="peckj.20130204145403.1458">You find 1d4 gold</t>
<t tx="peckj.20130204145403.1459">You find 1 major magic item, with 1 minor and 1 major power.</t>
<t tx="peckj.20130204145403.1460">Reroll on this table twice, finding both.</t>
<t tx="peckj.20130204145403.1461">Reroll on this table once, doubling the result.</t>
<t tx="peckj.20130204145403.7687"></t>
<t tx="peckj.20130204145403.7688">exec(g.findTestScript(c,'@common code'))
rpg_roll_on_table(p)</t>
<t tx="peckj.20130430085426.12554"></t>
<t tx="peckj.20130430085426.12555">exec(g.findTestScript(c,'@common code'))
rpg_copy_template(p)</t>
<t tx="peckj.20130430085426.12556">def rpg_find_by_tag(tag):
''' finds nodes marked with a hashtag with the quicksearch
plugin (nav tab)
'''
tag = '#' + tag
c.frame.log.selectTab('Nav')
nav = c.frame.log.widget
nav.ui.lineEdit.setText(tag)
nav.returnPressed()
c.executeMinibufferCommand('focus-to-nav')</t>
<t tx="peckj.20130430085426.12557">def rpg_roll_dice(dstring):
''' roll dice '''
import random
diestring = ("1d6" if not dstring else dstring)
values = []
diestring2 = diestring.replace("-", " -")
diestring2 = diestring2.replace("+", " ")
dice = diestring2.lower().split()
for die in dice:
if die.find('d') != -1:
num = die[0:die.index('d')]
num = (1 if num == '' else int(num))
sides = int(die[die.index('d')+1:])
for i in range(num):
values.append(random.randrange(1, sides+1))
else:
values.append(int(die))
c.frame.log.selectTab('Dice')
g.es('%s %s Total: %d' % (diestring, values, sum(values)), color='blue', tabName='Dice')</t>
<t tx="peckj.20130430085426.12558">def rpg_roll_on_table(pos):
import random
if pos and pos.h.startswith('@table'):
tablename = pos.h[7:]
if pos.hasChildren():
idx = random.randrange(0, pos.numberOfChildren())
pos = pos.moveToNthChild(idx)
c.frame.log.selectTab('Table Results')
g.es('\nResult of roll on table %s:' % tablename, color='blue', tabName='Table Results')
g.es('%s\n---\n%s\n---------\n\n' % (pos.h, pos.b), color='black', tabName='Table Results')
else:
g.es('This table is empty, please add some children nodes')
else:
g.es('Please select a @table node to roll on the table')</t>
<t tx="peckj.20130430085426.12559">def rpg_copy_template(pos):
''' copy template, prompting for filling in info '''
# imports
import leo.core.leoGlobals as g
if g.app.gui.guiName() == "qt":
from PyQt4 import QtCore, QtGui, uic
Qt = QtCore.Qt
varvals = {}
if pos and pos.h.startswith('@template'):
# get title
titlehead = pos.h[10:]
titlebody = pos.b
destination = None
tree = []
for p in pos.children():
# get destination
if p.h.startswith('@destination') and destination is None:
destination = p.h[13:]
# get items
elif p.h.startswith('@item'):
item = rpg_node_to_list(p)
tree.append(item)
# defaults
elif p.h.startswith('@default'):
name = p.h[9:]
varvals[name] = p.b
if destination is None:
g.es("This template has no @destination nodes. Please supply one.")
return
# gather up substitution variables
vars = []
vars += rpg_find_vars(titlehead)
vars += rpg_find_vars(titlebody)
for p in pos.subtree():
if p.h.startswith('@item'):
vars += rpg_find_vars(p.h)
vars += rpg_find_vars(p.b)
vars = [x for i,x in enumerate(vars) if x not in vars[:i]]
# prompt for values, except defaults
for var in [v for v in vars if v not in varvals]:
if Qt:
x0,ok = QtGui.QInputDialog.getText(None, 'Value for Template Variable' ,'%s value:' % var)
if not ok:
x0 = None
return # cancel is a cancel for the whole lot
else:
x0 = str(x0)
else:
x0 = g.app.gui.runAskOkCancelStringDialog(
self.c,'Value for Template Variable' ,'%s value:' % var)
varvals[var] = x0
# rewrite contents
## title.h
titlehead = rpg_replace_string_vars(titlehead, varvals)
## title.b
titlebody = rpg_replace_string_vars(titlebody, varvals)
## items
tree = [rpg_replace_vars(t, varvals) for t in tree]
# commit new subtree
## go to top level node with destination as the title
pos = g.findTopLevelNode(c, destination)
try:
pos = pos.insertAsLastChild()
except:
g.es("Top level node %s does not exist! Exiting." % destination)
return
## insert new title node
pos.h = titlehead
pos.b = titlebody
## create the prefilled template
for n in tree:
if(tree.index(n) == 0):
pos = pos.insertAsLastChild()
else:
pos = pos.insertAfter()
pos.h = n[0]
pos.b = n[1]
rpg_insert_child_nodes(pos, n[2])
# cleanup + redraw
w = c.frame.body.bodyCtrl
w.setAllText(pos.b)
c.redraw(pos)
else:
g.es("This script only works on @template nodes.")
return</t>
<t tx="peckj.20130430085426.12560">def rpg_node_to_list(pos):
''' returns a node as a list, in the form of [headline, body, list-of-children-as-lists]
also removes @item from headline '''
if pos.h.startswith('@item'):
head = pos.h[6:]
body = pos.b
children = []
for p in pos.children():
c = rpg_node_to_list(p)
if c is not None:
children.append(c)
return [head, body, children]
else:
return None
def rpg_replace_string_vars(string, varvals):
''' replaces all instances of keys in string with values '''
for s in varvals:
# incorrect for most cases, but works here
string = string.replace(s, varvals[s])
return string</t>
<t tx="peckj.20130430085426.12561">def rpg_find_vars(string):
''' finds all the variables in a given string '''
import re
regex = re.compile("<\$\w+>")
return regex.findall(string)
def rpg_replace_vars(node_as_list, varvals):
''' runs rpg_replace_string_vars on head, body, and children recursively '''
head = rpg_replace_string_vars(node_as_list[0], varvals)
body = rpg_replace_string_vars(node_as_list[1], varvals)
children = [rpg_replace_vars(c, varvals) for c in node_as_list[2]]
return [head, body, children]
</t>
<t tx="peckj.20130430085426.12926">Destination for Session template copies</t>
<t tx="peckj.20130430085426.12929">def rpg_insert_child_nodes(pos, children):
apos = pos.copy()
for c in children:
if children.index(c) == 0:
apos = apos.insertAsLastChild()
else:
apos = apos.insertAfter()
apos.h = c[0]
apos.b = c[1]
rpg_insert_child_nodes(apos, c[2])
</t>
<t tx="peckj.20130430085426.13024">My Campaign Name!</t>
<t tx="peckj.20130430085426.13075">Generic example sheet, loosely based off of Mint Fudge.</t>
<t tx="peckj.20130430085426.13076"></t>
<t tx="peckj.20130430085426.13077">Agility: <$agility>
Brawn: <$brawn>
Mind: <$mind>
Will: <$will>
Presence: <$presence>
Karma: <$karma>
</t>
<t tx="peckj.20130430085426.13078"></t>
<t tx="peckj.20130430085426.13079"></t>
<t tx="peckj.20130430085426.13080"></t>
<t tx="peckj.20130430085426.13081"></t>
<t tx="peckj.20130430085426.13082">Destination for Character Sheet template copies</t>
<t tx="peckj.20130430085426.13093">exec(g.findTestScript(c,'@common code'))
rpg_copy_template(g.findNodeAnywhere(c, "@template <$campaign> Session #<$num> (<$date>)"))</t>
<t tx="peckj.20130430085426.13094">exec(g.findTestScript(c,'@common code'))
rpg_copy_template(g.findNodeAnywhere(c, "@template Character Sheet: <$name> (<$playername>) #pc"))
</t>
<t tx="peckj.20130430085426.1692">Based on http://www.roleplayingtips.com/readissue.php?number=488#F1
Use the "New Session" button to add a new session.</t>
<t tx="peckj.20130430085426.1693">Three types of nodes:
@template nodes contain a template
@destination nodes tell which top-level node to copy them into
@item nodes are children of their parents - all children of @template nodes that need to be in a template need to be @item nodes.
@default nodes are default values for variables - the body is the value, the headline is the variable
In addition, the following variable substitution scheme will allow for prompting and pre-filling values: <$varname></t>
<t tx="peckj.20130430085426.1694"></t>
<t tx="peckj.20130430085426.1695">John
Jane
Jack
Jenny
Jeremy</t>
<t tx="peckj.20130430085426.1696"></t>
<t tx="peckj.20130430085426.1697"></t>
<t tx="peckj.20130430085426.1698"></t>
<t tx="peckj.20130430085426.1699"></t>
<t tx="peckj.20130430085426.1700"></t>
<t tx="peckj.20130430085426.1701"></t>
<t tx="peckj.20130430085426.1702"></t>
<t tx="peckj.20130430085426.1703"></t>
<t tx="peckj.20130430085426.1704"></t>
<t tx="peckj.20130501111619.2309">Based on Roleplaying Tips newsletter, 01 May 2013.</t>
<t tx="peckj.20130501111619.2310"></t>
<t tx="peckj.20130501111619.2311"></t>
<t tx="peckj.20130501111619.2312">[<$age> <$gender> <$race> <$class>] <$descriptors>; <$activity></t>
<t tx="peckj.20130501111619.2313"><$job>. <$personality>.</t>
<t tx="peckj.20130501111619.2314"><$storyhook></t>
<t tx="peckj.20130501111619.2316">exec(g.findTestScript(c,'@common code'))
rpg_copy_template(g.findNodeAnywhere(c, "@template <$name> #npc"))
</t>
</tnodes>
</leo_file>