//---------------------------------------------------------------------------------------------------------------------------------------------------
//
// Copyright (C)2007 DarkWynter Studios. All rights reserved.
//
//---------------------------------------------------------------------------------------------------------------------------------------------------
// {Contact : darkwynter.com for licensing information
//---------------------------------------------------------------------------------------------------------------------------------------------------
namespace DarkWynter.Game.RuleBook
{
#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
using DarkWynter.Engine.Globals;
using DarkWynter.Engine.ObjectLib;
using DarkWynter.Engine.Menus;
///
/// Handles respawn and game over conditions based on Statics_Engine.GameSettings.gameType.
///
public class GameRules
{
// CLEAN : Create a List in GameRules.cs
// Use string identifier to access
// Use Update() to execute all GameRules in List
// Abstract GameRule contains a single method, CheckRule()
// Turn current code into Game componenets.
// Create .cs file for each GameMode, with classes for each rule
// Create and add GameScreens from GameFlow
// See if MenuSystem can be removed from method parameters.
// MenuSystem prob shouldn't be in GameRules
private Stopwatch survivalRespawnTimer = null;
private int SURVIVAL_RESPAWN_TIME = 5000;
private int currentLevelIndex = 0;
private int winningPlayer = -1;
private int winningBot = -1;
private int mostKills = 0;
private int playersAlive = 0;
///
/// Start the game timer used in game rules.
///
public void StartGameTimer()
{
survivalRespawnTimer = new Stopwatch();
survivalRespawnTimer.Start();
}
///
/// Check for GameOver and Respawn conditions based on Statics_Engine.GameSettings.gameType
///
/// Object Library currently being used.
public void Update(ref ObjectLibrary objectLibrary)
{
CheckForGameOver(ref objectLibrary);
CheckForRespawn(ref objectLibrary);
}
private void CheckForRespawn(ref ObjectLibrary objectLibrary)
{
#region Survival
if (Statics_Engine.GameSettings.gameType == Enums_Engine.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 / Statics_Engine.TerrainSettings.terrainScaleFactor,
objectLibrary.bots[i].spawnPosition.Z / Statics_Engine.TerrainSettings.terrainScaleFactor);
objectLibrary.bots[i].SpawnPlayer();
}
}
survivalRespawnTimer.Reset();
survivalRespawnTimer.Start();
}
}
#endregion
#region DeathMatch
else if (Statics_Engine.GameSettings.gameType == Enums_Engine.GameType.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 >= Statics_Engine.PlayerSettings.RESPAWN_DELAY)
{
objectLibrary.humans[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.humans[i].spawnPosition.X / Statics_Engine.TerrainSettings.terrainScaleFactor,
objectLibrary.humans[i].spawnPosition.Z / Statics_Engine.TerrainSettings.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 >= Statics_Engine.PlayerSettings.RESPAWN_DELAY)
{
objectLibrary.humans[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.humans[i].spawnPosition.X / Statics_Engine.TerrainSettings.terrainScaleFactor,
objectLibrary.humans[i].spawnPosition.Z / Statics_Engine.TerrainSettings.terrainScaleFactor);
objectLibrary.bots[i].SpawnPlayer();
}
}
}
}
#endregion
#region Story Mode
else if (Statics_Engine.GameSettings.gameType == Enums_Engine.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 >= Statics_Engine.PlayerSettings.RESPAWN_DELAY)
{
objectLibrary.humans[i].spawnHeight = objectLibrary.terrain.GetTerrainHeight(objectLibrary.humans[i].spawnPosition.X / Statics_Engine.TerrainSettings.terrainScaleFactor,
objectLibrary.humans[i].spawnPosition.Z / Statics_Engine.TerrainSettings.terrainScaleFactor);
objectLibrary.humans[i].SpawnPlayer();
}
}
}
}
#endregion
}
// Update
private void CheckForGameOver(ref ObjectLibrary objectLibrary)
{
playersAlive = objectLibrary.humans.Count;
if (Statics_Engine.GameSettings.gameType == Enums_Engine.GameType.STORY_MODE)
{
StoryModeRules(ref objectLibrary);
}
else if (Statics_Engine.GameSettings.gameType == Enums_Engine.GameType.LAST_MAN_STANDING)
{
LastManStandingRules(ref objectLibrary);
}
else if (Statics_Engine.GameSettings.gameType == Enums_Engine.GameType.DEATHMATCH)
{
DeathMatchRules(ref objectLibrary);
}
else if (Statics_Engine.GameSettings.gameType == Enums_Engine.GameType.SURVIVAL)
{
SurvivalRules(ref objectLibrary);
}
}
// Rules for each game
private void StoryModeRules(ref ObjectLibrary objectLibrary)
{
#region Story/LiveAction Code
// int numKeysToAdvance = 10;
//if (Statics_Engine.storyElement == Enums_Engine.StoryElement.CUTSCENE)
//{
//// Cutscene finished, Load Next Level
//if (Statics_Engine.menuSystem.scene2.IsDone() && currentLevelIndex == 1)
//{
// // Start New Level
// objectLibrary.LoadLevel_Stage1(XML.levelInfo[currentLevelIndex].filepath);
// // Load Level Data
// XML.LoadPlayerIndex(menuSystem);
// Statics_Engine.menuSystem.LevelSetupCommit(gameFlow.objectLibrary);
// gameFlow.Load();
// gameFlow.objectLibrary.humans[0].LoadPlayer(XML.playerInfo[0]);
// currentLevelIndex++;
// storyElement = StoryElement.LIVEACTION;
// Statics_Engine.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;
// Statics_Engine.CheckForControllers(1, gameFlow);
//}
//}
//#endregion
//#region Live Action
//if (Statics_Engine.storyElement == Enums_Engine.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();
// }
// }
//}
#endregion
}
private void LastManStandingRules(ref ObjectLibrary objectLibrary)
{
#region Last Man Standing Rules
/*
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 = Statics_Engine.GameSettings.botCount;
for (int i = 0; i < Statics_Engine.GameSettings.botCount; i++)
{
if (objectLibrary.bots[i].IsAlive() == false)
{
botsAlive--;
}
else
{
winningBot = i + 1;
}
}
if (playersAlive == 1)
{
if (Statics_Engine.SystemSettings.TOTAL_PLAYERS == 1 && Statics_Engine.GameSettings.botCount == 0)
{
return;
}
else if (botsAlive == 0)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Player " + winningPlayer + " Wins!");
for (int i = 0; i < Statics_Engine.SystemSettings.TOTAL_PLAYERS; i++)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle(
"Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills
);
}
}
else
{
return;
}
}
else if (playersAlive == 0)
{
if (botsAlive == 1)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Bot#" + winningBot + " Wins!");
}
else if (botsAlive == 0 && objectLibrary.bots.Count > 0)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Everybody dies!");
}
else if (Statics_Engine.SystemSettings.TOTAL_PLAYERS == 1)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Congratulations! You Killed Yourself!");
}
for (int i = 0; i < 4; i++)
{
if (i < Statics_Engine.SystemSettings.TOTAL_PLAYERS)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle(
"Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills
);
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Show();
}
else
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide();
}
}
}
Statics_Engine.SystemSettings.gameState = Enums_Engine.EngineState.GAME_OVER;
}
*/
#endregion
}
private void DeathMatchRules(ref ObjectLibrary objectLibrary)
{
#region Death Match Rules
for (int i = 0; i < objectLibrary.humans.Count; i++)
{
if (objectLibrary.humans[i].kills >= Statics_Engine.GameSettings.maxNumberOfKills)
{
winningPlayer = i + 1;
}
}
for (int i = 0; i < objectLibrary.bots.Count; i++)
{
if (objectLibrary.bots[i].kills >= Statics_Engine.GameSettings.maxNumberOfKills)
{
winningBot = i + 1;
}
}
if (winningPlayer > 0)
{
//menuSystem.GetGameOverMenuElement(0).SetTitle("Player " + winningPlayer + " Wins!");
//for (int i = 0; i < 4; i++)
//{
// if (i < Statics_Engine.SystemSettings.TOTAL_PLAYERS)
// {
// menuSystem.GetGameOverMenuElement(i + 2).SetTitle(
// "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills);
// menuSystem.GetGameOverMenuElement(i + 2).Show();
// }
// else
// {
// menuSystem.GetGameOverMenuElement(i + 2).Hide();
// }
//}
Statics_Engine.SystemSettings.gameState = Enums_Engine.EngineState.GAME_OVER;
}
else if (winningBot > 0)
{
//menuSystem.GetGameOverMenuElement(0).SetTitle("Bot " + winningBot + " Wins!");
//for (int i = 0; i < 4; i++)
//{
// if (i < Statics_Engine.SystemSettings.TOTAL_PLAYERS)
// {
// menuSystem.GetGameOverMenuElement(i + 2).SetTitle(
// "Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills);
// menuSystem.GetGameOverMenuElement(i + 2).Show();
// }
// else
// {
// menuSystem.GetGameOverMenuElement(i + 2).Hide();
// }
//}
Statics_Engine.SystemSettings.gameState = Enums_Engine.EngineState.GAME_OVER;
}
#endregion
}
private void SurvivalRules(ref ObjectLibrary objectLibrary)
{
#region Survival Mode Rules
/*
for (int i = 0; i < objectLibrary.humans.Count; i++)
{
if (objectLibrary.humans[i].IsAlive() == true)
{
return;
}
if (objectLibrary.humans[i].kills >= mostKills)
{
winningPlayer = i + 1;
mostKills = objectLibrary.humans[i].kills;
}
}
if (mostKills == 0)
{
//no one killed anyone
menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Zero kills? Are you kidding me?!");
for (int i = 0; i < 4; i++)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide();
}
}
else
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(0).SetTitle("Player " + winningPlayer + " Wins!");
for (int i = 0; i < 4; i++)
{
if (i < Statics_Engine.SystemSettings.TOTAL_PLAYERS)
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).SetTitle(
"Player " + (i + 1) + " Kills = " + objectLibrary.humans[i].kills
);
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Show();
}
else
{
menuSystem.gameOverScreen.GetMenu().GetMenuElement(i + 2).Hide();
}
}
}
Statics_Engine.SystemSettings.gameState = Enums_Engine.EngineState.GAME_OVER;
*/
#endregion
}
}
}