Social Lycanthropy Disorder postmortem

I think the biggest lesson I learned from making Social Lycanthropy Disorder is that even very silly-seeming ideas can turn out to be viable. The concept of the game started out as an offhand joke when N. Cormier and I were brainstorming Ectocomp ideas, but the more I thought about it, the more the werewolf thing seemed like a pretty good metaphor for my own experience of Being Awkward at Parties. … Then, as I was writing the game, it became less “being a werewolf is a metaphor for social anxiety” and more “the protagonist is a werewolf with social anxiety and being a werewolf is a metaphor for chronic illness and maybe also experiencing a traumatic event,” so the game really came a long way from the initial thought of “Wouldn’t it be funny if the main character was a werewolf who was at a party on the night of the full moon?”

There are, I think, two main groups of people who get into creating IF: coders who then learn to write and writers who then learn to… well, use Twine, at least. I am definitely the latter, and in making SLD, I began to bump up against the limits of my technical abilities/rudimentary knowledge of Javascript. Of course, Twine is very beginner-friendly and you don’t really have to know any Javascript at all. But I found that once I started doing more complex things with it, I ended up with unwieldy blocks of markup that I had to enter over and over (introducing the possibility of errors every time), and I wish I could have made my own macros for this purpose. I’m grateful for all the people who have made their Twine macros available on github and such (although ultimately none were used in the making of SLD), but sometimes you just need something extremely specific. Mainly, in this case, it was that I wanted being slightly drunk to increase both gains and losses of Discomfort, and I ended up having to manually check for that and type out the multiplier for every single dialogue option. This has definitely motivated me to work on my coding skills, because there has got to be a more elegant way to do that.

Writing is more my strong suit, but it is definitely still challenging to have a short game with a relatively large number of characters who all need to be distinctive without leaning on one obnoxious quirk apiece. This is particularly true when interactions with these characters are basically the entire game–if players found the characters annoying, there wouldn’t be much else there for them, and I worried about that a lot. I drew heavily on my real-life social circles for inspiration, but it’s easy for “composites of several somewhat-similar people I know or have known” to shade into “caricatures of Types.” I put quite a lot of effort into trying to suggest that there was more going on with all of these people than was obvious in the PC’s limited interactions with them (without cramming in a bunch of irrelevant stuff), and of course that’s never going to work for every single player, but several people did mention that they found the characters endearing or real-seeming and I was very happy to hear that.

Huge thanks to N. Cormier, who was heavily involved in developing the game’s concept and was my one and only playtester, but passed up a co-author credit because I did all the actual writing/coding/Twine-ing. Nevertheless, the game probably wouldn’t exist without her contributions, or if it did, it wouldn’t be as good. This was really the first time I’d worked with anyone else beyond having playtesters, and I think it went quite well! I have a tendency to get hung up on some particular thing and go “okay, I can’t do ANYTHING ELSE until I’ve figured out how this part works,” and when I’m working on creative projects by myself this usually just means I don’t finish them. It’s deeply helpful to have someone else to (1) toss ideas back and forth with until we figure the thing out and/or (2) gently tell me to put it down and work on a different part of the game for a while.

My biggest regret regarding this game was that I wasn’t able to finish in time to get it playtested by anyone else. It came out reasonably polished and free of bugs, but when both you and your one tester have been elbow-deep in a game for several weeks, it’s hard to gauge things like game balance and whether the choices are too opaque. The reason I was right up against the deadline is that I was sick for roughly the first half of October and couldn’t make steady progress on the game during that time, so there’s not much I could have done differently, but I very much hope that I’ll be able to get more playtesters for future games.

P.S.: There is a bit of an easter egg for getting all endings and achievements. I think everyone is currently too busy with/worn out by IFComp to spend that much time on SLD, but if anyone enjoyed it enough to go back to it later, hopefully that’s some motivation to explore it a little more!

9 Likes

Thanks for posting this! I’m definitely interested in finding the easter egg now!

1 Like

For something like the disconform stat, I would suggest to use a Fairmath system. If you look up Fairmath system in the Choice of Games blog, you will get useful information. And also, it happens I have an implementation of a fairmath system in my game The skyscraper and the scar, that you can reach at IFDB, download, and import directly to twine, to see the innards.

SDL was a lot of fun. I wish the game was more aggressive with the passage of time and the risk of transform there in the middle of the party, and cause mayhem. But… as I said, it was very funny.

Congrats!

2 Likes

Thanks for the suggestion about Fairmath; I’ll take a look and see whether that would be useful in situations like this.

As for being more aggressive with the passage of time, that’s one of those game balance things that I would have hopefully been able to fine-tune more if I had had more playtesters. I didn’t want the game to be very frustrating or impossible to do well at if you didn’t know the exact right things to do in each situation, so I may have erred on the side of making it too easy.

About transforming at the party, I actually originally had two “transformation” endings: one for leaving the party later than, I think, 9:15, where you would transform on the way home, and one for staying all the way to 9:30, where you would transform in the middle of the party (and be left wearing your costume cat ears, to add insult to injury). Then I decided that there were too many endings, so I cut the party-transformation one since the transforming-on-the-way-home one would work for both. Then I decided that it didn’t really make sense to have two different “deadlines” in the first place, so I made it so you only got that ending if you stayed until/past 9:30. At which point I could have switched it back to transforming at the party, but by then I had kind of forgotten about it.

Thank you for your comments and for running the comp!

3 Likes

Exactly. It is ok to be a “nice game”. Although the topic is about teen wolf angst, it is a fine objective as a design to have a non-stressful game. No matter my own personal preferences.

If you need help untangling my implementation of the fair math system, just let me know.

Edit: also, nice postmortem. I always enjoy reading this kind of thing…

Fairmath is a system (on a 0-100% scale) that tries to push the stat towards neutral (50/50). So if you make a choice that would make the stat more extreme it has less effect, and if you choose to go back toward neutral it has a bigger effect. Which is often a nice thing for personality stats: it means the player really has to work at it to reach an extreme.

But it looks like what SLD is doing here is making bigger stat changes to discomfort in both directions if another stat (intoxication) is higher. And it looks like it only does that sometimes? Though that may be a bug, dunno. So that’s a different thing.

I think in this case it would be pretty easy to make a <<widget>> (which doesn’t require JavaScript to modify the discomfort. Put the following in a passage with a widget tag (if you have multiple widgets you can put them all in the same passage):

<<widget changeDiscomfortBy>><<silently>>
<<set $guestSuspicion += $args[0] * $alcoholLevel>>
<</silently>><</widget>>

Then you should be able to say <<changeDiscomfortBy 3>> or <<changeDiscomfortBy -1>> and it will automatically scale by the alcohol level.

Widgets can do output or set variables, and you can pass them argument values to work with. If you’re only setting variables, you may want to wrap the widget contents in <<silently>> as I did here to make sure that you don’t get any extra blank lines in your output. Things get trickier if you want to tell it which variable to change: there are ways to work around that but I won’t go into it here.

And for simple things they’re a nice way to pull out a common piece of code into a single place so you don’t have to keep typing it in every time.

2 Likes

Oh, that is interesting. A system that is the contrary of a Fair Math system XD Completely unfair system! The more you go towards an extreme, the more you fall into it.

Oh shit that’s my favorite Billy Joel song.

1 Like

Thank you, that does seem very useful and I really appreciate it! I had actually looked at Fairmath while making the game and it didn’t seem like quite what I wanted, but I wasn’t discounting the possibility that I didn’t fully understand what it did.

Thanks for the nice words! I’m just starting to dip my toes in the world of IF and I’m excited to see what we do next! :slightly_smiling_face:

3 Likes