Dizzy¶
Dizzy is a coroutine that performs the procedure done whenever an Enemy gets stunned in the overworld. It receives the amount of frames to stun it (set to dizzytime), a push force Vector3 (only the x and z components are considered) and whether or not we want to induce a vertical launch upward.
A yield break is performed immediately if the entity is dead, iskill or it has a deathcoroutine in progress.
First, LockRigid(false) is called on the entity which unlocks its rigid.
The disguiseobj is disabled if it exists with the entity.sprite getting enabled.
From there, there's a special case if the entity's originalid is the ToeBiter animid where if the internaltransform[0] is present (the boulder he throws), it needs to be setup for its destruction. This is first done by adding a RigidBody to it, make it go in a random direction of 3.0 magnitude at a height of 12.0 and destroying it in 3.0 seconds. The entire internaltransform array is then set to null.
From there, a couple of adjustements happens:
- The
touchcooldownis set to 30.0 frames - The
dizzytimeis to the sent time parameter - The entity.
spritehas its angles reset to Vector3.zero - The entity.
ongroundis set to false - STOP is called which does the following:
- Stop
behaviorroutineif it was in progress and set it to null - Set
forcebehaviorto null and call StopForceBehavior - Call StopForceMove on the entity
- Set the entity.
overrideflipand entity.overrideonlyflipto false - Set
attackingto false
- Stop
After, a frame is yielded.
If the enemy has an Unmoveable behavior, it cuts off most of the rest of the coroutine only limiting itself to play the hitpart particle at the sprite position + (0.0, 0.5, 0.0) and yielding for a frame.
Not Unmovable¶
If it doesn't have this behavior however, the rest of the logic is performed:
- Set
ignoreconstraintto true - Enable gravity on the entity.
rigidwithout kinematic - If the entity didn't had a
detect, CreateDetector is called to create it - The entity.
detectis set to look at the player and its y angle is multiplied by -1 - The entity.
hitwalis set to false - All rotation on the entity.
rigidare frozen - The actual pushforce vector is comnputed from the the x and z components of the one sent in, but the y one is 0.0 unless we asked for a vertical launch which means the y is 13.5 instead
- The entity.
rigidvelocity is set to the push force computed above - If the magnitude of that push force vector is above 0.1, TempIgnoreColision is called on the entity ignoring all collisions between the entity.
ccoland entity.detectwith the player's corresponding colliders for 0.5 seconds
After, the hitpart particle is played at the entity.sprite position + (0.0, 0.5, 0.0) and a frame is yield.
Finally, if the entity.rigid y velocity is less than 5.0, Jump is called on the entity with a velocity of 13.5 for every frame as until the entity.rigid y velocity reaches 5.0 or above.