Esempio n. 1
0
 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();
 }
Esempio n. 2
0
 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();
 }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }