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