예제 #1
0
        //**************************************************
        // Change State
        private void changeState(tMacedoniaBossState newState)
        {
            switch (newState)
            {
                case tMacedoniaBossState.Hidden:
                    visible = false;
                    break;

                case tMacedoniaBossState.Cinematic:
                    CinematicManager.Instance.playCinematic("macedoniaIntro");
                    break;

                case tMacedoniaBossState.Disappear:
                    playAction("idle");
                    ParticleManager.Instance.addParticles("macedoniaAppear", position + new Vector3(0, -100, 5), Vector3.Zero, Color.White, 2);
                    removeCollisions();
                    break;

                case tMacedoniaBossState.Appear:
                    ParticleManager.Instance.addParticles("macedoniaAppear", position + new Vector3(0, -100, 5), Vector3.Zero, Color.White, 2);
                    setCollisions();
                    break;

                case tMacedoniaBossState.Idle:
                    playAction("idle");

                    numHits = 0;

                    float rand = Calc.randomScalar();
                    if (rand <= 0.25)
                        nextAttack = tMacedoniaBossState.RayoPrepare;
                    else if (rand <= 0.5)
                        nextAttack = tMacedoniaBossState.Shake;
                    else if (rand <= 0.7)
                        nextAttack = tMacedoniaBossState.Talk;
                    else if (rand <= 0.85)
                        nextAttack = tMacedoniaBossState.Disappear;
                    else
                        nextAttack = tMacedoniaBossState.Laugh;

                    timeToAttack = Calc.randomScalar(1.0f, 2.0f);

                    break;

                case tMacedoniaBossState.RayoPrepare:
                    playAction("rayoPrepare");
                    rayoInitLives = GamerManager.getMainPlayer().lifes;
                    break;

                case tMacedoniaBossState.RayoAttack:
                    playAction("rayoAttack");
                    updateRayo();
                    showRayo(true);
                    positionRayoFrom = position;
                    if (position.X > 0)
                        positionRayoTo = new Vector3(-RAYO_LIMIT_X, position.Y, position.Z);
                    else
                        positionRayoTo = new Vector3(RAYO_LIMIT_X, position.Y, position.Z);

                    break;

                case tMacedoniaBossState.Shake:
                    shakeTime = Calc.randomScalar(SHAKE_TIME_MIN, SHAKE_TIME_MAX);
                    shakeTimes = Calc.randomNatural(SHAKE_TIMES_MIN, SHAKE_TIMES_MAX);

                    playAction("attackShake");
                    break;

                case tMacedoniaBossState.Talk:
                    invokeCount = 0;
                    invokeRight = Calc.randomBool();
                    invokeFrom = new Vector3(invokeRight ? -INVOKE_LIMIT_X : INVOKE_LIMIT_X, position.Y, position.Z);
                    invokeStep = new Vector3((invokeRight ? INVOKE_LIMIT_X * 2 : -INVOKE_LIMIT_X * 2) / INVOKE_NUM_ORANGES, 0, 0);

                    //invoke watermelon
                    ParticleManager.Instance.addParticles("macedoniaAppear", position + new Vector3(0, -350, 5), Vector3.Zero, Color.White);
                    EnemyManager.Instance.addEnemy("lemon", position + new Vector3(0, -350, 0));

                    ParticleManager.Instance.addParticles("macedonia2", position + new Vector3(-300, -350, 5), Vector3.Zero, Color.White);
                    EnemyManager.Instance.addEnemy("grape", position + new Vector3(-300, -350, 0));
                    ParticleManager.Instance.addParticles("macedonia2", position + new Vector3(300, -350, 5), Vector3.Zero, Color.White);
                    EnemyManager.Instance.addEnemy("grape", position + new Vector3(300, -350, 0));

                    playAction("speaking");
                    break;

                case tMacedoniaBossState.Laugh:
                    playAction("laugh");
                    break;

                case tMacedoniaBossState.Die:
                    showRayo(false);

                    foreach (Enemy enemy in EnemyManager.Instance.getActiveEnemies())
                    {
                        if (enemy != null && !(enemy is Macedonia))
                            enemy.die();
                    }

                    loadEndCinematic();
                    CinematicManager.Instance.playCinematic("macedoniaEnd");
                    playAction("attackShake");
                    break;
            }

            stateTime = 0.0f;
            state = newState;
        }
