2020-05-30 XP, Gold, and Emacs

There are those rare occasions where my love for an editor that can be extended while you’re using it – Emacs! – and my love for role-playing games come together.

I use big tables like the following on the status pages of my various campaign wikis:

|= Character    |= Share |=     XP |=   Gold |=      Level |= XP next |= Home / final rest |= Health |= Player |
|[[Vangelis]]        | 1 |    12367|    10033|      thief 5| 20'001|[[Greyheim]] | |Sam |
|[[Maram]]           | ½ |    11793|     5324|   halfling 4| 16’251|[[Greyheim]] | |Sam |
|[[Magdalena]]       | ½ |    13203|     1816| magic-user 4| 20'001|[[Greyheim]] | |Sam |
|[[Delina]]          | ½ |     6781|     4095|      thief 3|  5'001|[[Greyheim]] | |Sam |
|[[Eldakkar]]        | 1 |    48013|     9938| magic-user 5| 40'001|[[Greyheim]] | |Flavio |
|[[Ernst Ormott]]    | ½ |    18158|     2626|    fighter 4|  16250|[[Greyheim]] | |Flavio |
|[[Mia]]             | ½ |     6843|      108|  Assistant 4| 10'001|[[Greyheim]] | |Flavio |
|[[Anouk]]           | 1 |    35001|        0|      dwarf 6| 70'001|[[Stormhold]] | |Ben |
|[[Strahl]]          | ½ |    40001|       95| magic-user 6| 80'001|[[Stormhold]] | |Ben |
|[[Kristina]]        | ½ |    11188|     2740|    fighter 4| 16'250|[[Stormhold]] | |Ben |
|[[John Greene]]     | ½ |    20001|        0| magic-user 5| 40'001|[[Stormhold]] | |Ben |
|[[Dorn Ironfoot]]   | ½ |     5501|        0|      dwarf 3|  8'751|[[Stormhold]] | |Ben |
|[[Yifan]]           | 1 |    34219|    16450|        elf 5| 65’001|[[Deathwatch Keep]] | |Grisha |
|[[Annica]]          | ½ |    18670|     8671|      dwarf 5| 35’001|[[Greyheim]] | |Grisha |
|[[Joana]]           | ½ |     2643|      300|    fighter 2|  4'065|[[Greyheim]] | |Grisha |
|[[Lila-Marie]]      | ½ |       52|     1792|        elf 1|  4'065|[[Greyheim]] | |Grisha |
|[[Sugo]]            | 1 |    19895|     7073|    fighter 5| 32'501|[[Greyheim]] | |Petr |
|[[Slui]]            | ½ |     5264|     1965|   halfling 3|  8,125|[[Greyheim]] | |Petr |
|[[Maxim]]           | ½ |     6033|      243|    fighter 3|  8'125|[[Greyheim]] | |Petr |
|[[Saray]]           | 1 |     1878|     2537| aquamancer 1|  2'501|[[Greyheim]] | |Natalie |
|[[Pringles]]        | 1 |    16468|     7577|    fighter 5| 32'501|[[Greyheim]] | |Petr's wife |
|[[Maximo]]          | 1 |     2042|      885|      thief 2|  2'501|[[Greyheim]] | |Giorgio |
|[[Adrijana]]        |   |     4560|     1743|  geomancer 2|  5'001|killed by bugbears | ☠ |Flavio |
|[[Tugra]]           |   |     5272|     -262|    fighter 2|  4'065|petriefied by a basilisk | ⌛ |Adrian |
|[[Sascha]]          | 1 |    13554|     1704|     cleric 5| 25'001|retired and runs a church | 💜 |Flavio |
|[[Lothar]]          |   |      750|       41|      dwarf 1|  2'187|[[Greyheim]] | 💜 |Chris |
|[[Tiana]]           |   |       45|      118|   halfling 1|  2'035|killed by a giant bat | ☠ |Sam |
|[[Arbogast]]        |   |      260|      682|    fighter 1|  2'035|ambushed by jackalweres | ☠ |Sam |
|[[Marika]]          |   |     1953|     2119| magic-user 2|  5’001|[[Greyheim]] | ⌛ |Sam |
|[[Simed]]           |   |      805|     1699|      dwarf 1|  2'187|[[Greyheim]] | 💜 |Sam |
|[[Neid]]            |   |       58|      694|        elf 1|  4'065|shot by hobgoblins | ☠ |Sam |
|[[Devd]]            |   |      694|      413|    fighter 1|  2'035|shot by hobgoblins | ☠ |Sam |
|[[Pietro]]          |   |       77|       11| pyromancer 1|  2'501|shared space whit a spear  | ☠ |Andre |
|[[Kim]]             |   |     3261|     1835|        elf 1|  4'065|killed by ear seekers | ☠ |Sam |
|[[Tristan]]         |   |        0|        0|   halfling 1|     - |killed by boring beatles | ☠ |Flavio |
|[[Aiza]]            |   |      997|      113|   halfling 1|     - |fell into a concealed pit | ☠ |Luca |
|[[Hiad]]            |   |       17|        1|      dwarf 1|     - |eaten by beatles | ☠ |Miae |
|[[Honey]]           |   |        0|        0|   halfling 1|     - |eaten by kobolds | ☠ |Miae |
|[[Sivan]]           |   |        0|        0|     cleric 1|     - |eaten by kobolds | ☠ |Sam |
|[[Desi]]            |   |     3474|     1908|    fighter 2|  4'065|held under the Freya temple | 🐺 💜 |Flavio |

