Thursday, January 30, 2025

World Bub: Global Game Jam 2025 Devlog

I participated in my 10th Global Game Jam project over the weekend! We told ourselves we would try to be a little less ambitious with our project... and maybe we were in some aspects. But this was definitely our most complex project yet! I spent a bit of time debugging and doing final playtesting after the GGJ so it's now officially ready to play.

💾 Download and play the game here:

 


Monday - Tuesday: Project Setup & Concepts

So to start out, the theme (bubble) was revealed on Sunday. I created our Google Drive folder, GitHub repository, and empty RPG Maker project first. I like to get these all set up before we officially start so we can dive straight into development during the actual GGJ time. I set up our Google Docs and was throwing ideas in there as I thought of them.

In RPG Maker, I played around with some of the plugins while setting them up. This included a new plugin from VisuStella that allows for quick menu creation! And a new feature in their Events Core plugin that allows you to hide charsets in the game itself but view them in the editor so it's easier to tell what is what while editing.

Then I started to look up inspirations. For some reason I was really inspired by SNES and GBA games to have an "older" feel where it shows small character portrait facesets instead of the higher definition ones I usually make. Maybe it's because I've been playing so much UFO 50, or the fact that we were considering a tactics game and most of those have this style.

So then I sketched out some ideas in my sketchbook for potential dialogue boxes and map layouts. These are all just very rough ideas I did while waiting for the weekend to come so I could start working on the project itself.

I decided to see if there were any plugins that could help with this. I found one, but couldn't get it to work, so I decided it'd probably be easier to just use the usual face image setup, to technically not use facesets, but it'll look like them. So I did some light tests to find the following combination ideal: VisuStella Message Core (for positioning and sizing the box), LWP_Ink (for setting the character name/expression and common events that play before and after messages), and Eli_Pictures (to set the picture to show as a combination of their name and expression). This is how I've shown character portraits in games like Compass Nays previously, so it worked well here too. I threw some placeholder assets in just to test out the combination and positioning.

I played around a bit with controller mapping since I saw that was a new VisuStella feature added. It was a bit more complex than I thought it would be, but I managed to at least have the buttons show and get the remapping system to work. I used the VisuStella icons too since they already had those icons in there, so I wouldn't have to make them myself. I couldn't figure out why the D-Pad wasn't working and I could only use the stick though, so that'll have to be for another time.

I spent some time just organizing my RPG Maker notes about plugins and remembering where everything is so I could be more prepared for the actual game development.

Then I read the World K Eventure that I wrote about 10 years ago and it inspired me to come up with more ideas. I started to think about a system where you challenge characters, and they join your team to add to your abilities in the next battles. So I came up with a few ideas for different menu screens and how that information could be displayed.

We chatted a bit over text about our ideas and different inspirations. At first we were thinking of doing a classic Tactics game, but then we started to think we wanted to do something beyond that and more unique. So we figured we might add some kind of "card" and "deck" mechanic to it.


Wednesday: Brainstorming Session

 

We had a voice chat night where we talked about ideas and they started to evolve! We decided it would still have some tactics movements, but be more focused on the card aspects. Instead of being full maps to explore, it would have more of an overworld and be focused on the battles. So we brainstormed a lot more. We made a full asset list after coming up with more ideas and inspirations.

Then I did a few more sketches. Mostly trying to figure out the battle system and then also coming up with some ideas for the shops, the victory screen, and what the overworld could look like.
And from there, my brother looked up some royalty music we could use, since that's something we usually save for the end, so thought it'd be good to get a headstart on that. Then I started on the card database. I figured out the basic fields that we'd need for the cards and put together a rough list of a bunch of cards (many of which we likely wouldn't get to).
So we had a really successful brainstorming session and made a lot of progress on our ideas and overall direction!

Thursday - Friday: Sprites and Battle Setup


I started on the first overworld character sprite for our main character, Piko. I drew the front walk cycle first, then proceeded to draw the other directions. I exported the sprite sheet and then imported it into RPG Maker.


