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