This revision requires GameDir 1873 to work because of a new icon in ItemInfoAdvancedIcons.sti!!!

- Weapons.xml tags <bRecoilX> and <bRecoilY> are now FLOAT type values. This allows to differentiate weapons by smaller steps.
- Items.xml tags <RecoilModifierX> and <RecoilModifierY> are now FLOAT types as well.
- Items.xml tag <PercentRecoilModifier> will now be displayed in UDB advanced tab.
- Item_Settings.ini has new modifiers for gun type specific <bRecoilX> and <bRecoilY>. This allows modders to quickly adjust recoil values for any gun type.
- fixed UDB description for <RecoilModifierX> and <RecoilModifierY>
- All recoil calculations now use FLOAT values for more precision.


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6613 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
silversurfer
2013-11-16 16:55:32 +00:00
parent f986cc1292
commit 5878355d61
23 changed files with 313 additions and 159 deletions
+133 -49
View File
@@ -3151,11 +3151,33 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
}
}
INT8 bDummy;
INT8 bRecoilModifier;
GetFlatRecoilModifier( gpItemDescObject, &bRecoilModifier, &bDummy );
///////////////////// PERCENT RECOIL MODIFIER
if ( GetPercentRecoilModifier( gpItemDescObject ) != 0 )
{
if ( UsingNewCTHSystem() == true )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_WEAPON|IC_PUNCH))
{
swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 65 ], szUDBAdvStatsExplanationsTooltipTextForWeapons[ 52 ]);
}
else
{
swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 65 ], szUDBAdvStatsExplanationsTooltipText[ 64 ]);
}
SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr );
MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] );
}
cnt++;
}
}
FLOAT bRecoilModifierX;
FLOAT bRecoilModifierY;
GetFlatRecoilModifier( gpItemDescObject, &bRecoilModifierX, &bRecoilModifierY );
///////////////////// LATERAL RECOIL MODIFIER
if (bRecoilModifier != 0 )
if (bRecoilModifierX != 0 )
{
if( UsingNewCTHSystem() == true )
{
@@ -3176,9 +3198,8 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
}
}
GetFlatRecoilModifier( gpItemDescObject, &bDummy, &bRecoilModifier );
///////////////////// VERTICAL RECOIL MODIFIER
if (bRecoilModifier != 0 )
if (bRecoilModifierY != 0 )
{
if( UsingNewCTHSystem() == true )
{
@@ -5047,11 +5068,25 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject )
cnt++;
}
}
///////////////////// PERCENT RECOIL MODIFIER
if ( GetPercentRecoilModifier( gpItemDescObject ) != 0 )
{
if ( UsingNewCTHSystem() == true )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 62, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
}
cnt++;
}
}
FLOAT bRecoilModifierX;
FLOAT bRecoilModifierY;
GetFlatRecoilModifier( gpItemDescObject, &bRecoilModifierX, &bRecoilModifierY );
///////////////////// LATERAL RECOIL MODIFIER
INT8 bRecoilModifier;
INT8 bDummy;
GetFlatRecoilModifier( gpItemDescObject, &bRecoilModifier, &bDummy );
if (bRecoilModifier != 0)
if (bRecoilModifierX != 0)
{
if( UsingNewCTHSystem() == true )
{
@@ -5063,9 +5098,8 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject )
}
}
GetFlatRecoilModifier( gpItemDescObject, &bDummy, &bRecoilModifier );
///////////////////// VERTICAL RECOIL MODIFIER
if (bRecoilModifier != 0 )
if (bRecoilModifierY != 0 )
{
if( UsingNewCTHSystem() == true )
{
@@ -7450,21 +7484,28 @@ void DrawWeaponValues( OBJECTTYPE * gpItemDescObject )
// Set line to draw into
ubNumLine = 20;
INT8 iFinalRecoilX = 0;
INT8 iFinalRecoilY = 0;
FLOAT iFinalRecoilX = 0;
FLOAT iFinalRecoilY = 0;
// Get final Recoil
GetRecoil( gpItemDescSoldier, gpItemDescObject, &iFinalRecoilX, &iFinalRecoilY, 3 );
// Get base Recoil
INT8 iRecoilX = Weapon[ gpItemDescObject->usItem ].bRecoilX;
INT8 iRecoilY = Weapon[ gpItemDescObject->usItem ].bRecoilY;
FLOAT iRecoilX = Weapon[ gpItemDescObject->usItem ].bRecoilX;
FLOAT iRecoilY = Weapon[ gpItemDescObject->usItem ].bRecoilY;
if (iRecoilX == -127) { iRecoilX = 0; } // -127 means "invalid". These guns don't actually have any recoil parameters.
if (iRecoilY == -127) { iRecoilY = 0; }
FLOAT dBaseRecoil = sqrt((FLOAT)((iRecoilX * iRecoilX)+(iRecoilY * iRecoilY)));
FLOAT dFinalRecoil = sqrt((FLOAT)((iFinalRecoilX * iFinalRecoilX) + (iFinalRecoilY * iFinalRecoilY)));
// modify by ini values
if ( Item[ gpItemDescObject->usItem ].usItemClass == IC_GUN )
{
iRecoilX *= gItemSettings.fRecoilXModifierGun[ Weapon[ gpItemDescObject->usItem ].ubWeaponType ];
iRecoilY *= gItemSettings.fRecoilYModifierGun[ Weapon[ gpItemDescObject->usItem ].ubWeaponType ];
}
FLOAT dBaseRecoil = sqrt( ((iRecoilX * iRecoilX)+(iRecoilY * iRecoilY)) );
FLOAT dFinalRecoil = sqrt( ((iFinalRecoilX * iFinalRecoilX) + (iFinalRecoilY * iFinalRecoilY)) );
FLOAT dRecoilModifier = dFinalRecoil - dBaseRecoil;
// Set Y coordinates
@@ -9130,8 +9171,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
INT16 iModifier[3];
FLOAT iFloatModifier[3];
INT8 bDummyValue;
INT8 bRecoilModifier;
FLOAT bRecoilModifierX;
FLOAT bRecoilModifierY;
///////////////////// INDEX
swprintf( pStr, gzItemDescGenIndexes[0] );
@@ -9851,7 +9892,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
}
///////////////////// RANGE MODIFIER
iModifier[0] = GetRangeBonus( gpItemDescObject );
iModifier[0] = GetRangeBonus( gpItemDescObject ) / CELL_X_SIZE;
iModifier[1] = iModifier[0];
iModifier[2] = iModifier[0];
if (iModifier[0] != 0 )
@@ -9873,26 +9914,14 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
if (iModifier[cnt2] > 0)
{
SetFontForeground( ITEMDESC_FONTPOSITIVE );
swprintf( pStr, L"%d", iModifier[cnt2] );
wcscat( pStr, L"%" );
swprintf( pStr, L"+%d", iModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
#ifdef CHINESE
wcscat( pStr, ChineseSpecString1 );
#else
wcscat( pStr, L"%" );
#endif
}
else if (iModifier[cnt2] < 0)
{
SetFontForeground( ITEMDESC_FONTNEGATIVE );
swprintf( pStr, L"%d", iModifier[cnt2] );
wcscat( pStr, L"%" );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
#ifdef CHINESE
wcscat( pStr, ChineseSpecString1 );
#else
wcscat( pStr, L"%" );
#endif
}
else
{
@@ -9988,12 +10017,12 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
cnt++;
}
///////////////////// LATERAL RECOIL MODIFIER
GetFlatRecoilModifier( gpItemDescObject, &bRecoilModifier, &bDummyValue );
iModifier[0] = bRecoilModifier;
iModifier[1] = bRecoilModifier;
iModifier[2] = bRecoilModifier;
if (iModifier[0] != 0 && UsingNewCTHSystem() == true )
///////////////////// PERCENT RECOIL MODIFIER
iModifier[0] = GetPercentRecoilModifier( gpItemDescObject );
iModifier[1] = iModifier[0];
iModifier[2] = iModifier[0];
if ( iModifier[0] != 0 && UsingNewCTHSystem() == true )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
@@ -10011,12 +10040,67 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
{
SetFontForeground( ITEMDESC_FONTNEGATIVE );
swprintf( pStr, L"+%d", iModifier[cnt2] );
wcscat( pStr, L"%" );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
#ifdef CHINESE
wcscat( pStr, ChineseSpecString1 );
#else
wcscat( pStr, L"%" );
#endif
}
else if (iModifier[cnt2] < 0)
{
SetFontForeground( ITEMDESC_FONTPOSITIVE );
swprintf( pStr, L"%d", iModifier[cnt2] );
wcscat( pStr, L"%" );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
#ifdef CHINESE
wcscat( pStr, ChineseSpecString1 );
#else
wcscat( pStr, L"%" );
#endif
}
else
{
swprintf( pStr, L"--" );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
mprintf( usX, usY, pStr );
}
}
cnt++;
}
GetFlatRecoilModifier( gpItemDescObject, &bRecoilModifierX, &bRecoilModifierY );
///////////////////// LATERAL RECOIL MODIFIER
iFloatModifier[0] = bRecoilModifierX;
iFloatModifier[1] = bRecoilModifierX;
iFloatModifier[2] = bRecoilModifierX;
if (iFloatModifier[0] != 0 && UsingNewCTHSystem() == true )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
// Set Y coordinates
sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop;
sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop;
// Print Values
for (UINT8 cnt2 = 0; cnt2 < 3; cnt2++)
{
SetFontForeground( 5 );
sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft;
sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
if (iFloatModifier[cnt2] > 0)
{
SetFontForeground( ITEMDESC_FONTNEGATIVE );
swprintf( pStr, L"+%3.1f", iFloatModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
else if (iFloatModifier[cnt2] < 0)
{
SetFontForeground( ITEMDESC_FONTPOSITIVE );
swprintf( pStr, L"%3.1f", iFloatModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
else
@@ -10031,11 +10115,11 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
}
///////////////////// VERTICAL RECOIL MODIFIER
GetFlatRecoilModifier( gpItemDescObject, &bDummyValue, &bRecoilModifier );
iModifier[0] = bRecoilModifier;
iModifier[1] = bRecoilModifier;
iModifier[2] = bRecoilModifier;
if (iModifier[0] != 0 && UsingNewCTHSystem() == true )
iFloatModifier[0] = bRecoilModifierY;
iFloatModifier[1] = bRecoilModifierY;
iFloatModifier[2] = bRecoilModifierY;
if (iFloatModifier[0] != 0 && UsingNewCTHSystem() == true )
{
if (cnt >= sFirstLine && cnt < sLastLine)
{
@@ -10049,16 +10133,16 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject )
SetFontForeground( 5 );
sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft;
sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft;
if (iModifier[cnt2] > 0)
if (iFloatModifier[cnt2] > 0)
{
SetFontForeground( ITEMDESC_FONTNEGATIVE );
swprintf( pStr, L"+%d", iModifier[cnt2] );
swprintf( pStr, L"+%3.1f", iFloatModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
else if (iModifier[cnt2] < 0)
else if (iFloatModifier[cnt2] < 0)
{
SetFontForeground( ITEMDESC_FONTPOSITIVE );
swprintf( pStr, L"%d", iModifier[cnt2] );
swprintf( pStr, L"%3.1f", iFloatModifier[cnt2] );
FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY);
}
else
+2 -2
View File
@@ -1099,8 +1099,8 @@ typedef struct
INT16 aimlevelsmodifier[3];
// HEADROCK HAM 4: New modifiers that do not require a stance array, since they affect the gun objectively, not
// subjectively.
INT16 RecoilModifierX;
INT16 RecoilModifierY;
FLOAT RecoilModifierX;
FLOAT RecoilModifierY;
INT16 PercentRecoilModifier;
INT16 percentaccuracymodifier;
FLOAT scopemagfactor;
+40 -22
View File
@@ -9832,6 +9832,15 @@ INT16 BonusReduceMore( INT16 bonus, INT16 status, INT16 statusCutoff = 100 )
return bonus;
}
// Scale bonus with item status. Status < 50% creates a penalty!
FLOAT BonusReduceMoreFloat( FLOAT bonus, INT16 status, INT16 statusCutoff = 100 )
{
if ( bonus > 0 && status < statusCutoff && statusCutoff > 0 && statusCutoff <= 100 )
return ( ( ( (FLOAT)status * 100.0f ) / (FLOAT)statusCutoff - 50.0f ) * bonus ) / 50.0f;
else // A penalty can't be reduced by status!
return bonus;
}
// Some items either work or they don't...
INT16 BonusOnOff( INT16 bonus, INT16 status )
{
@@ -10452,7 +10461,7 @@ INT16 GetBurstToHitBonus( OBJECTTYPE * pObj, BOOLEAN fProneStance )
return( bonus );
}
void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBullet )
void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, FLOAT *bRecoilX, FLOAT *bRecoilY, UINT8 ubNumBullet )
{
*bRecoilX = 0;
*bRecoilY = 0;
@@ -10476,6 +10485,12 @@ void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *b
*bRecoilX = Weapon[pObjUsed->usItem].bRecoilX;
*bRecoilY = Weapon[pObjUsed->usItem].bRecoilY;
// modify by ini values
if ( Item[ pObj->usItem ].usItemClass == IC_GUN )
{
*bRecoilX *= gItemSettings.fRecoilXModifierGun[ Weapon[ pObj->usItem ].ubWeaponType ];
*bRecoilY *= gItemSettings.fRecoilYModifierGun[ Weapon[ pObj->usItem ].ubWeaponType ];
}
// Apply a percentage-based modifier. This can increase or decrease BOTH axes. At most, it can eliminate
// recoil on the gun.
@@ -10483,19 +10498,22 @@ void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *b
INT16 sPercentRecoilModifier = __max(-100, (GetBasePercentRecoilModifier( pObjUsed ) + GetAttachmentPercentRecoilModifier( pObjUsedInHand ) ));
*bRecoilX += (*bRecoilX * sPercentRecoilModifier ) / 100;
*bRecoilY += (*bRecoilY * sPercentRecoilModifier ) / 100;
*bRecoilX *= ( (FLOAT)( 100 + sPercentRecoilModifier ) / 100 );
*bRecoilY *= ( (FLOAT)( 100 + sPercentRecoilModifier ) / 100 );
// Apply a flat modifier. This acts on either axis, and if powerful enough can "reverse polarity" of either
// axis recoil. For instance, it can make a gun that normally pulls LEFT start pulling RIGHT instead.
INT8 bRecoilAdjustX = 0;
INT8 bRecoilAdjustY = 0;
FLOAT bRecoilAdjustX = 0;
FLOAT bRecoilAdjustY = 0;
//GetFlatRecoilModifier( pObj, &bRecoilAdjustX, &bRecoilAdjustY );
GetBaseFlatRecoilModifier( pObj, &bRecoilAdjustX, &bRecoilAdjustY );
GetAttachmentFlatRecoilModifier( &pSoldier->inv[HANDPOS], &bRecoilAdjustX, &bRecoilAdjustY);
//JMich TODO: Currently no check for dual wielding
// silversurfer: I don't think that we need a check for dual wielding here. This function is supposed to return weapon recoil value.
// It doesn't matter if this gun is wielded by someone else, with right, left hand or with the toes. The gun always produces the same recoil.
// Controlling recoil when firing two guns is more difficult but this should be checked outside this function.
*bRecoilX = __max(0, *bRecoilX + bRecoilAdjustX);
*bRecoilY = __max(0, *bRecoilY + bRecoilAdjustY);
@@ -10507,15 +10525,15 @@ void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *b
// HEADROCK HAM 4: This function calculates the flat recoil adjustment for a gun. Flat adjustment increases
// or decreases recoil by a specific number of points in either the vertical or horizontal axes (or both).
// It can potentially cause a weapon it reverse its recoil direction.
void GetBaseFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY )
void GetBaseFlatRecoilModifier( OBJECTTYPE *pObj, FLOAT *bRecoilModifierX, FLOAT *bRecoilModifierY )
{
INT8 bRecoilAdjustX = 0;
INT8 bRecoilAdjustY = 0;
FLOAT bRecoilAdjustX = 0;
FLOAT bRecoilAdjustY = 0;
if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
// Inherent item modifiers
bRecoilAdjustX += BonusReduceMore( Item[pObj->usItem].RecoilModifierX, (*pObj)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMore( Item[pObj->usItem].RecoilModifierY, (*pObj)[0]->data.objectStatus );
bRecoilAdjustX += BonusReduceMoreFloat( Item[pObj->usItem].RecoilModifierX, (*pObj)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMoreFloat( Item[pObj->usItem].RecoilModifierY, (*pObj)[0]->data.objectStatus );
// Ammo item modifiers
bRecoilAdjustX += Item[(*pObj)[0]->data.gun.usGunAmmoItem].RecoilModifierX;
@@ -10525,10 +10543,10 @@ void GetBaseFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *
*bRecoilModifierX = bRecoilAdjustX;
*bRecoilModifierY = bRecoilAdjustY;
}
void GetAttachmentFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY )
void GetAttachmentFlatRecoilModifier( OBJECTTYPE *pObj, FLOAT *bRecoilModifierX, FLOAT *bRecoilModifierY )
{
INT8 bRecoilAdjustX = 0;
INT8 bRecoilAdjustY = 0;
FLOAT bRecoilAdjustX = 0;
FLOAT bRecoilAdjustY = 0;
if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
// Attachment item modifiers
@@ -10536,8 +10554,8 @@ void GetAttachmentFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX,
{
if (iter->exists())
{
bRecoilAdjustX += BonusReduceMore( Item[iter->usItem].RecoilModifierX, (*iter)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMore( Item[iter->usItem].RecoilModifierY, (*iter)[0]->data.objectStatus );
bRecoilAdjustX += BonusReduceMoreFloat( Item[iter->usItem].RecoilModifierX, (*iter)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMoreFloat( Item[iter->usItem].RecoilModifierY, (*iter)[0]->data.objectStatus );
}
}
}
@@ -10545,17 +10563,17 @@ void GetAttachmentFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX,
*bRecoilModifierX += bRecoilAdjustX;
*bRecoilModifierY += bRecoilAdjustY;
}
void GetFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY )
void GetFlatRecoilModifier( OBJECTTYPE *pObj, FLOAT *bRecoilModifierX, FLOAT *bRecoilModifierY )
{
INT8 bRecoilAdjustX = 0;
INT8 bRecoilAdjustY = 0;
FLOAT bRecoilAdjustX = 0;
FLOAT bRecoilAdjustY = 0;
if (pObj->exists() == true && UsingNewCTHSystem() == true)
{
// Inherent item modifiers
bRecoilAdjustX += BonusReduceMore( Item[pObj->usItem].RecoilModifierX, (*pObj)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMore( Item[pObj->usItem].RecoilModifierY, (*pObj)[0]->data.objectStatus );
bRecoilAdjustX += BonusReduceMoreFloat( Item[pObj->usItem].RecoilModifierX, (*pObj)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMoreFloat( Item[pObj->usItem].RecoilModifierY, (*pObj)[0]->data.objectStatus );
// Ammo item modifiers
bRecoilAdjustX += Item[(*pObj)[0]->data.gun.usGunAmmoItem].RecoilModifierX;
@@ -10566,8 +10584,8 @@ void GetFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRec
{
if (iter->exists())
{
bRecoilAdjustX += BonusReduceMore( Item[iter->usItem].RecoilModifierX, (*iter)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMore( Item[iter->usItem].RecoilModifierY, (*iter)[0]->data.objectStatus );
bRecoilAdjustX += BonusReduceMoreFloat( Item[iter->usItem].RecoilModifierX, (*iter)[0]->data.objectStatus );
bRecoilAdjustY += BonusReduceMoreFloat( Item[iter->usItem].RecoilModifierY, (*iter)[0]->data.objectStatus );
}
}
}
+4 -4
View File
@@ -306,10 +306,10 @@ BOOLEAN HasFastBurst( OBJECTTYPE * pObj );
INT16 GetMagSizeBonus( OBJECTTYPE * pObj, UINT8 subObject = 0 );
// HEADROCK HAM 4: This function now calculates and returns the weapon's recoil as X/Y offsets.
void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 *bRecoilX, INT8 *bRecoilY, UINT8 ubNumBullet );
void GetBaseFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY);
void GetAttachmentFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY);
void GetFlatRecoilModifier( OBJECTTYPE *pObj, INT8 *bRecoilModifierX, INT8 *bRecoilModifierY );
void GetRecoil( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, FLOAT *bRecoilX, FLOAT *bRecoilY, UINT8 ubNumBullet );
void GetBaseFlatRecoilModifier( OBJECTTYPE *pObj, FLOAT *bRecoilModifierX, FLOAT *bRecoilModifierY);
void GetAttachmentFlatRecoilModifier( OBJECTTYPE *pObj, FLOAT *bRecoilModifierX, FLOAT *bRecoilModifierY);
void GetFlatRecoilModifier( OBJECTTYPE *pObj, FLOAT *bRecoilModifierX, FLOAT *bRecoilModifierY );
INT16 GetBasePercentRecoilModifier( OBJECTTYPE *pObj );
INT16 GetAttachmentPercentRecoilModifier( OBJECTTYPE *pObj);
INT16 GetPercentRecoilModifier( OBJECTTYPE *pObj );
+7 -7
View File
@@ -8831,8 +8831,8 @@ void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMu
// We can also anticipate the recoil of the weapon, which we should set here.
INT8 bGunRecoilX;
INT8 bGunRecoilY;
FLOAT bGunRecoilX;
FLOAT bGunRecoilY;
// Get the gun's recoil values for our first bullet.
// silversurfer: The first bullet will never be affected by recoil so ask for number 2 instead.
@@ -8936,8 +8936,8 @@ void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMu
// The basic ideal is CF = -Recoil. If we can achieve this, then our muzzle will be completely stationary
// after the first bullet is fired, allowing us to adjust CF as we please during the following CF check.
FLOAT dIdealCounterForceX = (FLOAT)-bGunRecoilX;
FLOAT dIdealCounterForceY = (FLOAT)-bGunRecoilY;
FLOAT dIdealCounterForceX = -bGunRecoilX;
FLOAT dIdealCounterForceY = -bGunRecoilY;
// But we also want the volley to be moving at least somewhat toward the target. Therefore, lets figure
// out where our muzzle is, and adjust in that direction by as much force as could be undone by the next
@@ -9034,8 +9034,8 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
// shooters might be overwhelmed and start firing towards the sky.
// Get X/Y recoil parameters from the gun.
INT8 bGunRecoilX;
INT8 bGunRecoilY;
FLOAT bGunRecoilX;
FLOAT bGunRecoilY;
if( fSecondHandBurst )
GetRecoil( pShooter, pWeapon, &bGunRecoilX, &bGunRecoilY, (pShooter->bDoBurst/2) );
@@ -9227,7 +9227,7 @@ void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuz
}
FLOAT CalcCounterForceChange( SOLDIERTYPE * pShooter, UINT32 uiCounterForceAccuracy, FLOAT dCounterForceMax, FLOAT dMuzzleOffset, INT8 bRecoil, FLOAT dPrevCounterForce, UINT32 uiIntendedBullets )
FLOAT CalcCounterForceChange( SOLDIERTYPE * pShooter, UINT32 uiCounterForceAccuracy, FLOAT dCounterForceMax, FLOAT dMuzzleOffset, FLOAT bRecoil, FLOAT dPrevCounterForce, UINT32 uiIntendedBullets )
{
/////////////////////////////////////////////////////////////////////////////////////////
// HEADROCK HAM 5: New Counter-Force Calculation
+1 -1
View File
@@ -241,7 +241,7 @@ UINT32 CalcCounterForceAccuracy(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, UINT
void CalcPreRecoilOffset( SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzleOffsetY, UINT32 uiRange );
void CalcRecoilOffset( SOLDIERTYPE *pShooter, FLOAT *dMuzzleOffsetX, FLOAT *dMuzzleOffsetY, OBJECTTYPE *pWeapon, UINT32 uiRange );
// HEADROCK HAM 5: New function, completely replaces the Counter Force Frequency check.
FLOAT CalcCounterForceChange( SOLDIERTYPE * pShooter, UINT32 uiCounterForceAccuracy, FLOAT dCounterForceMax, FLOAT dMuzzleOffset, INT8 bRecoil, FLOAT dPrevCounterForce, UINT32 uiIntendedBullets );
FLOAT CalcCounterForceChange( SOLDIERTYPE * pShooter, UINT32 uiCounterForceAccuracy, FLOAT dCounterForceMax, FLOAT dMuzzleOffset, FLOAT bRecoil, FLOAT dPrevCounterForce, UINT32 uiIntendedBullets );
// HEADROCK HAM 4: Required for shooting mechanic
extern INT8 EffectiveMarksmanship( SOLDIERTYPE * pSoldier );
+2 -2
View File
@@ -687,12 +687,12 @@ weaponEndElementHandle(void *userData, const XML_Char *name)
else if(strcmp(name, "bRecoilX") == 0)
{
pData->curElement = WEAPON_ELEMENT_WEAPON;
pData->curWeapon.bRecoilX = (INT8) atol(pData->szCharData);
pData->curWeapon.bRecoilX = (FLOAT) atof(pData->szCharData);
}
else if(strcmp(name, "bRecoilY") == 0)
{
pData->curElement = WEAPON_ELEMENT_WEAPON;
pData->curWeapon.bRecoilY = (INT8) atol(pData->szCharData);
pData->curWeapon.bRecoilY = (FLOAT) atof(pData->szCharData);
}
else if(strcmp(name, "ubRecoilDelay") == 0)
{
+2 -2
View File
@@ -379,8 +379,8 @@ typedef struct
UINT16 ManualReloadSound;
BOOLEAN EasyUnjam; // Guns where each bullet has its own chamber (like revolvers) are easyer to unjam
INT8 bRecoilX; // HEADROCK HAM 4: Recoil now measured in points of muzzle deviation X and Y.
INT8 bRecoilY; // Positive values indicated upwards (Y) and rightwards (X). Negatives are down (-Y) and left (-X).
FLOAT bRecoilX; // HEADROCK HAM 4: Recoil now measured in points of muzzle deviation X and Y.
FLOAT bRecoilY; // Positive values indicated upwards (Y) and rightwards (X). Negatives are down (-Y) and left (-X).
// Note that each value is an array. Each item in the array determines recoil
// for a different bullet in the sequence. Not all values have to be filled,
// but the last filled value will determine the recoil for longer volleys.