The Heist of the Argonaut Limited | Dev Blog

As I've been going through the process of making this game, I've often had friends, family, and strangers ask me, "Hey, Nico! What are you up to?" And, depending on how enthusiastic I was feeling about my game, I would say, "Well... I'm making a game." And boy... are people impressed by that sentence. Because they are imagining, I don't know, like... the Last of Us or something.

So, I immediately follow up with, "It's a text adventure."

I went to school for Film/TV and I minored in Computer Science... So I've... coded before? But I had never made a game. I always wanted to make a game... but thought that was a bit too much of a pipe dream. Then I was introduced to the Playdate and then the Playdate SDK and then I thought...

I guess I'm going to make a game.


My first concept was an escape room text adventure where instead of by randomness, your skill checks were determined by WarioWare-style minigames. But first, after recognizing that I probably couldn't do what I wanted to do in Pulp, I had to develop a text-adventure engine.

I wanted the game to be minimalist. Text on screen and that's about it. I am... not an artist. I am a writer... So this is perfect. It's just going to be text! What could be easier?!

playdate-20220526-012444

This is the earliest version of the game I can find that I had shared online... which is probably months into the process. So let's just imagine a quick montage of me toiling away at getting the text to even appear on the screen, let alone in sequence as shown in the gif above.

But once I did, I felt such elation! I was really making progress. And next Dev Blog, because this forum won't allow me to post more gifs in my first post, we'll talk about how I way over-conceptualized my game.

7 Likes

With the text engine functionally done, I had to work on the core, unique concept of the game: the minigames. My idea was that instead of doing a Strength Check you would play a Conflict Minigame. Instead of making Dexterity Saving Throw you would play a Flee Minigame.

So I set out to do some conceptualization:

CONFLICT.

A samurai 1v1 minigame where you had to adjust your posture with the crank. Think Nidhogg meets... Sifu?

samuraitest

FLEE.

An explorer, bandicoot style running away minigame where you use the crank to climb and determine running speed. Think Crash meets Temple Run?

jungleTest

PERFORM.

Classic quicktime events, including the crank! Think... OK, I'm done thinking.

performancetest

ARRANGE.

Platformer minigame where you use the crank to arrange platforms to get to the goal.

PlatformerTest

PRECISION.

A paper delivery minigame where you ricochet newspapers onto peoples hard-to-reach porches!

paperboyTEST

RECALL.

A fishing minigame where you catch fish... or your memories?

fishtest

ACCESS.

A lockpicking minigame, using the crank!

pickingTest

COMPOSURE.

A little boat minigame where you sail around with the crank and collect items and avoid obstacles!

BoatTest

You might be thinking to yourself... "Wait, I thought this guy couldn't draw?" Well, I can't, really. OK? And if this looks like drawing to you, all I've got to say is that there are some really great pixel art tutorials out there. Shout out to Adam and Brandon.

What you might also be thinking is what I was thinking at the time of conceptualization: "this is going to be a fun game!"

What I hadn't yet thought was, "this game is going to be so hard to make."

So, in the next Dev Blog, we will talk about how everything went wrong, all of this was scrapped, and how I am happier, healthier, and much closer to finishing the game now, after all of these trials and tribulations.

8 Likes

The list is like a dozen different games! :sweat_smile:

Scoping is difficult, but I find you get better at it with practice.

Good luck!

2 Likes

So, last we left off. I was conceptualizing a game that was actually, at a minimum, 8 games. And if you look closely at my previous Dev Blog posts, you'll notice that a few of my so-called minigames were actually pretty fleshed out.

Perform, Recall, and Access were fully playable and Conflict was well on its way to being finished. I started to burn out after completing Access but I thought I could reinvigorate myself by thrusting myself into my favorite of all of the conceptualized mini-games: Conflict. I loved the idea of going toe-to-toe in a samurai sword fight where you had to try to outwit your opponent by shifting stances and quickly thinking on your feet. And it was fun! Even just in the state that it is now, drawing your sword by undocking the crank is incredibly satisfying, and using the crank to change posture was just... great.

But then I moved on to the next step: the opponent. And I was immediately humbled by the fact that, as far as I was able to get in this project...

I know nothing about developing core gameplay mechanics like simple A.I.

