diff --git a/makefile.gaz b/makefile.gaz index 2f7e9abb3..cc8ebacdd 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -139,6 +139,7 @@ hazard_src := hazard \ hbbarrel fx_src := fx \ + fxfallingtile \ fxjfish projectl_src := projectl \ diff --git a/source/level/layercollision.h b/source/level/layercollision.h index 26be923ca..0c639d2a1 100644 --- a/source/level/layercollision.h +++ b/source/level/layercollision.h @@ -26,6 +26,8 @@ virtual void shutdown(); int getHeightFromGround(int _x,int _y,int _maxHeight=32); int getCollisionBlock(int _x,int _y) {return Map[(_x>>4)+((_y>>4)*MapWidth)];} + u8 *getMapPtr(int _x,int _y) {return(&Map[(_x>>4)+((_y>>4)*MapWidth)]);} + #ifdef __SHOW_COLLISION__ void render(DVECTOR &MapPos); #endif diff --git a/source/level/layertile.h b/source/level/layertile.h index 2bf4e6d69..7ab240ed2 100644 --- a/source/level/layertile.h +++ b/source/level/layertile.h @@ -44,6 +44,8 @@ virtual void render(); int GetMapOfs() {return(MapXY.vx+(MapXY.vy*MapWidth));} virtual sTileMapElem *GetMapPos() {return(Map+GetMapOfs());} +virtual sTileMapElem *getMapPtr(int _x,int _y) {return(&Map[(_x>>4)+((_y>>4)*MapWidth)]);} + protected: sLayerHdr *LayerHdr; diff --git a/source/level/level.cpp b/source/level/level.cpp index 4da371283..805ff8b17 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -85,12 +85,12 @@ #include "game\gameslot.h" #endif +#include "fx\fx.h" +#include "fx\fxfallingtile.h" + /*****************************************************************************/ -extern int s_globalLevelSelectThing; - -/*****************************************************************************/ -sLvlTab LvlTable[]= + sLvlTab LvlTable[]= { // C1 {1,1, 21, LEVELS_CHAPTER01_LEVEL01_LVL,LEVELS_CHAPTER01_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL1}, @@ -128,7 +128,7 @@ sLvlTab LvlTable[]= {6,99, 0, LEVELS_FMA_SHADYSHOALS_LVL,LEVELS_FMA_SHADYSHOALS_TEX, CSoundMediator::SONG_TITLE}, }; -const static int LvlTableSize=sizeof(LvlTable)/sizeof(sLvlTab); +const int LvlTableSize=sizeof(LvlTable)/sizeof(sLvlTab); const FileEquate loadingScreens[6]= { @@ -141,38 +141,18 @@ const FileEquate loadingScreens[6]= }; /*****************************************************************************/ -DVECTOR CLevel::MapPos; -DVECTOR CLevel::s_playerSpawnPos; +DVECTOR CLevel::MapPos; +DVECTOR CLevel::s_playerSpawnPos; +sLevelHdr *CLevel::LevelHdr; u8 CLevel::m_isBossRespawn; s32 CLevel::m_bossHealth; + /*****************************************************************************/ CLevel::CLevel() { } -/*****************************************************************************/ -bool CLevel::GetNextLevel(int &Lvl) -{ -bool Finished=false; - Lvl++; -// TMP - if (Lvl>=LvlTableSize) Lvl=0; -// Skip Blanks - while (CFileIO::getFileSize(LvlTable[Lvl ].LevelFilename)<=10000) // Dodgy blank level skip - { - Lvl++; - if (Lvl>=LvlTableSize) Lvl=0; - } -// End TMP -/*** E3 Bodge ***/ -#if !defined(__USER_sbart__) - if (Lvl>2) Lvl=0; -#endif -/****************/ - return(Finished); -} - /*****************************************************************************/ void CLevel::init(int LevelNo) { @@ -205,6 +185,26 @@ sLvlTab *lvlTab=&LvlTable[LevelNo]; m_bossHealth = 0; } +/*****************************************************************************/ +bool CLevel::GetNextLevel(int &Lvl) +{ +bool Finished=false; + Lvl++; + + if (Lvl>=LvlTableSize) + { + Lvl=0; + Finished=true; + } +// End TMP +/*** E3 Bodge ***/ +#if !defined(__USER_sbart__) + if (Lvl>2) Lvl=0; +#endif +/****************/ + return(Finished); +} + /*****************************************************************************/ void CLevel::DisplayLoadingScreen(sLvlTab *lvlTab) { @@ -654,26 +654,64 @@ sLayerHdr *layer; /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -int CLevel::getCurrentChapter() +void CLevel::destroyMapArea(DVECTOR const &Pos) { - return( LvlTable[s_globalLevelSelectThing].Chapter ); +DVECTOR TL,BR; +const int ColT=COLLISION_TYPE_STICKY; + + + TL.vx=Pos.vx&-16;; + TL.vy=Pos.vy&-16;; + BR=TL; + + if (CollisionLayer->getCollisionBlock(TL.vx,TL.vy)>>COLLISION_TYPE_FLAG_SHIFT==ColT)printf ("!!"); + +// Left + while (CollisionLayer->getCollisionBlock(TL.vx-16,TL.vy)>>COLLISION_TYPE_FLAG_SHIFT==ColT) TL.vx-=16; +// Top + while (CollisionLayer->getCollisionBlock(TL.vx,TL.vy-16)>>COLLISION_TYPE_FLAG_SHIFT==ColT) TL.vy-=16; +// Right + while (CollisionLayer->getCollisionBlock(BR.vx+16,BR.vy)>>COLLISION_TYPE_FLAG_SHIFT==ColT) BR.vx+=16; +// Bottom + while (CollisionLayer->getCollisionBlock(BR.vx,BR.vy+16)>>COLLISION_TYPE_FLAG_SHIFT==ColT) BR.vy+=16; + +DVECTOR DP; + + for (DP.vy=TL.vy; DP.vy<=BR.vy; DP.vy+=16) + { + for (DP.vx=TL.vx; DP.vx<=BR.vx; DP.vx+=16) + { + u8 *ColElem=CollisionLayer->getMapPtr(DP.vx,DP.vy); + + if (*ColElem>>COLLISION_TYPE_FLAG_SHIFT==COLLISION_TYPE_STICKY) + { + sTileMapElem *MapElem=TileLayers[CLayerTile::LAYER_TILE_TYPE_ACTION]->getMapPtr(DP.vx,DP.vy); + CFXFallingTile *FX=(CFXFallingTile*)CFX::Create(CFX::FX_TYPE_FALLINGTILE,DP); + FX->SetTile(MapElem->Tile); + MapElem->Tile=0; + *ColElem=0; + + } + + } + } } /*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -int CLevel::getCurrentChapterLevel() +void CLevel::destroyMapTile(DVECTOR const &Pos) { - return( LvlTable[s_globalLevelSelectThing].Level ); +u8 *ColElem=CollisionLayer->getMapPtr(Pos.vx,Pos.vy); +sTileMapElem *MapElem=TileLayers[CLayerTile::LAYER_TILE_TYPE_ACTION]->getMapPtr(Pos.vx,Pos.vy); + +// *ColElem=0; + + if (MapElem->Tile) + { + CFXFallingTile *FX=(CFXFallingTile*)CFX::Create(CFX::FX_TYPE_FALLINGTILE,Pos); + FX->SetTile(MapElem->Tile); + MapElem->Tile=0; + + } + } -/*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -int CLevel::getTotalSpatCount() -{ - return( LvlTable[s_globalLevelSelectThing].totalSpatCount); -} - - -/*****************************************************************************/ diff --git a/source/level/level.h b/source/level/level.h index 240659ecf..750b700ed 100644 --- a/source/level/level.h +++ b/source/level/level.h @@ -10,8 +10,6 @@ #include "level/layercollision.h" /*****************************************************************************/ -// Woo.. this is getting big now isn't it? -// Nope.. it's shrunk again! :) struct sLvlTab { u16 Chapter,Level; @@ -20,6 +18,10 @@ struct sLvlTab int songId; }; +/*****************************************************************************/ +extern int s_globalLevelSelectThing; +extern sLvlTab LvlTable[]; + /*****************************************************************************/ class CLayer; class CLevel @@ -27,74 +29,78 @@ class CLevel public: CLevel(); // Scene Handlers - void init(int LevelNo); - void shutdown(); - void render(); - void think(int _frames); + void init(int LevelNo); + void shutdown(); + void render(); + void think(int _frames); - void setCameraCentre(DVECTOR _pos) {MapPos=_pos;} -static DVECTOR const &getCameraPos() {return MapPos;} -static DVECTOR const &getPlayerSpawnPos() {return s_playerSpawnPos;} + void setCameraCentre(DVECTOR _pos) {MapPos=_pos;} +static DVECTOR const &getCameraPos() {return MapPos;} +static DVECTOR const &getPlayerSpawnPos() {return s_playerSpawnPos;} -static int getCurrentChapter(); -static int getCurrentChapterLevel(); -static int getTotalSpatCount(); +static int getCurrentChapter() {return( LvlTable[s_globalLevelSelectThing].Chapter );} +static int getCurrentChapterLevel() {return( LvlTable[s_globalLevelSelectThing].Level);} +static int getTotalSpatCount() {return( LvlTable[s_globalLevelSelectThing].totalSpatCount);} - int getActorCount() {return ActorCount;} - sThingActor **getActorList() {return ActorList;} - int getPlatformCount() {return PlatformCount;} - sThingPlatform **getPlatformList() {return PlatformList;} - int getHazardCount() {return HazardCount;} - sThingHazard **getHazardList() {return HazardList;} + void destroyMapArea(DVECTOR const &Pos); + void destroyMapTile(DVECTOR const &Pos); - CLayerCollision *getCollisionLayer() {return CollisionLayer;} - DVECTOR getMapSize(); + int getActorCount() {return ActorCount;} + sThingActor **getActorList() {return ActorList;} + int getPlatformCount() {return PlatformCount;} + sThingPlatform **getPlatformList() {return PlatformList;} + int getHazardCount() {return HazardCount;} + sThingHazard **getHazardList() {return HazardList;} - bool GetNextLevel(int &Lvl); + CLayerCollision *getCollisionLayer() {return CollisionLayer;} + DVECTOR getMapSize(); - void respawnLevel(); + bool GetNextLevel(int &Lvl); + + void respawnLevel(); +static sLevelHdr *getLevelHdr() {return(LevelHdr);} + +static u8 getIsBossRespawn() {return m_isBossRespawn;} +static s32 getBossHealth() {return m_bossHealth;} +static void setIsBossRespawn( u8 newIsBossRespawn) {m_isBossRespawn=newIsBossRespawn;} +static void setBossHealth( s32 newBossHealth ) {m_bossHealth=newBossHealth;} -static u8 getIsBossRespawn() {return m_isBossRespawn;} -static s32 getBossHealth() {return m_bossHealth;} -static void setIsBossRespawn( u8 newIsBossRespawn ) {m_isBossRespawn=newIsBossRespawn;} -static void setBossHealth( s32 newBossHealth ) {m_bossHealth=newBossHealth;} - private: - void initLayers(); - void initThings(int _respawningLevel); + void initLayers(); + void initThings(int _respawningLevel); - void DisplayLoadingScreen(sLvlTab *lvlTab); + void DisplayLoadingScreen(sLvlTab *lvlTab); - sLevelHdr *LevelHdr; +static sLevelHdr *LevelHdr; - static DVECTOR MapPos; - static DVECTOR s_playerSpawnPos; - - TPAGE_DESC m_levelTPage; +static DVECTOR MapPos; +static DVECTOR s_playerSpawnPos; + TPAGE_DESC m_levelTPage; // Tile Layers - CLayerTile *TileLayers[CLayerTile::LAYER_TILE_TYPE_MAX]; + CLayerTile *TileLayers[CLayerTile::LAYER_TILE_TYPE_MAX]; // Collision - CLayerCollision *CollisionLayer; + CLayerCollision *CollisionLayer; // Things - int ActorCount; - sThingActor **ActorList; - int ItemCount; - sThingItem *ItemList; - int PlatformCount; - sThingPlatform **PlatformList; - int TriggerCount; - sThingTrigger *TriggerList; - int FXCount; - sThingFX *FXList; - int HazardCount; - sThingHazard **HazardList; + int ActorCount; + sThingActor **ActorList; + int ItemCount; + sThingItem *ItemList; + int PlatformCount; + sThingPlatform **PlatformList; + int TriggerCount; + sThingTrigger *TriggerList; + int FXCount; + sThingFX *FXList; + int HazardCount; + sThingHazard **HazardList; + +static u8 m_isBossRespawn; +static s32 m_bossHealth; - static u8 m_isBossRespawn; - static s32 m_bossHealth; };