protected override void OnFixedUpdate(float timeMult) { base.OnFixedUpdate(timeMult); if (frozenTimeLeft > 0) { return; } switch (state) { case StateWaiting: { if (stateTime <= 0f) { state = StateTransition; SetTransition((AnimState)1073741826, false, delegate { PlaySound("ThrowFireball"); Vector3 pos = Transform.Pos; Fireball fireball = new Fireball(); fireball.OnActivated(new ActorActivationDetails { Api = api, Pos = new Vector3(pos.X + 26f * (IsFacingLeft ? -1f : 1f), pos.Y - 20f, pos.Z - 2f), Params = new[] { theme, (ushort)(IsFacingLeft ? 1 : 0) } }); api.AddActor(fireball); SetTransition((AnimState)1073741827, false, delegate { state = StateWaiting2; stateTime = 30f; }); }); } break; } case StateWaiting2: { if (stateTime <= 0f) { canBeFrozen = false; PlaySound("Disappear", 0.8f); state = StateTransition; SetTransition((AnimState)1073741825, false, delegate { Teleport(); }); } break; } } stateTime -= timeMult; }
public override void OnFixedUpdate(float timeMult) { if (isDemon) { OnUpdateHitbox(); HandleBlinking(timeMult); MoveInstantly(new Vector2(speedX * timeMult, speedY * timeMult), MoveType.Relative, true); } else { base.OnFixedUpdate(timeMult); } if (frozenTimeLeft > 0) { return; } switch (state) { case StateWarpingIn: { if (stateTime <= 0f) { bool found = false; Vector3 pos = Transform.Pos; Vector3 targetPos = new Vector3(float.MaxValue, float.MaxValue, 0f); List <Player> players = levelHandler.Players; for (int i = 0; i < players.Count; i++) { Vector3 newPos = players[i].Transform.Pos; if ((pos - newPos).Length < (pos - targetPos).Length) { targetPos = newPos; found = true; } } if (found) { IsFacingLeft = (targetPos.X < pos.X); } renderer.Active = true; state = StateTransition; SetTransition(AnimState.TransitionWarpIn, false, delegate { state = StateIdling; stateTime = 80f; isInvulnerable = false; canHurtPlayer = true; }); } break; } case StateIdling: { if (stateTime <= 0f) { FollowNearestPlayer(StateRunning1, MathF.Rnd.NextFloat(60, 120)); } break; } case StateRunning1: { if (stateTime <= 0f) { if (health < maxHealth / 2) { isDemon = true; speedX = 0f; speedY = 0f; isInvulnerable = true; canBeFrozen = false; state = StateTransition; // DEMON_FLY SetAnimation((AnimState)669); // DEMON_TRANSFORM_START SetTransition((AnimState)670, false, delegate { CollisionFlags &= ~CollisionFlags.ApplyGravitation; isInvulnerable = false; state = StateDemonFlying; lastPos = Transform.Pos; targetPos = lastPos + new Vector3(0f, -200f, 0f); }); } else { if (MathF.Rnd.NextFloat() < 0.5f) { FollowNearestPlayer( StateRunning1, MathF.Rnd.NextFloat(60, 120)); } else { FollowNearestPlayer( StateRunning2, MathF.Rnd.NextFloat(10, 30)); } } } else { if (!CanMoveToPosition(speedX, 0)) { IsFacingLeft ^= true; speedX = (IsFacingLeft ? -4f : 4f); } } break; } case StateRunning2: { if (stateTime <= 0f) { speedX = 0f; state = StateTransition; SetTransition(AnimState.TransitionRunToIdle, false, delegate { SetTransition((AnimState)15, false, delegate { shots = MathF.Rnd.Next(1, 8); Shoot(); }); }); } break; } case StateDemonFlying: { if (attackTime <= 0f) { state = StateDemonSpewingFireball; } else { attackTime -= timeMult; FollowNearestPlayerDemon(timeMult); } break; } case StateDemonSpewingFireball: { state = StateTransition; SetTransition((AnimState)673, false, delegate { PlaySound("SpitFireball"); Fireball fireball = new Fireball(); fireball.OnActivated(new ActorActivationDetails { LevelHandler = levelHandler, Pos = Transform.Pos + new Vector3(IsFacingLeft ? -26f : 26f, -14f, 0f), Params = new[] { (ushort)(IsFacingLeft ? 1 : 0) } }); levelHandler.AddActor(fireball); SetTransition((AnimState)674, false, delegate { state = StateDemonFlying; attackTime = MathF.Rnd.NextFloat(100f, 240f); }); }); break; } case StateFalling: { if (canJump) { state = StateTransition; // DISORIENTED_START SetTransition((AnimState)666, false, delegate { // DISORIENTED SetTransition((AnimState)667, false, delegate { // DISORIENTED SetTransition((AnimState)667, false, delegate { // DISORIENTED_WARP_OUT SetTransition((AnimState)6670, false, delegate { base.OnPerish(null); }); }); }); }); } break; } } stateTime -= timeMult; }
public override void OnFixedUpdate(float timeMult) { base.OnFixedUpdate(timeMult); if (frozenTimeLeft > 0) { return; } switch (state) { case StateJumping: { if (speedY > 0f) { state = StateFalling; SetAnimation(AnimState.Fall); } break; } case StateFalling: { if (canJump) { speedY = 0f; speedX = 0f; state = StateTransition; SetTransition(AnimState.TransitionFallToIdle, false, delegate { float rand = MathF.Rnd.NextFloat(); bool spewFileball = (rand < 0.35f); bool tornado = (rand < 0.65f); if (spewFileball) { PlaySound("Sneeze"); SetTransition(AnimState.Shoot, false, delegate { Vector3 pos = Transform.Pos; float x = (IsFacingLeft ? -16f : 16f); float y = -5f; Fireball fireball = new Fireball(); fireball.OnActivated(new ActorActivationDetails { LevelHandler = levelHandler, Pos = new Vector3(pos.X + x, pos.Y + y, pos.Z + 2f), Params = new[] { (ushort)(IsFacingLeft ? 1 : 0) } }); levelHandler.AddActor(fireball); SetTransition(AnimState.TransitionShootToIdle, false, delegate { FollowNearestPlayer(); }); }); } else if (tornado) { TornadoToNearestPlayer(); } else { FollowNearestPlayer(); } }); } break; } case StateTornado: { if (stateTime <= 0f) { state = StateTransition; SetTransition((AnimState)1073741832, false, delegate { CollisionFlags = CollisionFlags.CollideWithTileset | CollisionFlags.CollideWithOtherActors | CollisionFlags.ApplyGravitation; state = StateFalling; SetAnimation((AnimState)1073741833); }); } break; } case StateDying: { float time = (renderer.AnimTime / renderer.AnimDuration); renderer.ColorTint = new ColorRgba(1f, 1f - (time * time * time * time)); break; } } stateTime -= timeMult; }