Tuesday, 16 June 2020

Bounty and Villain generator (ish)

The weaknesses in my generators are becoming apparent

A sample of the Bounty and Villain generator for Drier Deserts, Hotter Suns was posted in the OSR discord, and I figured I'd give it a whirl in the old generator. It highlighted a lot of issues; mostly formatting at this point. Solve formatting, and you can solve anything else I think.

Ignoring the dice roll (since we're rolling "behind the scenes"), it's clear that a single row will have issues portraying this information. Like, I'd prefer to have the output be something like this:
Swift 1
Tough 8
Bounty 4k
But that's not possible unless I split it into subtables -- so Dwarfish and Brawny would be in a table, there'd be a table for "Swift" and one for "Tough" and one for "Bounty." That said, it's fairly clear that the bounties are tied to the word; lower values of Swift and Tough means lower bounties. So, the "Word" could be split from the Swift/Tough part and be its own table, I guess.

Further issues appear when we add in the specialties:
 1-7 is easy, we just copy and paste the line 7 times to achieve that weighting. But, again, we'd like to format the result like so
Gun Specialist
Bounty 2k
Which, again, we can't. Yet. Anyway, here's the result of it.
As you can see, it's... okay, but lacking. I will prioritize formatting after I'm done with the sign-up functionality. I think the largest gain is to be had there. It would also be nice to have a function to sum up the bounties across the results, but that's ... soooo far away.

Magical Tome generator

In order to test what I've made, I'll make small generators for a while and see how they pan out. I've already found a bug, and I'm not sure how to solve it yet. It's to do with newlines, and I just hate how textarea (the HTML entity) is so bad. Each small step (fix) will eventually build into something pretty nice, I think, so they're worth taking.

Here are some magical tomes for your troubles.

A Party, Split! (Hole in the Oak, pt. 6)

Prior to this session, I offered the Magic-User the opportunity to switch from the B/X MU to the Holmes MU. The Holmes MU has, in my opinion, a better kit. I felt that the player got disinterested once they had used their one spell, last session, and I wanted to rectify that. While the Holmes MU still only has the one spell slot, they can write spell scrolls from level 1, and they know more spells.

The player took me up on that offer and now plays a Holmesian MU instead. They got to pick their spells from both the Holmes spell list and FEAST OF BUKAKO, which is completely free and worth picking up. Their character, Rodwulf, now knows the spells Sleep, Shield, Beacon of Terror, Enlargement, and Charm Person. Since Falbo is my version of Endon, the players know that Charm Person and similar spells are illegal. That's never stopped a player before, though.

The Session
Before heading down into the oak, the players get Halvar, the one-armed fighter from a few sessions ago, installed as the new innkeeper of The Golden Goose. The sheriff, Näsbjörn, accidentally reveals that the late innkeeper, Johannus, was found with a note stuffed in his tunic. The note read "snitches get stitches" because you gotta hit players across the head if you want them to figure shit out. The players are still not convinced that there's an evil spirit possessing a doll that did this, and instead invented a new miscreant; maybe the innkeeper had enemies?

(MAYBE HE DID! That's a great idea, actually. Maybe someone wants the inn for their own reason, and the murder of Johannus just coincided with an evil, child-killing doll that kills people talking shit about it?)

Halvar has no intention of letting the PCs stay for free, or cheaper, but would like investments. Not for shares or anything, though, but you know if you could help with the bills some? No, if there are strings attached to the money I guess I can just figure it out myself. No, you'd still pay the same for your room. What with this economy, you know...

The group also sits around for a week, letting Rodwulf create a Scroll of Sleep. Incidentally, this also meant that they were just in time for the meeting with the gnomes in the Oak.

The diplomatic meeting takes place in a fairy ring, where, according to the gnome, any oaths are made real. The PCs swear they won't attack the gnomes, the gnomes do likewise (I figure this is a lie from the gnomes' side). I'm not giving the players any indication that any oath in the ring has power over them. The gnome leader tries to get the PCs to agree to attack the ogre, but the PCs aren't biting. The PCs ask a few questions, but ultimately the meeting leads nowhere. The gnomes are satisfied that the PCs won't bother them, the players are satisfied that the gnomes won't bother them. They part ways.

The players figure they're running a bit low on inventory space, and pick up a failed farmer, Bartik to carry some stuff. Bartik is a simple man, with simple pleasures.

And so, they finally descend into the Oak proper.

Monday, 15 June 2020

Stealth release: Generators

I'm releasing Generators even though they're not quite finished

There's not much more to say, really. Right now, the only syntax that's allowed (and works!) is the table id syntax: {{id}}. More features are planned, but I'm also sick and tired of this application so...

Here's an example of a generator (and also an excuse for me to try it out on my own application!). It looks like this:
{{11}} and {{10}} {{9}}, from {{3}}.
{{11}} is a table of male names from, ca, 13th century London. {{10}} is likewise, but female names. {{9}} is a huge (~1.8k) list of surnames, also somewhat accurate to the 13th century. {{3}} is a list of wards in London, again taken from historical sources.
And here's the embedded object, with 5 entries just to show that it works:
And I think that's pretty neat, tbh. There's a lot of work to be done, still, but it's something that can be used now, immediately. And there's some value in that, too.

I've also added error tracking. I hope that I'll catch anything before the server burns to the ground. I don't think it will, but you never know.

Saturday, 13 June 2020

The Hunt Begins! (Hole in the Oak, pt. 5)

Session 0 (held in session 5; as my daughter is wont to say these days, "don't judge me!") yielded some good things. We talked a bit about lines and veils – things you don't want to see in the game at all and things you can accept allusions to – and a bit about conflict resolution. We also touched on the worst part of the dungeon, so far: the personality swap trap.

I don't like it. I like the idea of it, but I don't like forcing players into playing characters they don't want. As an effect that fades, it would be okay, but as it is written it's just straight-up bad. It touches on that whole "don't tell me how to play my character" thing. While PCs probably shouldn't pull every lever they come across, certain traps are just not fun. We retconned it, so August-Wilhelm is no longer a coward; the effect faded after a few days. Halvar is still retired, though.

"My" Death &  Dismemberment got positive feedback. I might tweak the actual table some, but the players enjoy hitting 0 HP not being a done deal, that there's a chance to survive. Zordo's player is brought up to speed on what happened in town after they left.

Spoilers below this line.

A generator of generators!?

Generators in the OSR sphere are largely JavaScript-based. It's easy to see why -- JS is immediately accessible, it lets you create dynamic web pages (or snippets for web pages), and it's fucking everywhere. But, as with all great things, there are downsides to the JS generators we've grown to know and love.

They're cumbersome. Like, so, so, so cumbersome. I'm not gonna name names or link you to any of them, but ... yeah. Some of them require you to host your text files elsewhere. Others require you to use extremely specific syntax but offer no validation of them ("test extensively" is not a validation). Others still offer hosting but you can't edit your own generators after having them hosted. Many offer you a blob of javascript you can add to your blog and get a sample output from.

My immediate goal was "I want dynamic table results", rather than "I need to fix everything" or something like that. I wanted to be able to write "2d6 orcs advance slowly down the side of the ravine" and have the output be "3 orcs advance slowly down the side of the ravine"; I figured that was a good place to start. You could make a JS page that just scanned the text for dice rolls and replaced them.

I've still not gotten anywhere near that. I made something else instead. I made a fucking generator. Quelle surprise, I guess, since the title is "A generator of generators!?" and I'm talking about ... well, yeah.

This tool, though, I had a mission statement for. It's a bit undefined around the edges, but overall it looks something like this:

Cassie's Generator Tool
  • The syntax should be clear and concise
  • Hosting for both the generator and the tables (lists) should be a solved problem for the user
  • Users should be able to edit their own tables if they need to
  • Users should be able to delete their own tables and generators, if they want to 
  • You should be able to use generators or tables someone else has made
  • It should offer embedding, no unsightly JS blob
  • If the user wants to, they should be able to download all their generators and tables
Here's a first sketch of the syntax:
A table result: {{table}}
A generator result: ||generator||
Dice notation: >1d6<, >1d6+2<
I'm still not sure about the dice notation, but I think it's important to have the difference between what should be rolled and what is information for the reader:
"The weapon does 1d6 damage" should just say "The weapon does 1d6 damage" in the output, whereas "The next >1d4< days" should say "The next 2 days" (plural "days" is gonna be a problem. Hm.)

I've not implemented everything yet. In fact, I've only solved the boring parts. But the good parts are coming. Here's what I made yesterday:
Now, that "{{11}}" says nothing, I know. I'll think of something. Eventually, there'll be helper functions for writing generator entries (like, you'd write {{ and get a search window to find the table you want a result from), but for now there's nothing like that.

The way the code's written, a generator is simply a very thin wrapper around a parser and a transformer, so using generators within other generators should be pretty easy. A few issues loom on the horizon, though. If I become as popular as Facebook, I can't host everything for free, and there might be some resource issues along with that popularity. I might have to move the platform to kubernetes eventually, just for that horizontal scaling. And also because I want to learn it.

Today and tomorrow I'll set up the embed thing, and then I think I might even link to the thing for public consumption.

Tuesday, 9 June 2020

A wave of Evil Tree Babies (Hole in the Oak, pt. 4)

The morning is bright and cheery, as Robustus tells the rest of the group that he suspects his dog to be a werewolf. The group purchases some Wolfsbane and a silver dagger, and head up to Robustus's room. Robustus grabs the dog by the collar and holds the wolfsbane in its face. It reacts violently, and Robustus tries to stab it in the head. The cleric, August-Wilhelm has either not been following the discussion or thinks that it's a bit premature to just straight-up murder a dog without a fair trial, and tries to drag Robustus away. The dog bites Robustus and flees the room by jumping out through the window. Robustus tells the group to fuck off and leaves the party.

... okay? A brief pause as we wait for the player to create a new character. Then we're off to the Oak, again.

Spoilers etc.

Bounty and Villain generator (ish)

The weaknesses in my generators are becoming apparent A sample of the Bounty and Villain generator for Drier Deserts, Hotter Suns  was po...