As I said before: I am a writer. This was my first project coding, designing game mechanics, etc. and I was way out of my depth. So, I did what I do best!

I tore it all down.


I started fresh. I kept the text engine that I had created, decided to do exactly what I said I wouldn't do, and decided to make a TTRPG-style text adventure that relied on numeric stats and random chance. Because, after about 10 years of Game Master experience... I at least know how to do that.

So, I set out to make a die roller. I wanted it to be a d20, in classic Dungeons and Dragons fashion. I wanted the ability to have modifiers based on character/class. I wanted the ability to have "advantage". And I wanted to roll the dice by cranking! So, I got to work.

rolltest

I got the dice scene working and even implemented advantage:

advtest

And it was even pretty easy! After how much time and effort it took to make a single mini-game... This felt like a walk in the park. I was feeling reinvigorated and best of all, I could see the holy grail on the horizon... the thing I had been waiting for, for... months now.

Soon... I would be writing.

But first, I had to switch up my concept a little bit. I wanted to lean into the classic fantasy TTRPG vibes but also wanted to add a bit of my flavor... in a tight, self-contained package.

So, I decided to adapt a Dungeons and Dragons one-shot that I had written and run dozens of times: The Heist of the Argonaut Limited. It's a fun little single-session heist with a twist and I knew the story and characters like the back of my hand. Even better, as luck would have it, I was working on a Dungeons and Dragons one-shot anthology book at that time and so I was working closely with a wonderful artist (@stroggart on Insta) who I commissioned some art from resulting in...

systemsTest

The foundation of my game was finally set. And now I could get started on writing the damned thing.

In the next Dev Blog, we'll talk about how decidedly not-easy writing a non-linear narrative is, the struggles of game design in a mechanics-lite system, and how this writing process would take up the next year of my life.

1 Like

Last we left off I had established the foundation of my game. At this point in the development cycle, I was probably 4-5 months in. About 4 of those months were spent developing a game that only had one thing in common with this new iteration: It was also a text adventure.

So let's talk about text adventures. Once I got to this point, I was like, "This is where the fun begins! The writing!"

Here is the basic template for a scene. A scene is a single screen that typically resolves with a choice.

scene["sceneTemplate"] = {
	initialize = function()
		--PRE-VARIABLES: 

		local dialogue =    {
			"dialogue"
		}
		local prompts =     {
			"prompt"
		}
		local nextScenes =  {
			"TEMPEND"
		}

		--DIALOGUE: create dialogue scene of parts created above.
		thisScene = Dialogue(dialogue, prompts, nextScenes)
		--SAVE GAME: save ID and store it in a json
		saveFile()

		--POST-VARIABLES: 

	end,
	running = function()
		--UPDATE: do dialogue scene
		thisScene:update()
		--QUERY: for transition to next scene, game or prompt option
		if sceneChange then
			sceneTransition(selectedID)
		end
	end,
	terminate = function()
		--CLEAN UP: run cleanup function for dialogue
		thisScene:cleanUp()
	end
}

This Dialogue object has three lists. One array is the dialogue on screen. Each new line of dialogue ends with a button prompt. When the button is pressed, the next line of dialogue is printed. Once all of the lines of dialogue are printed then the prompt window is generated and the player can make their choice.

scene example

Realization #1. If I provide a choice in every scene, my scene quantity will grow exponentially. I will spend the next 3 years writing the intro, eventually lose my mind, and give up on the project after the Playdate 2.0 releases.

Realization #2. Even if I provide minimal branching, each branch could arguably create a fully unique ending. How do I communicate that the player character met this NPC? How will having met this NPC affect future scenes? Millions of possible endings: my head explodes.

Realization #3. I could solve both of the above realizations by doing what most video games with "choice" do. And that would be to create the illusion of choice. You select the answer to snarkily reply, "Actually, I don't want to take the toaster oven." but the NPC gives you the toaster oven anyway for some reason.


After a few days of staring at my screen, I came up with some solutions.

Resolution #1. To resolve the exponential growth of branches and scenes I decided to have the sort of act structure that would have each act ending in essentially the same scene, no matter your choices. For example, each player might do something totally different on the train platform... but they all eventually board the train. Additionally, within Acts, I would sometimes consolidate to a significant scene/sequence that most players would likely experience.
I have illustrated this in Microsoft Paint.

