diff --git a/source/game/game.cpp b/source/game/game.cpp index 69f434638..2a7560cf8 100644 --- a/source/game/game.cpp +++ b/source/game/game.cpp @@ -281,6 +281,13 @@ CPlayer * CGameScene::getPlayer() return( m_player ); } +/*****************************************************************************/ +void CGameScene::respawnLevel() +{ + Level.respawnLevel(); +} + + /*****************************************************************************/ void CGameScene::sendEvent( GAME_EVENT evt, CThing *sourceThing ) { @@ -313,70 +320,6 @@ void CGameScene::initLevel() m_player->setHealthType(CPlayer::HEALTH_TYPE__OUT_OF_WATER); } -// Init actors (needs moving and tidying - int actorNum; - int platformNum; - int hazardNum; - - sThingActor **actorList = Level.getActorList(); - if (actorList) - { - for ( actorNum = 0 ; actorNum < Level.getActorCount() ; actorNum++ ) - { - sThingActor *ThisActor=actorList[actorNum]; - CGameScene::ACTOR_TYPE actorType = CGameScene::getActorType( actorList[actorNum]->Type ); - switch ( actorType ) - { - case CGameScene::ACTOR_ENEMY_NPC: - { - CNpcEnemy *enemy; - enemy=CNpcEnemy::Create(ThisActor); - enemy->setLayerCollision( Level.getCollisionLayer() ); - enemy->setupWaypoints( ThisActor ); - enemy->postInit(); - } - break; - - case CGameScene::ACTOR_FRIEND_NPC: - { - CNpcFriend *friendNpc; - friendNpc=CNpcFriend::Create(ThisActor); - friendNpc->setLayerCollision( Level.getCollisionLayer() ); - friendNpc->postInit(); - } - break; - - default: - break; - } - } - } - - sThingPlatform **platformList = Level.getPlatformList(); - if (platformList) - { - for ( platformNum = 0 ; platformNum < Level.getPlatformCount() ; platformNum++ ) - { - sThingPlatform *ThisPlatform = platformList[platformNum]; - CNpcPlatform *platform; - platform = CNpcPlatform::Create( ThisPlatform ); - platform->setLayerCollision( Level.getCollisionLayer() ); - platform->postInit(); - } - } - - sThingHazard **hazardList = Level.getHazardList(); - if (hazardList) - { - for ( hazardNum = 0 ; hazardNum < Level.getHazardCount() ; hazardNum++ ) - { - sThingHazard *ThisHazard = hazardList[hazardNum]; - CNpcHazard *hazard; - hazard = CNpcHazard::Create( ThisHazard ); - hazard->setLayerCollision( Level.getCollisionLayer() ); - } - } - // Song is loaded/dumped by the level, and played from here. This just gives some // better timing over when it starts (pkg) CSoundMediator::playSong(); diff --git a/source/game/game.h b/source/game/game.h index 17afd104e..10f385eaf 100644 --- a/source/game/game.h +++ b/source/game/game.h @@ -40,6 +40,7 @@ virtual int canPause(); char *getSceneName() {return "Game";} CPlayer *getPlayer(); + void respawnLevel(); void sendEvent( GAME_EVENT evt, class CThing *sourceThing ); static void setReadyToExit() {s_readyToExit=true;} diff --git a/source/level/level.cpp b/source/level/level.cpp index 59e9e2244..69b846cd8 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -47,9 +47,29 @@ #include "system\vid.h" #endif -#include "enemy\npc.h" #include "gfx\actor.h" +#ifndef __ENEMY_NPC_H__ +#include "enemy\npc.h" +#endif + +#ifndef __FRIEND_FRIEND_H__ +#include "friend\friend.h" +#endif + +#ifndef __PLATFORM_PLATFORM_H__ +#include "platform\platform.h" +#endif + +#ifndef __HAZARD_HAZARD_H__ +#include "hazard\hazard.h" +#endif + +#ifndef __PROJECTL_PROJECTL_H__ +#include "projectl\projectl.h" +#endif + + /*****************************************************************************/ extern int s_globalLevelSelectThing; @@ -264,21 +284,6 @@ void CLevel::initLayers() ThingPtr+=ActorList[i]->PointCount*sizeof(u16)*2; } } -// Items - if (LevelHdr->ItemList) - { - sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->ItemList); - ItemCount=Hdr->Count; - ItemList=(sThingItem*)MakePtr(Hdr,sizeof(sThingHdr)); - DVECTOR pos; - for(int i=0;iPos.X<<4; - pos.vy=ItemList->Pos.Y<<4; - createPickup((PICKUP_TYPE)ItemList->Type,&pos); - ItemList++; - } - } // Platforms if (LevelHdr->PlatformList) { @@ -295,71 +300,6 @@ void CLevel::initLayers() } } -// Triggers -// Yeah yeah - I'll put this crap into a seperate file when the numbers of trigger types get a bit bigger! (pkg) - if (LevelHdr->TriggerList) - { - sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->TriggerList); - TriggerCount=Hdr->Count; - TriggerList=(sThingTrigger*)MakePtr(Hdr,sizeof(sThingHdr)); - - for(int i=0;iType==3) - { - // Camera lock trigger - trigger=(CCameraLockTrigger*)new ("CameraLockTrigger") CCameraLockTrigger(); - trigger->init(); - trigger->setPositionAndSize(TriggerList->Pos.X<<4,TriggerList->Pos.Y<<4, - TriggerList->Width<<4,TriggerList->Height<<4); - trigger->setTargetBox(TriggerList->TargetPos.X<<4,TriggerList->TargetPos.Y<<4,TriggerList->TargetSize.X<<4,TriggerList->TargetSize.Y<<4); - } - TriggerList++; - } - } - - if (LevelHdr->TriggerList) - { - sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->TriggerList); - TriggerCount=Hdr->Count; - TriggerList=(sThingTrigger*)MakePtr(Hdr,sizeof(sThingHdr)); - - for(int i=0;iType) - { - // Exit trigger - case 0: - trigger=(CTriggerThing*)new ("LevelExitTrigger") CLevelExitTrigger(); - break; - - // Level respawn trigger - case 1: - trigger=(CRestartPointTrigger*)new ("RestartTrigger") CRestartPointTrigger(); - break; - - // Teleport trigger - case 2: - trigger=(CTeleportTrigger*)new ("TeleportTrigger") CTeleportTrigger(); - break; - - // Camera lock trigger - case 3: - trigger=NULL; - break; - } - if(trigger) - { - trigger->init(); - trigger->setPositionAndSize(TriggerList->Pos.X<<4,TriggerList->Pos.Y<<4, - TriggerList->Width<<4,TriggerList->Height<<4); - trigger->setTargetBox(TriggerList->TargetPos.X<<4,TriggerList->TargetPos.Y<<4,TriggerList->TargetSize.X<<4,TriggerList->TargetSize.Y<<4); - } - TriggerList++; - } - } // FX if (LevelHdr->FXList) { @@ -367,6 +307,7 @@ void CLevel::initLayers() FXCount=Hdr->Count; FXList=(sThingFX*)MakePtr(Hdr,sizeof(sThingHdr)); } + // Hazards if (LevelHdr->HazardList) { @@ -382,8 +323,174 @@ void CLevel::initLayers() } } + initThings(false); } + + +/*****************************************************************************/ +void CLevel::initThings(int _respawningLevel) +{ + // Triggers + // Yeah yeah - I'll put this crap into a seperate file when the numbers of trigger types get a bit bigger! (pkg) + if (LevelHdr->TriggerList) + { + sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->TriggerList); + TriggerCount=Hdr->Count; + TriggerList=(sThingTrigger*)MakePtr(Hdr,sizeof(sThingHdr)); + + for(int i=0;iType==3) + { + // Camera lock trigger + trigger=(CCameraLockTrigger*)new ("CameraLockTrigger") CCameraLockTrigger(); + trigger->init(); + trigger->setPositionAndSize(TriggerList->Pos.X<<4,TriggerList->Pos.Y<<4, + TriggerList->Width<<4,TriggerList->Height<<4); + trigger->setTargetBox(TriggerList->TargetPos.X<<4,TriggerList->TargetPos.Y<<4,TriggerList->TargetSize.X<<4,TriggerList->TargetSize.Y<<4); + } + TriggerList++; + } + } + + if (LevelHdr->TriggerList) + { + sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->TriggerList); + TriggerCount=Hdr->Count; + TriggerList=(sThingTrigger*)MakePtr(Hdr,sizeof(sThingHdr)); + + for(int i=0;iType) + { + // Exit trigger + case 0: + trigger=(CTriggerThing*)new ("LevelExitTrigger") CLevelExitTrigger(); + break; + + // Level respawn trigger + case 1: + trigger=(CRestartPointTrigger*)new ("RestartTrigger") CRestartPointTrigger(); + break; + + // Teleport trigger + case 2: + trigger=(CTeleportTrigger*)new ("TeleportTrigger") CTeleportTrigger(); + break; + + // Camera lock trigger + case 3: + trigger=NULL; + break; + } + if(trigger) + { + trigger->init(); + trigger->setPositionAndSize(TriggerList->Pos.X<<4,TriggerList->Pos.Y<<4, + TriggerList->Width<<4,TriggerList->Height<<4); + trigger->setTargetBox(TriggerList->TargetPos.X<<4,TriggerList->TargetPos.Y<<4,TriggerList->TargetSize.X<<4,TriggerList->TargetSize.Y<<4); + } + TriggerList++; + } + } + +// Items + if (LevelHdr->ItemList) + { + sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->ItemList); + ItemCount=Hdr->Count; + ItemList=(sThingItem*)MakePtr(Hdr,sizeof(sThingHdr)); + DVECTOR pos; + for(int i=0;iType==PICKUP__SPATULA)) + { + pos.vx=ItemList->Pos.X<<4; + pos.vy=ItemList->Pos.Y<<4; + createPickup((PICKUP_TYPE)ItemList->Type,&pos); + } + ItemList++; + } + } + +// Init actors (needs moving and tidying + int actorNum; + int platformNum; + int hazardNum; + + sThingActor **actorList = getActorList(); + if (actorList) + { + for ( actorNum = 0 ; actorNum < getActorCount() ; actorNum++ ) + { + sThingActor *ThisActor=actorList[actorNum]; + CGameScene::ACTOR_TYPE actorType = CGameScene::getActorType( actorList[actorNum]->Type ); + switch ( actorType ) + { + case CGameScene::ACTOR_ENEMY_NPC: + { + CNpcEnemy *enemy; + enemy=CNpcEnemy::Create(ThisActor); + enemy->setLayerCollision( getCollisionLayer() ); + enemy->setupWaypoints( ThisActor ); + enemy->postInit(); + } + break; + + case CGameScene::ACTOR_FRIEND_NPC: + { + CNpcFriend *friendNpc; + friendNpc=CNpcFriend::Create(ThisActor); + friendNpc->setLayerCollision( getCollisionLayer() ); + friendNpc->postInit(); + } + break; + + default: + break; + } + } + } + + sThingPlatform **platformList = getPlatformList(); + if (platformList) + { + for ( platformNum = 0 ; platformNum < getPlatformCount() ; platformNum++ ) + { + sThingPlatform *ThisPlatform = platformList[platformNum]; + CNpcPlatform *platform; + platform = CNpcPlatform::Create( ThisPlatform ); + platform->setLayerCollision( getCollisionLayer() ); + platform->postInit(); + } + } + + sThingHazard **hazardList = getHazardList(); + if (hazardList) + { + for ( hazardNum = 0 ; hazardNum < getHazardCount() ; hazardNum++ ) + { + sThingHazard *ThisHazard = hazardList[hazardNum]; + CNpcHazard *hazard; + hazard = CNpcHazard::Create( ThisHazard ); + hazard->setLayerCollision( getCollisionLayer() ); + } + } +} + + + +/*****************************************************************************/ +void CLevel::respawnLevel() +{ + CThingManager::killAllThingsForRespawn(); + initThings(true); +} + + /*****************************************************************************/ void CLevel::shutdown() { diff --git a/source/level/level.h b/source/level/level.h index 4a1dc8e47..316de305e 100644 --- a/source/level/level.h +++ b/source/level/level.h @@ -49,9 +49,14 @@ public: DVECTOR getMapSize(); bool GetNextLevel(int &Lvl); + + void respawnLevel(); + private: void initLayers(); + void initThings(int _respawningLevel); + void DisplayLoadingScreen(sLvlTab *lvlTab); sLevelHdr *LevelHdr; diff --git a/source/player/player.cpp b/source/player/player.cpp index 98b60623a..4a565314c 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -77,9 +77,9 @@ #include "platform\platform.h" #endif - -// to be removed -//#include "gfx\tpage.h" +#ifndef __GAME_GAME_H__ +#include "game\game.h" +#endif /* Std Lib @@ -1304,6 +1304,8 @@ void CPlayer::respawn() m_moveVelocity.vx=m_moveVelocity.vy=0; clearPlatform(); + + GameScene.respawnLevel(); } diff --git a/source/thing/thing.cpp b/source/thing/thing.cpp index 37623beb6..0a46a9d72 100644 --- a/source/thing/thing.cpp +++ b/source/thing/thing.cpp @@ -97,6 +97,32 @@ void CThingManager::shutdown() s_initialised=false; } +/*---------------------------------------------------------------------- + Function: + Purpose: Kills every CThing except the player + Params: + Returns: + ---------------------------------------------------------------------- */ +void CThingManager::killAllThingsForRespawn() +{ + int i; + CThing *thing; + + ASSERT(s_initialised); + for(i=0;ishutdown(); + delete thing; + } + } + } +} + /*---------------------------------------------------------------------- Function: Purpose: diff --git a/source/thing/thing.h b/source/thing/thing.h index d67fa6c86..e401fc8bd 100644 --- a/source/thing/thing.h +++ b/source/thing/thing.h @@ -52,6 +52,7 @@ class CThingManager public: static void init(); static void shutdown(); + static void killAllThingsForRespawn(); static void thinkAllThings(int _frames); static void renderAllThings();