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 toFlying
move. If this enemy'sposition
isGround
, the value is decremented before deciding which of the 2 attackingGround
moves to use. If after this decrement, the value becomes -3, this enemy will use theposition
change move so it will go toFlying
which also causes this value to be reset to 0. Effectively, it means that at most, this enemy will remain onGround
for 2 actor turns in a row before using theposition
change move. NOTE: Since the value is only decremented when theirposition
isGround
, if the player causes them to change toFlying
, it freezes this cooldown, but it will still apply the moment this enemy comes back toGround
data[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 onGround
and it also means that the value stays the same as long asposition
isGround
. 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
hp
is 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
hp
is 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 theFlying
move 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 theFlying
move 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 theFlying
move 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 whileFlying
before 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
cantmove
is now decremented meaning they can act immediately on the same main turn they were summoned - During the
Ground
move selection process, the odds of which move to use changes to favor the vine attack move (Ground
version) - In the vine attack move (
Ground
version), 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
barfill
decrease 25% faster each frame. However, this change doesn't affect anything ifmashcommandalt
is true making the command a SequentialKeys - In the vine attack move (
Flying
version), 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 (
Ground
version) that may hit multiple times followed by a 3hp
heal - A single target flower bud attack that continuously drains
hp
followed by a 3hp
heal - Changes their position to
Flying
and gets another actor turn - A single target vine attack (
Flying
version) 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
: Theenemydata
index 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
enemydata
is obtained via calledby data[3]
is set to 3- The enemy id is generated based on the type paramneter described above
EverLastingKingSummonArtifact
sound 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
checkingdead
set 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'sOffscreen
except for theTablet
where it's theTablet
type- Yield all frames until
checkingdead
is 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
cantmove
is 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:
Charge7
sound 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
Heal3
sound 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
hologram
is false:- Camera moves to look near (this enemy x position,
sprite
local 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
Rumble
sound 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/SphereGlowEffect
GameObject 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/SphereGlowEffect
changes to 0.0x via a lerp - The
Prefabs/Objects/SphereGlowEffect
gets destroyed
- A
EverLastingKingVine
sound plays with 0.8 pitch- Yield for a second
- Yield for a second
Rumble
sound plays- The amount of
hp
to 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 thehp
will be SET AT, not the amount HEALED BY - If flags 614 is false (HARDEST is inactive),
hp
is 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
hologram
is false:- Every player party member whose
hp
is 0 gets revived via RevivePlayer leaving them with 1hp
without 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
SurviveWith10
is removed from this enemy weakness which makes them vulnerable to be killedenemybounce
set to a one element Coroutine arraycheckingdead
set to a new ChangePosition call to change position toFlying
- Yield all frames until
checkingdead
is null (the coroutine completed) - If KeyL isn't present:
enemybounce[0]
is set to a new SummonArtifact call to summon a newKeyL
enemy- 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 newKeyR
enemy- 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
)cantmove
is 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 thedata
section 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
EverLastingKingVine
sound plays- Yield for 0.5 seconds
checkingdead
is set to a new VineAttack coroutine with 5 damageamt, actionid as the callerid with gettarget. The coroutine will setcheckingdead
to null upon completion- Yield all frames until
checkingdead
goes 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
Rumble3
sound 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/VenusRoot
are instantiated with the amount being the amount of hits to do at (playertargetentity
x position + a random number between -2.0 and 2.0, -5.0,playertargetentity
z position). Each instance is set to LookAt theplayertargetentity
and 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
playertargetentity
to the matchingPrefabs/Objects/VenusRoot
element - Yield for 0.75 seconds
- For each hit:
Charge8
sound plays- The matching
Prefabs/Objects/VenusRoot
scale is multiplied by 1.65 - Over the course of 10.0 frames, the matching
Prefabs/Objects/VenusRoot
position lerps to its position + the matching heading direction vector * 5.0. The first time reaching the 5th frame or later whenplayerdata[playertargetID]
'shp
is 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:
Rumble3
sound 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/VenusRoot
instances has ther scale lerped to Vector3.zero - Yield for a frame
- All
Prefabs/Objects/VenusRoot
instances gets destroyed checkingdead
set 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
playertargetentity
position - animstate set to 109
- Yield for 0.5 seconds
Rumble3
sound 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/OpeningFlowerBud
GameObject is instantiated rooted atplayertargetentity
position - 0.1 in z whose SpriteRenderer has a material of MainManager.spritemat
and a scale of 2.0x playertargetentity
animstate set to 11 (Hurt
)Spin9
sound plays with 0.8 pitchDirtExplode
particles plays atplayertargetentity
position- The
Close
animation clip is played onPrefabs/Objects/OpeningFlowerBud
's Animator Dig3
sound plays- animstate set to 0 (
Idle
) Clomp
sound plays- Yield for 0.5 seconds
- A SpriteBounce is added to the
Prefabs/Objects/OpeningFlowerBud
with a MessageBounce of 2.0 multiplier and withstartscale
set to true - DoCommand 1 call happens
infinitecommande
set to true which will prevent DoCommand 1 to end when MainManager.mashcommandalt
is true until the action command is succeeded- CreateHelpBox called with 4 (the TappingKey command's help)
- As long as
playerdata[playertargetID]
'shp
is above 0 andactionroutine
isn't null (meaning DoCommand 1 hasn't ended yet):- Yield for 0.5 seconds
- If
barfill
is less than 1.0 (it isn't full yet):- DoDamage 1 call happens
- If
lastdamage
is above 0, Heal is called to heal this enemy bylastdamage
amount ofhp
- Yield for 0.75 seconds
- DestroyHelpBox is called which sets
helpboxid
to -1 and destroyshelpbox
if it existed in 0.5 seconds with shrink before setting it to null Barfill
sound stops- If
playerdata[playertargetID]
'shp
is 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
Open
animation clip is played onPrefabs/Objects/OpeningFlowerBud
's Animator CherryBoom
particles plays at theplayertargetentity
position- ShakeScreen called with 0.1 ammount and 0.5 time with dontreset
- MainManager.MoveTowards called to move
Prefabs/Objects/OpeningFlowerBud
to - 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/OpeningFlowerBud
gets 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
)checkingdead
set to a new ChangePosition calle to change the position of this enmey toFlying
- Yield all frames until
checkingdead
is null (the coroutine compelted) cantmove
is decremented which grants another actor turn to this enemy (it transitions to theFlying
move 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
EverlastingKingVine
sound plays- Yield for 0.5 seconds
checkingdead
is 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 setcheckingdead
to null upon completion- Yield all frames until
checkingdead
goes to null
This is what the coroutine effectively ends up doing:
- GetSingleTarget called
Rumble3
sound 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/VenusRoot
are instantiated with the amount being the amount of hits to do at (playertargetentity
x position + a random number between -2.0 and 2.0, -5.0,playertargetentity
z position). Each instance is set to LookAt theplayertargetentity
and 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
playertargetentity
to the matchingPrefabs/Objects/VenusRoot
element - Yield for 0.75 seconds
- For each hit:
Charge8
sound plays- Over the course of 10.0 frames, the matching
Prefabs/Objects/VenusRoot
position lerps to its position + the matching heading direction vector * 5.0. The first time reaching the 5th frame or later whenplayerdata[playertargetID]
'shp
is above 0, DoDamage 1 call happens before the frame yield - Yield for 0.5 seconds
- If this is the last hit:
Rumble3
sound 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/VenusRoot
instances has ther scale lerped to Vector3.zero - Yield a frame
- All
Prefabs/Objects/VenusRoot
instances gets destroyed checkingdead
set 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
checkingdead
set to a new FirePillar coroutine from this enemy without green- Yield all frames until
checkingdead
is null (the coroutine completed)
Here is what the coroutine ends up doing:
- Yield for 0.5 seconds
FirePillar
sound plays- A new
Prefabs/Objects/FirePillar 1
GameObject is instantiated childed to thebattlemap
atpartymiddle
with 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'sshrinkspeed
set 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'stargetscale
set to (0.0, 1.0, 0.0)- All ParticleSystem under
Prefabs/Objects/FirePillar 1
are stopped Prefabs/Objects/FirePillar 1
's DialogueAnim'sshrinkspeed
set to 0.05Prefabs/Objects/FirePillar 1
gets destroyedcheckingdead
is 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¶
BagRustle
sound 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
battlemap
using theSprites/Entities/waspking2
sprite at index 53 (this enemy's axe) positioned atsprite
position + (-1.0, 1.0, -0.1) - If
hologram
is true, theSprites/Entities/waspking2
material is set to MainManager.holosprite
WaspKingAxToss
sound plays- Over the course of 30.0 frames (21.0 frames instead if hardmode is true), the axe moves to
playertargetentity
position + (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
sprite
position + (-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]
'shp
is 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.
framestep
which means it will progressively spin the other way in z - Yield for 0.1 seconds
WaspKingAxSpin
sound 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.
framestep
which 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
playertargetentity
position + (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
WaspKingAxeThrowCatch
sound 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¶
enemybounce
is 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 (
hp
above 0 and not eatenby):- GetSingleTarget called
WaspKingMFireball1
sound plays- animstate set to 107
- The projectile element is set to a new
Prefabs/Particles/Fireball
GameObject childed to thebattlemap
positioned at this enemy'ssprite
position + (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
WaspKingFireball2
sound 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
inice
set to true and theirsprite
angles reset to Vector3.zero - animstate set to 107
ArtifactSpin
sound plays- Over the course of 60.0 frames,
KeyL
's yspin
changes to 30.0 via a lerp over the first 30.0 frames andKeyR
's yspin
changes to -30.0 via a lerp over the first 30.0 frames - Over the course of 31.0 frames, both
KeyL
andKeyR
moves to this enemy position + (0.0, 6.0, -0.1) - theirheight
in y via a lerp ArtifactKey
sound plays with 1.2 pitch- FadeIn to pure white with 0.2 speed
- Yield for 0.5 seconds
- both
KeyL
andKeyR
position set to offscreen at -999.0 in y - A new sprite object is created childed to the
battlemap
using theSprites/Objects/artifacts
sprite at index 7 (a full key with both halves together) positioned at this enemy position + (0.0, 6.0, -0.1) - If
hologram
is 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
Lazer2
particles 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 xOmegaEye
sound plays with 1.2 pitchFlash2
sound 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
playertargetentity
position + (2.0, 3.5, -0.1) via a SmoothLerp and their angles changes to (0.0, 0.0, 65.0) via a LerpVectorAngle Charge7
sound 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
Slash3
sound 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
Spin3
sound plays with 0.75 pitch- Over the course of 51.0 frames, both
KeyL
andKeyR
moves from the position of the key when it was destroyed - theKeyL
'sheight
in y to their respective postion before this action via a BeizierCurve3 with a ymax of 6.0. Also,KeyL
's yspin
changes from 30.0 to 0.0 via a lerp andKeyR
's yspin
changes to -30.0 to 0.0 via a lerp - Both
KeyL
andKeyR
has theirinice
set to false and theirspin
zeroed out