Resolution #2. To accommodate the feeling of player agency while also not losing myself in an ocean of unique scenes, I wrote in an info system and favor system. This allowed me to easily input whether or not the player had obtained certain info (names, knowledge, circumstances) and also whether or not they had met and befriended certain characters. This allowed the choices made between acts to affect the trajectory while still maintaining the same foundational narrative structure. Every player character boards the train but they may be friends with certain characters or know certain things that other player characters might not.

Resolution #3. This one is unavoidable to a certain extent. I have to utilize the illusion of choice because there are simply too many options that a player could choose. I must narrow that down. However, there are a few things I can do to make it seem like the players' choices matter more.

  • Try to regularly print unique lines based on specific info/variables/favor.
  • Try to regularly branch to unique scenes when having specific info/variables/favor.
  • Try to regularly reference previous choices.

With these tactics in mind, I began to write. Of course, complexity grew exponentially with each passing act making it harder and harder to keep track of all of the moving parts. But it was now manageable. To illustrate the growth here is a scene in Act 1:

local dialogue =             {
			"A scene."
		}
local prompts =            {
			nil
		}
local nextScenes =     {
			"act1_scene_next" 
		}
--DIALOGUE: create dialogue scene of parts created above.
thisScene = Dialogue(dialogue, prompts, nextScenes)
--SAVE GAME: save ID and store it in a json
saveFile()

And this is an Act 5 scene.

		local dialogue =    {}
		local prompts =     {
			nil
		}
		local nextScenes =  {}

		if chosenCharacter:hasSomething() then
			--VARIABLES: 
			
			dialogue =    {
				"One scene."
			}
			nextScenes =  {
				"act5_one_possible_scene"
			}
		elseif chosenCharacter:hasSomethingElse() then
			--VARIABLES: 

			dialogue =    {
				"Another scene."
			}
			nextScenes =  {
				"act5_death_for_someone_maybe?"
			}
		elseif chosenCharacter:hasFavor() then
			
			dialogue =    {
				"Another, another scene."
			}
			prompts =	 {
				"Save Someone! [SPEED, DC 10]",
				"Don't risk it."
			}
			nextScenes =  {
				"act5_save_someone_roll",
				"act5_death_for_someone_maybe"
			}

			if chosenCharacter:getHarm(1) == "dying!" then 		
				dialogue =    {
					"You die here."
				}
				nextScenes =  {
					"act5_death"
				}
			end

			--VARIABLES: 
			chosenCharacter:addHarm()
			chosenCharacter:addPartyMember(someone)
			chosenCharacter:killPartyMember(someone)

		elseif chosenCharacter:hasFavor("someone else") then

			if chosenCharacter:getWeapon() == "None" then
				
			dialogue =    {
					"Whole different scene."
				}

				--VARIABLES: 
				chosenCharacter:addHarm()
			else
				dialogue =    {
					"Even more different scene."
				}
			end

			prompts =	 {
				"Save the SOMEONE ELSE! [SPEED, DC 10]",
				"Don't risk it."
			}
			nextScenes =  {
				"act5_save_someone_else_roll",
				"act5_death_for_someone_else_maybe"
			}

			if chosenCharacter:getHarm(1) == "dying!" then 		
				dialogue =    {
					"You die... Unfortunately."
				}
				nextScenes =  {
					"act5_death"
				}
			end
		elseif chosenCharacter:hasFavor("another group") then
			--VARIABLES: 
			chosenCharacter:addPartyMember("someone")
			chosenCharacter:killPartyMember("someone")
			chosenCharacter:addPartyMember("someone else else")
			chosenCharacter:killPartyMember("someone else else")

			if chosenCharacter:getWeapon() == "None" then
				
				dialogue =    {
					"More potential tragedy."
				}

				--VARIABLES: 
				chosenCharacter:addHarm()
			else

				dialogue =    {
					"At least in this scene you have a weapon."
				}
			end

			nextScenes =  {
				"act5_a_slightly_better_scene?"
			}

			if chosenCharacter:getHarm(1) == "dying!" then
				dialogue =    {
					"Oh but you can die this way too..."
				}
				nextScenes =  {
					"act5_death"
				}
			end
		end

		--DIALOGUE: create dialogue scene of parts created above.
		thisScene = Dialogue(dialogue, prompts, nextScenes)
		--NO SAVE ON THIS BUSY SCENE

