Exemple #1
0
 public BattleIndex(int index, bool isFriendCombined, bool isEnemyCombined)
 {
     if (index < 12)
     {
         if (isFriendCombined)
         {
             Side  = index < 6 ? BattleSides.FriendMain : BattleSides.FriendEscort;
             Index = index % 6;
         }
         else
         {
             Side  = BattleSides.FriendMain;
             Index = index;
         }
     }
     else
     {
         if (isEnemyCombined)
         {
             Side  = index < 18 ? BattleSides.EnemyMain : BattleSides.EnemyEscort;
             Index = index % 6;
         }
         else
         {
             Side  = BattleSides.EnemyMain;
             Index = index - 12;
         }
     }
 }
Exemple #2
0
        private Round _finalizeRound(int roundCount, BattleSides before, bool firstPartAtaker,
                                     Dictionary <UnitType, int> sourceAfterUnits, Dictionary <UnitType, int> targetAfterUnits)
        {
            BattleSides after;

            if (firstPartAtaker)
            {
                after = new BattleSides {
                    Ataker   = sourceAfterUnits,
                    Defender = targetAfterUnits
                };
            }
            else
            {
                after = new BattleSides {
                    Ataker   = targetAfterUnits,
                    Defender = sourceAfterUnits
                };
            }
            var losts = new BattleSides {
                Ataker   = _leftMinusRight(before.Ataker, after.Ataker),
                Defender = _leftMinusRight(before.Defender, after.Defender)
            };

            var atackerEmptyResult  = _checkIsEmptySide(after.Ataker);
            var defenderEmptyResult = _checkIsEmptySide(after.Defender);

            if (atackerEmptyResult || defenderEmptyResult)
            {
                _isLastRound = true;
            }
            var battleResult = BattleResult.InProgress;

            if (_isLastRound)
            {
                if (!atackerEmptyResult && defenderEmptyResult)
                {
                    battleResult = BattleResult.AtackerWin;
                }
                else if (atackerEmptyResult && !defenderEmptyResult)
                {
                    battleResult = BattleResult.DefenderWin;
                }
            }

            return(new Round {
                Before = before,
                Lost = losts,
                After = after,
                InitiativeIsAtacker = firstPartAtaker,
                RoundCount = roundCount,
                BattleResult = battleResult
            });
        }
Exemple #3
0
        private Round _calcCurrentRound(Dictionary <UnitType, int> atackerSide, Dictionary <UnitType, int> defenderSide,
                                        int roundNumber, IReadOnlyList <bool> initiativeHistory)
        {
            var before = new BattleSides {
                Ataker   = _rebuildUnitsInCollection(atackerSide),
                Defender = _rebuildUnitsInCollection(defenderSide)
            };
            var firstPartAtaker = !initiativeHistory.Any()
                ? Rand.NextDouble() <= 0.5
                : !initiativeHistory[initiativeHistory.Count - 1];

            Dictionary <UnitType, int> sourceSide;
            Dictionary <UnitType, int> targetSide;
            Dictionary <UnitType, Dictionary <BattleStatTypes, IBattleStatsDouble> > sourceMods;
            Dictionary <UnitType, Dictionary <BattleStatTypes, IBattleStatsDouble> > targetMods;

            if (firstPartAtaker)
            {
                sourceSide = _cloneUnits(before.Ataker);
                targetSide = _cloneUnits(before.Defender);
                sourceMods = _sourceMods;
                targetMods = _targetMods;
            }
            else
            {
                sourceSide = _cloneUnits(before.Defender);
                targetSide = _cloneUnits(before.Ataker);
                sourceMods = _targetMods;
                targetMods = _sourceMods;
            }
            if (sourceSide.Count <= 0 || targetSide.Count <= 0)
            {
                return(_finalizeRound(roundNumber, before, firstPartAtaker, sourceSide, targetSide));
            }
            else
            {
                var targetAfterUnits = _calcTargetAfterUnits(sourceSide, targetSide, sourceMods, targetMods);
                var sourceAfterUnits = _calcTargetAfterUnits(targetAfterUnits, sourceSide, targetMods, sourceMods);

                return(_finalizeRound(roundNumber, before, firstPartAtaker, sourceAfterUnits, targetAfterUnits));
            }
        }
Exemple #4
0
 public static int Get(BattleSides side, int index) => new BattleIndex(side, index);
Exemple #5
0
 public BattleIndex(BattleSides side, int index)
 {
     Side  = side;
     Index = index;
 }