mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
If DELAYED_GRENADE_EXPLOSION = TRUE in JA2_Options.ini, toggling fire modes on a grenade launcher toggles whether the grenades explode on impact or with a 1-turn delay.
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8653 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -2350,6 +2350,7 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
||||
numBytesRead = ReadFieldByField( hFile, &this->sDiseaseFlag, sizeof(sDiseaseFlag), sizeof(UINT8), numBytesRead );
|
||||
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof( ubFiller ), sizeof( UINT8 ), numBytesRead );
|
||||
numBytesRead = ReadFieldByField( hFile, &this->ubFiller1, sizeof( ubFiller1 ), sizeof( UINT8 ), numBytesRead );
|
||||
numBytesRead = ReadFieldByField( hFile, &this->usGLDelayMode, sizeof( usGLDelayMode ), sizeof( UINT8 ), numBytesRead );
|
||||
numBytesRead = ReadFieldByField( hFile, &this->usBarrelMode, sizeof( usBarrelMode ), sizeof( UINT8 ), numBytesRead );
|
||||
numBytesRead = ReadFieldByField( hFile, &this->usBarrelCounter, sizeof( usBarrelCounter ), sizeof( UINT8 ), numBytesRead );
|
||||
numBytesRead = ReadFieldByField( hFile, &this->sFocusGridNo, sizeof(sFocusGridNo), sizeof(INT32), numBytesRead );
|
||||
@@ -2370,6 +2371,7 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
||||
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof(ubFiller), sizeof(UINT8), numBytesRead );
|
||||
|
||||
buffer += sizeof( ubFiller1 );
|
||||
buffer += sizeof( usGLDelayMode );
|
||||
buffer += sizeof( usBarrelMode );
|
||||
buffer += sizeof( usBarrelCounter );
|
||||
while ( ( buffer % 4 ) > 0 ) ++buffer;
|
||||
@@ -2417,6 +2419,7 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
||||
buffer++;
|
||||
|
||||
buffer += sizeof( ubFiller1 );
|
||||
buffer += sizeof( usGLDelayMode );
|
||||
buffer += sizeof( usBarrelMode );
|
||||
buffer += sizeof( usBarrelCounter );
|
||||
while ( ( buffer % 4 ) > 0 ) ++buffer;
|
||||
|
||||
@@ -4246,6 +4246,13 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec
|
||||
SetFontForeground( FONT_ORANGE );
|
||||
}
|
||||
|
||||
if ( ( ( pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO ) ||
|
||||
( Item[pSoldier->inv[HANDPOS].usItem].usItemClass & IC_LAUNCHER && !Item[pSoldier->inv[HANDPOS].usItem].rocketlauncher ) ) &&
|
||||
pSoldier->usGLDelayMode )
|
||||
{
|
||||
wcscat( pStr, New113Message[MSG113_FIREMODE_GL_DELAYED] );
|
||||
}
|
||||
|
||||
// Flugente: display barrel mode if necessary
|
||||
if ( pSoldier->usBarrelMode > 1 )
|
||||
swprintf( pStr2, L"%s x%d", pStr, pSoldier->usBarrelMode );
|
||||
|
||||
@@ -1550,9 +1550,10 @@ public:
|
||||
// Flugente: Decrease this filler by 1 for each new UINT8 / BOOLEAN variable, so we can maintain savegame compatibility!!
|
||||
// Note that we also have to account for padding, so you might need to substract more than just the size of the new variables
|
||||
UINT8 ubFiller[12];
|
||||
UINT8 ubFiller1[2];
|
||||
|
||||
// Flugente: keep track of data for multi-barrel guns
|
||||
UINT8 ubFiller1;
|
||||
|
||||
// Flugente: modifiers to fire modes
|
||||
UINT8 usGLDelayMode; // if > 0, delay GL grenade explosions
|
||||
UINT8 usBarrelMode; // states how many barrels we are currently using as modifier for our fire mode
|
||||
UINT8 usBarrelCounter; // states which barrel we are currently firing from (used during the firing process)
|
||||
|
||||
|
||||
+40
-22
@@ -4503,6 +4503,12 @@ BOOLEAN UseLauncher( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
|
||||
|
||||
CalculateLaunchItemParamsForThrow( pSoldier, sTargetGridNo, pSoldier->bTargetLevel, 0, &Launchable, uiHitChance, THROW_ARM_ITEM, 0, usItemNum );
|
||||
|
||||
// Flugente: depending on fire mode, delay explosion
|
||||
if ( pSoldier->usGLDelayMode )
|
||||
{
|
||||
( *pSoldier->pTempObject )[0]->data.sObjectFlag |= DELAYED_GRENADE_EXPLOSION;
|
||||
}
|
||||
|
||||
iID = CreatePhysicalObject( pSoldier->pTempObject, pSoldier->pThrowParams->dLifeSpan, pSoldier->pThrowParams->dX, pSoldier->pThrowParams->dY, pSoldier->pThrowParams->dZ, pSoldier->pThrowParams->dForceX, pSoldier->pThrowParams->dForceY, pSoldier->pThrowParams->dForceZ, pSoldier->ubID, pSoldier->pThrowParams->ubActionCode, pSoldier->pThrowParams->uiActionData, FALSE );
|
||||
|
||||
// OJW - 20091002 - Explosives
|
||||
@@ -9619,44 +9625,56 @@ void ChangeWeaponMode( SOLDIERTYPE * pSoldier )
|
||||
return;
|
||||
}
|
||||
|
||||
// Flugente: if there is a higher barrel configuration, use that
|
||||
// otherwise, go back to one barrel and try next mode
|
||||
pSoldier->usBarrelMode = max( 1, pSoldier->usBarrelMode );
|
||||
UINT8 nextbarrelmode = GetNextBarrelMode( pSoldier->inv[HANDPOS].usItem, pSoldier->usBarrelMode );
|
||||
if ( nextbarrelmode > pSoldier->usBarrelMode )
|
||||
// Flugente: if we are in a GL fire mode, switch between impact/delayed mode
|
||||
if ( ( ( pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO) ||
|
||||
( Item[pSoldier->inv[HANDPOS].usItem].usItemClass & IC_LAUNCHER && !Item[pSoldier->inv[HANDPOS].usItem].rocketlauncher) ) &&
|
||||
!pSoldier->usGLDelayMode )
|
||||
{
|
||||
pSoldier->usBarrelMode = nextbarrelmode;
|
||||
pSoldier->usGLDelayMode = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// start again with the first barrel configuration
|
||||
pSoldier->usBarrelMode = nextbarrelmode;
|
||||
pSoldier->usGLDelayMode = 0;
|
||||
|
||||
do
|
||||
// Flugente: if there is a higher barrel configuration, use that
|
||||
// otherwise, go back to one barrel and try next mode
|
||||
pSoldier->usBarrelMode = max( 1, pSoldier->usBarrelMode );
|
||||
UINT8 nextbarrelmode = GetNextBarrelMode( pSoldier->inv[HANDPOS].usItem, pSoldier->usBarrelMode );
|
||||
if ( nextbarrelmode > pSoldier->usBarrelMode )
|
||||
{
|
||||
pSoldier->bWeaponMode++;
|
||||
pSoldier->usBarrelMode = nextbarrelmode;
|
||||
}
|
||||
else
|
||||
{
|
||||
// start again with the first barrel configuration
|
||||
pSoldier->usBarrelMode = nextbarrelmode;
|
||||
|
||||
if ( pSoldier->bWeaponMode == NUM_WEAPON_MODES )
|
||||
do
|
||||
{
|
||||
if ( Weapon[pSoldier->inv[HANDPOS].usItem].NoSemiAuto )
|
||||
pSoldier->bWeaponMode = WM_AUTOFIRE;
|
||||
else
|
||||
pSoldier->bWeaponMode = WM_NORMAL;
|
||||
pSoldier->bWeaponMode++;
|
||||
|
||||
if ( HasAttachmentOfClass( &( pSoldier->inv[HANDPOS] ), AC_RIFLEGRENADE ) )
|
||||
if ( pSoldier->bWeaponMode == NUM_WEAPON_MODES )
|
||||
{
|
||||
OBJECTTYPE* pRifleGrenadeDeviceObj = FindAttachment_GrenadeLauncher( &( pSoldier->inv[HANDPOS] ) );
|
||||
if ( Weapon[pSoldier->inv[HANDPOS].usItem].NoSemiAuto )
|
||||
pSoldier->bWeaponMode = WM_AUTOFIRE;
|
||||
else
|
||||
pSoldier->bWeaponMode = WM_NORMAL;
|
||||
|
||||
if ( pRifleGrenadeDeviceObj && FindLaunchableAttachment( &( pSoldier->inv[HANDPOS] ), pRifleGrenadeDeviceObj->usItem ) )
|
||||
if ( HasAttachmentOfClass( &( pSoldier->inv[HANDPOS] ), AC_RIFLEGRENADE ) )
|
||||
{
|
||||
pSoldier->bWeaponMode = WM_ATTACHED_GL;
|
||||
OBJECTTYPE* pRifleGrenadeDeviceObj = FindAttachment_GrenadeLauncher( &( pSoldier->inv[HANDPOS] ) );
|
||||
|
||||
if ( pRifleGrenadeDeviceObj && FindLaunchableAttachment( &( pSoldier->inv[HANDPOS] ), pRifleGrenadeDeviceObj->usItem ) )
|
||||
{
|
||||
pSoldier->bWeaponMode = WM_ATTACHED_GL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Changed by ADB, rev 1513
|
||||
//while(IsGunWeaponModeCapable( pSoldier, HANDPOS, pSoldier->bWeaponMode ) == FALSE && pSoldier->bWeaponMode != WM_NORMAL);
|
||||
while ( IsGunWeaponModeCapable( &pSoldier->inv[HANDPOS], static_cast<WeaponMode>( pSoldier->bWeaponMode ), pSoldier ) == FALSE && pSoldier->bWeaponMode != WM_NORMAL );
|
||||
}
|
||||
// Changed by ADB, rev 1513
|
||||
//while(IsGunWeaponModeCapable( pSoldier, HANDPOS, pSoldier->bWeaponMode ) == FALSE && pSoldier->bWeaponMode != WM_NORMAL);
|
||||
while ( IsGunWeaponModeCapable( &pSoldier->inv[HANDPOS], static_cast<WeaponMode>( pSoldier->bWeaponMode ), pSoldier ) == FALSE && pSoldier->bWeaponMode != WM_NORMAL );
|
||||
}
|
||||
|
||||
if (pSoldier->bWeaponMode == WM_AUTOFIRE || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO)
|
||||
|
||||
+11
-10
@@ -2596,17 +2596,18 @@ void HandleArmedObjectImpact( REAL_OBJECT *pObject )
|
||||
}
|
||||
else
|
||||
{
|
||||
// Flugente: explosions on the roof do work...
|
||||
// If we landed on anything other than the floor, always! go off...
|
||||
if ( pObject->fInWater ||
|
||||
!fCanDelayExplosion ||
|
||||
fGoodStatus && !gGameExternalOptions.fDelayedGrenadeExplosion && !fDelayedExplosion )
|
||||
{
|
||||
fDoImpact = TRUE;
|
||||
fIsDud = false;
|
||||
}
|
||||
else // didn't go off!
|
||||
fDoImpact = TRUE;
|
||||
fIsDud = false;
|
||||
|
||||
// Flugente: explosion does not happen instantly if grenade
|
||||
// is not in water and
|
||||
// either has a bad status or is a delayed grenade
|
||||
if ( !pObject->fInWater &&
|
||||
( !fGoodStatus ||
|
||||
( fCanDelayExplosion && gGameExternalOptions.fDelayedGrenadeExplosion && fDelayedExplosion) ) )
|
||||
{
|
||||
// didn't go off!
|
||||
fDoImpact = FALSE;
|
||||
fIsDud = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2534,6 +2534,7 @@ enum
|
||||
MSG113_BINOCULAR,
|
||||
MSG113_PATIENCE,
|
||||
MSG113_SHIELD_DESTROYED,
|
||||
MSG113_FIREMODE_GL_DELAYED,
|
||||
|
||||
TEXT_NUM_MSG113,
|
||||
};
|
||||
|
||||
@@ -7454,6 +7454,7 @@ STR16 New113Message[] =
|
||||
L"望远镜",
|
||||
L"耐心",
|
||||
L"%s 的防护盾毁坏了!", //L"%s's shield has been destroyed!",
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
STR16 New113HAMMessage[] =
|
||||
|
||||
@@ -7466,6 +7466,7 @@ STR16 New113Message[] =
|
||||
L"a binocular",
|
||||
L"patience",
|
||||
L"%s's shield has been destroyed!", // TODO.Translate
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
// TODO.Translate
|
||||
|
||||
@@ -7454,6 +7454,7 @@ STR16 New113Message[] =
|
||||
L"a binocular",
|
||||
L"patience",
|
||||
L"%s's shield has been destroyed!",
|
||||
L" DELAY",
|
||||
};
|
||||
|
||||
STR16 New113HAMMessage[] =
|
||||
|
||||
@@ -7463,6 +7463,7 @@ STR16 New113Message[] =
|
||||
L"des jumelles",
|
||||
L"de la patience",
|
||||
L"%s's shield has been destroyed!", // TODO.Translate
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
STR16 New113HAMMessage[] =
|
||||
|
||||
@@ -7290,6 +7290,7 @@ STR16 New113Message[] =
|
||||
L"a binocular",
|
||||
L"patience",
|
||||
L"%s's shield has been destroyed!", // TODO.Translate
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
STR16 New113HAMMessage[] =
|
||||
|
||||
@@ -7457,6 +7457,7 @@ STR16 New113Message[] =
|
||||
L"a binocular",
|
||||
L"patience",
|
||||
L"%s's shield has been destroyed!", // TODO.Translate
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
// TODO.Translate
|
||||
|
||||
@@ -7466,6 +7466,7 @@ STR16 New113Message[] =
|
||||
L"a binocular",
|
||||
L"patience",
|
||||
L"%s's shield has been destroyed!", // TODO.Translate
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
STR16 New113HAMMessage[] =
|
||||
|
||||
@@ -7454,6 +7454,7 @@ STR16 New113Message[] =
|
||||
L"бинокль",
|
||||
L"терпение",
|
||||
L"%s's shield has been destroyed!", // TODO.Translate
|
||||
L" DELAY", // TODO.Translate
|
||||
};
|
||||
|
||||
STR16 New113HAMMessage[] =
|
||||
|
||||
Reference in New Issue
Block a user