Now... Listen. I know that this is likely not the most elegant execution. And I'll say again: I am not a programmer or a developer. And yes, Act 4 and beyond was a nightmare to write. But imagine... After you've written all of these scenes... Will they work?

So on the next Dev Blog... We are going to talk about playtesting and also release a public playtest. See you then.

4 Likes

These are great reads. You have a talent my man, have you considered writing? :wink:

Keep your sanity, make hard choices, and keep these dev logs coming!

4 Likes

WOOOOOOOOOOOW. This is amazing! I want more and more to hear about it. Would it be possible to have a look at the source file as well? I tried making games in Twine and really loved what you could do with it, but your first 8 game prototype looks SO MUCH FUN hahaha. Sooper curious how the code looks like and would love the opportunity to learn from it (if possible).

BTW: are there any text adventures game out there for the PlayDate?

Also, I loved your comparisons for each short game hahaha. They were so on point.

ALso also, dudeeee, your DnD dice looks SO GOOD and the animations are super pleasant. Big ups for all the work you put into your baby. Throwing good energies at you.

  • Eli.
1 Like

I appreciate the motivation! You know, I never really thought of releasing the source for the old game, but I think I might towards the end of the Dev Blog when I release the text engine as well. That'll require some spring cleaning but maybe someone will take the skeleton of what I had started with the original concept and run with it, that would be fabulous.

As for other text adventures on the Playdate, I'm not sure. I think that there are plenty of visual novels and text-heavy, narrative games. But I'm not sure if there's something like what I've made. I'd love to see another branching narrative on the Playdate, I have a fascination with the medium and can't be exclusively getting my fix from Baldur's Gate :wink:

Last time on the Dev Blog we talked about the struggles of writing a branching narrative. I started the journey of writing this game about a year ago... and well... I don't need to talk about it, here are some stats:

  • Act 1: 17 total scenes, on average each scene had 3-5 lines of dialogue.
  • Act 2: 51 total scenes, on average each scene had 3-5 lines of dialogue.
  • Act 3: 103 total scenes, about every other scene had alternate dialogue(s) based on 1-3 variables.
  • Act 4: 313 total scenes, 13,837 lines of code. That's 44 lines per scene on average, compared to the 36 lines per scene of Act 1/2. More scenes, more lines, more mayhem.
  • Act 5: 679 total scenes, with 30,646 lines of code, staying strong at around 45 lines per scene.
  • Act 6: 88 total scenes, and while unfinished there will likely only be 10-20 more scenes added before 1.0 release. This is the densest act with 4,633 lines, bringing the per-scene average to 52 lines. This makes sense because most scenes in this act are incredibly variable, depending on the choices made in previous acts.
  • Total: That's 1,251 scenes and 57,029 lines in the whole game.

What a wild journey. It is funny, with everything laid out in front of you, seeing the clean exponential growth of the story from act to act. But the reason why I'm laying this out before we talk about playtesting is because...

Playtesting is hard.


Almost every time I have done a run of the game, I have caught some sort of bug or error. Sometimes it's as small as an awkward line that I want to change or a spelling error. Sometimes it is a game-breaking bug. And I've played through the entire game more than a dozen times at this point. And before the story was "finished" I did meticulous testing on the individual sections/sequences as I was working on them.

Because of the nature of the game, it's almost impossible for me to test every single iteration of each scene. So many of the bugs I have encountered so far come from introducing a variable that I hadn't tested in the scene previously. It is an incredibly daunting task.

So having said that, I would like to invite anyone reading this to participate in the playtest for this game!

  • Here's the playtest guide, to welcome you to the playtest.

  • Here's the install guide, I would request testing primarily in the simulator so you have easy access to the Playdate console.

  • And here's the QA Form for you to fill out (I recommend opening it and taking a look before you start playing the game).

If you end up playing the game and filling out a form all I have to say is thank you so much. This has been a labor of love and I am so excited to share what I've made. Hopefully, there aren't too many game-breaking bugs...

Lastly, for this Dev Blog, here are some small clips from the game!

