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();
    }
Пример #2
0
 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);
    }
Пример #4
0
    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();
 }