public void GiantRatCanAttackWithoutProvokingAoOs()
    {
        var giantRat = Create(TestProtos.GiantRat);

        giantRat.HasNaturalAttacks().Should().BeTrue();

        GameSystems.D20.Actions.AssignSeq(giantRat);

        var action   = new D20Action(D20ActionType.STANDARD_ATTACK, giantRat);
        var tbStatus = new TurnBasedStatus();

        GameSystems.D20.Actions.D20ActionTriggersAoO(action, tbStatus).Should().BeFalse();
    }
Beispiel #2
0
    public static void D20SendSignalEx(this GameObject obj, D20DispatcherKey signal, GameObject target)
    {
        D20Action d20a = new D20Action(D20ActionType.CAST_SPELL, obj);

        d20a.d20ATarget = target;
        d20a.d20Caf     = D20CAF.HIT;

        if (signal == D20DispatcherKey.SIG_TouchAttack)
        {
            d20a.d20Caf = obj.PerformTouchAttack(target);
        }

        GameSystems.D20.D20SendSignal(obj, signal, d20a);
    }
Beispiel #3
0
 internal static SavedD20Action SaveAction(D20Action action)
 {
     return(new SavedD20Action
     {
         Type = action.d20ActType,
         Data = action.data1,
         Flags = action.d20Caf,
         TargetLocation = action.destLoc,
         DistanceTraveled = action.distTraversed,
         RadialMenuArg = action.radialMenuActualArg,
         RollHistoryId0 = action.rollHistId0,
         RollHistoryId1 = action.rollHistId1,
         RollHistoryId2 = action.rollHistId2,
         SpellData = action.d20SpellData,
         SpellId = action.spellId,
         AnimActionId = action.animID,
         Performer = action.d20APerformer?.id ?? ObjectId.CreateNull(),
         Target = action.d20ATarget?.id ?? ObjectId.CreateNull(),
     });
 }
    internal static D20Action LoadAction(SavedD20Action savedAction)
    {
        var action = new D20Action
        {
            d20ActType          = savedAction.Type,
            data1               = savedAction.Data,
            d20Caf              = savedAction.Flags,
            destLoc             = savedAction.TargetLocation,
            distTraversed       = savedAction.DistanceTraveled,
            radialMenuActualArg = savedAction.RadialMenuArg,
            rollHistId0         = savedAction.RollHistoryId0,
            rollHistId1         = savedAction.RollHistoryId1,
            rollHistId2         = savedAction.RollHistoryId2,
            d20SpellData        = savedAction.SpellData,
            spellId             = savedAction.SpellId,
            animID              = savedAction.AnimActionId
        };

        if (!savedAction.Performer.IsNull)
        {
            action.d20APerformer = GameSystems.Object.GetObject(savedAction.Performer);
            if (action.d20APerformer == null)
            {
                throw new CorruptSaveException($"Unable to restore action performer: {savedAction.Performer}");
            }
        }

        if (!savedAction.Target.IsNull)
        {
            action.d20ATarget = GameSystems.Object.GetObject(savedAction.Target);
            if (action.d20ATarget == null)
            {
                throw new CorruptSaveException($"Unable to restore action target: {savedAction.Target}");
            }
        }

        return(action);
    }
Beispiel #5
0
    public static D20CAF PerformTouchAttack(this GameObject obj, GameObject target)
    {
        var action = new D20Action(D20ActionType.TOUCH_ATTACK, obj);

        action.d20ATarget = target;
        action.d20Caf    |= D20CAF.TOUCH_ATTACK | D20CAF.RANGED;
        action.data1      = 1;
        GameSystems.D20.Combat.ToHitProcessing(action);
        GameSystems.RollHistory.CreateRollHistoryString(action.rollHistId1);
        GameSystems.RollHistory.CreateRollHistoryString(action.rollHistId2);
        GameSystems.RollHistory.CreateRollHistoryString(action.rollHistId0);
        if ((action.d20Caf & D20CAF.CRITICAL) != 0)
        {
            return(D20CAF.CRITICAL);
        }
        else if ((action.d20Caf & D20CAF.HIT) != 0)
        {
            return(D20CAF.HIT);
        }
        else
        {
            return(0);
        }
    }
 public bool UsingSecondaryWeapon(D20Action action)
 {
     return(UsingSecondaryWeapon(action.d20APerformer, action.data1));
 }
    public static ActionCostType DispatchActionCostMod(this GameObject critter,
                                                       ActionCostPacket acp, TurnBasedStatus tbStatus, D20Action action)
    {
        var dispatcher = critter.GetDispatcher();

        if (dispatcher == null)
        {
            return(acp.hourglassCost);
        }

        EvtObjActionCost dispIo = new EvtObjActionCost(acp, tbStatus, action);

        dispatcher.Process(DispatcherType.ActionCostMod, D20DispatcherKey.NONE, dispIo);
        return(dispIo.acpCur.hourglassCost);
    }
 public bool PyProjectileHit(D20DispatcherKey actionData1, D20Action action, GameObject projectile, GameObject obj2)
 {
     throw new System.NotImplementedException();
 }
 public ActionErrorCode GetPyActionCost(D20Action action, TurnBasedStatus tbStatus, ActionCostPacket acp)
 {
     throw new System.NotImplementedException();
 }
 public ActionErrorCode PyAddToSeq(D20DispatcherKey actionData1, D20Action action, ActionSequence actSeq, TurnBasedStatus tbStatus)
 {
     throw new System.NotImplementedException();
 }