From 79e9e0950bb2343a8e919cab8cbff0682ccf25dd Mon Sep 17 00:00:00 2001 From: EmacsConf Date: Sat, 2 Dec 2023 15:30:14 -0500 Subject: solo --- ...pgs-in-emacs--howard-abrams--main--chapters.vtt | 41 + ...i-play-ttrpgs-in-emacs--howard-abrams--main.vtt | 834 +++++++++++++++++++++ 2023/info/solo-after.md | 277 +++++++ 2023/info/solo-before.md | 19 +- 4 files changed, 1169 insertions(+), 2 deletions(-) create mode 100644 2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main--chapters.vtt create mode 100644 2023/captions/emacsconf-2023-solo--how-i-play-ttrpgs-in-emacs--howard-abrams--main.vtt (limited to '2023') 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 @@ + +# 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 "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"]] +[[!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 "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"]] +[[!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 "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"]] +[[!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"]] +[[!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 @@ 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.
- Schedule for Saturday Saturday 9:00- 9:10 Saturday opening remarks sat-open 9:10- 9:20 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp adventure 9:30- 9:50 Authoring and presenting university courses with Emacs and a full libre software stack uni 10:05-10:25 Teaching computer and data science with literate programming tools teaching 10:40-10:50 Who needs Excel? Managing your students qualifications with org-table table 11:30-11:50 one.el: the static site generator for Emacs Lisp Programmers one 1:00- 1:10 Emacs turbo-charges my writing writing 1:25- 1:35 Why Nabokov would use Org-Mode if he were writing today nabokov 1:50- 2:10 Collaborative data processing and documenting using org-babel collab 2:20- 2:40 How I play TTRPGs in Emacs solo 2:55- 3:15 Org-Mode workflow: informal reference tracking ref 3:25- 3:35 (Un)entangling projects and repos unentangling 3:45- 3:55 Emacs development updates devel 4:10- 4:50 Emacs core development: how it works core 5:05- 5:15 Saturday closing remarks sat-close 10:00-10:10 MatplotLLM, iterative natural language data visualization in org-babel matplotllm 10:20-10:40 Enhancing productivity with voice computing voice 10:55-11:15 LLM clients in Emacs, functionality and standardization llm 1:00- 1:20 Improving compiler diagnostics with overlays overlay 1:35- 1:45 Editor Integrated REPL Driven Development for all languages eval 2:00- 3:00 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ repl 3:10- 3:50 Literate Documentation with Emacs and Org Mode doc 4:05- 4:45 Windows into Freedom windows 9 AM 10 AM 11 AM 12 PM 1 PM 2 PM 3 PM 4 PM 5 PM + Schedule for Saturday Saturday 9:00- 9:10 Saturday opening remarks sat-open 9:10- 9:20 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp adventure 9:30- 9:50 Authoring and presenting university courses with Emacs and a full libre software stack uni 10:05-10:25 Teaching computer and data science with literate programming tools teaching 10:40-10:50 Who needs Excel? Managing your students qualifications with org-table table 11:05-11:15 Taming things with Org Mode taming 11:30-11:50 one.el: the static site generator for Emacs Lisp Programmers one 1:00- 1:10 Emacs turbo-charges my writing writing 1:25- 1:35 Why Nabokov would use Org-Mode if he were writing today nabokov 1:50- 2:10 Collaborative data processing and documenting using org-babel collab 2:20- 2:40 How I play TTRPGs in Emacs solo 2:55- 3:15 Org-Mode workflow: informal reference tracking ref 3:25- 3:35 (Un)entangling projects and repos unentangling 3:45- 3:55 Emacs development updates devel 4:10- 4:50 Emacs core development: how it works core 5:05- 5:15 Saturday closing remarks sat-close 10:00-10:10 MatplotLLM, iterative natural language data visualization in org-babel matplotllm 10:20-10:40 Enhancing productivity with voice computing voice 10:55-11:15 LLM clients in Emacs, functionality and standardization llm 1:00- 1:20 Improving compiler diagnostics with overlays overlay 1:35- 1:45 Editor Integrated REPL Driven Development for all languages eval 2:00- 3:00 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ repl 3:10- 3:50 Literate Documentation with Emacs and Org Mode doc 4:05- 4:45 Windows into Freedom windows 9 AM 10 AM 11 AM 12 PM 1 PM 2 PM 3 PM 4 PM 5 PM
[[!toc ]] Format: 15-min talk; Q&A: BigBlueButton conference room Etherpad: Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen) -Status: Ready to stream +Status: Q&A open for participation
Times in different timezones:
Saturday, Dec 2 2023, ~2:20 PM - 2:40 PM EST (US/Eastern)
which is the same as:
Saturday, Dec 2 2023, ~1:20 PM - 1:40 PM CST (US/Central)
Saturday, Dec 2 2023, ~12:20 PM - 12:40 PM MST (US/Mountain)
Saturday, Dec 2 2023, ~11:20 AM - 11:40 AM PST (US/Pacific)
Saturday, Dec 2 2023, ~7:20 PM - 7:40 PM UTC
Saturday, Dec 2 2023, ~8:20 PM - 8:40 PM CET (Europe/Paris)
Saturday, Dec 2 2023, ~9:20 PM - 9:40 PM EET (Europe/Athens)
Sunday, Dec 3 2023, ~12:50 AM - 1:10 AM IST (Asia/Kolkata)
Sunday, Dec 3 2023, ~3:20 AM - 3:40 AM +08 (Asia/Singapore)
Sunday, Dec 3 2023, ~4:20 AM - 4:40 AM JST (Asia/Tokyo)
Find out how to watch and participate
+
[[!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 +"""]]
Duration: 14:36 minutes
# Description \ No newline at end of file -- cgit v1.2.3