Devlog #7: Overcoming Design Problems


Header image: battle view showing Narilla vs Najmagi with the devlog title on top

 

Hello, wonderful humans!

It's been a while since my last devlog... I'll try to be more consistent with this! A lot has been added and changed since the last entry. I want to write a bit about the design process I had when finding some problems and how I chose to tackle them.

  

Actio = Reactio

The biggest change was the reworking of the enemy turn and scrapping the retaliation move idea completely. That was a difficult choice as I really loved the "actio = reactio" concept in which an enemy action only occurs as a response to a player action, putting a lot of agency and control into the players hands. Want to do a lot of moves this turn? Better prepare for retaliation in return! The twist, however, was that the enemy's trick exhausts after a use and cannot be used again until next turn. That meant there was a sweet spot that the player could reach after which the enemy is completely exhausted and cannot retaliate anymore, giving the player free attacks (if they had dice left). I loved the idea of rewarding both ends, being cautious with your tricks and therefore receive less retaliation, or being so good with your dice and spending that you can overwhelm the opponent.

The system was inspired by Powered by the Apocalypse TTRPG rule set in which the enemies actually have no turns but depending on the player actions and their rolls, the GM gets to make a move in return. Unfortunately, I ran into design issues with this system that became problematic and I wasn't able to solve them within this design framework. So what happened?

I couldn't solve the answer with how to deal with the round end. Once the player had spend all their dice, they had to get new ones and that happened when ending the round and starting a new one, getting all dice back and rolling them fresh. So where's the problem?

  • Double spam: you could end your turn until you rolled a double or numbers that you wanted without consequences
  • Spending spam: you
  • Dice effects: I implemented an increasing amount of dice mechanics, like status conditions affecting dice, which only affected the player since the enemy was not using any dice. Additionally, several trick effects like Adaptive or Grow had no effect when used by the enemy because, again, no dice.

 

Solution Attempts

Since the enemy only acts when you acted, starting a new turn did nothing, letting you happily roll until you have what you want. So I needed either a restriction or a punishment for spamming the end turn button. I tried:

  • Tricks losing their payment when starting a new turn: This prevented readying all four tricks turn after turn because you couldn't keep your paid tricks. Problem: planning ahead and paying a trick for the next round was part of the strategy of the game which then would be completely removed by it.
  • Only allowing ending the turn when no dice are left: This prevented rolling until you had a double or the numbers that you wanted (e.g. 2 for Snap). Problem: You could still circumvent it by just spending your dice, end the turn, and repeat until all four are paid. The fix was negligible.
  • Having to execute at least one trick before being able to end the turn: That one was dumped pretty quickly. Problem: You could roll poorly and not afford any tricks, then what? Additionally, forcing you to use a trick against your will just to end the turn is terrible game feel.
  • The enemy gets a free move when you end the round: This was the most promising solution and actually stayed in the game quite a while. When a player ended their round, all tricks refresh and the opponent would randomly use one against you. This definitely prevented spam, because you would get whacked most of the time. I added a dotted outline effect to preview which technique is going to be used to make it less frustrating and random. For a while, it looked like it was working but it wasn't. I just wanted it to be. While on the surface, it prompted the behavior that I wanted, it had confusion and frustrating parts that I realized when watching people play it or getting feedback.

 

First, it breaks the "when you move, the enemy moves" idea because you didn't do anything, your animon did not attack or do anything. The opponent got a random freebee and you didn't. I had to add something to the nice, short, crisp sentence and it became this mutation: "when you move, the enemy moves... unless you end your turn, then the enemy also moves". That right there is a bad sign. If the sentence gets longer to describe a mechanic, it's probably the wrong direction.

Second, it was unfair. You spend all your dice, used all your tricks, and then you have nothing left but to press the end turn button, seeing that the enemy is about to hit you hard with no option to defend against it except for switching animons or using an item. It did not feel good to be exposed to that extra attack.

Third, it was confusing. Often players did not understand why the enemy "suddenly attacked" which is basically related to the first point. And even if you did understand it, you often forgot about it, being in the groove of your rolling and planning and aligning your tricks for nice damage and then, oh, ups, I forgot there's this extra thing.

 

Goodbye, Mechanic

 So that, together with the fact that I couldn't apply any dice mechanics to the opponent, led me to the decision to scrap that turn system entirely. Cutting a design darling is among the hardest things in game design (or at least from my experience working in teams for the last 13 years prior to this) but it's also one of the most crucial methods. If keeping a mechanic, even a pretty cool one, means I have to add several obscure restrictions to it to make it work, it's not something I want to use.

So off to the chopping block. Boop. Gone.

