diff --git a/Tactical/Rotting Corpses.cpp b/Tactical/Rotting Corpses.cpp index 692078d64..f0e28727d 100644 --- a/Tactical/Rotting Corpses.cpp +++ b/Tactical/Rotting Corpses.cpp @@ -713,6 +713,10 @@ void RemoveCorpse( INT32 iCorpseID ) DeleteAniTile( gRottingCorpse[ iCorpseID ].pAniTile ); FreeCorpsePalettes( &( gRottingCorpse[ iCorpseID ] ) ); + + const auto sGridNo = gRottingCorpse[iCorpseID].def.sGridNo; + auto pStructure = FindLastStructure(sGridNo, STRUCTURE_CORPSE); + DeleteStructureFromWorld(pStructure); } BOOLEAN CreateCorpsePalette( ROTTING_CORPSE *pCorpse ) @@ -1770,10 +1774,10 @@ BOOLEAN IsValidDecapitationCorpse( ROTTING_CORPSE *pCorpse ) ROTTING_CORPSE *GetCorpseAtGridNo( INT32 sGridNo, INT8 bLevel ) { - STRUCTURE *pStructure, *pBaseStructure; + STRUCTURE *pStructure, *pBaseStructure; INT32 sBaseGridNo; - pStructure = FindStructure( sGridNo, STRUCTURE_CORPSE ); + pStructure = FindLastStructure( sGridNo, STRUCTURE_CORPSE ); if ( pStructure != NULL ) { diff --git a/TileEngine/structure.cpp b/TileEngine/structure.cpp index a22fa78ea..6ef12f026 100644 --- a/TileEngine/structure.cpp +++ b/TileEngine/structure.cpp @@ -1428,6 +1428,7 @@ STRUCTURE * SwapStructureForPartnerForcingGraphicalChange( INT32 sGridNo, STRUCT } #endif +// Finds the first structure with matching flag STRUCTURE * FindStructure( INT32 sGridNo, UINT32 fFlags ) { // finds a structure that matches any of the given flags @@ -1451,6 +1452,33 @@ STRUCTURE * FindStructure( INT32 sGridNo, UINT32 fFlags ) return( NULL ); } +// Finds the last structure with matching flag +STRUCTURE* FindLastStructure(INT32 sGridNo, UINT32 fFlags) +{ + // finds a structure that matches any of the given flags + STRUCTURE* pCurrent; + STRUCTURE* pLastMatch = nullptr; + + //bug fix for win98 crash when traveling between sectors + if ( TileIsOutOfBounds(sGridNo) ) + { + return(NULL); + } + + pCurrent = gpWorldLevelData[sGridNo].pStructureHead; + while ( pCurrent != NULL ) + { + if ( (pCurrent->fFlags & fFlags) != 0 ) + { + pLastMatch = pCurrent; + //return(pCurrent); + } + pCurrent = pCurrent->pNext; + } + + return(pLastMatch); +} + STRUCTURE * FindNextStructure( STRUCTURE * pStructure, UINT32 fFlags ) { STRUCTURE * pCurrent; diff --git a/TileEngine/structure.h b/TileEngine/structure.h index 3c7e4fc4a..4f71d7a62 100644 --- a/TileEngine/structure.h +++ b/TileEngine/structure.h @@ -47,6 +47,7 @@ BOOLEAN DeleteStructureFromWorld( STRUCTURE * pStructure ); // functions to find a structure in a location // STRUCTURE * FindStructure( INT32 sGridNo, UINT32 fFlags ); +STRUCTURE* FindLastStructure(INT32 sGridNo, UINT32 fFlags); STRUCTURE * FindNextStructure( STRUCTURE * pStructure, UINT32 fFlags ); STRUCTURE * FindStructureByID( INT32 sGridNo, UINT16 usStructureID ); STRUCTURE * FindBaseStructure( STRUCTURE * pStructure );