Sunday, December 10, 2017


Part twenty-four in a weekly(Ξ±) devlog.

Standard development disclaimers apply. This is alpha content, everything is subject to change, features may not be present in the final version, there's a chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

First things first: CalFree in Chains has officially entered alpha testing. If you're interested in participating, send me a friend request on Steam if we aren't already connected, and then head on over to the workshop page to subscribe.

My tentative plan is to run the private alpha for about two weeks. I'm not expecting to catch and fix all remaining bugs during this phase: the goal is to find major show-stopping issues, some of which may only manifest as the result of certain branching choices.

I'm still not committed to it, but if things go smoothly I'm hoping to release the public beta on December 22nd (the same day Bright releases on Netflix). As with my previous campaigns, I'll be actively maintaining and updating the campaign as reports come in, but this time around I wanted a clearer demarcation between "This likely has many bugs!" and "I don't think this has many bugs!"

In the run-up to this, HadesScorn has been doing a very detailed playtest (thanks!) complete with tons of helpful notes and feedback. I'm acting a bit like the sweeper at the end of a parade, cleaning everything up behind as the progress continues. The most painful fix so far has been a character rename. As you might have seen in some earlier dialogue snippets, one of your crewmates is named Isas. It wasn't until HadesScorn pointed it out that I realized this is uncomfortably close to the name ISIS, which is not at all the association I wanted him to have.

The reason this was so painful was that a crew member's name shows up in a LOT of places: not just the text you see in dialogues, but also in variable names, data files, and so on. There's a huge potential for bugs.

In most of these posts I've shown the work I do inside the Shadowrun editor, but I also do a fair amount of work in raw text files. Sometimes it's easier (or necessary) to open up a file in VIM and manually edit stuff in there instead of going through the editor. Something like the Isas -> Isao rename absolutely requires this sort of approach. There were well over a thousand references to update, and there's no way I could do all that manually.

Here's a handy command that will take care of the bulk of the work for me:

This one only updates the lower-case version of the name, which I need to be careful about - otherwise, it will update works like "disaster" to "disaoter".  The capitalized version turned out to be safe to run everywhere; this version had to be restricted to only run on certain folders, excluding "convo".

Anyways - what this command does is look under my project folder for all text files, and globally renames "isas" to "isao" in all of them. Pretty easy! This blows through hundreds of files in less than a second.