Then I finished setting up the framework for the nanDECK files with very placeholder visuals so we could quickly update them once we have a layout. I based a lot of the code for the nanDECK file on the one I made for Nay Saga so it'd go faster.

Then I imported the Google Sheets data into RPG Maker and set up some of the basic Database elements so we could finalize them later.

Then I drew the face drawing for Piko! I decided to draw a few expressions of him in case there's time to implement that. I also added more details and some shading on him since he's the main character.

I finally started on the game mechanics. So I started with making a grid system. I researched Tactics plugins a bit, but none really did what I wanted it to do and would be too involved to learn for the GGJ, so I decided to just make my own with events.

So I set up each of these spaces that takes up about 3 tiles with 1 tile between each of them. So I just had to have the enemy move 4 towards the player to make it work.

Then I started the long endeavor of the card mechanics. I mostly took the bones from my Nay Saga card game, but was trying to strip it down to only what we needed and modify it to work for this game. I created a mechanic where you can only use 3 bubbles per turn and cards discard as they're used. It was still a little rough where the deck wasn't removing cards and the cards wouldn't remove from the bottom after being used, but it was a starting point!

Then I took a break from programming to work on some of the character faces. I wanted to do more details like shading how I did with Piko, but realistically I knew there probably wouldn't be time, so I tried to finish them pretty quickly.

Then we went to bed around 6 for the night so we could rest and be ready for the next day!


Saturday: Character Face Art and Final Card Mechanics

 

I got a later start on Saturday because I wanted to make sure I got at least 8 hours of sleep on Friday for what was to come. I started the day by working on some of the character faces so some of our characters who are more central to the story could have portraits. I had fun with the ghostly effects on Poproy.

Then I spent a lot more time on programming the card battle system. The cards now visually remove when you use them and they add to the discard pile. Then, at the end of the turn, the all discard.

I took a break for dinner, then came back to work on more character faces while my brother was working on the lighting system in the game. I decided to actually add shading since it really adds a lot of polish to them. It also meant they would take slightly longer to finish though.

Then I spent a lot more time on programming the card mechanics. It was to the point where I was mostly writing pure code instead of working in RPG Maker. My brother and I hopped on a screen share to figure out the discard, drawing, and shuffling mechanics in p5. It was really helpful to talk through the code together and collaborate on this.

I added that code into the project and finally finished the basic mechanics. My brother finished the card designs and added some of our existing art, so I added those to the game as well.

Then I made a Common Event that sets up a system where we just have to change a variable value to call this event and do these actions. This event basically pushes that card ID into the deck's array and shows you a message that you obtained the card. This made reuse of it a lot easier.

 

Sunday: Story, Battle Loop, and Final Touches


Not that I slept Saturday night, but transitioning into Sunday, I started to finalize the character art. I finished most of the character art and used nanDECK to auto-populate the cards with the final art and text that would appear on them. My brother designed the card layout though.

I also made the title screen art. I saved all of the assets out and then implemented it into the game using the title plugin.

Then I finally started on the dialogue for the game. I used Inky to write all of it and started listening to the music my brother found earlier to get in the mindset. I picked out which songs would play at which parts between all of the options he downloaded and then had something there for each part along the way.

Then I implemented the HP bar for the player and enemy. I mostly reused what I made for Compass Nays originally and reused for our Biggert City Battle Show game last year.

I added an end to the battles with some text boxes that indicate what rewards you received and that you've won or lost, depending on your health.

My brother added the dialogue boxes and then I added the Ink aspects to the game so the dialogue was implemented in the parts they were supposed to be.

I didn't have time to draw any character sprites on the map, so my brother edited the face drawing I did of Chilzby to add him to the lounge on the screen.

I added some onscreen buttons you could click to save or open the options screen and view some of your stats.

