Saturday, March 14, 2026

Macca Masquerade: Post-GGJ Devlog 2

After a couple of weeks of solo work on updates to our GGJ project, Macca Masquerade, we met up for 2 weekends to finalize the game and do some final polish. And then we individually worked on it a bit and did some final playtesting in a final session together.

We officially finished Macca Masquerade! We did a lot of debugging and adding new features, so in this post, I'm going to talk about the final polish and steps we took to wrap up this project.

💾 Download and play the game here:

 

At the start of the first weekend, my brother worked on getting ranged attacks set up for the player, so I helped get some of those events set up. Then I drew the art for Maester Beckon, as he seemed like the next most important character to the story.

Then I helped fix some minor bugs with the battles and mask equipment menus. I also updated the enemy's attacks that don't have a range to now display on the player's space, because it was previously not showing any.

I worked on some polish updates next. I added animations to all of the attacks, when the mask cabinet appears, and when you run out of MP. I just used the built-in ones for now, but I think it helps make the battle a bit more exciting.

Then I made some updates for controllers. My brother tried out his PS4 controller and it was working for displaying the buttons in our custom menus, but not the Options menu. So I made some updates to display that in there.

We also thought the button icons were a little small, so I went into the core files and updated the icon size just so it would be a bit bigger. I had to reposition everything because of it though.

Then I started to work on the individual stats for the masks. I wanted to make them more unique with different stats, so I came up with some base stats like Attack, Defense, and HP per mask, and then Attack multipliers per attack.

I linked these stats to elements in the database and was finding out which parameters were available for reference by typing objects into the console. I found that using class stats for the masks and then skill stats for the individual attacks made the most sense, so I set those up in the Database.

Then I set up the Common Event and streamlined it a bit more so it would set the target and then if there's nothing special that needs to happen and it's just an attack, I set it to move on. And then at the end of every attack, it calls a Common Event that generalizes the attack damage formula so it's easier to keep track of.

I spent a day working on movement ranges. I updated it to allow for you to move 1, 2, or 3 spaces depending on which mask is equipped. It took me awhile to figure out the right ranges and spawning tiles, and I even ended up redoing our movement code so it's more simplified and only checks for the horizontal or vertical axis instead of both.

This fixed the bug where you could move diagonally, and then I started to actually add the movement code update to the specific masks. I tested it out with Meushi's and got it working as intended.

This led me to realizing our base attack code was only really set up for Kali's mask, and that's why none of the code was applying for other masks, even if I added them. So I updated that to optimize it and scale up. I'm still working on getting individual attacks programmed in.

I had a long backtrack to getting the movement range working. For some reason it worked in my tests, but when I actually tested it in battle with the mask abilities, it didn't work. So I had to go back to the drawing board and essentially rewrite all of the code and logic. I finally got it working though after a long troubleshooting night.

I took a break from the programming to make some quick little images like the game over screen and then updates to the options and title screens. These were mostly to update with clearer controls or replace some of the quicker defaults in there.

After another day of working on the project, we tied up a lot of loose ends. I started by implementing many of the different mask attacks like the poison and healing ones. All of them were working for the player other than the traps, and I got most of them working for the player too.

Then I worked on the enemy movement system and trying to make the enemies smarter so they wouldn't always move towards the player. There were still some bugs, but they would at least use attacks sometimes before moving!

I also updated the enemy turn icons to use the specific enemy you're fighting against instead of them all using the default Snull ones.

And then while my brother was working on the traps, I was helping with troubleshooting, but also drawing all of the remaining characters. I finished all of the face drawings of the characters.

And from there, I finished the character select drawings too! I added all of them into the game so they're officially all there.

Then we decided we really just wanted to wrap this game up. We had so many wishlist things left and a lot of polish we still would've liked to do, but we had a lot of other projects we wanted to work on, so we really just decided to give ourselves a deadline and finish it.

So during that time, I finally added the defeat animations for all of the characters. Once you defeat an enemy, you unmask them and take their mask, which you can use in battle. I drew the faces previously, it was just a matter of saving assets out to use here.

I also fixed some of the abilities like Meushi and Orangin, where their movement range wasn't set up yet. I did a pretty rough string of events to basically detect if they're out of the grid or going to move onto the player. I probably could've made this code a little more efficient, but I didn't want to spend too much time on it while we were in our final days of wrapping up the project.

I worked quite a bit on trying to fix up the movement overall. I was able to figure out how to prevent the enemy from stepping on the Mask Cabinet space and I updated some of the AI to be a bit smarter with the mask abilities so they wouldn't necessarily always use the ability that costs 0.

