mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
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:
+133
-49
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 );
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user