示例#1
0
文件: Bilsy.cs 项目: ozgun-kara/jazz2
        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;
        }
示例#2
0
        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;
        }
示例#3
0
        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;
        }