(I have a bit of a history with stuff like this. I've mentioned before how Rafik was named Destin for almost the entire time I was working on The Caldecott Caper; I made that change very late, but before entering testing, so it wasn't quite as painful. Also, about a month ago I renamed the primary villain in CalFree in Chains after I became concerned that it was too close to the name of a real-life political figure. I'm not necessarily opposed to players drawing parallels to real-world events, but I've tried to avoid making any one-to-one correspondences between fictional and real people, preferring instead to focus on movements and ideologies. Anyways, that one wasn't as bad since it mostly just affected the content of dialogues, not game data files.)

Oh... while we're talking about names, this might be a good time to mention the name of this game. My initial working title for it was "Saito's Shadow". I thought that it would immediately signal to prior players that this was a continuation of my previous games, and it also has a sinister sound to it that matches the game content.

The title lost its appeal, though. First, I was worried that players would jump to the conclusion that you get to actually fight Saito in the game. (Spoiler: You don't, at least not directly.) The word "Shadow" is also massively overused in Shadowrun games, in both fan-made and official content. "Saito's Shadow" is also hard and annoying to say out loud, with multiple sibilant S's stacked side by side. Finally, it isn't super-Googleable.

I (surprise!) started another Google Doc for brainstorming names. I ran through several dozen, each with their own pros and cons. I got excited once I thought about "Welcome to the Occupation", which is the title of an R.E.M. song that I love and a great thematic match for this campaign; unfortunately, as an existing song title it would be even less Googleable. But that started my mind down another path, and I ended up settling on CalFree in Chains. It has a certain insistent rhythm to it that I like, a nice li'l acronym (CFiC), is decently Googleable, and announces its ties to the previous games.

I have an even longer list of parody titles that I would never use but I can't get out of my head, including:
Uncle Saito's Smile-Time Family Variety Hour
My Dunkelzahns Are Dead And My Saitos Are In Power
I Feel Sad: Surprise! Now You Feel Sad Too
So Much For The Tolerant Left

Back to the command line: there are tons of commands I use during development, most of which only get used once or twice but all of which save an insane amount of time. Here are a few random examples:

This one was handy when I was experimenting with options for targeting enemies and allies while creating new spells and abilities. I'm running it on the official Hong Kong source so I can see all of the available options; there's no official reference for this, so I'm essentially building one myself. "grep" is the standard text-searching command. -h will hide the filenames of matches so the output only contains the matching lines. "toHitFunction" is the string I'm looking for. "sort" will organize all of the results into alphabetical order, and then "uniq" will remove any duplicates. So, I end up with a nice, alphabetized list of all valid hit functions that Hong Kong supports. (Longer than what's shown here.) It's way better than opening hundreds of files by hand and writing my own list!

Or, here's an example of editing every file in the project that includes the string TODO. I often leave this as a comment to myself while working. It might be a placeholder for something that I need to hook up later, or a reminder about a bug that I spotted but didn't have time to fix, or a note that I need to do additional research on some dialogue.

This one line will crawl through the project and open up all the matches for editing in VIM. For text-based stuff I can just make any necessary edits directly in the buffer; otherwise, I can quickly find the corresponding content in the editor (the map or dialogue or whatever) and take care of it there.

Okay... I feel like I'm massively overdue for showing some actual gameplay. Next week might be a good occasion for that, I'll try to grab some screenshots or even a video snippet. I'll be pretty busy now that the wider alpha is underway, following up on bug reports and swiftly fixing stuff, but that's a good thing! I have a full work queue now, and it's exciting to see the game get better and better every day.

Sunday, December 03, 2017

First Past the Post

Part twenty-three in a weekly(πŸ—Ώ) devlog.

Standard development disclaimers apply. This is pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

I've finished my first-ever run-through of CalFree in Chains! I think it's pretty good. It's always fascinating to actually encounter these scenes that have been trapped inside my head for months and that I've spent so much time building. I'll never experience them as a player will, but I do feel a certain sense of awe at watching them turn from idea into reality and manifesting inside this game that I'm playing.

My high-level takeaways from the game:

The difficulty curve is inverted. Early missions are too hard, and the final missions are too easy. That was exactly my experience in all of the official campaigns, though, so I suspect it's at least partly due to the underlying mechanics of the game and not something I can completely solve. In the short term I'm adding a few more healthpacks and such to the earlier missions. I'm experimenting with what I'm labeling "homemade" medkits, which act the same as a basic medkit but are worth far less. My goal is to encourage players to actually use these instead of hoarding them (which is what I, personally, always tend to do in these games).

The last battle in particular seems to be easier and faster than I had expected. This is kind of a bummer because there's a fair amount of content that only triggers after the battle has gone on for long enough. I'm still mulling over how to address this... the simple thing would be to just add more waves of enemies, but that seems dull for a final fight. I'm also tempted to bump up individual enemies to have boss-level stats and be more menacing, but then I risk having crew members die and not being available to deliver dramatic lines. I dunno. Maybe players will enjoy feeling powerful in that fight (and it is interesting, even if it isn't all that hard).

I think that the story makes sense and doesn't drag too much, but I'm too close to it to be objective. Honestly, at this point there probably isn't much I can do to change it since it's so closely interwoven with the gameplay. There may be an opportunity to add more explanations if things are unclear, but I don't think I'll be able to cut out much without hurting the game.

I do worry a little about some long-running side-content. There are a couple of references near the end to stuff that happened back near the beginning, which should be fine if someone is playing straight through, but would probably be confusing if they're going weeks between play sessions. The critical-path main plot stuff is all refreshed fairly frequently so I think that's OK, but I can see some players going "Huh?" when a companion says "Haha remember the one time you did X way back in mission Y?", when nobody has mentioned it during the five missions in between.

There's a bit too much nuyen. I thought that Hong Kong was too stingy, but in this runthrough I was able to completely kit out every slot of cyberware, buy my best armor, get some good Adept abilities, and still clear out the doctor of every platinum Doc Wagon and premium medkit before the final run (none of which I ever used...). I've already made some adjustments to tune this down a bit, though I should probably go further. Games are more interesting when you need to make choices and trade-offs, and being able to buy everything you want isn't all that compelling.

The karma level feels pretty good, though. I brought my CHA all the way up to 8 for four etiquettes, maxed out my Cyber Affinity, and came close to maxing Close Combat. And I still had some points to splash around in Qi Casting, Biotech, and other useful things. I think there's enough for specialists to max out their primary skills, but not enough to max out multiple skills, which feels like a good place to be in.

So, yeah... there's definitely more tuning and fixing to come, but the overall shape of the campaign feels decent, so I'm starting to cautiously expose it to other folks. The first person to endure the torture will be Hades Scorn, my longstanding lead tester, also known as the infamous pistol street samurai. Shortly after that I plan to open it up to a small group of alpha testers, hopefully drawn from current Steam followers and one or more of the active Shadowrun communities. It now seems possible that I might get this out before the end of the year, which would be awesome, but I'm not prepared quite yet to commit to that.

Sunday, November 26, 2017

Shake It Off

Part twenty-two in a weekly(πŸƒ) devlog.

Standard development disclaimers apply. This is pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

Happy belated Thanksgiving! Another week with slower-than-usual progress, but still some cool milestones crossed. The big one is that I've started my initial playthrough of the game. This is the first time that I'll actually roll a character and take them all the way through the campaign, scene by scene, to the end.

This is another opportunity for spotting and fixing bugs. As I mentioned before, a lot of issues only become apparent when experienced within their context: an isolated component may look great, but when you plug it into the surrounding content problems will occur. I already cleared out a lot of hub-related bugs of this type, and now I'm encountering and fixing similar issues for the actual missions. Carrying forward certain items or characters or plot flags may cause unexpected problems to crop up.

The single biggest thing I'm focusing on now, though, is the game's difficulty balance. Everything up until this point has just been stabs in the dark: "I dunno, maybe five enemies in this group will be okay?" "Uh, this one has a grenadier and a mage, so maybe just four?" Now I'm actually encountering these as a player would, with a certain build and amount of karma and nuyen and health, and can get a sense for how they feel.

The answer is, they are too hard! Of course they are too hard! This is the fifth Shadowrun campaign I've made (six if you count the port of Antumbra Saga to DFDC, which did revamp the combat), and I always start out making it too hard and then gradually dial it back until I can beat it. I honestly don't know why I can't just make them easier to begin with, I have plenty of data points by now that show I should tune it down from the start.

I guess maybe it's because I seem to end up with a decent difficulty, maybe after more thrashing than is strictly necessary. My standard process is to play through on the most difficult setting (Very Hard for Dragonfall, Hard for Hong Kong), using the archetype I'm most expert at (Rifle decker in DF, cybered adept for Hong Kong). I want to get to a point where this feels hard but not frustrating - ideally no more than 1 party wipe per scene, and being forced to use at least some consumables to get it through.

I think this ends up as a fair proxy for overall difficulty. I'm not the most hardcore player of these games, and I'm not playing the most optimized min/max build. But I do have the enormous advantage of knowledge capital: I know exactly what is in each mission, how much further I have to go, whether I should toss out all my fetishes on a given combat or hold them in reserve for the next one coming up. Other players will have less certainty, but Hard should still be beatable with ideal builds or brilliant tactics. I'll ultimately recommend players to play on Normal, but I want to make sure that Hard is feasible, and I can't make that claim if I can't beat it myself.

My initial thoughts:
  • Money feels a bit too plentiful. I'm currently holding about 3k and haven't unlocked the second-tier merchants yet. I've bought armor (replacing the 1 Armor starter with the 3 Armor upgrade), but with my particular build there isn't much I want to get until the better cyberware becomes available. I'm thinking of giving the player more nuyen to start (500 at the start instead of 0) and dropping down the per-mission rewards for the early missions. That will make it easier for the player to buy a decent upgrade on their first hub visit and/or hire a merc if they need one.
  • I'm dying a LOT. I initially followed the Hong Kong design where some companions have medkits, others have Doc Wagon, some have neither. But particularly in those early levels, low HP and armor values means it's very easy for people to get killed. I'm now granting all companions one Doc Wagon and at least one medkit. That's more generous than Hong Kong, but there's also a lot more fighting in my mod than in Hong Kong so I think that makes sense. I might need to revisit this at higher levels... it would feel weird to take away Doc Wagons later on, but I suspect they'll be less needed.
  • I really like the pace at which companion upgrades are unlocking. You stay at Level 2 for a while as new optional companions come in, so you can gradually build out your team instead of configuring everything at once.
  • So far it isn't feeling too talky to me. That was one of my biggest concerns while working on this game; there's more words here than in Caldecott, and I was worried that it would seem too wall-of-text. I still haven't gotten to the talkiest mission of the game yet, or the talkiest hub visits, but at least so far it hasn't seemed overwhelming (and I am reading every word as I play, though I may not be able to keep that up for subsequent playthroughs). Granted, I do have a higher tolerance for reading to begin with, so it's very possible that my players may disagree about the narrative volume.
Short update... I don't think I can really share any videos or screenshots at this stage, most of this is pretty spoiler-y. But yeah, so far I'm cautiously optimistic about how things are coming along. It's been a while since I've done this and I don't have a great memory for what the process was like on Caldecott, but I imagine that I'll continue along this for at least a couple of weeks until I've convinced myself that the game is beatable and start letting other human beings look at it.

Sunday, November 19, 2017

Lucid Heart's Refrain

Part twenty-one in a weekly(🎡) devlog.

Standard development disclaimers apply. This is pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a strong chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

I was fighting off a nasty cold this week, so I didn’t get as much done on the campaign as I would have liked. BUT, I did finish my first pass through the hub, so that was pretty good! That means running through all of the various side-quests and romance arcs that I mentioned in my last couple of posts, on the actual final map for the hub, and eyeballed everything to make sure it looks decent.

At a high level, I’ve now completed most of the “big things” and am now working on the “small things”. I have a massive Google Doc titled “CFiC Tasks” which is a running list of everything that needs to be done before I can release. I had a lot of stuff in there months ago when I kicked off the project, and have added to it as new problems or ideas have risen. I’m also knocking some things off, although up until now that’s been a slower rate than things getting added.

Anyways, most of the items I’ve been working on until now have been single lines like “Write all the dialogue” and “Create all the maps” and “Implement all the combat”, where a single sentence implies more than a month of work. Now, those few big things are done, and instead I have a billion smaller things to do. So I’m now looking at items like “Add karma rewards” and “Make sure X’s ability works properly” and “Write the epilogues”. Almost all of those will be a day’s worth of work or less, but there are a LOT of them to get through.

Still, it’s a very good place to be at. I have a really high sense of velocity at this stage of the project, since I feel like I’m constantly knocking stuff off and fixing specific things, instead of continuing a Sisyphean struggle. The flip side is that it will eventually start to seem like a never-ending stream of concrete tasks, so my mood will likely flip back and forth between “This is almost done, I’m so excited!” and “This will never be finished, I hate everything!”

I’ve been very disciplined about scope creep, and it becomes even more important now. There are an infinite number of good ideas out there, an infinite number of things that could be better, and unless I say “No” to them I’ll never be finished. There are a handful of exceptions, when I spot something that threatens the game as a whole (from a gameplay or moral standpoint), but I set and try to maintain an extremely high bar.

Anyways. What I’m working on right this second is music selection. This used to be my favorite part of making modules, although that’s gotten a lot more complicated in the SRHK era. Still, it does contribute an enormous amount to the overall mood and impact of the game, while requiring proportionally little time on my part since the musicians have already done the heavy lifting. My role here is more like a curator, looking through the limited menu and deciding what to present when.

This can initially seem like an overwhelming task. There are 47 potential music tracks in SRHK, which I need to distribute over (cough, cough) missions. Ideally I’ll minimize repetition, and try to keep repeated tracks as far apart as possible. Maybe more importantly, I want to pick tracks that work well for each scene. If you’re surrounded by disciplined corpsec forces, you’d expect a different vibe and sound than if you’re fighting off wild monsters or enjoying a drink at the pub.

I handle this by - you guessed it! - creating a spreadsheet. Each row lists a separate track of music. In the columns, I’ll identify the following.
  • Energy level. Theoretically one of Low, Medium, and High, but of course I’m incapable of making decisions and will ultimately classify some tracks as Medium-Low or Medium-High. This is mostly a function of volume and BPM, though it’s ultimately subjective.
  • Mood. As I listen to the track, I’ll jot down a couple of adjectives or brief phrases describing how a song makes me feel. Examples include “Restrained”, “Desperate”, “Funky”, “Joyful”, “Holy”, “Pursuing”, “Yearning”, “Proud”, etc.
  • Type. I’m really looking for either “Legwork” or “Combat”, though some tracks might work for either, and in a few cases they might be better for cut-scenes or other unusual situations.
  • Map. I’ll think of a couple of scenes within my game where this track might work, mostly relying on the previous entries.
  • Notes. Anything else that’s interesting: whether the track seems especially short or long, if it’s doing something unusual instrumentally, or whether it has a strong association with the official campaigns.

For this process, I’ve been taking advantage of (and very grateful for) the Aztechnology Aural Mindscape, a nifty stand-alone utility campaign that makes it very quick and easy to test music tracks. I can run through all of them back to back without needing to modify and debug my own campaign. I’ll typically listen to each track twice through, fill out the row in my spreadsheet, then move on to the next one.

After this, I make another sheet listing out all the slots I have for music in my own campaign. On a simple map this will just be “X Freeroam” and “X Combat”, but for some larger maps I might want different music for different areas, and in a few cases I might want a special tune for a particular character or scene. I refer back to my first sheet as I go through and slot things in, top to bottom. I’m mostly picking good fits for each one, and also keeping an eye on if and when I most recently used a given track, so it hopefully won’t be too repetitive for the player.

The final step is to actually add them in. Setting up the basic music is really simple, just add the tracks to the camera regions. If you have multiple regions and want to share music, you can leave the music blank on subsequent regions: the previously-playing music will continue playing into the next region.

The engine automatically handles transition between the default (legwork / freeroam) music and combat music. I typically keep the defaults for all of the settings like the fade interval (how long the transition between two tracks takes, during which time you can hear both playing). For CFiC, I'm not planning on using the "Intense" (Int2) and "Wrapup" music, in an attempt to get some more variety across a larger number of scenes. Oh, but note that by default the option Loop Default Music is disabled, which is almost definitely not what you want.
Edit: After more thorough testing, I've found that the best configuration for a single music track in combat is to repeat the track for Base, Intense, and Wrapup, and set all the thresholds to 1. This mirrors how HBS often does their Matrix music. The above screenshot works in general, but can lead to drop-outs and silence in some cases.

You can also control music via trigger commands. I do this sparingly, but it can be a really cool technique: in Corona / Antumbra Saga, I used musical themes specifically for Hans Brackhaus and for Tabitha, so their distinctive tunes would play when they appeared on screen or when their influence was being felt. There aren't as many opportunities for this in Hong Kong due to the more limited track selection, but just shifting from one piece of music to another can have an impact: during a particularly surprising moment in Caldecott, I dropped out the music entirely so a brutal scene would play out in silence, and then kicked back in with a high-energy track as you and your team dealt with the aftermath.

I don't do this too often. It's a bit tricky, there are few items at my disposal, and it's a classic source of bugs. In particular, the engine can get confused if you're shifting between autoplay combat music, triggered scene music, and so on; in general, stopping your triggered music will cause the region's music rules to kick back in, but the more stuff you're trying to do the greater the risk that the player will end up hearing no music at all. (There's still a lingering bug in the climactic fight of Caldecott for this very reason.)

Yup! Music is awesome, I love it a lot. I'll probably do another post later on my music, the fuel that's kept me going during this insane project.

Sunday, November 12, 2017

Hub and Spoke

Part twenty in a weekly(πŸ›) devlog.

Standard development disclaimers apply. This is pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a strong chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

Now that last week’s boring post is out of the way, we can finally move on to the topic everyone ACTUALLY cares about: spreadsheets!

I’m close to wrapping up work on the hub, the location to which you and your team return between runs. This has been a long process, and also a fairly complex one. I have a variety of goals for the hub which overlap and sometimes contradict one another.

The hub should feel dynamic. It’s boring if everything looks exactly the same every time you come back. It adds a ton if the physical space changes and if characters move around from one visit to the next; it adds to the sense that you’re occupying a real place and interacting with people who have their own desires and agency, and aren’t merely there for your bidding.

The hub should be easy to navigate. It’s frustrating if you can’t find something you need or have to waste a lot of time running around.

The hub needs to support ongoing quests, which in turn will often require certain people or objects being in a certain location at a certain time.

The hub should reflect and support the overall narrative mood at a given point in time. If something upsetting has recently happened, it would feel jarring for everyone in the hub to be jokey and silly. Conversely, if your team has recently accomplished something great, I don’t want to bring down the mood with doom and gloom.

I realized fairly early on that there was way too much going on for me to keep everything in my head at once, and so I outsourced record keeping to the cloud: in particular, a Google Sheet that I threw together. Here’s what a portion of it looks like, heavily redacted.

Everything is ultimately driven by the global (story) variable “NumMissions”. It increments by 1 every time you return to the hub, and in turn it drives everything else about the scene.

There’s some mechanical bookkeeping driven by this. Part of that is the CharacterScaleAmount, which in turn will determine when you can select upgrades for your crew and how difficult enemies will become.

The more complex thing in this shot, though, was working out where various crew members would be located. Pretty much everything here is redacted, sorry, but the idea is to move the spawned actor into the correct location for a given visit to the hub. I try to avoid clustering them all close to one another. I also try to put them in a location that makes sense for the character: some more martially-inclined crew members will often by found in the target shooting range, while a bon vivant would more likely be found in a restaurant, and a decker will spend a lot of time by a computer.

But this gets especially tricky when a character is involved in a side quest. If I want the character to walk to a certain location, then they need to be located in a place from where they can path to their destination. So, in addition to the default positions, I may override their location based on the current state of a given side-quest. There aren’t any examples of that in this screenshot, but I flagged those cells with a teal background.

Speaking of teal, let’s more on to a later section of the sheet.

You’ll note that I froze the two left columns - this is a long sheet! The number of missions is most important for scripting purposes, but by itself the number doesn’t mean anything to me. The previous mission tells me what went down immediately before this hub visit, which in turn informs what conversations would be tonally appropriate. In some cases this is variable, like [Act 2], where the player may have gone on any one of a variety of runs. The more important story missions are individually flagged and usually have bigger thematic implications for what’s happening. Anyways, freezing the columns helps me keep my place regarding the overall state of the story during a given visit.

The next three columns here show when various conversations get unlocked for different NPCs. When possible, I try to spread these around so there’s a relatively consistent amount of new content, instead of overwhelming the player early on and leaving them with too little near the end (which was one of the slightly annoying things about Heoi in SRHK). Some conversations are just for fluff or flavor and can happen any time. Others are tied to specific events; here, the ones at NumMissions 5 are specific reactions to a story mission that the player has completed. Some conversations might be interjections that take priority over everything else, and others could be tied to ongoing missions or sidequests, which are respectively flagged in yellow or teal.

The PC0 Spawn column acts similar to the companion spawn ones from before. You’ll typically start out in your bedroom, unless there’s a team meeting or similar gathering. Occasionally, an event might happen right when you spawn, which is noted here.

The remaining columns are related to the atmosphere of the hub: little bits of character that will change from one visit to the next. I actually kind of hope that players don’t notice this: ideally, it’ll be an almost subliminal effect, adding to the impression that you’re in a dynamically evolving environment without calling too much attention to itself. But folks who are very observant will find these things, which will hopefully add another fun thing to look out for on return visits.

While building out a lot of these things (conversations, romances, side-quests), I did almost all of my work in a test scene instead of the actual hub scene. I’d just activate whichever specific NPC spawners I needed, set up the global variables correctly, and then run through it. This does add a little overhead, since I later needed to re-test things in the actual hub, but more importantly, each time I need to test a scene it takes only about 5 seconds to load as opposed to the 30+ for the real hub. When I’m testing things dozens or hundreds of times, that really adds up! So it’s good to do as many of my iterations as I can on the simple test scene, and just do my final verification on the real thing.

Over the past weekend I was able to run through a streamlined test of the hub: basically starting a character at NumMissions 1, talking to and interacting with everything in the hub, advancing to NumMissions 2, and repeating it through the whole game. This let me verify that multi-stage quests were advancing properly, see how all of the different states were interacting, and so on. As expected, I caught quite a few things here that I’d overlooked during my more targeted unit testing early on. This included one really amusing unexpected interaction, when I realized that one crew member who had joined you for a side quest might be present during a particularly intimate scene. Even my vaunted spreadsheet hadn’t anticipated that interaction. But, hey, at least now I know about it!

A couple of random technical comments:

There's a fair amount of ambiguity about whether you should interact with spawners during the "On Map Setup" or "On Map Start" event. Ideally, you would activate your spawners during "On Map Setup", and then move / animate / whatever them during "On Map Start". But, from what I can tell, spawners that were activated during setup may not have finished by the time "Start" runs, so attempting to teleport a recently-spawned actor during "Start" will fail. Because of this, I generally keep "Spawn At Map Start" set on the map spawner, and then kill off unwanted actors during Map Start. This is unfortunate, since it leads to longer map loading times - I incur all the time to create the actors even though I'm tossing them - but it's the only solution I've found yet.

On a related note: this isn't very consistent, but sometimes the scene will freeze/crash during loading if you attempt to kill actors during Setup. It's safest to do this during Start instead. Which, again, is annoying - it leads to a longer gap between when the player clicks "Continue" on the loading screen and when they can actually start playing - but a longer delay is far preferable to a crashed game.

There's a longstanding bug where actors lose their animation state when reloading a saved game, so it looks like people are just awkwardly standing around and staring into space instead of doing what they should be. I addressed this back in Caldecott by setting all animations on the Curtains Up event instead of the Map Start event, since the curtains will re-fire when reloading a saved game in addition to when first starting a map. I built on that for CFiC, coming up with a system that I think works pretty well for dynamic-feeling characters.

So: my overall goal is to have individual crew members doing something on a given hub visit. They might be repairing some equipment, or talking to nearby NPCs, or dancing in a club, whatever. When you start talking with them, they stop whatever they were doing and turn their attention to you. After the conversation is over, they resume their previous action.

Initially, I implemented this with a ton of individual triggers, enabling and disabling them as conversations started and ended. But I ended up with a pretty nice and unified approach. It looks a bit like this. First of all, we place our characters in their initial position while the map initializes.

Next, start their animations. This will happen when the curtains are raised or an event fires. I do one of these for each mission, and each character's animation makes sense for what they're doing. ("Sacrifice" and "Doomventing" may sound very dramatic, but they aren't really. "Sacrifice" is just the character looking slightly upward, at some object taller than themself. "Doomventing" involves fiddling with something on the floor.)

In each conversation, set the actor to the "idle" animation. Most of them will also automatically face the PC when the convo starts; if not, you can manually trigger that as well. As a result, they'll stop dancing or whatever and focus on you for the remainder of the conversation.

Then, we wire up this one trigger to restart all animations whenever any conversation ends.

That will re-run the same trigger up above that we ran when the curtains raised. So, after every conversation, everyone will go back to what they were doing when we first started the map: now that your chat is over, they can pick up where they left off.

In a handful of cases, I might not want a crew member to resume their original animation: for example, if they are following you or have moved to another spot on the map. In this situation, I just create another trigger to handle that specific case, going back to the "Idle" animation or whatever is most appropriate. Remember that triggers always run in sequence, from top to bottom, so triggers defined later in your list will execute after ones above it. In this example, I'm checking whether one particular actor is in a specific area, and if so, have him continue standing instead of his standard animation.

That's pretty much it.

So, yeah. There’s still a ton left to do, but I’m feeling like the hub itself is in pretty good shape now: the crew conversations, romances, merchants, side quests, paydata, rewards, and lots of other stuff is now present. I still need to work on crew advancement and a couple of other mechanical-related stuff, but for the most part the overall framework is in place. Running through that end-to-end test felt awesome: I love this feeling, when the project starts to actually seem like a game, with interlocking systems and coherent progress. Excelsior!

Monday, November 06, 2017

Before The Storm musings

I've been noodling more on Life Is Strange: Before the Storm and working my way through a few Let's Play videos, and had enough add-on thoughts for a short follow-up post. So, here it is!

MEGA SPOILERS (for both Before The Storm and Life Is Strange)

I've started to reconsider my previous strongly-held anti-Nathan sentiment. Most of the playthroughs I've seen have gone the same way: standing up for Nathan when Drew bullies him, having him attack you and Samantha afterwards, getting blamed for that same incident by Wells, and then seeing him melt down after getting browbeaten by his father. I'm the only one who explicitly advised Sam to stay away from him, but most players either avoid him altogether or more gently ask her to give him space. Nathan freezes on stage, forgets his lines, becomes a laughingstock... you feel bad for the kid, but maybe also a little like he deserves it.

But, the thing is: if you advise Sam to encourage Nathan, then the outcome is completely different. It turns out that Nathan is actually a really talented actor! Once his head is in a good space, he's confident and smooth. He has great physical presence, embodying Caliban's "primitive" stature, and is basically Rachel's equal in delivering Shakespeare's lines.

Of course, seeing that made me feel bad. Why had I withheld such a positive experience from this unfortunate boy? I think the answer points back to one of my central questions / concerns about this season: is the canon fixed, or variable? If it's fixed, then we know where Nathan's story leads, and the best course of action is to minimize the number of victims. But, if it isn't, then shouldn't we be doing everything possible to keep it from happening? Helping Nathan find confidence in himself seems like it would go a long way in his desperate quest for withheld approval that sends him down the spiral that leads to Jefferson.

My sympathy is still on behalf of people who get hurt, more than people who hurt themselves and others, and so I think that my desire for Samantha's own happiness wins out over my desire for Nathan's self-actualization. It helps matters somewhat that Nathan is so hostile at rejecting overtures for assistance. But, really, couldn't we say exactly the same thing about Chloe? Their weapons are different - she uses sarcasm and humor to deflect, while he uses his privilege and insults to attack. But, fundamentally, both of them have built emotional armor around their broken hearts and reflexively fight off anyone who threatens their sad solitude. In a sense, Rachel's constant presence and encouragement are allowing Chloe to finally shed some of that armor and confront her underlying issues. It wasn't easy, and isn't easy: she needs forgiveness from Rachel after she messes up, and she receives it. Having received this grace, it seems cruel to deny the same to Nathan, even in the face of his hostility.

I dunno. This is a hard game!

In retrospect, the "what to do with Nathan" choice is a hard one, but in the moment I didn't really hesitate in my answer. Like a lot of people, the big hard choice for me in Episode 2 was the confrontation between Drew and Damon. That was a tough one, but for me it ended up being more analytical than emotional, as I didn't feel particularly invested in either character. Reconstructing my thought process, I think my decision tree went something like this.
  1. Does anyone know I have the money? No.
  2. Will Rachel care what I do here? Probably not... she might be a little happier to build up our escape fund, but she doesn't seem stressed about it.
  3. This is dirty money. Drew might put it to better use, but it was ill-gotten in the first place.
  4. Drew asked me to stay inside. The only one who really wants to go out there is Mikey.
  5. It's probably a bad idea for the druglord to get eyes on me.
  6. I'll have more options if I hang back.

Of course, I felt awful afterwards. I think everyone does - after seeing all the ways it can play out, you'll never feel good about your choice (although they do a good job at providing some comfort later on via text messages in both scenarios). I assuaged my guilt somewhat by handing over the money. But... I dunno. Thoughts:
  • Drew is really dumb, especially about money. A grand might seem like a lot, but his scholarship is worth a lot more, not to mention the entire rest of his life after college.
  • Speaking of which... since their dad is homeless, they definitely don't have health insurance. Even with insurance, the cost of copays and deductibles for a knee surgery would be way over $1k. Without insurance, they're in huge trouble.
  • ... but, that being said, I do like Mikey more than Drew. Drew has good and bad qualities, but Mikey seems all-around good. It isn't clear yet what their long-term injuries are, but if they're equivalent, it seems more cosmically just for Drew to suffer for dealing drugs than Mikey to suffer for protecting his brother. 
  • I haven't seen anyone keep the money yet. That would be stone-cold. I'm really curious if money will become important in Episode 3. If you steal the T-shirt vendor's money, hold on to it, don't pay off your debt, then steal Drew/Damon's money (and maybe withold it from Frank?), you might have a decent kitty. Personally, I'm starting Episode 3 with zilch. Anyways, that might make the choice even harder on a future replay if the money works out to be significant.
Heh... next to the Drew decision, the one that I spent the most time agonizing over was whether to steal the bag of weed from Frank's RV. It was a total push/pull between "this is totally what Chloe would do!" and "this is a horrible idea!" And of course, it totally doesn't matter at all.

I haven't written much about the actual gameplay of BtS. The focus is definitely on the conversations, but the puzzle designs are really nice, and I think I prefer them to the ones in Season 1. They're usually set up in such a way that you can feel clever without being too obtuse. I felt really proud of myself when I got the combination to Drew's locker on the very first try: it's a solution that's totally rooted in these characters' personalities and priorities, which is a really nice trick. (And, from watching Let's Plays, it also has a very graceful "failure" path that keeps the story moving along without punishing the player.)

Likewise, the junkyard scavenger hunt was really well designed, since you will have already visited almost every area of the junkyard prior to starting the quest, so the puzzle ends up being more about remembering things ("Oh, yeah! There was that Christmas wreath!") rather than aimlessly searching. Watching Let's Plays has also shown just how many solutions to this there are, which is really impressive. And, again, good design - it doesn't matter if you don't find the area behind the shed, because you can solve the puzzle elsewhere on the map.

So, yeah... there haven't been any trial-and-error puzzles like the bottle quest in Season 1, and also no brain-warpy ones like dealing with the alarm in Wells' office (which is obvious in retrospect but not at all intuitive).

The puzzles in particular and the gameplay in general aren't especially hard or challenging; unlike Season 1, I've never been tempted to look for a walkthrough or spent more than a couple of minutes on something. But I think that's fine. It keeps the focus on the story, keeps the momentum going.

I hadn't really thought about this while playing, but there aren't any "Game Over" states in Before The Storm. That could occasionally happen in LiS: if someone got shot, or Frank's beans spilled, or you got spotted by a security guard. It wasn't particularly significant then, just something you would rewind from, but was still a possible state to get into. In contrast, BtS never really has failure, just different branches out of an event.

A few final random notes:

Samuel wins the Dana Ward Bad Voice Award for Episode 2. He's super well-written here, and delivers some of the best lines in the series, but is one of the most glaring substitutions. It's a bit harder to buy varied voices for the adult characters than the teenagers, since you wouldn't expect their voices to change as much over three years.

In contrast, Dana actually sounded decent this time around... I'm not sure if that's because I've gotten used to her new voice or if the actual performance has changed.

Finally, my current five favorite line-readings so far:

Rachel's "No!" after Chloe suggests that they buy wine from a liquor store.
Rachel's "Nnnooooo..." at the park.
Chloe's "Don't tell me what to do" while exploring the junkyard on the second day.Chloe's "I miss him." during the third dream.
Chloe's "I'd say: 'You're super-f***ed!'" before the play.

Edit: Heh... after coming up with my Top Five, I managed to catch one of Strange Rebel Gaming's streams while live for once. Like I mentioned in my last post, she's one of the most perceptive players I've seen, and that continues to be true for Episode 2: I've seen the full episode multiple times now across several playthroughs, and she still catches stuff that I'd never noticed. I'm thinking of it now in particular because, when she heard that "Don't tell me what to do!" line, she immediately noticed what was odd about it: unlike every other line in the junkyard, it doesn't have the slight echo effect that's used to denote Chloe's interior thoughts. I now think that that may have subconsciously prompted me to consider that an especially significant line. One other awesome thing she noticed that I had completely missed was how Chloe never used the word "fascist" in the first episode; then, early in the second episode, she hears Skip say it, and then she uses it frequently through the rest of the episode. As Bri points out, that's such a teenager-y thing to do: discover a word and then whole-heartedly embrace it. What I had noticed was that Chloe misspells this word in her journal: she signs one of her notes as "Chloe, Queen of Facists" instead of "Queen of Fascists". I'd initially assumed that this was a production error; after hearing Bri's observation, though, I now suspect that it's deliberate. This really is a new word for Chloe, so of course she doesn't know the correct spelling yet. Eventually she'll use it in a text message, and will see auto-correct fix it, and from then on will use the right spelling.


That's it! Feeling increasingly bummed that we'll only get one more episode of this awesome series, but given all the thoughts and emotions it has already evoked, I'm confident that it will stick with me for years to come.

Sunday, November 05, 2017


Part nineteen in a weekly(πŸ’–) devlog.

Standard development disclaimers apply. This is pre-pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a strong chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

I have a standard spoiler disclaimer at the top of each of these posts, but I should re-iterate it for this one in particular. This post is about the design of the romances in CFiC. There isn’t technically any plot information here, but it does talk about the arcs and general content of the relationships, so if you’re going to skip any of these devlog posts, this would be the one to skip. (Assuming you might actually pursue one of the romances, that is. It’s totally safe to read if you aren’t planning on accessing this completely-optional content.)

I've been continuing work on the hub, and this week wrapped up the remaining work on the romance tracks: there's a little bit of romance content on missions (occasional flirting and a few small reactive lines), but the bulk of romance material happens during the quieter down time between runs back at your home base. There is a whole lot of talking and a little bit of action involved.

I wrote at length in my Caldecott post-mortem about developing those romances. It’s now been almost exactly two years since Caldecott was released, and the single greatest surprise to me has been the response to the romances: in particular, the fact that the feedback has been universally positive. I was NOT expecting that at all - I was anticipating a great deal of complaining and negativity. I was prepared to cut all romance content out of the mod, and before release I told myself that, if I got more positive comments than negative, I’d consider it a success.

Of course, this isn’t at all to say that everyone likes it - odds are good that quite a few people dislike them and just kept their thoughts to themselves. But overall, I feel like my design goals have been pretty successful. The gating and on-ramping help eliminate people who aren’t interested in the romance content in the first place, so the people who actually get to that part of the story have, in a sense, self-selected for it. And the feedback has been pretty positive about the various dimensions of those plots: the characters themselves, the actual romance, and the integration with the main story of the game, all of which were important to me.

So, given that (a) I’d really enjoyed writing the romances, and (b) people seemed to be liking them, I immediately knew that I wanted to create some new ones for CFiC. But I wanted to avoid just rehashing the Caldecott system - even though it had worked well, I didn’t think it would be nearly as effective the second time around, and knew that I should do something new to interest players. I also looked at it as an opportunity to stretch myself and try some things that I hadn’t felt comfortable doing the first time around.

One big aspect of this that I’ve thought about a lot is the physical interaction between the player character and the love interest. As I wrote in my previous post, I was a little surprised to discover that accommodating different metatypes was more difficult than accommodating different genders: just working out how two bodies meet in physical space in a reactive environment presents interesting challenges. In that game, my eventual solution was the awesome power of vagueness. I tried to craft scenarios where those differences would become less relevant, add a few specific concrete details to maintain the sense of touch, and write in such a way to make it clear that sexy things were happening without being too graphic about who put what where.

This more or less worked - I was able to write the romance scenes without needing to create ten different versions, and players haven’t seemed to mind the result. But, it’s one aspect that I particularly wanted to revisit. Those romance scenes are some of the purplest prose that I’ve ever written, and my prose is fairly purple to begin with! It also just didn’t seem like a good writing technique in general. When writing, particularly fiction, it’s usually best to draw attention to detail, to make things vivid. Vagueness is kind of the opposite of that. So, I had a new goal: try to create romance scenes that were a bit more explicit - not turning out hardcore smut, of course, but recognizing that, say, this is your petite elven lad or your hulking ork matron in bed, and not just an abstraction.

So, some aspects of this are pretty easy. I’m already using reactive branching dialogue throughout the game: people will respond to you differently if you’re a human or troll or whatever, and that exact same system can be used for more intimate scenes like this. Instead of eliding the differences, I can highlight them, which hopefully will make the experience feel more personalized and real.

However, once I started going down that route, I ran into another complication, this time about sexual roles. If I was going to pull back the curtain a bit on what’s going on, then it’ll also become clearer how things are progressing, and that has some pretty huge implications for roleplaying and players’ self-perceptions.

If this was a game with a predefined protagonist, like Planescape: Torment or Final Fantasy VII, then I’d feel comfortable deciding the character’s preferences and just presenting them: “This is X, and he/she likes Y.” But, that doesn’t feel right for a game like this where players have such a high level of customization of their characters. They can already select their metatype, their skin tone, their hairstyle, their face, their class, and have been developing a personality throughout the dozens or hundreds of small choices they’ve made throughout the game. Given all that, it would feel very jarring if I were to suddenly pop in and say “Oh, and by the way, your character is a top! Have fun!” Why would this one personal thing be predetermined when so many other things have been variable?

People play RPGs for different reasons and have  different goals in creating a character. I think it’s very common, particularly among younger players, to try and create someone who mirrors themselves: they’ll try and build a character that comes as close as possible to what they look like in real life, and will use the game as an exercise to see what they would do if they were dropped into this strange situation. Others use it as a fantasy exercise of playing against type, building a character who is a DIFFERENT to them as possible (e.g., an alter-ego who lies and cheats and steals and does all the things you’d never do in real life). Sometimes people like to model their character on another inspiration, like making a “Han Solo type” or “Glory-esque runner”. And finally, some people create truly bespoke characters, following the emergent storyline in the game and their own muse to make a fully original character.

All that to say, I think that presentation of sexuality is especially important for people who are designing a character in their own image. Obviously it will never be an exact match, but it might feel like a sort of betrayal if they’ve already identified themselves with their characters and then find that their character cannot be like them.

So, uh, what do? The superficial answer is “let the player choose”. There isn’t any in-game UI for this, but I’m already doing something kind of similar in selecting romanceable genders via an in-game dialogue, and you can imagine something similar that would delve deeper into preferences.

The more I thought about this, though, the less I liked it. It would feel really clunky and immersion-breaking. Furthermore, it’s a fundamentally open-ended situation, which is really hard to do in a CRPG. I, personally, have an extremely limited range of experiences; I’m aware of quite a few more possibilities, and I’m sure that there are far more that I haven’t even heard of. And, once you start going down the road of enumerating options, it increasingly feels like you’re excluding the ones that aren’t enumerated. If you present, say, a list of seven sexual preferences, and someone is into something that ISN’T on that list, then it feels like you’re purposefully denying them.

Given all that, how to fix? I ended up not following one single solution, but I think that holding the problem in my head while writing these scenes helped me muddle through to some hopefully-decent designs.

First of all, in cases where your partner has very clear preferences, they can make them clear up front, and it’s up to you whether to go along with it or not. This has the benefit of being accurate to real life, where people have agency and aren’t just reflecting your own desires. It also raises themes of negotiation and tradeoffs, which, again, I think are believable: something might not be your favorite, but you might try it anyways if you like the other person enough. Some players won’t go along, which is disappointing but okay: it’s a strong roleplaying choice on behalf of their character, which I think has value as well.

In other cases, it makes sense to make the scene a bit more interactive, with the player character expressing their preference and guiding the action. Again, the goal here isn’t a full enumeration; but this also isn’t a super-explicit scene, and giving the player freedom to set an initial direction will hopefully open up mental space for them fill in the details.

Finally, in some cases I might need to fall back on my old vagueness approach to accommodate a range of possibilities; but this time around, I tried to be extra-careful to provide some meaningful physical details that could apply regardless, which I think helps ground the romance and make it less abstract than in Caldecott.

A closely related topic is that of consent. My thinking on this has evolved since Caldecott. I wrote before about how I wanted to make sure that the player was “on board” with the romance, so the lovetalks are designed around the player saying “Yes” to a series of increasingly intense questions: “Do you like me?” “Do you LIKE-like me?” “Do you like me more than anyone else?”. Once you crossed a threshold, I could assume that you were on-board: you’re locked into the romance and any sexytimes that implies.

I haven’t heard any complaints about this, but since publishing Caldecott, I’ve grown increasingly bummed by my conflation of romantic and erotic love. It’s sending an implicit message that a relationship only “counts” after penetrative sex, which seems like a pretty crappy demand to make. And the more that I’ve thought about it, the less necessary it has seemed. I think I set it up this way because that’s how most video game romances I’ve played have been designed, but, as I reflected on it more, what I really care about from a story perspective is determining whether there is a strong emotional bond between the protagonist and the love interest. Sex can be an important element in establishing that, but it isn’t intrinsically necessary. I mean… it would be different if the plot revolved around you becoming pregnant, or your partner catching an STD or something. But it doesn’t, so it shouldn’t.

Back in Caldecott, I worried about whether the player was really on-board before jumping into the sex scene. I viewed consent as sort of a perimeter barrier around the capstone romance content, a boundary to be breached or a problem to be solved. Now, though, I’m treating it as something integrated into the romance itself. As the relationship intensifies, opportunities will open up, but you retain the ability to guide or selectively turn down those opportunities without necessarily killing the romance. I’m really happy with how this has turned out! I suspect that most players will proceed with the main-line “sleeping together” content, and now that route will feel even more meaningful since they’re actively participating in it; and for those players who aren’t comfortable with a particular interaction, that’s fine: provided there’s a rapport with the other participant, they can discover other ways to express their affection without demanding a specific act.

Oh! One other tangentially-related topic. I wrote above that there haven't been any complaints about the Caldecott romances, but there is one sort-of exception: particularly early on, a few folks were bummed that they didn't "finish" the romance - from their perspective, it just sort of petered out. From my perspective, they failed to cross the threshold for it to be recognized as a "real" romance; due to my aforementioned view on consent, it only "counted" as a "locked-in" romance if they had finished the sex scene by a certain point in the game.

Depending on a character's particular playthrough, though, reaching that point might be challenging. Your potential love interest might be recruited very on, or not until nearly halfway through the game. In the latter case, you would only have a handful of chances to catch up on their romance conversations. I wanted to maintain some sense of realism, so I restricted the number of lovetalks you could have in a single visit; in practice, that meant you would need to enthusiastically flirt as often as possible, and speak to them as many times as you could in each visit, in order to reach the necessary threshold. Players who recruited their partners early could be a bit more leisurely in their pursuit.

I ended up mitigating this in Caldecott by tweaking the companions' conversation trees so that, at the end of every lovetalk, it would return you to their conversation root where you could see other available lovetalks, rather than gracefully ending the conversation. This change was less dramatically satisfying, but seems to have made a big difference in successful outcomes, since the incidence of comments about incomplete romances has dropped way down. But it was another mechanical aspect that I wanted to improve for CFiC.

The change in consent is one big aspect. Even if you don't get through every lovetalk in the game, it will still "count" as a romance so long as you've made your intentions clear and established a mutual relationship. The underlying structure of the game helps, too. There are a few more missions in CFiC and a much more consistent hub experience, unlike Caldecott which included segments in Kora's apartment and after the party that couldn't support romance. Finally, I'm frontloading romanceable characters in CFiC so they're available to the party earlier on, which makes planning and design easier for me and lets players get started on that content earlier regardless of the order in which they choose to run missions.

Phew! I did NOT plan on writing this much when I started the post, guess I’ve been thinking about it too much! This is actually pretty funny, there are way more words here describing my motivations in designing these scenes than there are in the game itself. Anyways… this has been a cool challenge to tackle. I’m sure that I’ve messed up on some stuff, just like I messed up some things in Caldecott, but I like to think that I’m moving in the direction of making better romances for more people to enjoy.

Sunday, October 29, 2017

Side Quests

Part eighteen in a weekly(🚨) devlog.

Standard development disclaimers apply. This is pre-pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a strong chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised. 

I've plunged into hub development. This is a massive undertaking. The immediate goal is to transcribe about 150 pages of Google Docs into dozens of elaborate branching conversations. Just the copy-pasting alone is time-consuming, and on top of that I'm carefully setting up pre-requisites, actions, animations, and other stuff. And there are all the hub missions things as well, little mini-quests that you can advance within the hub. These are somewhat similar to the quests you accomplish on missions, but more complex, since the player will return to the hub over and over again throughout the game, and I need to maintain their current status for long-running goals.

This post will focus on these sorts of side-quests. This one will be more about the high-level design and philosophical goals; a later post may or may not get into the actual implementation.

What Is A Quest?

So, to start, let's define things. In my games, a side-quest is an optional mission that spans multiple scenes of the game. In the most common form, an ally in the hub will make a request of you; you will fulfill that request in the course of your required mission work; and you will later return to the ally for a reward.

I love sidequests. They are some of the "cheapest" content I can create, in terms of marginal development time. I don't need to create new maps for them, and can usually make use of existing NPCs as well. Also, since they're not required, I feel I have more latitude in how I design them. They may be unusual tonally - often they're more whimsical than the main plot. And I can make them unusually tricky or difficult, since players won't incur a penalty by failing to complete them.

I've been making these ever since Eclipse, when I had an ongoing quest line involving your player recording a music demo track for Kali. They have expanded over time, and players seem to enjoy them; one particular sidequest in Caldecott, which includes a scene where you need to recruit a QA tester for a video game you're creating, has been shared more than any other event in The Caldecott Caper.

That said, while players generally enjoy them, I have identified some issues with them that I wanted to fix in CFiC, as part of my "1/3 improved" initiative.


One recurring source of frustration has been the possibility of starting a quest that you do not finish. For example: in Corona, you could get a quest from The People's University that required taking a Sleaze program from the Native Californians (a human-supremacist organization). You could do this by taking a decker along during the Redding/Native Californian mission. However, a decker is not required on this mission. If you didn't bring one, then you'd have missed your one chance at acquiring the Sleaze, and could never finish the PU quest.

In the short term, I mitigated this by just hiding the quest if the player missed this step, so it wouldn't remain in their quest log forever. It's still annoying, though, and I'd get periodic questions from players wondering if the quest was broken.

In CFiC, I'm addressing this in a couple of ways. Some of the sidequests still can be fulfilled on-mission. However, these now have backups back at the hub. Details vary, but in general, if you fail to accomplish a goal while in a mission, you can still pay e.g. ¥500 back at the hub to advance the quest. (In Corona, this could have been explained as hiring another decker as a shadowrunner to finish the job for you.) This is still a choice for the player, and it's totally valid for them to save the nuyen and skip out on the quest; but, importantly, it's a choice for them, and not something they've just missed and failed.

In some other cases, I'm making quests more modular. Typically, a quest would require doing something like four separate tasks, and then getting a reward (karma and/or a large nuyen payout) once they are all complete. In CFiC, though, at least one quest will be an ongoing optional mission of yours with a modest reward for each milestone. You might miss one or more of the opportunities, but this won't end the entire quest, just a proportional fraction of the total reward.

Finally, at least one of the quests takes place entirely within the hub, which eliminates on-mission work altogether. Stages of the quest are gated by your progress through the game, so you can't finish everything at once; players will typically chip away at it a little every mission or two until it's complete.

Everything Is Connected

I've been taking a little more advantage of narrative cohesion in CFiC. That diminishes the whimsical dimension of the sidequests, which I do sort of miss, but I think it adds to the impact of the side-quests. The actions you take in the side-quests reinforce themes of the main story, and the themes of the main story lend additional weight and significance to your actions in the side-quests.

That was indirectly related to the brainstorm I mentioned in my post two weeks ago: I realized that some of the sidequests could be integrated into the climax of the game, which both elevated the climax (since it becomes an even-more-explicit culmination of your actions up to this point) and the sidequests (retroactively lending them more importance).

Interlocking systems: They're great!

Monday, October 23, 2017

Communal Life

I realized that I've mentioned in passing a couple of times about how much I appreciate the Life Is Strange community, but haven't gone into any particular detail on it. So, just a little post about the corners of the internet that are most meaningful to me.

My main hub is probably the /r/lifeisstrange subreddit. I haven't really talked much about Reddit on this blog... as a whole, it is a mass of swirling hate and villainy that has caused incalculable harm to many peoples' lives, and the internet would be a far better place tomorrow if it disappeared today. But, paradoxically, it's also home to some of the best game communities I've ever found, largely avoiding the toxicity that poisons lots of other forums. The Life Is Strange subreddit in particular is fantastically moderated, with wonderful spirit and discussion and support and fan creations. As a commentator recently observed, "When people finish Life Is Strange, they come here to say 'I need to talk about my feelings!', rather than every other game where people come to say 'I need to talk about my opinions!'". It's sort of a combination group therapy and geeky celebration of this thing we all love.

Shout-out as well to /r/Pricefield, which focuses more on fuzzy feelings.

I'm not on tumblr or instagram, but those are fantastic repositories of original content; I usually find my way to particular content there via Reddit or Twitter. Some of the best tumblr artists for the original LiS have moved on to other fandoms and aren't making new content for Before The Storm, but their original images are still there and wonderful. And I'm sure that, over time, fans fresh to BtS will come and produce as well. Instagram is a great venue for short content directly from the various creatives involved in the project, especially the voice actors.

I have a kind of haphazard twitter list. I generally prefer to follow people who don't tweet very often, so this is kind of a function of quality and reticence.
@LifeIsStrange: Official account, I believe it's run by Square Enix. Great for details about releases, but also periodically highlights fan content, as well as general good social-media stuff like occasional polls, discussion threads, etc. Mostly focused on BtS at the moment, but keeps the flame of LiS alive as well.
@HannahTelle: Max's voice actress from the original series, she's still very plugged into the LiS community and also involved in some great solo music projects.
@rdornotfloral: Rhianna DeVires, the voice actress of young Chloe in Before The Storm. She occasionally shares some fun behind-the-scenes looks at mocap, voice acting, and other production thingies.
@Kylie_Anne14: Kylie Brown, the voice actress for Rachel Amber. She's really into the fandom! Great engagement, I love how she proactively ships amberprice.
@DeckNine_Cara: Cara Bernard, an artist at Deck Nine Games. Really great art, both her own and highlighting good LiS fanart.
@DONTNOD_ENT:  The developers of the original LiS, who have been sweet and supportive of BtS. No real chatter from them yet on Season 2, but I'm sure it's coming! In the meantime, they continue to periodically highlight fan works related to the first season.

All of the above are good at avoiding spoilers, but keep in mind that Twitter will sometimes insert liked tweets into the feed (STOP DOING THAT TWITTER), so I unfollow and refollow around the time of each release until I have a chance to play.

A lot of the above have Facebook presences as well, but they seem to be a subset of the Twitter content so it doesn't make much sense to follow in both places. One exception is Priceless Cosplay, who are probably my favorite LiS cosplayers. Priceless just covers their specific LiS cosplays, although both are individually active in other projects as well; Facebook seems to get the most attention from them, with some content later appearing on YouTube as an afterthought.

I've never been a Let's Play person - my attitude has generally been, "Why would I want to watch someone play a game when I could just play it myself?" I saw the appeal for competitive multiplayer games, where you could maybe see talented players' techniques and strategies, but not so much single-player games. Well, Life Is Strange has semi-converted me. For this series in particular, it's so much fun to watch players' reactions to the major events in the game, so the player is at least at much a part of the show.

Furthermore, it's cool to see all the different ways the game can change when players make different choices from myself. I'm finding that to be even more true for Before The Storm - the game feels a lot more reactive, in a lot of small ways, and also more complex overall. The first season tended to have fairly straightforward "A causes B" interactions, which you couldn't really anticipate but are obvious in retrospect. BtS seems to be using something closer to a point system, where the cumulative actions you take can lead to a different outcome, with no one decision being necessary but each of them being important.

All that being said, here are the streams I've most enjoyed for Before The Storm, listed in the order in which I watched them.

Eurogamer: This is true of all of the following, but these people are fans of the franchise and very invested in these characters' lives and happiness. They're a bit quicker at playing than the others and don't stop to read all the journal entries or explore every nook and cranny, but it also isn't a speedrun, and they do poke around a bit. I really like their running commentary; they generally avoid talking over the game, their observations tend to be funny and/or poignant, and they have great responses to the big moments of the game.

Strange Rebel Gaming: She's probably the quietest player on this list, with the least commentary, but she's still super-invested in the game. Once she gets to a good point, she'll usually stop and share her thinking about what's going on and her reasoning behind the choices she's making, and she's very thoughtful about what she's doing. She was especially interested in Rachel's theater work in Episode 1, and related that to her own experiences as an actress (in high school and beyond), so I am really looking forward to her take on Episode 2!

Pandorya. This one is kind of unusual: she's a German-language commentator, and I don't speak German! But I love these videos, they're some of my favorites. The game audio is still in English (with German subtitles), and there are enough cognates and proper nouns that I can vaguely track her commentary. It's really cool to see how various things are translated; a lot of swears turn into Scheiße, but there are also some aspects that seem to be adapting American idioms into other forms. One of my favorite bits was seeing the translation of Chloe's sabotaging of Victoria's homework: the original joke doesn't work in German, and I don't completely follow the one that replaces it, but judging from her delighted laughter it really works. Pandorya is the most careful and methodical player I've seen yet. She gets how these games work, and diligently explores every square inch (or, in her case, centimeter) of the map before advancing to the next scene. And, again this is true of everyone, but she clearly loves these characters and has genuine reactions to what happens to them. When she says "Oh, Chloe!" she means it.

There are a few other Let's Plays that I've seen and enjoyed. Geek Remix has a ton of discussion and commentary, both in the main playthrough and supplemental theory videos; unfortunately, they had to cut out the music for those, which really diminishes the impact of some scenes like the junkyard.

I didn't watch many Let's Plays for the original series, but I absolutely loved BirdyBoots'.  She had a fantastic presence and was completely engrossed in the story. As a nice bonus, she ended up picking almost all the opposite decisions from me, and it was great to see what a tragic playthrough looks like without directly incurring the guilt myself.

A few relevant YouTube channels I subscribe to:
Hannah Telle. She rarely uploads, but the stuff she shares is wonderful, mainly solo musical performances.
HAWP. Not directly related to Life Is Strange, but features Ashly Burch, the original voice of Chloe Price, and are some of the funniest videos I've ever seen.
Katy Bentz. The voice actress for Steph Gingrich. Like Kylie Brown, she is also really plugged into the fan community and has some great short videos, both about LiS and her own experiences in LA.

I'm not on Twitch much, but I need to shout out dayebraham_lincoln for having the best channel name ever. This is Dayeanne Hutton, who voiced Kate Marsh in the original series. She streams a variety of games, and has also done great cosplays of her own.

Hm, I think those are the highlights! Lots of good people and lots of love in this community. I think a big part of that is a result of the game itself, which is so focused on empathy, so it tends to attract fans who think about who's on the other side of the keyboard and the impact (positive and negative) words can have. Things are especially busy right now while we're in the middle of BtS, but given what I've seen in the year leading up to it, good vibes will continue for quite a while.

Sunday, October 22, 2017

Arf! Arf!

Part seventeen in a weekly (πŸ’¬) devlog.

Standard development disclaimers apply. This is pre-pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a very strong chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.  

Milestone passed! I wrapped up work on the climax, hurrah, which means I've finished a rough first pass at all the scenes in the game, double-hurrah.

What that means and does not mean:
  • All planned combat encounters have been implemented. Tuning still remains.
  • All unique puzzles and dialogues within missions have been implemented.
  • The finale (post-climax wrap-up) still remains.
  • The hub (your home base) remains and will be huge.
  • Non-unique puzzles and dialogues still remain.
I'm now starting on that last bullet, the stuff that can occur across multiple maps. I've learned from prior experience that it's best to do all of these at once instead of doing it for each scene as I come to it: otherwise, I end up forgetting to do them for some scenes, losing track of which ones are done and which aren't, catching bugs late in development and then needing to update a bunch of other stuff, and other annoyances. Instead, it's best to do it once in a test scene, make sure it's working, and then set up for every scene in the game, specifically testing the integration.

The specific features that I'm working on now are barks and banters. Let's look at them in a bit more detail.

Bark Bark

A "bark is a short phrase that a character utters during the course of gameplay, usually in response to some action or event. Examples include "Nice hit!" and "Ouch!" They're a staple of party-based RPGs, and I've been doing them since the very first Antumbra episode.

For the most part, making a campaign is very time-consuming, but not especially hard. I decide what thing to do, and then I carefully do the thing, then I test the thing, then I move on to the next thing, and repeat until the game is done. Barks are one of the only features of my campaign that actually involve some cleverness on my part.

The goal here is to randomly fire off a phrase, unique to the character, when they defeat an enemy NPC. I start by defining all of the available phrases. Shadowrun doesn't have support for arrays, but I'll accomplish something similar by appending integers to well-defined strings, forming a DIY lookup table.

Next, I set up the trigger.

Let's break this down, piece by piece.
  • This is set to "Retain", so the same character can bark multiple times on a map. If I wanted to limit to a maximum of one bark, I could un-check this. That's what I do for some other types of barks, like downed ones, because it's annoying to hear characters constantly complain.
  • Per the "When" clause, the "Triggering Actor" is the one doing the killing, and the "Triggering Target Actor" is the one being killed.
  • Check the tag for the killing actor. Tags are very common and important for a lot of my crew-related triggers like this one. Here, I'm checking to see if Valiri is the one doing the killing. Because I'm checking the tag, I'll find a match even if she's added through the hiring interface.
  • I don't want to bark every time, so I flip a virtual N-sided die, and only bark if it comes up with a 1.
  • Note that I'm using a "Const" variable here for the number of sides on the die. During testing, I can set this to 1 and it will fire every time Valiri kills someone. When the game is released, I'll change it to something like 4, so she'll bark 25% of the time. This is very important, since I can just update it in one place and not need to modify a ton of existing triggers.
  • Next, I roll another 10-sided die to pick the number of the bark. Note that this matches the number of barks I defined in global variables above.
  • I use text expansion to substitute the bark text. Note that I'm actually using a nested substitution here: if I roll a 3, then this will become $(story.Bark-LongText_Valiri_3), which in turn will become "You're no match for me!".
  • This shows in a speech bubble over the killer. While testing, I noticed that the text would sometimes overflow the speech bubble. My theory is that this is because the game assigns a width to the speech bubble based on the length of the un-expanded string defined in the trigger, and not the substituted string that is eventually inserted. I worked around this by changing the variable name from Bark-Valiri_N to Bark-LongText_Valiri_N, which makes it long enough to show.

I follow a similar process for other types of barks, such as crew reactions when they are downed and dying.

Once I got it working, I adapted it for the other crew members, tested them, and then copy-pasted them to all combat scenes in the game. There's no such thing as a "global trigger" in Shadowrun, but if you set up your triggers so they don't rely on scene-specific elements, then it's trivial to copy them throughout the game and be confident that they will work (though testing is still always a good idea).


Banters are in-scene conversations between crew members. These are also fairly common in party-based RPGs, particularly the BioWare ones that I love so much. I've been doing versions of these as well ever since the Antumbra days, although mine got more sophisticated in Caldecott.

First, create the dialogue.

This particular conversation exclusively occurs between two crewmates, without any intervention from you. Other banters might include dialogue responses from the player character, or a third crew member might jump in. They're designed to be fairly generic, so they make sense regardless of which particular scene it ends up firing on.

Note that each line is spoken by a TAG'd character, set to the crew member's tag. Again, this is important since crew members will usually (not always) be loaded by player spawners through the hiring interface, so we can't directly assign an actor to the line.

Unlike barks, which can repeat multiple times, a player should see each banter no more than once over the course of a game. To ensure this, we create global variables that will track which banters the player has previously seen.

These start as "false", we'll flip each to "true" once they've been seen.

Trigger time! I follow the "tripwire" design of banters, similar to what's used in Dragon Age: Origins. When your player crosses an invisible line in the map, we check for available banters and display one of them if available. That process starts like this:

  • Most banters would be inappropriate in the middle of a firefight, so I only trigger them if you're in peaceful freemove mode.
  • The player character needs to trigger it. Otherwise it might fire when an NPC (like a patrolling soldier or wandering civilian) crosses the threshold. Not necessarily a problem, but it's simpler to test and verify this way.
  • Depending on the map, I might wait until you have collected a certain item or started/finished a certain quest. That helps this feel more dynamic, and less like "Oh, I passed an invisible tripwire."
  • Similarly, for this specific banter, the "Wait until triggered again" means that this won't fire until the second time a player crosses this line - again, that helps it feel more natural/random/dynamic.
  • Finally, I run a banter trigger. This works somewhat similarly to the bark trigger above. Here, I'm dynamically building the name of the trigger to run, which will vary from BanterA1 to BanterA7.
Speaking of which, let's look at one of those triggers.

  • Note that there is no "When" clause. This will only be invoked from the tripwire banter trigger above.
  • Check to make sure I haven't already shown this banter during the game.
  • Check if both of the participants in this banter are present. In Caldecott, I did this by checking if the actor was in the region, but that was a bit tedious since I would need to update the region for every scene. Now, I just check to see whether the actor is alive, which lets me copy-paste this with no edits.
  • If this banter is valid to be shown, I flip the boolean so it isn't shown again, and then start the dialogue.
  • In this particular case, since there aren't any PC0 lines, I directly start the dialogue between the two crew members, which allows me to have them face each other. In other cases, I would instead start the dialogue with the first speaker in the banter.
  • If this banter is NOT valid, then we run the next banter trigger. This will repeat the same steps for the next banter, run the following trigger if it is not valid, and so on and so forth.
  • Eventually, either a valid banter is found (in which case the chain stops); or we exhaust all of the banter triggers. Because "Retain this Trigger after firing" is not checked, eventually we'll run Banter A7, which says "Run BanterA1"; but Banter A1 will be inactive and unretained, and so that will break the loop.
I've mentioned before that one of my design changes from Caldecott to CFiC has been to do most of my missions in single scenes. One side-effect of this is that I now want to be able to fire multiple banters (specifically two) in a single scene. The best way I've found to do that is to just create separate "A" and "B" lines of banters, each with their own separate tripwire. Both rely on the same dialogues and global variables, but use separate triggers, so they can fire independently without interfering with one another.

As with barks, I set this all up in a test map, ran a ton of tests (selectively loading other crew members and toggling the "Bantered" booleans on and off) until I was satisfied, then copied to all other scenes. There are a lot of triggers involved, but they're fairly simple, and I don't expect that I'll need to update them. (Though I will not in passing that, unlike in Caldecott, I do have separate "sets" of banters this time around separated by acts, which lets me write banters that assume certain events have or have not occurred. Which is to say, there are more than 7 possible banters, it's just that this particular scene only has 7 banters available.)

And that's that! This is all coming together very nicely and smoothly, mostly because my process is very close to what I did on Caldecott and I've already invested the necessary time into conceptualizing and debugging this kind of design.