intro_example

regular_example

art_example

death_example

In the next Dev Blog, we will talk about working with an artist, budgeting for a tiny indie project, and finishing up this year-plus-long project.

3 Likes

Just gave it a playthrough and submitted a playtesting form! I got the gold on the first run and killed so many of the flame guys hahaha. Man, you should have seen me how tensed I was when I rolled those dices in the fighting scenes. Surprised I did not die (I was BADLY hurt).

Will give it another play soon to test other branching paths. Also, I wanna try and win more favours hahaha (had 2).

Much love man for this and thank you for putting it out here for playtesting ^^

  • Eli
1 Like

Thank you so much for playing! I'm so glad that it was fun and also glad that you're whatsoever motivated to go back and explore more of the game. I'm working on the epilogue right now and it's been very fun as it is a slightly different style of writing. Excited to squash a few of the bugs that have been reported and push out a new update soon, should be another one in the next few days.

2 Likes

Well, after about a month off, then returning to pick away at some of the last features... the game is nearly finished. My biggest win so far is that all of the writing (in theory) is done. The epilogue is finished and the game is at a point now where I am satisfied. I, of course, would have loved for there to be more options, more agency... infinite possibilities... the sky is the limit! But I want to finish this project.

So this will be my penultimate DevBlog for this project before release. And the only post-release update after that would be a possible port to Love2D. But I would have to muster up some courage to attempt that.

Before I launch into the DevBlog itself, a reminder/invitation! Please playtest this game! I've decided to extend the playtest to 3/1/2024 in the interest of maximizing the amount of bugs I can fix pre-release. I would appreciate you playing the game and at this point, it is essentially finished.

Here is the Playtest Guide which includes links to everything you need to playtest the game.

And for good measure, here's the PDX, in case you just want to quickly update the game to the most recent version.


So, anyway. Art! That's what we're talking about today.

Here is the state of the game 14 months ago:
oldversion

And here is the state of the game today:
newversion

The biggest leap in quality I felt --where suddenly it appeared to me as if my game was an actual game-- was when I added art. I worked with an absolutely fantastic artist, Mike Dewson, who learned how to draw 1-bit pixel art for this project, having never done it before, and helped me sort out the paralax effect that I wanted.

Following is a screencap of a typical back-and-forth between the two of us.

Following is some unsolicited wisdom on working with artists--

  • Find a good artist whose vision/style meshes with yours.
  • Know without a shadow of a doubt what you need from the art.
  • Clearly communicate your needs for the image.

Then, hey: Bob's your uncle.

Another important note, with a footnote that I will discuss afterward--

I paid my artists. I paid Mike per image and I paid the musician who made/is making music for the game per song. I wish I could have paid them more and I wish I could have brought on another writer and paid them too, but this was a personal project and a learning experience, I'll reserve that size and scope for the future.

The footnote to that: I am not telling you that you have to pay your artists, your friends, or whoever helps you work on your wonderful, beautiful little (or big) game. But if you can... then why not? I wish I was one of the multihyphenates that I see on these forums all the time: artist, coder, writer, designer, musician. But I'm only maybe two (1 + 1/2 + 1/2, guess which) of those things total. And because of that it blows my mind what people are capable of and I just think that that is worth showering them with a little bit of money.

If you have strong feelings about this matter, please let me know. Because I know that many careers and incredible games have been created through the power of free labor or the promise of exposure. I just think that, having been a part of a similar industry (Film/TV) that takes advantage of people using similar promises, it didn't feel right for me to try to pay for some incredible art with credit alone.


Well, that's my rant for today. Next DevBlog we'll talk about pulling the trigger on release and hopefully... we'll have a game to release then too!

1 Like

It has been exactly three months since my last DevBlog. All I'll say on that is that life comes at you fast. But to speak to the state of the game... It's essentially finished. And if you read any part of this DevBlog read this:

The Heist of the Argonaut Limited is officially releasing on 2024-05-21T17:00:00Z on the Playdate Catalog and itch.io! In the next and likely last DevBlog, I will include links!

Last time I said we were going to talk about pulling the trigger on release and so... that's what we're going to talk about.

Sheer, unadulterated, unabated terror.


I started logging updates to the game at version 0.7, almost a year into developing the game. Here's the changelog in its entirety:

