Current state of the game
The current prototype build of the game contains four scenes and two characters to talk to using the stickerchat dialogue system.
Dialogue System
Each character has a set of emotional variables, a relationship variable representing their “closeness” or friendliness with the player, a list tracking the conversation history, and a big chunk of dialogue options organized in a switch statement, based on a correlated list of sticker combinations (not order sensitive) that the character will understand. The emotions and friendship level are actually held in a singleton, and are slotted into the relevant dialogue script based on a value in that script defining which character those dialogues belong to.
When the player sends a combination of stickers, the parser compares the list of stickers sent by the player (PList) with a list of lists of stickers within the active dialogue script (NPCList). If the parser finds a match between PList and one of the lists within NPCList (again, not caring for the order that stickers were sent in), it sends the index of that match in NPCList to the dialogue script. That dialogue script has a switch statement in it, with cases for every possible index that it could receive. Within one of those cases, any number of nested if statements could appear, in which the emotions, relationship, and conversation history are accounted for to form a response, after which that case would also adjust the emotion and friendship variables as needed. After going through that nest of ifs, a variable holding the response is given the proper string to return (changed originally from just returning the string directly, for some more freedom in concatenating strings, as well as to allow on the fly adjustments to how conversation history is tracked).
In addition to being used as the switch in this big old statement, the index from NPCList is also stored in a variable, to be added to the conversation history array later on. If needed, it can be modified to store something in the conversation history other than the true index from NPCList. For example, if a sequence of stickers may be repeated often, but the response changes based on the conversation history, and can itself be responded to, it would make sense to store a false index, like a “?” sticker. A player may respond “?” to a character, who can then clarify, and then the player may want to response “scary!”, which would then elicit another, contextual response from the NPC. This system is planned to have a proximity limit, where you can only initiate conversation with someone who you are physically close to. There is also an opening line of dialogue from the NPC when the sticker chat is opened. Also this system looks for an exact match, but does not care if there are extra stickers. So if a player sends “peach” “house” “police” but there is only a response to “peach” “house”, the parser will choose the response to “peach” “house”. Not always great. If a set of stickers doesn’t match anything at all, the NPC returns a simple “huh?”.
Currently, there is no broad scale implementation of a relationship system, where a play tester can see how a relationship evolves over time.
Narrative
Narratively, our strokes are broad at the moment. We know how the story begins, and we know the context in which it will end. We know the emotional path through the story, and the feeling we want to leave players with. We are naming our characters after fruit, for now. A week or so before the story starts, a week or so after school starts, Strawberry, a kid from class 4A (your class), falls from the lighthouse while playing there with Blueberry and dies. At the start of our game, someone is found dead outside of Blueberry’s house, appearing to have fallen from somewhere in the house.
Currently, the story is divided into 5 and a half days, with a typhoon landing on the evening of day 5 (the half day we are considering a “day 0”). Each day is split into Morning, where the player walks to school and chats before/during class, afternoon, where lunch and events may happen at school, evening, where the player can run around town, chat with friends, and play a game with a group of friends, and night, where the player walks home, talks to Blueberry outside of their house, and then checks a ghost story forum online at home. Any of these, especially the afternoon, may be skipped, or at least parts may be, if nothing relevant is to happen. We hope to tell the story in a more “cinematic” and less “game loop” type of way.
An important narrative note is that each day, things will happen that the player will not see. What they DO see (and from what perspective they see it) is dependent on who they are friends with. There may be two games going on at once on the evening of the third day, but the player is only invited to one, and will only see the events that unfold during that game. A narrative challenge (and excitement) is ensuring that each of these events is exciting and interesting and contributes to the player’s belief in some way.
In our heads, the game is a bit larger. We have a couple mechanics not present in the current build: Overhearing adult conversations, collecting rocks, and placing rocks on shrines as offerings. By the nature of a prototype, the game is also slightly more focused than intended. One of our “design pillars”? I guess? Is to make this game feel like a vacation sim rather than an investigation game. Hopefully as the game is built out, and there’s more play and a rock collecting mechanic, it will be more infused with this feeling. Though we’ve already gotten good feedback in this regard from our recent playtest!
thoughts and next steps
Stickerchat:
Structure:
The structure of the sticker chat right now is a little unwieldy. It could be simplified a bit if each case of the switch statement were just a list of stickers, and we bypassed the parser middleman, but then sticker order would be absolute, which I think would suck, and wouldn’t make sense in the context of these kids just trying to figure out what their friend is trying to say.
Some programmers looked with dread and shock at my scripts :( but after explanation, especially of the nested ifs within each case, they were kind of like “oh, maybe that is the best way.” I was recommended to look into scriptable objects, which I will do. Adrian also offered to look at the scripts more in-depth together to see if there’s any easier solution.
But it works for now! And it’s not so terribly unwieldy as to be untouchable, just a bit annoying.
Design:
We playtested this system recently, and something I didn’t mention before was that actually there are TWO structures for the dialogue system in the game, one a bit older. The older one is missing the opening line of dialogue, as well as the conversation history. Instead, it used “implied stickers,” where the parser would add in some invisible stickers to the player’s message that they didn’t actually type, as a way of tracking context, rather than requiring the player to use the blueberry sticker every time they talk about blueberry. I think there’s actually still some place for this, as the conversation history thing is quite particular, so I could use an implied sticker to keep track of broad context where it wouldn’t make sense to check for the exact message the player is replying to.
But anyways! The first note from this playtest is that the character with the updated parser was WAY more responsive and effective, though our advisor (hi Winnie) seemed to like talking to the less responsive kid more, since it felt more like a kid. But fear not! An equitable solution is on the horizon.
The second note! Actually consists of many notes, which is that, throughout this hour or so of people coming and going, upon us came many ideas for how this system could be altered, jiggled, jostled, etc, and ideally, through that, improved. The main issues players repeatedly faced were: aimlessness and running into walls, and we found this to result from our system being both overwhelming, and too particular. We’ve tracked our many ideas for improvement elsewhere in a top secret google document, but our first iteration will consist of the following:
Limiting the number of sticker slots: We will limit the player to TEN sticker slots, FIVE of which are “default” and unchangeable stickers, like “scary!’ “?” “yes” “no” etc, and FIVE of which are stickers taken from NPCs, like in MSN, and are more, verbs, and adjectives.
Why: This may aid a number of things. Firstly, we hope that less stickers means players will be less overwhelmed with choice. Secondly, by taking stickers directly from NPCs, we can let NPCs guide conversations not through hamfisting clunky dialogue, but through choosing what the player has the means to say. This will hopefully be especially effective at the start of the game.
Destroy repetition: When a player sends a set of stickers and receives a response, we will replace that set of stickers in NPCList with {“null”}, so that a line of dialogue can never be repeated. This of course won’t be universal, because something like “?” that can respond to like 10 different messages can’t get deleted forever.
Why: Players were getting lots of repeated dialogues for simpler sets of stickers. This also might SOUND bad because, then won’t the player get lots of “huh?” responses? Fear not.
Weighted Topics plan B: I haven’t been honest with you. There is an even earlier iteration of our dialogue system that never even got made. This system consisted of stickers with topic values, and a weight from 0-1. The parser would normalize these topic values, then pick a main topic and sub topic, and even a sub-sub topic based on these values. This was a little too UNparticular, and also a lot of engineering. But we actually never changed the architecture of the stickers, and are just using their “Topic1” variable as their name in the sticker parser. Isn’t that funny? And while we decided that this wouldn’t work too well for actual conversation, this WOULD work great (we think) as a fallback when the sticker parser simply can’t find a response to send the player. Rather than returning “huh?” the parser will fall back to a plan B, where it uses these weighted topic values (now more broad than sticker names) to pull from a set of generalized responses. For example, if the player sends a message with the highest weighted topic being “pets”, the NPC now has a set of responses to the topic of “pet.” The NPC randomly chooses from this list of responses, then deletes the chosen response. After all the responses are deleted, only then will they return a default per topic, something like “Huh? What are you trying to say about pets?”
Why: This ALSO does lots of wonderful things (again, hopefully). It will ideally stop players from completely running into walls when a character can’t respond to them, while also keeping some of the charm of a kid going off on a tangent that Winnie liked. It’s also a nice way for us to guide players gently back into conversation that a character can understand!
Narrative:
Our narrative needs a lot of work! Not like, man this sucks let’s start over work, but just like, we need to finish this work. In order for Jib to make assets and do character designs, we need to know what happens every day and to who, lest we do work that must later be undone. Which means that we need to figure out exactly what our story is, more than just the broad strokes we have now. In a recent meeting, we laid out what we already know, placing it into a sort of calendar of our 5.5 days of game. After that, I decided that we should go off and brainstorm on our own time particular events that we want to happen, or that we think could be cool to happen.
After some time, we’ll come back together and look at all of these events and find their places in the calendar, and then modify them and build on them to make sure that they’re able to build belief in the player. It’s quite a nice affordance of the type of story that we are making that we’re able to write it in this way, where the most important aspect of any event in the story is that “this contributes to the player’s beliefs in some way” and we have a number of beliefs being laid out by NPCs that any given event can be twisted to fit into, depending on our needs.
One thing I neglected to bring up at that meeting, but have already talked about the importance of coming back to, is writing out the exact true events of what happens in the story. That we are not able to be as free with, and also provides the main constraints there will be for what “cool events” we can even actually use.
Generally:
We’ve received lots of great feedback already, and had a successful faculty presentation! I’m sure when we get feedback from that, there will be even more to consider and change.
We’ve also gotten some good recommendations for reference material, and I think our priorities right now are EarthBound, for vibe and writing kids, and Outer Wilds, for a similar messenger system that appears late in the game.
In Conclusion:
Yippee!! Things are going swell!
Next Steps:
Write true events of the narrative
Brainstorm key moments of the story
Make character profiles
C: Make dialogue system adjustments
J: Draw stuff, make secondary mechanic (rocks or shrines)
Play Earthbound