diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp
index 27a4caf2..7e91a1b2 100644
--- a/Tactical/Weapons.cpp
+++ b/Tactical/Weapons.cpp
@@ -2833,6 +2833,39 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
StatChange( pSoldier, DEXTAMT, usDextGain, FROM_FAILURE );
StatChange( pSoldier, MARKAMT, usMrksGain, FROM_FAILURE );
}
+ }
+
+ //ScreenMsg(FONT_ORANGE, MSG_INTERFACE, L"ammotype %d", Magazine[Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType);
+ if (IS_MERC_BODY_TYPE(pSoldier) &&
+ pSoldier->bVisible == TRUE &&
+ Item[usUBItem].usItemClass == IC_GUN &&
+ !Item[usUBItem].rocketlauncher &&
+ strlen(AmmoTypes[Magazine[Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType].shotAnimation) > 0)
+ {
+ ANITILE_PARAMS AniParams;
+
+ FLOAT dStartZ;
+ CalculateSoldierZPos(pSoldier, FIRING_POS, &dStartZ);
+
+ INT32 sTempGridNo = NewGridNo(pSoldier->sGridNo, DirectionInc(pSoldier->ubDirection));
+ if (gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_PRONE && pSoldier->ubDirection % 2 == 0)
+ {
+ sTempGridNo = NewGridNo(sTempGridNo, DirectionInc(pSoldier->ubDirection));
+ }
+ INT16 sX = CenterX(sTempGridNo);
+ INT16 sY = CenterY(sTempGridNo);
+
+ AniParams.sGridNo = pSoldier->sGridNo;
+ AniParams.ubLevelID = ANI_TOPMOST_LEVEL;
+ AniParams.sDelay = (INT16)(100);
+ AniParams.sStartFrame = 0;
+ AniParams.uiFlags = ANITILE_CACHEDTILE | ANITILE_FORWARD | ANITILE_ALWAYS_TRANSLUCENT;
+ AniParams.sX = sX + Random(3) - 1;
+ AniParams.sY = sY + Random(3) - 1;
+ AniParams.sZ = CONVERT_HEIGHTUNITS_TO_PIXELS(dStartZ);
+
+ strncpy(AniParams.zCachedFile, AmmoTypes[Magazine[Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType].shotAnimation, MAX_ANIMATION_FILENAME_LEN);
+ CreateAnimationTile(&AniParams);
}
/////////////////////////////// Fire bullet at the target coordinates.
@@ -3559,6 +3592,40 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
return( FALSE );
}
}
+
+ //ScreenMsg(FONT_ORANGE, MSG_INTERFACE, L"ammotype %d", Magazine[Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType);
+ if (IS_MERC_BODY_TYPE(pSoldier) &&
+ pSoldier->bVisible == TRUE &&
+ Item[usUBItem].usItemClass == IC_GUN &&
+ !Item[usUBItem].rocketlauncher &&
+ strlen(AmmoTypes[Magazine[Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType].shotAnimation) > 0)
+ {
+ ANITILE_PARAMS AniParams;
+
+ FLOAT dStartZ;
+ CalculateSoldierZPos(pSoldier, FIRING_POS, &dStartZ);
+
+ INT32 sTempGridNo = NewGridNo(pSoldier->sGridNo, DirectionInc(pSoldier->ubDirection));
+ if (gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_PRONE && pSoldier->ubDirection % 2 == 0)
+ {
+ sTempGridNo = NewGridNo(sTempGridNo, DirectionInc(pSoldier->ubDirection));
+ }
+ INT16 sX = CenterX(sTempGridNo);
+ INT16 sY = CenterY(sTempGridNo);
+
+ AniParams.sGridNo = pSoldier->sGridNo;
+ AniParams.ubLevelID = ANI_TOPMOST_LEVEL;
+ AniParams.sDelay = (INT16)(100);
+ AniParams.sStartFrame = 0;
+ AniParams.uiFlags = ANITILE_CACHEDTILE | ANITILE_FORWARD | ANITILE_ALWAYS_TRANSLUCENT;
+ AniParams.sX = sX + Random(3) - 1;
+ AniParams.sY = sY + Random(3) - 1;
+ AniParams.sZ = CONVERT_HEIGHTUNITS_TO_PIXELS(dStartZ);
+
+ strncpy(AniParams.zCachedFile, AmmoTypes[Magazine[Item[(*pObjAttHand)[0]->data.gun.usGunAmmoItem].ubClassIndex].ubAmmoType].shotAnimation, MAX_ANIMATION_FILENAME_LEN);
+ CreateAnimationTile(&AniParams);
+ }
+
//hayden
if((is_server && pSoldier->ubID<120) || (!is_server && is_client && pSoldier->ubID<20) || (!is_server && !is_client) )
{
diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h
index 7c198f8d..67e04d34 100644
--- a/Tactical/Weapons.h
+++ b/Tactical/Weapons.h
@@ -203,6 +203,8 @@ enum
#define PLAYER_NET_4_LVL_4 0x80000000 //2147483648*/
// ----------------------------------------------------------------
+#define MAX_ANIMATION_FILENAME_LEN 100
+
typedef struct
{
UINT32 uiIndex;
@@ -259,6 +261,8 @@ typedef struct
FLOAT dDamageModifierCivilianVehicle;
FLOAT dDamageModifierZombie;
+ // sevenfm: shot animation
+ CHAR8 shotAnimation[MAX_ANIMATION_FILENAME_LEN];
} AMMOTYPE;
enum
diff --git a/Tactical/XML_AmmoTypes.cpp b/Tactical/XML_AmmoTypes.cpp
index 57cef4cb..aafa417f 100644
--- a/Tactical/XML_AmmoTypes.cpp
+++ b/Tactical/XML_AmmoTypes.cpp
@@ -87,7 +87,8 @@ ammotypeStartElementHandle(void *userData, const XML_Char *name, const XML_Char
strcmp(name, "dDamageModifierTank" ) == 0 ||
strcmp(name, "dDamageModifierArmouredVehicle" ) == 0 ||
strcmp(name, "dDamageModifierCivilianVehicle" ) == 0 ||
- strcmp(name, "dDamageModifierZombie") == 0 ))
+ strcmp(name, "dDamageModifierZombie") == 0 ||
+ strcmp(name, "shotAnimation") == 0))
{
pData->curElement = ELEMENT_PROPERTY;
@@ -340,6 +341,11 @@ ammotypeEndElementHandle(void *userData, const XML_Char *name)
// reasonable values only
pData->curAmmoType.dDamageModifierZombie = min( 100.0f, max( 0.0f, pData->curAmmoType.dDamageModifierZombie ) );
}
+ else if (strcmp(name, "shotAnimation") == 0)
+ {
+ pData->curElement = ELEMENT;
+ strncpy(pData->curAmmoType.shotAnimation, pData->szCharData, MAX_ANIMATION_FILENAME_LEN);
+ }
pData->maxReadDepth--;
}
@@ -348,8 +354,6 @@ ammotypeEndElementHandle(void *userData, const XML_Char *name)
}
-
-
BOOLEAN ReadInAmmoTypeStats(STR fileName)
{
HWFILE hFile;
@@ -464,6 +468,7 @@ BOOLEAN WriteAmmoTypeStats()
FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dDamageModifierArmouredVehicle );
FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dDamageModifierCivilianVehicle );
FilePrintf(hFile,"\t\t%4.2f\r\n", AmmoTypes[cnt].dDamageModifierZombie );
+ FilePrintf(hFile, "\t\t%s\r\n", AmmoTypes[cnt].shotAnimation);
FilePrintf(hFile,"\t\r\n");
}