Changelog
...
Update 0.7, 10/15/23
Added options menu
Added button rolling feature
Added fast text feature
Added main menu animation
Added Act 2 scenes to allow for early advantage on gaining favor with Blaise

Update 0.71, 10/17/23
Fixed Act 2 issue when attempting to help cargo people, went to wrong scene
Rebalanced Act 3 skill checks to make gaining favor easier
Fixed aggressive sound when B skipping text with fast text on
Fixed issue in Act 5, Economy where charming the bandit wouldn’t lead to reward
Rebalanced Act 5, Economy and retooled some branches early on
Fixed bug where after defeating the Black Flame, the game prompts you to save PAM, who is not there, and then crashes if selected.
Fixed last few lines of text not showing in some particularly text heavy scenes
Fixed climactic scenes in final battle with Black Flame where selfish actions would not lead to adequate consequences
Rebalanced player character HP, adding one more HP
Fixed plot hole if saving the train after the Black Flame event

HOTFIX 0.72, 10/17/23
Fixed save reset not resetting Act break variables, leading to teleporting into Act 5
Fixed game crashing on load if you enter options before smoke init in main menu

Update 0.73, 10/20/23
Fixed New Game carrying over specific aspects of the character class, namely HP.
Revamped Skip Intro, exists in Options rather than in the System Menu and is now tied to the Options save file. This means that resetting Save Data no longer disables Skip Intro.
Reset Options now actually works.
Revamped Dialogue so that you can crank in between A Button queries.
Also fixed text occasionally going off the bottom of the screen, especially when using Fast Text or holding B Button to speed up dialogue printing.
Re-rebalanced HP, subtracting one HP for a total of 5. The game felt too easy. May add difficulty settings in Options.
Simplified inventory management in back end
Mild rebalancing of the Act 5, Escape Sequence, including fixing some harmful scenes not inflicting harm
Fixed a possible plot hole in Act 5, First-Class having to do with assembling your crew when that should not have been a possibility
Update 0.8, 10/26/23
Added Achievements! Starting with three pretty simple ones! Good luck!
Heist Meister. Secure the cargo for a cool reward!
Rest in Peace. Feel the sweet release of death for an interesting handicap!
Favored Favorite. Meet all the friendly passengers on the Argonaut Limited for a cool reward!
Fixed Act 5, Team Sequence where a nil variable caused a game crash and debug remnants added random party members to your party
Sped up the Options and Achievements animations because time is money.
Tweaked an Act 3, First Class scene to allow all classes access to a special branch.
Fixed seemingly losing Blaise’s favor if you chose to go to a different seat after gaining their favor.
Fixed a scene that happens if you are able to talk your way out of being caught.
Fixed some pronouns when trying to save an ally
Fixed being able to heal allies that are unhealable after a climactic sequence
Fixed a crash that happened if you have no friends but try to think of your friends.

HOTFIX 0.81, 10/27/23
Added scenes to Act 6 between the heist and the rendezvous.
Fixed again leaving in debug variables


Update 0.9, 11/5/23
Reconfigured the dialogue printer to permit adding art into a scene
Added Art! Starting (and perhaps ending) with some significant story beats, especially the ones that are almost ubiquitous across playthroughs. 
Fixed doubling up View Stats
Reworked a number of scenes in Act 5 to make it easier for the player to combat the Black Flame and to add a bit more agency
Rebalanced the Burglar to be more viable (+3 SPD -> +5 SPD)
Did not update pdxinfo so build# and version# are wrong in sim or on hardware

Update 0.95, 11/22/23
Added a couple of scenes to facilitate an exceedingly rare branch in Act 4. It is now a little easier to befriend the Black Flame.
Fixed the character seemingly forgetting their involvement with the Black Flame at the end of the game. 
Rebalanced a couple rolls in Act 5 to make the game slightly less punishing back-to-back.
Allowed for team assembly with only a single favor in the first-class car.
Added final scenes with Levi and Tiny. 
Added credits

