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.

6 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.

7 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