public ResultType GetResult(bool hypothetical = false) { saveProducer.ProduceSave(this); dcProducer.ProduceDcInSave(this); ResultType ret = ResultType.FAILURE; //TODO: This is not DRY. See attack situations.... This should be refactored. if (!hypothetical) { saveProducer.AboutToResolveSave(this); dcProducer.AboutToResolveDcInSave(this); int rollAccepted = 0; 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; } saveValue.ChangeCurrentAndMax(rollAccepted); ret = CalculateResult(saveValue, DC); saveProducer.DidResolveSave(this); dcProducer.DidResolveDcInSave(this); } return(ret); }