EverlastingKing¶
Assumptions¶
It is assumed this enemy is fought alone as otherwise, it would break their artifact summoning logic.
It is also assumed this enemy is loaded with SurviveWith10 in their weakness as it allows their phase transition logic to work as expected.
It is also assumed this enemy's eventondeath to be configured to use the matching EventDialogue as it allows them to die with a mini cutscene and end the battle properly.
It is also assumed this enemy is loaded with actimmobile set to true which allows them to cure themseolves of stopping condition.
Fire damage infliction logic in CalculateBaseDamage¶
This enemy has a 30% chance to be on fire on a Fire property attack.
data usage¶
At the start of the action, if data is null or empty, it's initialised to be 5 element with a starting value of 0.
data[0]: A cooldown until this enemy uses the position change toFlyingmove. If this enemy'spositionisGround, the value is decremented before deciding which of the 2 attackingGroundmoves to use. If after this decrement, the value becomes -3, this enemy will use thepositionchange move so it will go toFlyingwhich also causes this value to be reset to 0. Effectively, it means that at most, this enemy will remain onGroundfor 2 actor turns in a row before using thepositionchange move. NOTE: Since the value is only decremented when theirpositionisGround, if the player causes them to change toFlying, it freezes this cooldown, but it will still apply the moment this enemy comes back toGrounddata[1]: A value that tracks the last move that was used when this enemy's position wasFlying. This is used as an antispam on the fire pillar attack move, the artifact summoning move and the combined KeyL and KeyR attack move. See the move selection process section below for more details on how this is enforced. The value is set in the post move logic so it doesn't track the moves used when onGroundand it also means that the value stays the same as long aspositionisGround. Here are the different possible values and their mappings:data[2]: A phase tracker. It can be only one of the following values:- 0: The initial state and first phase. It emans this enemy hasn't underwent any phase transition. Once the first phase transition happens when this enemy's
hpis 10 or lower in the pre move logic, the value is set to 1 - 1: The second phase. It means this enemy went through the first phase transition. Once the second phase transition when this enemy's
hpis 10 or lower in the pre move logic once again, the value is set to 2 - 2: The third and last phase. It means this enemy went through both phase transitions. From now on, this value cannot influence any logic
- 0: The initial state and first phase. It emans this enemy hasn't underwent any phase transition. Once the first phase transition happens when this enemy's
data[3]: A cooldown that when expires, it overrides theFlyingmove selection process to select the artifact summoning move (but it might not necessarily use it, see the move selection process for details). It has a starting value of 2 on the first main turn. When using the artifact summoning move, the value is set to 3 (which will become 2 by the end of the actor turn due to the post move logic). In the post move logic (meaning it only applies whenFlying), the value is decremented if it is above 0. During theFlyingmove selection process, if the value is 0, the artifact summoning move will always be selected and the value will be set to 2. This can have unexpected interactions withdata[4], see the move selection process for more details. Effectively, if other conditions are satisfied, it means that this enemy will be using the move after 2 actor turns they spent whileFlying. NOTE: the value is set to 0 when the first phase transition occurs in the pre move logic and it is reset to 2 when the second phase transition occurs in the pre move logicdata[4]: A cooldown on the usage of the artifact summoning move. When the move is used, the value is set to 2 when summoning a KeyR or to 3 when summoning a Tablet. In the post move logic (meaning it only applies whenFlying), the value is decremented if it is above 0. For the artifact summoning move to be come usable again, the value must be 0 by the time theFlyingmove selection process happens, even ifdata[3]reached 0 causing a selection override (see the move selection section below for details on how this can interact withdata[3]). Effectively, it means that this enemy needs to spend 1 or 2 actor turns whileFlyingbefore being able to use the move again. NOTE: the value is set to 5 when the second phase transition occurs in the pre move logic meaning this enemy will need to spend 5 actor turns while flying before being able to use the move again
HardMode changes¶
HardMode being true does the following changes:
- When summoning any artifact enemies (whether by using the summoning move or as part of the second phase transition), the summoned enemy's
cantmoveis now decremented meaning they can act immediately on the same main turn they were summoned - During the
Groundmove selection process, the odds of which move to use changes to favor the vine attack move (Groundversion) - In the vine attack move (
Groundversion), the move may hit 2 or 3 times instead of only once - In the flower bud attack move, the DoCommand call (which is a TappingKey) has
barfilldecrease 25% faster each frame. However, this change doesn't affect anything ifmashcommandaltis true making the command a SequentialKeys - In the vine attack move (
Flyingversion), the move may hit twice instead of only once - In the axe throw move, the amount of frames each axe throw changes to 21.0 frames from 30.0 frames on the first throw and to 17.0 frames from 21.0 frames on the second throw
- In the double fireballs throw move, the speed of each Projectile calls changes to be random between 22.0 and 28.0 instead of being Random between 29.0 and 35.0
- In the combined KeyL and KeyR attack move, the damageammount of the DoDamage call changes to 9 from 10
Also, on HARDEST specicifically, this enemy always heals their hp to full on each of the 2 phase transition instead of being a fraction of their maxhp.
Move selection¶
9 moves are possible:
- A single target vine attack (
Groundversion) that may hit multiple times followed by a 3hpheal - A single target flower bud attack that continuously drains
hpfollowed by a 3hpheal - Changes their position to
Flyingand gets another actor turn - A single target vine attack (
Flyingversion) that may hit multiple times - A party wide fire pillar attack
- A single target axe throw attack that may hit twice
- Summons an enemy from the artifact family which is composed of KeyL, KeyR and Tablet
- A multiple targets double fireballs throws
- A single target attack combining KeyL and KeyR into a laser slash attack
There's 2 move selection process depending on Position: one for Ground and the other for Flying and they affect different moves while functioning mostly independently from each other.
Ground move selection process¶
This selection process only applies to move 1, 2 and 3. Those move are only usable when position is Ground.
Move 3 is always (and only) used when data[0] is -3 or lower after a decrement (meaning the countdown to stay on Ground expired). This move is a way to transition to the Flying move selection process since this enemy always gets another actor turn when using that move.
As for move 1 and 2, the decision of which move to use is based on odds, but the odds changes depending if hardmode is true or false. Here are the odds in either situations:
| Move | Odds when hardmode is false | Odds when hardmode is true |
|---|---|---|
| 1 | 40% | 60% |
| 2 | 60% | 40% |
Flying move selection process¶
This selection process only applies to move 4, through 9. Those move are only usable when position is Flying.
The decision of which move to use is based on odds, but some moves have additional requirements that needs to be fufilled in order for the move to be used once selected. If the requirements aren't fufilled after selecting the move, a continue directive will be issued to the enemy action loop which restarts the entire action and effectively rerolls the move selection process. Here are all the odds and requirements of each moves:
| Move | Odds | Requirements |
|---|---|---|
| 4 | 3/24 | None, the move is always used once selected |
| 5 | 2/24 | data[1] isn't 1 (meaning this move wasn't used on the last actor turn) |
| 6 | 3/24 | None, the move is always used once selected |
| 7 | 6/24 |
|
| 8 | 3/24 | None, the move is always used once selected |
| 9 | 7/24 |
Move 7 override case¶
Move 7 is handled in a special way on top of the table above. It is possible that the initial move selection is overriden to select move 7 if all of the following conditions are fufilled:
data[3]is 0 or lower (the countdown to force the usage of move 7 expired)- There's less than 4
enemydata data[1]isn't 3 (move 7 wasn't used on the last actor turn)
When this happens, data[3] is set to 2 and move 7 is always selected. However, this only guarantees the SELECTION of the move: the move is still subject to its requirements in order to actually be used. It means that there's a condition that can still cause the move to be selected like this, but not be used and that is data[4] could still be above 0 (meaning the cooldown on the usage of the move hasn't expired yet), but all other requirements would be met.
Since data[4] isn't checked before applying this selectioon override, it's possible the override happens, but the move won't be used and another will be instead due to the continue directive. Since this override case sets data[3] to 2, it can't happen again once the continue directive is issued.
Effectively, it means it's possible the move 7 override misses its chance to actually force the usage of the move depending on if data[4] is above 0 or not at the time the override case applies.
SummonArtifact¶
There is a coroutine specific to this enemy that is used everytime an artifact enemy needs to be summoned as it involved specialised logic. It is documented here for reference simplicity. It is meant to be set to enemybounce[0] as it will be set to null when the coroutine completed.
private IEnumerator SummonArtifact(int calledby, int type, bool hardmode)
Parameters¶
calledby: Theenemydataindex of this enemytype: An enemy id that can either be 101 (KeyR), 102 (KeyL) or 103 (Tablet). If the value is -1, it means to randomly select one that isn't present randomly with uniform oddshardmode: A way for the method to get the hardmode value
Procedure¶
- This enemy's
enemydatais obtained via calledby data[3]is set to 3- The enemy id is generated based on the type paramneter described above
EverLastingKingSummonArtifactsound plays- Yield for a second
- Yield for 0.5 seconds
- animstate set to 105
- Based on the enemy that will be summoned, the position of the summon and
data[4]value (the cooldown on the usage of the artifact summoning move) are determined:KeyL: summoned at (1.5, 0.0, 0.5) with nodata[4]changesKeyR: summoned at (5.0, 0.0, -0.85) withdata[4]set to 2Tablet: summoned at (2.0, 0.0, -0.25) withdata[4]set to 3
checkingdeadset to a new SummonEnemy call to summon the selected enemy at the position determined without cantmove (meaning the enemy will be able to act on the same main turn). As for the type of the summon, it'sOffscreenexcept for theTabletwhere it's theTablettype- Yield all frames until
checkingdeadis null (the coroutine completed) - This enemy animstate set to 106
- Yield for 0.5 seconds
- Yield for 0.25 seconds
- The newly summoned enemy's diebyitself is set to true
- If hardmode is true, this enemy's
cantmoveis decremented which grants them an additional actor turn (this is meant to be undone if called from a phase transition) enemybounce[0]set to null which signals the caller that this coroutine completed
Pre move logic¶
The following logic happens before the usage of any moves. It's in multiple parts done in order.
Position adjustement¶
This part always happen and it causes the position to be set depending on height:
- If it's 0.5 or lower, it's set to
Ground - If it's higher than 0.5, it's set to
Flying
Stop condition curing¶
This part only happens if this enemy IsStopped with skipimmobile:
Charge7sound plays with 0.8 pitch- ShakeScreen called with an ammount of 0.1 and 0.5 time with dontreset
- ShakeSprite called with 0.1 intensity and 30.0 frametimer
- Yield for 0.5 seconds
- ClearStatus called on this enemy
Heal3sound plays- Yield for 0.5 seconds
hologram adjustements¶
This part only happens if hologram is true and the only thing that happens is the sprite's material's renderQueue is set to 2500 which allows the shielding effect to render correctly visually.
Phase transition¶
This part only happens if hp is 10 or lower and data[2] is less than 2 (meaning this enemy hasn't gone through both phase transitions yet).
- If
hologramis false:- Camera moves to look near (this enemy x position,
spritelocal y position + 0.25, 2.5) - Yield for 0.5 seconds
- SetText is called in dialogue with the following:
- text:
commondialogue[175]whendata[2]is 0 (first phase) orcommondialogue[176]whendata[2]is 1 (second phase) - fonttype: 0 (
BubblegumSans) - linebreak:
messagebreak - tridimensional: false
- position: Vector3.zero
- size: Vector3.one
- parent: This enemy
- caller: null
- text:
- Yield all frames until the message lock is released
- SetDefaultCamera called
- Yield for 0.25 seconds
- Camera moves to look near (this enemy x position,
- animstate set to 100
- ShakeSprite called with 0.2 intensity and 30.0 frametimer
Rumblesound plays- ShakeScreen called with 0.1 ammount and 2.0 time with dontreset
- Done in a separate coroutine started in paralel called MainManager.Waves:
- A
Prefabs/Objects/SphereGlowEffectGameObject is instantiated rooted at this enemy's world CenterPos with a scale of (50.0, 50.0, 1.0) with a pure green color - Over the course of 121.0 frames, the scale of
Prefabs/Objects/SphereGlowEffectchanges to 0.0x via a lerp - The
Prefabs/Objects/SphereGlowEffectgets destroyed
- A
EverLastingKingVinesound plays with 0.8 pitch- Yield for a second
- Yield for a second
Rumblesound plays- The amount of
hpto set this enemy is determined:- If flags 614 is true (HARDEST is active), It's all their
hp - If
data[2]is 0 (first phase), it's theirmaxhp* 0.9 floored. The amount is substracted by 5 if their position isGround - If
data[2]is 0 (first phase), it's theirmaxhp* 0.75 floored. The amount is substracted by 5 if their position isGround
- If flags 614 is true (HARDEST is active), It's all their
- Heal called to heal this enemy by the determined amount of
hp. NOTE: this is technically missleading because it is healing by the set amount - 10, it isn't healing by the amount determined as that's the amount thehpwill be SET AT, not the amount HEALED BY - If flags 614 is false (HARDEST is inactive),
hpis set to the amount determined - Yield for 0.5 seconds
data[3]is set to 0 (the move selection override case is set to happen on this actor turn if all conditions are fufilled)- If
hologramis false:- Every player party member whose
hpis 0 gets revived via RevivePlayer leaving them with 1hpwithout showcounter - UpdateAnim called
- Yield for 0.5 seconds
- If
data[2]is 0 (first phase), 2 SetText occurs in dialogue mode in a row (yield all frames until the message lock released after each calls). The first one hasplayerdata[0](Bee) as the parent withcommondialogue[199]as the text and the second hasplayerdata[1](Beetle) as the parent withcommondialogue[200]as the text - Otherwise (
data[2]is 1 which is the second phase), 2 SetText occurs in dialogue mode in a row (yield all frames until the message lock released after each calls). The first one hasplayerdata[1](Beetle) as the parent withcommondialogue[201]as the text and the second hasplayerdata[2](Moth) as the parent withcommondialogue[202]as the text - Yield for 0.5 seconds
- Every player party member whose
- If
data[2]is 1 (performing the last phase transition):- SetDefaultCamera called
SurviveWith10is removed from this enemy weakness which makes them vulnerable to be killedenemybounceset to a one element Coroutine arraycheckingdeadset to a new ChangePosition call to change position toFlying- Yield all frames until
checkingdeadis null (the coroutine completed) - If KeyL isn't present:
enemybounce[0]is set to a new SummonArtifact call to summon a newKeyLenemy- Yield all frames until
enemybounce[0]is null (the coroutine completed)
- If KeyR isn't present:
enemybounce[0]is set to a new SummonArtifact call to summon a newKeyRenemy- Yield all frames until
enemybounce[0]is null (the coroutine completed)
data[4]is set to 5 (meaning the artifact summoning move won't be usable for the next 5 actor turns spent whileFlying)cantmoveis set to 0 (this undo the actor turn granted by SummonArtifact calls as they are undesired here)data[3]is reset to 2
data[2]is incremented
Post move logic¶
The following logic applies after a move is used, but only if position is Flying meaning it only applies when the Flying move selection process happened and a move was used.
If the above requirements are met, the following happens:
data[1]is set to a value that tracks the move that was just used. See thedatasection above for the values mapping- If the move that was just used isn't the artifacts summoning move:
- If
data[3]is above 0, it is decremented (this is the countdown to force the selection of the artifacts summoning move) - If
data[4]is above 0, it is decremented (this is the cooldown for the usage of the artifacts summoning move)
- If
Move 1 - Vine attack while on Ground¶
A single target vine attack (Ground version) that may hit multiple times followed by a 3 hp heal.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | playerdata[playertargetID]'s hp is above 0. Done once if hardmode is false, from 2 to 3 times if it is true as long as playerdata[playertargetID]'s hp is above 0 |
This enemy | playertargetID after GetSingleTarget (target is the same for each calls) |
5 on the first hit, 2 on the second hit and 1 on the third hit | Pierce1 | null | commandsuccess |
1: Enemy piercing damages are disabled so this property does nothing, see the CalculateBaseDamage documentation to learn more
Logic sequence¶
- animstate set to 109
EverLastingKingVinesound plays- Yield for 0.5 seconds
checkingdeadis set to a new VineAttack coroutine with 5 damageamt, actionid as the callerid with gettarget. The coroutine will setcheckingdeadto null upon completion- Yield all frames until
checkingdeadgoes to null - animstate set to 0 (
Idle) - SetDefaultCamera called
- Yield for 0.25 seconds
- Heal called to heal this enemy by 3
hp - Yield for 0.5 seconds
This is what the coroutine effectively ends up doing:
- GetSingleTarget called
Rumble3sound plays- ShakeScreen called with an ammount of (0.1, 0.05, 0.0), time of 0.75 with dontreset
- Camera moves to look near
playertargetentity - The amount of hits is determined. It is 1 if hardmode is false and if it's true, it's random between 2 and 3 inclusive
- An array of
Prefabs/Objects/VenusRootare instantiated with the amount being the amount of hits to do at (playertargetentityx position + a random number between -2.0 and 2.0, -5.0,playertargetentityz position). Each instance is set to LookAt theplayertargetentityand has its initial position incremented by (random between -1.0 and 1.0, 0.0, -0.15) - An array of Vector3 are instantiated with the amount being the amount of hits to do with each being the normalised direction vector from
playertargetentityto the matchingPrefabs/Objects/VenusRootelement - Yield for 0.75 seconds
- For each hit:
Charge8sound plays- The matching
Prefabs/Objects/VenusRootscale is multiplied by 1.65 - Over the course of 10.0 frames, the matching
Prefabs/Objects/VenusRootposition lerps to its position + the matching heading direction vector * 5.0. The first time reaching the 5th frame or later whenplayerdata[playertargetID]'shpis above 0, DoDamage 1 call happens before the frame yield - Yield for 0.5 seconds
- Yield for 0.5 seconds
- If this is the last hit:
Rumble3sound plays- ShakeScreen called with an ammount of (0.1, 0.05, 0.0), time of 0.75 with dontreset
- Yield for 0.5 seconds
- The amount of damage to deal on the next hit becomes half of this one's damage floored then clamped from 1 to 99
- Over the course of 60.0 frames, all
Prefabs/Objects/VenusRootinstances has ther scale lerped to Vector3.zero - Yield for a frame
- All
Prefabs/Objects/VenusRootinstances gets destroyed checkingdeadset to null which informs the caller that the coroutine is done
Move 2 - Flower bud attack¶
A single target flower bud attack that continuously drains hp followed by a 3 hp heal.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
DoCommand calls¶
| # | Conditions | timer | commandtype | data |
|---|---|---|---|---|
| 1 | None | -1.0 (infinite) | TappingKey |
|
1: Due to the clamping logic related to this value, it means that the decrease value per frame is 0.005 * the game's frametime when hardmode is false and 0.00625 * the game's frametime when hardmode is true. Effectively, it means that hardmode being true makes barfil decrease 25% more per frame
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Called once if barfill is less than 1.0 (not full) during DoCommand 1 once 0.5 seconds passed and then continously called again every 1.0 seconds until either barfill reaches 1.0 (checked 1.0 seconds after each call) or that playerdata[playertargetID]'s hp becomes 0 (checked after each call) |
This enemy | playertargetID after GetSingleTarget (target is the same for each calls) |
1 | Atleast1pierce1 | null | false |
1: Enemy piercing damages are disabled, see the CalculateBaseDamage documentation to learn more
Logic sequence¶
- GetSingleTarget called
- Camera moves to look near the midpoint between this enemy and
playertargetentityposition - animstate set to 109
- Yield for 0.5 seconds
Rumble3sound plays- ShakeScreen called with 0.05 ammount and -1.0 time (infinite)
- Yield for 0.5 seconds
- ShakeScreen called with 0.2 ammount and 0.75 time with dontreset
- A
Prefabs/Objects/OpeningFlowerBudGameObject is instantiated rooted atplayertargetentityposition - 0.1 in z whose SpriteRenderer has a material of MainManager.spritematand a scale of 2.0x playertargetentityanimstate set to 11 (Hurt)Spin9sound plays with 0.8 pitchDirtExplodeparticles plays atplayertargetentityposition- The
Closeanimation clip is played onPrefabs/Objects/OpeningFlowerBud's Animator Dig3sound plays- animstate set to 0 (
Idle) Clompsound plays- Yield for 0.5 seconds
- A SpriteBounce is added to the
Prefabs/Objects/OpeningFlowerBudwith a MessageBounce of 2.0 multiplier and withstartscaleset to true - DoCommand 1 call happens
infinitecommandeset to true which will prevent DoCommand 1 to end when MainManager.mashcommandaltis true until the action command is succeeded- CreateHelpBox called with 4 (the TappingKey command's help)
- As long as
playerdata[playertargetID]'shpis above 0 andactionroutineisn't null (meaning DoCommand 1 hasn't ended yet):- Yield for 0.5 seconds
- If
barfillis less than 1.0 (it isn't full yet):- DoDamage 1 call happens
- If
lastdamageis above 0, Heal is called to heal this enemy bylastdamageamount ofhp
- Yield for 0.75 seconds
- DestroyHelpBox is called which sets
helpboxidto -1 and destroyshelpboxif it existed in 0.5 seconds with shrink before setting it to null Barfillsound stops- If
playerdata[playertargetID]'shpis above 0:- Their animstate is set to the value it had before this action
- Jump is called on them
- FinishAction is called manually to end DoCommand 1 if it wasn't already (but it should be by then)
- The
Openanimation clip is played onPrefabs/Objects/OpeningFlowerBud's Animator CherryBoomparticles plays at theplayertargetentityposition- ShakeScreen called with 0.1 ammount and 0.5 time with dontreset
- MainManager.MoveTowards called to move
Prefabs/Objects/OpeningFlowerBudto - 2.0 in y with a 30.0 multiplier without smooth and without local (done in paralel) - Yield for 0.5 seconds
- The
Prefabs/Objects/OpeningFlowerBudgets destroyed in 2.0 seconds - animstate set to 0 (
Idle) - SetDefaultCamera called
- Yield for 0.25 seconds
- Heal called to heal this enemy by 3
hp - Yield for 0.5 seconds
Move 3 - Changes position to Flying with another actor turn¶
Changes their position to Flying and gets another actor turn. No damages are dealt, but this enemy always gets another actor turn which may deal damages.
nonphyscal set to true¶
This move always sets nonphyscal to true which doesn't affect anything for this move.
Logic sequence¶
data[0]is reset to 0 (the cooldown before using this move when position isGround)checkingdeadset to a new ChangePosition calle to change the position of this enmey toFlying- Yield all frames until
checkingdeadis null (the coroutine compelted) cantmoveis decremented which grants another actor turn to this enemy (it transitions to theFlyingmove selection process)
Move 4 - Vine attack while Flying¶
A single target vine attack (Flying version) that may hit multiple times.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | playerdata[playertargetID]'s hp is above 0. Done once if hardmode is false, from 1 to 2 times if it is true as long as playerdata[playertargetID]'s hp is above 0 |
This enemy | playertargetID after GetSingleTarget (target is the same for each calls) |
3 on the first hit, 1 on the second hit (4 on the first hit and 2 on the second hit instead if data[2] is 2 meaning this enemy went through both phase transitions) |
Pierce1 | null | commandsuccess |
1: Enemy piercing damages are disabled so this property does nothing, see the CalculateBaseDamage documentation to learn more
Logic sequence¶
- animstate set to 101
EverlastingKingVinesound plays- Yield for 0.5 seconds
checkingdeadis set to a new VineAttack coroutine with 3 damageamt (4 instead ifdata[2]is 2 meaning this enemy went through both phase transitions), actionid as the callerid with gettarget. The coroutine will setcheckingdeadto null upon completion- Yield all frames until
checkingdeadgoes to null
This is what the coroutine effectively ends up doing:
- GetSingleTarget called
Rumble3sound plays- ShakeScreen called with an ammount of (0.1, 0.05, 0.0), time of 0.75 with dontreset
- Camera moves to look near
playertargetentity - The amount of hits is determined. It is 1 if hardmode is false and if it's true, it's random between 1 and 2
- An array of
Prefabs/Objects/VenusRootare instantiated with the amount being the amount of hits to do at (playertargetentityx position + a random number between -2.0 and 2.0, -5.0,playertargetentityz position). Each instance is set to LookAt theplayertargetentityand has its initial position incremented by (random between -1.0 and 1.0, 0.0, -0.15) - An array of Vector3 are instantiated with the amount being the amount of hits to do with each being the normalised direction vector from
playertargetentityto the matchingPrefabs/Objects/VenusRootelement - Yield for 0.75 seconds
- For each hit:
Charge8sound plays- Over the course of 10.0 frames, the matching
Prefabs/Objects/VenusRootposition lerps to its position + the matching heading direction vector * 5.0. The first time reaching the 5th frame or later whenplayerdata[playertargetID]'shpis above 0, DoDamage 1 call happens before the frame yield - Yield for 0.5 seconds
- If this is the last hit:
Rumble3sound plays- ShakeScreen called with an ammount of (0.1, 0.05, 0.0), time of 0.75 with dontreset
- Yield for 0.5 seconds
- The amount of damage to deal on the next hit becomes half of this one's damage floored then clamped from 1 to 99
- Over the course of 60.0 frames, all
Prefabs/Objects/VenusRootinstances has ther scale lerped to Vector3.zero - Yield a frame
- All
Prefabs/Objects/VenusRootinstances gets destroyed checkingdeadset to null which informs the caller that the coroutine is done
Move 5 - Fire pillar attack¶
A party wide fire pillar attack.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
PartyDamage¶
| # | Conditions | caller | damage | property | block | jumpheight | spinammount | jumpevenonblock | overrides |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | 4 | Fire | commandsuccess |
0.0 | Vector3.zero | false | null |
Logic sequence¶
- animstate set to 100
- Yield for 0.5 seconds
- animstate set to 101
checkingdeadset to a new FirePillar coroutine from this enemy without green- Yield all frames until
checkingdeadis null (the coroutine completed)
Here is what the coroutine ends up doing:
- Yield for 0.5 seconds
FirePillarsound plays- A new
Prefabs/Objects/FirePillar 1GameObject is instantiated childed to thebattlemapatpartymiddlewith a scale of (0.0, 1.0, 0.0 )and a DialogueAnim with the following:targetscale: (0.75, 1.0, 0.75)shrink: falseshrinkspeed: 0.015
- Yield for 0.65 seconds
Prefabs/Objects/FirePillar 1's DialogueAnim'sshrinkspeedset to 0.2- Yield for 0.2 seconds
- ShakeScreen called with ammount of 0.25 and 0.75 time
- PartyDamage 1 call happens
- Yield for 1.15 seconds
Prefabs/Objects/FirePillar 1's DialogueAnim'stargetscaleset to (0.0, 1.0, 0.0)- All ParticleSystem under
Prefabs/Objects/FirePillar 1are stopped Prefabs/Objects/FirePillar 1's DialogueAnim'sshrinkspeedset to 0.05Prefabs/Objects/FirePillar 1gets destroyedcheckingdeadis set to null which signals the caller that this coroutine completed
Move 6 - Axe throw attack¶
A single target axe throw attack that may hit twice.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | playertargetID after GetSingleTarget |
4 | Flip1 | null | commandsuccess |
| 2 | Happens after DoDamage 1 if the target's hp is still above 0 and either HPPercent is lower than 0.6 or data[2] is 2 (this enemy went through both phase transitions) |
This enemy | The same target as DoDamage 1 | 3 | Flip1 | null | commandsuccess |
1: This property gets overriden to null in CalculateBaseDamage as the target is a player party member so it does nothing.
Logic sequence¶
BagRustlesound plays- GetSingleTarget called
- animstate set to 102
- Yield for a second
- Yield for 0.5 seconds
- animstate set to 103
- A new sprite object is created childed to the
battlemapusing theSprites/Entities/waspking2sprite at index 53 (this enemy's axe) positioned atspriteposition + (-1.0, 1.0, -0.1) - If
hologramis true, theSprites/Entities/waspking2material is set to MainManager.holosprite WaspKingAxTosssound plays- Over the course of 30.0 frames (21.0 frames instead if hardmode is true), the axe moves to
playertargetentityposition + (0.0, 1.0, -0.1) via a lerp. Before each frame yield, the z angle of the axe increases by 30.0 * MainManager.framestep - ShakeScreen called with 0.2 ammount and 0.5 time with dontreset
- DoDamage 1 call happens
- Over the course of 41.0 frames, the axe moves to
spriteposition + (-1.0, 1.0, -0.1) via a BeizierCurve3 with a ymax of 5.0. Before each frame yield, the z angle of the axe increases by 20.0 * MainManager.framestep. On the first frame of the second half, ifplayerdata[playertargetID]'shpis above 0 and eitherdata[2]is 2 (went through both phase transition) or HPPercent is lower than 0.6, the second hit will happen:- animstate set to 101
- Over the course of 31.0 frames, the z angle of the axe increases by an amount that progressively changes from 0.0 to -30.0 * MainManager.
framestepwhich means it will progressively spin the other way in z - Yield for 0.1 seconds
WaspKingAxSpinsound plays- Over the course of 30.0 frames, the z angle of the axe increases by an amount that progressively changes from 0.0 to 60.0 * MainManager.
framestepwhich means it will progressively spin faster in the original way in z - Over the course of 21.0 frames (17.0 frames instead if hardmode is true), the axe moves to
playertargetentityposition + (0.0, 1.0, -0.1) via a lerp. Before each frame yield, the z angle of the axe increases by 30.0 * MainManager.framestep - ShakeScreen called with 0.2 ammount and 0.5 time with dontreset
- DoDamage 2 call happens
- The entire axe movement restarts from frame 0, but the second hit won't happen again
WaspKingAxeThrowCatchsound plays- The axe object gets destroyed
- animstate set to 104
- Yield for 0.5 seconds
- Yield for 0.25 seconds
Move 7 - Artifact summon¶
Summons an enemy from the artifact family which is composed of KeyL, KeyR and Tablet. No damages are dealt, but it is possible this enemy gets another actor turn which may deal damages.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
Logic sequence¶
enemybounceis set to a new coroutine with 1 elementenemybounce[0]is set a new SummonArtifact called with type -1 meaning any artifact that isn't currently present will be summoned (determined randomly if multiple aren't present)- Yield all frames until
enemybounce[0]is null (the coroutine completed)
Move 8 - Double fireballs throws¶
A multiple targets double fireballs throws.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
Projectile calls¶
| # | Conditions | damage | property | attacker | playertarget | obj | speed | height | extraargs | destroyparticle | audioonhit | audiomoving | spin | nosound |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Always happen 2 times, but each calls requires that there's at least 1 player party member alive (hp above 0 and not eatenby) |
3 | Fire | This enemy | playertargetID after GetSingleTarget (target changes for each calls) |
A new Prefabs/Particles/Fireball GameObject childed to the battlemap positioned at this enemy's sprite position + (0.0, 4.0, -0.1) with a scale of 1.0x |
Random between 29.0 and 35.0 (random between 22.0 and 28.0 instead if hardmode is true) | 2.0 | SepPart@2@4 |
Fire |
WaspKingMFireball2 |
null | Vector3.zero | false |
Logic sequence¶
- A new array of 2 transform is initialised which will holds the projectiles objects
- For each hit (always 2 times), if there's at least 1 player party member alive (
hpabove 0 and not eatenby):- GetSingleTarget called
WaspKingMFireball1sound plays- animstate set to 107
- The projectile element is set to a new
Prefabs/Particles/FireballGameObject childed to thebattlemappositioned at this enemy'sspriteposition + (0.0, 4.0, -0.1) - Over the course of 36.0 frames, the
Prefabs/Particles/Fireball's scale changes from 0.0x to 1.0x via a lerp - Yield for 0.25 seconds
- animstate set to 103
WaspKingFireball2sound plays- Projectile 1 call happens
- Yield for a random interval between 0.3 and 0.6 seconds
- animstate set to 0 (
Idle) - Yield all frames until all projectile objects are null (all Projectile 1 calls completed)
- Yield for 0.5 seconds
Move 9 - Combined KeyL and KeyR attack¶
A single target attack combining KeyL and KeyR into a laser slash attack.
nonphyscal set to true¶
This move always sets nonphyscal to true which affects the effects of the FrostBite, SpikeBod and PoisonTouch medal if equipped on the target.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | playertargetID after GetSingleTarget |
10 (9 instead if hardmode is true) | Pierce1 | null | commandsuccess |
1: Enemy piercing damages are disabled so this property does nothing, see the CalculateBaseDamage documentation to learn more
Logic sequence¶
- Camera moves to look near (this enemy x position, 2.75, 1.0)
- Both KeyL and KeyR present has their
iniceset to true and theirspriteangles reset to Vector3.zero - animstate set to 107
ArtifactSpinsound plays- Over the course of 60.0 frames,
KeyL's yspinchanges to 30.0 via a lerp over the first 30.0 frames andKeyR's yspinchanges to -30.0 via a lerp over the first 30.0 frames - Over the course of 31.0 frames, both
KeyLandKeyRmoves to this enemy position + (0.0, 6.0, -0.1) - theirheightin y via a lerp ArtifactKeysound plays with 1.2 pitch- FadeIn to pure white with 0.2 speed
- Yield for 0.5 seconds
- both
KeyLandKeyRposition set to offscreen at -999.0 in y - A new sprite object is created childed to the
battlemapusing theSprites/Objects/artifactssprite at index 7 (a full key with both halves together) positioned at this enemy position + (0.0, 6.0, -0.1) - If
hologramis true, the key's material is set to MainManager.holosprite - Yield for a frame
- FadeOut with 0.2 speed
- Over the course of 101.0 frames, the key's z angle changes from 2000.0 to 90.0 via a lerp
- Yield for 0.25 seconds
- ShakeScreen called with 0.1 ammount and 0.75 time with dontreset
Lazer2particles plays at Vector3.zero with -1.0 alivetime (infinite) childed to the key with a y angle of 90.0 and a local position of 1.0 in xOmegaEyesound plays with 1.2 pitchFlash2sound plays with 1.5 pitch- Yield for a second
- GetSingleTarget called
- Camera moves to look near
playerdata[playertargetID] - Over the course of 51.0 frames, the key moves to
playertargetentityposition + (2.0, 3.5, -0.1) via a SmoothLerp and their angles changes to (0.0, 0.0, 65.0) via a LerpVectorAngle Charge7sound plays with 1.35 pitch- MainMansger.ShakeObject called on the key with 0.2 in x as the shake and 45.0 frametimer with returntostart (done in paralel)
- Yield for 0.5 seconds
- Yield for 0.25 seconds
- animstate set to 101
Slash3sound plays- Over the course of 8.0 frames, the key z angle changes from 65.0 to 300.0 via a lerp. On the first frame after 3.5 frames, DoDamage 1 call happens
- Yield for 0.5 seconds
- SetDefaultCamera called
- ShakeScreen called with 0.1 ammount and 0.65 time with dontreset
- The key gets destroyed
Spin3sound plays with 0.75 pitch- Over the course of 51.0 frames, both
KeyLandKeyRmoves from the position of the key when it was destroyed - theKeyL'sheightin y to their respective postion before this action via a BeizierCurve3 with a ymax of 6.0. Also,KeyL's yspinchanges from 30.0 to 0.0 via a lerp andKeyR's yspinchanges to -30.0 to 0.0 via a lerp - Both
KeyLandKeyRhas theiriniceset to false and theirspinzeroed out