We were really just pushing this GitHub project back and forth and doing final bug fixes from here! It was definitely a race to the finish. By the upload time on Sunday, we only had 1 battle actually working, so that's what was showed during our location's livestream, but it was at least working up until that point!


Monday-Tuesday: Bug Fixing


As usual, our game had quite a few bugs because we didn't have a lot of time to playtest the full game loop. We were playtesting a lot of mechanics as we were making them, but it wasn't all fully put together until late Sunday. So I spent most of the day Monday fixing bugs that we found during those final hours.
 
I made a new switch that'll help internal testing where if it's on, it skips all of the dialogue in the game. This way, I could still test the game's switches/variable progression, but more quickly. I did it this way so I wouldn't forget to unskip the dialogue in any spots later for the final builds. I want to do something like this going forward for projects so it's easier to export builds without these types of bugs.

Then I was troubleshooting all of our biggest bugs. I finally got more than one battle to work. I think it was due to my health bar system or because we didn't properly reset all of the variables at the end of each battle. But then I ran into an issue that I thought was unsolvable until I looked for external help.
 
After each battle, you would mysteriously lose cards. I eventually found out it was because I was using a deck variable that tracks cards in the deck. I found out that even when creating a fresh variable, that variable would magically change even though I didn't reference it at all other than initializing it and when the array for the deck sets its own value equal to those.
Well then I found out that apparently if an array takes the value of another array, it will change both of them if you try to change one! And I found out this is apparently something that just happens in programming.
 
So I dove into p5 and started to test. First I tested and it indeed was the same and not an RPG Maker issue. So I tested manually pushing values one by one from one array to another, and that worked. So I then put together a loop that loops through the other array's values and manually pushes every single one of them so they were different. This fixed my issue and it was such a huge breakthrough!

So I ended up spending the rest of the day debugging the project and finally got a working build from start to finish. On Tuesday, I ended up adding some mechanics after everything was working. I added battle animations to the attacks using the built-in defaults but with custom sound effects.

I also updated the Player/Enemy Turn starts to be image files that now appear in the center and tint the screen. I added a bubble animation for the progression symbol at the bottom too.

I moved the text boxes in the battle to be in the top-right corner using the VisuStella Message Core plugin and made a box for it to fit into.

And then I finally added the card database! It was pretty easy to copy over from Nay Saga. I just tweaked a few things to get it to work with this game.

And from there, I uploaded on itchio! The only feature I added after that was the shops. So you can buy more cards by using the money you earn.


Post-Mortems


I learned a lot from this project and as I mentioned earlier, this was definitely our most advanced GGJ project. While I'd like to plan for next time to be a scoped down game, that was also a goal for this year... but we were just so passionate about the project and having fun with it that we didn't scope everything down. We did anticipate some areas wouldn't make it in and scoped down a bit as we went though, so it was at least going in that direction!
 
Something we started to do on this project that I want to continue is reusing code through Common Events as much as possible. We did this with our battle system. So once we finished 1 battle, we were able to really scale it up to 10 without much effort. The same goes for cards. Once we had the mechanics in there, we could reuse a lot of those features without a lot of extra work (for the same type of card at least). This was a really smart way to work and it saved us a lot of time in the end.
 
And speaking of reusing code... I had a lot of the fundamental code written out from Nay Saga already, so that was a huge time saver. I also reused code from Compass Nays and Biggert City Battle Show. It helped me drop mechanics in and fit them with our specific game better. I do wish I had more time to organize the Common Events and variables a bit more though, because there were times when I forgot which ones were in which order and the variables were kind of scattered. So I'd like to spend more time organizing that in the future.
 
And while I had those basic mechanics down, there was a lot that needed editing for this specific game. So using p5 for quick JavaScript functions also saved a lot of time. It was a lot quicker to prototype and iterate through. So that's something that I really learned from Nay Saga and brought into this project too. Troubleshooting the code also went so much faster when we were working together. So I really liked that if we were stuck on code, we could just look at the other person's screen and help them through something complex.
 
