1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
|
<!-- Automatically generated by emacsconf-publish-after-page -->
<a name="solo-mainVideo-transcript"></a>
# Transcript
Introduction
[[!template new="1" text="""Hi there, I'm Howard Abrams. You may remember me""" start="00:00:00.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""from past conference talks""" start="00:00:05.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""as "Literate DevOps and the Temple of Doom"""" start="00:00:07.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and "Using Eshell for Fun and Profit".""" start="00:00:10.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I'm here to talk to you about my latest Emacs project:""" start="00:00:13.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""playing games, solo role-playing games.""" start="00:00:16.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I started playing RPGs when I got my first copy""" start="00:00:19.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""of Dungeons & Dragons when I was 12.""" start="00:00:23.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Yes, my original copy burned""" start="00:00:25.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""in the Great Satanic Panic of the 1980s,""" start="00:00:28.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but that's another story.""" start="00:00:30.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I started playing other RPGs like GURPS.""" start="00:00:32.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""These are some of my notes.""" start="00:00:37.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Back then, I was typing them in Emacs,""" start="00:00:40.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but I formatted them with LaTeX.""" start="00:00:42.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Later, when I was introducing my kids""" start="00:00:46.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to role-playing games,""" start="00:00:49.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I actually typed them up still in Emacs,""" start="00:00:50.840" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but now formatted them for a tablet.""" start="00:00:53.581" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I wrote a little JavaScript code""" start="00:00:57.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""that allowed me to click on it, and it would roll dice,""" start="00:00:59.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""generate random events, keep track of turn order,""" start="00:01:03.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""you know, everything,""" start="00:01:06.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""so I didn't have to slow down the action of the game.""" start="00:01:07.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Well, when my kids got older,""" start="00:01:10.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I still managed to sneak in a game of D&D""" start="00:01:13.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""once a week at lunch.""" start="00:01:15.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""This pastime came to a screeching halt with the pandemic.""" start="00:01:17.320" video="mainVideo-solo" id="subtitle"]]
Solo RPGs
[[!template new="1" text="""I turned to playing role-playing games by myself""" start="00:01:20.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to get my fix. Playing these silly elf games in solo mode""" start="00:01:23.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""has been part of the game for many years,""" start="00:01:28.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but with so many of us stuck at home,""" start="00:01:29.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""solo role-playing games really expanded,""" start="00:01:32.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""creative people releasing some amazing ideas.""" start="00:01:35.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""What's a solo RPG like? Well, it's somewhere in the middle""" start="00:01:40.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""of writing your own story, where anything's possible,""" start="00:01:44.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but you've got to do all the imaginative work;""" start="00:01:47.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""or reading a choose-your-own-adventure book,""" start="00:01:50.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""where the text is given to you,""" start="00:01:53.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and you have free, a few predetermined paths;""" start="00:01:55.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and tactical battle games,""" start="00:01:59.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""where dice determines everything.""" start="00:02:01.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""It kind of fits in the sweet spot between those.""" start="00:02:03.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""While I started removing the Game Master""" start="00:02:05.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""using the Mythic GM Emulator,""" start="00:02:08.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Ironsworn really captivated me.""" start="00:02:12.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I began with dice, pencils, notebooks, you know,""" start="00:02:15.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""just like when I was a kid. But taking notes on paper?""" start="00:02:19.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Yeah, you know me. That's not my jam. Org mode is.""" start="00:02:23.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""And, you know, notes have to be in Org,""" start="00:02:28.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""well, why not write a little dice roller in Lisp?""" start="00:02:31.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Well, when Shawn Tomkin released his Ironsworn""" start="00:02:35.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""under the Creative Commons, well,""" start="00:02:38.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I could just download the entire text.""" start="00:02:41.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I figured I could just render the entire game in Emacs.""" start="00:02:43.920" video="mainVideo-solo" id="subtitle"]]
Demo
[[!template new="1" text="""All right, enough talk. Let's get some Emacs action here,""" start="00:02:47.440" video="mainVideo-solo" id="subtitle"]]
[[!template text="""while I show you a bit of my game.""" start="00:02:51.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""When playing a solo RPG,""" start="00:02:55.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I jot down the story notes in an Org file.""" start="00:02:57.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I mean, did you expect anything less from me?""" start="00:02:59.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I alternate between lengthy prose and short notes.""" start="00:03:02.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""As I'm both the writer and the audience,""" start="00:03:07.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the goal is just enjoyment.""" start="00:03:10.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, this document is both a record log of my game sessions,""" start="00:03:12.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""as well as my character's character sheet.""" start="00:03:17.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""In most RPGs, a player's focus is a character sheet""" start="00:03:20.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""that lists all the attributes, the stats, equipment,""" start="00:03:24.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""powers, you know, that sort of thing.""" start="00:03:27.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""For my game, I wanted the focus to be the prose,""" start="00:03:28.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""or at least the notes.""" start="00:03:32.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, I put down all the stats as Org mode properties.""" start="00:03:34.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Now, I can collapse a property drawer""" start="00:03:38.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and have functions""" start="00:03:40.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""that just grab values from these properties.""" start="00:03:42.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""All right, let's play. While not important to my talk,""" start="00:03:45.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I'm in the middle of a game. My character, Tegan,""" start="00:03:50.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""promised to help a village by tracking down""" start="00:03:52.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the son of a village chief. A less-than-stellar roll""" start="00:03:54.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""meant I didn't catch him before he entered""" start="00:03:59.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the mysterious underground structure""" start="00:04:01.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""of a relic of an ancient people.""" start="00:04:03.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I just finished playing out the journey,""" start="00:04:06.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and he's about to enter into the Catacombs of Svala's Blood.""" start="00:04:08.400" video="mainVideo-solo" id="subtitle"]]
Randomization
[[!template new="1" text="""Why that name? Well, that was actually what came up""" start="00:04:11.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""from an extensive random number generator that I wrote.""" start="00:04:15.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""As I wrote more and more functions""" start="00:04:19.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to help me play this game,""" start="00:04:21.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and since I don't play all the time,""" start="00:04:23.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I created hydra. I can roll dice,""" start="00:04:25.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I can roll dice challenges against the character stats,""" start="00:04:30.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I can adjust stats. Lots of random generators""" start="00:04:34.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""come from this oracle section.""" start="00:04:38.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""For instance, are footprints going through the door?""" start="00:04:39.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I press `c`, and I'm prompted with how likely.""" start="00:04:43.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Since the villagers gave Tegan vague directions,""" start="00:04:46.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and he didn't see any signs the contrary,""" start="00:04:51.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I chose "likely". And, well, it originally said yes,""" start="00:04:53.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and that's why I jotted this information down.""" start="00:04:58.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Now, this is different than my character's ability""" start="00:05:01.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to notice the prints. This is about generating the story,""" start="00:05:03.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""something that the game master would do""" start="00:05:07.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""in a typical role-playing game.""" start="00:05:10.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Now, if I wanted to name something,""" start="00:05:12.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""or even the current weather,""" start="00:05:14.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I have random tables with the `C` keystroke.""" start="00:05:16.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Hmm, weather. Oh, it's summer, so hey,""" start="00:05:20.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""it's nice and clear. All right, let's play.""" start="00:05:27.280" video="mainVideo-solo" id="subtitle"]]
Moves
[[!template new="1" text="""The action in Ironsworn,""" start="00:05:31.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""like other Powered by the Apocalypse games,""" start="00:05:34.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""is driven by moves. So, I hit the `m` key,""" start="00:05:37.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and all the moves show up.""" start="00:05:44.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Now, I don't think I need to espouse""" start="00:05:46.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the virtues of completing-read enhancements like Ivy.""" start="00:05:49.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Here, I'm using orderless with vertico""" start="00:05:52.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to help me find my choices.""" start="00:05:55.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Since I've discovered a site, let's play that move.""" start="00:05:57.720" video="mainVideo-solo" id="subtitle"]]
Reference
[[!template new="1" text="""I seldom remember the details for the moves,""" start="00:06:03.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""so I figured, why not put the text of the book""" start="00:06:06.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""in an Org file and show it in a side window?""" start="00:06:09.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""The prompt at the bottom, asking for a name,""" start="00:06:11.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""is driven by the content in the displayed Org file.""" start="00:06:15.440" video="mainVideo-solo" id="subtitle"]]
[[!template text="""This allows me to enhance my game without""" start="00:06:18.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""changing the original code. So, let's call this story arc,""" start="00:06:21.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Exploring the Catacombs of Svala's Blood.""" start="00:06:25.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Ooh, sounds epic.""" start="00:06:31.840" video="mainVideo-solo" id="subtitle"]]
Story arcs
[[!template new="1" text="""Ironsworn tracks the beats of a narrative,""" start="00:06:34.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""so major plot points take up more room in the fiction""" start="00:06:37.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""than minor plot points.""" start="00:06:40.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Similar games like Blades in the Dark""" start="00:06:42.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""use numbers to track these, so you can say something like,""" start="00:06:45.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""we're three quarters of the way through this story arc.""" start="00:06:48.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Ironsworn just uses labels,""" start="00:06:51.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and while I want this particular story arc""" start="00:06:53.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to be significant, I really just want to get in,""" start="00:06:55.840" video="mainVideo-solo" id="subtitle"]]
[[!template text="""find this person, and get out.""" start="00:06:59.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, I'm going to call this "short".""" start="00:07:00.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Next, it's asking about an Org mode header placement.""" start="00:07:04.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""While I originally wanted my Org files""" start="00:07:09.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to be completely flexible,""" start="00:07:12.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""one thing I noticed in playing""" start="00:07:13.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""is that a pattern always emerged.""" start="00:07:15.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""The story became a tree. You see, story arcs""" start="00:07:18.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""were just a series of montages or scenes,""" start="00:07:22.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and each of those were made of a series of events""" start="00:07:25.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and challenges to overcome.""" start="00:07:27.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, each Org mode header has a track,""" start="00:07:29.120" video="mainVideo-solo" id="subtitle"]]
[[!template text="""which often becomes the number of subheadings.""" start="00:07:32.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""At any point, I can see how much track is being made.""" start="00:07:35.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, for instance, this one seems to be""" start="00:07:40.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""about a third of the way through.""" start="00:07:47.240" video="mainVideo-solo" id="subtitle"]]
Using different stats
[[!template new="1" text="""So, let's dive into this ancient place.""" start="00:07:48.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Since I've been walking through a misty forest,""" start="00:07:52.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I can imagine vines hiding an immense door""" start="00:07:55.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and a humid, earthy smell as I peer inside.""" start="00:07:59.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""But I don't have to write that stuff down,""" start="00:08:01.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""or if I want to practice my writing, I can.""" start="00:08:04.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I can imagine the place is dark,""" start="00:08:06.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""so Tegan lights a torch""" start="00:08:09.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""before peering into this obscure world.""" start="00:08:10.840" video="mainVideo-solo" id="subtitle"]]
[[!template text="""As this move mentions,""" start="00:08:13.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the next move to make is called Delve the Depths.""" start="00:08:15.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""As soon as I select this move,""" start="00:08:20.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""it shows up on the side window, and explains that,""" start="00:08:26.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""depending on how you're moving through""" start="00:08:31.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""this ancient catacombs,""" start="00:08:34.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""is what kind of stat I roll against,""" start="00:08:36.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and those stats show up at the bottom.""" start="00:08:38.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""You know, if I'm sneaking around, you roll against "shadow".""" start="00:08:41.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""If you're trying to go as fast as you can, it's "edge".""" start="00:08:45.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""But I kind of imagine that he's thinking through,""" start="00:08:47.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""being very careful about it.""" start="00:08:51.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, I'm going to select "wits".""" start="00:08:53.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""And I don't have any modifiers.""" start="00:08:55.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Just about every one of my stats prompts me""" start="00:08:57.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""if I want to add or subtract any values.""" start="00:08:59.560" video="mainVideo-solo" id="subtitle"]]
Dice rolls
[[!template new="1" text="""A miss. I should explain how the dice roll in this game.""" start="00:09:02.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""The downside to Ironsworn is that""" start="00:09:09.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the dice mechanics are more cumbersome than other games.""" start="00:09:13.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""You roll a 6-sided die, add to it your relevant stat,""" start="00:09:16.840" video="mainVideo-solo" id="subtitle"]]
[[!template text="""plus any modifiers. Next, you roll two 10-sided die""" start="00:09:20.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and see how it compares.""" start="00:09:24.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Of course, I programmed this in Lisp,""" start="00:09:25.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but when I displayed it, I wanted to see all the dice.""" start="00:09:28.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""And I also just wanted to see the end results.""" start="00:09:31.600" video="mainVideo-solo" id="subtitle"]]
Dangers
[[!template new="1" text="""So I colored it. I rolled a miss,""" start="00:09:34.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""which means I need to reveal a danger.""" start="00:09:37.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Sure, I could imagine all sorts of dangers,""" start="00:09:39.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but this is a game.""" start="00:09:43.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I've already made a random generator for dangers.""" start="00:09:44.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""In fact, I've made a random generator""" start="00:09:48.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""for dangers in an ancient underkeep.""" start="00:09:51.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Discovery undermines or complicates the quest.""" start="00:09:55.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Hmm, a complication for finding the chief's son?""" start="00:10:00.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""What about a labyrinth full of hallways and levels""" start="00:10:09.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""with lots of choices and almost no way of finding them?""" start="00:10:13.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Yeah, that sounds like it fits pretty well.""" start="00:10:16.600" video="mainVideo-solo" id="subtitle"]]
A strong success
[[!template new="1" text="""Time for another move. This time, we're going to""" start="00:10:19.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""gather information,""" start="00:10:26.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""see if we can figure out which way to go.""" start="00:10:28.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""A strong hit. Excellent.""" start="00:10:32.280" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I imagine Tegan noticing footprints in the dust""" start="00:10:34.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and knowing where to go.""" start="00:10:38.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""The game suggests that when you get a strong success,""" start="00:10:40.440" video="mainVideo-solo" id="subtitle"]]
[[!template text="""you can increase your momentum.""" start="00:10:44.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""These game mechanics""" start="00:10:45.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""come into play later, but this function here""" start="00:10:48.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""allows me to adjust that stat +2.""" start="00:10:51.755" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I don't even have to scroll to the top of the buffer""" start="00:10:57.881" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and edit that value in my properties.""" start="00:11:01.461" video="mainVideo-solo" id="subtitle"]]
[[!template text="""At any point, I can take a look at those stats""" start="00:11:04.821" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and see how they measure up.""" start="00:11:08.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Again, I don't have to scroll up""" start="00:11:10.440" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and take a look at my properties""" start="00:11:13.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""at the top of the Org mode file.""" start="00:11:14.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""That's how I play the game.""" start="00:11:16.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""It's just a recursive loop of playing a move,""" start="00:11:19.240" video="mainVideo-solo" id="subtitle"]]
[[!template text="""rolling some dice to see how it works,""" start="00:11:24.640" video="mainVideo-solo" id="subtitle"]]
[[!template text="""trying to answer the question""" start="00:11:27.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""based on your own imagination or random tables,""" start="00:11:30.160" video="mainVideo-solo" id="subtitle"]]
[[!template text="""which the game calls oracles,""" start="00:11:33.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and play creatively until you decide to take a break""" start="00:11:35.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and pick it up another time.""" start="00:11:41.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I think you get the gist of how I play""" start="00:11:42.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""this dice and pencil game in Org Mode.""" start="00:11:47.000" video="mainVideo-solo" id="subtitle"]]
Other solo RPGs
[[!template new="1" text="""However, I found more solo RPGs to play.""" start="00:11:49.680" video="mainVideo-solo" id="subtitle"]]
[[!template text="""And of course, I want to render them in Emacs too.""" start="00:11:54.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""This code for Ironsworn was a bit too specific,""" start="00:11:57.320" video="mainVideo-solo" id="subtitle"]]
[[!template text="""so I decided to create a role-playing game toolkit.""" start="00:12:00.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""This project is still in the early stages,""" start="00:12:04.760" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but I've created some functions""" start="00:12:09.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""for mimicking rolling dice, including a mini-DSL for""" start="00:12:12.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""making dice mechanics""" start="00:12:16.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""typical of many role-playing game systems.""" start="00:12:19.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I've also ported over the random table system.""" start="00:12:22.840" video="mainVideo-solo" id="subtitle"]]
[[!template text="""A text file can just list entries to be displayed at random.""" start="00:12:26.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""I love that I can put dice expression""" start="00:12:30.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and word choices in the entries.""" start="00:12:33.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""One type of random table allows you""" start="00:12:35.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to essentially copy and paste a table""" start="00:12:39.440" video="mainVideo-solo" id="subtitle"]]
[[!template text="""from a published game into a text file.""" start="00:12:41.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""A frequency table is what I'm calling""" start="00:12:43.800" video="mainVideo-solo" id="subtitle"]]
[[!template text="""a list of random entries where some entries show up""" start="00:12:47.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""more often than others. I'm working on generalizing""" start="00:12:50.880" video="mainVideo-solo" id="subtitle"]]
[[!template text="""the character sheet attributes as Org properties,""" start="00:12:55.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""so if you're interested, check out the project at Codeberg.""" start="00:12:59.960" video="mainVideo-solo" id="subtitle"]]
Conclusion
[[!template new="1" text="""The point of my presentation is not to show off Ironsworn,""" start="00:13:04.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""how I programmed it, or even this new toolkit.""" start="00:13:10.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""You see, most engineers,""" start="00:13:14.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""when they get an idea for a game like mine,""" start="00:13:17.560" video="mainVideo-solo" id="subtitle"]]
[[!template text="""would make a web app. Nothing wrong with it.""" start="00:13:20.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""More people can play it,""" start="00:13:24.080" video="mainVideo-solo" id="subtitle"]]
[[!template text="""but web apps suffer from text entry.""" start="00:13:25.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""And don't tell me you prefer the keyboard interface""" start="00:13:28.200" video="mainVideo-solo" id="subtitle"]]
[[!template text="""to Google Docs. Oh, and the JavaScript framework du jour?""" start="00:13:30.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Oh, I mean, that's a huge barrier of entry""" start="00:13:35.960" video="mainVideo-solo" id="subtitle"]]
[[!template text="""when all you want to do""" start="00:13:40.400" video="mainVideo-solo" id="subtitle"]]
[[!template text="""is have a bit of fun prototyping a game.""" start="00:13:42.040" video="mainVideo-solo" id="subtitle"]]
[[!template text="""What I'd like to impress upon you""" start="00:13:44.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""is that hacking Emacs to make personal games is a trip.""" start="00:13:48.480" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Learning Lisp is, it's easy.""" start="00:13:54.000" video="mainVideo-solo" id="subtitle"]]
[[!template text="""And more, Emacs Lisp has some, well sure,""" start="00:13:57.360" video="mainVideo-solo" id="subtitle"]]
[[!template text="""it has some cruft. But really, some of those features""" start="00:14:00.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""that I would hate at a distributed system at work,""" start="00:14:04.520" video="mainVideo-solo" id="subtitle"]]
[[!template text="""like global variables, makes hacking easier""" start="00:14:07.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""when you just want to have some fun in your own system.""" start="00:14:10.920" video="mainVideo-solo" id="subtitle"]]
[[!template text="""So, grab your laptop, sink into your comfy chair,""" start="00:14:14.720" video="mainVideo-solo" id="subtitle"]]
[[!template text="""pour yourself a glass of scotch,""" start="00:14:19.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""and craft yourself an enjoyable evening.""" start="00:14:21.600" video="mainVideo-solo" id="subtitle"]]
[[!template text="""Happy hacking, my friends.""" start="00:14:24.720" video="mainVideo-solo" id="subtitle"]]
Captioner: sachac
Questions or comments? Please e-mail [howard@howardabrams.com](mailto:howard@howardabrams.com?subject=Comment%20for%20EmacsConf%202023%20solo%3A%20How%20I%20play%20TTRPGs%20in%20Emacs)
<!-- End of emacsconf-publish-after-page -->
|