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"); }