2
« on: May 05, 2014, 07:22:09 pm »
A part of combat.fos:
// ammo modifiers:
//DMMod - damage multiplier
//DDMod - damage divider
//DRMod - armor damage resistance (DR) modifier
//Ammo_DTDiv - armor damage treshold (DT) modifier (as AP ammo)
int dmgType = attack.DmgType;
int targetDR = target.GetDR(dmgType, attack.AimHead);
int targetDT = target.GetDT(dmgType, attack.AimHead);
int partialBypassChance = GetPartialBypassChance(target, attack.AimHead);
int partialBypassedRounds = 0;
int armorDR = target.GetArmorDR(dmgType, attack.AimHead);
int armorDT = target.GetArmorDT(dmgType, attack.AimHead);
int partialBypassDR = targetDR - armorDR + (armorDR / 4);
int partialBypassDT = targetDT - armorDT + (armorDT / 4);
if(FLAG(eff, HF_BYPASS_ARMOR) && dmgType != DAMAGE_EMP)
{
targetDT /= 4;
targetDR /= 4;
targetDR -= (valid(attacker) ? (attacker.Trait[TRAIT_FINESSE] != 0 ? 30 : 0) : 0);
}
else if(weaponPerk == WEAPON_PERK_PENETRATE)
targetDT /= 5;
else if(COMBAT_AMMO_AP(attack.Ammo))
targetDT /= attack.Ammo.Ammo_DTDiv;
else if(isThrust)
targetDT /= 2;
if(validAttacker && attacker.Trait[TRAIT_FINESSE] != 0)
{
targetDR += 30;
partialBypassDR += 30;
}
targetDR += attack.DRMod; // Always
partialBypassDR += attack.DRMod;
partialBypassDR = MIN(partialBypassDR, targetDR);
targetDR = CLAMP(targetDR, 0, 100);
partialBypassDR = CLAMP(partialBypassDR, 0, 100);
partialBypassDT = MIN(partialBypassDT, targetDT);
int dmgMin = attack.DmgMin + attack.BonusDmg + attack.DmgMin * attack.SelectWeaponBonus(BONUS_WEAPON_MIN_DMG)/100;
;
int dmgMax = attack.DmgMax + attack.BonusDmg + attack.DmgMax * attack.SelectWeaponBonus(BONUS_WEAPON_MAX_DMG)/100;
;
int rawDmg;
int totalDmg = 0;
//dmgMul *= attack.DMMod;
int dmgDiv = 2 * attack.DDMod;
for(uint i = 0; i < rounds; i++)
{
rawDmg = Random(dmgMin, dmgMax);
_dmgMul[i] *= attack.DMMod;
rawDmg *= _dmgMul[i];
rawDmg /= dmgDiv;
if(!FLAG(eff, HF_BYPASS_ARMOR) && partialBypassChance > 0 && Random(1, 100) <= partialBypassChance)
{
rawDmg -= partialBypassDT;
rawDmg -= (rawDmg * partialBypassDR) / 100;
partialBypassedRounds++;
}
else
{
rawDmg -= targetDT;
rawDmg -= (rawDmg * targetDR) / 100;
}
if(rawDmg > 0)
totalDmg += rawDmg;
}