Another bit of reusing we did on this project was reusing art assets for the preliminary card art and art that we didn't get to in the beginning. It was a great way to have something there that was technically finished and our own art, but just not made for this project yet. That made me less worried about working on the art before core programming mechanics were done, since our placeholders weren't super rough and in need of replacing. We ended up replacing it all by the end, but it helped us move along on the core mechanics better and I wasn't as hesitant to make in progress posts along the way.

I talked a bit about what I learned about arrays in the section above, but I did learn more about how those work and what you can and can't do with them. Another post-GGJ lesson I learned was making use of a playtest switch. We always end up missing something in our first upload because it's crunch time, and we only notice when our GGJ site organizers are streaming our game. So I'd like to prevent that earlier. Last year we learned from that and made sure to make a list of a few things to check before the upload (the player start position, unskipping the title screen, etc.), but we didn't have unskipping the story dialogue in there. So making use of a script that only skips during playtesting will really help with any last minute uploads we need to do.
 
And with that,we really get caught up in the mechanics and making sure everything is working independently and playtest a lot there, but we didn't spend enough time playtesting the game as a whole. Usually the game loop with the full writing and progression is done fairly late in the process, so we don't really test the full game working together until very late. This year that led to some real game-breaking bugs. So if we're able to even put some placeholder ink scripts in there and get that progression going earlier on, that will help us spot any big bugs like that before we're in the process of uploading our final version.
 
It was really helpful that we found our music earlier this year though, because that's usually one of the things we rush towards the end. It helped with writing the dialogue in the scenes.
 
When I was working on bug fixes and finalizing features afterwards, I made use of more sound effects, but that's something I'd like to bring earlier into the process. It really adds more polish and that "juice" to the game, so it would be good to add those earlier.
 
I also replaced various other assets at the end to finish up the polish. That included images like the "window.png" where I made note of which area highlights on menus but doesn't have a background. This is always something I forget when I'm quickly removing the default background.
 
So overall I really enjoyed this project! I was worried we weren't going to have a finished project, especially when we had game breaking bugs towards the end. But because of how easily we could scale the project up, it ended up being a complete project! And I was able to get all of the game-breaking bugs fixed within a day after, so I'd say that was pretty good.
 
The Global Game Jam continues to be one of my favorite yearly traditions and I've learned so much and had so much fun. I can't wait to keep working on fun game dev projects! Thanks for reading this post, I really like reflecting after big projects like this to see how much I've grown over the years. I hope you learned something or at least enjoyed hearing about my process!

Sunday, January 26, 2025

Nay Saga Devlog 4: Card Design, Game Type Brainstorming, & Physical Prototype

I took a break from doing game prototyping to work on some of the visuals and the art of the cards. I asked my friends for some feedback on the card designs I had designed already and from there, I iterated some more. I also did a lot of playtesting to figure out the rules of the other ideas I had!

My friends had suggestions to mix and match a bit like with a straight border for the top and curved for the bottom, so I thought that would be interesting. I sketched some ideas and came up with a new idea for another couple of symbols I could add. One for their importance in the story (which could be a number) and the other by the general time frame that they first appear (which could be one of three symbols, each representing one of the three main arcs). I'm not sure if this is adding too many extra parts and unnecessary symbols, but I thought it might be fun to think about, since I had some game ideas for it. But overall... I decided I probably already have enough symbols to keep track of, so ultimately decided not to add those in the end.

Another piece of feedback I got was that the blue I was using in the prototype as a placeholder shouldn't be final. While I didn't intend for the color to be final, it did get me to start thinking that maybe I should start coming up with a color palette. Color palettes are usually fairly difficult for me, so I opened all of my inspirations and analyzed their color palettes and how they work. I came up with a rough color palette for the card colors, just to try and find some that looked okay together.

So then I did some redesigning of the card. I'm starting to like the look of having the straight edge on the top and a curved version on the bottom. And the more I do these, the more I'm realizing I want the full body in the front as well. I'm still not sure what to do about the back, whether I want one character or it repeating, but I'm getting somewhere. I also updated the colors so they might be closer to what's in the final for the blue.