Update 0.96, 11/27/23
Fixed a Debug remnant in Act 6 causing you to have the cargo even if you didn’t.
Fixed Galinda and Hillman not being added to the party when they should have been.
Reset save file after completing the game.
Fixed HUGE bug where no party stats were being saved in the save file.
Rebalanced sneaking into Cargo in Act 3, making it slightly more feasible across classes.
Fixed a bug that shot you into the future right after getting caught by the Black Flame.
Fixed a bug in Act 4, Cargo where the appropriate dialogue, based on knowledge, was not being printed.
Fixed appropriate early text not showing up in Act 6.
Fixed fading to white then fading to black after dying/failing.

Update 0.97, 11/27/23
Added additional art
Fixed bug where you were prompted to open the box when the box was already opened.
Added scenes to accommodate some unforeseen possibilities in Act 6

Update 0.98, 12/7/23
Fixed bug in Act 5, where sobbing a bit more would crash the game due to an uninitialized variable
Fixed bug where if rolling a Nat 20 on the right die with advantage, the die would disappear and the modifier would stick around for
 some reason.
Updated card so that the train is not going at 5,000 mph.
Added the beginnings of the epilogue. 

Update HOTFIX 0.98A, 12/9/23
Accidentally left in a roll minimum of 19 from testing the rolling bug
 OOPS.

Update HOTFIX 0.98B, 12/9/23
Fixed not adding the cargo to your inventory in a rare branch where you have to be very stealthy.
Fixed some spelling errors.
Removed a debug variable that added the cargo to your inventory right before the epilogue.
Fixed text not showing up when rolling in the epilogue.
Fixed some endings not triggering the credit music and credit music not looping.
Fixed a bug where Tasty would wield a scimitar like a human which, while hilarious, was unfortunately an unintentional bug.
Fixed a crash in Act 5, coming out of battle with the Black Flame, due to an unused variable.
Fixed Tasty’s pronouns being misused gramatically. 

Update 0.99, [2/7/24]
Added three new achievements:
End of the Line. Reach the end of the line for a new challenge!
Unlikely Allies. Befriend the bandits for a liberating reward!
Untouchable. Take no damage for a new starting point of the adventure!
Added titles to the achievements.
Fixed a bug where resetting achievements would cause the game to crash upon viewing the achievements.
Revamped fonts and added the Large Text option to hopefully enhance readability if desired.
Revamped printer to be more consistent with spacing, print more neatly arranged text, and enable cranking to the correct starting point.
Finished epilogue


Update 1.0, [3/2/2024]
Added additional encounter music!
Changed the roller to include the DC when rolling.
Changed some discontinuous dialogue in Act 5.
Changed the harm standards so that we donʻt end up with a “You have been hurt, you are hurt” return.
Fixed a bug where advantage was not being saved. This has been in the game for months without me noticing smh. 
Finally fixed the rare bug that would cause one die to disappear when rolling advantage.
Mixed the printer audio so that it isn’t so loud compared to the music.
Added the ability to exit out of stats with ‘B’ Button!


Update 1.1, 3/24/24
Enabled Fast Text and Large Text by default for legibility when using the PD. 
Total rewrite of the prompt code to allow for larger and more legible text.
Reconfiguration of the dialogue code to better format larger and more legible text.
Fixed long standing mysterious bug where upon a new game text would be invisible.
Fixed seemingly random bug where single slate credits would be out of order.

Update 1.11, [4/5/24]
Fixed two bugged scenes in Act 5 that led to instant crashes.
Fixed large text eventually not printing in certain longer scenes.
Fixed large text prompts running off the side of the screen.

Update 1.2, [4/8/24]
Added more specific tutorialization where instructions are less confusing and more specific. 
Fixed some long headers running off the edges of the screen.
Fixed a very particular length of prompt running off the side of the screen.
Changed the button prompt to go off screen when scrolling because I like it that way.
Changed the prompt indent to be a little bit less crowded.
Fixed the first line indenting too far down on the y-axis. 

I began logging updates when the vast majority of the writing was complete but the game was not yet feature complete. The game became feature complete at v1.0 when I added encounter music. At that point, there had been months of playtesting and bugfixing... And yet, in the following month I didn't just find more bugs but I created more bugs (more on that next DevBlog).

Even as we get closer to release I become more and more possessed with anxiety because I know that there are more bugs in this game! It's just impossible that there aren't. There are tens of thousands of lines of code and I'm just a little guy! But it isn't just me. At this point, I've been honored by having more than 15 individual people play-test the game. Combined they have completed almost 100 runs!

