|
|
|
@ -26,6 +26,7 @@ std::vector<Monster>MONSTER_LIST; |
|
|
|
|
std::vector<MonsterSpawner>SPAWNER_LIST; |
|
|
|
|
std::vector<std::shared_ptr<DamageNumber>>DAMAGENUMBER_LIST; |
|
|
|
|
std::vector<std::unique_ptr<Bullet>>BULLET_LIST; |
|
|
|
|
safemap<std::string,MapName>LEVEL_NAMES; |
|
|
|
|
utils::datafile DATA; |
|
|
|
|
Crawler*game; |
|
|
|
|
|
|
|
|
@ -68,14 +69,7 @@ Crawler::Crawler() |
|
|
|
|
|
|
|
|
|
bool Crawler::OnUserCreate(){ |
|
|
|
|
|
|
|
|
|
#define INITLEVEL(map) InitializeLevel("map_path"_S + "Levels."#map ## _S,map); |
|
|
|
|
|
|
|
|
|
INITLEVEL(WORLD_MAP); |
|
|
|
|
|
|
|
|
|
INITLEVEL(CAMPAIGN_1_1); |
|
|
|
|
INITLEVEL(BOSS_1); |
|
|
|
|
|
|
|
|
|
INITLEVEL(CAMPAIGN_1_2); |
|
|
|
|
InitializeLevels(); |
|
|
|
|
|
|
|
|
|
player=std::make_unique<Warrior>(); |
|
|
|
|
|
|
|
|
@ -129,7 +123,7 @@ bool Crawler::OnUserCreate(){ |
|
|
|
|
sig::Animation::SetupPlayerAnimations(); |
|
|
|
|
view=TileTransformedView{GetScreenSize(),{1,1}}; |
|
|
|
|
|
|
|
|
|
LoadLevel(BOSS_1); |
|
|
|
|
LoadLevel(LEVEL_NAMES["starting_map"_S]); |
|
|
|
|
InitializeClasses(); |
|
|
|
|
ChangePlayerClass(WARRIOR); |
|
|
|
|
Warrior::ability4=Ranger::ability1; //Class ability swapping demonstration.
|
|
|
|
@ -926,69 +920,42 @@ void Crawler::LoadLevel(MapName map){ |
|
|
|
|
int tileSheetX=tileSheetIndex%tileSheetWidth; |
|
|
|
|
int tileSheetY=tileSheetIndex/tileSheetWidth; |
|
|
|
|
#pragma region TileGroupShenanigans |
|
|
|
|
TileRenderData tile={tileSheet.tileset.tileset->Decal(),vi2d{x,y}*24,vi2d{tileSheetX,tileSheetY}*24}; |
|
|
|
|
if(IsForegroundTile(tileSheet,tileSheetIndex)&&foregroundTilesAdded.find({x,y})==foregroundTilesAdded.end()){ |
|
|
|
|
std::queue<vi2d>tileGroupChecks; |
|
|
|
|
TileGroup group; |
|
|
|
|
foregroundTilesAdded.insert({x,y}); |
|
|
|
|
group.InsertTile(tile); |
|
|
|
|
if(x>0)tileGroupChecks.push({x-1,y}); |
|
|
|
|
if(x<WORLD_SIZE.x-1)tileGroupChecks.push({x+1,y}); |
|
|
|
|
if(y>0)tileGroupChecks.push({x,y-1}); |
|
|
|
|
if(y<WORLD_SIZE.y-1)tileGroupChecks.push({x,y+1}); |
|
|
|
|
while(!tileGroupChecks.empty()){ |
|
|
|
|
vi2d&pos=tileGroupChecks.front(); |
|
|
|
|
tileGroupChecks.pop(); |
|
|
|
|
int tileID=layer.tiles[pos.y][pos.x]-1; |
|
|
|
|
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); |
|
|
|
|
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/24; |
|
|
|
|
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/24; |
|
|
|
|
int tileSheetIndex=tileID-(tileSheet.firstgid-1); |
|
|
|
|
int tileSheetX=tileSheetIndex%tileSheetWidth; |
|
|
|
|
int tileSheetY=tileSheetIndex/tileSheetWidth; |
|
|
|
|
TileRenderData tile={tileSheet.tileset.tileset->Decal(),pos*24,vi2d{tileSheetX,tileSheetY}*24}; |
|
|
|
|
if(IsForegroundTile(tileSheet,tileSheetIndex)&&foregroundTilesAdded.find(pos)==foregroundTilesAdded.end()){ |
|
|
|
|
foregroundTilesAdded.insert(pos); |
|
|
|
|
group.InsertTile(tile); |
|
|
|
|
if(pos.x>0)tileGroupChecks.push(pos+vi2d{-1,0}); |
|
|
|
|
if(pos.x<WORLD_SIZE.x-1)tileGroupChecks.push(pos+vi2d{1,0}); |
|
|
|
|
if(pos.y>0)tileGroupChecks.push(pos+vi2d{0,-1}); |
|
|
|
|
if(pos.y<WORLD_SIZE.y-1)tileGroupChecks.push(pos+vi2d{0,1}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
foregroundTileGroups.push_back(group); |
|
|
|
|
} else |
|
|
|
|
if(IsUpperForegroundTile(tileSheet,tileSheetIndex)&&upperForegroundTilesAdded.find({x,y})==upperForegroundTilesAdded.end()){ |
|
|
|
|
std::queue<vi2d>tileGroupChecks; |
|
|
|
|
TileGroup group; |
|
|
|
|
upperForegroundTilesAdded.insert({x,y}); |
|
|
|
|
group.InsertTile(tile); |
|
|
|
|
if(x>0)tileGroupChecks.push({x-1,y}); |
|
|
|
|
if(x<WORLD_SIZE.x-1)tileGroupChecks.push({x+1,y}); |
|
|
|
|
if(y>0)tileGroupChecks.push({x,y-1}); |
|
|
|
|
if(y<WORLD_SIZE.y-1)tileGroupChecks.push({x,y+1}); |
|
|
|
|
while(!tileGroupChecks.empty()){ |
|
|
|
|
vi2d&pos=tileGroupChecks.front(); |
|
|
|
|
tileGroupChecks.pop(); |
|
|
|
|
int tileID=layer.tiles[pos.y][pos.x]-1; |
|
|
|
|
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); |
|
|
|
|
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/24; |
|
|
|
|
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/24; |
|
|
|
|
int tileSheetIndex=tileID-(tileSheet.firstgid-1); |
|
|
|
|
int tileSheetX=tileSheetIndex%tileSheetWidth; |
|
|
|
|
int tileSheetY=tileSheetIndex/tileSheetWidth; |
|
|
|
|
TileRenderData tile={tileSheet.tileset.tileset->Decal(),pos*24,vi2d{tileSheetX,tileSheetY}*24}; |
|
|
|
|
if(IsUpperForegroundTile(tileSheet,tileSheetIndex)&&upperForegroundTilesAdded.find(pos)==upperForegroundTilesAdded.end()){ |
|
|
|
|
upperForegroundTilesAdded.insert(pos); |
|
|
|
|
group.InsertTile(tile); |
|
|
|
|
if(pos.x>0)tileGroupChecks.push(pos+vi2d{-1,0}); |
|
|
|
|
if(pos.x<WORLD_SIZE.x-1)tileGroupChecks.push(pos+vi2d{1,0}); |
|
|
|
|
if(pos.y>0)tileGroupChecks.push(pos+vi2d{0,-1}); |
|
|
|
|
if(pos.y<WORLD_SIZE.y-1)tileGroupChecks.push(pos+vi2d{0,1}); |
|
|
|
|
auto SetupTileGroups=[&](std::function<bool(TilesheetData,int)>IsForeground,TileRenderData tile,std::set<vi2d>&foregroundTilesIncluded,std::vector<TileGroup>&groups){ |
|
|
|
|
if(IsForeground(tileSheet,tileSheetIndex)&&foregroundTilesIncluded.find({x,y})==foregroundTilesIncluded.end()){ |
|
|
|
|
std::queue<vi2d>tileGroupChecks; |
|
|
|
|
TileGroup group; |
|
|
|
|
foregroundTilesIncluded.insert({x,y}); |
|
|
|
|
group.InsertTile(tile); |
|
|
|
|
if(x>0)tileGroupChecks.push({x-1,y}); |
|
|
|
|
if(x<WORLD_SIZE.x-1)tileGroupChecks.push({x+1,y}); |
|
|
|
|
if(y>0)tileGroupChecks.push({x,y-1}); |
|
|
|
|
if(y<WORLD_SIZE.y-1)tileGroupChecks.push({x,y+1}); |
|
|
|
|
while(!tileGroupChecks.empty()){ |
|
|
|
|
vi2d&pos=tileGroupChecks.front(); |
|
|
|
|
tileGroupChecks.pop(); |
|
|
|
|
int tileID=layer.tiles[pos.y][pos.x]-1; |
|
|
|
|
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); |
|
|
|
|
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/24; |
|
|
|
|
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/24; |
|
|
|
|
int tileSheetIndex=tileID-(tileSheet.firstgid-1); |
|
|
|
|
int tileSheetX=tileSheetIndex%tileSheetWidth; |
|
|
|
|
int tileSheetY=tileSheetIndex/tileSheetWidth; |
|
|
|
|
TileRenderData tile={tileSheet.tileset.tileset->Decal(),pos*24,vi2d{tileSheetX,tileSheetY}*24}; |
|
|
|
|
if(IsForegroundTile(tileSheet,tileSheetIndex)&&foregroundTilesIncluded.find(pos)==foregroundTilesIncluded.end()){ |
|
|
|
|
foregroundTilesIncluded.insert(pos); |
|
|
|
|
group.InsertTile(tile); |
|
|
|
|
if(pos.x>0)tileGroupChecks.push(pos+vi2d{-1,0}); |
|
|
|
|
if(pos.x<WORLD_SIZE.x-1)tileGroupChecks.push(pos+vi2d{1,0}); |
|
|
|
|
if(pos.y>0)tileGroupChecks.push(pos+vi2d{0,-1}); |
|
|
|
|
if(pos.y<WORLD_SIZE.y-1)tileGroupChecks.push(pos+vi2d{0,1}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
groups.push_back(group); |
|
|
|
|
} |
|
|
|
|
upperForegroundTileGroups.push_back(group); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
TileRenderData tile={tileSheet.tileset.tileset->Decal(),vi2d{x,y}*24,vi2d{tileSheetX,tileSheetY}*24}; |
|
|
|
|
SetupTileGroups([&](TilesheetData sheet,int tileID){return IsForegroundTile(sheet,tileID);},tile,foregroundTilesAdded,foregroundTileGroups); |
|
|
|
|
SetupTileGroups([&](TilesheetData sheet,int tileID){return IsUpperForegroundTile(sheet,tileID);},tile,foregroundTilesAdded,foregroundTileGroups); |
|
|
|
|
#pragma endregion |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1242,3 +1209,16 @@ void Crawler::OutputDebugInfo(const char*key,std::size_t len){ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Crawler::InitializeLevels(){ |
|
|
|
|
#define INITLEVEL(map) \ |
|
|
|
|
InitializeLevel("map_path"_S + "Levels."#map ## _S,map); \
|
|
|
|
|
LEVEL_NAMES[#map]=map; |
|
|
|
|
|
|
|
|
|
INITLEVEL(WORLD_MAP); |
|
|
|
|
INITLEVEL(CAMPAIGN_1_1); |
|
|
|
|
INITLEVEL(BOSS_1); |
|
|
|
|
INITLEVEL(CAMPAIGN_1_2); |
|
|
|
|
|
|
|
|
|
LEVEL_NAMES.SetInitialized(); |
|
|
|
|
} |