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(); }
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); }
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); }
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(); }