I used Emacs to distribute gold and experience points because I’m not a big user of spreadsheets. For the longest time, I used a set of functions that created a form within Emacs, made up of widgets.

The code I had turned this into a form like the following:

XP total:   0            
Gold zu XP: 0            
Gold total: 0            
[ ] [[Vangelis]]        Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Maram]]           Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Magdalena]]       Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Delina]]          Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Eldakkar]]        Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Ernst Ormott]]    Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Mia]]             Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Anouk]]           Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Strahl]]          Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Kristina]]        Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[John Greene]]     Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Dorn Ironfoot]]   Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Yifan]]           Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Annica]]          Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Joana]]           Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Lila-Marie]]      Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Sugo]]            Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Slui]]            Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Maxim]]           Share: [ ] 1 [X] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Saray]]           Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Pringles]]        Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Maximo]]          Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      
[ ] [[Sascha]]          Share: [X] 1 [ ] ½ [ ] ⅓   Gold spent: 0       Transfer: 0      

[Go!]

You could check those boxes, arrange for money transfers, arrange for gold to be spent (turning it into experience points), you could distribute gold found (distributed according to shares, one share per main player character, half a share for retainers), or experience points gained (based on monsters defeated and distributed equally among characters).

Sadly, there interface was clumsy. Checking the necessary boxes took more time than I was willing to spend.

Later, I tried to write something like a chat interface. I basically wanted a special RPG shell with which to interact. I imagined myself typing parse <url> to read the data from the campaign wiki, filter Flavio Sam Ben to tell the system who was present, distribute 500 gold and distribute 200 xp to distribute gold and experience points, and save to save the result back to the wiki.

I spent a lot of time writing code and did very little distributing of gold and experience points. I was also a bit frustrated. Why was I using rules that required me to use software again? That question remains unanswered.

My latest attempt at writing code involves simply marking numbers using C-=, distribute a certain amount among all the marked numbers using M-C-=, add a certain amount among all the markednumbers using M-C-=, and remembering that C-+ already exists to increment the number at point.

It needs a bunch of convenience functions to quickly mark all the numbers at a particular column for lines matching a particular regular expression, and then we should be good to go!

Tags:

Comments


Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. Note: in order to facilitate peer review and fight vandalism, we will store your IP number for a number of days. See Privacy Policy for more information. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Just say HELLO

Referrers: You might like these…