Master Key Pocket - a text-less adventure

Master Key is a Zelda-like with a great focus on exploration and non-verbal dialogue. This is a demake (or a spin-off?) of said game with different elements to create a unique experience for playdate users.

How I discovered this game and why I decided to make a demake of it

Earlier this year, I made a demake of Tunic for the Game Boy Color with GB Studio and a huge inspiration from early Zelda games (especially Link's Awakening). This is the first time I ever made a game publicly available and although it wasn't as popular as other demakes made with GB Studio, it was well received by many who tried it, especially by the Tunic community as it served as an example of what it might look like.

I was flattered by the reception and decided to look further for any mentions. I ended up finding a comment on Reddit about a very similar game but with a greater focus on exploring called Master Key. I liked it, so I searched for more information and managed to find a Discord server where I could talk to the developer. The server is very small but the people are nice and the developer was happy to let me make a demake of Master Key. The suggested platform was the playdate since it was very requested.

Originally, I wanted to remake the game with the playdate's SDK but since it isn't currently compatible with arm-based Chromebooks, I decided to stick with pulp. At first, I didn't like the resolution and limited movement but later on, it made it easier to work anywhere, whenever I wanted.

What has been remade so far

  • Most of the essential tile sets have been faithfully downscaled thanks to the support of the dev.

Downscaled, need some polishing

Downscaled

  • HUD Most of the HUD elements work, except the life gauge (which is based on this thread).
    It's only limited to 4 full halves. Perhaps I could add 2 more variables that represent the second line. but then again it will continue drawing on the first line.

  • Look at it go!|120x80, %
    Basic Movement Animation

Conclusion

It only has been a month and a half since I started working on this, so there's not much to show as I'm still learning how to use pulp. There are still some things that need to be added, so I'll be more active in #pulp if I get stuck on something. This is the first time I have written a development log during development since I typically write one after finishing. I'll be making some updates by the end of every month but I can't guarantee that they will be as long as this one unless I would explain a certain feature.

5 Likes

This is looking really cool, the downscaled art looks great! Accurate but gets across clearly the "demake" vibe.

Thanks, that's the idea, but I'm trying not to make it feel like a worse version of something that already exists.

Never heard of Master Key before but I am ALWAYS down for a Zelda-like!

Update #1
It's been a while since I haven't posted anything here (apart from the Playdate Squad discord server). I've been working on a few major features like a combat system and health system (I'll explain how it works later). I'm almost done with the fundamentals to move on with the game's world. For now, I plan on recreating the demo as closely as possible and mixing things up with some new areas, items, and characters. The title of this demake may now be called Master Key Pocket to differ from the original game.

What has been made so far

  • Combat System & Enemy AI

Enemy Test Room
It's far from perfect, enemies can't handle more than one hit and they can only move in "black" tiles. I previously tested with a script that allows movement on any tile but it doesn't work with multiple enemies, so I'll save it for special enemies that only appear in one screen. As for the fox protagonist, needs to have a knockback and a hurt animation when being hit.

  • Coins

collect 'em all

There are 3 types of coins with greater value than the last. These can be collected and gain health until it reaches your maximum and it even changes the icon, just like in the original.

  • Non-verbal dialogue

sample text
This will be more focused once I start working on the game world. It's going to be challenging to see how many expressions I can make with no text whatsoever and with pictograms that are as small as 8x8.

  • Improved life gauge

Heart Test Room

The Life gauge can finally draw another line of hearts when the previous one is full. It's basically 4 different life gauges that sync with each other.

Here's how it works

First, it converts all empty heart halves to fill empty hearts, in addition to drawing all empty heart rows.

MaxHearts = HalfMax
	MaxHearts /= 2
	HPEmpty = ""
	HPEmpty2 = ""
	HPEmpty3 = ""
	HPEmpty4 = ""

Then, it determines how many hearts need to draw on each line. If the last line reaches its maximum amount of hearts (in this case 4), then the last line only draws its max and the next line adds the current value of MaxHearts and subtracts the amount of the last one. This number multiplies as many rows are added.

