public override void Update(GameTime time)
{
var elapsedSeconds = (float)time.ElapsedGameTime.TotalSeconds;
Session.GameTime += elapsedSeconds;
Session.FocussedEntity = null;
// Remove finished graphics events
var graphicsEffects = Session.World.GraphicsEvents.Where(e => e.End < Session.GameTime).ToArray();
foreach (var e in graphicsEffects)
Session.World.GraphicsEvents.Remove(e);
if (Session.UsePlayerTurns)
{
if (Session.ActivePlayer == null)
{
Session.ActivePlayer = Session.Players[0];
}
Session.TurnTime += elapsedSeconds;
if (Session.TurnTime > Session.SecondsPerTurn && Session.TurnState == TurnState.Running)
{
EndTurn();
}
// End the turn if the turn is over and MinSecondsBetweenTurns have passed.
// Wait for all entities to stand still, but at most MaxSecondsBetweenTurns.
if (Session.TurnState == TurnState.WaitingForEnd
&& (Session.TurnTime > Session.MaxSecondsBetweenTurns
|| (Session.TurnTime > Session.MinSecondsBetweenTurns && !Session.World.IsSomethingMoving ))
)
{
StartNextTurn();
}
}
var worldState = Session.World;
if (Game.Match.State == SessionState.Running)
{
// Update all active balls
var currentControllers = ActiveControllers.Values.ToArray();
foreach (var controller in currentControllers)
{
if(controller != null && (controller.Ball.Player == Session.ActivePlayer || !Session.UsePlayerTurns))
{
var playerMadeAction = controller.Update(elapsedSeconds, worldState);
if (playerMadeAction)
EndTurn();
}
}
// Check for dead balls
List<Player> alivePlayers = new List<Player>();
Player winner = null;
var ballControllers = BallControllers.Values.ToArray();
foreach (var controller in ballControllers)
{
if (controller.Ball.Disposed || !controller.Ball.IsAlive)
{
controller.Ball.Player.OwnedBalls.Remove(controller.Ball);
if (controller.Ball.Player == Session.ActivePlayer)
{
StartNextTurn();
}
ActiveControllers.Remove(controller.Ball.Player);
BallControllers.Remove(controller.Ball);
}
else if (controller.Ball.IsAlive)
{
if (!alivePlayers.Contains(controller.Ball.Player))
alivePlayers.Add(controller.Ball.Player);
winner = controller.Ball.Player;
}
}
//TODO: find proper game finished condition, this one is not always correct
if (alivePlayers.Count < 2)
{
Game.Match.State = SessionState.Finished;
//TODO: find proper condition to determine the winner, this one is not always correct
if (alivePlayers.Count == 1)
{
Game.Match.Winner = winner;
Game.Services.GetService<Sound.SoundControl>().PlaySound(Sound.SoundControl.WinnerSounds[winner.TeamName]);
}
}
}
}