Only destroy the content of a container when it is destroyed, not when it is damaged

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9084 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2021-06-14 21:15:31 +00:00
parent 433a41f03b
commit fc6973d022
4 changed files with 35 additions and 30 deletions
+22 -19
View File
@@ -650,7 +650,9 @@ void HandleFencePartnerCheck( INT32 sStructGridNo )
BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNextCurrent, INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLEAN *pfRecompileMovementCosts, BOOLEAN fOnlyWalls, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel ) BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNextCurrent, INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist,
BOOLEAN *pfRecompileMovementCosts, BOOLEAN fOnlyWalls, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel,
UINT8 ubReason )
{ {
#ifdef JA2BETAVERSION #ifdef JA2BETAVERSION
if (is_networked) { if (is_networked) {
@@ -670,7 +672,7 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
DB_STRUCTURE_TILE ** ppTile; DB_STRUCTURE_TILE ** ppTile;
INT8 bDestructionPartner=-1; INT8 bDestructionPartner=-1;
INT8 bDamageReturnVal; INT8 bDamageReturnVal;
BOOLEAN fContinue; INT8 docontinue(0);
UINT32 uiTileType; UINT32 uiTileType;
INT32 sBaseGridNo; INT32 sBaseGridNo;
BOOLEAN fExplosive; BOOLEAN fExplosive;
@@ -727,7 +729,6 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
// Damage structure! // Damage structure!
if ( ( bDamageReturnVal = DamageStructure( pCurrent, (UINT8)sWoundAmt, STRUCTURE_DAMAGE_EXPLOSION, sGridNo, sX, sY, NOBODY ) ) != 0 ) if ( ( bDamageReturnVal = DamageStructure( pCurrent, (UINT8)sWoundAmt, STRUCTURE_DAMAGE_EXPLOSION, sGridNo, sX, sY, NOBODY ) ) != 0 )
{ {
fContinue = FALSE;
#ifdef JA2UB #ifdef JA2UB
//Ja25 ub //Ja25 ub
//are we exploding the Fan in the power gen facility //are we exploding the Fan in the power gen facility
@@ -741,7 +742,10 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
sBaseGridNo = pBase->sGridNo; sBaseGridNo = pBase->sGridNo;
// if the structure is openable, destroy all items there // if the structure is openable, destroy all items there
if ( pBase->fFlags & STRUCTURE_OPENABLE && !(pBase->fFlags & STRUCTURE_DOOR ) ) // Flugente: only if the structure has been entirely destroyed (why would we destroy what's inside if the structure still exists?)
if ( bDamageReturnVal == 1 &&
pBase->fFlags & STRUCTURE_OPENABLE &&
!(pBase->fFlags & STRUCTURE_DOOR ) )
{ {
RemoveAllUnburiedItems( pBase->sGridNo, bLevel ); RemoveAllUnburiedItems( pBase->sGridNo, bLevel );
} }
@@ -762,7 +766,7 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
if ( bDamageReturnVal == 1 ) if ( bDamageReturnVal == 1 )
{ {
fContinue = TRUE; docontinue = 1;
} }
// Check for a damaged looking graphic... // Check for a damaged looking graphic...
else if ( bDamageReturnVal == 2 ) else if ( bDamageReturnVal == 2 )
@@ -775,11 +779,11 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
GetTileType( pNode->usIndex, &uiTileType ); GetTileType( pNode->usIndex, &uiTileType );
fContinue = 2; docontinue = 2;
} }
} }
if ( fContinue ) if ( docontinue )
{ {
// Remove the beast! // Remove the beast!
while ( (*ppNextCurrent) != NULL && (*ppNextCurrent)->usStructureID == pCurrent->usStructureID ) while ( (*ppNextCurrent) != NULL && (*ppNextCurrent)->usStructureID == pCurrent->usStructureID )
@@ -1269,7 +1273,7 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
ApplyMapChangesToMapTempFile( FALSE ); ApplyMapChangesToMapTempFile( FALSE );
// OK, if we are to swap structures, do it now... // OK, if we are to swap structures, do it now...
if ( fContinue == 2 ) if ( docontinue == 2 )
{ {
// We have a levelnode... // We have a levelnode...
// Get new index for new grpahic.... // Get new index for new grpahic....
@@ -1280,8 +1284,6 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
AddStructToHead( sBaseGridNo, usTileIndex ); AddStructToHead( sBaseGridNo, usTileIndex );
ApplyMapChangesToMapTempFile( FALSE ); ApplyMapChangesToMapTempFile( FALSE );
} }
// Rerender world! // Rerender world!
@@ -1311,7 +1313,7 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
} }
} }
if ( fContinue == 2 ) if ( docontinue == 2 )
{ {
return( FALSE ); return( FALSE );
} }
@@ -1323,12 +1325,13 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
} }
return( 1 ); return( 1 );
} }
STRUCTURE *gStruct; STRUCTURE *gStruct;
void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLEAN *pfRecompileMovementCosts, BOOLEAN fOnlyWalls, INT8 bMultiStructSpecialFlag, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel ) void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLEAN *pfRecompileMovementCosts,
BOOLEAN fOnlyWalls, INT8 bMultiStructSpecialFlag, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel,
UINT8 ubReason )
{ {
#ifdef JA2BETAVERSION #ifdef JA2BETAVERSION
if (is_networked) { if (is_networked) {
@@ -1406,7 +1409,7 @@ void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE
// Check level! // Check level!
if (pCurrent->sCubeOffset == sDesiredLevel ) if (pCurrent->sCubeOffset == sDesiredLevel )
{ {
fExplodeDamageReturn = ExplosiveDamageStructureAtGridNo( pCurrent, &pNextCurrent, sGridNo, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, 0, ubOwner, bLevel ); fExplodeDamageReturn = ExplosiveDamageStructureAtGridNo( pCurrent, &pNextCurrent, sGridNo, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, 0, ubOwner, bLevel, ubReason );
// Are we overwriting damage due to multi-tile...? // Are we overwriting damage due to multi-tile...?
if ( fExplodeDamageReturn ) if ( fExplodeDamageReturn )
@@ -1474,11 +1477,11 @@ void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE
// If we just damaged it, use same damage value.... // If we just damaged it, use same damage value....
if ( fMultiStructSpecialFlag ) if ( fMultiStructSpecialFlag )
{ {
ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 1, ubOwner, bLevel ); ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 1, ubOwner, bLevel, ubReason );
} }
else else
{ {
ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 2, ubOwner, bLevel ); ExplosiveDamageGridNo( sNewGridNo2, sWoundAmt, uiDist, pfRecompileMovementCosts, fOnlyWalls, bMultiStructSpecialFlag, 2, ubOwner, bLevel, ubReason );
} }
{ {
@@ -2357,14 +2360,14 @@ BOOLEAN ExpAffect( INT32 sBombGridNo, INT32 sGridNo, UINT32 uiDist, UINT16 usIte
} }
} }
ExplosiveDamageGridNo( sGridNo, sStructDmgAmt, uiDist, &fRecompileMovementCosts, FALSE, -1, 0 , ubOwner, bLevel ); ExplosiveDamageGridNo( sGridNo, sStructDmgAmt, uiDist, &fRecompileMovementCosts, FALSE, -1, 0 , ubOwner, bLevel, STRUCTURE_DAMAGE_EXPLOSION );
// ATE: Look for damage to walls ONLY for next two gridnos // ATE: Look for damage to walls ONLY for next two gridnos
sNewGridNo = NewGridNo( sGridNo, DirectionInc( NORTH ) ); sNewGridNo = NewGridNo( sGridNo, DirectionInc( NORTH ) );
if ( GridNoOnVisibleWorldTile( sNewGridNo ) ) if ( GridNoOnVisibleWorldTile( sNewGridNo ) )
{ {
ExplosiveDamageGridNo( sNewGridNo, sStructDmgAmt, uiDist, &fRecompileMovementCosts, TRUE, -1, 0, ubOwner, bLevel ); ExplosiveDamageGridNo( sNewGridNo, sStructDmgAmt, uiDist, &fRecompileMovementCosts, TRUE, -1, 0, ubOwner, bLevel, STRUCTURE_DAMAGE_EXPLOSION );
} }
// ATE: Look for damage to walls ONLY for next two gridnos // ATE: Look for damage to walls ONLY for next two gridnos
@@ -2372,7 +2375,7 @@ BOOLEAN ExpAffect( INT32 sBombGridNo, INT32 sGridNo, UINT32 uiDist, UINT16 usIte
if ( GridNoOnVisibleWorldTile( sNewGridNo ) ) if ( GridNoOnVisibleWorldTile( sNewGridNo ) )
{ {
ExplosiveDamageGridNo( sNewGridNo, sStructDmgAmt, uiDist, &fRecompileMovementCosts, TRUE, -1, 0, ubOwner, bLevel ); ExplosiveDamageGridNo( sNewGridNo, sStructDmgAmt, uiDist, &fRecompileMovementCosts, TRUE, -1, 0, ubOwner, bLevel, STRUCTURE_DAMAGE_EXPLOSION );
} }
} }
+3 -1
View File
@@ -168,7 +168,9 @@ extern void HandleSeeingPowerGenFan( UINT32 sGridNo );
extern void HandleSeeingFortifiedDoor( UINT32 sGridNo );//Ja25 UB extern void HandleSeeingFortifiedDoor( UINT32 sGridNo );//Ja25 UB
#endif #endif
void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLEAN *pfRecompileMovementCosts, BOOLEAN fOnlyWalls, INT8 bMultiStructSpecialFlag, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel ); void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLEAN *pfRecompileMovementCosts,
BOOLEAN fOnlyWalls, INT8 bMultiStructSpecialFlag, BOOLEAN fSubSequentMultiTilesTransitionDamage, UINT8 ubOwner, INT8 bLevel,
UINT8 ubReason );
// Flugente: handle secondary explosive effects // Flugente: handle secondary explosive effects
void HandleBuddyExplosions(UINT8 ubOwner, INT16 sX, INT16 sY, INT16 sZ, INT32 sGridNo, UINT16 usItem, BOOLEAN fLocate, INT8 bLevel, UINT8 ubDirection ); void HandleBuddyExplosions(UINT8 ubOwner, INT16 sX, INT16 sY, INT16 sZ, INT32 sGridNo, UINT16 usItem, BOOLEAN fLocate, INT8 bLevel, UINT8 ubDirection );
+9 -9
View File
@@ -1787,7 +1787,7 @@ BOOLEAN StructureDensity( STRUCTURE * pStructure, UINT8 * pubLevel0, UINT8 * pub
return( TRUE ); return( TRUE );
} }
BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner, INT32 sAntiMaterialImpact ) INT8 DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner, INT32 sAntiMaterialImpact )
{ {
// do damage to a structure; returns TRUE if the structure should be removed // do damage to a structure; returns TRUE if the structure should be removed
STRUCTURE *pBase; STRUCTURE *pBase;
@@ -1797,12 +1797,12 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
if (pStructure->fFlags & STRUCTURE_PERSON || pStructure->fFlags & STRUCTURE_CORPSE) if (pStructure->fFlags & STRUCTURE_PERSON || pStructure->fFlags & STRUCTURE_CORPSE)
{ {
// don't hurt this structure, it's used for hit detection only! // don't hurt this structure, it's used for hit detection only!
return( FALSE ); return( 0 );
} }
if ( (pStructure->pDBStructureRef->pDBStructure->ubArmour == MATERIAL_INDESTRUCTABLE_METAL) || (pStructure->pDBStructureRef->pDBStructure->ubArmour == MATERIAL_INDESTRUCTABLE_STONE) ) if ( (pStructure->pDBStructureRef->pDBStructure->ubArmour == MATERIAL_INDESTRUCTABLE_METAL) || (pStructure->pDBStructureRef->pDBStructure->ubArmour == MATERIAL_INDESTRUCTABLE_STONE) )
{ {
return( FALSE ); return( 0 );
} }
UINT8 ubBaseArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ]; UINT8 ubBaseArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ];
@@ -1822,7 +1822,7 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
if (ubArmour > ubDamage) if (ubArmour > ubDamage)
{ {
// didn't even scratch the paint // didn't even scratch the paint
return( FALSE ); return( 0 );
} }
else else
{ {
@@ -1862,7 +1862,7 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
IgniteExplosion( ubOwner, sX, sY, 0, sGridNo, STRUCTURE_IGNITE, 0 ); IgniteExplosion( ubOwner, sX, sY, 0, sGridNo, STRUCTURE_IGNITE, 0 );
// ATE: Return false here, as we are dealing with deleting the graphic here... // ATE: Return false here, as we are dealing with deleting the graphic here...
return( FALSE ); return( 0 );
} }
// Make hit sound.... // Make hit sound....
@@ -1896,7 +1896,7 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
damage += max(1, 2 * sAntiMaterialImpact / ubBaseArmour); damage += max(1, 2 * sAntiMaterialImpact / ubBaseArmour);
BOOLEAN recompile = FALSE; BOOLEAN recompile = FALSE;
ExplosiveDamageGridNo( pStructure->sGridNo, damage, 10, &recompile, FALSE, -1, FALSE, ubOwner, 0 ); ExplosiveDamageGridNo( pStructure->sGridNo, damage, 10, &recompile, FALSE, -1, FALSE, ubOwner, 0, ubReason );
//Since the structure is being damaged, set the map element that a structure is damaged //Since the structure is being damaged, set the map element that a structure is damaged
gpWorldLevelData[ pStructure->sGridNo ].uiFlags |= MAPELEMENT_STRUCTURE_DAMAGED; gpWorldLevelData[ pStructure->sGridNo ].uiFlags |= MAPELEMENT_STRUCTURE_DAMAGED;
@@ -1920,7 +1920,7 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
INT16 damage = 255; INT16 damage = 255;
BOOLEAN recompile = FALSE; BOOLEAN recompile = FALSE;
ExplosiveDamageGridNo( sGridNo, damage, 10, &recompile, FALSE, -1, FALSE, ubOwner, 0 ); ExplosiveDamageGridNo( sGridNo, damage, 10, &recompile, FALSE, -1, FALSE, ubOwner, 0, ubReason );
//Since the structure is being damaged, set the map element that a structure is damaged //Since the structure is being damaged, set the map element that a structure is damaged
gpWorldLevelData[ sGridNo ].uiFlags |= MAPELEMENT_STRUCTURE_DAMAGED; gpWorldLevelData[ sGridNo ].uiFlags |= MAPELEMENT_STRUCTURE_DAMAGED;
@@ -1947,7 +1947,7 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
} }
// Don't update damage HPs.... // Don't update damage HPs....
return TRUE; return 1;
} }
// OK, LOOK FOR A SAM SITE, UPDATE.... // OK, LOOK FOR A SAM SITE, UPDATE....
@@ -1961,7 +1961,7 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
UpdateAndDamageEnemyHeliIfFound( gWorldSectorX, gWorldSectorY, gbWorldSectorZ, sGridNo, ubDamage, TRUE ); UpdateAndDamageEnemyHeliIfFound( gWorldSectorX, gWorldSectorY, gbWorldSectorZ, sGridNo, ubDamage, TRUE );
// boom! structure destroyed! // boom! structure destroyed!
return( TRUE ); return( 1 );
} }
else else
{ {
+1 -1
View File
@@ -91,7 +91,7 @@ STRUCTURE* GetTallestStructureOnGridnoDrag( INT32 sGridNo, INT8 bLevel );
// FUNCTIONS FOR DETERMINING STUFF THAT BLOCKS VIEW FOR TILE_bASED LOS // FUNCTIONS FOR DETERMINING STUFF THAT BLOCKS VIEW FOR TILE_bASED LOS
INT8 GetBlockingStructureInfo( INT32 sGridNo, INT8 bDir, INT8 bNextDir, INT8 bLevel, INT8 *pStructHeight, STRUCTURE ** ppTallestStructure, BOOLEAN fWallsBlock ); INT8 GetBlockingStructureInfo( INT32 sGridNo, INT8 bDir, INT8 bNextDir, INT8 bLevel, INT8 *pStructHeight, STRUCTURE ** ppTallestStructure, BOOLEAN fWallsBlock );
BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner, INT32 sAntiMaterialImpact = 0 ); INT8 DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner, INT32 sAntiMaterialImpact = 0 );
// Material armour type enumeration // Material armour type enumeration
enum enum