SeedlingKing¶
data usage¶
At the start of the action, if data is null or empty, it's initialised to be 1 element with a starting value of 0.
data[0]: When the value is 0, it means this enemy hasn't went through its phase transition yet which happens on the start of the actor turn if their HPPercent reaches 0.5 or below. When this transition occurs, the value is set to 1 so the transition only happens once per battle
HardMode changes¶
HardMode being true does the following changes:
- When the phase transition occurs in the pre move logic, this enemy gains a DefenseUp condition for 9999999 main turns (effectively infinite)
- In the enemy summon move, the summoned enemy gains an AttackUp and a DefenseUp conditions for 999999 each (effectively infinite)
- If this enemy attempts to use the enemy summon move when there's already 3 or more enemy party members and the phase transition hasn't happened yet a seeds throw move will be used instead of not using any moves
Move selection¶
4 moves are possible:
- A single target tackle attack
- A party wide rolling attack
- Summons up to 2 new enemies from the seedlings family of enemies
- Multiple seeds throws targetting random player party members
The decision of which move to use is based on odds, but those odds changes if HPPercent becomes 0.5 or lower. Here are the base odds of each move in either situations:
| Move | Odds when HPPercent > 0.5 | Odds when HPPercent <= 0.5 |
|---|---|---|
| 1 | Never used | 4/11 |
| 2 | Never used | 3/11 |
| 3 | 3/4 | 2/11 |
| 4 | 1/4 | 2/11 |
However, move 3 will not be used if there are already 3 or more enemy party members. What happens in that situation when it is selected is decided by the following logic:
- If HPPercent is 0.5 or lower, Move 1 is used
- Otherwise, if hardmode is false, the entire action ends with no moves being used
- Otherwise (hardmode is true), move 4 is used
Pre move logic¶
The following logic always happen at the start of the actor turn.
The game determines if we are before or after phase transition threshold by checking if HPPercent is 0.5 or below. If it is and data[0] is 0, it means the transition has yet to happen. Notably, it sets moves to 2 which grants 2 actor turns per main turns to this enemy (excluding the current main turns). This is the phase transition logic:
- If hardmode is true, SetCondition called to inflict the DefenseUp condition on the new enemy for 9999999 main turns (effectively infinite)
- Emoticon called with emote
Exclamationfor 50 time Wamsound playsdata[0]set to 1 so this transition doesn't happen again- animstate set to 100
Prefabs/Particles/AngryParticleinstantiated childed to thespritewith a local position offreezeoffset- Yield for 0.75 seconds
Prefabs/Particles/AngryParticlegets destroyed- animstate set to 2 (
Jump) - Jump called with an h of 15.0
Turnsound plays with 0.9 pitch- Yield for 0.5 seconds
heightandminheightset to 0.0subentityset to null after saving their elements into a local array- All previous
subentityelements gets rooted and their animstate set to 11 (Hurt) - Yield until this enemy is
onground - animstate set to 0 (
Idle) - SetAnim called with
f Thump5sound playsimpactsmokeparticles plays at this enemy position- For each older
subentityelements:- x angles set to 85.0
- FadeSprite called with 90.0 frametime with destroy
- ShakeScreen called with 0.2 ammount and 0.75 time
- Yield for 0.75 seconds
movesset to 2 (meaning this enemy now gets 2 actor turns per main turns)- SetAnim called with empty string
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 |
4 | null | {BlockSoundOnly} | commandsuccess |
Logic sequence¶
- GetSingleTarget called
- Camera moves to look near
playerdata[playertargetID] - animstate set to 1 (
Walk) - MoveTowards
playertargetentityposition + (3.0, 0.0, -0.1) with 2.0 multiplier using both 1 (Walk) as walkstate and stopstate - Yield all frames until
forcemoveis done Grow1sound plays with 0.7 pitch- ShakeSprite called with intensity (0.1, 0.0, 0.0) and 45.0 frametimer
- This enemy moves +1.0 in x via MainManager.MoveTowards with 45.0 frametime with smooth with local
- Yield for 0.75 seconds
Grow2sound plays- Over the course of 10.5 frames, this enemy moves to
playertargetentityposition + (0.75, 0.0, -0.1) via a lerp HugeHitsound plays- ShakeScreen called with ammount (0.2, 0.0, 0.0) with 0.75 time with dontreset
- DoDamage 1 call happens
- Over the course of 31.0 frames, this enemy moves + 1.5 in x via a BeizierCurve3 with a ymax of 3.0
ThumpSoftsound plays
Move 2 - Rolling attack¶
A party wide rolling attack.
PartyDamage¶
| # | Conditions | caller | damage | property | block | jumpheight | spinammount | jumpevenonblock | overrides |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Always happen | This enemy | 3 | null | commandsuccess |
10.0 | (0.0, 20.0, 0.0) | false | null |
Logic sequence¶
- ShakeSprite called with intensity (0.1, 0.0, 0.0) and 60.0 frametimer
- This enemy moves +1.0 in x via MainManager.MoveTowards with 60.0 frametime with smooth without local
- Jump called
Spin5sound plays on loop usingsounds[5]- Yield for a second
trailset to true- SetDefaultCamera called
sounds[5]stoppedSeedlingKingRollsound plays- Over the course of 37.5 frames, this enemy moves to (-15.0, 0.0, 0.0) via a lerp. On the first frame their x position gets less than -4.5:
- ShakeScreen called with 0.2 ammount and 0.75 time
- DoDamage 1 call happens
trailset to false- animstate set to 1 (
Walk) - Yield for 0.75 seconds
- Over the course of 38.0 frames, this enemy moves from (10.0, 0.0, 0.0) to startp via a lerp
Move 3 - Enemies summon¶
Summons up to 2 new enemies from the seedlings family of enemies.
Logic sequence¶
- animstate set to 100
rustling1sound plays- Yield for 0.25 seconds
- The position of the new enemies is determined depending on if their place is taken or not. The left location is at (0.25, 0.0, -0.1) and the right location is at (7.0, 0.0, 0.1). The left one takes priority if available, but both will be summoned if both locations are free
- Yield for 0.33 seconds
- For each free location available to summon from the 2 ones above:
rustling1sound plays- A new sprite object is created rooted using the
TangyBerryitem sprite - Over the course of 61.0 frames, the sprite moves to the target location via a BeizierCurve3 with a ymax of 6.0. Before each frame yield, the z angle is set to the frame index * 20.0
- The sprite is destroyed
- A seedling family enemy id is generated using the following odds:
Chargesound playscheckingdeadset to a new SummonEnemy call to summon the enemy with the generated id with typeFromGroundInstantat the location without cantmove (meaning this enemy will be able to act immeditely on the current main turn)- Yield until
checkingdeadis null (the coroutine completed) - The new enemy gets some adjustements:
maxhp: Divided by 2 flooredhp: Set to theirmaxhpexp: Divided by 2 floored
- If hardmode is true:
- SetCondition called to inflict the AttackUp condition on the new enemy for 999999 main turns (effectively infinite)
- SetCondition called to inflict the DefenseUp condition on the new enemy for 999999 main turns (effectively infinite)
Move 4 - Seeds throw¶
Multiple seeds throws targetting random player party members.
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 for half the amount of seeds thrown ceiled, but each call can only happen if GetRandomAvaliablePlayer with nullable doesn't return -1. The amount of seeds thrown is random between 3 and 5 inclusive | 2 | null | This enemy | GetRandomAvaliablePlayer with nullable1 (target changes for each calls) | A new GameObject rooted with a SpriteRenderer using the HardSeed item sprite positioned at this enemy + (0.0, 3.0, 0.1) using the spritemat material on layer 0 (Default) |
55.0 | A random integer between 6 and 8 inclusive which is then cast to float | null | null | WoodHit |
Empty string | (0.0, 0.0, random integer between -20 and 20 which is then cast to float) | false |
1: This targetting scheme is broken. See the nullable GetRandomAvaliablePlayer documentation for more details.
Logic sequence¶
- ShakeScreen called for 0.05 ammount and -1.0 time
animstateset to 100rustling1sound plays on loop usingsounds[5]- Yield for 0.5 seconds
checkingdeadset to a new SeedShake coroutine called in such a way that it effectively ends up doing the following:- A SpriteRenderer array is created to contain the seeds with the length being the amount to throw which is random between 3 and 5 inclusive
- For each seeds to throw:
- The seed element of the array is initialised to a new GameObject rooted with a SpriteRenderer using the
HardSeeditem sprite positioned at this enemy + (0.0, 3.0, 0.1) using thespritematmaterial on layer 0 (Default) - GetRandomAvailablePlayer called with nullable. NOTE: This targetting scheme is broken, see the nullable GetRandomAvailablePlayer documentation for details
- If the seed index is even and the target player party member isn't -1,
Pingsound plays followed by a Projectile 1 call. If it's odd,PingUpsound plays with 0.75 volume followed by the seed object moving via MainManager.ArcMovement to a random vector between (0.0, 0.0, -5.0) and (10.0, 0.0, 5.0) with destroyonend and using the same spin, height and frametime than the Projectile 1 call - Yield for a random interval between 0.3 and 0.6 seconds
- The seed element of the array is initialised to a new GameObject rooted with a SpriteRenderer using the
- Yield all frames until all elements of the seeds array are null (all Projectile 1 calls completed)
checkingdeadset to null
- Yield all frames until
checkingdeadis null (SeedShake completed) - MainManager.
screenshakeset to Vector3.zero sounds[5]stopped