diff --git a/source/enemy/ndogfish.cpp b/source/enemy/ndogfish.cpp index c8b7ab228..b65425870 100644 --- a/source/enemy/ndogfish.cpp +++ b/source/enemy/ndogfish.cpp @@ -554,11 +554,16 @@ void CNpcIronDogfishEnemy::collidedWith( CThing *_thisThing ) void CNpcIronDogfishEnemy::shutdown() { + CLevel::setIsBossRespawn( true ); + if ( m_state != NPC_GENERIC_HIT_DEATH_END ) { - CLevel::setIsBossRespawn( true ); CLevel::setBossHealth( m_health ); } + else + { + CLevel::setBossHealth( 0 ); + } CNpcBossEnemy::shutdown(); } diff --git a/source/enemy/nfdutch.cpp b/source/enemy/nfdutch.cpp index becc35116..3e5f23ad0 100644 --- a/source/enemy/nfdutch.cpp +++ b/source/enemy/nfdutch.cpp @@ -650,11 +650,16 @@ void CNpcFlyingDutchmanEnemy::processShotDeathEnd( int _frames ) void CNpcFlyingDutchmanEnemy::shutdown() { + CLevel::setIsBossRespawn( true ); + if ( m_state != NPC_GENERIC_HIT_DEATH_END ) { - CLevel::setIsBossRespawn( true ); CLevel::setBossHealth( m_health ); } + else + { + CLevel::setBossHealth( 0 ); + } CNpcBossEnemy::shutdown(); } diff --git a/source/enemy/nmjfish.cpp b/source/enemy/nmjfish.cpp index 067d3f3db..772c059ca 100644 --- a/source/enemy/nmjfish.cpp +++ b/source/enemy/nmjfish.cpp @@ -620,11 +620,16 @@ void CNpcMotherJellyfishEnemy::processClose( int _frames ) void CNpcMotherJellyfishEnemy::shutdown() { + CLevel::setIsBossRespawn( true ); + if ( m_isActive ) { - CLevel::setIsBossRespawn( true ); CLevel::setBossHealth( m_health ); } + else + { + CLevel::setBossHealth( 0 ); + } for ( int i = 0 ; i < 4 ; i++ ) { diff --git a/source/enemy/npc.cpp b/source/enemy/npc.cpp index 80cdc9501..d22c49fe1 100644 --- a/source/enemy/npc.cpp +++ b/source/enemy/npc.cpp @@ -216,6 +216,27 @@ CNpcEnemy::NPC_UNIT_TYPE CNpcEnemy::getTypeFromMapEdit( u16 newType ) CNpcEnemy *CNpcEnemy::Create(int enemyType) { + switch( enemyType ) + { + case CNpcEnemy::NPC_MOTHER_JELLYFISH: + case CNpcEnemy::NPC_SUB_SHARK: + case CNpcEnemy::NPC_SEA_SNAKE: + case CNpcEnemy::NPC_FLYING_DUTCHMAN: + case CNpcEnemy::NPC_IRON_DOGFISH: + { + if ( CLevel::getIsBossRespawn() ) + { + if ( !CLevel::getBossHealth() ) + { + return( NULL ); + } + } + } + + default: + break; + } + CNpcEnemy *enemy; enemy = (CNpcEnemy*)CThingManager::GetThing(TYPE_ENEMY,enemyType); @@ -455,7 +476,6 @@ CNpcEnemy *enemy; NPC_UNIT_TYPE enemyType = CNpcEnemy::getTypeFromMapEdit( ThisActor->Type ); enemy = (CNpcEnemy*)Create(enemyType); - ASSERT(enemy); return(enemy); } diff --git a/source/enemy/nsshark.cpp b/source/enemy/nsshark.cpp index faa803131..f9f339c2b 100644 --- a/source/enemy/nsshark.cpp +++ b/source/enemy/nsshark.cpp @@ -712,11 +712,16 @@ void CNpcSubSharkEnemy::processShot( int _frames ) void CNpcSubSharkEnemy::shutdown() { + CLevel::setIsBossRespawn( true ); + if ( m_state != NPC_GENERIC_HIT_DEATH_END ) { - CLevel::setIsBossRespawn( true ); CLevel::setBossHealth( m_health ); } + else + { + CLevel::setBossHealth( 0 ); + } CNpcBossEnemy::shutdown(); } diff --git a/source/enemy/nssnake.cpp b/source/enemy/nssnake.cpp index 58e4a1693..b8d914cef 100644 --- a/source/enemy/nssnake.cpp +++ b/source/enemy/nssnake.cpp @@ -179,11 +179,16 @@ void CNpcSeaSnakeSegment::shutdown() void CNpcSeaSnakeEnemy::shutdown() { + CLevel::setIsBossRespawn( true ); + if ( m_state != NPC_GENERIC_HIT_DEATH_END ) { - CLevel::setIsBossRespawn( true ); CLevel::setBossHealth( m_health ); } + else + { + CLevel::setBossHealth( 0 ); + } // delete snake segments diff --git a/source/level/level.cpp b/source/level/level.cpp index 82be4bb7c..d3a035774 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -492,12 +492,18 @@ void CLevel::initThings(int _respawningLevel) { CNpcEnemy *enemy; enemy=CNpcEnemy::Create(ThisActor); - enemy->setupWaypoints( ThisActor ); - enemy->postInit(); - if ( ThisActor->Speed ) + if ( enemy ) { - enemy->setSpeed( ThisActor->Speed ); + // if boss is killed and user dies, boss will not initialise and will return NULL + + enemy->setupWaypoints( ThisActor ); + enemy->postInit(); + + if ( ThisActor->Speed ) + { + enemy->setSpeed( ThisActor->Speed ); + } } } break; @@ -563,8 +569,8 @@ void CLevel::initThings(int _respawningLevel) /*****************************************************************************/ void CLevel::respawnLevel() { - m_isBossRespawn = false; - m_bossHealth = 0; + //m_isBossRespawn = false; + //m_bossHealth = 0; CThingManager::killAllThingsForRespawn(); initThings(true);