//stats processing for attack from unit (tower/creep) public void Process_SrcUnit() { if (srcUnit.GetHit() <= 0) { Debug.LogWarning("Attacking unit (" + srcUnit.unitName + ") has default hitChance of 0%, is this intended?", srcUnit); } float hitChance = Mathf.Clamp(srcUnit.GetHit() - tgtUnit.GetDodge(), 0, 1); if (Random.Range(0f, 1f) > hitChance) { missed = true; return; } if (srcUnit.GetInstantKill().IsApplicable(tgtUnit.HP, tgtUnit.fullHP)) { damage = tgtUnit.HP; damageHP = tgtUnit.HP; instantKill = true; destroy = true; return; } damage = Random.Range(srcUnit.GetDamageMin(), srcUnit.GetDamageMax()); damage /= (float)srcUnit.GetShootPointCount(); //divide the damage by number of shootPoint float critChance = srcUnit.GetCritChance(); if (tgtUnit.immuneToCrit) { critChance = -1f; } if (Random.Range(0f, 1f) < critChance) { critical = true; damage *= srcUnit.GetCritMultiplier(); //new TextOverlay(impactPoint, "Critical", new Color(1f, .6f, 0f, 1f)); } float dmgModifier = DamageTable.GetModifier(tgtUnit.armorType, srcUnit.damageType); damage *= dmgModifier; if (damage >= tgtUnit.shield) { damageShield = tgtUnit.shield; damageHP = damage - tgtUnit.shield; } else { damageShield = damage; damageHP = 0; } if (Random.Range(0f, 1f) < srcUnit.GetShieldPierce() && damageShield > 0) { damageHP += damageShield; damageShield = 0; pierceShield = true; //new TextOverlay(impactPoint,"Shield Pierced", new Color(0f, 1f, 1f, 1f)); } if (srcUnit.DamageShieldOnly()) { damageHP = 0; } if (damageHP >= tgtUnit.HP) { destroy = true; return; } if (Random.Range(0f, 1f) < srcUnit.GetShieldBreak() && tgtUnit.fullShield > 0) { breakShield = true; } stunned = srcUnit.GetStun().IsApplicable(); if (tgtUnit.immuneToStun) { stunned = false; } slowed = srcUnit.GetSlow().IsValid(); if (tgtUnit.immuneToSlow) { slowed = false; } if (srcUnit.GetDot().GetTotalDamage() > 0) { dotted = true; } if (stunned) { stun = srcUnit.GetStun().Clone(); } if (slowed) { slow = srcUnit.GetSlow().Clone(); } if (dotted) { dot = srcUnit.GetDot().Clone(); } }
public void Process() { if (processed) { return; } processed = true; damage = Random.Range(srcUnit.GetDamageMin(), srcUnit.GetDamageMax()); damage /= (float)srcUnit.GetShootPointCount(); //divide the damage by number of shootPoint float critChance = srcUnit.GetCritChance(); if (tgtUnit.immuneToCrit) { critChance = -1f; } if (Random.Range(0f, 1f) < critChance) { critical = true; damage *= srcUnit.GetCritMultiplier(); } if (damage >= tgtUnit.shield) { damageShield = tgtUnit.shield; damageHP = damage - tgtUnit.shield; } else { damageShield = damage; damageHP = 0; } if (damageHP >= tgtUnit.HP) { destroy = true; return; } stunned = srcUnit.GetStun().IsApplicable(); if (tgtUnit.immuneToStun) { stunned = false; } slowed = srcUnit.GetSlow().IsValid(); if (tgtUnit.immuneToSlow) { slowed = false; } if (srcUnit.GetDot().GetTotalDamage() > 0) { dotted = true; } if (stunned) { stun = srcUnit.GetStun().Clone(); } if (slowed) { slow = srcUnit.GetSlow().Clone(); } if (dotted) { dot = srcUnit.GetDot().Clone(); } }