private void EnqueueWaitingFleets(Guid userId, PlayerGameState player) { foreach (var fleet in player.WaitingFleets) { var route = _map.GenerateRoute(fleet.From, fleet.To); var movingFleet = new MovingFleetData(userId, fleet, route); player.MovingFleets.Add(movingFleet); } player.WaitingFleets.Clear(); }
private void EnqueueWaitingFleets(PlayerGameState player) { foreach (var fleet in player.WaitingFleets) { var movingFleet = new MovingFleetData { Route = _map.GenerateRoute(fleet.From, fleet.To), Fleet = fleet, Position = fleet.From }; player.MovingFleets.Add(movingFleet); } player.WaitingFleets.Clear(); }
private async Task HandleBattle(MovingFleetData movingFleet, PlanetData attackerPlanet, PlanetData defenderPlanet) { if (attackerPlanet.OwnerId == null) { throw new InvalidOperationException($"Attacker planet {attackerPlanet.Name} is neutral."); } var attacker = new BattleFleet(movingFleet.Fleet.Ships, attackerPlanet.Power); var defender = new BattleFleet(defenderPlanet.Ships, defenderPlanet.Power); var battleOutcome = _battleStrategy.Calculate(attacker, defender); var previousDefenderOwnerId = defenderPlanet.OwnerId; var attackerStats = _state.PlayerStates[attackerPlanet.OwnerId.Value].Statistics; attackerStats.ShipsDestroyed += defender.Ships - battleOutcome.DefenderShips; attackerStats.ShipsLost += attacker.Ships - battleOutcome.AttackerShips; if (battleOutcome.AttackerShips > 0) { attackerStats.BattlesWon += 1; defenderPlanet.OwnerId = movingFleet.OwnerUserId; defenderPlanet.Ships = battleOutcome.AttackerShips; } else { attackerStats.BattlesLost += 1; defenderPlanet.Ships = battleOutcome.DefenderShips; } var attackOutcome = battleOutcome.AttackerShips > 0 ? AttackOutcome.Win : AttackOutcome.Defeat; var attackEnded = new AttackHappened( _state.RoomId, attackerUserId: movingFleet.OwnerUserId, defenderUserId: previousDefenderOwnerId, planetName: defenderPlanet.Name, outcome: attackOutcome); if (previousDefenderOwnerId != null) { var defenderStats = _state.PlayerStates[previousDefenderOwnerId.Value].Statistics; defenderStats.ShipsDestroyed += attacker.Ships - battleOutcome.AttackerShips; defenderStats.ShipsLost += defender.Ships - battleOutcome.DefenderShips; if (attackOutcome == AttackOutcome.Win) { defenderStats.BattlesLost += 1; } else { defenderStats.BattlesWon += 1; } } await NotifyEverybody(attackEnded); }
private async Task HandleFleetArrival(MovingFleetData movingFleet) { var attackerPlanet = _map[movingFleet.Fleet.From]; if (attackerPlanet.OwnerId == null) { throw new InvalidOperationException($"Attacker planet {attackerPlanet.Name} is neutral."); } var defenderPlanet = _map[movingFleet.Fleet.To]; if (movingFleet.OwnerUserId == defenderPlanet.OwnerId) { defenderPlanet.Ships += movingFleet.Fleet.Ships; var reinforcementsArrived = new ReinforcementsArrived( _state.RoomId, defenderPlanet.Name, defenderPlanet.OwnerId.Value, movingFleet.Fleet.Ships); await _hub.Notify(movingFleet.OwnerUserId, reinforcementsArrived); return; } await HandleBattle(movingFleet, attackerPlanet, defenderPlanet); }