Then I updated the battle UI. Some of the buttons were previously overlapping and I wanted to rearrange the buttons so they'd be arranged like you'd see on the keyboard or controller. So I ended up redesigning the buttons a bit to work with that.

When I was making the buttons, I came up with the idea that if you run out of Mask Points, it should gray out the mask abilities to further indicate that you can't use them until you refresh your MP. So it changes the color if that's the case.

I also wanted to update the challenger select screen's HUD to match the battle and the rest of the game. I originally made it before we had done any of the other UI and I wasn't really happy with it. So I updated it to meld it into our theme a little better.

Then I wrote the rest of the story in Ink! There were a few characters I hadn't written story parts for yet, so I wrapped all of those up and then tested the full story.

While doing this, I was fixing some bugs and things that came up with the story, since I wasn't fully testing that. I also added blur effects to the background during the character dialogue to further focus on the characters in the foreground.

Then I finally fixed the bug we were having with the movement squares not showing up on the left after the first battle. I ended up just adding it to call again with a wait and switch because I think it was the timing of how it was loading. This seemed to fix it.

I spent a lot of time working on the enemy AI to try and make it smarter. This involved a lot of condition checking. Essentially I didn't want them to just stop moving if they were backed into a wall. So now it checks if they can't move away from the player and if they're against a wall. If that's the case, then they move the other direction. For example, if they're up against the left wall, they can still move up or down. This helped make them move around and chase the player a bit more and prevent them from using their non-mask abilities.

I did a bit more balancing and updated the values to higher numbers to make the attacks feel more impactful and fun. I also updated the start positions of the enemies so they're different for each character to make the battles a little less predictable.

We did one last night of bug testing and got almost everything finalized and working! We ended up finishing the final tests offline in the next couple of days and then officially finished the game.

Because I had been doing so much testing and playing through the battles, I was also coming up with strategies and having fun with it. So I decided to make a little fun strategy guide here based on what I used to play through the game. I also added an easy mode for anyone who struggles.

So after about 200 hours, the game was officially done. So while we took about 4x as long as the typical GGJ weekend to finish it, this was the most ambitious GGJ project we ever created.

We're happy with what we ended up creating for this project, but we both agreed that we're looking forward to a more simplified project next so we can scope back down and scale it back next time.

I learned a lot while working on this project, and I'm really excited to using that knowledge going forward into my next projects. Thanks for reading through my extended GGJ26 journey this year!

Sunday, February 22, 2026

Macca Masquerade: Post-GGJ Devlog 1

I recently participated in the Global Game Jam, and made a game called Macca Masquerade with my brother! We had a really ambitious game idea, so we only finished a short demo of it for the GGJ.

For the next few weeks, I worked on various bug fixes and improvements to the game. We're still working hard on making it all public-facing, but for now, we have enough updates to share for version 0.6 that's available below on itchio.

💾 Download and play the game here:

 

To start off, I was still doing some bug fixes and scaling up the week after the GGJ. I started by reformatting a lot of our enemy movement and attack code logic so we could scale it up for multiple types of battles. I also fixed the diagonal movement on the enemy and the spawn points of the player's attack squares too.

Then I did some other bug fixes and updating code to make use of variables more. This included updating the random range for the enemy to use variables so we could change it per battle instead of it being set across all of them. And I updated the charsets to use the mask variable so we could dynamically change those in accordance with the Mask Menu more seamlessly.

I also updated the dialogue choices so that on the character select screen, it shows the choices on the right. This way, it's less in the way and you can also now view Kali's dialogue at the same time as the choices.

Then I worked a bit on showing the enemy's attack range visually with squares, like you can see for the player's movement and attacks. I started with just the close ranged abilities since the code mirrored what we set up for the attack range.

Then I updated the code to use the enemy's ranged attack variable to determine where the spaces should draw. So it draws them as long as they're within the grid.

I spent awhile after that working on the Mask Menu. After about half a day, I got everything functioning. You can hover over masks and the information shows up to compare to your currently equipped mask. They only appear after you've collected that mask, otherwise they're a shadow that you can't equip. You can choose to equip masks and when you do, it changes which one is displayed on Kali and the stats at the bottom.

Then I added the Mask Menu to the Battle so you could access it instead of just replenishing MP at the Mask Cabinet. I had to update some of our code to ensure transferring between maps worked seamlessly. This meant saving the player and enemy positions because you'd return to the map mid-battle after visiting the Mask Menu.

Then from there, I decided to add the game loop for the rest of the characters so I could better test out the masks. There were a few weird bugs of things not resetting properly with a second battle, but I fixed most of them and was able to make a general progression that could set us up for when we add these extra characters.

