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!

Sunday, February 15, 2026

Escape from Tag World Devlog 7: Final Game & Post-Mortems

I finished my second physical card game project, Escape From Tag World! This is the last blog post about this project as I wrapped up all of the loose ends and it's officially posted now.

Here's where you can find the game online: 

🎲 Play digitally through Tabletop Simulator here.

🃏 Physical version for sale on TheGameCrafter here.


🎮 Landing page on itchio here.

📄 Information & listing on BoardGameGeek here.

 

To start off, the final version of the game arrived in the mail, which meant I got to finally play it with the final cards! It was fun and I was happy with how it all turned out. I made a list of what all I didn't have to print for my own copy of the game since I printed a few extras that I didn't fully need.

Then I made the how to play video! I recorded the video footage, then a narration to go over it. From there, I edited the clips together. There were a few parts that I wanted to add more footage to though, so I went back and re-recorded some. 

 
And with that, I ordered the final copy! I just had to finish a few final posts and then the game was officially wrapped up. The game itself was finished and printed by September, so the last couple of months were just putting together the how to play video and getting all of the online posts finished up.
 
So with that, there's not a lot to show for this post, but I officially am done with the project, so I wanted to take some time to reflect on the project as a whole!
 
Overall, I clocked around 240 hours for the full project. I wasn't clocking my hours back when I worked on Nay Saga, but I can imagine this time was a lot less because this project was much smaller. And for comparison, my GGJ project was around 102 hours (with the post-GGJ updates) and my RPG Maker Game Jam project was about 140 hours. So even though this one was worked on for a much longer period of time, it wasn't too much more time.
 
The goal of this project was to scope down from Nay Saga, and I think I did a good job with that. As you may have seen in my yearly recap post, I worked on a lot of game projects in 2025, and I wouldn't have had time for that if I tried to make another massive Nay Saga project.
 
For Escape From Tag World, I focused a lot on the game mechanics. The part that made it a bit more involved than Nay Saga was the balancing because it has more strategy. With the character abilities, Birdian and Point costs, etc. it really became a much more complex system to balance. But that's what made it a lot of fun to work on.
 
I thought I did a lot of testing with Nay Saga, but I would argue I tested Escape From Tag World more. I definitely did more tests in Tabletop Simulator and then each game took a lot longer, which made testing more involved. I recorded 24 playtests for Nay Saga and 20 for Escape From Tag World, but 1 game of Escape From Tag World would usually take an hour or more, while with Nay Saga, I could test individual game modes that went a lot faster.
 
Overall, because I had figured out the process of making a card game with Nay Saga, a lot of the actual development went faster for Escape From Tag World. I didn't have to learn nanDECK and its connections to Google Sheets or figure out how certain assets needed to be formatted. I also reused a lot of assets like the drawings of the characters and group symbols. So with a lot of that knowledge, I had the time to focus on those more advanced mechanics.
 
Another aspect that made this one easier was that I was trying to make it into more of a card game instead of a board game, meaning that I wanted as little extra pieces as possible and challenged myself to fit it into a very small box. It ended up having a few extra pieces to help with tracking scores, but overall can be played with just the cards.
 
I also didn't create a digital variation for this game. I briefly thought about it, but I had to remind myself that something like that would be out of the scope of what I had planned. So I reeled it back in. This happened with a few different instances, and I'd say I restrained myself enough to make this game smaller, as intended!
 
So overall, when comparing the two, I do think that Nay Saga is more polished, because that's what my intentions were for that project. But gameplay-wise, I'd maybe say Escape From Tag World is more fun. 
 
After officially playing a 3-player game with my family, I did realize that the downside of this game is that it's very long. They liked the aspects of building up your deck and gradually getting better cards, but after 3-4 hours of playing, I was the only one with any Linkship Pilots, and we decided to shorten it to just needing 2 because of how long it had been going on. I suppose I should've calculated it and realized it would be about an hour or two per player if my 1-player games were turning out to be at least an hour, but it didn't occur to me until we were actually playing it. So a good reminder that there can never be enough playtesting!
 
We decided that for next time, we'll try cutting all of the Linkship Pilot recruitment costs in half and see if that cuts down on time at all to feel like a better time. And if it does, I may consider updating and reprinting those cards so the game doesn't go on quite as long and can be a bit more digestible.
 
I didn't originally think I was going to make a second physical game, but I'm glad I did because it was a fun project and I'm happy with how it came out! I'm not sure if I would make a third board game because I do overall prefer making video games, but who knows what the future will hold.

Sunday, February 8, 2026

Escape from Tag World Devlog 6: Rulebook, Final Printing, & Tabletop Simulator

I'm in the final stretch for my Escape from Tag World game! I'm working on finalizing the prints and any extra assets left to do before wrapping it all up.

While waiting for the first round of prints to ship, I started working on the rulebook. I started with a Google Doc where I wrote all of the rules and chunked it up for the final intended layout.

Then I did some quick thumbnail sketches to figure out the layouts and ensure I planned out the 20 pages properly. I had about 1 page that I could spill over if needed in the final version, which was good.

It took me awhile to actually compile it all because it's probably one of my least favorite parts of working on a physical game, but I did it! Laying things out is usually the part where I lose my motivation, and maybe part of it is because it feels a bit like work? But either way, I laid it all out and just had a few notes to go back and update, but then it was ready for print.

Then I took a break from this project for a few weeks while I waited for the print to arrive. Finally, the first round of prints came in so I was able to see how they all turned out! I had a few very minor notes that I thought could improve it, but also I didn't want to make too many drastic changes that might change and cause other things that I couldn't redo. So I decided to make the changes fairly minimal.

The only print error was that they ended up not UV coating the cards. So when I went to test out writing with a dry erase marker on the card, it didn't erase. So I reached out to their customer service and was able to get it sorted out.

After that got sorted out, I did a final pass on all of my assets. I decided to actually change the Linkship Pilot symbol in the top left because it was bothering me to be so pointy. So I rounded the corners and I think it looks a lot better! Then I officially ordered the final version of the game through TheGameCrafter.

From there, I did a final export on all of the assets and sent the final version off to print! This meant taking another few weeks to a month break from this project again. But during that time, I started to 3D print all of the Linkship pieces that I needed. It's 8 pieces per game, and because I'm making 2 copies, that means 16 pieces total. I had a couple already created that I decided I could use for my own copy of the game for the time being. I also wanted them to be blue, but I only have green filament right now, so I used some paint markers to paint the 3D prints.

Then I spent some time exporting the cards and assets out for use in Tabletop Simulator. I imported the cards in and that was pretty straightforward, so then I started to import other assets as well like the tiles.

When I started importing the 3D model of the Linkship, a lot of the faces were inside-out, so I realized the normals were flipped. This didn't affect my 3D prints, but it did affect how it displayed in TTS. I don't have a deep 3D modeling background, but I was able to figure out how to flip the normals in Blender and then fix some of the N-gons that were also causing display issues.

Then I continued to customize the TTS game with custom theme and placement of parts. Eventually, I got it all imported and set up for players to pick up! I did a playtest in TTS and made some final updates. So I uploaded it to Steam Workshop and got some in progress screenshots for the page while I was doing that playtest.

I also worked on the itchio page layout to customize it and use assets. I don't think I'll actually have anything downloadable on there, but it's kind of the landing page for this project so it basically links to everything else.

And with that, the project is getting really close to being wrapped up! I just have a few final areas to focus on when the final print arrives like making the how to play video and taking some photos. After that, it's just setting everything to be queued for final upload, then it'll be done! The next post will likely be my last post for this project.