mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +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->sDiseaseFlag, sizeof(sDiseaseFlag), sizeof(UINT8), numBytesRead );
|
||||||
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof( ubFiller ), 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->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->usBarrelMode, sizeof( usBarrelMode ), sizeof( UINT8 ), numBytesRead );
|
||||||
numBytesRead = ReadFieldByField( hFile, &this->usBarrelCounter, sizeof( usBarrelCounter ), sizeof( UINT8 ), numBytesRead );
|
numBytesRead = ReadFieldByField( hFile, &this->usBarrelCounter, sizeof( usBarrelCounter ), sizeof( UINT8 ), numBytesRead );
|
||||||
numBytesRead = ReadFieldByField( hFile, &this->sFocusGridNo, sizeof(sFocusGridNo), sizeof(INT32), 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 );
|
numBytesRead = ReadFieldByField( hFile, &this->ubFiller, sizeof(ubFiller), sizeof(UINT8), numBytesRead );
|
||||||
|
|
||||||
buffer += sizeof( ubFiller1 );
|
buffer += sizeof( ubFiller1 );
|
||||||
|
buffer += sizeof( usGLDelayMode );
|
||||||
buffer += sizeof( usBarrelMode );
|
buffer += sizeof( usBarrelMode );
|
||||||
buffer += sizeof( usBarrelCounter );
|
buffer += sizeof( usBarrelCounter );
|
||||||
while ( ( buffer % 4 ) > 0 ) ++buffer;
|
while ( ( buffer % 4 ) > 0 ) ++buffer;
|
||||||
@@ -2417,6 +2419,7 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
|
|||||||
buffer++;
|
buffer++;
|
||||||
|
|
||||||
buffer += sizeof( ubFiller1 );
|
buffer += sizeof( ubFiller1 );
|
||||||
|
buffer += sizeof( usGLDelayMode );
|
||||||
buffer += sizeof( usBarrelMode );
|
buffer += sizeof( usBarrelMode );
|
||||||
buffer += sizeof( usBarrelCounter );
|
buffer += sizeof( usBarrelCounter );
|
||||||
while ( ( buffer % 4 ) > 0 ) ++buffer;
|
while ( ( buffer % 4 ) > 0 ) ++buffer;
|
||||||
|
|||||||
@@ -4246,6 +4246,13 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec
|
|||||||
SetFontForeground( FONT_ORANGE );
|
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
|
// Flugente: display barrel mode if necessary
|
||||||
if ( pSoldier->usBarrelMode > 1 )
|
if ( pSoldier->usBarrelMode > 1 )
|
||||||
swprintf( pStr2, L"%s x%d", pStr, pSoldier->usBarrelMode );
|
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!!
|
// 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
|
// 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 ubFiller[12];
|
||||||
UINT8 ubFiller1[2];
|
UINT8 ubFiller1;
|
||||||
|
|
||||||
// Flugente: keep track of data for multi-barrel guns
|
// 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 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)
|
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 );
|
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 );
|
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
|
// OJW - 20091002 - Explosives
|
||||||
@@ -9619,44 +9625,56 @@ void ChangeWeaponMode( SOLDIERTYPE * pSoldier )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flugente: if there is a higher barrel configuration, use that
|
// Flugente: if we are in a GL fire mode, switch between impact/delayed mode
|
||||||
// otherwise, go back to one barrel and try next mode
|
if ( ( ( pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO) ||
|
||||||
pSoldier->usBarrelMode = max( 1, pSoldier->usBarrelMode );
|
( Item[pSoldier->inv[HANDPOS].usItem].usItemClass & IC_LAUNCHER && !Item[pSoldier->inv[HANDPOS].usItem].rocketlauncher) ) &&
|
||||||
UINT8 nextbarrelmode = GetNextBarrelMode( pSoldier->inv[HANDPOS].usItem, pSoldier->usBarrelMode );
|
!pSoldier->usGLDelayMode )
|
||||||
if ( nextbarrelmode > pSoldier->usBarrelMode )
|
|
||||||
{
|
{
|
||||||
pSoldier->usBarrelMode = nextbarrelmode;
|
pSoldier->usGLDelayMode = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// start again with the first barrel configuration
|
pSoldier->usGLDelayMode = 0;
|
||||||
pSoldier->usBarrelMode = nextbarrelmode;
|
|
||||||
|
|
||||||
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++;
|
||||||
pSoldier->bWeaponMode = WM_AUTOFIRE;
|
|
||||||
else
|
|
||||||
pSoldier->bWeaponMode = WM_NORMAL;
|
|
||||||
|
|
||||||
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)
|
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
|
else
|
||||||
{
|
{
|
||||||
// Flugente: explosions on the roof do work...
|
fDoImpact = TRUE;
|
||||||
// If we landed on anything other than the floor, always! go off...
|
fIsDud = false;
|
||||||
if ( pObject->fInWater ||
|
|
||||||
!fCanDelayExplosion ||
|
// Flugente: explosion does not happen instantly if grenade
|
||||||
fGoodStatus && !gGameExternalOptions.fDelayedGrenadeExplosion && !fDelayedExplosion )
|
// is not in water and
|
||||||
{
|
// either has a bad status or is a delayed grenade
|
||||||
fDoImpact = TRUE;
|
if ( !pObject->fInWater &&
|
||||||
fIsDud = false;
|
( !fGoodStatus ||
|
||||||
}
|
( fCanDelayExplosion && gGameExternalOptions.fDelayedGrenadeExplosion && fDelayedExplosion) ) )
|
||||||
else // didn't go off!
|
|
||||||
{
|
{
|
||||||
|
// didn't go off!
|
||||||
|
fDoImpact = FALSE;
|
||||||
fIsDud = true;
|
fIsDud = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2534,6 +2534,7 @@ enum
|
|||||||
MSG113_BINOCULAR,
|
MSG113_BINOCULAR,
|
||||||
MSG113_PATIENCE,
|
MSG113_PATIENCE,
|
||||||
MSG113_SHIELD_DESTROYED,
|
MSG113_SHIELD_DESTROYED,
|
||||||
|
MSG113_FIREMODE_GL_DELAYED,
|
||||||
|
|
||||||
TEXT_NUM_MSG113,
|
TEXT_NUM_MSG113,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7454,6 +7454,7 @@ STR16 New113Message[] =
|
|||||||
L"望远镜",
|
L"望远镜",
|
||||||
L"耐心",
|
L"耐心",
|
||||||
L"%s 的防护盾毁坏了!", //L"%s's shield has been destroyed!",
|
L"%s 的防护盾毁坏了!", //L"%s's shield has been destroyed!",
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 New113HAMMessage[] =
|
STR16 New113HAMMessage[] =
|
||||||
|
|||||||
@@ -7466,6 +7466,7 @@ STR16 New113Message[] =
|
|||||||
L"a binocular",
|
L"a binocular",
|
||||||
L"patience",
|
L"patience",
|
||||||
L"%s's shield has been destroyed!", // TODO.Translate
|
L"%s's shield has been destroyed!", // TODO.Translate
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO.Translate
|
// TODO.Translate
|
||||||
|
|||||||
@@ -7454,6 +7454,7 @@ STR16 New113Message[] =
|
|||||||
L"a binocular",
|
L"a binocular",
|
||||||
L"patience",
|
L"patience",
|
||||||
L"%s's shield has been destroyed!",
|
L"%s's shield has been destroyed!",
|
||||||
|
L" DELAY",
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 New113HAMMessage[] =
|
STR16 New113HAMMessage[] =
|
||||||
|
|||||||
@@ -7463,6 +7463,7 @@ STR16 New113Message[] =
|
|||||||
L"des jumelles",
|
L"des jumelles",
|
||||||
L"de la patience",
|
L"de la patience",
|
||||||
L"%s's shield has been destroyed!", // TODO.Translate
|
L"%s's shield has been destroyed!", // TODO.Translate
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 New113HAMMessage[] =
|
STR16 New113HAMMessage[] =
|
||||||
|
|||||||
@@ -7290,6 +7290,7 @@ STR16 New113Message[] =
|
|||||||
L"a binocular",
|
L"a binocular",
|
||||||
L"patience",
|
L"patience",
|
||||||
L"%s's shield has been destroyed!", // TODO.Translate
|
L"%s's shield has been destroyed!", // TODO.Translate
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 New113HAMMessage[] =
|
STR16 New113HAMMessage[] =
|
||||||
|
|||||||
@@ -7457,6 +7457,7 @@ STR16 New113Message[] =
|
|||||||
L"a binocular",
|
L"a binocular",
|
||||||
L"patience",
|
L"patience",
|
||||||
L"%s's shield has been destroyed!", // TODO.Translate
|
L"%s's shield has been destroyed!", // TODO.Translate
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO.Translate
|
// TODO.Translate
|
||||||
|
|||||||
@@ -7466,6 +7466,7 @@ STR16 New113Message[] =
|
|||||||
L"a binocular",
|
L"a binocular",
|
||||||
L"patience",
|
L"patience",
|
||||||
L"%s's shield has been destroyed!", // TODO.Translate
|
L"%s's shield has been destroyed!", // TODO.Translate
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 New113HAMMessage[] =
|
STR16 New113HAMMessage[] =
|
||||||
|
|||||||
@@ -7454,6 +7454,7 @@ STR16 New113Message[] =
|
|||||||
L"бинокль",
|
L"бинокль",
|
||||||
L"терпение",
|
L"терпение",
|
||||||
L"%s's shield has been destroyed!", // TODO.Translate
|
L"%s's shield has been destroyed!", // TODO.Translate
|
||||||
|
L" DELAY", // TODO.Translate
|
||||||
};
|
};
|
||||||
|
|
||||||
STR16 New113HAMMessage[] =
|
STR16 New113HAMMessage[] =
|
||||||
|
|||||||
Reference in New Issue
Block a user