Ejemplo n.º 1
0
 ConquestResult TryConquest(Country invader, IReadOnlySquad invaderSquad, Location loc, MoveResult moveResult)
 {
     if (!moveResult.Success)
     {
         return(RaiseConquestResult(new ConquestResult(loc, invader, null, null, null, false, moveResult)));
     }
     _discovery.MarkDiscovered(invader, loc);
     if (loc.Owner == null)
     {
         OnConquestSuccess(invader, invaderSquad, loc);
         Debug.WriteLine($"ConquestController.TryConquest: {invader} auto-conquest '{loc.Name}'");
         return(RaiseConquestResult(new ConquestResult(loc, invader, null, new SquadInfo(invaderSquad.Count, 0), null, true, moveResult)));
     }
     else
     {
         var defender       = loc.Owner;
         var defenderSquad  = _army.AquireMaxSquad(defender);
         var conquestResult = TryDefeat(loc, moveResult, invader, ref invaderSquad, defender, ref defenderSquad);
         if (conquestResult.Success)
         {
             OnConquestSuccess(invader, invaderSquad, loc);
         }
         if (defenderSquad != null)
         {
             _army.ReleaseSquad(defender, defenderSquad);
         }
         Debug.WriteLine(
             $"ConquestController.TryConquest: {invader} conquest '{loc.Name}', result: ({conquestResult.Success}, " +
             $"invader: {conquestResult.InvaderSquad.Count} - {conquestResult.InvaderSquad.Loses}," +
             $"defender: {conquestResult.DefenderSquad.Count} - {conquestResult.DefenderSquad.Loses})"
             );
         return(RaiseConquestResult(conquestResult));
     }
 }
Ejemplo n.º 2
0
 void OnConquestSuccess(Country invader, IReadOnlySquad squad, Location loc)
 {
     _map.ChangeOwner(loc, invader);
     if (squad != null)
     {
         _army.ReleaseSquad(invader, squad);
     }
 }
Ejemplo n.º 3
0
        public IReadOnlySquad KillInSquad(Country country, IReadOnlySquad squadWrapper, int count)
        {
            var squad  = (squadWrapper as Squad);
            var squads = GetArmy(country).Squads;

            EnsureSquadContains(squad, squads);
            squad.Count -= count;
            if (squad.Count < 0)
            {
                squads.Remove(squad);
                squad = null;
            }
            Debug.WriteLine($"Kill {country} in army squad: -{count} = {GetTotalCount(country)}");
            return(squad);
        }
Ejemplo n.º 4
0
 public void StartConquest(
     Country invader, IReadOnlySquad invaderSquad, Location homeLoc, Location targetLoc, Action <ConquestResult, Location> onComplete
     )
 {
     _move.SendTo(invader, homeLoc, targetLoc, invaderSquad, (moveResult) => {
         if (moveResult.Success)
         {
             onComplete(TryConquest(invader, invaderSquad, targetLoc, moveResult), targetLoc);
         }
         else
         {
             onComplete(RaiseConquestResult(new ConquestResult(targetLoc, invader, null, null, null, false, moveResult)), targetLoc);
         }
     });
 }
Ejemplo n.º 5
0
        int ProcessSquadLoses(Country country, double difficulty, ref IReadOnlySquad squad)
        {
            var loses = 0;

            for (var i = 0; i < squad.Count; i++)
            {
                if (RandUtils.Rand.NextDouble() < difficulty)
                {
                    loses++;
                }
            }
            if (loses > 0)
            {
                _army.KillInSquad(country, squad, loses);
            }
            return(loses);
        }
Ejemplo n.º 6
0
        public void SendTo(Country country, Location homeLoc, Location targetLoc, IReadOnlySquad squad, Action <MoveResult> callback)
        {
            var moveTime = GetMoveTime(country, homeLoc, targetLoc);

            Debug.WriteLine($"MoveController.SendTo: Send {country} squad from {homeLoc.Name} to {targetLoc.Name}: days = {moveTime}");
            var routes = GetRoutes(country);

            routes.Add(targetLoc);
            _time.SheduleAction(moveTime, () => {
                var loses  = ProcessSquadLoses(country, targetLoc.Difficulty, ref squad);
                var isDone = squad?.Count > 0;
                Debug.WriteLine(
                    $"MoveController.SendTo: Result of sending {country} squad from {homeLoc.Name} to {targetLoc.Name}: loses = {loses}, isDone = {isDone}"
                    );
                callback(new MoveResult(loses, isDone));
                routes.Remove(targetLoc);
            });
        }
Ejemplo n.º 7
0
        public void ReleaseSquad(Country country, IReadOnlySquad squadWrapper)
        {
            var squad  = (squadWrapper as Squad);
            var squads = GetArmy(country).Squads;

            EnsureSquadContains(squad, squads);
            var firstFreeSquad = squads.FirstOrDefault(s => s.Free);

            if (firstFreeSquad != null)
            {
                firstFreeSquad.Count += squad.Count;
                squads.Remove(squad);
            }
            else
            {
                squad.Release();
            }
            Debug.WriteLine($"Release {country} squad: {squad.Count} (free now: {GetAvailableCount(country)})");
        }
Ejemplo n.º 8
0
        ConquestResult TryDefeat(
            Location location, MoveResult moveResult, Country invader, ref IReadOnlySquad invaderSquad, Country defender, ref IReadOnlySquad defenderSquad
            )
        {
            var invaderCount  = invaderSquad.Count;
            var defenderCount = defenderSquad.Count;
            var invaderPower  = GetPower(invader, invaderCount);
            var defenderPower = GetPower(defender, defenderCount);

            defenderSquad = _army.KillInSquad(defender, defenderSquad, invaderPower);
            invaderSquad  = _army.KillInSquad(invader, invaderSquad, defenderPower);

            var invaderLoses  = invaderCount - (invaderSquad != null ? invaderSquad.Count : 0);
            var defenderLoses = defenderCount - (defenderSquad != null ? defenderSquad.Count : 0);

            return(new ConquestResult(
                       location,
                       invader, defender,
                       new SquadInfo(invaderCount, invaderLoses),
                       new SquadInfo(defenderCount, defenderLoses),
                       defenderSquad == null, moveResult));
        }