Underling¶
Assumptions¶
It is assumed that this enemy gets loaded with a isdefending of -1 so their hitaction logic works.
EnemyCheck special logic¶
Before this enemy is loaded, it's possible that StartBattle overrides it to a GoldenSeedling. See the documentation to learn more.
hitaction support¶
This enemy supports hitaction logic and it will be performed when hitaction is true instead of any moves.
Logic sequence¶
- animstate set to 23 (
Chase) - Emoticon called with the
Exclamationemote with a time of 35 Wamsound playscheckingdeadset to a new Dig call on this enemy which changes its position toUnderground(checkingdeadis set to null when completed)- Yield all frames until
checkingdeadis null
Move selection¶
3 moves are possible:
- A single target tackle attack
- A single target headbonk attack
- A single target undergound strike attack
Move 3 is always used (and can only be used) when position is Underground.
As for other moves, the decision of which move to use is based on the following odds:
| Move | Odds |
|---|---|
| 1 | 51% |
| 2 | 49% |
Move 1 - Tackle attack¶
A single target tackle attack.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | playertargetID after GetSingleTarget |
2 | null | null | commandsuccess |
Logic sequence¶
- GetSingleTarget called
checkingdeadis set to new coroutine called SeedlingTackle which will setcheckingdeadto null upon completion- Yield all frames until
checkingdeadis null
This is what the coroutine effectively does:
- animstate set to 23 (
Chase) - Done 2 times:
- Jump called
Jumpsound plays with 0.75 pitch and 1.6 volume- Yield for 0.1 seconds
- Yield all frames until
ongroundgoes to true - Yield a frame
- CameraFocusTarget called
- MoveTowards
playerdata[playertargetID]position + 3.0 in x with a 2.0 multiplier and both the current animstate as the walkstate and stopstate - Yield all frames until
forcemoveis done - Yield for 0.2 seconds
Spin10sound plays- MoveTowards
playerdata[playertargetID]position + (0.35, 0.0, -0.1) with a 2.5 multiplier and both the current animstate as the walkstate and stopstate - Yield all frames until
forcemoveis done - DoDamage 1 call happens
- Jump called
flipset to false (withoverrideflip)- MoveTowards
playerdata[playertargetID]position + 2.0 in x with a 0.75 multiplier and both the current animstate as the walkstate and stopstate - Yield all frames until
forcemoveis done flipis set to falsecheckingdeadset to null indicating the caller that the coroutine completed
Move 2 - Headbonk attack¶
A single target headbonk attack.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | playertargetID after GetSingleTarget |
2 | null | null | commandsuccess |
Logic sequence¶
- GetSingleTarget called
checkingdeadset to a new SeedlingHeadbonk coroutine with 2 damage, actionid as the attacker id, no property and without skipwalk. This coroutine setscheckingdeadto null when completed- Yield all frames until
checkingdeadis null
Here is what SeedlingHeadbonk effectively does with those parameters:
- Camera moves to look near
playerdata[playertargetID] - animstate set to 23 (
Chase) - MoveTowards
playertargetentityposition + (2.0, 0.0, -0.2) with a multiplier of 2.0 - Yield all frames until
forcemoveis done Jumpsound plays- Jump called
- Yield for 0.3 seconds
- Yield all frames until
ongroundis true - Camera moves to look near
playertargetID - Yield a frame
- animstate set to 100
Turnsound plays- Over the course of 35.0 frames (but visually occurs as if it was 32.0 frames with the last 3 being padding), this enemy moves to
playertargetentityposition + (0.25, 2.8, -0.1) via a BeizierCurve3 with a ymax of 5.5 while the z angle gets a LerpAngle done to 180.0 - DoDamage 1 call happens
- Yield for 0.1 seconds
spriteangles zeroed out- animstate set to 1 (
Walk) Turn2sound plays- Over the course of 25.0 frames, this enemy moves to its current position + 2.0 in x with the y being 0.0 via a BeizierCurve3 with a ymax of 3.0
checkingdeadis set to null which signals the caller that this coroutine completed
Move 3 - Undergound strike attack¶
A single target undergound strike attack. position is set to Ground after.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | playertargetID after GetSingleTarget |
2 | Pierce1 | null | commandsuccess |
1: Enemy piercing damages are disabled so this property does nothing, see the CalculateBaseDamage documentation to learn more
About incorrect Poison property logic¶
While the DoDamage call features a Pierce property, the move ends up doing an incorrect version of the Poison property logic due to the single property shortcoming. Here are the differences:
- On FRAMEONE, regular blocking will incorrectly prevent the condition from being inflicted which doesn't happen normally
- The amount of turns to inflict is 3 instead of 2
- The Sturdy condition on the target won't prevent the condition to be inflicted when it normally would have
- The
StatusMirrormedal does nothing when equipped on the target when it should have inflicted the condition back to this enemy - The
PoisonTouchmedal won't work despite the attack being physical - The condition infliction can still happen if the target has the Numb while having the
ShockTroopermedal equipped - The
Poisonsound is not played when it should have been
Logic sequence¶
- GetSingleTarget called
checkingdeadis set to a new UndergroundStrike coroutine with 2 damage from this enemy with a poison property without staying underground- Yield all frames until
checkingdeadgoes to null (the coroutine is done)
This is effectively what the coroutine does:
- Camera moves to look near
playerdata[playertargetID], but zoomed in Diggingsound plays on loop usingsounds[9]with 1.1 pitch and 0.75 volume- Over the course of 100.0 frames, position moves to
playertargetentity's position + -0.25 in z - Yield for 0.25 seconds
sounds[9]stoppedDigPopsound plays- DoDamage 1 call happens
- If all of the following conditions are fufilled, SetCondition is called to inflict the Poison condition to
playerdata[playertargetID]for 3 main turns (NOTE: this has a lot of caveats, see the section above for details):commandsuccessis false (didn't blocked, ignores FRAMEONE)playerdata[playertargetID]'spoisonresis less than 100 (it's not immune)- A
poisonresresistance check passes playerdata[playertargetID]doesn't have the Shield condition
- y
spinset to 20.0 diggingset to false- scale reset to
startscale - animstate set to 100
DirtExplodeLightparticle plays at this enemy position- ShakeScreen with 0.15 ammount and 0.2 time
- Over the course of 50.0 frames, position moves to
playertargetentity+ 2.0 in x using a BeizierCurve3 with a ymax of 6.0 spinzeroed out- position set to
Ground - Yield for 0.25 seconds
checkingdeadset to null to signal DoAction that the coroutine completed