I also optimized some of our code to reuse instances for each character. For example, a sound effect plays when the enemy attacks, so I'm using the enemy character's name instead of hard coding that each time. I also updated how the enemy's charset appears on the battle map using this code.

A small sidetrack I did was update my NW.js and PixiJs files because I was reading that it can improve the performance of your games if you do that. So I was able to actually get Archeia's tool working in a side project, but I decided I wouldn't need to add it back to this project since we were so far along. This did mean that I updated my RPG Maker core files and the project's files to match. I think it helped make the performance a bit better, so it was probably good to do this!

Using the same logic as the Mask Menu, I updated the Battles to show attacks upon hovering so it'd be easier to know what the attacks are without committing.

I fixed a bug where Kali's mask wouldn't show up, then I added keyboard controls to the battle screen. It was a lot harder than I thought it would be to show the current keys based on the keybinds. But now it shows the icon of the currently assigned key. I didn't test with controllers yet, but hoping that works well.

Once I had the keys visible, it was pretty easy to get it working. I just set up my own Conditional Branches to detect which key you pressed, and from there, it loads some Common Events. I did have to recreate the hovering/clicking from the buttons in here though. And the "Tab" key wasn't in a regular Conditional Branch, so I had to use code for that one. 

After that, I added keyboard support to the challenger selection screen. This one was a little more involved because I had to code a whole new input system that checks which character you're currently on and which one is to the left and right of it.

I was having some weird bugs at first where the button displays would randomly disappear or appear and it wasn't consistent when it was happening. I finally tested just adding an additional wait after I turned a switch off, and that's all it took to fix it! I spent about an hour trying to debug it with various other fixes, but was glad that's all it was.

Previously, some of the inputs in the keybind menu were showing up as text like "(Enter)" or "(PageDwn)" and I wanted them to show actual keyboard keys. So I went into the rmmz_core.js to edit some of those keys to new codes (e.g., "confirm" in addition to the default "ok"). And then I added a Common Event that essentially checks if that new keycode was triggered, and if it was, then it converts it to the equivalent input. This way, it would show the intended key in the menu, but still function the same if I wanted to use those other keys for quick navigation.

Then I started adding keyboard controls to the mask equipment menu. This includes moving left, right, up, and down (including moving over locked gaps). It also highlights them when they're selected.

This one was a bit more complex than the character select screen because you can move in more directions than 2. And then I only really want the player to be able to see the masks if they have them unlocked. So it ended up being a lot of nested if statements to check for conditions. I had to copy a lot of events which wasn't ideal, but I couldn't figure out a more efficient method. So basically, I had to code that if you press a direction key, it checks if the closest mask is unlocked, and if it isn't, then it checks the next one, and then if both of those are false, it plays an error sound and doesn't move.

From there, I wanted to really fix up the button mapping in the controller rebind menu. I was having a bug where my PS5 controller would default to some weirder controls like square being confirm and x being cancel. My Xbox controller was plug-and-play, but PS5 wasn't so easy. I usually use the Gamepad tester site to figure out which buttons apply to which numbers, but for PS5, it didn't match what was actually the case in RPG Maker because of differing NW.js versions. It was mainly that square, X, and O were scrambled from the website, so I had to remap them.

It led me down a whole path of developing my own Gamepad mapping plugin so I could safely change those without editing the rmmz_core.js plugin, and then I added plugin parameters so I could edit them straight in the editor.

From there, I had to update up the visuals in the VisuStella plugins. This is the piece I was forgetting during my troubleshooting. First, in the Core Engine, I had to use button icons for which buttons were associated with OK, Cancel, etc., then I had to update the Options Core to show those specific button icons for the new button numbers that I discovered.

 

Then I updated the Message Core replacement codes to display the gamepad buttons if a gamepad is plugged in and a button was pressed.

After that, I went through to just test where the game was at and found some critical bugs that came up after all of the recent additions I made. It was a struggle at first because I didn't know where the bug came from, but it was causing all waits to basically freeze the game. I researched a bit and found out it was due to how I had my common events set up, so it was some interruptions with the interpreter. I eventually called the first common event after the mask menu differently through a script instead of the built-in event command and it was able to fix it. It was a long couple of hours of troubleshooting, but I was relieved when I fixed it!

And that's it for this time! I made a lot of updates on my own throughout these weeks, but we did end up meeting on voice chat a couple of days to finish it out. So I'm splitting this blog post up into multiple parts since it's already getting a bit long. I'm looking forward to sharing the final game once we finish it!