//TODO: Generalize this.... public ResultType GetResult(bool hypothetical = false) { if (IsOffhand) { attacker.ProduceToHit(this, true); } else { attacker.ProduceToHit(this); } defender.ProduceAC(this); if (!hypothetical) { attacker.AboutToAttack(this); defender.AboutToBeAttacked(this); int rollAccepted = 0; //TODO: This is not DRY. See save situations.... This should be refactored. if (DisadvantageFlagged() && AdvantageFlagged()) { //roll normally int rll = Sheet.DiceRoll(20); rolls.Add(rll); rollAccepted = rll; } else if (AdvantageFlagged()) { //roll adv int[] rll = Sheet.MultipleDiceRoll(20, 2); rolls.Add(rll[0]); rolls.Add(rll[1]); if (rll[0] >= rll[1]) { rollAccepted = rll[0]; } else { rollAccepted = rll[1]; } } else if (DisadvantageFlagged()) { //roll dis int[] rll = Sheet.MultipleDiceRoll(20, 2); rolls.Add(rll[0]); rolls.Add(rll[1]); if (rll[0] <= rll[1]) { rollAccepted = rll[0]; } else { rollAccepted = rll[1]; } } else { //roll normally int rll = Sheet.DiceRoll(20); rolls.Add(rll); rollAccepted = rll; } // rollAccepted = 20; hitRoll.ChangeCurrentAndMax(rollAccepted); result = CalculateResult(hitRoll, AC); attacker.DidAttack(this); defender.WasAttacked(this); } return(this.result); }