summaryrefslogtreecommitdiffstats
path: root/2023
diff options
context:
space:
mode:
authorEmacsConf <emacsconf-org@gnu.org>2023-12-02 15:30:14 -0500
committerEmacsConf <emacsconf-org@gnu.org>2023-12-02 15:30:14 -0500
commit79e9e0950bb2343a8e919cab8cbff0682ccf25dd (patch)
tree9787e061ddbeac3186d4b5906041b384ddd817c6 /2023
parentd795eade5148301c9eeeb646efdfff7f511f916c (diff)
downloademacsconf-wiki-79e9e0950bb2343a8e919cab8cbff0682ccf25dd.tar.xz
emacsconf-wiki-79e9e0950bb2343a8e919cab8cbff0682ccf25dd.zip
solo
Diffstat (limited to '2023')
-rw-r--r--2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt41
-rw-r--r--2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt834
-rw-r--r--2023/info/solo-after.md277
-rw-r--r--2023/info/solo-before.md19
4 files changed, 1169 insertions, 2 deletions
diff --git a/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt b/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt
new file mode 100644
index 00000000..53987434
--- /dev/null
+++ b/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt
@@ -0,0 +1,41 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:01:20.679
+Introduction
+
+00:01:20.680 --> 00:02:47.439
+Solo RPGs
+
+00:02:47.440 --> 00:04:11.759
+Demo
+
+00:04:11.760 --> 00:05:31.959
+Randomization
+
+00:05:31.960 --> 00:06:03.639
+Moves
+
+00:06:03.640 --> 00:06:34.679
+Reference
+
+00:06:34.680 --> 00:07:48.679
+Story arcs
+
+00:07:48.680 --> 00:09:02.959
+Using different stats
+
+00:09:02.960 --> 00:09:34.799
+Dice rolls
+
+00:09:34.800 --> 00:10:19.679
+Dangers
+
+00:10:19.680 --> 00:11:49.679
+A strong success
+
+00:11:49.680 --> 00:13:04.719
+Other solo RPGs
+
+00:13:04.720 --> 00:14:35.920
+Conclusion
diff --git a/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt b/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt
new file mode 100644
index 00000000..9e8147a4
--- /dev/null
+++ b/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt
@@ -0,0 +1,834 @@
+WEBVTT captioned by sachac, checked by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:05.559
+Hi there, I'm Howard Abrams. You may remember me
+
+00:00:05.560 --> 00:00:07.719
+from past conference talks
+
+00:00:07.720 --> 00:00:10.519
+as "Literate DevOps and the Temple of Doom"
+
+00:00:10.520 --> 00:00:13.399
+and "Using Eshell for Fun and Profit".
+
+00:00:13.400 --> 00:00:16.599
+I'm here to talk to you about my latest Emacs project:
+
+00:00:16.600 --> 00:00:19.479
+playing games, solo role-playing games.
+
+00:00:19.480 --> 00:00:23.159
+I started playing RPGs when I got my first copy
+
+00:00:23.160 --> 00:00:25.599
+of Dungeons & Dragons when I was 12.
+
+00:00:25.600 --> 00:00:28.279
+Yes, my original copy burned
+
+00:00:28.280 --> 00:00:30.559
+in the Great Satanic Panic of the 1980s,
+
+00:00:30.560 --> 00:00:32.359
+but that's another story.
+
+00:00:32.360 --> 00:00:37.919
+I started playing other RPGs like GURPS.
+
+00:00:37.920 --> 00:00:39.999
+These are some of my notes.
+
+00:00:40.000 --> 00:00:42.559
+Back then, I was typing them in Emacs,
+
+00:00:42.560 --> 00:00:46.079
+but I formatted them with LaTeX.
+
+00:00:46.080 --> 00:00:49.079
+Later, when I was introducing my kids
+
+00:00:49.080 --> 00:00:50.839
+to role-playing games,
+
+00:00:50.840 --> 00:00:53.580
+I actually typed them up still in Emacs,
+
+00:00:53.581 --> 00:00:57.599
+but now formatted them for a tablet.
+
+00:00:57.600 --> 00:00:59.319
+I wrote a little JavaScript code
+
+00:00:59.320 --> 00:01:03.119
+that allowed me to click on it, and it would roll dice,
+
+00:01:03.120 --> 00:01:06.679
+generate random events, keep track of turn order,
+
+00:01:06.680 --> 00:01:07.479
+you know, everything,
+
+00:01:07.480 --> 00:01:10.119
+so I didn't have to slow down the action of the game.
+
+00:01:10.120 --> 00:01:12.999
+Well, when my kids got older,
+
+00:01:13.000 --> 00:01:15.599
+I still managed to sneak in a game of D&D
+
+00:01:15.600 --> 00:01:17.319
+once a week at lunch.
+
+00:01:17.320 --> 00:01:20.679
+This pastime came to a screeching halt with the pandemic.
+
+NOTE Solo RPGs
+
+00:01:20.680 --> 00:01:23.639
+I turned to playing role-playing games by myself
+
+00:01:23.640 --> 00:01:27.999
+to get my fix. Playing these silly elf games in solo mode
+
+00:01:28.000 --> 00:01:29.879
+has been part of the game for many years,
+
+00:01:29.880 --> 00:01:32.559
+but with so many of us stuck at home,
+
+00:01:32.560 --> 00:01:35.119
+solo role-playing games really expanded,
+
+00:01:35.120 --> 00:01:40.279
+creative people releasing some amazing ideas.
+
+00:01:40.280 --> 00:01:44.399
+What's a solo RPG like? Well, it's somewhere in the middle
+
+00:01:44.400 --> 00:01:47.519
+of writing your own story, where anything's possible,
+
+00:01:47.520 --> 00:01:50.159
+but you've got to do all the imaginative work;
+
+00:01:50.160 --> 00:01:52.999
+or reading a choose-your-own-adventure book,
+
+00:01:53.000 --> 00:01:55.239
+where the text is given to you,
+
+00:01:55.240 --> 00:01:59.079
+and you have free, a few predetermined paths;
+
+00:01:59.080 --> 00:02:01.039
+and tactical battle games,
+
+00:02:01.040 --> 00:02:03.159
+where dice determines everything.
+
+00:02:03.160 --> 00:02:05.799
+It kind of fits in the sweet spot between those.
+
+00:02:05.800 --> 00:02:08.879
+While I started removing the Game Master
+
+00:02:08.880 --> 00:02:12.119
+using the Mythic GM Emulator,
+
+00:02:12.120 --> 00:02:15.319
+Ironsworn really captivated me.
+
+00:02:15.320 --> 00:02:19.199
+I began with dice, pencils, notebooks, you know,
+
+00:02:19.200 --> 00:02:23.359
+just like when I was a kid. But taking notes on paper?
+
+00:02:23.360 --> 00:02:27.999
+Yeah, you know me. That's not my jam. Org mode is.
+
+00:02:28.000 --> 00:02:31.159
+And, you know, notes have to be in Org,
+
+00:02:31.160 --> 00:02:35.159
+well, why not write a little dice roller in Lisp?
+
+00:02:35.160 --> 00:02:38.799
+Well, when Shawn Tomkin released his Ironsworn
+
+00:02:38.800 --> 00:02:41.879
+under the Creative Commons, well,
+
+00:02:41.880 --> 00:02:43.919
+I could just download the entire text.
+
+00:02:43.920 --> 00:02:47.439
+I figured I could just render the entire game in Emacs.
+
+NOTE Demo
+
+00:02:47.440 --> 00:02:51.239
+All right, enough talk. Let's get some Emacs action here,
+
+00:02:51.240 --> 00:02:55.199
+while I show you a bit of my game.
+
+00:02:55.200 --> 00:02:57.519
+When playing a solo RPG,
+
+00:02:57.520 --> 00:02:59.759
+I jot down the story notes in an Org file.
+
+00:02:59.760 --> 00:03:02.759
+I mean, did you expect anything less from me?
+
+00:03:02.760 --> 00:03:07.759
+I alternate between lengthy prose and short notes.
+
+00:03:07.760 --> 00:03:10.519
+As I'm both the writer and the audience,
+
+00:03:10.520 --> 00:03:11.999
+the goal is just enjoyment.
+
+00:03:12.000 --> 00:03:16.999
+So, this document is both a record log of my game sessions,
+
+00:03:17.000 --> 00:03:20.959
+as well as my character's character sheet.
+
+00:03:20.960 --> 00:03:24.519
+In most RPGs, a player's focus is a character sheet
+
+00:03:24.520 --> 00:03:26.999
+that lists all the attributes, the stats, equipment,
+
+00:03:27.000 --> 00:03:28.759
+powers, you know, that sort of thing.
+
+00:03:28.760 --> 00:03:32.959
+For my game, I wanted the focus to be the prose,
+
+00:03:32.960 --> 00:03:34.559
+or at least the notes.
+
+00:03:34.560 --> 00:03:38.199
+So, I put down all the stats as Org mode properties.
+
+00:03:38.200 --> 00:03:40.799
+Now, I can collapse a property drawer
+
+00:03:40.800 --> 00:03:42.119
+and have functions
+
+00:03:42.120 --> 00:03:45.759
+that just grab values from these properties.
+
+00:03:45.760 --> 00:03:50.079
+All right, let's play. While not important to my talk,
+
+00:03:50.080 --> 00:03:52.679
+I'm in the middle of a game. My character, Tegan,
+
+00:03:52.680 --> 00:03:54.959
+promised to help a village by tracking down
+
+00:03:54.960 --> 00:03:59.239
+the son of a village chief. A less-than-stellar roll
+
+00:03:59.240 --> 00:04:01.199
+meant I didn't catch him before he entered
+
+00:04:01.200 --> 00:04:03.879
+the mysterious underground structure
+
+00:04:03.880 --> 00:04:06.399
+of a relic of an ancient people.
+
+00:04:06.400 --> 00:04:08.399
+I just finished playing out the journey,
+
+00:04:08.400 --> 00:04:11.759
+and he's about to enter into the Catacombs of Svala's Blood.
+
+NOTE Randomization
+
+00:04:11.760 --> 00:04:15.199
+Why that name? Well, that was actually what came up
+
+00:04:15.200 --> 00:04:19.639
+from an extensive random number generator that I wrote.
+
+00:04:19.640 --> 00:04:21.959
+As I wrote more and more functions
+
+00:04:21.960 --> 00:04:23.279
+to help me play this game,
+
+00:04:23.280 --> 00:04:25.919
+and since I don't play all the time,
+
+00:04:25.920 --> 00:04:30.359
+I created hydra. I can roll dice,
+
+00:04:30.360 --> 00:04:34.079
+I can roll dice challenges against the character stats,
+
+00:04:34.080 --> 00:04:38.199
+I can adjust stats. Lots of random generators
+
+00:04:38.200 --> 00:04:39.479
+come from this oracle section.
+
+00:04:39.480 --> 00:04:43.159
+For instance, are footprints going through the door?
+
+00:04:43.160 --> 00:04:46.479
+I press `c`, and I'm prompted with how likely.
+
+00:04:46.480 --> 00:04:51.079
+Since the villagers gave Tegan vague directions,
+
+00:04:51.080 --> 00:04:53.239
+and he didn't see any signs the contrary,
+
+00:04:53.240 --> 00:04:58.479
+I chose "likely". And, well, it originally said yes,
+
+00:04:58.480 --> 00:05:01.599
+and that's why I jotted this information down.
+
+00:05:01.600 --> 00:05:03.479
+Now, this is different than my character's ability
+
+00:05:03.480 --> 00:05:07.639
+to notice the prints. This is about generating the story,
+
+00:05:07.640 --> 00:05:10.279
+something that the game master would do
+
+00:05:10.280 --> 00:05:12.479
+in a typical role-playing game.
+
+00:05:12.480 --> 00:05:14.719
+Now, if I wanted to name something,
+
+00:05:14.720 --> 00:05:16.039
+or even the current weather,
+
+00:05:16.040 --> 00:05:20.399
+I have random tables with the `C` keystroke.
+
+00:05:20.400 --> 00:05:27.279
+Hmm, weather. Oh, it's summer, so hey,
+
+00:05:27.280 --> 00:05:31.959
+it's nice and clear. All right, let's play.
+
+NOTE Moves
+
+00:05:31.960 --> 00:05:34.239
+The action in Ironsworn,
+
+00:05:34.240 --> 00:05:37.039
+like other Powered by the Apocalypse games,
+
+00:05:37.040 --> 00:05:44.359
+is driven by moves. So, I hit the `m` key,
+
+00:05:44.360 --> 00:05:46.879
+and all the moves show up.
+
+00:05:46.880 --> 00:05:49.479
+Now, I don't think I need to espouse
+
+00:05:49.480 --> 00:05:52.679
+the virtues of completing-read enhancements like Ivy.
+
+00:05:52.680 --> 00:05:55.559
+Here, I'm using orderless with vertico
+
+00:05:55.560 --> 00:05:57.719
+to help me find my choices.
+
+00:05:57.720 --> 00:06:03.639
+Since I've discovered a site, let's play that move.
+
+NOTE Reference
+
+00:06:03.640 --> 00:06:06.479
+I seldom remember the details for the moves,
+
+00:06:06.480 --> 00:06:09.159
+so I figured, why not put the text of the book
+
+00:06:09.160 --> 00:06:11.799
+in an Org file and show it in a side window?
+
+00:06:11.800 --> 00:06:15.439
+The prompt at the bottom, asking for a name,
+
+00:06:15.440 --> 00:06:18.199
+is driven by the content in the displayed Org file.
+
+00:06:18.200 --> 00:06:21.119
+This allows me to enhance my game without
+
+00:06:21.120 --> 00:06:25.159
+changing the original code. So, let's call this story arc,
+
+00:06:25.160 --> 00:06:31.839
+Exploring the Catacombs of Svala's Blood.
+
+00:06:31.840 --> 00:06:34.679
+Ooh, sounds epic.
+
+NOTE Story arcs
+
+00:06:34.680 --> 00:06:37.239
+Ironsworn tracks the beats of a narrative,
+
+00:06:37.240 --> 00:06:40.799
+so major plot points take up more room in the fiction
+
+00:06:40.800 --> 00:06:42.759
+than minor plot points.
+
+00:06:42.760 --> 00:06:45.039
+Similar games like Blades in the Dark
+
+00:06:45.040 --> 00:06:48.199
+use numbers to track these, so you can say something like,
+
+00:06:48.200 --> 00:06:51.079
+we're three quarters of the way through this story arc.
+
+00:06:51.080 --> 00:06:53.119
+Ironsworn just uses labels,
+
+00:06:53.120 --> 00:06:55.839
+and while I want this particular story arc
+
+00:06:55.840 --> 00:06:59.519
+to be significant, I really just want to get in,
+
+00:06:59.520 --> 00:07:00.959
+find this person, and get out.
+
+00:07:00.960 --> 00:07:04.039
+So, I'm going to call this "short".
+
+00:07:04.040 --> 00:07:09.279
+Next, it's asking about an Org mode header placement.
+
+00:07:09.280 --> 00:07:12.199
+While I originally wanted my Org files
+
+00:07:12.200 --> 00:07:13.799
+to be completely flexible,
+
+00:07:13.800 --> 00:07:15.919
+one thing I noticed in playing
+
+00:07:15.920 --> 00:07:17.999
+is that a pattern always emerged.
+
+00:07:18.000 --> 00:07:22.639
+The story became a tree. You see, story arcs
+
+00:07:22.640 --> 00:07:25.559
+were just a series of montages or scenes,
+
+00:07:25.560 --> 00:07:27.919
+and each of those were made of a series of events
+
+00:07:27.920 --> 00:07:29.119
+and challenges to overcome.
+
+00:07:29.120 --> 00:07:32.799
+So, each Org mode header has a track,
+
+00:07:32.800 --> 00:07:35.719
+which often becomes the number of subheadings.
+
+00:07:35.720 --> 00:07:40.639
+At any point, I can see how much track is being made.
+
+00:07:40.640 --> 00:07:47.239
+So, for instance, this one seems to be
+
+00:07:47.240 --> 00:07:48.679
+about a third of the way through.
+
+NOTE Using different stats
+
+00:07:48.680 --> 00:07:52.599
+So, let's dive into this ancient place.
+
+00:07:52.600 --> 00:07:55.719
+Since I've been walking through a misty forest,
+
+00:07:55.720 --> 00:07:59.319
+I can imagine vines hiding an immense door
+
+00:07:59.320 --> 00:08:01.959
+and a humid, earthy smell as I peer inside.
+
+00:08:01.960 --> 00:08:04.319
+But I don't have to write that stuff down,
+
+00:08:04.320 --> 00:08:06.919
+or if I want to practice my writing, I can.
+
+00:08:06.920 --> 00:08:09.359
+I can imagine the place is dark,
+
+00:08:09.360 --> 00:08:10.839
+so Tegan lights a torch
+
+00:08:10.840 --> 00:08:13.039
+before peering into this obscure world.
+
+00:08:13.040 --> 00:08:15.799
+As this move mentions,
+
+00:08:15.800 --> 00:08:20.279
+the next move to make is called Delve the Depths.
+
+00:08:20.280 --> 00:08:26.159
+As soon as I select this move,
+
+00:08:26.160 --> 00:08:31.319
+it shows up on the side window, and explains that,
+
+00:08:31.320 --> 00:08:34.399
+depending on how you're moving through
+
+00:08:34.400 --> 00:08:36.239
+this ancient catacombs,
+
+00:08:36.240 --> 00:08:38.759
+is what kind of stat I roll against,
+
+00:08:38.760 --> 00:08:41.039
+and those stats show up at the bottom.
+
+00:08:41.040 --> 00:08:45.479
+You know, if I'm sneaking around, you roll against "shadow".
+
+00:08:45.480 --> 00:08:47.719
+If you're trying to go as fast as you can, it's "edge".
+
+00:08:47.720 --> 00:08:51.679
+But I kind of imagine that he's thinking through,
+
+00:08:51.680 --> 00:08:53.679
+being very careful about it.
+
+00:08:53.680 --> 00:08:55.759
+So, I'm going to select "wits".
+
+00:08:55.760 --> 00:08:57.719
+And I don't have any modifiers.
+
+00:08:57.720 --> 00:08:59.559
+Just about every one of my stats prompts me
+
+00:08:59.560 --> 00:09:02.959
+if I want to add or subtract any values.
+
+NOTE Dice rolls
+
+00:09:02.960 --> 00:09:09.879
+A miss. I should explain how the dice roll in this game.
+
+00:09:09.880 --> 00:09:13.399
+The downside to Ironsworn is that
+
+00:09:13.400 --> 00:09:16.839
+the dice mechanics are more cumbersome than other games.
+
+00:09:16.840 --> 00:09:20.199
+You roll a 6-sided die, add to it your relevant stat,
+
+00:09:20.200 --> 00:09:24.599
+plus any modifiers. Next, you roll two 10-sided die
+
+00:09:24.600 --> 00:09:25.799
+and see how it compares.
+
+00:09:25.800 --> 00:09:28.679
+Of course, I programmed this in Lisp,
+
+00:09:28.680 --> 00:09:31.599
+but when I displayed it, I wanted to see all the dice.
+
+00:09:31.600 --> 00:09:34.799
+And I also just wanted to see the end results.
+
+NOTE Dangers
+
+00:09:34.800 --> 00:09:37.479
+So I colored it. I rolled a miss,
+
+00:09:37.480 --> 00:09:39.799
+which means I need to reveal a danger.
+
+00:09:39.800 --> 00:09:43.519
+Sure, I could imagine all sorts of dangers,
+
+00:09:43.520 --> 00:09:44.359
+but this is a game.
+
+00:09:44.360 --> 00:09:48.359
+I've already made a random generator for dangers.
+
+00:09:48.360 --> 00:09:51.719
+In fact, I've made a random generator
+
+00:09:51.720 --> 00:09:55.479
+for dangers in an ancient underkeep.
+
+00:09:55.480 --> 00:10:00.879
+Discovery undermines or complicates the quest.
+
+00:10:00.880 --> 00:10:09.719
+Hmm, a complication for finding the chief's son?
+
+00:10:09.720 --> 00:10:13.319
+What about a labyrinth full of hallways and levels
+
+00:10:13.320 --> 00:10:16.599
+with lots of choices and almost no way of finding them?
+
+00:10:16.600 --> 00:10:19.679
+Yeah, that sounds like it fits pretty well.
+
+NOTE A strong success
+
+00:10:19.680 --> 00:10:26.959
+Time for another move. This time, we're going to
+
+00:10:26.960 --> 00:10:28.799
+gather information,
+
+00:10:28.800 --> 00:10:32.279
+see if we can figure out which way to go.
+
+00:10:32.280 --> 00:10:34.719
+A strong hit. Excellent.
+
+00:10:34.720 --> 00:10:38.399
+I imagine Tegan noticing footprints in the dust
+
+00:10:38.400 --> 00:10:40.439
+and knowing where to go.
+
+00:10:40.440 --> 00:10:44.319
+The game suggests that when you get a strong success,
+
+00:10:44.320 --> 00:10:45.799
+you can increase your momentum.
+
+00:10:45.800 --> 00:10:48.879
+These game mechanics
+
+00:10:48.880 --> 00:10:51.754
+come into play later, but this function here
+
+00:10:51.755 --> 00:10:57.880
+allows me to adjust that stat +2.
+
+00:10:57.881 --> 00:11:01.460
+I don't even have to scroll to the top of the buffer
+
+00:11:01.461 --> 00:11:04.820
+and edit that value in my properties.
+
+00:11:04.821 --> 00:11:08.159
+At any point, I can take a look at those stats
+
+00:11:08.160 --> 00:11:10.439
+and see how they measure up.
+
+00:11:10.440 --> 00:11:13.159
+Again, I don't have to scroll up
+
+00:11:13.160 --> 00:11:14.879
+and take a look at my properties
+
+00:11:14.880 --> 00:11:16.559
+at the top of the Org mode file.
+
+00:11:16.560 --> 00:11:19.239
+That's how I play the game.
+
+00:11:19.240 --> 00:11:24.639
+It's just a recursive loop of playing a move,
+
+00:11:24.640 --> 00:11:27.319
+rolling some dice to see how it works,
+
+00:11:27.320 --> 00:11:30.159
+trying to answer the question
+
+00:11:30.160 --> 00:11:33.679
+based on your own imagination or random tables,
+
+00:11:33.680 --> 00:11:35.599
+which the game calls oracles,
+
+00:11:35.600 --> 00:11:41.199
+and play creatively until you decide to take a break
+
+00:11:41.200 --> 00:11:42.399
+and pick it up another time.
+
+00:11:42.400 --> 00:11:46.999
+I think you get the gist of how I play
+
+00:11:47.000 --> 00:11:49.679
+this dice and pencil game in Org Mode.
+
+NOTE Other solo RPGs
+
+00:11:49.680 --> 00:11:54.039
+However, I found more solo RPGs to play.
+
+00:11:54.040 --> 00:11:57.319
+And of course, I want to render them in Emacs too.
+
+00:11:57.320 --> 00:12:00.799
+This code for Ironsworn was a bit too specific,
+
+00:12:00.800 --> 00:12:04.759
+so I decided to create a role-playing game toolkit.
+
+00:12:04.760 --> 00:12:09.599
+This project is still in the early stages,
+
+00:12:09.600 --> 00:12:12.199
+but I've created some functions
+
+00:12:12.200 --> 00:12:16.719
+for mimicking rolling dice, including a mini-DSL for
+
+00:12:16.720 --> 00:12:19.799
+making dice mechanics
+
+00:12:19.800 --> 00:12:22.839
+typical of many role-playing game systems.
+
+00:12:22.840 --> 00:12:26.519
+I've also ported over the random table system.
+
+00:12:26.520 --> 00:12:30.479
+A text file can just list entries to be displayed at random.
+
+00:12:30.480 --> 00:12:33.959
+I love that I can put dice expression
+
+00:12:33.960 --> 00:12:35.799
+and word choices in the entries.
+
+00:12:35.800 --> 00:12:39.439
+One type of random table allows you
+
+00:12:39.440 --> 00:12:41.559
+to essentially copy and paste a table
+
+00:12:41.560 --> 00:12:43.799
+from a published game into a text file.
+
+00:12:43.800 --> 00:12:47.879
+A frequency table is what I'm calling
+
+00:12:47.880 --> 00:12:50.879
+a list of random entries where some entries show up
+
+00:12:50.880 --> 00:12:55.959
+more often than others. I'm working on generalizing
+
+00:12:55.960 --> 00:12:59.959
+the character sheet attributes as Org properties,
+
+00:12:59.960 --> 00:13:04.719
+so if you're interested, check out the project at Codeberg.
+
+NOTE Conclusion
+
+00:13:04.720 --> 00:13:10.359
+The point of my presentation is not to show off Ironsworn,
+
+00:13:10.360 --> 00:13:14.079
+how I programmed it, or even this new toolkit.
+
+00:13:14.080 --> 00:13:17.559
+You see, most engineers,
+
+00:13:17.560 --> 00:13:20.479
+when they get an idea for a game like mine,
+
+00:13:20.480 --> 00:13:24.079
+would make a web app. Nothing wrong with it.
+
+00:13:24.080 --> 00:13:25.959
+More people can play it,
+
+00:13:25.960 --> 00:13:28.199
+but web apps suffer from text entry.
+
+00:13:28.200 --> 00:13:30.959
+And don't tell me you prefer the keyboard interface
+
+00:13:30.960 --> 00:13:35.959
+to Google Docs. Oh, and the JavaScript framework du jour?
+
+00:13:35.960 --> 00:13:40.399
+Oh, I mean, that's a huge barrier of entry
+
+00:13:40.400 --> 00:13:42.039
+when all you want to do
+
+00:13:42.040 --> 00:13:44.359
+is have a bit of fun prototyping a game.
+
+00:13:44.360 --> 00:13:48.479
+What I'd like to impress upon you
+
+00:13:48.480 --> 00:13:53.999
+is that hacking Emacs to make personal games is a trip.
+
+00:13:54.000 --> 00:13:57.359
+Learning Lisp is, it's easy.
+
+00:13:57.360 --> 00:14:00.919
+And more, Emacs Lisp has some, well sure,
+
+00:14:00.920 --> 00:14:04.519
+it has some cruft. But really, some of those features
+
+00:14:04.520 --> 00:14:07.599
+that I would hate at a distributed system at work,
+
+00:14:07.600 --> 00:14:10.919
+like global variables, makes hacking easier
+
+00:14:10.920 --> 00:14:14.719
+when you just want to have some fun in your own system.
+
+00:14:14.720 --> 00:14:19.599
+So, grab your laptop, sink into your comfy chair,
+
+00:14:19.600 --> 00:14:21.599
+pour yourself a glass of scotch,
+
+00:14:21.600 --> 00:14:24.719
+and craft yourself an enjoyable evening.
+
+00:14:24.720 --> 00:14:35.920
+Happy hacking, my friends.
diff --git a/2023/info/solo-after.md b/2023/info/solo-after.md
index 6410f045..1f65da0e 100644
--- a/2023/info/solo-after.md
+++ b/2023/info/solo-after.md
@@ -1,6 +1,283 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="solo-mainVideo-transcript"></a>
+# Transcript
+
+[[!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 &quot;Literate DevOps and the Temple of Doom&quot;""" start="00:00:07.720" video="mainVideo-solo" id="subtitle"]]
+[[!template text="""and &quot;Using Eshell for Fun and Profit&quot;.""" 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"]]
+[[!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"]]
+[[!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"]]
+[[!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 &quot;likely&quot;. 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"]]
+[[!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"]]
+[[!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"]]
+[[!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 &quot;short&quot;.""" 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"]]
+[[!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 &quot;shadow&quot;.""" 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 &quot;edge&quot;.""" 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 &quot;wits&quot;.""" 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"]]
+[[!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"]]
+[[!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"]]
+[[!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"]]
+[[!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"]]
+[[!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%202022%20solo%3A%20How%20I%20play%20TTRPGs%20in%20Emacs)
diff --git a/2023/info/solo-before.md b/2023/info/solo-before.md
index b00d9441..67f3019b 100644
--- a/2023/info/solo-before.md
+++ b/2023/info/solo-before.md
@@ -1,19 +1,34 @@
<!-- Automatically generated by emacsconf-publish-before-page -->
The following image shows where the talk is in the schedule for Sat 2023-12-02. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="solo">
-<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2023/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2023/talks/adventure" title="An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp" data-slug="adventure"> <title> 9:10- 9:20 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp</title> <rect x="15" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> adventure</text></g></a> <a href="/2023/talks/uni" title="Authoring and presenting university courses with Emacs and a full libre software stack" data-slug="uni"> <title> 9:30- 9:50 Authoring and presenting university courses with Emacs and a full libre software stack</title> <rect x="47" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(76,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> uni</text></g></a> <a href="/2023/talks/teaching" title="Teaching computer and data science with literate programming tools" data-slug="teaching"> <title> 10:05-10:25 Teaching computer and data science with literate programming tools</title> <rect x="101" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(130,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> teaching</text></g></a> <a href="/2023/talks/table" title="Who needs Excel? Managing your students qualifications with org-table" data-slug="table"> <title> 10:40-10:50 Who needs Excel? Managing your students qualifications with org-table</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> table</text></g></a> <a href="/2023/talks/one" title="one.el: the static site generator for Emacs Lisp Programmers" data-slug="one"> <title> 11:30-11:50 one.el: the static site generator for Emacs Lisp Programmers</title> <rect x="235" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(264,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> one</text></g></a> <a href="/2023/talks/writing" title="Emacs turbo-charges my writing" data-slug="writing"> <title> 1:00- 1:10 Emacs turbo-charges my writing</title> <rect x="376" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(389,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2023/talks/nabokov" title="Why Nabokov would use Org-Mode if he were writing today" data-slug="nabokov"> <title> 1:25- 1:35 Why Nabokov would use Org-Mode if he were writing today</title> <rect x="415" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(428,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> nabokov</text></g></a> <a href="/2023/talks/collab" title="Collaborative data processing and documenting using org-babel" data-slug="collab"> <title> 1:50- 2:10 Collaborative data processing and documenting using org-babel</title> <rect x="454" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(483,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> collab</text></g></a> <a href="/2023/talks/solo" title="How I play TTRPGs in Emacs" data-slug="solo"> <title> 2:20- 2:40 How I play TTRPGs in Emacs</title> <rect stroke-width="3" x="501" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> solo</text></g></a> <a href="/2023/talks/ref" title="Org-Mode workflow: informal reference tracking" data-slug="ref"> <title> 2:55- 3:15 Org-Mode workflow: informal reference tracking</title> <rect x="556" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(585,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> ref</text></g></a> <a href="/2023/talks/unentangling" title="(Un)entangling projects and repos" data-slug="unentangling"> <title> 3:25- 3:35 (Un)entangling projects and repos</title> <rect x="603" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(616,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> unentangling</text></g></a> <a href="/2023/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 3:45- 3:55 Emacs development updates</title> <rect x="635" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(648,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2023/talks/core" title="Emacs core development: how it works" data-slug="core"> <title> 4:10- 4:50 Emacs core development: how it works</title> <rect x="674" y="15" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(734,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> core</text></g></a> <a href="/2023/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:05- 5:15 Saturday closing remarks</title> <rect x="760" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(773,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2023/talks/matplotllm" title="MatplotLLM, iterative natural language data visualization in org-babel" data-slug="matplotllm"> <title> 10:00-10:10 MatplotLLM, iterative natural language data visualization in org-babel</title> <rect x="94" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> matplotllm</text></g></a> <a href="/2023/talks/voice" title="Enhancing productivity with voice computing" data-slug="voice"> <title> 10:20-10:40 Enhancing productivity with voice computing</title> <rect x="125" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(154,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> voice</text></g></a> <a href="/2023/talks/llm" title="LLM clients in Emacs, functionality and standardization" data-slug="llm"> <title> 10:55-11:15 LLM clients in Emacs, functionality and standardization</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="/2023/talks/overlay" title="Improving compiler diagnostics with overlays" data-slug="overlay"> <title> 1:00- 1:20 Improving compiler diagnostics with overlays</title> <rect x="376" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(405,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> overlay</text></g></a> <a href="/2023/talks/eval" title="Editor Integrated REPL Driven Development for all languages" data-slug="eval"> <title> 1:35- 1:45 Editor Integrated REPL Driven Development for all languages</title> <rect x="431" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eval</text></g></a> <a href="/2023/talks/repl" title="REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ" data-slug="repl"> <title> 2:00- 3:00 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ</title> <rect x="470" y="75" opacity="0.5" width="94" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(562,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> repl</text></g></a> <a href="/2023/talks/doc" title="Literate Documentation with Emacs and Org Mode" data-slug="doc"> <title> 3:10- 3:50 Literate Documentation with Emacs and Org Mode</title> <rect x="580" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(640,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> doc</text></g></a> <a href="/2023/talks/windows" title="Windows into Freedom" data-slug="windows"> <title> 4:05- 4:45 Windows into Freedom</title> <rect x="666" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(726,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> windows</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2023/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2023/talks/adventure" title="An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp" data-slug="adventure"> <title> 9:10- 9:20 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp</title> <rect x="15" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> adventure</text></g></a> <a href="/2023/talks/uni" title="Authoring and presenting university courses with Emacs and a full libre software stack" data-slug="uni"> <title> 9:30- 9:50 Authoring and presenting university courses with Emacs and a full libre software stack</title> <rect x="47" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(76,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> uni</text></g></a> <a href="/2023/talks/teaching" title="Teaching computer and data science with literate programming tools" data-slug="teaching"> <title> 10:05-10:25 Teaching computer and data science with literate programming tools</title> <rect x="101" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(130,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> teaching</text></g></a> <a href="/2023/talks/table" title="Who needs Excel? Managing your students qualifications with org-table" data-slug="table"> <title> 10:40-10:50 Who needs Excel? Managing your students qualifications with org-table</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> table</text></g></a> <a href="/2023/talks/taming" title="Taming things with Org Mode" data-slug="taming"> <title> 11:05-11:15 Taming things with Org Mode</title> <rect x="196" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> taming</text></g></a> <a href="/2023/talks/one" title="one.el: the static site generator for Emacs Lisp Programmers" data-slug="one"> <title> 11:30-11:50 one.el: the static site generator for Emacs Lisp Programmers</title> <rect x="235" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(264,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> one</text></g></a> <a href="/2023/talks/writing" title="Emacs turbo-charges my writing" data-slug="writing"> <title> 1:00- 1:10 Emacs turbo-charges my writing</title> <rect x="376" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(389,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2023/talks/nabokov" title="Why Nabokov would use Org-Mode if he were writing today" data-slug="nabokov"> <title> 1:25- 1:35 Why Nabokov would use Org-Mode if he were writing today</title> <rect x="415" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(428,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> nabokov</text></g></a> <a href="/2023/talks/collab" title="Collaborative data processing and documenting using org-babel" data-slug="collab"> <title> 1:50- 2:10 Collaborative data processing and documenting using org-babel</title> <rect x="454" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(483,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> collab</text></g></a> <a href="/2023/talks/solo" title="How I play TTRPGs in Emacs" data-slug="solo"> <title> 2:20- 2:40 How I play TTRPGs in Emacs</title> <rect stroke-width="3" x="501" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> solo</text></g></a> <a href="/2023/talks/ref" title="Org-Mode workflow: informal reference tracking" data-slug="ref"> <title> 2:55- 3:15 Org-Mode workflow: informal reference tracking</title> <rect x="556" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(585,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> ref</text></g></a> <a href="/2023/talks/unentangling" title="(Un)entangling projects and repos" data-slug="unentangling"> <title> 3:25- 3:35 (Un)entangling projects and repos</title> <rect x="603" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(616,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> unentangling</text></g></a> <a href="/2023/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 3:45- 3:55 Emacs development updates</title> <rect x="635" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(648,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2023/talks/core" title="Emacs core development: how it works" data-slug="core"> <title> 4:10- 4:50 Emacs core development: how it works</title> <rect x="674" y="15" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(734,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> core</text></g></a> <a href="/2023/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:05- 5:15 Saturday closing remarks</title> <rect x="760" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(773,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2023/talks/matplotllm" title="MatplotLLM, iterative natural language data visualization in org-babel" data-slug="matplotllm"> <title> 10:00-10:10 MatplotLLM, iterative natural language data visualization in org-babel</title> <rect x="94" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> matplotllm</text></g></a> <a href="/2023/talks/voice" title="Enhancing productivity with voice computing" data-slug="voice"> <title> 10:20-10:40 Enhancing productivity with voice computing</title> <rect x="125" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(154,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> voice</text></g></a> <a href="/2023/talks/llm" title="LLM clients in Emacs, functionality and standardization" data-slug="llm"> <title> 10:55-11:15 LLM clients in Emacs, functionality and standardization</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="/2023/talks/overlay" title="Improving compiler diagnostics with overlays" data-slug="overlay"> <title> 1:00- 1:20 Improving compiler diagnostics with overlays</title> <rect x="376" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(405,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> overlay</text></g></a> <a href="/2023/talks/eval" title="Editor Integrated REPL Driven Development for all languages" data-slug="eval"> <title> 1:35- 1:45 Editor Integrated REPL Driven Development for all languages</title> <rect x="431" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eval</text></g></a> <a href="/2023/talks/repl" title="REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ" data-slug="repl"> <title> 2:00- 3:00 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ</title> <rect x="470" y="75" opacity="0.5" width="94" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(562,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> repl</text></g></a> <a href="/2023/talks/doc" title="Literate Documentation with Emacs and Org Mode" data-slug="doc"> <title> 3:10- 3:50 Literate Documentation with Emacs and Org Mode</title> <rect x="580" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(640,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> doc</text></g></a> <a href="/2023/talks/windows" title="Windows into Freedom" data-slug="windows"> <title> 4:05- 4:45 Windows into Freedom</title> <rect x="666" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(726,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> windows</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
</div>
[[!toc ]]
Format: 15-min talk; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2023/current/bbb-solo.html>
Etherpad: <https://pad.emacsconf.org/2023-solo>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different timezones:</div><div class="times" start="2023-12-02T19:20:00Z" end="2023-12-02T19:40:00Z"><div class="conf-time">Saturday, Dec 2 2023, ~2:20 PM - 2:40 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 2 2023, ~1:20 PM - 1:40 PM CST (US/Central)<br />Saturday, Dec 2 2023, ~12:20 PM - 12:40 PM MST (US/Mountain)<br />Saturday, Dec 2 2023, ~11:20 AM - 11:40 AM PST (US/Pacific)<br />Saturday, Dec 2 2023, ~7:20 PM - 7:40 PM UTC <br />Saturday, Dec 2 2023, ~8:20 PM - 8:40 PM CET (Europe/Paris)<br />Saturday, Dec 2 2023, ~9:20 PM - 9:40 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~12:50 AM - 1:10 AM IST (Asia/Kolkata)<br />Sunday, Dec 3 2023, ~3:20 AM - 3:40 AM +08 (Asia/Singapore)<br />Sunday, Dec 3 2023, ~4:20 AM - 4:40 AM JST (Asia/Tokyo)</div></div><div><a href="/2023/watch/gen/">Find out how to watch and participate</a></div>
+<div class="vid"><video controls preload="none" id="solo-mainVideo"><source src="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="solo-mainVideo" data="""
+00:00.000 Introduction
+01:20.680 Solo RPGs
+02:47.440 Demo
+04:11.760 Randomization
+05:31.960 Moves
+06:03.640 Reference
+06:34.680 Story arcs
+07:48.680 Using different stats
+09:02.960 Dice rolls
+09:34.800 Dangers
+10:19.680 A strong success
+11:49.680 Other solo RPGs
+13:04.720 Conclusion
+"""]]<div></div>Duration: 14:36 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-solo">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2023/current/bbb-solo.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--final.webm">Download --final.webm (52MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.opus">Download --main.opus (6.6MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.txt">Download --main.txt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.webm">Download --main.webm (52MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--normalized.opus">Download --normalized.opus (6.4MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--original.mov">Download --original.mov (836MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--reencoded.webm">Download --reencoded.webm (52MB)</a></li><li><a href="https://toobnix.org/w/oNkcCHdWCKXRv6KnUTAeEC">View on Toobnix</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file