Acolyte
¶
Asumptions¶
It is assumed that this enemy has its cantfall set to true because it should only change its position through specific ways:
- Using the vine spawn move
- Using the aerial strike move
- Have the
AcolyteVine
enemy that they spawn die
That last one leads to another assumption: AcolyteVine
and this enemy must have an eventondeath
set to the proper EventDialogue because this EventDialogue will allow the AcolyteVine
to die first and to drop this enemy's position to Ground
. This is necessary because there's custom logic that needs to happen which goes beyond the regular fall logic of the damage pipeline.
data
usage¶
At the start of the action, if data
is null or empty, it's initialised to be 2 elements with a starting value of 0.
data[0]
: The amount of times the vine spawn move needs to be redirected to a vine attack move before being able to spawn anAcolyteVine
again. When the vine spawn move is used for the first time, this value is set to 2. From there, everytime the vine spawn move is used, if this value is still higher than 0, it is decremented and the vine attack move is used instead. When it reaches 0, the vine spawn move can be used again if selected. There is an exception to this: oncedata[1]
gets set to 1 (when the phase transition will occur), this value will be set to 0 on the same actor turn and the vine spawn move will be used. Essentially, oncedata[1]
gets set to 1, this enemy will ignore the existing value and proceed with using the vine spawn move anywaydata[1]
: A phase transition tracker with three possible states depending on the value:- 0: The initial state before HPPercent becomes 0.4 or lower. From this state, the value is only set to 1 when HPPercent reaches 0.4 or lower
- 1: HPPercent reached 0.4 or lower, but the phase transition hasn't fully occured yet. It occurs on the same actor turn and when it occurs, the value is set to 2 as well as
data[0]
set to 0 on top of using the vine spawn move - 2: The phase transition happened and from this point, this value can no longer influence the action logic
HardMode changes¶
HardMode being true does the following changes:
- The prayer move, vine spawn move and vine attack moves have their base odds changed
- The vine attack move may hit twice instead of only once, but for 2 base damage on the first hit instead of 3 (the second hit does 2 base damage if it happens)
Move selection¶
5 moves are possible:
- A prayer that inflicts DefenseUp to themselves
- Spawns a new
AcolyteVine
enemy and gets on top of it which changes their position toFlying
- A single target vine attack that may hit multiple times
- A single target aerial strike that also changes the position to
Ground
- Transition to the second phase which spawns a new AngryPlant enemy then performs move 2
Move 4 can only be used and will always be used if position is Flying
.
For move 5, it can only be used once in the entire battle and it will always be used if all of the following conditions are fufilled:
- position is
Ground
(move 2 wasn't used) - HPPercent is 0.4 or lower
data[1]
is 0 at the start of the actor turn (meaning move 5 was never used before)
Move 5 marks a phase transition whose state is tracked by data[1]
. It becomes 1 once all of the above is detected and on the same actor turn, it becomes 2 once the transition is completed which prevents to use the move again.
All the other 3 moves have base odds which are shown in the following table and they differ depending if hardmode is true or not. However, the decision of the move to use may not be the final one. It is possible the move's logic decides to perform a different move instead which is reffered to as a redirection. They typically happen when proceeding with the move is illogical or undesired.
Here are all the move's base odds and their possible redirections:
Move | Base odds (hardmode is false) | Base odds (hardmode is true) | Possible redirections |
---|---|---|---|
1 | 2/7 | 1/3 | Move 3 if this enemy already has the DefenseUp condition |
2 | 2/7 | 1/3 | Move 3 if data[0] is above 0 (set to 2 as part of using this move otherwise). An exception to this is when move 5 (phase transition) is used since the usage of move 5 sets data[0] to 0 and then uses move 2. data[0] decrements when this redirection occurs |
3 | 3/7 | 1/3 | None, the move is always used once selected |
Pre move logic¶
The following logic is always performed at the start of the action logic:
sprite
local position is reset to Vector3.zero
Post move logic¶
The following logic is always performed at the end of the action logic:
sprite
local position is reset to Vector3.zero
Move 1 - Prayer¶
A prayer that inflicts DefenseUp to themselves. No damages are dealt
nonphyscal
set to true¶
This move always sets nonphyscal
to true, but it doesn't affect anything for this move.
Logic sequence¶
- Camera moves to look near this enemy
- animstate set to 103
- Yield for 0.6 seconds
- animstate set to 105
- Yield for 0.35 seconds
- SetCondition called to inflict DefenseUp on this enemy for 3 main turns (effectively 2 since the main turn advances soon after)
StatUp
sound plays- StatEffect called on this enemy with type 1 (blue up arrow)
- Yield for 0.75 seconds
Move 2 - AcolyteVine
spawn¶
Spawns a new AcolyteVine
enemy and gets on top of it which changes the position to Flying
. No damages are dealt.
About status resistance¶
This move will make this enemy immune to Poison, Freeze, Numb and Sleep conditions
nonphyscal
set to true¶
This move always sets nonphyscal
to true, but it doesn't affect anything for this move.
Logic sequence¶
- If
data[0]
is above 0:data[0]
is decremented- Move 3 (vine attack) is performed instead
- Camera moves to look near this enemy
data[0]
set to 2- animstate set to 103
- Yield for 0.6 seconds
- animstate set to 101
- Yield for 0.3 seconds
Charge9
sound plays- ShakeScreen called with an ammount of (0.1, 0.05, 0.0) for 0.5 time
- AddNewEnemy called to add a new
AcolyteVine
enemy at this enemy position + (1.1, 45.0, 0.1) - Yield a frame
DirtExplode
particles played at theAcolyteVine
enemy- Over the course of 30.0 frames,
AcolyteVine
moves to + 5.0 in y with their scale changed to theirstartscale
from endata via a lerp and their y angle changes from 720.0 to 0.0 via a lerp - Yield for 0.1 seconds
- animstate set to 100
- Yield for 0.8 seconds
Jump
sound plays- animstate set to 2 (
Jump
) - y
spin
set to 15.0 - Over the course of 40.0 frames,
height
is changed via a lerp to the y output of a BeizierCurve3 (that goes for the first 36.0 frames) from startp to startp + 0.34 in y with a ymax of 8.0 AcolyteVine
'sbasestate
and animstate set to 101height
set to 3.4- ShakeSprite called with intensity (0.1, 0.1, 0.0) with 0.2 frametimer
AcolyteVine
's spin` zeroed outAcolyteVine
'ssprite
angles set to FlipAngle- position changed to
Flying
AcolyteVine
animstate set to itsbasestate
AcolyteVine
has theBattleIdlef
animationClip played- y
cursoroffset
decreased by 1.0 poisonres
,freezeres
,numbres
andsleepres
set to 110 which makes this enemy immune to Poison, Freeze, Numb and Sleep
Move 3 - Vine attack¶
A single target vine attack 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 | Always happen 1 time (from 1 to 2 times instead if hardmode us true, but the second hit requires the targer's hp to still be above 0) |
This enemy | playertargetID after GetSingleTarget (same target for each calls) |
|
Pierce1 | null | commandsuccess |
1: Enemy piercing damages are disabled so this property does nothing, see the CalculateBaseDamage documentation to learn more
Logic sequence¶
- GetSingleTarget called
- Camera moves to look near the midpoint of this enemy and
playertargetentity
- animstate set to 103
- Yield for 0.6 seconds
- animstate set to 101
- Yield for 0.3 seconds
checkingdead
is set to a new VineAttack coroutine with 3 damageamt (2 instead if hardmode is true), actionid as the callerid without 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:
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
Prefabs/Objects/VenusRoot
position changes 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 4 - Aerial strike¶
A single target aerial strike that also changes the position to Ground
.
About status resistance¶
This move will undo any resitance increases of Poison, Freeze, Numb and Sleep conditions
DoDamage calls¶
# | Conditions | attacker | target | damageammount | property | overrides | block |
---|---|---|---|---|---|---|---|
1 | Always happen | This enemy | playertargetID after GetSingleTarget |
4 | null | null | commandsuccess |
Logic sequence¶
- GetSingleTarget called
- y position increased by
height
height
set to 0.0sprite
local position set to Vector3.zero- Camera moves to look near this enemy
- animstate set to 0 (
Idle
) - Jump called
- Yield for 0.3 seconds
- animstate set to 108
- Yield for 0.2 seconds
- animstate set to 2 (
Jump
) spin
set to (0.0, 15.0, -0.1)- The
enemydata
index of theAcolyteVine
is obtained (it should always be present from here) AcolyteVine
animstate set to 18 (KO
)AcolyteVine
'shp
set to 0- Camera moves to look near
playertargetentity
ChargeDown4
sound playsSpin2
sound plays on loop with 1.1 pitch and 0.6 volumeAcolyteVine
MainManager.MoveTowards down by 5.0 in y with 50.0 multiplier with smooth and without local- Over the course of 40.0 frames, position is lerped to the midpoint between startp and
playertargetentity
+ (0.75, 5.5, 0.0) - Yield for 0.2 seconds
Spin2
sound stoppedToss4
sound playsspin
zeroed outflip
set to falsesprite
local position set to Vector3.zero- animstate set to 107
trail
set to true- Over the course of 20.0 frames, position is lerped to
playertargetentity
+ 1.0 in y trail
set to false- DoDamage 1 call happens
- ShakeScreen called with an ammount of (0.1, 0.1, 0.1) and 0.1 time
HugeHit
sound plays- Yield for 0.05 seconds
- SetDefaultCamera called
- animstate set to 110
- z
spin
set to -20.0 - Over the course of 40.0 frames, this enemy moves to startp + Vector3.up via a BeizierCurve3 with a ymax of 7.0 and
AcolyteVine
has itsstartscale
and itsrotater
angles lerped to Vector3.zero - position set to startp
- animstate set to 108
spin
zeroed out- Yield a frame
sprite
angles reset to Vector3.zero- position set to
Ground
- Yield for 0.5 seconds
cursoroffset
,poisonres
,freezeres
,numbres
andsleepres
are reset to their default value from GetEnemyData without createentityAcolyteVine
is destroyed- ReorganizeEnemies called
Move 5 - Phase transition¶
Transition to the second phase which spawns a new AngryPlant enemy and performs move 2 (vine spawn).
nonphyscal
set to true¶
This move always sets nonphyscal
to true, but it doesn't affect anything for this move.
Logic sequence¶
data[1]
set to 1cantmove
decremented. This gives another actor turn to this enemy which will be move 4 (aerial strike) because position will always end up beingFlying
at the end of this actor turn- Camera moves to look near this enemy
- animstate set to 103
- Yield for 0.6 seconds
- animstate set to 105
- Yield for 0.35 seconds
- Camera moves to the left by 3.0
- ShakeScreen called for 0.5 time
- Yield for 0.5 seconds
VenusBudAppear
sound plays- AddNewEnemy called to add a new AngryPlant enemy at this enemy position + (-3.0, 0.0, -0.1)
- DeathSmoke particles plays at the
AngryPlant
AngryPlant
'sstartscale
set to Vector3.zero- Yield a frame
AngryPlant
animstate set to 101AngryPlant
's yspin
set to 20.0- Over the course of 30.0 frames,
AngryPlant
'sstartscale
is lerped to (1.15, 1.15, 1.15) AngryPlant
'sstartscale
set to (1.15, 1.15, 1.15)AngryPlant
'sspin
zeroed out- Yield for 0.5 seconds
AngryPlant
's animstate set to 0 (Idle
)data[1]
set to 2 (completed the phase transition)data[0]
set to 0 (forces the vine spawn move to be available for usage)- Move 2 (vine spawn) is used