internal virtual int dmg() { if (!has_weapon) { return(0); } Data_Weapon weapon = this.attacker_weapon; // Checks if weapon is magic bool magic_attack = attacker.check_magic_attack(weapon, Distance); bool imbue = (magic_attack && attacker.actor.power_type() == Power_Types.Strength); bool is_staff = weapon.is_staff(); int actor_dmg, weapon_dmg, skill_dmg, support_dmg; if (is_staff) { return(0); //Yeti } else { actor_dmg = weapon.Ignores_Pow() ? 0 : ((int)(attacker.atk_pow(weapon, magic_attack) * (imbue ? Constants.Combat.MAGIC_WEAPON_STR_RATE : 1))); weapon_dmg = (int)(weapon.Mgt * (imbue ? Constants.Combat.MAGIC_WEAPON_MGT_RATE : 1)); skill_dmg = 0; support_dmg = support_bonus(Combat_Stat_Labels.Dmg); attacker.dmg_skill( ref skill_dmg, ref weapon_dmg, ref actor_dmg, ref support_dmg, weapon, magic_attack, Distance); } return(Math.Max(0, actor_dmg + weapon_dmg + skill_dmg + support_dmg)); }
private int dmg_target(Game_Unit target) { Data_Weapon weapon = this.attacker_weapon; // Checks if weapon is magic bool magic_attack = attacker.check_magic_attack(weapon, Distance); bool imbue = (magic_attack && attacker.actor.power_type() == Power_Types.Strength); bool is_staff = weapon.is_staff(); Game_Actor actor2 = target.actor; Data_Weapon weapon2 = actor2.weapon; int total_damage, target_def; int actor_dmg, weapon_dmg, skill_dmg, support_dmg; // Staff if (is_staff) { actor_dmg = attacker.atk_pow(weapon, magic_attack); weapon_dmg = weapon.Mgt; skill_dmg = 0; attacker.dmg_staff_skill( ref skill_dmg, ref weapon_dmg, ref actor_dmg, target, magic_attack, Distance); support_dmg = support_bonus(Combat_Stat_Labels.Dmg); target_def = 0; } // Weapon else { var target_stats = this.target_stats(); target_def = magic_attack ? target_stats.res() : target_stats.def(); target_def = (weapon.Ignores_Def() ? target_def / 2 : target_def); if (weapon.Halves_HP()) { int total_weapon_damage = target_def + (int)Math.Ceiling(target.actor.hp / 2.0f); actor_dmg = (int)Math.Ceiling(total_weapon_damage / 2.0f); weapon_dmg = (int)Math.Floor(total_weapon_damage / 2.0f); } else { actor_dmg = weapon.Ignores_Pow() ? 0 : ((int)(attacker.atk_pow(weapon, magic_attack) * (imbue ? Constants.Combat.MAGIC_WEAPON_STR_RATE : 1))); weapon_dmg = (int)(weapon.Mgt * (imbue ? Constants.Combat.MAGIC_WEAPON_MGT_RATE : 1)); if (weapon.Ignores_Def()) { weapon_dmg += target_def; } } // Weapon triangle skill_dmg = 0; WeaponTriangle tri = Combat.weapon_triangle(attacker, target, weapon, weapon2, Distance); if (tri != WeaponTriangle.Nothing) { skill_dmg += Weapon_Triangle.DMG_BONUS * (tri == WeaponTriangle.Advantage ? 1 : -1) * Combat.weapon_triangle_mult(attacker, target, weapon, weapon2, Distance); } float effectiveness = weapon.effective_multiplier(attacker, target); skill_dmg += (int)((weapon_dmg + skill_dmg) * (effectiveness - 1)); support_dmg = support_bonus(Combat_Stat_Labels.Dmg); attacker.dmg_skill( ref skill_dmg, ref weapon_dmg, ref actor_dmg, ref support_dmg, ref target_def, weapon, target, weapon2, tri, magic_attack, Distance, effectiveness); } total_damage = actor_dmg + weapon_dmg + skill_dmg + support_dmg - target_def; int result = attacker.dmg_target_skill(target, weapon, Distance, Math.Max(0, total_damage)); return(result); }