//Heals are bit different but similar enough, most notable is that you can't heal enemies and you can never heal more than once at a time DamageRelated Heal(RPGClass.CombatStats Healer, RPGClass.CombatStats Other) { int Hit = 100, Crit = 0, HealAmount = Healer.Attack, HealCount; if (Other.UnitReference.tag != Healer.UnitReference.tag) { HealCount = 0; } else { HealCount = 1; } return(new DamageRelated(Healer.UnitReference, Healer.Health, HealAmount, Hit, Crit, HealCount)); }
//figure out attacker parameters relative to the defender. DamageRelated ProbableDamage(RPGClass.CombatStats Attacker, RPGClass.CombatStats Defender, Terrain AttackerTerrain, Terrain DefenderTerrain) { //Don't attack with a staff, it's for healing not hurting! (This only basic staves) if (Attacker.EquipedWeapon.WeaponCategory == Weapons.WeaponType.Staff && Attacker.EquipedWeapon.Effect == Weapons.WeaponEffect.Basic) { return(Heal(Attacker, Defender)); } int Hit = Attacker.HitChance - Defender.Dodge - DefenderTerrain.DodgeBonus; //Hit chance = hit - dodge - dodge bonus int Crit = Attacker.CritChance - Defender.CriticalDodge; //Crit chance = crit - crit dodge int Damage = Attacker.Attack; //Damage = strength/magic + might //Reduce damage by defenders defense/resistance according to attacker damage type if (Attacker.DamageType == Weapons.Damage.Physical) { Damage -= (Defender.Defense + DefenderTerrain.DefenseBonus); } else { Damage -= (Defender.Resistance + DefenderTerrain.DefenseBonus); } //Determine the number of attacks a unit has, by default 1 int AttackCount = 1; //If the attacker is signifigantly faster than the defender if (Attacker.AttackSpeed > Defender.AttackSpeed + 5) { AttackCount = 2; } //If the attacker has a special weapon if (Attacker.EquipedWeapon.Effect == Weapons.WeaponEffect.DoubleStrike) { AttackCount *= 2; } //Get Distance int distance = Mathf.Abs(AttackerTerrain.x - DefenderTerrain.x) + Mathf.Abs(AttackerTerrain.y - DefenderTerrain.y); //Check Range if (distance > Attacker.EquipedWeapon.maxRange || distance < Attacker.EquipedWeapon.minRange) { AttackCount = 0; } //Calculate weapon triangle effect, then apply them int[] Modifiers = WeaponTriangleEffect(Attacker.EquipedWeapon, Defender.EquipedWeapon); Damage += Modifiers[0]; Hit += Modifiers[1]; //Finally, clamp final values so that they make sense to the player if (Damage < 0) { Damage = 0; } if (Crit < 0) { Crit = 0; } else if (Crit > 100) { Crit = 100; } if (Hit < 0) { Hit = 0; } else if (Hit > 100) { Hit = 100; } return(new DamageRelated(Attacker.UnitReference, Attacker.UnitReference.Stats[(int)RPGClass.Stat.HitPoints].dynamicValue, Damage, Hit, Crit, AttackCount, Modifiers[2])); }