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; } } }
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 }); }
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)); } }
public static int Get(BattleSides side, int index) => new BattleIndex(side, index);
public BattleIndex(BattleSides side, int index) { Side = side; Index = index; }