Kingdom of Rogueing postmortem
Prior to the beginning of the challenge
For a couple of years, Victor (Asymmetric’s Unity programmer) and I had been tossing around the idea of making a standalone build of SWOLE, the Standard West of Loathing Engine, that could load in an arbitrary set of data and assets. The 7-Day Roguelike Challenge provided a context and a deadline for finally doing it. Victor got it to me several weeks before the start of the challenge.
When we began production on the next big Loathing game, we focused on moving more and more engine features into the game data. It’s a subtle distinction when viewed from outside, but the core consequence is that moving features out of the engine and into the data makes them much easier to mess around with, especially for the team members who aren’t fluent in Unity, such as… me. Things like the title screen, saving and loading games, the combat engine, and animations are no longer housed in the engine, and that means that they can be replaced with whatever we want in any given game, without making significant changes to the Unity application.
There are still some remnants of West of Loathing specificity in the build I used for the 7DRL. The “YER STUFF” label in inventory, the horse speed slider, etc -- but we’re picking those off as we go.
Before the start of the 7DRL challenge, I had:
- the standalone SWOLE engine
- all of the animations and character models from West of Loathing
- the collection of scripts that comprise the combat system
- the art assets from West of Loathing
I started midway through Sunday, so I really only spent a few hours on it the first day. I stubbed out the basic progression through the game, [level, level, town, level, level, town, level, level, ending] and got some very rough tech in place for filling rooms with objects.
I had been messing around with procgen rooms prior to the challenge, and I reconstructed the tech with the needs of this project in mind. Every single location you visit in Kingdom of Rogueing except the towns is actually the same room, in the data -- it just gets built based on seeded random numbers, and all of the individual elements have tech on them that keeps track of their state if you leave and come back.
At the end of this stretch of work, I rewarded myself with one of the more fun tasks on my list, which was the building out of the procgen food, booze and potion items. Because the scope of this thing is big and the time is short, I’m trying to delay gratification on the parts of the work I’m really excited about so I don’t end up spending too much time on minutiae and not enough on core system stuff.
My goal for Monday was to get one area type (the Gulch) fully built out, so I’d know how long it takes. This ended up being unrealistic, because so much of the underlying scripting for doing basic stuff had to be made alongside the creation of gulch content. I spent about half a day on basic stuff -- wiring up treasure chests, fights, stat challenges, etc.
I made a checklist of features that I felt were part of a Minimum Viable Roguelike, and started tackling them one at a time. Among them were:
itemization: This is more of a category than a to-do item, but to make progress on it today I built out the system for procgen weapons and made 3 of the game’s 9 eventual weapons. They’re way less random than most of the other stuff in the game -- the generation script is mostly there to make them more powerful the later in the game they’re found.
player skills: I wired up the 9 different player skills. This took a lot less time than I thought it would.
monsters: I figured I could launch the game with 3 different types of monster. I got most of the way through one set (goblins) and it was quick enough that it made me less stressed out about having enough in place by the end of the week.
I was pretty burned out on writing code at this point, so I decided to spend an hour making a nice title screen. I was worried that if I didn’t do it early, it’d get deprioritized and half-assed later.
Before I went home for the evening, I had a sudden urge to wire up one of the bodyguard characters (the Sauceror) and one of her skills, just as a test case for the whole pardner system. This wasn’t on the MVR list, I chided myself, but then I told myself that rules were made to be broken, especially rules I made up earlier today.
I had a lot of real-life stuff going on Tuesday, so this was a pretty abbreviated work day. I filled out the remaining six weapons, wired up all of the familiars’ behavior, finalized the 9 player skills, and added basic versions of the procedural hats and pants.
I finished up the set of goblins and all of the remaining Gulch content. So the answer to “how long does it take to make a zone in this game” turned out to be “too long, at least for the first one.”
I decided on Wednesday to do quasi-formalized 2-hour sprints on specific items in the MVR list, and also that the game would be five levels long instead of six, with the goal of having five zone types (even though the MVR only requires three) and letting the player visit each of them every game, but in a different order each time.
The first sprint was making a new area type, the Mansion. This actually got done in the two hours -- turns out once the groundwork was laid by all the gulch work, making the content for a second type was much more straightforward. It was a pretty grueling two hours, but it was satisfying to suddenly have twice as much video game.
The second sprint was focused on itemization. I wired up most of the combat items and all of the rings (some of the rings do weird stuff, so these were more work than other item types) and finalized all of the generation scripts for consumables.
The third sprint was spent making the towns. By the end of this two hour period, all of the stores were in place, along with the familiar-boosting trough and the bodyguard-for-hire stand. Now we just need some bodyguards, but what we need even more than that is to go home.
When I’m excited about a project and/or under intense time pressure, there’s some switch that flips in my head that allows me to work with a lot more focus than I normally do, and while it feels good in the moment, it is extremely mentally and physically fatiguing. Since this was both very exciting and has a rapidly approaching deadline, everything was coming up Milhouse and Milhouse was getting very tired.
On Thursday I added the Wizard Tower area type. I think this turned out to be one of the weakest areas in terms of diversity of content, but it was quicker to make than the Mansion, since it really only has one room type with no sub-rooms.
I also added three additional monster types: demons, skeletons and cans of vegetables. The vegetables are secretly just the goblin model with a can for the body and no head. You can see the little necks poking through if you look carefully.
I finished up the 3 bodyguard characters and their skills, and added the ending reward tiers and character creation unlocks associated with various achievements.
Short of a few minor tweaks, the game was now in Minimum Viable shape for release, which was a relief. Having another entire day and a half for polish and extra content took some pressure off.
Friday brought the Cemetery and Cave zone types. The caves, like the Wizard Tower, are a little sparse and could use some love in the future.
Added one additional monster type (the vampire,) bringing the total for both zones and monsters to 5. Now that this was done, I could wire up the overall progression through the game such that a given playthrough contained one of each zone and one of each monster type with no repeats.
I went through a bunch of notes I had left myself and tied up various loose ends, then started playtesting. The tweaks based on that testing included:
- A big reduction in XP gains. When I stub out systems I always err on the side of being too generous, and in this case it made it too easy to get all of the skills and robbed the whole system of feeling rewarding.
- Changing a lot of sources of potions to be sources of food/booze instead. They had a tendency to pile up. The overall balance of consumable distribution still definitely needs some work.
- Making each area have exactly 3 fights in it. There were two problems here -- one was that a given run contained too many fights, and they weren’t fun enough to bear that much repetition. The other was that the number of fights in a given run was pretty random, which meant the amount of Swagger earned was similarly random.
Saturday was another busy day, without a ton of time to work on the 7DRL. I woke up having thought of an infinite loop state combat could get into if all of the player-controlled characters were defeated with a certain combination of player familiar and enemies, so I added a lame escape valve system where combats automatically resolve in a loss on the eleventh round. I also added the tattoo stand to the second town, to give players a better Meat->Swagger value proposition than the ending bribe.
I’m not really sure what my plans are for KoR. I keep thinking of things that would be cool to add to it, but I definitely need to prioritize my normal work for a good long time after spending a week’s worth of time and three weeks’ worth of brain juice on this thing.