diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp
index bd31464b..9e60562c 100644
--- a/Tactical/LOS.cpp
+++ b/Tactical/LOS.cpp
@@ -3012,6 +3012,10 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend
}
}
+ // Flugente: ammotype can alter the damage dealt
+ INT16 sBreathLoss = (INT16)((iImpact * APBPConstants[BP_GET_WOUNDED] * (pTarget->bBreathMax * 100 - pTarget->sBreathRed)) / 10000);
+ sBreathLoss *= AmmoTypes[ubAmmoType].dDamageModifierBreath;
+
// Send event for getting hit
memset( &(SWeaponHit), 0, sizeof( SWeaponHit ) );
SWeaponHit.usSoldierID = pTarget->ubID;
@@ -3020,7 +3024,7 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend
SWeaponHit.usWeaponIndex = usAttackingWeapon;
SWeaponHit.sDamage = (INT16) iDamage;
// breath loss is based on original impact of bullet
- SWeaponHit.sBreathLoss = (INT16) ( (iImpact * APBPConstants[BP_GET_WOUNDED] * (pTarget->bBreathMax * 100 - pTarget->sBreathRed)) / 10000 );
+ SWeaponHit.sBreathLoss = sBreathLoss;
// HEADROCK HAM 5.1: Bullet data contains the correct original GridNo
SWeaponHit.usDirection = GetDirectionFromGridNo( pBullet->sOrigGridNo, pTarget );
SWeaponHit.sXPos = (INT16)pTarget->dXPos;
diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp
index b52ec2eb..33c57bf2 100644
--- a/Tactical/Weapons.cpp
+++ b/Tactical/Weapons.cpp
@@ -9604,6 +9604,9 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget,
pTarget->iLastArmourProtection += iTotalArmourProtection;
}
+ // Flugente: ammotype can alter the damage dealt
+ iImpact *= AmmoTypes[ubAmmoType].dDamageModifierLife;
+
// calc minimum damage
if ( AmmoTypes[ubAmmoType].zeroMinimumDamage )
{
diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h
index b5eafdc3..bed707fa 100644
--- a/Tactical/Weapons.h
+++ b/Tactical/Weapons.h
@@ -269,6 +269,10 @@ typedef struct
// Flugente: item flag for various properties. Way easier than 32 boolean flags
UINT32 ammoflag;
+
+ // Flugente: modifiers for life and breath damage, 1.0 being the unmodified value
+ FLOAT dDamageModifierLife;
+ FLOAT dDamageModifierBreath;
} AMMOTYPE;
diff --git a/Tactical/XML_AmmoTypes.cpp b/Tactical/XML_AmmoTypes.cpp
index ab4503f7..8a65fc61 100644
--- a/Tactical/XML_AmmoTypes.cpp
+++ b/Tactical/XML_AmmoTypes.cpp
@@ -82,7 +82,9 @@ ammotypeStartElementHandle(void *userData, const XML_Char *name, const XML_Char
strcmp(name, "temperatureModificator") == 0 ||
strcmp(name, "PoisonPercentage") == 0 ||
strcmp(name, "dirtModificator") == 0 ||
- strcmp(name, "ammoflag") == 0 ))
+ strcmp(name, "ammoflag" ) == 0 ||
+ strcmp(name, "dDamageModifierLife" ) == 0 ||
+ strcmp(name, "dDamageModifierBreath") == 0 ))
{
pData->curElement = ELEMENT_PROPERTY;
@@ -304,6 +306,22 @@ ammotypeEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
pData->curAmmoType.ammoflag = (UINT32) strtoul(pData->szCharData, NULL, 0);
}
+ else if ( strcmp( name, "dDamageModifierLife" ) == 0 )
+ {
+ pData->curElement = ELEMENT;
+ pData->curAmmoType.dDamageModifierLife = (FLOAT)atof( pData->szCharData );
+
+ // reasonable values only
+ pData->curAmmoType.dDamageModifierLife = min( 100.0f, max( 0.0f, pData->curAmmoType.dDamageModifierLife ) );
+ }
+ else if ( strcmp( name, "dDamageModifierBreath" ) == 0 )
+ {
+ pData->curElement = ELEMENT;
+ pData->curAmmoType.dDamageModifierBreath = (FLOAT)atof( pData->szCharData );
+
+ // reasonable values only
+ pData->curAmmoType.dDamageModifierBreath = min( 100.0f, max( 0.0f, pData->curAmmoType.dDamageModifierBreath ) );
+ }
pData->maxReadDepth--;
}
@@ -427,8 +445,10 @@ BOOLEAN WriteAmmoTypeStats()
FilePrintf(hFile,"\t\t%d\r\n", AmmoTypes[cnt].tracerEffect );
FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].temperatureModificator );
FilePrintf(hFile,"\t\t%d\r\n", AmmoTypes[cnt].poisonPercentage );
- FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dirtModificator );
+ FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dirtModificator );
FilePrintf(hFile,"\t\t%d\r\n", AmmoTypes[cnt].ammoflag );
+ FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dDamageModifierLife );
+ FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dDamageModifierBreath );
FilePrintf(hFile,"\t\r\n");
}