Creating a Cyclical Mode Ability - dredmor-com/dungeons-of-dredmor GitHub Wiki
A cyclical mode ability is an activated ability that rotates through a series of buffs. This can be used to set a 'mode' for a character so that other abilities in the same skill can have different effects based on the character's mode.
<ability name="Cyclical Mode" icon="skills/placeholder64.png" skill="0" level="1" >
<description text="This is an example skill." />
<spell name="Cyclical Mode" />
</ability>
<spell name="Mode A" type="self" icon="skills/placeholder32.png" >
<buff useTimer="0" self="1" allowStacking="0" icon="skills/placeholder64.png" smallicon="skills/placeholder32.png" >
<!-- Put mode A's buffs in here -->
</buff>
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
<effect type="removebuffbyname" name="Mode D" amount="0" /><!-- using amount="0" here as a safety measure in case they somehow get multiple copies of Mode D active -->
<description text="This is an example mode." />
</spell>
<spell name="Mode B" type="self" icon="skills/placeholder32.png" >
<buff useTimer="0" self="1" allowStacking="0" icon="skills/placeholder64.png" smallicon="skills/placeholder32.png" >
<!-- Put mode B's buffs in here -->
</buff>
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
<effect type="removebuffbyname" name="Mode A" amount="0" /><!-- using amount="0" here as a safety measure in case they somehow get multiple copies of Mode A active -->
<description text="This is an example mode." />
</spell>
<spell name="Mode C" type="self" icon="skills/placeholder32.png" >
<buff useTimer="0" self="1" allowStacking="0" icon="skills/placeholder64.png" smallicon="skills/placeholder32.png" >
<!-- Put mode C's buffs in here -->
</buff>
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
<effect type="removebuffbyname" name="Mode B" amount="0" /><!-- using amount="0" here as a safety measure in case they somehow get multiple copies of Mode B active -->
<description text="This is an example mode." />
</spell>
<spell name="Mode D" type="self" icon="skills/placeholder32.png" >
<buff useTimer="0" self="1" allowStacking="0" icon="skills/placeholder64.png" smallicon="skills/placeholder32.png" >
<!-- Put mode D's buffs in here -->
</buff>
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
<effect type="removebuffbyname" name="Mode C" amount="0" /><!-- using amount="0" here as a safety measure in case they somehow get multiple copies of Mode C active -->
<description text="This is an example mode." />
</spell>
This series of spells uses a chain of requireBuffNotOnTriggers to determine if there is any active mode, and if there is none, start at mode A. Unlike the above section, these don't require animations, sound effects, decription fields, or icons as they trigger effects that do have sfx and animations. They do, however, require a null-value animation to function, and they must again appear in the spellDB in reverse order (as seen below) and before the Cyclical Mode ability.
<spell name="Check for Mode D" type="self" >
<effect type="trigger" requirebuffonnottrigger="1" requirebuffonnottriggername="Mode D" spell="Mode A" />
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
<spell name="Check for Mode C" type="self" >
<effect type="trigger" requirebuffonnottrigger="1" requirebuffonnottriggername="Mode C" spell="Check for Mode D" />
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
<spell name="Check for Mode B" type="self" >
<effect type="trigger" requirebuffonnottrigger="1" requirebuffonnottriggername="Mode B" spell="Check for Mode C" />
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
This is actually the only spell that the player sees on their skillbar: the rest of the spells are activated through this spell. It is missing either a cooldown or a requirements field, though with a modal ability like this that may not be desired. It will likely not need an animation or sfx entry as those are handled by the Mode spells above. This spell doesn't actually handle removal of the old buff: the Mode spells handle that.
<spell name="Cyclical Mode" type="self" icon="skills/placeholder32.png" >
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode A" spell="Mode B" />
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode B" spell="Mode C" />
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode C" spell="Mode D" />
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode D" spell="Mode A" />
<effect type="trigger" requirebuffonnottrigger="1" requirebuffonnottriggername="Mode A" spell="Check for Mode B" />
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
<description text="This is an example cyclical mode ability." />
</spell>
And this is an example of an activated ability that has an extra effect based upon your mode. This is missing a cooldown or requirements field and will need both an animation and a sfx entry. Once again, because of how effect type="trigger" works, the modal effects need to appear before the activated ability. In the event that no mode is active, the Activated Modal Ability will only have its basic effect. Proc, passive, or defensive abilities will use a very similar format to this: only the source that calls the initial spell to determine current mode will change.
<spell name="Mode A Effect" type="target" >
<effect type="damage" conflagratory="3" conflagratoryF="0.3" secondaryScale="5" /> <!-- deals 3 + 0.3*haywire conflagratory damage -->
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
<spell name="Mode B Effect" type="target" >
<effect type="damage" hyperborean="3" hyperboreanF="0.3" secondaryScale="5" /> <!-- deals 3 + 0.3*haywire hyperborean damage -->
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
<spell name="Mode C Effect" type="target" >
<effect type="damage" voltaic="3" voltaicF="0.3" secondaryScale="5" /> <!-- deals 3 + 0.3*haywire voltaic damage -->
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
<spell name="Mode D Effect" type="target" >
<effect type="damage" acidic="3" acidicF="0.3" secondaryScale="5" /> <!-- deals 3 + 0.3*haywire acidic damage -->
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
</spell>
<spell name="Activated Modal Ability" type="adjacent" attack="1" icon="skills/placeholder32.png" >
<effect type="damage" piercing="3" piercingF="0.3" secondaryScale="2" /> <!-- deals 3 + 0.3*melee power piercing damage -->
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode A" spell="Mode A Effect" />
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode B" spell="Mode B Effect" />
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode C" spell="Mode C Effect" />
<effect type="trigger" requirebuffontrigger="1" requirebuffontriggername="Mode D" spell="Mode D Effect" />
<anim sprite="sprites/sfx/null" frames="2" framerate="100" />
<description text="This is an example activated ability." />
</spell>