mirror of
https://github.com/1dot13/source.git
synced 2026-09-02 14:36:06 +02:00
Fix: RaiseZombies function ignored sector levels and modified wrong sector info counters
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8692 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
+2
-2
@@ -55,8 +55,8 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHAR8 czVersionNumber[16] = { "Build 19.08.20" }; //YY.MM.DD
|
CHAR8 czVersionNumber[16] = { "Build 19.08.24" }; //YY.MM.DD
|
||||||
CHAR16 zTrackingNumber[16] = { L"Z" };
|
CHAR16 zTrackingNumber[16] = { L"Z" };
|
||||||
CHAR16 zRevisionNumber[16] = { L"Revision 8690" };
|
CHAR16 zRevisionNumber[16] = { L"Revision 8692" };
|
||||||
|
|
||||||
// SAVE_GAME_VERSION is defined in header, change it there
|
// SAVE_GAME_VERSION is defined in header, change it there
|
||||||
|
|||||||
@@ -2691,6 +2691,8 @@ std::vector<INT16> GetCorpseIDsNearGridNo( INT32 sGridNo, INT8 bLevel, INT8 sRad
|
|||||||
return idvec;
|
return idvec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern UNDERGROUND_SECTORINFO* FindUnderGroundSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ );
|
||||||
|
|
||||||
// Flugente Zombies: resurrect zombies
|
// Flugente Zombies: resurrect zombies
|
||||||
void RaiseZombies( void )
|
void RaiseZombies( void )
|
||||||
{
|
{
|
||||||
@@ -2703,44 +2705,92 @@ void RaiseZombies( void )
|
|||||||
ROTTING_CORPSE * pCorpse;
|
ROTTING_CORPSE * pCorpse;
|
||||||
BOOLEAN zombieshaverisen = FALSE;
|
BOOLEAN zombieshaverisen = FALSE;
|
||||||
|
|
||||||
SECTORINFO *pSector = &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ];
|
// silversurfer: We need to check if we are above or below ground or we will modify the wrong sector counters!
|
||||||
|
// above ground
|
||||||
for ( INT32 cnt = giNumRottingCorpse - 1; cnt >= 0; --cnt )
|
if (!gbWorldSectorZ)
|
||||||
{
|
{
|
||||||
if ( pSector && pSector->ubNumCreatures < gGameExternalOptions.ubGameMaximumNumberOfCreatures ) // ... if there is still room for more zombies (zombies count as creatures until a separate ZOMBIE_TEAM is implemented)...
|
SECTORINFO *pSector = &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ];
|
||||||
|
|
||||||
|
for ( INT32 cnt = giNumRottingCorpse - 1; cnt >= 0; --cnt )
|
||||||
{
|
{
|
||||||
pCorpse = &(gRottingCorpse[ cnt ] );
|
if ( pSector && pSector->ubNumCreatures < gGameExternalOptions.ubGameMaximumNumberOfCreatures ) // ... if there is still room for more zombies (zombies count as creatures until a separate ZOMBIE_TEAM is implemented)...
|
||||||
|
|
||||||
// if zombies should spawn individually, roll for every corpse individually
|
|
||||||
if ( gGameExternalOptions.fZombieSpawnWaves || ( !gGameExternalOptions.fZombieSpawnWaves && (INT8) ( Random( 100 ) ) > 100 - gGameExternalOptions.sZombieRiseWaveFrequency ) )
|
|
||||||
{
|
{
|
||||||
if ( pCorpse->fActivated && !(pCorpse->def.usFlags & (ROTTING_CORPSE_HEAD_TAKEN|ROTTING_CORPSE_NEVER_RISE_AGAIN) ) ) // ... if corpse is active, and still has a head and can rise again...
|
pCorpse = &(gRottingCorpse[ cnt ] );
|
||||||
|
|
||||||
|
// if zombies should spawn individually, roll for every corpse individually
|
||||||
|
if ( gGameExternalOptions.fZombieSpawnWaves || ( !gGameExternalOptions.fZombieSpawnWaves && (INT8) ( Random( 100 ) ) > 100 - gGameExternalOptions.sZombieRiseWaveFrequency ) )
|
||||||
{
|
{
|
||||||
if ( !TileIsOutOfBounds(pCorpse->def.sGridNo) ) // ... if corpse is on existing coordinates ...
|
if ( pCorpse->fActivated && !(pCorpse->def.usFlags & (ROTTING_CORPSE_HEAD_TAKEN|ROTTING_CORPSE_NEVER_RISE_AGAIN) ) ) // ... if corpse is active, and still has a head and can rise again...
|
||||||
{
|
{
|
||||||
if ( WhoIsThere2( pCorpse->def.sGridNo, pCorpse->def.bLevel ) == NOBODY ) // ... if nobody else is on that position ...
|
if ( !TileIsOutOfBounds(pCorpse->def.sGridNo) ) // ... if corpse is on existing coordinates ...
|
||||||
{
|
{
|
||||||
UINT16 recanimstate = STANDING;
|
if ( WhoIsThere2( pCorpse->def.sGridNo, pCorpse->def.bLevel ) == NOBODY ) // ... if nobody else is on that position ...
|
||||||
|
|
||||||
if ( CorpseOkToSpawnZombie( pCorpse, &recanimstate ) ) // ... a zombie can be created from this corpse, in the corresponding animstate ...
|
|
||||||
{
|
{
|
||||||
zombieshaverisen = TRUE;
|
UINT16 recanimstate = STANDING;
|
||||||
CreateZombiefromCorpse( pCorpse, recanimstate );
|
|
||||||
|
|
||||||
pSector->ubNumCreatures++;
|
if ( CorpseOkToSpawnZombie( pCorpse, &recanimstate ) ) // ... a zombie can be created from this corpse, in the corresponding animstate ...
|
||||||
pSector->ubCreaturesInBattle++;
|
{
|
||||||
|
zombieshaverisen = TRUE;
|
||||||
|
CreateZombiefromCorpse( pCorpse, recanimstate );
|
||||||
|
|
||||||
RemoveCorpse( cnt );
|
pSector->ubNumCreatures++;
|
||||||
|
pSector->ubCreaturesInBattle++;
|
||||||
|
|
||||||
|
RemoveCorpse( cnt );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if there is no more room, we can skip this
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
else // below ground
|
||||||
|
{
|
||||||
|
UNDERGROUND_SECTORINFO *pSector = FindUnderGroundSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
|
||||||
|
|
||||||
|
for ( INT32 cnt = giNumRottingCorpse - 1; cnt >= 0; --cnt )
|
||||||
{
|
{
|
||||||
// if there is no more room, we can skip this
|
if ( pSector && pSector->ubNumCreatures < gGameExternalOptions.ubGameMaximumNumberOfCreatures ) // ... if there is still room for more zombies (zombies count as creatures until a separate ZOMBIE_TEAM is implemented)...
|
||||||
break;
|
{
|
||||||
|
pCorpse = &(gRottingCorpse[ cnt ] );
|
||||||
|
|
||||||
|
// if zombies should spawn individually, roll for every corpse individually
|
||||||
|
if ( gGameExternalOptions.fZombieSpawnWaves || ( !gGameExternalOptions.fZombieSpawnWaves && (INT8) ( Random( 100 ) ) > 100 - gGameExternalOptions.sZombieRiseWaveFrequency ) )
|
||||||
|
{
|
||||||
|
if ( pCorpse->fActivated && !(pCorpse->def.usFlags & (ROTTING_CORPSE_HEAD_TAKEN|ROTTING_CORPSE_NEVER_RISE_AGAIN) ) ) // ... if corpse is active, and still has a head and can rise again...
|
||||||
|
{
|
||||||
|
if ( !TileIsOutOfBounds(pCorpse->def.sGridNo) ) // ... if corpse is on existing coordinates ...
|
||||||
|
{
|
||||||
|
if ( WhoIsThere2( pCorpse->def.sGridNo, pCorpse->def.bLevel ) == NOBODY ) // ... if nobody else is on that position ...
|
||||||
|
{
|
||||||
|
UINT16 recanimstate = STANDING;
|
||||||
|
|
||||||
|
if ( CorpseOkToSpawnZombie( pCorpse, &recanimstate ) ) // ... a zombie can be created from this corpse, in the corresponding animstate ...
|
||||||
|
{
|
||||||
|
zombieshaverisen = TRUE;
|
||||||
|
CreateZombiefromCorpse( pCorpse, recanimstate );
|
||||||
|
|
||||||
|
pSector->ubNumCreatures++;
|
||||||
|
pSector->ubCreaturesInBattle++;
|
||||||
|
|
||||||
|
RemoveCorpse( cnt );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if there is no more room, we can skip this
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user