Devlog #9: Status Effect Upgrades


Greetings and salutations,

Unfortunately, there will be no updates to Battle Succubi this weekend. I know, I know. What other half-baked rogue-like/sex simulation games will you play in the meantime?

Let me explain. This one will also be a bit technical.

I am a huge, huge, fan of Hades. I like the way the different weapons feel, and I love the massive possibility space that Supergiant Games created. To geek out a bit, there are six weapons, and each weapon has an attack and a special. Zagreus can always dash and throw a bloodstone, so combined you have 4 abilities you can always use. If you have a special keepsake equipped, you may be able to summon a companion for a particular encounter, and as you play you might receive a call boon, which lets you summon the power of a god for a brief time.

Each god has one boon for each ability: attack, special, dash, throw, and call. Since there are 8 gods (not counting Hermes, since his boons only affect aspects of speed and dashing), you've got 5 x 8, or 40 different powerups. These powerups actually come in different tiers with different magnitudes of effects, so there are more than this. Regardless, each boon typically has several effects. Frost Strike, the attack boon for Demeter, for example, increases the damage of your attack and makes your attack inflict Chill (slows down their movement) on your enemies. Besides affecting your attack, throw, call, dash, or special, you can also receive other boons which have a much broader range of effects. Sticking to Demeter, if you receive the Frozen Touch boon, you will apply 10 stacks of chill to any enemy that damages you. Instead of modifying a player stat, this boon adds a completely new behavior that only triggers when you are damaged. Or take Rare Crop. When you receive this, all your boons become common tier, and then gain in rarity every 3 encounters. This boon has an effect on all the boons you carry when you first receive it, and then applies an effect to all of them after a set interval. Most gods and goddesses have 9 such boons, in addition to the 5 which directly modify your basic abilities, while Ares has 11. There are also 28 duo boons, which require special combinations of boons from two deities in order to unlock. Curse of Longing, for example, is an Aphrodite/Ares duo boon, which causes your Doom effects (Ares's special curse status) to continuously strike any foes that are Weak (Aphrodite's special curse status).

So, if you are following along in this deep dive, you've got 40 + 28 + 72 = 140 different powerups (actually, there are more), each of which could add a special status effect to an ability, improve a player stat, trigger when you take damage, trigger when you deal damage, modify all your current boons, trigger after a certain amount of time, or completely change the way a basic ability works.

Besides the boons, you have player upgrades from the Mirror of Night, which offers a host of different stat buffs to choose from, but which feature a similar diversity and complexity. For example, you could choose between Boiling Blood and Abyssal Blood. The former increases your attack and special damage against enemies with are carrying one of your bloodstones, while the latter reduces the speed and damage of enemies carrying one.

In addition, there are system-wide effects that can be activated from the Pact of Punishment. You might make all enemies deal more damage, or reduce the efficacy of healing items, or increase the price of items in shops, or you might be required to purge one boon when you exit each region.

What I'm trying to convey with all of this is the complexity of the status effect system in Hades. Some status effects simply upgrade a player stat. They are applied when you receive the boon, and they will increase in power when you upgrade the boon. Others cause a status effect to be applied to an enemy when the enemy is hit by a specific ability, while others apply to the player, and still others spawn an AoE in place. Some get applied periodically, after X seconds or X encounters, and others last for the whole run until you return to Hades' palace. If you do a search for how to implement anything like this, you usually get this kind of result. These are nowhere near on the same level.

In trying to duplicate this complexity, I made a base status effect which had overly broad duties. I decided that each status effect would have a target type object, which would hold the details of how to apply the status effect to the target. In order to create a status effect, I'd have to set properties like its length, the type (interval-based, continuous, etc), the number to affect (minimum value, current value, or max value), the change type (setting the number to a new value, increasing/decreasing, percent multiplicative, percent additive), the size of the effect, and others. I'd also have to set a target type, which could be the player, an enemy, an ability, or a weapon. The target type would contain a reference to the list of attributes for the appropriate target, and once the target type was set, I could select the attribute I wanted the effect to apply to (say, health, movement speed, or attack critical hit multiplier).


Perhaps you see the issue already, but this means that if I had a player weapon which had a damage over time effect (which removed 1 point of health per second for 5 seconds) with an enemy target type, and I wanted to also give this ability to some enemy, I had to duplicate this effect and change the target type to player. Since some effects apply to the player directly, but some apply to their weapon or an ability, I also had to tell each effect which one it should apply to. All that data was in the effect. Further, there are scaling issues. In Hades, when you receive a Pom of Power, you are given choice among several random boons which you already have to level up. As you increase the level of the boon, you increase its efficacy.

To take care of scaling, I also created scaling target types. Like the target type object, this had to be set for each effect and also for each blessing you receive from a succubus. Let's say I created 50 blessings. That meant I'd have to create 50 blessing target objects, one unique target object for each blessing, but containing identical code and functionality. Even if I automated the creation and destruction of them (which I did), it would be a wasteful and cumbersome method of handling this issue.

This weekend, I've taken the first steps towards fixing this and handling it in a more intelligent manner. The initial clue came when I was poking around the Lua files in my Hades installation. I noticed that they seemed to have different lists of effects. For example, a list of effects that is triggered on receiving damage, or a list of effects to apply to the target of an ability, or a list of effects to apply to the owner of an ability. If you have these different lists, the effects themselves don't need to know who or what they should apply to, or under what conditions. Rather than having unique target type objects, I can use the lists and apply the effect to the appropriate target at the appropriate time. Further, I can take care of scaling in the blessings themselves rather than needing to duplicate functionally identical objects.


In short, I created a proper mess for myself through these bad design choices, but I've started to remove some of the obstacles. I also cleaned up some of my editor code, so that my asset creation menus will be more streamlined and less cluttered. Finally, I spent a number of hours this week moving blessing creation into the succubus queens themselves. This is part of my ongoing effort to remove the number of different scriptable objects I need to keep track of. I'll be doing the same to the abilities eventually. There will be more updates in the coming weeks, but these will probably be on the development side.

Files

Battle Succubi.zip 280 MB
Jan 23, 2023

Get Battle Succubi

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.