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
Exclamation
for 50 time Wam
sound playsdata[0]
set to 1 so this transition doesn't happen again- animstate set to 100
Prefabs/Particles/AngryParticle
instantiated childed to thesprite
with a local position offreezeoffset
- Yield for 0.75 seconds
Prefabs/Particles/AngryParticle
gets destroyed- animstate set to 2 (
Jump
) - Jump called with an h of 15.0
Turn
sound plays with 0.9 pitch- Yield for 0.5 seconds
height
andminheight
set to 0.0subentity
set to null after saving their elements into a local array- All previous
subentity
elements gets rooted and their animstate set to 11 (Hurt
) - Yield until this enemy is
onground
- animstate set to 0 (
Idle
) - SetAnim called with
f
Thump5
sound playsimpactsmoke
particles plays at this enemy position- For each older
subentity
elements:- 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
moves
set 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
playertargetentity
position + (3.0, 0.0, -0.1) with 2.0 multiplier using both 1 (Walk
) as walkstate and stopstate - Yield all frames until
forcemove
is done Grow1
sound 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
Grow2
sound plays- Over the course of 10.5 frames, this enemy moves to
playertargetentity
position + (0.75, 0.0, -0.1) via a lerp HugeHit
sound 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
ThumpSoft
sound 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
Spin5
sound plays on loop usingsounds[5]
- Yield for a second
trail
set to true- SetDefaultCamera called
sounds[5]
stoppedSeedlingKingRoll
sound 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
trail
set 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
rustling1
sound 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:
rustling1
sound plays- A new sprite object is created rooted using the
TangyBerry
item 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:
Charge
sound playscheckingdead
set to a new SummonEnemy call to summon the enemy with the generated id with typeFromGroundInstant
at the location without cantmove (meaning this enemy will be able to act immeditely on the current main turn)- Yield until
checkingdead
is null (the coroutine completed) - The new enemy gets some adjustements:
maxhp
: Divided by 2 flooredhp
: Set to theirmaxhp
exp
: 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
animstate
set to 100rustling1
sound plays on loop usingsounds[5]
- Yield for 0.5 seconds
checkingdead
set 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
HardSeed
item sprite positioned at this enemy + (0.0, 3.0, 0.1) using thespritemat
material 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,
Ping
sound plays followed by a Projectile 1 call. If it's odd,PingUp
sound 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)
checkingdead
set to null
- Yield all frames until
checkingdead
is null (SeedShake completed) - MainManager.
screenshake
set to Vector3.zero sounds[5]
stopped