public CombatTurn(BattleStatistics attacker, BaseCharacter defender, bool?advantage) { turnOwner = attacker.Character; for (int a = 0; a <= turnOwner.ExtraAttacks; a++) { attemptedAttacks.Add(new Attack(attacker, defender, advantage)); if (defender.CurHitPoints <= 0) { break; } } ToString(); }
public Battle(BaseCharacter combatant, BaseCharacter opponent) { this.combatant = combatant; this.CombatantAtStart = (BaseCharacter)combatant.Clone(); this.opponent = opponent; this.OpponentAtStart = (BaseCharacter)opponent.Clone(); CombatantInitiative = this.combatant.Initiative + DiceRoller.TwentySidedDie(); OpponentInitiative = this.opponent.Initiative + DiceRoller.TwentySidedDie(); startingCharacterStatistics = new BattleStatistics(StartingCharacter, CharacterGoingLast); characterGoingLastStatistics = new BattleStatistics(CharacterGoingLast, StartingCharacter); estimatedPowerDifference = combatant.CalculateRelativePower(opponent); if (combatant.CurHitPoints <= 0 || opponent.CurHitPoints <= 0) { throw new ArgumentException("Can't have a battle without at least two living combatants!"); } StartBattle(); }
public Attack(BattleStatistics attackerStats, BaseCharacter defender, bool?advantage) { this.attacker = attackerStats.Character; this.defender = defender; this.advantage = advantage; defenderArmorClass = defender.ArmorClass; defenderInitialHealth = defender.CurHitPoints; attackRoll = attacker.AttackRoll(advantage: advantage); criticalHit = attackRoll == Int32.MaxValue; criticalMiss = attackRoll == Int32.MinValue; hit = (criticalHit || attackRoll >= defenderArmorClass) && !criticalMiss; if (hit) { damageRoll = attacker.DamageRoll(critical: criticalHit); damageDealt = defender.ReceiveDamage(damageRoll); } attackerStats.ReportAttackResults(hit, criticalHit, criticalMiss, damageDealt); ToString(); }
public Round(int roundNumber, BattleStatistics combatantStats, BattleStatistics opponentStats, bool?combatantAdvantage = null, bool?opponentAdvantage = null) { this.combatant = combatantStats.Character; this.opponent = opponentStats.Character; this.RoundNumber = roundNumber; statistics[combatant] = combatantStats; statistics[opponent] = opponentStats; roundStartDescription += '\n' + $"\u200BRound {RoundNumber}! {combatant.Name} (HP: {combatant.CurHitPoints}/{combatant.MaxHitPoints}) vs {opponent.Name} (HP: {opponent.CurHitPoints}/{opponent.MaxHitPoints})\n"; turns.Add(new CombatTurn(statistics[combatant], opponent, combatantAdvantage)); if (BattleOver.Item1 == null) { bool otherOneMessedUp = turns.Last().attemptedAttacks.Last().criticalMiss; turns.Add(new CombatTurn(statistics[opponent], combatant, otherOneMessedUp ? (bool?)true : opponentAdvantage)); } if (turns.Last().attemptedAttacks.Last().criticalMiss) { EarnedAdvantage = combatant; } ToString(); }