Phew, that felt actually good. Scrapping things can be very liberating, except when you then realize that you have to write an enemy AI now (careful, not the bad gen AI beep beeeeeeeep beep beeeeeeeep beeeeeep slop but the classic "enemy picks the left path because it's a shorter way to punch you"-sorta thing. Enemy AI is a thing. We've done it for decades! Some people might now point out that it's not AI but a behavior tree which is different and they are probably right but the thing is, I'm terrified of both equally, so tomato tomato)


GIF of battle, showing three Wisdom dice rolled by enemy and then spend on three tricks

 

New Turn System

So yes, the only reasonable choice was to apply the same rules to the enemy as I do with the player which means: rolling dice, spending dice, benefiting from double effects, suffering from dice conditions... the whole show. And I actually accomplished it to my utter surprise. As you might now, I'm not a very good programmer. Many years, all I could do is code super simple gameplay prototypes and then maybe, slowly, a game but... like dynamic shit? Logic? I'm just a lil' design guy.

But I powered through and went at it step by step. I came up with a point system to evaluate which tricks made more sense than others in each given turn. I awarded points based on damage or buff amount in comparison to the cost and deduced points for the amount of dice needed to pay for it so the enemy would decide that a stronger technique that needed more dice was not necessarily better than a weaker one that just needed one die, for example. Additionally, I awarded points for when the die color matched the trick's.

I refined it then further by adding specific cases to the evaluation. For example, if there was a trick with the precise tag (paying exact gives a potency boost) would be prioritized as it is usually very costs efficient or shield tricks would lose points if the animon already has shields (or set the points to 0 if there are no shield slots left).

  • Here's an example scoring for offensive tricks:
  • if the trick has "Shield Break" and the target has shields: +1 point per shield, otherwise +1 per damage
  • if there are matching die colors (that aren't Curiosity): 3 x amount of matching dice
  • add / subtract points based on dice needed and damage: damage - sum of dice values needed to pay

 

There were lots of bugs to fix and cases I forgot to consider, like the opponent paying for a trick that was already free from the double effect or actually not execute a readied trick because it was growing (from the new patience dice effect). There's still probably lots of edge cases I have to fix but at the moment, it works pretty reasonably!

This was definitely a good decision and it opened up the possibilities for many fun effects now, on top of being more clear to the player. Having our newest animon, Najmagi, hex the opponent's dice so they all roll 1s is pretty neat!

 

 
Image of four trick cards: Headbutt, Poison Spres, Soul Beam, Steam Dart

 

Second design problem: Identity

Soulblaze was always about customizing your builds and team. The fusion screen lets you upgrade and alter your tricks, adding flavours (formerly "battle tags") to them and creating new synergies. You could slap a "double" flavor on a healing trick and boom, free healing any time you roll a double. Nice!

This mix and match was cool but it also meant that the unique flavors of the aspects (e.g. Fury has "Hungry", Wisdom has "Overflow", etc.) became diluted. The identity of the specific types less important and the tricks just mostly containers for you to fill with stuff. The fusion system was working great so I definitely wanted to keep that but I was thinking about adding mechanics somehow that made the different aspects (types) unique.

This led me to the idea of "outsourcing" some of the flavors and turn them into unique dice effect. This actually solved another problem of mine, namely the bad game feel of mismatching dice colors. So, initially, if you wanted to pay a Fury trick, you better had a Fury die to pay with or otherwise the payment was just 1 if the colors didn't match, no matter what you rolled. The idea was that you had to think about which aspects were in your team and how to pick your dice loadouts but led to a feel of unnecessary punishment, especially when you wanted to have four animons of different types. One of my design philosophies is:


reward smart player choices over punishing bad ones


Like with children. Yes, give them a lollypop when they shared their favorite toy with the annoying kid next door instead of playing Rebecca Black to them when they didn't. Okay, granted, bribing children with candy which probably also belongs to fucking Ne**lé might not be a great parenting idea but you know what I mean?


GIF showing cycling through the dice in the dice bag


 

Dice Effects

I want to reward players for picking their dice colors and matching them with their animons' tricks instead of punishing them when they end up having the wrong trick for their current loadout. And the new dice effects did just that. From that point on, you could pay any trick with any dice, throw a blue water dice on a fire trick, no problem but... you only trigger the specific dice effect when you pay correctly (so a Wisdom die for a Wisdom trick). The dice effects I picked to start with are:

  • Overflow (Wisdom): If you overpay a Wisdom trick, the excess amount goes to the trick below it (if available). For this I also added a way to rearrange every animon's tricks on the details screen to make best use of that.
  • Grow (Patience): If a Patience trick gets readied and was paid with at least one Patience dice, it starts to grow. Every turn you end with a growing trick, the potency of that trick grows by 1, meaning that if you could use a readied Patience trick but don't use it yet, it grows. The grow is limited by the amount that was paid so if you paid a green die with 3, it can grow up to 3.
  • Stoke, formerly Hungry (Fury): Paying a Fury trick with a Fury die "stokes the flame", so to speak, increasing the potency by 1 each turn it received a Fury die. Failling to pay A Fury die to a stoked trick resets the bonus completely.
  • Entropy (Mystery): When paying a Mystery trick with a Mystery die, one of your remaining dice gets rerolled (randomly chosen and if available). Mystery often plays with not using rerolls or with the amount of rerolls left so getting free ones like this helps with flavors like "Fatesworn".
  • Curious (Curiosity): This one works a little different as it is the default die color. It does not get triggered when paying Curiosity tricks, instead it has a passive effect: Curiosity die never reroll into the same number, so if you rolled a 1 and reroll, it will not be a 1 again. If you roll a 2 then and reroll again, it can be a 1 again, though.

You can read all the effects on the dice loadout screen.


GIF of overflow effect showing water flowing from Snap to Pout

 

Phew, that was long, wasn't it? We're almost done! I want to end with a brief summary of what the next update will bring. It's called the Mystery March update and the theme is, well, the Mystery aspect. It was added last and was lacking animons and tricks so this update adds more content to it.

there will be 3 new Mystery animons, 4 more animancer, several new Mystery tricks, and... a Twitch mode!

I'm working on the integration right now so if you plan to stream the game, you'll be able to let your viewers participate. As of now, viewers can vote for which path to take on the map and occasionally, a treasure chest gives the option to let Chat create a custom trick from scratch. I'm brainstorming more ideas constantly and will add more as I work on this mode so stay tuned!


Thanks for reading!

Get Soulblaze

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.