New tag <shotAnimation> in AmmoTypes.xml allows defining custom shot animation.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8800 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2020-05-13 06:31:11 +00:00
parent 42a85e96ba
commit d9c8a1c398
3 changed files with 79 additions and 3 deletions
+67
View File
@@ -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) )
{
+4
View File
@@ -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
+8 -3
View File
@@ -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<dDamageModifierArmouredVehicle>%4.2f</dDamageModifierArmouredVehicle>\r\n", AmmoTypes[cnt].dDamageModifierArmouredVehicle );
FilePrintf(hFile,"\t\t<dDamageModifierCivilianVehicle>%4.2f</dDamageModifierCivilianVehicle>\r\n", AmmoTypes[cnt].dDamageModifierCivilianVehicle );
FilePrintf(hFile,"\t\t<dDamageModifierZombie>%4.2f</dDamageModifierZombie>\r\n", AmmoTypes[cnt].dDamageModifierZombie );
FilePrintf(hFile, "\t\t<shotAnimation>%s</shotAnimation>\r\n", AmmoTypes[cnt].shotAnimation);
FilePrintf(hFile,"\t</AMMOTYPE>\r\n");
}