HoloLeif¶
Assumptions¶
This enemy is assumed to be fought with HoloVi and HoloKabbu for certain moves to be usable and for the move selection process to work correctly.
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]: This reperesents the amount of time some specific moves were used in the battle by incrementing the value on each usage. If the value reaches 5, this enemy will no longer be able to use any moves in the list. Here are the implicated moves:- Revives another enemy party member from
reservedata - Heal another enemy party member for 7
hp - A single target attack involving the same effects as the LongLegSummoner action where the target is a player party member
- Revives another enemy party member from
data[1]: An actor turn cooldown on the usage of the any moves managed bydata[0]. On usage of any of these moves, the value is set to 3. The value is always decremented in the pre move logic when above 0 and the value must be 0 for any of the 3 moves managed bydata[0]to be usable. Effectively, it's a 2 actor turns cooldown before any of the 3 moves become usable againdata[2]: UNUSED. This is because that's because this enemy doesn't have a turn relay simulation move unlike HoloVi and HoloKabbu. Since these 2 enemnies still needs to setdata[2]on the receiver of the relay, this slot is allocated, but not used in any way. It is only set when either of these 2 enemies uses their turn relay simulation move to 2 and it is decremented at the start of the actor turn if above 0, but it is not used to influence move selectiondata[3]: An actor turn cooldown on the usage of some specific moves. The value is always decremented in the pre move logic when above 0 and the value must be 0 for any of moves to be usable. It is set to 2 every time any of the moves is used. Effectively, it's a 1 actor turn cooldown before any of the moves become usable again. Here are the affected moves:- Gives the AttackUp condition to all enemy party members including themselves
- Gives the Shield condition on an enemy party member
- Gives the AttackDown condition to all alive player party members
- Gives the DefenseUp condition to all enemy party members
- Gives the DefenseDown condition to all alive player party members
data[4]: UNUSED. The only thing that happens with this value is it is decremented at the start of the actor turn if above 0, but it is never set to a value above it and it is not used in any way
hitaction support¶
This enemy supports hitaction logic and it will be performed when hitaction is true instead of any moves.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
The following all happens in the HoloLeif coroutine:
- The first
enemydatawith an animid ofBeetleis obtained (should be HoloKabbu under normal gameplay) and if it exists, ItemSpinAnim is called on them with a pos of their position + 1.0 in y using theFavoriteOnemedal icon as sprite and without playSound - Yield return on a EnemyAngryCharge call with this enemy's battleentity:
- Set
dontusechargeto true - If
chargeis less than 3, it is incremented with the following:- animstate set to 102
Wamsound plays- Emoticon called on this enemy with the
Exclamationemote with 20 time - Yield all frames until
emoticoncooldownexpires StatUpsound plays- StatEffect called on this enemy with type 4 (green up arrow)
- Yield for 0.5 seconds
chargeis incremented
- Set
Move selection¶
12 moves are possible:
- A single target ice attack
- Revives another enemy party member from
reservedataleaving them at 7hpwith canmove (so they can take an actor turn immediately on the same main turn) - Heal an enemy party member (including themselves) for 7
hp - A single target attack involving the same effects as the LongLegSummoner action where the target is a player party member
- A party wide icicle throw
- Gives the AttackUp condition to all enemy party members including themselves for 3 main turns (effectively 2 main turns since the current main turn ends soon)
- A multiple hits icicle fall attack that hits 4 times where each hit is single target
- Calls ClearStatus on a player party member
- Gives the Shield condition on an enemy party member (including themselves)
- Gives the AttackDown condition to all alive player party members for 3 main turns (effectively 2 main turns since the current main turn ends soon)
- Gives the DefenseUp condition to all enemy party members including themselves for 3 main turns (effectively 2 main turns since the current main turn ends soon)
- Gives the DefenseDown condition to all alive player party members for 3 main turns (effectively 2 main turns since the current main turn ends soon)
If turns is 0 (the first main turn), the selected move is alwauys deterministic and is determined with the following logic:
- If this enemy's
cantmoveis -1, move 6 is used. This means this enemy has 2 actor turns available which can only happen if HoloVi or HoloKabbu used their turn relay simulation move on this enemy on the first main turn - Otherwise, move 5 is used
Otherwise (not on the first main turn), the decision of which move to use is based on weighted odds. However, these weights have 2 possible distribution sets which will be numbered as follows:
Also, each moves have additional requirements that if they aren't fufilled, the move won't be used and instead cause a reroll of the move selection process. However the amount of attempts to a move selection is tracked and after 5 failures to select a move, move 1 is always used.
Here are the odds for all distributions sets, their usage requirements and the step to take if those requirements aren't fufilled.
| Move | Odds set 1 | Odds set 2 | Requirements |
|---|---|---|---|
| 1 | 0/32 | 8/60 | None, the move is always used when selected |
| 2 | 2/32 | 2/60 |
|
| 3 | 1/32 | 1/60 |
|
| 4 | 1/32 | 1/60 | None, the move is always used when selected |
| 5 | 2/32 | 8/60 | None, the move is always used when selected |
| 6 | 4/32 | 4/60 | data[3] is 0 or less (move 6, 9, 10, 11 and 12 weren't used on the last actor turn of this enemy) |
| 7 | 2/32 | 20/60 | None, the move is always used when selected |
| 8 | 4/32 | 4/60 | There is at least 1 player party member whose hp is above 0 and either they have more than 0 charge or they have the AttackUp condition |
| 9 | 4/32 | 4/60 | data[3] is 0 or less (move 6, 9, 10, 11 and 12 weren't used on the last actor turn of this enemy) |
| 10 | 4/32 | 4/60 | data[3] is 0 or less (move 6, 9, 10, 11 and 12 weren't used on the last actor turn of this enemy) |
| 11 | 4/32 | 4/60 | data[3] is 0 or less (move 6, 9, 10, 11 and 12 weren't used on the last actor turn of this enemy) |
| 12 | 4/32 | 0/60 | data[3] is 0 or less (move 6, 9, 10, 11 and 12 weren't used on the last actor turn of this enemy) |
As a sidenote, the entire move selection process occurs in the HoloLeif coroutine who is yield returned by DoAction.
Pre move logic¶
The following logic always happens before the usage of a move (this happens in DoAction, the rest happens in HoloLeif):
- entity.
sprite.material.renderQueue set to 2500 - CreateShield called on the entity which initialises their
bubbleshieldif it didn't exist yet
Move 1 - Single target ice attack with potential Freeze infliction¶
A single target ice 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 |
3 | Freeze | null | commandsuccess |
Logic sequence¶
This is done by yield returning the EnemyIceAttackBasic coroutine with the battleentity:
- GetSingleTarget
- animstate set to 108
IceMothThrowsound plays- A new
Prefabs/Objects/SingleSphereGameObject is created childed to a newPrefabs/AnimSpecific/mothbattlesphereGameObject - Over the course of 31.0 frames, the
Prefabs/AnimSpecific/mothbattlespheremoves from this enemy position + (1.1, 1.85, -0.1) to this enemy position + (-2.0, -0.5, 5.0) via a BeizierCurve3 with a ymax of 5.0 - The
Prefabs/Objects/SingleSpheregets rooted - If
hologramis true, thePrefabs/Objects/SingleSphereRenderer's color is set to 8080FF (mostly blue) with half opacity Prefabs/AnimSpecific/mothbattlespheregets destroyedWatcherIcesound plays- Over the course of 81.0 frames (71.0 instead if hardmode is true),
Prefabs/Objects/SingleSpheremoves from its position with the y component at 0.0 toplayertargetentityposition via a SmoothLerp Prefabs/Objects/SingleSpheregets destroyed- animstate set to 111
IceMothHitsound plays- A new
Prefabs/Particles/mothicenormalGameObject is created rooted atplayertargetentityposition + 0.5 in y then destroyed in 2.0 seconds - A new
Prefabs/Objects/icepillaris created rooted atplayertargetentityposition with a DialogueAnim that has atargetscaleof (0.5, 0.5, 1.0) - DoDamage 1 call happens
- Yield for 0.65 seconds
- The
Prefabs/Objects/icepillar's DialogueAnim has itsshrinkset to true with ashrinkspeedof 0.025 - The
Prefabs/Objects/icepillargets destroyed in 5.0 seconds - Yield for 0.5 seconds
Move 2 - Revives another enemy party member with 7 hp¶
Revives another enemy party member from reservedata leaving them at 7 hp with canmove (so they can take an actor turn immediately on the same main turn). No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
- Yield return ItemAnim with the battleentity with the
MagicDropsitem:- animstate set to 4 (
ItemGet) ItemHoldsound plays- A new sprite object gets created rooted at this enemy + its
itemoffsetusing the item's icon as sprite - Yield for 1.0 second
- The sprite gets destroyed
- animstate set to 4 (
data[0]is incremented. If it reaches 5, this move, move 2 and move 4 can't be used anymoredata[1]is set to 3 so this move, move 2 and move 4 can't be used for the next 2 actor turns- ReviveEnemy called to revive a random
reservedatawith an hppercent of 7.0 (leaves them at 7hp) with canmove and showcounter - Yield for 1.0 second
Move 3 - Heal another enemy party member for 7 hp¶
Heal an enemy party member (including themselves) for 7 hp. No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
- Yield return ItemAnim with the battleentity with the
JaydeStewitem:- animstate set to 4 (
ItemGet) ItemHoldsound plays- A new sprite object gets created rooted at this enemy + its
itemoffsetusing the item's icon as sprite - Yield for 1.0 second
- The sprite gets destroyed
- animstate set to 4 (
data[0]is incremented. If it reaches 5, this move, move 2 and move 4 can't be used anymoredata[1]is set to 3 so this move, move 2 and move 4 can't be used for the next 2 actor turns- Heal called on a random enemy party member to heal them for 7
hp. The selection of the enemy party member to heal only includes those whosehpis above 0, but their HPPercent is less than 0.8 (this includes this enemy) - Yield for 1.0 second
Move 4 - LongLegSummoner equivalent action¶
A single target attack involving the same effects as the LongLegSummoner action where the target is a player party member.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen | null | playerdata[playertargetID] after GetSingleTarget |
6 | Flip1 | empty array | commandsuccess |
1: This property gets overriden to null in CalculateBaseDamage as the target is a player party member so it does nothing.
Logic sequence¶
- Yield return ItemAnim with the battleentity with the
LonglegSummoneritem:- animstate set to 4 (
ItemGet) ItemHoldsound plays- A new sprite object gets created rooted at this enemy + its
itemoffsetusing the item's icon as sprite - Yield for 1.0 second
- The sprite gets destroyed
- animstate set to 4 (
- GetSingleTarget called
- Yield return a LongLeg coroutine with this enemy's battleentity and
playerdata[playertargetID]as the target:- Camera moves slowly towards the target slightly to the left, up and behind
- animstate set to 28 (
TossItem) - A new sprite is created rooted using the
LonglegSummoneritem's sprite positioned at this enemy + (0.25, 2.25, -0.1) Tosssound plays- Over the course of 51.0 frames, the sprite moves to the target position + (1.5, 0.0, 1.25) via a BeizierCurve3 with a ymax of 5.0. Before each frame yield, the sprite's z angle is increased by 10.0 * MainManager.
framestep - animstate reset to the value before this action
LongLegsGrowsound playsPrefabs/Objects/LongLegsinstantiated offscreen with 0.0x scale- DeathSmoke particles plays at the sprite position
- The sprite is destroyed
- Yield for a frame
Prefabs/Objects/LongLegsposition set to where the sprite was before its destruction- Over the course of 31.0 frames, the
Prefabs/Objects/LongLegsmoves to + 4.75 in y via a SmoothLerp and its scale changes to (1.0, 1.0, -1.0) via a SmoothLerp - The
Stompanimation clip plays fromPrefabs/Objects/LongLegs Grow1sound plays- Yield for 0.75 seconds
- The
Stomp2animation clip plays fromPrefabs/Objects/LongLegs longLegsStompsound plays- Yield for 0.15 seconds
- DoDamage 1 call happens
- Yield for 0.75 seconds
- Over the course of 31.0 frames, the
Prefabs/Objects/LongLegsmoves to - 4.75 in y via a SmoothLerp and its scale changes to 0.0x via a SmoothLerp - DeathSmoke particles plays at the
Prefabs/Objects/LongLegsposition ChargeDown2sound playsPrefabs/Objects/LongLegsis destroyed- Yield for 0.5 seconds
checkingdeadis set to null which signals the caller that the coroutine is done
data[0]is incremented. If it reaches 5, this move, move 2 and move 4 can't be used anymoredata[1]is set to 3 so this move, move 2 and move 4 can't be used for the next 2 actor turns
Move 5 - Party wide icicle throw with potential Freeze infliction¶
A party wide icicle throw.
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 | Freeze | commandsuccess |
0.0 | Vector3.zero | false | null |
Logic sequence¶
This is done by yield returning the EnemyIceFall coroutine with the battleentity:
- animstate set to 105
- A new
Prefabs/Objects/icecleGameObject is created rooted positioned at this enemy position + (-2.0, 4.5, 0.0) with a scale of 0.0x and its BoxCollider destroyed Spinsound plays on loop usingsounds[8]- Over the course of 60.0 frames,
Prefabs/Objects/iceclescale changes to 1.25x via a lerp, the y angle goes towards 10.0 and thesounds[8]pitch changes from 0.0 to 1.0 - A new UI object is created named
tchilded to theGUICamerausing theguisprites[41]sprite (a crosshair) on layer 15 (3DUI) - animstate set to 107
Crosshairsound plays on loop usingsounds[9]with 0.9 pitch and 0.35 volume- Over the course of 81.0 frames,
tmoves from (0.0, 3.0, 0.0) to (-4.5, 1.0, 0.0) via a SmoothLerp + a number in the y component that goes from Sin(Time.time * 2.0) * -3.0 to 0.0. Before each yield,tz angle increases by 5x the game's frametime andPrefabs/Objects/icecley angles increases by 10.0 sounds[8]andsounds[9]stoppedIceMothThrowsound playstgets destroyedPrefabs/Objects/icecleangles set to (0.0, 0.0, -45.0)- Over the course of 26.0 frames,
Prefabs/Objects/iceclemoves to (-4.5, 1.0, 0.0) via a lerp IceMothHitsound playsmothicenormalparticles plays at thePrefabs/Objects/icecleposition with a scale of 2.0xPrefabs/Objects/iceclegets destroyed- PartyDamage 1 call happens
- Yield for 0.5 seconds
Move 6 - Enemy party wide AttackUp infliction¶
Gives the AttackUp condition to all enemy party members including themselves for 3 main turns (effectively 2 main turns since the current main turn ends soon). No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
This is done by yield returning the EnemyLeifBuffDebuff coroutine with the battleentity and the type being the EmpowerPlus Skill:
dontusechargeis set to trueMagicsound playsPrefabs/Particles/MagicUpinstantiated rooted at this enemy + 0.5 in y- animstate set to 4 (
ItemGet) - y
spinset to -20.0 (this is ignored soon) - All enemy party members (including this enemy) has their y
spinset to -15.0 - Yield for 0.75 seconds
- All enemy party members (including this enemy) has their
spinzeroed out followed by StatusEffect called on them to give them the AttackUp condition for 3 main turns with effect (effectively 2 main turns since the current main turn ends soon) Prefabs/Particles/MagicUpmoved offscreen at 999.0 in yspinzeroed outPrefabs/Particles/MagicUpdestroyed in 5.0 seconds
After the yield return, data[3] is set to 2 so this move alongside move 9, 10, 11 and 12 can't be used on the next actor turn.
Move 7 - Multiple hits icicle fall attack with potential Freeze infliction¶
A multiple hits icicle fall attack that hits 4 times where each hit is single target.
DoDamage calls¶
| # | Conditions | attacker | target | damageammount | property | overrides | block |
|---|---|---|---|---|---|---|---|
| 1 | Always happen 4 times, but each call can only happen if at least 1 player party member is alive (hp more than 0 and not eatenby) |
This enemy | playertargetID after GetSingleTarget (target changes for each calls) |
5 | Freeze | null | commandsuccess |
Logic sequence¶
This is done by yield returning the EnemyIceRain coroutine with the battleentity:
- Some camera fields changes to look closer to the player party:
camoffset: increases by (-1.5, 1.25, 1.0)camtargetpos: Vector3.zero
- animstate set to 105
- Yield for 0.5 seconds
- The following happens up to 4 times (the iteration doesn't happen if all player party member have an
hpof 0 or are eatenby):- GetSingleTarget called
Prefabs/Objects/icecleinstantiated rooted at (playertargetentityx position, 15.0, 0.0)Toss4sound plays- animstate set to 100
- Over the course of 50.0 frames,
Prefabs/Objects/icecleposition is lerped toplayertargetentityposition + 1.0 in y - DoDamage 1 call happens
mothicenormalparticles plays atplayertargetentityposition + 1.0 in y with a scale of 2.0xIceMothHitsound playsPrefabs/Objects/iceclegets destroyed- Yield for 0.33 seconds
- animstate set to 105
- animstate set to 102
- Yield for 0.5 seconds
Move 8 - ClearStatus on a player party member¶
Calls ClearStatus on a player party member. No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
- Select a random player party members as the target that fufill all of the following conditiosn (as explained in the move selection above, at least one target exists for this move to be used):
- Their
hpis above 0 - They either have more than 0
chargeor they have the AttackUp condition
- Their
- This enemy animstate set to 111
FastWooshsound plays- Yield for 0.5 seconds
Heal3sound plays- The target animstate set to 11 (
Hurt) - ClearStatus called on the target
- DeathSmoke particles plays at the target position with a size of 3.0x
- Yield for 1.0 second
Move 9 - Shield infliction on another enemy party member¶
Gives the Shield condition on an enemy party member (including themselves). No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
data[3]is set to 2 so this move alongside move 6, 10, 11 and 12 can't be used on the next actor turn- Some camera fields changes to look closer at this enemy:
camtargetpos: This enemy position + 2.0 in xcamspeed: 0.01camoffset: (0.0, 2.65, -7.0)
- animstate set to 102
- Yield for 0.75 seconds
- animstate set to 119
- Yield for 0.25 seconds
- SetDefaultCamera called
Shieldsound played- SetCondition called to give the Shield condition to a random enemy party member whose
hpis above 0 (including themselves) for 2 main turns (effectively 1 main turn since the current main turn ends soon) - Yield for 0.75 seconds
Move 10 - Player party wide AttackDown infliction¶
Gives the AttackDown condition to all alive player party members for 3 main turns (effectively 2 main turns since the current main turn ends soon). No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
This is done by yield returning the EnemyLeifBuffDebuff coroutine with the battleentity and the type being the AttackDownPlus Skill:
dontusechargeis set to trueMagicsound playsPrefabs/Particles/MagicUpinstantiated rooted at this enemy + 0.5 in y- animstate set to 4 (
ItemGet) - y
spinset to -20.0 (this is ignored soon) - All alive player party members (
hpabove 0 and not eatenby) has their yspinset to -15.0 - Yield for 0.75 seconds
- All alive player party members (
hpabove 0 and not eatenby) has theirspinzeroed out followed by StatusEffect called on them to give them the AttackDown condition for 3 main turns with effect (effectively 2 main turns since the current main turn ends soon) Prefabs/Particles/MagicUpmoved offscreen at 999.0 in yspinzeroed outPrefabs/Particles/MagicUpdestroyed in 5.0 seconds
After the yield return, data[3] is set to 2 so this move alongside move 6, 9, 11 and 12 can't be used on the next actor turn.
Move 11 - Enemy party wide DefenseUp infliction¶
Gives the DefenseUp condition to all enemy party members including themselves for 3 main turns (effectively 2 main turns since the current main turn ends soon). No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
This is done by yield returning the EnemyLeifBuffDebuff coroutine with the battleentity and the type being the DefenseUpPlus Skill:
dontusechargeis set to trueMagicsound playsPrefabs/Particles/MagicUpinstantiated rooted at this enemy + 0.5 in y- animstate set to 4 (
ItemGet) - y
spinset to -20.0 (this is ignored soon) - All enemy party members (including this enemy) has their y
spinset to -15.0 - Yield for 0.75 seconds
- All enemy party members (including this enemy) has their
spinzeroed out followed by StatusEffect called on them to give them the DefenseUp condition for 3 main turns with effect (effectively 2 main turns since the current main turn ends soon) Prefabs/Particles/MagicUpmoved offscreen at 999.0 in yspinzeroed outPrefabs/Particles/MagicUpdestroyed in 5.0 seconds
After the yield return, data[3] is set to 2 so this move alongside move 6, 9, 10 and 12 can't be used on the next actor turn.
Move 12 - Player party wide DefenseDown infliction¶
Gives the DefenseDown condition to all alive player party members for 3 main turns (effectively 2 main turns since the current main turn ends soon). No damages are dealt.
dontusecharge set to true¶
This move always sets dontusecharge to true which means charges will not get zeroed out in post action.
Logic sequence¶
This is done by yield returning the EnemyLeifBuffDebuff coroutine with the battleentity and the type being the DefenseBreakAll Skill:
dontusechargeis set to trueMagicsound playsPrefabs/Particles/MagicUpinstantiated rooted at this enemy + 0.5 in y- animstate set to 4 (
ItemGet) - y
spinset to -20.0 (this is ignored soon) - All alive player party members (
hpabove 0 and not eatenby) has their yspinset to -15.0 - Yield for 0.75 seconds
- All alive player party members (
hpabove 0 and not eatenby) has theirspinzeroed out followed by StatusEffect called on them to give them the DefenseDown condition for 3 main turns with effect (effectively 2 main turns since the current main turn ends soon) Prefabs/Particles/MagicUpmoved offscreen at 999.0 in yspinzeroed outPrefabs/Particles/MagicUpdestroyed in 5.0 seconds
After the yield return, data[3] is set to 2 so this move alongside move 6, 9, 10 and 11 can't be used on the next actor turn.