Пример #1
0
    //This needs to set the defence and the defence type.
    static void DecideDefence(Unit attacker, Unit defender)
    {
        defence = defender.unitInfo.currentDefence;

        if (defender.defenceType == DefenceType.BLOCK)
        {
            if (defender.GetComponent <Shield>() != null)
            {
                defenceType     = DefenceType.SHIELD;
                struckAnimation = StruckAnimation.SHIELD;
                ShieldData data = (ShieldData)defender.GetComponent <Shield>().itemData;
                defence += data.shieldModifier;
                return;
            }
            else
            {
                if (defender.GetComponent <MeleeWeapon>() != null)
                {
                    if (defender.GetComponent <MeleeWeapon>().weaponData.weight > ItemData.Weight.light)
                    {
                        if (attacker.mainWeapon.weaponData.rangeType != WeaponData.Range.ranged)
                        {
                            defenceType     = DefenceType.BLOCK;
                            struckAnimation = StruckAnimation.BLOCK;
                            //block anim.
                            return;
                        }
                    }
                }
            }
        }
        if (defender.defenceType != DefenceType.EXPOSED)
        {
            //is there a square to dodge to?
            Tile dodgeTile = RangeFinder.FindTileToDodgeTo(defender.GetComponent <TacticsMovement>(), attacker, RangeFinder.FindDirection(defender.gameObject.transform, attacker.gameObject.transform));
            if (dodgeTile != null)
            {
                float heightOffset = dodgeTile.transform.position.y - defender.GetComponent <TacticsMovement>().currentTile.transform.position.y;
                defender.GetComponent <TacticsMovement>().dodgeTarget = new Vector3(dodgeTile.gameObject.transform.position.x, defender.transform.position.y + heightOffset, dodgeTile.gameObject.transform.position.z);
                defenceType = DefenceType.DODGE;
                return;
            }
        }
        //This catchall currently treats everything that doesn't fit the above as exposed.
        bonuses++;
        defenceType = DefenceType.EXPOSED;
    }
Пример #2
0
    private static void ResetValues()
    {
        grazeDamage     = -2;
        damage          = 0;
        bonuses         = 0;
        attack          = 0;
        defence         = 0;
        resiliance      = 0;
        wounds          = 0;
        blockDice       = 0;
        defenceType     = DefenceType.BLOCK;
        struckAnimation = StruckAnimation.DODGE;
        armourPierce    = false;
        autocrit        = false;

        //Debug
        attackRolled = false;
    }
Пример #3
0
    public static void DamageRoll(TacticsMovement attacker, Unit defender, Result attackResult)
    {
        damage     += attacker.unitInfo.currentDamage;
        resiliance += defender.unitInfo.currentToughness;
        if (!armourPierce)
        {
            resiliance += defender.unitInfo.currentArmour;
        }

        //Blocking
        if (defenceType == DefenceType.BLOCK)
        {
            blockDice = -1;
            defender.gameObject.GetComponent <UnitPopUpManager>().AddPopUpInfo("blocked");
        }
        if (defenceType == DefenceType.SHIELD)
        {
            blockDice = -2;
            defender.gameObject.GetComponent <UnitPopUpManager>().AddPopUpInfo("shielded");
        }

        AbilityCheck.CheckAbility(damage, resiliance, blockDice);
        int result = AbilityCheck.baseResult;

        //assumes all are 'fated' for now.
        if (result < -9)
        {
            defender.gameObject.GetComponent <UnitPopUpManager>().AddPopUpInfo("shrugged");
            return;
        }
        else if (result < 1)
        {
            OnGraze(attacker, defender); //Alert all that someone is grazed.
            defender.UpdateBreath(grazeDamage);
            struckAnimation = StruckAnimation.GRAZE;
        }
        else
        {
            OnWound(attacker, defender); //Alert all that someone is wounded.
            if (result > 9)
            {
                wounds = 3;
            }
            else if (result > 4)
            {
                wounds = 2;
            }
            else
            {
                wounds = 1;
            }
            defender.UpdateWounds(wounds, woundValueAdjustment);
            struckAnimation = StruckAnimation.WOUND;
        }

        //Resolve all post-damage criticals.
        foreach (Critical c in CriticalManager.criticalChain)
        {
            if (c.AfterDamage() == true)
            {
                c.CriticalEffect();
            }
        }

        switch (struckAnimation)
        {
        case StruckAnimation.SHIELD:
            defender.unitAnim.SetTrigger("shield");
            break;

        case StruckAnimation.BLOCK:
            defender.unitAnim.SetTrigger("block");
            break;

        case StruckAnimation.GRAZE:
            defender.unitAnim.SetTrigger("graze");
            break;

        case StruckAnimation.WOUND:
            defender.unitAnim.SetTrigger("wound");
            break;

        default:
            break;
        }

        if (defender.focus != attacker)
        {
            defender.SetFocus(attacker);
        }
    }