#region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Storage; using System.Xml; using System.Diagnostics; #endregion namespace ElementalGame { public class GameRules { public Stopwatch survivalRespawnTimer = null; private const int SURVIVAL_RESPAWN_TIME = 5000; private int currentLevelIndex = 0; public static int cutSceneIndex = 0; public enum StoryElement { CUTSCENE, LIVEACTION }; public static StoryElement storyElement = StoryElement.LIVEACTION; // CLEAN -- MOVE TO A SEPERATE CLASS public void CheckForGameOver(GameFlow gameFlow, ObjectLibrary objectLibrary, MenuSystem menuSystem, GameFlow.GameType gameType) { int playersAlive = objectLibrary.humans.Count; int winningPlayer = -1; int winningBot = -1; int mostKills = 0; if (ElementalGame.gameState == ElementalGame.GameState.GAME_MODE) { // Story Mode if (GameFlow.gameType == GameFlow.GameType.STORY_MODE) { // int numKeysToAdvance = 10; if (storyElement == StoryElement.CUTSCENE) { // Cutscene finished, Load Next Level if (menuSystem.scene5.IsDone() && currentLevelIndex == 4) { // Scene is over.. reset and go to start screen currentLevelIndex = 0; ElementalGame.gameState = ElementalGame.GameState.TITLE_SCREEN; ElementalGame.jiggler.Reset(); ElementalGame.jiggler.Start(); Audio.PlayTitleSong(); } else if (menuSystem.scene4.IsDone() && currentLevelIndex == 3) { // Start New Level objectLibrary.LoadLevel_Stage1(XML.levelInfo[currentLevelIndex].filepath); // Load Level Data XML.LoadPlayerIndex(menuSystem); menuSystem.LevelSetupCommit(gameFlow.objectLibrary); gameFlow.Load(); gameFlow.objectLibrary.humans[0].LoadPlayer(XML.playerInfo[0]); currentLevelIndex++; storyElement = StoryElement.LIVEACTION; ElementalGame.CheckForControllers(1, gameFlow); } else if (menuSystem.scene3.IsDone() && currentLevelIndex == 2) { // Start New Level objectLibrary.LoadLevel_Stage1(XML.levelInfo[currentLevelIndex].filepath); // Load Level Data XML.LoadPlayerIndex(menuSystem); menuSystem.LevelSetupCommit(gameFlow.objectLibrary); gameFlow.Load(); gameFlow.objectLibrary.humans[0].LoadPlayer(XML.playerInfo[0]); currentLevelIndex++; storyElement = StoryElement.LIVEACTION; ElementalGame.CheckForControllers(1, gameFlow); } else if (menuSystem.scene2.IsDone() && currentLevelIndex == 1) { // Start New Level objectLibrary.LoadLevel_Stage1(XML.levelInfo[currentLevelIndex].filepath); // Load Level Data XML.LoadPlayerIndex(menuSystem); menuSystem.LevelSetupCommit(gameFlow.objectLibrary); gameFlow.Load(); gameFlow.objectLibrary.humans[0].LoadPlayer(XML.playerInfo[0]); currentLevelIndex++; storyElement = StoryElement.LIVEACTION; ElementalGame.CheckForControllers(1, gameFlow); } else if (menuSystem.scene1.IsDone() && currentLevelIndex == 0) { // Start New Level objectLibrary.LoadLevel_Stage1(XML.levelInfo[currentLevelIndex].filepath); // Load Level Data XML.LoadPlayerIndex(menuSystem); menuSystem.LevelSetupCommit(gameFlow.objectLibrary); gameFlow.Load(); gameFlow.objectLibrary.humans[0].LoadPlayer(XML.playerInfo[0]); currentLevelIndex++; storyElement = StoryElement.LIVEACTION; ElementalGame.CheckForControllers(1, gameFlow); } } if (storyElement == StoryElement.LIVEACTION) { // Level Complete, run next cutscene //temporary.. needs to be number of keys collected if (objectLibrary.humans[0].numberOfKeysFound >= XML.GameSettings.STORYMODE_NUM_KEYS_TO_COLLECT) { // Load next CutScene storyElement = StoryElement.CUTSCENE; // Clear keys objectLibrary.humans[0].numberOfKeysFound = 0; cutSceneIndex++; // Play appropriate cutscene if (cutSceneIndex == 0) { Audio.PlayLevelSong("Scene1"); menuSystem.scene1.StartCutScene(); } else if (cutSceneIndex == 1) { Audio.PlayLevelSong("Scene2"); menuSystem.scene2.StartCutScene(); } else if (cutSceneIndex == 2) { Audio.PlayLevelSong("Scene3"); menuSystem.scene3.StartCutScene(); } else if (cutSceneIndex == 3) { Audio.PlayLevelSong("Scene4"); menuSystem.scene4.StartCutScene(); } else if (cutSceneIndex == 4) { Audio.PlayLevelSong("Scene4"); menuSystem.scene5.StartCutScene(); } } } } // Last Man Standing else if (GameFlow.gameType == GameFlow.GameType.LAST_MAN_STANDING) { for (int i = 0; i < objectLibrary.humans.Count; i++) { if (objectLibrary.humans[i].IsAlive() == false) { playersAlive--; } else { winningPlayer = i + 1; } } if (playersAlive < 2) { int botsAlive = GameFlow.numberOfBots; for (int i = 0; i < GameFlow.numberOfBots; i++) { if (objectLibrary.bots[i].IsAlive() == false) { botsAlive--; } else { winningBot = i + 1; } } if (playersAlive == 1) { if (XML.SystemSettings.TOTAL_PLAYERS == 1 && GameFlow.numberOfBots == 0) { return; } else if (botsAlive == 0) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Player " + winningPlayer + " Wins!"); for (int i = 0; i < XML.SystemSettings.TOTAL_PLAYERS; i++) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle( "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills ); } } else { return; } } else if (playersAlive == 0) { if (botsAlive == 1) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Bot#" + winningBot + " Wins!"); } else if (botsAlive == 0 && objectLibrary.bots.Count > 0) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Everybody dies!"); } else if (XML.SystemSettings.TOTAL_PLAYERS == 1) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Congratulations! You Killed Yourself!"); } for (int i = 0; i < 4; i++) { if (i < XML.SystemSettings.TOTAL_PLAYERS) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle( "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills ); ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Show(); } else { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide(); } } } ElementalGame.gameState = ElementalGame.GameState.GAME_OVER; } } // DeathMatch else if (GameFlow.gameType == GameFlow.GameType.POINT_DEATHMATCH) { for (int i = 0; i < objectLibrary.humans.Count; i++) { if (objectLibrary.humans[i].kills >= GameFlow.maxNumberOfKills) { winningPlayer = i + 1; } } for (int i = 0; i < objectLibrary.bots.Count; i++) { if (objectLibrary.bots[i].kills >= GameFlow.maxNumberOfKills) { winningBot = i + 1; } } if (winningPlayer > 0) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Player " + winningPlayer + " Wins!"); for (int i = 0; i < 4; i++) { if (i < XML.SystemSettings.TOTAL_PLAYERS) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle( "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills); ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Show(); } else { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide(); } } ElementalGame.gameState = ElementalGame.GameState.GAME_OVER; } else if (winningBot > 0) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Bot " + winningBot + " Wins!"); for (int i = 0; i < 4; i++) { if (i < XML.SystemSettings.TOTAL_PLAYERS) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle( "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills); ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Show(); } else { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide(); } } ElementalGame.gameState = ElementalGame.GameState.GAME_OVER; } } // Survival else if (gameType == GameFlow.GameType.SURVIVAL) { for (int i = 0; i < objectLibrary.humans.Count; i++) { if (objectLibrary.humans[i].IsAlive() == true) { return; } //max kills? if (objectLibrary.humans[i].kills >= mostKills) { winningPlayer = i + 1; mostKills = objectLibrary.humans[i].kills; } } if (mostKills == 0) { //no one killed anyone ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Zero kills? Are you kidding me?!"); for (int i = 0; i < 4; i++) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide(); } } else { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Player " + winningPlayer + " Wins!"); for (int i = 0; i < 4; i++) { if (i < XML.SystemSettings.TOTAL_PLAYERS) { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle( "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills ); ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Show(); } else { ElementalGame.menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide(); } } } ElementalGame.gameState = ElementalGame.GameState.GAME_OVER; } } } public void CheckForRespawn(ObjectLibrary objectLibrary, GameFlow.GameType gameType) { if (gameType == GameFlow.GameType.SURVIVAL) { // Only respawn after a certain time limit if (survivalRespawnTimer.ElapsedMilliseconds > SURVIVAL_RESPAWN_TIME) { for (int i = 0; i < objectLibrary.bots.Count; i++) { if (objectLibrary.bots[i].IsAlive() == false && objectLibrary.bots[i].killedBy != -1) { objectLibrary.bots[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.bots[i].spawnPosition.X / Terrain.terrainScaleFactor, objectLibrary.bots[i].spawnPosition.Z / Terrain.terrainScaleFactor); objectLibrary.bots[i].SpawnPlayer(); } } survivalRespawnTimer.Reset(); survivalRespawnTimer.Start(); } } else if (gameType == GameFlow.GameType.POINT_DEATHMATCH) { for (int i = 0; i < objectLibrary.humans.Count; i++) { if (objectLibrary.humans[i].IsAlive() == false && objectLibrary.humans[i].killedBy != -1) { if (objectLibrary.humans[i].respawnTimer.ElapsedMilliseconds >= XML.PlayerSettings.RESPAWN_DELAY) { if (gameType == GameFlow.GameType.POINT_DEATHMATCH) // || its last man standing and player has lives left { objectLibrary.humans[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.humans[i].spawnPosition.X / Terrain.terrainScaleFactor, objectLibrary.humans[i].spawnPosition.Z / Terrain.terrainScaleFactor); objectLibrary.humans[i].SpawnPlayer(); } } } } for (int i = 0; i < objectLibrary.bots.Count; i++) { if (objectLibrary.bots[i].IsAlive() == false && objectLibrary.bots[i].killedBy != -1) { if (objectLibrary.bots[i].respawnTimer.ElapsedMilliseconds >= XML.PlayerSettings.RESPAWN_DELAY) { if (gameType == GameFlow.GameType.POINT_DEATHMATCH) // || its last man standing and player has lives left { objectLibrary.bots[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.bots[i].spawnPosition.X / Terrain.terrainScaleFactor, objectLibrary.bots[i].spawnPosition.Z / Terrain.terrainScaleFactor); objectLibrary.bots[i].SpawnPlayer(); } } } } } else if (gameType == GameFlow.GameType.STORY_MODE) { for (int i = 0; i < objectLibrary.humans.Count; i++) { if (objectLibrary.humans[i].IsAlive() == false && objectLibrary.humans[i].killedBy != -1) { if (objectLibrary.humans[i].respawnTimer.ElapsedMilliseconds >= XML.PlayerSettings.RESPAWN_DELAY) { objectLibrary.humans[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.humans[i].spawnPosition.X / Terrain.terrainScaleFactor, objectLibrary.humans[i].spawnPosition.Z / Terrain.terrainScaleFactor); objectLibrary.humans[i].SpawnPlayer(); } } } } } } }