HP1Max = MaxHearts
    if MaxHearts>=5 then
		HP1Max = 4
		HP2Max = MaxHearts
		HP2Max -= 4
	end
	if MaxHearts>=9 then
		HP2Max = 4
		HP3Max = MaxHearts
		HP3Max -= 8
	end
	if MaxHearts>=13 then
		HP3Max = 4
		HP4Max = MaxHearts
		HP4Max -= 12
	end

it then draws the given amount of hearts to every line. The way loops work in Pulp is that while x is greater than 0, do y and substracts x and repeat until is no longer greater than 0.

	while HP1Max>0 do
		HPEmpty = "{HPEmpty}{embed:lifeempty}"
		HP1Max--
	end
	while HP2Max>0 do
		HPEmpty2 = "{HPEmpty2}{embed:lifeempty}"
		HP2Max--
	end
	while HP3Max>0 do
		HPEmpty3 = "{HPEmpty3}{embed:lifeempty}"
		HP3Max--
	end
	while HP4Max>0 do
		HPEmpty4 = "{HPEmpty4}{embed:lifeempty}"
		HP4Max--
	end

then, it does the same thing with the actual hearts as we did with the empty ones.

    HP = HeartHalf
	LifeString = ""
	LifeString2 = ""
	LifeString3 = ""
	LifeString4 = ""
	HP /= 2

It needs to find a way to know when the heart is in half or not. This is where a variable I dubbed as MasterHalf comes in. For some reason, when the HP reaches 3.5 or 4.5 the first line draws more than it should hence when HP reaches those values it does the same thing as it reaches 3

    HP1 = HP
	MasterHalf = HP
	MasterHalf = floor HP
	MasterHalf -= HP
	if MasterHalf!=0 then
		if HP<=3 then
			HP--
			HP1--
			//Bugfix starts here
		elseif HP<=3.5 then
			HP--
			HP1--
		elseif HP<=4.5 then
			HP--
			HP1--
			//Bugfix ends here
		elseif HP<=7 then
			HP--
			HP2--
		elseif HP<=11 then
			HP--
			HP3--
		elseif HP<=16 then
			HP--
			HP4--
		end
	end

repeat the same thing as we did with empty hearts but with full hearts.

	if HP>=4 then
		HP1 = 4
		HP2 = HP
		HP2 -= 4
	end
	if HP>=8 then
		HP2 = 4
		HP3 = HP
		HP3 -= 8
	end
	if HP>=12 then
		HP3 = 4
		HP4 = HP
		HP4 -= 12
	end
while HP1>0 do
		LifeString = "{LifeString}{embed:lifefull}"
		HP1--
	end
	while HP2>0 do
		LifeString2 = "{LifeString2}{embed:lifefull}"
		HP2--
	end
	while HP3>0 do
		LifeString3 = "{LifeString3}{embed:lifefull}"
		HP3--
	end
	while HP4>0 do
		LifeString4 = "{LifeString4}{embed:lifefull}"
		HP4--
	end

And finally, it draws the heart halves if there are any.

if MasterHalf!=0 then
		if HP<=3 then
			LifeString = "{LifeString}{embed:lifehalf}"
		elseif HP<=7 then
			LifeString2 = "{LifeString2}{embed:lifehalf}"
		elseif HP<=11 then
			LifeString3 = "{LifeString3}{embed:lifehalf}"
		elseif HP<=16 then
			LifeString4 = "{LifeString4}{embed:lifehalf}"
		end
	end

Here's the draw function

// Draw Empty Hearts
	if HPEmpty!="" then
		label "{HPEmpty}" at 20,1
	end
	if HPEmpty2!="" then
		label "{HPEmpty2}" at 20,2
	end
	if HPEmpty3!="" then
		label "{HPEmpty3}" at 20,3
	end
	if HPEmpty4!="" then
		label "{HPEmpty4}" at 20,4
	end
// Draw Full (or half) hearts
	if LifeString!="" then
		label "{LifeString}" at 20,1
	end
	if LifeString2!="" then
		label "{LifeString2}" at 20,2
	end
	if LifeString3!="" then
		label "{LifeString3}" at 20,3
	end
	if LifeString4!="" then
		label "{LifeString4}" at 20,4
	end
1 Like