예제 #2
0
        //**************************************************
        // Update State
        public override void update()
        {
            base.update();

            if (Keyboard.GetState().IsKeyDown(Keys.E))
            {
                changeState(tMacedoniaBossState.Die);
            }

            stateTime += SB.dt;
            switch (state)
            {
                case tMacedoniaBossState.Init:
                    //stay until the camera stops
                    if (CameraManager.Instance.isIdle())
                    {
                        initPos = position;
                        nextAttack = tMacedoniaBossState.Cinematic;
                        changeState(tMacedoniaBossState.Hidden);

                        appearX = 0;
                    }
                    break;

                case tMacedoniaBossState.Cinematic:
                    if (CinematicManager.Instance.cinematicToPlay == null)
                    {
                        nextAttack = tMacedoniaBossState.Idle;
                        changeState(tMacedoniaBossState.Disappear);
                    }
                    break;

                case tMacedoniaBossState.Hidden:
                    if (stateTime > HIDDEN_TIME)
                    {
                        initPos = new Vector3(appearX, initPos.Y, initPos.Z);
                        position = initPos;
                        idleTime = 0;

                        changeState(tMacedoniaBossState.Appear);
                    }

                    break;

                case tMacedoniaBossState.Appear:
                    if (stateTime > APPEAR_TIME && !visible)
                    {
                        visible = true;
                        changeState(nextAttack);
                    }

                    break;

                case tMacedoniaBossState.Disappear:
                    if (stateTime > DISAPPEAR_TIME && visible)
                    {
                        visible = false;
                        changeState(tMacedoniaBossState.Hidden);
                    }
                    break;

                case tMacedoniaBossState.Idle:
                    timeToAttack -= SB.dt;

                    if (Keyboard.GetState().IsKeyDown(Keys.A))
                    {
                        nextAttack = tMacedoniaBossState.RayoPrepare;
                        timeToAttack = 0;
                    }
                    else if (Keyboard.GetState().IsKeyDown(Keys.S))
                    {
                        nextAttack = tMacedoniaBossState.Shake;
                        timeToAttack = 0;
                    }
                    else if (Keyboard.GetState().IsKeyDown(Keys.D))
                    {
                        nextAttack = tMacedoniaBossState.Talk;
                        timeToAttack = 0;
                    }
                    else if (Keyboard.GetState().IsKeyDown(Keys.F))
                    {
                        nextAttack = tMacedoniaBossState.Laugh;
                        timeToAttack = 0;
                    }
                    else if (Keyboard.GetState().IsKeyDown(Keys.G))
                    {
                        nextAttack = tMacedoniaBossState.Disappear;
                        timeToAttack = 0;
                    }

                    if (timeToAttack < 0)
                    {
                        if (nextAttack == tMacedoniaBossState.RayoPrepare)
                        {
                            appearX = Calc.randomBool() ? -RAYO_LIMIT_X : RAYO_LIMIT_X;
                            changeState(tMacedoniaBossState.Disappear);
                        }
                        else if (nextAttack == tMacedoniaBossState.Shake)
                        {
                            shakeCount = 0;
                            changeState(nextAttack);
                        }
                        else if (nextAttack == tMacedoniaBossState.Talk)
                        {
                            changeState(nextAttack);
                        }
                        else if (nextAttack == tMacedoniaBossState.Laugh)
                        {
                            changeState(nextAttack);
                        }
                        else if (nextAttack == tMacedoniaBossState.Disappear)
                        {
                            appearX = Calc.randomNatural(-TELEPORT_LIMIT_X, TELEPORT_LIMIT_X);
                            nextAttack = tMacedoniaBossState.Idle;
                            changeState(tMacedoniaBossState.Disappear);
                        }
                    }

                    updateIdleMove();

                    break;

                case tMacedoniaBossState.RayoPrepare:
                    effectStep -= SB.dt;
                    if (effectStep <= 0)
                    {
                        ParticleManager.Instance.addParticles("zumoPrepare", position + new Vector3(0, -170, 5), Vector3.Zero, Color.White, 0.5f);
                        effectStep = RAYO_PREPARE_EFFECT_STEP;
                    }

                    if (stateTime > RAYO_PREPARE_DURATION)
                    {
                        changeState(tMacedoniaBossState.RayoAttack);
                    }
                    break;

                case tMacedoniaBossState.RayoAttack:
                    updateRayo();

                    effectStep -= SB.dt;
                    if (effectStep <= 0)
                    {
                        ParticleManager.Instance.addParticles("zumoAttack", position + new Vector3(0, -135, 5), Vector3.Zero, Color.White);
                        effectStep = RAYO_ATTACK_EFFECT_STEP;
                    }

                    float perc = stateTime / RAYO_DURATION;
                    position = positionRayoFrom + (positionRayoTo - positionRayoFrom) * perc;
                    if (stateTime > RAYO_DURATION)
                    {
                        if (rayoInitLives > GamerManager.getMainPlayer().lifes)
                            nextAttack = tMacedoniaBossState.Laugh;
                        else
                            nextAttack = tMacedoniaBossState.Idle;

                        appearX = Calc.randomNatural(-TELEPORT_LIMIT_X, TELEPORT_LIMIT_X);
                        changeState(tMacedoniaBossState.Disappear);

                        showRayo(false);
                    }
                    break;

                case tMacedoniaBossState.Shake:
                    shakeNextFruitTime -= SB.dt;

                    if (shakeNextFruitTime <= 0)
                    {
                        fruits.Add(new MacedoniaFruit("minifruits-1" + Calc.randomNatural(1, 9), position + new Vector3(0, 50, 0)));
                        shakeNextFruitTime = Calc.randomScalar(SHAKE_MIN_TIME_FRUIT, SHAKE_MAX_TIME_FRUIT);
                    }

                    if (stateTime > shakeTime)
                    {
                        shakeCount++;
                        if (shakeCount < shakeTimes)
                        {
                            nextAttack = tMacedoniaBossState.Shake;
                            appearX = Calc.randomNatural(-TELEPORT_LIMIT_X, TELEPORT_LIMIT_X);
                            changeState(tMacedoniaBossState.Disappear);
                        }
                        else
                        {
                            changeState(tMacedoniaBossState.Idle);
                        }
                    }
                    break;

                case tMacedoniaBossState.Talk:
                    if (stateTime > (invokeCount * INVOKE_TIME_BETWEEN_ORANGES))
                    {
                        EnemyManager.Instance.addEnemy("orange", invokeFrom + invokeStep * invokeCount + new Vector3(0, -2000, 0));
                        invokeCount++;
                    }

                    if (stateTime > INVOKE_TIME)
                        changeState(tMacedoniaBossState.Laugh);

                    updateIdleMove();
                    break;

                case tMacedoniaBossState.Laugh:
                    if (stateTime > LAUGH_TIME)
                        changeState(tMacedoniaBossState.Idle);

                    updateIdleMove();

                    break;

                case tMacedoniaBossState.Die:
                    if (CinematicManager.Instance.cinematicToPlay == null)
                    {
                        GamerManager.getGamerEntity(0).data.levelsPassed["fruitownB"] = true;
                        StateManager.addState(StateManager.tGameState.EndStage);
                    }
                    break;
            }

            int deadCount = 0;
            foreach (MacedoniaFruit fruit in fruits)
            {
                fruit.update();

                if (!fruit.isDead() && !fruit.isDying())
                {
                    foreach(Projectile p in ProjectileManager.Instance.getProjectiles())
                    {
                        if (p.team == Projectile.tTeam.Players && (fruit.position - p.position).Length() < 80)
                        {
                            ParticleManager.Instance.addParticles("macedoniaGotHit", p.position, Vector3.Zero, Color.White);
                            p.die();
                        }
                    }
                    if ((fruit.position - GamerManager.getMainPlayer().position).Length() < 100)
                    {
                        GamerManager.getMainPlayer().gotHitAtPart(null, 0);
                        fruit.explode();
                    }
                }

                if (fruit.isDead())
                    deadCount++;
            }

            if (fruits.Count > 0 && deadCount == fruits.Count)
                fruits.Clear();
        }