//************************************************** // 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; }
//************************************************** // 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(); }