private void PortHandler(port_port api) { System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(); Staff.Current.Admiral.BasicHandler(api.api_basic); ConditionHelper.Instance.BeginUpdate(); Staff.Current.Shipyard.RepairDocks.ForEach(x => x.Ship?.IgnoreNextCondition()); if (Ships == null) { Ships = new IDTable <int, Ship>(api.api_ship.Select(x => new Ship(x))); } else { Ships.UpdateAll(api.api_ship, x => x.api_id); } ConditionHelper.Instance.EndUpdate(); Staff.Current.Admiral.ShipCount = api.api_ship.Length; Staff.Current.Shipyard.NDockHandler(api.api_ndock); DecksHandler(api.api_deck_port); if (Fleets.Any(x => x.MissionState == Fleet.FleetMissionState.Complete)) { Logger.Loggers.MaterialLogger.ForceLog = false; } Material.MaterialHandler(api.api_material); CombinedFleet = (CombinedFleetType)api.api_combined_flag; Fleets.ForEach(x => x.CheckHomeportRepairingTime(false)); }
public void Update(DateTime currentTime) { if (this.Waiting) { if (currentTime > gameStart) { if (Players.Count == 2) { this.Waiting = false; } else { if (currentTime > gameQuit) { this.Waiting = false; this.Status = "Nobody joined your game, I guess that means you win."; GameOver = true; } else { UpdateTimeInfo(gameStart.AddSeconds(2)); } } } return; } if (GameOver) { this.Stop(); return; } // check if we are in the server window if (currentTime >= endPlayerTurn) { // server processing Processing = true; // Grow ships on planets foreach (var planet in Planets) { // if the planet is not controlled by neutral update if (planet.OwnerId != -1) { planet.NumberOfShips += planet.GrowthRate; } } // Send fleets foreach (var fleet in Fleets) { // travel 1 unit distance each turn fleet.NumberOfTurnsToDestination--; } // Resolve planet battles foreach (var planet in Planets) { var combatants = new Dictionary <int, int>(); combatants.Add(planet.OwnerId, planet.NumberOfShips); // find fleets destined for this planet var fleets = Fleets.Where(f => f.Destination.Id == planet.Id && f.NumberOfTurnsToDestination <= 0); foreach (var fleet in fleets) { if (combatants.ContainsKey(fleet.OwnerId)) { combatants[fleet.OwnerId] += fleet.NumberOfShips; } else { combatants.Add(fleet.OwnerId, fleet.NumberOfShips); } } if (fleets.Count() <= 0) { continue; } KeyValuePair <int, int> second = new KeyValuePair <int, int>(1, 0); KeyValuePair <int, int> winner = new KeyValuePair <int, int>(2, 0); foreach (var keyval in combatants) { if (keyval.Value > second.Value) { if (keyval.Value > winner.Value) { second = winner; winner = keyval; } else { second = keyval; } } } if (winner.Value > second.Value) { planet.NumberOfShips = winner.Value - second.Value; planet.OwnerId = winner.Key; } else { planet.NumberOfShips = 0; } } // remove finished fleets lock (synclock) { _fleets.RemoveAll(f => f.NumberOfTurnsToDestination <= 0); } // Check game over conditions var player1NoPlanets = !Planets.Any(p => p.OwnerId == 1); var player1NoShips = !Fleets.Any(f => f.OwnerId == 1); var player2NoPlanet = !Planets.Any(p => p.OwnerId == 2); var player2NoShips = !Fleets.Any(f => f.OwnerId == 2); if (player1NoPlanets && player1NoShips) { // player 2 has won var winner = Players.Values.FirstOrDefault(p => p.Id == 2); var loser = Players.Values.FirstOrDefault(p => p.Id == 1); this.Status = $"{winner?.PlayerName} has defeated {loser?.PlayerName}!"; this.GameOver = true; } if (player2NoPlanet && player2NoShips) { // player 1 has won var winner = Players.Values.FirstOrDefault(p => p.Id == 1); var loser = Players.Values.FirstOrDefault(p => p.Id == 2); this.Status = $"{winner?.PlayerName} has defeated {loser?.PlayerName}!"; this.GameOver = true; } PlayerAScoreOverTime.Add(_getPlayerScore(1)); PlayerBScoreOverTime.Add(_getPlayerScore(2)); // Turn complete Turn++; endPlayerTurn = currentTime.AddMilliseconds(PLAYER_TURN_LENGTH); endServerTurn = endPlayerTurn.AddMilliseconds(SERVER_TURN_LENGTH); Processing = false; System.Diagnostics.Debug.WriteLine($"Game {Id} : Turn {Turn} : Next Turn Start {endServerTurn.Subtract(DateTime.UtcNow).TotalMilliseconds}ms"); } if (Turn >= MAX_TURN) { var player1 = _getPlayerForId(1)?.PlayerName; var player2 = _getPlayerForId(2)?.PlayerName; var player1Score = _getPlayerScore(1); var player2Score = _getPlayerScore(2); if (player1Score == player2Score) { this.Status = $"{player1} has tied {player2}!"; } else if (player1Score > player2Score) { this.Status = $"{player1} has defeated {player2}!"; } else { this.Status = $"{player2} has defeated {player1}!"; } this.GameOver = true; } }