I did a few tests with colors and changed them around a bit when testing how they'd look with the characters. I did mock-ups of at least one of each type, and the 18 prototype cards I've been working with in the digital version. I drew the traits I needed, at least first drafts, and then I used nanDECK to automate saving out the cards.

I found a new process to batch open/crop/resize images in Photoshop and then used Google Sheets to rename them all so I could make them the smaller sizes that I use in the RPG Maker game. It's a lot quicker than having to do all of that myself, so it worked out pretty good.

And then I imported the files into RPG Maker and got to see the new updates made live with what I had so far! While the designs aren't final, it looks so much better than the tests I've been working with in the past, so I'm excited to see these populate in so quickly with all of the automation that's set up.

Then I started to brainstorm ideas for the other game types. I was trying to come up with names for these modes as well, but still thinking through those. For the Type Battle one, it's a game where you're trying to end the game with no cards left, kind of like Uno, but you have to match types. If you match traits, then certain things happen in the game like having to swap cards with other players, looking at their hands, and more!

I also thought about ideas for the Match Traits mode. For this game, you have a pile for each type/trait of the character cards, and you have to take turns playing your cards in each pile until you run out. So you're collectively building upon each other's cards and can only play cards if everyone has played at least one in the pile. If not, you have to draw more cards until someone runs out. When they do, you count up how many cards everyone had in each pile. The player who has the most amount in each pile loses that hand, and the player with the least stacks wins. This one will definitely take some testing to figure out if that's how it all works, but I like the idea of it so far.

I spent some time playtesting on my own with some classic playing cards to try and get some rules down for the two games I hadn't made digital versions of yet. I was mostly testing the Match Stacking game. I played at least 5 rounds with variations to try and figure it out. It’s definitely the most fun with 4 players, but I’m trying to find ways to make it fun with 3. The first round I played was with 4, and I changed some rules so you just have to play the card in the stack with the person across from you. You can only play if the person across from you has played a card or if no one has; you can’t if someone next to you has in that pile. This required the most strategy and drawing of cards, which made it more unique.

Then I tried with 3 players where all 3 players had to play before you could play again in a stack. This one finished without using the whole deck, but everyone tied and it went fairly fast. So if this is a method, I might think about dealing more than 7 cards so it lasts longer.

Then I tried 3 players where they could play in any pile, but then after all three play their cards for that round, I drew a random card, and that would flip over one of the piles. This would shake up the scores a little bit and be more interesting with how they were played, but it means there’s not really any drawing of cards or skipping turns, so they kind of just would win based on if they were lucky and got a good hand.

So I tried another 3 player game, but this time I tried to emulate the 4-player game. This time, I played with a "CPU" character. Each player would be paired up with another player or the CPU for the pile, so then they could have a different rival for each pile, so one person wasn’t just stuck going against the CPU. This made it kind of more like the 4-player version I enjoyed most, but because the CPU is random and not playing by strategy (it just draws a random card and plays that), it made some of the players get "stuck" not being able to play for multiple turns, which kind of made it a little less fun in that regard. So I might think about trying to create a "hand" for the CPU instead to see how that goes. To keep track of who was rivals for each pile, I also used colored papers to track that, so it’d be easier to tell who is which.

Then I tried a simple 2 player version to see how that would go. It was definitely the least exciting of the three player versions that I tried. I tried to come up with ways to make it more exciting for next time though, so it might improve it a bit.

I decided to finally print the first iteration of my prototype so I could have a physical version and test with actual cards. I've only been working with the cards digitally and haven't tested with any real people, so I wanted to prep those and have them ready to test in case I was able to grab some friends to try it out, or test on my own with the actual cards.