And yet there are still two storylines that have never been played by anyone but me. And many individual scenes that have not yet seen the light of day... And so... I know that I must release this game to the world. I cannot obsess over it because it will never be perfect. And the only way for these hidden scenes to be experienced is to hope that people will play the game. How utterly terrifying.

In the next (and likely last DevBlog) we are going to talk about applying to the Catalog, the biggest and last curveball in this development process, and accessibility.

We're here. Launch day. The game will go live 2024-05-21T17:00:00Z on the Catalog and it is live as of now on itch!

Go buy it now on itch.io!

Funnily enough, two years ago yesterday was the first time I posted in my close friend's Discord.

So, I guess I've finally crossed that two-year mark. Enough glassy-eyed nostalgia, let's talk the talk.

Around two months ago I submitted the game to the Playdate Catalog because that felt like the right thing to do. In the back of my mind, based on the lengthy playtest period and also my own insecurities I had settled on the possibility that my game was not the best fit. I came to this conclusion for two reasons, one of which is very relevant (see if you can tell which is which).

  • Accessibility. My game text on the Playdate is criminally small. It's smaller than almost every book I have in my library and with the auto scrolling, readability is tragic.
  • The Crank. My original concept (see the top) utilized the crank with unmitigated fervor. My revised and realistic concept... not so much.

Because of these two failings, I was prepared to hear nothing back from Panic and release on itch.io in a month or so. And then... I heard back. And half of my concerns were validated.

Panic essentially said (this is paraphrasing, they were so kind) "I can't read the teeny tiny text, your tutorial doesn't make sense, and your text is too slow." Now you might be thinking, "Nico, if you knew there was an accessibility issue in your game why didn't you address it earlier?" and the answer is an emphatic, "I don't know how! I'm just a little guy! I don't know how to do these things!"

When I was first making the text engine, I realized that I would have to integrate wrapping or scrolling into the prompt window in case a single prompt was longer than the window. But I loathe scrolling, I think it directly and negatively impacts pacing and user experience... so I had to do wrapping. But then! If I have wrapping, the heights of each of the prompts had to be variable... and I was using GridView... and GridView is so nicely implemented... and I didn't know how to otherwise implement wrapping in a single column list...

But now I had to.

So I went where I go when I am in my darkest hour: SquidGodDev (Youtube, itch, Patreon). And I was like "Hey, is there an easy way GridView can change row heights?"

And thus began one of the most frustrating weeks of my life. I'll spare you the details but any of you code-savvy people out there are probably like "A WEEK?!" because this is like an afternoon implementation, at the most. But... and I don't know how many times I have to say this... I'm just... a poor... lost... writer.

But I did it. I think it's still not perfect but as far as I can tell, it works. I was approved for the Catalog. And fast-forward to now: it's Launch Day. And honestly, I'm so happy that I implemented this accessibility feature because it was a huge failing in my game! I can't believe I was ready to ignore this glaring flaw because I was so ready to be done. But also I can't blame myself... it was two years of work after all.

I am proud and thrilled, I am insecure and frightened, I am ready to be done. Thank you to everyone who has helped me and supported me throughout this journey. Thank you to Panic for creating this funny, little, yellow machine. And thank you for reading.

3 Likes

I'm so proud of you! It seems like just yesterday we were both trying to figure out how to make a text-heavy game. And here you are! Releasing it on catalog!!!!!! :sob: :sob: :sob:

1 Like

Great job!! What a long project, really cool that you stuck it out and got it finished! The lines-of-code counts for the different acts are pretty wild, and a really good illustration of why it's so rare for games to do widely-branching narratives. Your mockup showing the narrative spreading out and then reconverging several times is a popular strategy for containing that complexity explosion - nice!

Your guess that the GridView replacement "should have only taken an afternoon" seems pretty harsh - like sure, "someone" could do that in an afternoon, but that'd be someone who had already done that type of stuff (or maybe even that exact thing) before! Taking a week to implement a fiddly thing which is completely new to you sounds totally normal to me (less like "baking a cake from a box of cake-mix" and more like "baking a cake from scratch, without a recipe, in a pitch-black room, while wearing boxing gloves").