예제 #1
0
        //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);
        }