{"id":1477,"date":"2026-09-11T07:27:28","date_gmt":"2026-09-11T07:27:28","guid":{"rendered":"https:\/\/x.sheep-mine.ts.net\/index.php\/individual-storytelling-in-coop-game-html\/"},"modified":"2026-09-11T07:27:28","modified_gmt":"2026-09-11T07:27:28","slug":"individual-storytelling-in-coop-game-html","status":"publish","type":"post","link":"https:\/\/x.sheep-mine.ts.net\/index.php\/individual-storytelling-in-coop-game-html\/","title":{"rendered":"Blightbound&#8217;s approach to individual storytelling in a coop game"},"content":{"rendered":"<p><br \/>\n<\/p>\n<div id=\"post-body-8200815783934931557\" itemprop=\"description articleBody\">\n<p>An interesting design challenge during development of <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.blightbound.com\/\" target=\"_top\">Blightbound<\/a> was how to combine personal storytelling with coop gameplay. In Blightbound three players play together, but they might be at different spots in the stories of their respective characters. How to make room for storytelling without spoiling stories for other players who might not be there yet, and without making players wait for each other? Today I\u2019d like to dissect the approach we\u2019ve used to solve this problem.<\/p>\n<p><i>Before I continue, note that this blogpost will spoil some story moments. However, I\u2019ve made sure to only take examples from early in each character\u2019s story, so the videos in this post will only be a minor spoiler to the game.<\/i><\/p>\n<p>Blightbound is a coop dungeon crawler, but unlike games like Diablo it doesn\u2019t have a linear campaign. Instead, the player repeatedly plays a number of dungeons while learning each character\u2019s story and gathering loot and more characters. In that sense it\u2019s structured more like the end-game of Diablo, or like a looter shooter.<\/p>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><img decoding=\"async\" alt=\"\" border=\"0\" data-original-height=\"341\" data-original-width=\"501\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEg0OVUL9-rrnWs7g7wWJFB13Ama1_N0C_ZHHfO8XiOFZmbA_48_yu2Dcd5wkmj8rf6aMK8fjexpXuNtb9RurgjYhXr34xYP36KlFWtfHXVTkpNPxb4wmcUdoSxjUVPRZEHNBxlntGcwjNy8\/s0\/Coop+storytelling+-+Blightbound.jpg\"\/><br \/>\n<i>Blightbound is a 3 player game, with both online and local coop.<\/i><\/div>\n<p>Another important aspect of Blightbound is that it has a lot of heroes. Instead of maxing out one hero for dozens of hours, the player gets to unlock a bunch and is invited to try them all. We would like players to vary what character they play. For this reason we wanted to tell a lot of small stories, interweaved with gameplay, instead of telling one big story. Each character has their own little story they go through.<\/p>\n<p>Each hero in Blightbound has an individual story that\u2019s told through the dungeon runs with that character. When 3 players play together, they each play a different character so they\u2019re supposed to get different stories. This is where the issues that I\u2019m discussing today arise. Players shouldn\u2019t see the stories that the other players are getting, because they might not have progressed to that point with that character yet (spoilers!), or might have seen that bit already. Also, Blightbound is a fast-paced game so we don\u2019t want players waiting for each other\u2019s cutscenes.<\/p>\n<p>The solution we came up with is that the storytelling is entirely private. When one player gets a bit of story for their character, other players don\u2019t notice this at all. They might even simultaneously be getting different stories for different characters!<\/p>\n<p>Now how do we make that work without letting players wait for an invisible cutscene? The simplest solution is used a lot in Blightbound: dialogue while gameplay continues. The player gets served portraits, speech bubbles and voice acting while the gameplay continues. So there\u2019s no need to stand still and watch a cutscene.<\/p>\n<p><iframe loading=\"lazy\" title=\"Two examples of basic story beats in Blightbound\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/xt9-T1Y5WcQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><br \/><i>Two examples of basic story beats during gameplay.<\/i><\/p>\n<p>This does introduce a problem: getting extensive dialogue during combat is going to be very distracting and the player likely won\u2019t be able to follow the text while focussing on the fight. Luckily, we needed some pacing anyway. A dungeon that\u2019s 15 minutes of constant combat is both too intense and boring. So we should introduce some quieter moments anyway, and we make dialogue happen during such moments as much as possible. This way players can keep exploring but also have the mindspace to digest the storytelling.<\/p>\n<p>If the player keeps moving, who is that dialogue with then? Here we\u2019ve tried to vary it as much as possible. The simplest \u2018dialogues\u2019 are inner monologues of the hero. In other cases there\u2019s a dialogue with an an NPC who\u2019s standing in the level. Here too the other players can\u2019t see this non-player character. To avoid waiting, the player can just keep walking: the dialogue starts when interacting with the NPC, but after that the player can run away and the dialogue will continue.<\/p>\n<p><iframe loading=\"lazy\" title=\"Dialogue in Blightbound\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/HdUgMt4CnFg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><br \/><i>Gameplay continues during dialogues, so teammates don&#8217;t have to wait for you.<\/i><\/p>\n<p>To spice things up, we\u2019ve added a fun trick here. The player is playing with two others who are random other heroes. To make the dialogues more dynamic, these other heroes will actually respond to it. But 21 characters all responding to all the story moments of all 21 other characters is way too many combinations. So instead we\u2019ve defined a bunch of standard responses that each character has unique versions of. These are referred to in the dialogue scripts and then inserted dynamically during gameplay.<\/p>\n<p>We have a total of 11 types of such standard responses and each character has their own line for each type. This way the responses can fit their personality. For example, these three lines show how different characters fill in the symphathy response:<\/p>\n<ul>\n<li>&#8220;<i>I feel your pain.<\/i>&#8220;<\/li>\n<li>&#8220;<i>You have the clan&#8217;s sympathy.<\/i>&#8220;<\/li>\n<li>&#8220;<i>Would a moisturizing salve help?<\/i>&#8221; (lol wut)<\/li>\n<\/ul>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><img decoding=\"async\" alt=\"\" border=\"0\" data-original-height=\"265\" data-original-width=\"433\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgM6jrtCW8pDJzE0LEWGz8wjo5moHCheeyX7LahrEPFz8kcw5keqseEpeK-J5NOAQE21Uqwfs3z9lxC3I51Uc25mRlG9TfyX88YYlCo43NRoRCsQwCv52MOYd-kn2bgwUtvRy2PjgjglyIt\/s0\/Coop+storytelling+-+Reactions.gif\"\/><br \/>\n<i>All eleven types of responses for one of the playable heroes.<\/i><\/div>\n<p>What we have so far is cool, but still rather basic: all storytelling is done through dialogues and monologues and that\u2019s it. From there we\u2019ve looked into how we could spice things up without adding pauses. We should also not introduce too much work: Blightbound has more than 100 such story moments so efficiency is important.<\/p>\n<p>The first element that adds some variation is how story beats are triggered. In some cases it\u2019s simple: enter an area that\u2019s marked and the storytelling starts. Some story events can trigger in any such area, while others need to take place in specific dungeons since they\u2019re linked to that setting.<\/p>\n<p>The more interesting ones require some form of interaction. For example, the mage Korrus looks for vases to investigate, so you need to spot them and interact with them. Other characters see someone standing in the dungeon and need to interact with the character, or see a hallucination. When there\u2019s a hallucination hanging in the level, it\u2019s only visible to the player who\u2019s story beat this is for. To their teammates, it\u2019s just a regular spot in a dungeon. Again we\u2019ve made sure that we only use short and simple interactions, so that your teammates don\u2019t need to wait for you.<\/p>\n<p>One of the more fun types of story events are elite enemies. Some heroes need to fight specific characters to progress their story. To make this work, we\u2019ve made special elite versions of some enemies that only trigger as part of someone\u2019s story. The party of 3 players fight the elite enemy together. The nice thing here is that to your teammates, it\u2019s just another elite enemy with some special skills (we have plenty of those outside story moments as well), while to you this specific enemy is a story moment and triggers dialogue. So this is a coop battle that is also a single player story moment. Quit neat, I think!<\/p>\n<p><iframe loading=\"lazy\" title=\"Elite enemies as storybeats in Blightbound\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/AdVKoDIz9m8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><br \/><i>An example of a story beat in which we encounter an elite enemy.<\/i><\/p>\n<p>Unlocking new heroes to play is a big part of Blightbound\u2019s progression system. Here too a goal was to add some variation. Many heroes are simply found and rescued from a dungeon, but some others can only be unlocked by paying the merchant, by making your village prosper, or by finishing the story of another character.<\/p>\n<p>For the simplest case, where a hero is rescued from a dungeon, we again ran into the problem of this being a coop game. My teammate might already have saved the hero that I\u2019m rescuing, how does that work? To solve this problem, we\u2019ve introduced the concept of survivors. These are basic characters that you can\u2019t play. When you rescue a survivor, you get a little prosperity bonus to your village and that\u2019s it. Now whenever one player is unlocking a hero by rescuing them in a dungeon, the other players see this as rescuing a generic survivor. This way it never looks like a teammate is reviving thin air: there\u2019s always someone lying on the ground, ready to be saved. It might just happen to be a different character for each player.<\/p>\n<p><iframe loading=\"lazy\" title=\"Saving heroes in Blightbound\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/y9b0aAM9z2w?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><br \/><i>Unlocking a hero compared to rescuing an anymous survivor.<\/i><\/p>\n<p>One more nice trick that I would like to mention is one that we\u2019ve so far unfortunately not finished implementing (Blightbound is still in Early Access on Steam). Since levels have these areas that are ideal for triggering story beats (no combat, some space for exploration), it would be nice to do something with that even when there\u2019s no story beat for your specific character triggering in that run. So Roderick (the writer on Blightbound) has written a bunch of dialogues and banter that add some world building and personality building, but aren\u2019t tied to any moment in the story. This way we can always trigger something. Since this is really a non-essential bonus feature we haven\u2019t gotten around to actually implementing these lines yet, but I really like this feature so I can only hope that we\u2019ll find the time to add this at some point.<\/p>\n<p>Before concluding this blogpost I\u2019d like to also have a short look at the implementation. With 21 heroes all having story moments and shouts and banter, Blightbound has a LOT of voice lines. There are more than 100 story events and over 6,000 voice files, ranging from short barks to several sentences. Working efficiently with such large volumes requires some proper tools, so <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.ronimo-games.com\/\" target=\"_top\">Ronimo<\/a> programmer Jeroen Stout (known for having made <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/store.steampowered.com\/app\/94000\/Dinner_Date\/\" target=\"_top\">Dinner Date<\/a> before joining Ronimo) implemented a system he calls Voice-A-Tron.<\/p>\n<p>Voice-A-Tron was tailor-made for Blightbound and it\u2019s a very neat tool that provides a bunch of features, including:<\/p>\n<ul>\n<li>A spreadsheet that automatically presents all lines in two formats: per character and as it appears in dialogue (so alternating between lines of different characters).<\/li>\n<li>Some simple scripting rules that allow defining dialogues, what portrait to use, where to trigger context-sensitive responses, triggering animations and even triggering related achievements and unlocks.<\/li>\n<li>A system that automatically executes these scripts in-game, so that our game designers need to do less work to implement story beats.<\/li>\n<li>Special objects that can be placed in levels to control where and when story beats are triggered.<\/li>\n<\/ul>\n<p>Using Jeroen\u2019s Voice-A-Tron system, <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/twitter.com\/HeerRood\" target=\"_top\">Roderick Leeuwenhart<\/a> wrote and defined all the story beats. Roderick is the writer for all Blightbound dialogues, as well as a series of <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.blightbound.com\/stories\/\" target=\"_top\">short stories set in the Blightbound universe<\/a>. The next step was that Ronimo game designer Thomas van der Klis did the actual implementation, for example defining where story events can trigger and creating special items and elite enemies.<\/p>\n<p>The result of all this work is that in Blightbound, each character has their own story beats and these are told without interrupting the flow of gameplay and without spoiling teammates. At the same time the system is simple enough that it was doable to implement for all 21 heroes in Blightbound. While Blightbound isn&#8217;t a storytelling game at its core, I feel this adds a lot of personality and purpose to the experience.<\/p>\n<\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<br \/><br \/>\n<br \/><a href=\"http:\/\/joostdevblog.blogspot.com\/2021\/02\/individual-storytelling-in-coop-game.html\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>An interesting design challenge during development of Blightbound was how to combine personal storytelling with&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1478,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2529,1434,2599,2433,2312],"tags":[],"class_list":["post-1477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blightbound","category-game-design","category-level-design","category-narrative","category-tools"],"_links":{"self":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/posts\/1477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/comments?post=1477"}],"version-history":[{"count":0,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/posts\/1477\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/media\/1478"}],"wp:attachment":[{"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/media?parent=1477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/categories?post=1477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/x.sheep-mine.ts.net\/index.php\/wp-json\/wp\/v2\/tags?post=1477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}