Then I tested the Match Stack game with the actual cards and was a lot more exciting! I did a 4-player match because that's what I enjoyed the most originally, and it was good. I decided to lock in traits to require more strategy, so depending on which trait is played (e.g. summer birthday), all players have to play that for the full game (can't play something like a winter birthday after the pair is flipped). I've been thinking about changing up the rules to see if I want to see whoever has the most piles wins instead of whoever has the least piles. I might have to test with real players to figure out which is more fun. I do want to play around with more balancing so it's not tied to just the people across from you as well though.

Then I finally tested the Type VS Battle game, with 3 players. This one ended up going on for awhile but was pretty fun. Because the weaknesses are in trios, I made up a new rule while I was playing to break out of the trios if you play a type that's strong against the card, then you can play an additional card outside of that trio (or in it) to switch it up. I might think about adding the weakness/strong vs types to the actual cards to make it easier, but the cheat sheet works for now. 

After printing, I realized that I think I prefer the card designs with the shoulders up so it's easier to see the characters. The full body ones are kind of hard to make out the details on such a small card. So I was glad to test that out to have a better idea for the direction to go with those.

Then I decided to print more cards so I could have another ~20 added, and I tried to balance which types and some of the traits that they had so I could test better. I also updated some of the colors so they could hopefully print a little better.

And then I made finished versions of all of the trait art. There are a few I'm still deciding between, but I at least have a basic symbol for each of them now. I decided to rename some of the traits and am still trying to finalize those too.

I added the traits to my massive Google Sheet and started assigning some to the characters that I'm planning to add to the game so I could start figuring those card details out and balance where I need extras. I spent a few nights filling out details in here.

Then I decided to playtest again, but with the extra ~20 cards I printed, so I'd be able to more accurately test. I tried out the stacking game and instead of the way I had been playing it, I tried a new method. This one plays in a way where you stack on piles and count how many traits match, and you're trying to win more points by matching the most traits and by being the first in the pile to play a card. This way, it was a bit more fair and involved blocking people out of playing less.

I kept iterating on this and doing more playtests. I tried to stack characters more so that once a character is played on a pile, their traits are now what the players are looking at, and the first character's aren't applied anymore. I also added some tokens and tiles (temporarily using ones from other games until I make my own) and it helped me keep track of scoring more and who played which card. I really liked this one a lot more and it made it start to feel like its own new game. I was having fun playing it, which was great!

For the next playtest, I tried a "3-player" game, but used 4 rows, so it would require a bit more strategy. I also used different tokens for tracking points and having those actual numbers was a lot easier for keeping score than just individual ones. I added a new rule to draw a card after each turn so it provides more strategy and variety. And then I decided it'd be more fair to have the player with the lowest score so far go first for the next round, so they'd have a chance to catch up more.

Then I tried playing a "6-player" game with 7 rows and while it was a little hard for one person to manage being 6 people, I do think it'll work well with that many people when they're real people. I also tried out tracking the order that they're going in for each turn with colored tiles and that was really helpful for keeping track of that throughout.

Next, I tried the Type VS Battle mode and it was pretty easy and straightforward. So I started to think about how I could make that one a little different and more unique to make use of the traits and everything. I came up with a new mode for collecting matches. You basically need to get 5 of the same type in your hand to win the game. Depending on what card you discard and its relation to the previous card in the pile, it allows you to do extra actions like trading a card with another player, they choose one from your hand, reverse the turn order, etc. The first time I played it, it was pretty long and was difficult to get a full hand, but that's also partially because I knew everyone's hands too.


While I enjoyed the type match ups for this game, I thought it might make it even more interesting to involve some of the traits a bit more. So I tried a few variations. My favorite was to allow you to match types, birthdays, or traits, but not world, gender, or category. I tried a game with all of them and it ended after picking like one card because there's too little variety that they match fairly often. So overall, this is how I enjoy playing this mode most.

So overall, I did a lot of playtesting this time! I think I'm starting to figure out the game modes on my own, so I may be ready to start playtesting them with actual people if I find a group that wants to test it out.