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(); }
internal static SavedD20TurnBasedStatus SaveTurnStatus(TurnBasedStatus turnStatus) { return(new SavedD20TurnBasedStatus { HourglassState = turnStatus.hourglassState, Flags = turnStatus.tbsFlags, IndexSth = turnStatus.idxSthg, SurplusMoveDistance = turnStatus.surplusMoveDistance, BaseAttackNumCode = turnStatus.baseAttackNumCode, AttackModeCount = turnStatus.attackModeCode, NumBonusAttacks = turnStatus.numBonusAttacks, NumAttacks = turnStatus.numAttacks, ErrorCode = turnStatus.errCode }); }
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); }
private float UiCombatActionBarGetRemainingMoveDistance(TurnBasedStatus tbStat) { var moveSpeed = GameSystems.D20.Initiative.CurrentActor.Dispatch41GetMoveSpeed(out _); if (moveSpeed < 0.001f) { moveSpeed = 30.0f; } if (GameSystems.D20.Actions.GetHourglassTransition(tbStat.hourglassState, ActionCostType.FullRound) != HourglassState.INVALID) { // A full action can still be taken, return double move distance (PS: This is not great) return(moveSpeed + moveSpeed); } float newMoveActDistance; if (GameSystems.D20.Actions.GetHourglassTransition(tbStat.hourglassState, ActionCostType.Standard) == HourglassState.INVALID && GameSystems.D20.Actions.GetHourglassTransition(tbStat.hourglassState, ActionCostType.Move) == HourglassState.INVALID) { // No new move actions can be taken newMoveActDistance = 0.0f; } else { // Full move actions can be taken, so take the max dist for one (PS: This is not great) newMoveActDistance = moveSpeed; } // Add the remaining distance of an already performed moved action that wasn't fully used up var remainDist = newMoveActDistance + tbStat.surplusMoveDistance; if (GameSystems.D20.Actions.GetHourglassTransition(tbStat.hourglassState, ActionCostType.Move) != HourglassState.INVALID || (tbStat.tbsFlags & TurnBasedStatusFlags.Moved) != 0) { return(remainDist); } else { // Five foot step is still possible return(remainDist + 5.0f); } }
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(); }