Posted July 08, 2024 by callmeDJ
One of the driving forces behind the making of H&TCoT was the opportunity to test out a brand new battle system unlike anything I had done before! While Stuck in the Liminal technically counts as my first original battle system, it pretty much ended up being Omori and still held fast to traditional JRPG values. My goal was to create a puzzle-style battle system which circumvented the classic mash-attack pitfall so many JRPGs easily fall into. Heck, even I fell into this last year when Human steamrolled Stuck in the Liminal by turning Red and spamming Tackle!
Let’s sum up the prologue real quick. I wanted something that practically had no stats or leveling, as it always ended up taking up way too much time or not turning out amazingly. Numbers Go Up isn’t exactly a big deal in a half-hour jam game anyway. After a prototype for a game mechanic involving stacking states that went sour, one particular encounter where you could only win by applying three stacks stuck out to me. It turned into sort of a puzzle RPG battle system where you launch cards at enemies in a specific sequence. While I almost sat out on it after not having time to prototype the battle system, I ultimately decided to bring it back because I wanted a battle system and liked it too much to scrap it entirely.
I did have to change a few things around a bit, such as what each state actually did. Shifting the setting from a generic JRPG village to an island and having the heroes forgo their weapons made me think about what natural resources you could use to interact with enemies. I settled on bonking them with rocks and coconuts, feeding them, blinding them by throwing sand or dirt, and burning them by rubbing sticks together and throwing them. There’s our core mechanic, but how do I limit quantity of specific attacks rather than a universal MP meter?
Of course! Items! They can even inflict states without any extra coding!
This realization made the battle system finally click and helped influence the gameplay from there. You’d find items in the overworld and use them against enemies in combat.
But wait! What if you run out? Simple! Just add a skill that takes a turn to gain two random items! This also made me realize this battle system felt very much like the Pacifist route in Undertale, especially since I had come up with flavor text to give hints for each enemy just before. We'll get into that later.
An early pitfall was finding out you could essentially solve enemy puzzles in reverse. For example, if an enemy had to be Bonked and then Burned, you could Burn the enemy and then Bonk them and immediately solve the puzzle while skipping the Bonked phase. It took a bit to figure this out, but I settled on immunity for each state. Going back to the above example, the enemy would have immunity to all states except Bonked at the beginning of the fight. Once you Bonk the enemy, it gains Bonk immunity but loses Burn immunity. All of this was done using troop events at the end of each turn, but I want to see if it’s possible to have these effects apply immediately.
But what do enemies do in response? Do they just attack you? How? There’s no HP in this game! Do they inflict states on you? How do states affect you? Can you only take so many states before you pop? This held me back for a while, and NatePlays95 eventually nudged me enough to put in- horror of all horrors- a health bar. 5 HP. That’s it. That is your only stat. Enemies can attack you for 1 HP. Some enemies can do 2 HP and take a rest turn. You can also Heal for 2 HP. That’s it. Now combat is based around solving each enemy’s puzzle while watching both your items and your HP!
It also immediately gave me the idea to have enemies be able to counter-attack if hit with the wrong state. I did this by making a new set of Counter states like the Immunity states. I then baked a conditional statement into each state’s Custom Apply Effect that executed a common event with a variable ID if the enemy had the Counter state. This variable would be set to the number of the skill for the enemy’s counter-attack so enemies could counter differently. In general I’m a big fan of using variables to make things faster, easier, and more dynamic.
I wanted to find more ways for enemies to attack than just raw damage, though. I found ways to get enemies to steal your items, which in this context is just as important of a resource as health. I pretty much yoinked a Yanfly script for this, and the amazing Unhinged [C]reator helped make the script short enough to fit in a common event for a counter-attack. I also initially had enemies able to heal and pretty much reset fights, but that got buggy and more importantly extremely annoying so I just nuked it instead of refining it further. To round it out, I had the Tikis be able to prevent you from Healing or Foraging, which received mixed feedback but is a decision I stand by nonetheless.
Flavor text for enemies quickly became an important component of H&TCoT, as the game would be complete trial-and-error memorization frustration without a little hint to guide you here and there. In theory this was a good idea, but I still don’t think I wrote most of the hints well enough to truly make any sense. You could argue that you really have to think about it instead of having the answer given to you directly which was my intention, but I still think some of my wording was vague and awkward.
The intention was always to have it appear at the top of the screen when choosing your next action, but I wasn’t sure how to do that. Options such as Gab Windows and pictures were considered, but I decided to just use plain ol’ messages as a placeholder. Unfortunately this not only made fights longer but forced you to remember the hint instead of just seeing it at the top of the screen.
The ultimate solution was a freak accident while eventing the Door fight. I had been manually pushing messages to the battle log when guessing the right or wrong key to open the door, but the battle log messages stayed afterward! If I could just change it to the enemy’s flavor text before the turn ended, it could persist into the next turn! Obviously there was a lot of finessing that needed to be done to get flavor text to show and update on every turn of every enemy encounter, and I can’t thank Violet Spinel enough for his Silver Daze battle log wizardry. I’m beyond happy I managed to pull this off, and I learned a ton about MV scripting along the way.
Overworld gameplay ended up taking a backseat to the battle system. An early blocker was not understanding how to handle enemy encounters. I obviously didn’t want to do random encounters because they’d get annoying fast, and as partial as I am to on-maps I didn’t want to deal with enemy detection again. Doing that in Stuck in the Liminal very nearly killed me. I also planned to have set locations for items but have the actual items be completely random every time. Once I made the first half of the game a collect-a-thon, I decided that I’d bake a set item drop and an enemy encounter into each piece of gear you collected. Simple and straightforward to event without blowing up the game too much! It also meant every encounter could be a new, unique puzzle to solve.
As I mentioned in The Process, this game has its flaws. Enemy transform and defeat conditions occur at the end of a turn, meaning you can technically win a battle and still lose if the enemy defeats you before the end of the turn. I also feel like Foraging could be a little less random, as you can easily go through at least three Forages until you get the right item. Vague flavor text has been a recurring complaint, and although that’s not hard to fix it makes me wonder if maybe there’s another way to handle hints such as more obvious enemy design. I was also just informed by Nate right before posting this that I should have had fights reset instead of yielding a Game Over upon losing. I appreciated in other entries but never considered it for my own. Another one for the Definitive Edition checklist.
The most notable issue is the conditional statement for immunity and counters in the Custom Apply Effects for each state; the culprit behind the infamous softlocks! I had the Custom Apply Effect remove the state outright instead of finding a way to decrease by one. Taking a particular fight near the end for example, you start by Blinding the enemy who then gains Blind immunity. If you Blind the enemy again, Blind immunity activates and the enemy loses Blind. The Turn End event checks if the enemy is blinded after every turn and advances the fight if so. Since you cannot re-Blind the enemy due to Blind immunity, this means you cannot progress through the fight any further. The comforting thing is the solution is harder than I thought; it’s not just a simple code tweak I could have easily done during the jam.
With that said, I still believe this battle system not only works in theory but can be expanded on! There could be new states and types of items, attacks utilizing combinations of items, trading items, crafting multiple items into a stronger item, enemy healing done right, the whole nine yards. It could even be altered to use a more conventional MP meter which all attacks borrow from. This could even be the solution for Forage spam, as a simple MP heal means being able to instantly use any skill again. Man, am I just reinventing the wheel here?
I’m even willing to take a lot more from Curse of Teebeyae than just the battle system! I’m a little addicted to the Game Boy aesthetic, although I may have to go the Game Boy Color route if I want more item types with clearly identifiable colors. I would even like to reuse some of the music! The island and normal battle themes are too good for a short, flawed jam game IMO. I’ve even gotten permission from a special someone to potentially use the normal battle theme somewhere else!
If I am to expand on this concept then I will need to completely revisit it from a coding/eventing standpoint. Right now the game is purely designed around one-on-one combat with a universal variable for the enemy’s state stacks. If accommodating encounters with multiple enemies, they will need to have their own self variables for stacks. I implemented these self variables in the Saturation prototype but forewent them in H&TCoT to save time. Even then, maybe it's better as fully one-on-one combat a la Pokémon, trading card games, or the Pokémon Trading Card Game game.
But wait, who is that special someone I had to get permission from? And how did the music I so desperately want to reuse come to be? Tomorrow, we’ll be taking a look at Music: Tracking with Blistering Agility, where I write music faster than I ever have in my life! You may get a little more than you bargained for tomorrow, so stay tuned!