Added a non-foreground dark tile for bridges to place below areas that are above ground shadow tiles. Redesigned how reference tilesets were stored in TilesheetData and TilesetData structures such that they could be std::sort'd without causing reference bugs/glitches. Release Build 10217.

mac-build
sigonasr2 4 months ago
parent 6172ea3178
commit c656b935e1
  1. 166
      Adventures in Lestoria/AdventuresInLestoria.cpp
  2. 1
      Adventures in Lestoria/AdventuresInLestoria.h
  3. 6
      Adventures in Lestoria/Map.cpp
  4. 17
      Adventures in Lestoria/Map.h
  5. 2
      Adventures in Lestoria/Version.h
  6. 6
      Adventures in Lestoria/assets/Campaigns/1_1_v2.tmx
  7. 14
      Adventures in Lestoria/assets/Campaigns/2_5.tmx
  8. BIN
      Adventures in Lestoria/assets/gamepack.pak
  9. BIN
      x64/Release/Adventures in Lestoria.exe

@ -455,8 +455,8 @@ void AiL::HandleUserInput(float fElapsedTime){
int truncatedPlayerY=int(player->GetY())/game->GetCurrentMapData().tilewidth; int truncatedPlayerY=int(player->GetY())/game->GetCurrentMapData().tilewidth;
int tileID=layer.tiles[truncatedPlayerY][truncatedPlayerX]; int tileID=layer.tiles[truncatedPlayerY][truncatedPlayerX];
TilesheetData dat=GetTileSheet(GetCurrentLevel(),tileID); TilesheetData dat=GetTileSheet(GetCurrentLevel(),tileID);
if (dat.tileset.staircaseTiles.find(tileID)!=dat.tileset.staircaseTiles.end()){ if(MAP_TILESETS.at(dat.tilesetName).staircaseTiles.find(tileID)!=MAP_TILESETS.at(dat.tilesetName).staircaseTiles.end()){
return dat.tileset.staircaseTiles.at(tileID).data.at("value"); return MAP_TILESETS.at(dat.tilesetName).staircaseTiles.at(tileID).data.at("value");
} }
} }
return std::string("NONE"); return std::string("NONE");
@ -955,55 +955,55 @@ void AiL::PopulateRenderLists(){
void AiL::RenderTile(vi2d pos,TilesheetData tileSheet,int tileSheetIndex,vi2d tileSheetPos){ void AiL::RenderTile(vi2d pos,TilesheetData tileSheet,int tileSheetIndex,vi2d tileSheetPos){
Pixel tempCol=worldColorFunc(pos*game->GetCurrentMapData().tilewidth); Pixel tempCol=worldColorFunc(pos*game->GetCurrentMapData().tilewidth);
if(tileSheet.tileset.animationData.count(tileSheetIndex)){ if(MAP_TILESETS.at(tileSheet.tilesetName).animationData.count(tileSheetIndex)){
int animationDuration_ms=int(tileSheet.tileset.animationData.at(tileSheetIndex).size()*"animation_tile_precision"_I); int animationDuration_ms=int(MAP_TILESETS.at(tileSheet.tilesetName).animationData.at(tileSheetIndex).size()*"animation_tile_precision"_I);
int animatedIndex=tileSheet.tileset.animationData.at(tileSheetIndex)[size_t(fmod(levelTime*1000.f,animationDuration_ms)/"animation_tile_precision"_I)]; int animatedIndex=MAP_TILESETS.at(tileSheet.tilesetName).animationData.at(tileSheetIndex)[size_t(fmod(levelTime*1000.f,animationDuration_ms)/"animation_tile_precision"_I)];
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetX=animatedIndex%tileSheetWidth; int tileSheetX=animatedIndex%tileSheetWidth;
int tileSheetY=animatedIndex/tileSheetWidth; int tileSheetY=animatedIndex/tileSheetWidth;
if(tileSheet.tileset.tileRepeatData.count(tileSheetIndex)){ if(MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.count(tileSheetIndex)){
for(int y=0;y<tileSheet.tileset.tileRepeatData.at(tileSheetIndex).y;y++){ for(int y=0;y<MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex).y;y++){
for(int x=0;x<tileSheet.tileset.tileRepeatData.at(tileSheetIndex).x;x++){ for(int x=0;x<MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex).x;x++){
view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth+vf2d{float(x),float(y)}*game->GetCurrentMapData().tilewidth/vf2d{tileSheet.tileset.tileRepeatData.at(tileSheetIndex)},vf2d{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)}/vf2d{tileSheet.tileset.tileRepeatData.at(tileSheetIndex)},tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*tileSheet.tileset.tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tempCol); view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth+vf2d{float(x),float(y)}*game->GetCurrentMapData().tilewidth/vf2d{MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex)},vf2d{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)}/vf2d{MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex)},MAP_TILESETS.at(tileSheet.tilesetName).tileset->Decal(),vi2d{tileSheetX,tileSheetY}*MAP_TILESETS.at(tileSheet.tilesetName).tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},tempCol);
} }
} }
}else view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*tileSheet.tileset.tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tempCol); }else view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tilesetName).tileset->Decal(),vi2d{tileSheetX,tileSheetY}*MAP_TILESETS.at(tileSheet.tilesetName).tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},tempCol);
}else{ }else{
if(tileSheet.tileset.tileRepeatData.count(tileSheetIndex)){ if(MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.count(tileSheetIndex)){
for(int y=0;y<tileSheet.tileset.tileRepeatData.at(tileSheetIndex).y;y++){ for(int y=0;y<MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex).y;y++){
for(int x=0;x<tileSheet.tileset.tileRepeatData.at(tileSheetIndex).x;x++){ for(int x=0;x<MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex).x;x++){
view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth+vi2d{x,y}*game->GetCurrentMapData().tilewidth/tileSheet.tileset.tileRepeatData.at(tileSheetIndex),{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tileSheet.tileset.tileset->Decal(),tileSheetPos*tileSheet.tileset.tilewidth,vf2d{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)}/tileSheet.tileset.tileRepeatData.at(tileSheetIndex),tempCol); view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth+vi2d{x,y}*game->GetCurrentMapData().tilewidth/MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex),{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tilesetName).tileset->Decal(),tileSheetPos*MAP_TILESETS.at(tileSheet.tilesetName).tilewidth,vf2d{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)}/MAP_TILESETS.at(tileSheet.tilesetName).tileRepeatData.at(tileSheetIndex),tempCol);
} }
} }
}else{ }else{
view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tileSheet.tileset.tileset->Decal(),tileSheetPos*tileSheet.tileset.tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tempCol); view.DrawPartialDecal(pos*game->GetCurrentMapData().tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tilesetName).tileset->Decal(),tileSheetPos*MAP_TILESETS.at(tileSheet.tilesetName).tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},tempCol);
if("debug_tileIDs"_I)view.DrawStringDecal(pos*game->GetCurrentMapData().tilewidth,std::to_string(tileSheetIndex)); if("debug_tileIDs"_I)view.DrawStringDecal(pos*game->GetCurrentMapData().tilewidth,std::to_string(tileSheetIndex));
} }
} }
} }
void AiL::RenderTile(TileRenderData&tileSheet,Pixel col){ void AiL::RenderTile(TileRenderData&tileSheet,Pixel col){
if(tileSheet.tileSheet.tileset.animationData.count(tileSheet.tileID%1000000)){ if(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).animationData.count(tileSheet.tileID%1000000)){
int animationDuration_ms=int(tileSheet.tileSheet.tileset.animationData.at(tileSheet.tileID%1000000).size()*"animation_tile_precision"_I); int animationDuration_ms=int(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).animationData.at(tileSheet.tileID%1000000).size()*"animation_tile_precision"_I);
int animatedIndex=tileSheet.tileSheet.tileset.animationData.at(tileSheet.tileID%1000000)[size_t(fmod(levelTime*1000.f,animationDuration_ms)/"animation_tile_precision"_I)]; int animatedIndex=MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).animationData.at(tileSheet.tileID%1000000)[size_t(fmod(levelTime*1000.f,animationDuration_ms)/"animation_tile_precision"_I)];
int tileSheetWidth=tileSheet.tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth;
int tileSheetX=animatedIndex%tileSheetWidth; int tileSheetX=animatedIndex%tileSheetWidth;
int tileSheetY=animatedIndex/tileSheetWidth; int tileSheetY=animatedIndex/tileSheetWidth;
if(tileSheet.tileSheet.tileset.tileRepeatData.count(animatedIndex)){ if(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.count(animatedIndex)){
for(int y=0;y<tileSheet.tileSheet.tileset.tileRepeatData.at(animatedIndex).y;y++){ for(int y=0;y<MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(animatedIndex).y;y++){
for(int x=0;x<tileSheet.tileSheet.tileset.tileRepeatData.at(animatedIndex).x;x++){ for(int x=0;x<MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(animatedIndex).x;x++){
view.DrawPartialDecal(tileSheet.pos+vi2d{x,y}*game->GetCurrentMapData().tilewidth/tileSheet.tileSheet.tileset.tileRepeatData.at(animatedIndex),{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},tileSheet.tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*vf2d{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},vf2d{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)}/tileSheet.tileSheet.tileset.tileRepeatData.at(animatedIndex),col); view.DrawPartialDecal(tileSheet.pos+vi2d{x,y}*game->GetCurrentMapData().tilewidth/MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(animatedIndex),{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileset->Decal(),vi2d{tileSheetX,tileSheetY}*vf2d{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},vf2d{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)}/MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(animatedIndex),col);
} }
} }
}else view.DrawPartialDecal(tileSheet.pos,{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},tileSheet.tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*vf2d{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},col); }else view.DrawPartialDecal(tileSheet.pos,{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileset->Decal(),vi2d{tileSheetX,tileSheetY}*vf2d{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},col);
}else{ }else{
if(tileSheet.tileSheet.tileset.tileRepeatData.count(tileSheet.tileID)){ if(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.count(tileSheet.tileID)){
for(int y=0;y<tileSheet.tileSheet.tileset.tileRepeatData.at(tileSheet.tileID).y;y++){ for(int y=0;y<MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(tileSheet.tileID).y;y++){
for(int x=0;x<tileSheet.tileSheet.tileset.tileRepeatData.at(tileSheet.tileID).x;x++){ for(int x=0;x<MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(tileSheet.tileID).x;x++){
view.DrawPartialDecal(tileSheet.pos+vi2d{x,y}*game->GetCurrentMapData().tilewidth/tileSheet.tileSheet.tileset.tileRepeatData.at(tileSheet.tileID),{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},tileSheet.tileSheet.tileset.tileset->Decal(),tileSheet.tileSheetPos,vf2d{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)}/tileSheet.tileSheet.tileset.tileRepeatData.at(tileSheet.tileID),col); view.DrawPartialDecal(tileSheet.pos+vi2d{x,y}*game->GetCurrentMapData().tilewidth/MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(tileSheet.tileID),{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileset->Decal(),tileSheet.tileSheetPos,vf2d{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)}/MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileRepeatData.at(tileSheet.tileID),col);
} }
} }
}else view.DrawPartialDecal(tileSheet.pos,{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},tileSheet.tileSheet.tileset.tileset->Decal(),tileSheet.tileSheetPos,{float(tileSheet.tileSheet.tileset.tilewidth),float(tileSheet.tileSheet.tileset.tileheight)},col); }else view.DrawPartialDecal(tileSheet.pos,{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileset->Decal(),tileSheet.tileSheetPos,{float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tileSheet.tilesetName).tileheight)},col);
} }
} }
@ -1136,8 +1136,8 @@ void AiL::RenderWorld(float fElapsedTime){
int tileID=layer.tiles[y][x]-1; int tileID=layer.tiles[y][x]-1;
if(tileID!=-1){ if(tileID!=-1){
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); TilesheetData tileSheet=GetTileSheet(currentLevel,tileID);
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/tileSheet.tileset.tileheight; int tileSheetHeight=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->height/MAP_TILESETS.at(tileSheet.tilesetName).tileheight;
int tileSheetIndex=tileID-(tileSheet.firstgid-1); int tileSheetIndex=tileID-(tileSheet.firstgid-1);
int tileSheetX=tileSheetIndex%tileSheetWidth; int tileSheetX=tileSheetIndex%tileSheetWidth;
int tileSheetY=tileSheetIndex/tileSheetWidth; int tileSheetY=tileSheetIndex/tileSheetWidth;
@ -1147,8 +1147,8 @@ void AiL::RenderWorld(float fElapsedTime){
#pragma region Debug Collision boxes #pragma region Debug Collision boxes
#ifdef _DEBUG #ifdef _DEBUG
if("debug_collision_boxes"_I){ if("debug_collision_boxes"_I){
if(tileSheet.tileset.collision.find(tileSheetIndex)!=tileSheet.tileset.collision.end()){ if(MAP_TILESETS.at(tileSheet.tilesetName).collision.find(tileSheetIndex)!=MAP_TILESETS.at(tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tileSheet.tileset).collision.at(tileSheetIndex).collision; const geom2d::rect<float>collision=const_cast<TilesetData&>(MAP_TILESETS.at(tileSheet.tilesetName)).collision.at(tileSheetIndex).collision;
view.FillRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128}); view.FillRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128});
view.DrawRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY); view.DrawRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY);
} }
@ -1167,8 +1167,8 @@ void AiL::RenderWorld(float fElapsedTime){
int tileID=layer.tiles[y][x]-1; int tileID=layer.tiles[y][x]-1;
if(tileID!=-1){ if(tileID!=-1){
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); TilesheetData tileSheet=GetTileSheet(currentLevel,tileID);
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/tileSheet.tileset.tileheight; int tileSheetHeight=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->height/MAP_TILESETS.at(tileSheet.tilesetName).tileheight;
int tileSheetIndex=tileID-(tileSheet.firstgid-1); int tileSheetIndex=tileID-(tileSheet.firstgid-1);
int tileSheetX=tileSheetIndex%tileSheetWidth; int tileSheetX=tileSheetIndex%tileSheetWidth;
int tileSheetY=tileSheetIndex/tileSheetWidth; int tileSheetY=tileSheetIndex/tileSheetWidth;
@ -1178,8 +1178,8 @@ void AiL::RenderWorld(float fElapsedTime){
} }
#ifdef _DEBUG #ifdef _DEBUG
if("debug_collision_boxes"_I){ if("debug_collision_boxes"_I){
if(tileSheet.tileset.collision.find(tileSheetIndex)!=tileSheet.tileset.collision.end()){ if(MAP_TILESETS.at(tileSheet.tilesetName).collision.find(tileSheetIndex)!=MAP_TILESETS.at(tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tileSheet.tileset).collision.at(tileSheetIndex).collision; const geom2d::rect<float>collision=const_cast<TilesetData&>(MAP_TILESETS.at(tileSheet.tilesetName)).collision.at(tileSheetIndex).collision;
view.FillRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128}); view.FillRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128});
view.DrawRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY); view.DrawRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY);
} }
@ -1282,12 +1282,12 @@ void AiL::RenderWorld(float fElapsedTime){
tile.group=&group; tile.group=&group;
#pragma region Unhiding tile detection #pragma region Unhiding tile detection
auto it=tile.tileSheet.tileset.foregroundTiles.find(tile.tileID); //We're looking for tiles that are marked as should not be faded away by a tile group. auto it=MAP_TILESETS.at(tile.tileSheet.tilesetName).foregroundTiles.find(tile.tileID); //We're looking for tiles that are marked as should not be faded away by a tile group.
if(it!=tile.tileSheet.tileset.foregroundTiles.end()){ if(it!=MAP_TILESETS.at(tile.tileSheet.tilesetName).foregroundTiles.end()){
if(!(*it).second.hide)tile.tileOpacity=0.f; if(!(*it).second.hide)tile.tileOpacity=0.f;
} }
#pragma endregion #pragma endregion
if(tile.tileSheet.tileset.collision.find(tile.tileID)!=tile.tileSheet.tileset.collision.end()){ if(MAP_TILESETS.at(tile.tileSheet.tilesetName).collision.find(tile.tileID)!=MAP_TILESETS.at(tile.tileSheet.tilesetName).collision.end()){
tilesWithCollision.push_back(&tile); tilesWithCollision.push_back(&tile);
}else{ }else{
tilesWithoutCollision.push_back(&tile); //Tiles without collision are assumed to always be in the foreground. They don't have any depth rules. tilesWithoutCollision.push_back(&tile); //Tiles without collision are assumed to always be in the foreground. They don't have any depth rules.
@ -1438,8 +1438,8 @@ void AiL::RenderWorld(float fElapsedTime){
#pragma endregion #pragma endregion
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)}); RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length(); float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
if(GameSettings::TerrainCollisionBoxesEnabled()&&distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset.collision.find(tile->tileID)!=tile->tileSheet.tileset.collision.end()){ if(GameSettings::TerrainCollisionBoxesEnabled()&&distToPlayer<24*3&&tile->tileOpacity>0&&MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.find(tile->tileID)!=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tile->tileSheet.tileset).collision.at(tile->tileID).collision; const geom2d::rect<float>collision=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.at(tile->tileID).collision;
distToPlayer/=4; distToPlayer/=4;
if(distToPlayer<1){distToPlayer=1;} if(distToPlayer<1){distToPlayer=1;}
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))}); view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
@ -1498,8 +1498,8 @@ void AiL::RenderWorld(float fElapsedTime){
for(TileRenderData*tile:tilesWithoutCollision){ for(TileRenderData*tile:tilesWithoutCollision){
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)}); RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length(); float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset.collision.find(tile->tileID)!=tile->tileSheet.tileset.collision.end()){ if(distToPlayer<24*3&&tile->tileOpacity>0&&MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.find(tile->tileID)!=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tile->tileSheet.tileset).collision.at(tile->tileID).collision; const geom2d::rect<float>collision=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.at(tile->tileID).collision;
distToPlayer/=4; distToPlayer/=4;
if(distToPlayer<1){distToPlayer=1;} if(distToPlayer<1){distToPlayer=1;}
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))}); view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
@ -1527,16 +1527,16 @@ void AiL::RenderWorld(float fElapsedTime){
int tileID=bridgeLayer->tiles[y][x]-1; int tileID=bridgeLayer->tiles[y][x]-1;
if(tileID!=-1){ if(tileID!=-1){
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); TilesheetData tileSheet=GetTileSheet(currentLevel,tileID);
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/tileSheet.tileset.tileheight; int tileSheetHeight=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->height/MAP_TILESETS.at(tileSheet.tilesetName).tileheight;
int tileSheetIndex=tileID-(tileSheet.firstgid-1); int tileSheetIndex=tileID-(tileSheet.firstgid-1);
int tileSheetX=tileSheetIndex%tileSheetWidth; int tileSheetX=tileSheetIndex%tileSheetWidth;
int tileSheetY=tileSheetIndex/tileSheetWidth; int tileSheetY=tileSheetIndex/tileSheetWidth;
view.DrawPartialDecal(vi2d{x,y}*game->GetCurrentMapData().tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*game->GetCurrentMapData().tilewidth,{float(tileSheet.tileset.tilewidth),float(tileSheet.tileset.tileheight)},{255,255,255,uint8_t(255-bridgeFadeFactor/TileGroup::FADE_TIME*TileGroup::FADE_AMT)}); view.DrawPartialDecal(vi2d{x,y}*game->GetCurrentMapData().tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},MAP_TILESETS.at(tileSheet.tilesetName).tileset->Decal(),vi2d{tileSheetX,tileSheetY}*game->GetCurrentMapData().tilewidth,{float(MAP_TILESETS.at(tileSheet.tilesetName).tilewidth),float(MAP_TILESETS.at(tileSheet.tilesetName).tileheight)},{255,255,255,uint8_t(255-bridgeFadeFactor/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
#ifdef _DEBUG #ifdef _DEBUG
if("debug_collision_boxes"_I){ if("debug_collision_boxes"_I){
if(tileSheet.tileset.collision.find(tileSheetIndex)!=tileSheet.tileset.collision.end()){ if(MAP_TILESETS.at(tileSheet.tilesetName).collision.find(tileSheetIndex)!=MAP_TILESETS.at(tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tileSheet.tileset).collision.at(tileSheetIndex).collision; const geom2d::rect<float>collision=const_cast<TilesetData&>(MAP_TILESETS.at(tileSheet.tilesetName)).collision.at(tileSheetIndex).collision;
view.FillRectDecal(vf2d{float(x),float(y)}*float(game->GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128}); view.FillRectDecal(vf2d{float(x),float(y)}*float(game->GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128});
view.DrawRectDecal(vf2d{float(x),float(y)}*float(game->GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY); view.DrawRectDecal(vf2d{float(x),float(y)}*float(game->GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY);
} }
@ -1572,13 +1572,13 @@ void AiL::RenderWorld(float fElapsedTime){
tile.group=&group; tile.group=&group;
#pragma region Unhiding tile detection #pragma region Unhiding tile detection
auto it=tile.tileSheet.tileset.upperForegroundTiles.find(tile.tileID); //We're looking for tiles that are marked as should not be faded away by a tile group. auto it=MAP_TILESETS.at(tile.tileSheet.tilesetName).upperForegroundTiles.find(tile.tileID); //We're looking for tiles that are marked as should not be faded away by a tile group.
if(it!=tile.tileSheet.tileset.upperForegroundTiles.end()){ if(it!=MAP_TILESETS.at(tile.tileSheet.tilesetName).upperForegroundTiles.end()){
if(!(*it).second.hide)tile.tileOpacity=0.f; if(!(*it).second.hide)tile.tileOpacity=0.f;
} }
#pragma endregion #pragma endregion
if(tile.tileSheet.tileset.collision.find(tile.tileID)!=tile.tileSheet.tileset.collision.end()){ if(MAP_TILESETS.at(tile.tileSheet.tilesetName).collision.find(tile.tileID)!=MAP_TILESETS.at(tile.tileSheet.tilesetName).collision.end()){
tilesWithCollision.push_back(&tile); tilesWithCollision.push_back(&tile);
}else{ }else{
tilesWithoutCollision.push_back(&tile); tilesWithoutCollision.push_back(&tile);
@ -1747,8 +1747,8 @@ void AiL::RenderWorld(float fElapsedTime){
#pragma endregion #pragma endregion
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)}); RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length(); float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
if(GameSettings::TerrainCollisionBoxesEnabled()&&distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset.collision.find(tile->tileID)!=tile->tileSheet.tileset.collision.end()){ if(GameSettings::TerrainCollisionBoxesEnabled()&&distToPlayer<24*3&&tile->tileOpacity>0&&MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.find(tile->tileID)!=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tile->tileSheet.tileset).collision.at(tile->tileID).collision; const geom2d::rect<float>collision=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.at(tile->tileID).collision;
distToPlayer/=4; distToPlayer/=4;
if(distToPlayer<1){distToPlayer=1;} if(distToPlayer<1){distToPlayer=1;}
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))}); view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
@ -1799,8 +1799,8 @@ void AiL::RenderWorld(float fElapsedTime){
for(TileRenderData*tile:tilesWithoutCollision){ for(TileRenderData*tile:tilesWithoutCollision){
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)}); RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length(); float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset.collision.find(tile->tileID)!=tile->tileSheet.tileset.collision.end()){ if(distToPlayer<24*3&&tile->tileOpacity>0&&MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.find(tile->tileID)!=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.end()){
const geom2d::rect<float>collision=const_cast<TilesetData&>(tile->tileSheet.tileset).collision.at(tile->tileID).collision; const geom2d::rect<float>collision=MAP_TILESETS.at(tile->tileSheet.tilesetName).collision.at(tile->tileID).collision;
distToPlayer/=4; distToPlayer/=4;
if(distToPlayer<1){distToPlayer=1;} if(distToPlayer<1){distToPlayer=1;}
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))}); view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
@ -2282,13 +2282,13 @@ void AiL::InitializeLevel(std::string mapFile,MapName map){
int tileID=layer.tiles[y][x]-1; int tileID=layer.tiles[y][x]-1;
if(tileID!=-1){ if(tileID!=-1){
TilesheetData tileSheet=GetTileSheet(map,tileID); TilesheetData tileSheet=GetTileSheet(map,tileID);
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/tileSheet.tileset.tileheight; int tileSheetHeight=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->height/MAP_TILESETS.at(tileSheet.tilesetName).tileheight;
int tileSheetIndex=tileID-(tileSheet.firstgid-1); int tileSheetIndex=tileID-(tileSheet.firstgid-1);
int tileSheetX=tileSheetIndex%tileSheetWidth; int tileSheetX=tileSheetIndex%tileSheetWidth;
int tileSheetY=tileSheetIndex/tileSheetWidth; int tileSheetY=tileSheetIndex/tileSheetWidth;
vi2d pos=vi2d{x,y}*tileSheet.tileset.tilewidth; vi2d pos=vi2d{x,y}*MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
DrawPartialSprite(pos,tileSheet.tileset.tileset->Sprite(),vi2d{tileSheetX,tileSheetY}*tileSheet.tileset.tilewidth,{tileSheet.tileset.tilewidth,tileSheet.tileset.tileheight}); DrawPartialSprite(pos,MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite(),vi2d{tileSheetX,tileSheetY}*MAP_TILESETS.at(tileSheet.tilesetName).tilewidth,{MAP_TILESETS.at(tileSheet.tilesetName).tilewidth,MAP_TILESETS.at(tileSheet.tilesetName).tileheight});
} }
} }
} }
@ -2477,8 +2477,8 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
int tileID=layer.tiles[y][x]-1; int tileID=layer.tiles[y][x]-1;
if(tileID!=-1){ if(tileID!=-1){
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID); TilesheetData tileSheet=GetTileSheet(currentLevel,tileID);
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/tileSheet.tileset.tileheight; int tileSheetHeight=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->height/MAP_TILESETS.at(tileSheet.tilesetName).tileheight;
int tileSheetIndex=tileID-(tileSheet.firstgid-1); int tileSheetIndex=tileID-(tileSheet.firstgid-1);
int realTileSheetIndex=(tileID%1000000)-(tileSheet.firstgid-1); int realTileSheetIndex=(tileID%1000000)-(tileSheet.firstgid-1);
int tileSheetX=realTileSheetIndex%tileSheetWidth; int tileSheetX=realTileSheetIndex%tileSheetWidth;
@ -2503,8 +2503,8 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
if(!loopAll&&&layer==&layer2){layer2ID++;continue;}; if(!loopAll&&&layer==&layer2){layer2ID++;continue;};
int tileID=layer2.tiles[pos.y][pos.x]-1; int tileID=layer2.tiles[pos.y][pos.x]-1;
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID%1000000); TilesheetData tileSheet=GetTileSheet(currentLevel,tileID%1000000);
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/tileSheet.tileset.tilewidth; int tileSheetWidth=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->width/MAP_TILESETS.at(tileSheet.tilesetName).tilewidth;
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/tileSheet.tileset.tileheight; int tileSheetHeight=MAP_TILESETS.at(tileSheet.tilesetName).tileset->Sprite()->height/MAP_TILESETS.at(tileSheet.tilesetName).tileheight;
int tileSheetIndex=tileID-(tileSheet.firstgid-1); int tileSheetIndex=tileID-(tileSheet.firstgid-1);
int realTileSheetIndex=(tileID%1000000)-(tileSheet.firstgid-1); int realTileSheetIndex=(tileID%1000000)-(tileSheet.firstgid-1);
int tileSheetX=realTileSheetIndex%tileSheetWidth; int tileSheetX=realTileSheetIndex%tileSheetWidth;
@ -2590,10 +2590,10 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
for(auto&it=find_tiles.first;it!=find_tiles.second;++it){ for(auto&it=find_tiles.first;it!=find_tiles.second;++it){
//These are all tiles that were found adjacent to the location we are checking for. See if they match a potential group. //These are all tiles that were found adjacent to the location we are checking for. See if they match a potential group.
TileRenderData&foundTile=(*it).second; TileRenderData&foundTile=(*it).second;
if(&tile.tileSheet.tileset==&foundTile.tileSheet.tileset){ //Let's first see if they are even in the same tileset. if(tile.tileSheet.tilesetName==foundTile.tileSheet.tilesetName){ //Let's first see if they are even in the same tileset.
//Let's get how many tiles wide this tile sheet is. //Let's get how many tiles wide this tile sheet is.
int tileWidth=tile.tileSheet.tileset.tilewidth; int tileWidth=MAP_TILESETS.at(tile.tileSheet.tilesetName).tilewidth;
int tileSheetWidth=tile.tileSheet.tileset.tileset->Sprite()->width/tileWidth; int tileSheetWidth=MAP_TILESETS.at(tile.tileSheet.tilesetName).tileset->Sprite()->width/tileWidth;
if(IsAdjacent(tile.tileID,foundTile.tileID,tileSheetWidth)){ if(IsAdjacent(tile.tileID,foundTile.tileID,tileSheetWidth)){
group.insert({loc,tile});//We add this tile to the group! It is adjacent! group.insert({loc,tile});//We add this tile to the group! It is adjacent!
groupFound=true; groupFound=true;
@ -2741,7 +2741,7 @@ bool AiL::IsUpperForegroundTile(int tileID){
} }
bool AiL::IsForegroundTile(TilesheetData sheet,int tileID){ bool AiL::IsForegroundTile(TilesheetData sheet,int tileID){
return sheet.tileset.foregroundTiles.find(tileID)!=sheet.tileset.foregroundTiles.end(); return MAP_TILESETS.at(sheet.tilesetName).foregroundTiles.find(tileID)!=MAP_TILESETS.at(sheet.tilesetName).foregroundTiles.end();
} }
const TilesheetData AiL::GetTileSheet(MapName map,int tileID)const{ const TilesheetData AiL::GetTileSheet(MapName map,int tileID)const{
@ -2749,7 +2749,7 @@ const TilesheetData AiL::GetTileSheet(MapName map,int tileID)const{
if(tileData.size()==1){ if(tileData.size()==1){
size_t slashMarkerSourceDir = tileData[0].data.at("source").find_last_of('/'); size_t slashMarkerSourceDir = tileData[0].data.at("source").find_last_of('/');
std::string baseSourceDir=tileData[0].data.at("source").substr(slashMarkerSourceDir+1); std::string baseSourceDir=tileData[0].data.at("source").substr(slashMarkerSourceDir+1);
return {MAP_TILESETS.at("assets/maps/"+baseSourceDir),1,MAP_TILESETS.at("assets/maps/"+baseSourceDir).tilecols[tileID]}; return {"assets/maps/"+baseSourceDir,1,MAP_TILESETS.at("assets/maps/"+baseSourceDir).tilecols[tileID]};
} else { } else {
for (int i=1;i<tileData.size();i++){ for (int i=1;i<tileData.size();i++){
int firstgid=stoi(tileData[i-1].data.at("firstgid")); int firstgid=stoi(tileData[i-1].data.at("firstgid"));
@ -2757,16 +2757,16 @@ const TilesheetData AiL::GetTileSheet(MapName map,int tileID)const{
size_t slashMarkerSourceDir = tileData[size_t(i-1)].data.at("source").find_last_of('/'); size_t slashMarkerSourceDir = tileData[size_t(i-1)].data.at("source").find_last_of('/');
std::string baseSourceDir=tileData[size_t(i-1)].data.at("source").substr(slashMarkerSourceDir+1); std::string baseSourceDir=tileData[size_t(i-1)].data.at("source").substr(slashMarkerSourceDir+1);
if(tileID!=-1){ if(tileID!=-1){
return {MAP_TILESETS.at("assets/maps/"+baseSourceDir),firstgid,MAP_TILESETS.at("assets/maps/"+baseSourceDir).tilecols[tileID%1000000-(firstgid-1)]}; return {"assets/maps/"+baseSourceDir,firstgid,MAP_TILESETS.at("assets/maps/"+baseSourceDir).tilecols[tileID%1000000-(firstgid-1)]};
}else{ }else{
return {MAP_TILESETS.at("assets/maps/"+baseSourceDir),firstgid,BLANK}; return {"assets/maps/"+baseSourceDir,firstgid,BLANK};
} }
} }
} }
size_t slashMarkerSourceDir = tileData[tileData.size()-1].data.at("source").find_last_of('/'); size_t slashMarkerSourceDir = tileData[tileData.size()-1].data.at("source").find_last_of('/');
std::string baseSourceDir=tileData[tileData.size()-1].data.at("source").substr(slashMarkerSourceDir+1); std::string baseSourceDir=tileData[tileData.size()-1].data.at("source").substr(slashMarkerSourceDir+1);
int firstgid=stoi(tileData[tileData.size()-1].data.at("firstgid")); int firstgid=stoi(tileData[tileData.size()-1].data.at("firstgid"));
return {MAP_TILESETS.at("assets/maps/"+baseSourceDir),firstgid,MAP_TILESETS.at("assets/maps/"+baseSourceDir).tilecols[tileID%1000000-(firstgid-1)]}; return {"assets/maps/"+baseSourceDir,firstgid,MAP_TILESETS.at("assets/maps/"+baseSourceDir).tilecols[tileID%1000000-(firstgid-1)]};
} }
} }
@ -2796,7 +2796,7 @@ const geom2d::rect<float>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLe
int tileID=layer.tiles[pos.y/mapData.tilewidth][pos.x/mapData.tilewidth]-1; int tileID=layer.tiles[pos.y/mapData.tilewidth][pos.x/mapData.tilewidth]-1;
if(tileID==-1)continue; if(tileID==-1)continue;
const TilesheetData&data=GetTileSheet(map,tileID); const TilesheetData&data=GetTileSheet(map,tileID);
if(data.tileset.isTerrain){ if(MAP_TILESETS.at(data.tilesetName).isTerrain){
hasTerrain=true; hasTerrain=true;
break; break;
} }
@ -2823,8 +2823,8 @@ const geom2d::rect<float>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLe
} }
if(Unlock::IsUnlocked(layer.unlockCondition)){ if(Unlock::IsUnlocked(layer.unlockCondition)){
int tileID=layer.tiles[int(pos.y)/mapData.tilewidth][int(pos.x)/mapData.tilewidth]-1; int tileID=layer.tiles[int(pos.y)/mapData.tilewidth][int(pos.x)/mapData.tilewidth]-1;
if(tileID!=-1&&GetTileSheet(map,tileID%1000000).tileset.collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=GetTileSheet(map,tileID%1000000).tileset.collision.end()){ if(tileID!=-1&&MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName).collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName).collision.end()){
const geom2d::rect<float>collisionRect=const_cast<TilesetData&>(GetTileSheet(map,tileID%1000000).tileset).collision.at(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1).collision; const geom2d::rect<float>collisionRect=const_cast<TilesetData&>(MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName)).collision.at(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1).collision;
return collisionRect; return collisionRect;
} }
} }
@ -2833,8 +2833,8 @@ const geom2d::rect<float>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLe
#pragma endregion #pragma endregion
int tileID=MAP_DATA.at(map).LayerData[bridgeLayerIndex].tiles[int(pos.y)/mapData.tilewidth][int(pos.x)/mapData.tilewidth]-1; int tileID=MAP_DATA.at(map).LayerData[bridgeLayerIndex].tiles[int(pos.y)/mapData.tilewidth][int(pos.x)/mapData.tilewidth]-1;
if(tileID!=-1){ if(tileID!=-1){
if (GetTileSheet(map,tileID%1000000).tileset.collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=GetTileSheet(map,tileID%1000000).tileset.collision.end()){ if(MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName).collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName).collision.end()){
return const_cast<TilesetData&>(GetTileSheet(map,tileID%1000000).tileset).collision.at(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1).collision; return const_cast<TilesetData&>(MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName)).collision.at(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1).collision;
} }
return NO_COLLISION; return NO_COLLISION;
} }
@ -2845,8 +2845,8 @@ const geom2d::rect<float>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLe
//auto HasNoClass=[&](){return layer.tag.data.find("class")==layer.tag.data.end();}; //auto HasNoClass=[&](){return layer.tag.data.find("class")==layer.tag.data.end();};
if(counter!=bridgeLayerIndex){ if(counter!=bridgeLayerIndex){
int tileID=layer.tiles[int(pos.y)/mapData.tilewidth][int(pos.x)/mapData.tilewidth]-1; int tileID=layer.tiles[int(pos.y)/mapData.tilewidth][int(pos.x)/mapData.tilewidth]-1;
if(tileID!=-1&&GetTileSheet(map,tileID%1000000).tileset.collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=GetTileSheet(map,tileID%1000000).tileset.collision.end()){ if(tileID!=-1&&MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName).collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName).collision.end()){
const geom2d::rect<float>collisionRect=const_cast<TilesetData&>(GetTileSheet(map,tileID%1000000).tileset).collision.at(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1).collision; const geom2d::rect<float>collisionRect=const_cast<TilesetData&>(MAP_TILESETS.at(GetTileSheet(map,tileID%1000000).tilesetName)).collision.at(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1).collision;
if(foundRect==NO_COLLISION){ if(foundRect==NO_COLLISION){
foundRect=collisionRect; foundRect=collisionRect;
}else{ }else{
@ -3251,7 +3251,7 @@ void AiL::OutputDebugInfo(const char*key,std::size_t len){
} }
bool AiL::IsReflectiveTile(TilesheetData tileSheet,int tileID){ bool AiL::IsReflectiveTile(TilesheetData tileSheet,int tileID){
return tileSheet.tileset.reflectiveData.find(tileID)!=tileSheet.tileset.reflectiveData.end(); return MAP_TILESETS.at(tileSheet.tilesetName).reflectiveData.find(tileID)!=MAP_TILESETS.at(tileSheet.tilesetName).reflectiveData.end();
} }
bool AiL::OnUserDestroy(){ bool AiL::OnUserDestroy(){
@ -4458,3 +4458,7 @@ void AiL::PlayFootstepSound(){
SoundEffect::PlaySFX("Footstep",SoundEffect::CENTERED); SoundEffect::PlaySFX("Footstep",SoundEffect::CENTERED);
} }
} }
const std::map<std::string,TilesetData>&AiL::GetTilesets()const{
return MAP_TILESETS;
}

@ -380,6 +380,7 @@ public:
void SetWorldZoom(float newZoomScale); void SetWorldZoom(float newZoomScale);
//Plays the correct footstep sound based on player's current tile. //Plays the correct footstep sound based on player's current tile.
void PlayFootstepSound(); void PlayFootstepSound();
const std::map<std::string,TilesetData>&GetTilesets()const;
struct TileGroupData{ struct TileGroupData{
vi2d tilePos; vi2d tilePos;

@ -74,12 +74,12 @@ void TileGroup::InsertTile(TileRenderData tile){
} }
range={{minX,minY},{maxX-minX,maxY-minY}}; range={{minX,minY},{maxX-minX,maxY-minY}};
} }
if(tile.tileSheet.tileset.collision.find(tile.tileID%1000000)!=tile.tileSheet.tileset.collision.end()){ if(game->GetTilesets().at(tile.tileSheet.tilesetName).collision.find(tile.tileID%1000000)!=game->GetTilesets().at(tile.tileSheet.tilesetName).collision.end()){
if(collisionRange.size==vf2d{0,0}){ if(collisionRange.size==vf2d{0,0}){
const geom2d::rect<float>collisionRect=const_cast<TilesetData&>(tile.tileSheet.tileset).collision.at(tile.tileID%1000000).collision; const geom2d::rect<float>collisionRect=const_cast<TilesetData&>(game->GetTilesets().at(tile.tileSheet.tilesetName)).collision.at(tile.tileID%1000000).collision;
collisionRange={tile.pos+collisionRect.pos,collisionRect.size}; collisionRange={tile.pos+collisionRect.pos,collisionRect.size};
}else{ }else{
geom2d::rect<float>newCollision=const_cast<TilesetData&>(tile.tileSheet.tileset).collision.at(tile.tileID%1000000).collision; geom2d::rect<float>newCollision=const_cast<TilesetData&>(game->GetTilesets().at(tile.tileSheet.tilesetName)).collision.at(tile.tileID%1000000).collision;
newCollision.pos+=tile.pos; newCollision.pos+=tile.pos;
float minX=collisionRange.top().start.x; float minX=collisionRange.top().start.x;

@ -66,20 +66,19 @@ struct TilesetData{
std::unordered_map<int,vi2d>tileRepeatData; std::unordered_map<int,vi2d>tileRepeatData;
std::set<int>reflectiveData; std::set<int>reflectiveData;
std::vector<Pixel>tilecols; std::vector<Pixel>tilecols;
bool operator==(const TilesetData&rhs)const{
return tileset==rhs.tileset;
}
}; };
struct TilesheetData{ struct TilesheetData{
const TilesetData&tileset; std::string tilesetName;
int firstgid; int firstgid;
Pixel tilecol; Pixel tilecol;
TilesheetData(const TilesetData&tileset,const int firstgid,const Pixel tilecol) TilesheetData(std::string_view tilesetName,const int firstgid,const Pixel tilecol)
:tileset(tileset),firstgid(firstgid),tilecol(tilecol){}; :tilesetName(tilesetName),firstgid(firstgid),tilecol(tilecol){};
TilesheetData(const TilesheetData&ref)=default; bool operator==(const TilesheetData&rhs)const{
TilesheetData operator=(const TilesheetData&ref){ return firstgid==rhs.firstgid;
return {ref.tileset,ref.firstgid,ref.tilecol};
};
bool operator==(const TilesheetData&rhs){
return &tileset==&rhs.tileset&&firstgid==rhs.firstgid;
} }
}; };

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 3 #define VERSION_PATCH 3
#define VERSION_BUILD 10205 #define VERSION_BUILD 10219
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" class="Map" orientation="orthogonal" renderorder="right-down" width="214" height="205" tilewidth="24" tileheight="24" infinite="0" backgroundcolor="#475500" nextlayerid="12" nextobjectid="525"> <map version="1.10" tiledversion="1.10.2" class="Map" orientation="orthogonal" renderorder="right-down" width="214" height="205" tilewidth="24" tileheight="24" infinite="0" backgroundcolor="#475500" nextlayerid="12" nextobjectid="526">
<properties> <properties>
<property name="Backdrop" propertytype="Backdrop" value="forest"/> <property name="Backdrop" propertytype="Backdrop" value="forest"/>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/> <property name="Background Music" propertytype="BGM" value="foresty1_1"/>
@ -1476,7 +1476,7 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data> </data>
</layer> </layer>
<objectgroup id="6" name="Transition Layer"> <objectgroup id="6" name="Transition Layer" locked="1">
<object id="113" name="Lower Zone" type="LowerZone" x="1998" y="2172" width="378" height="672"/> <object id="113" name="Lower Zone" type="LowerZone" x="1998" y="2172" width="378" height="672"/>
<object id="116" name="Upper Zone" type="UpperZone" x="2376" y="2472" width="1008" height="300"/> <object id="116" name="Upper Zone" type="UpperZone" x="2376" y="2472" width="1008" height="300"/>
<object id="118" name="Upper Zone" type="UpperZone" x="2376" y="1692" width="1008" height="660"/> <object id="118" name="Upper Zone" type="UpperZone" x="2376" y="1692" width="1008" height="660"/>
@ -1960,7 +1960,6 @@
<property name="spawner" type="object" value="107"/> <property name="spawner" type="object" value="107"/>
</properties> </properties>
</object> </object>
<object id="167" name="Player Spawn" type="PlayerSpawnLocation" x="3534" y="2436" width="24" height="24"/>
<object id="513" template="../maps/Monsters/Green Slime.tx" type="Monster" x="1045" y="4242"> <object id="513" template="../maps/Monsters/Green Slime.tx" type="Monster" x="1045" y="4242">
<properties> <properties>
<property name="spawner" type="object" value="2"/> <property name="spawner" type="object" value="2"/>
@ -1996,6 +1995,7 @@
<property name="spawner" type="object" value="26"/> <property name="spawner" type="object" value="26"/>
</properties> </properties>
</object> </object>
<object id="525" name="Player Spawn" type="PlayerSpawnLocation" x="624" y="4272" width="24" height="24"/>
</objectgroup> </objectgroup>
<objectgroup id="9" name="Environmental Audio"> <objectgroup id="9" name="Environmental Audio">
<object id="166" name="Waterfall Sound" type="AudioEnvironmentalSound" x="3204" y="4152"> <object id="166" name="Waterfall Sound" type="AudioEnvironmentalSound" x="3204" y="4152">

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" class="Map" orientation="orthogonal" renderorder="right-down" width="303" height="211" tilewidth="24" tileheight="24" infinite="0" nextlayerid="10" nextobjectid="98"> <map version="1.10" tiledversion="1.10.2" class="Map" orientation="orthogonal" renderorder="right-down" width="303" height="211" tilewidth="24" tileheight="24" infinite="0" nextlayerid="10" nextobjectid="99">
<properties> <properties>
<property name="Backdrop" propertytype="Backdrop" value="mountain_day"/> <property name="Backdrop" propertytype="Backdrop" value="mountain_day"/>
<property name="Background Music" propertytype="BGM" value="foresty1_1"/> <property name="Background Music" propertytype="BGM" value="foresty1_1"/>
@ -505,10 +505,10 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1367,1368,1369,1367,1368,1369,1367,1368,1369,1367,1368,1369,1367,1368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1367,1368,1369,1367,1368,1369,1367,1368,1369,1367,1368,1369,1367,1368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2912,1421,1419,1420,1421,1419,1420,1421,1419,1420,1421,1419,1420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1419,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,1421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,1421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1471,1472,1472,1472,1472,1472,1472,1472,1472,1472,1472,1472,1473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1472,1472,1472,1472,1472,1472,1472,1472,1472,1472,1472,1473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -1651,7 +1651,6 @@
<property name="spawner" type="object" value="18"/> <property name="spawner" type="object" value="18"/>
</properties> </properties>
</object> </object>
<object id="82" name="Player Spawn" type="PlayerSpawnLocation" x="1584" y="1410" width="24" height="24"/>
<object id="83" name="End Zone" type="EndZone" x="216" y="2592" width="114" height="114"> <object id="83" name="End Zone" type="EndZone" x="216" y="2592" width="114" height="114">
<properties> <properties>
<property name="Upper?" type="bool" value="true"/> <property name="Upper?" type="bool" value="true"/>
@ -1660,8 +1659,9 @@
<object id="84" name="Bridge" type="LowerBridgeCollision" x="1152" y="1440" width="24" height="120"/> <object id="84" name="Bridge" type="LowerBridgeCollision" x="1152" y="1440" width="24" height="120"/>
<object id="85" name="Bridge" type="LowerBridgeCollision" x="792" y="1440" width="24" height="24"/> <object id="85" name="Bridge" type="LowerBridgeCollision" x="792" y="1440" width="24" height="24"/>
<object id="86" name="Bridge" type="LowerBridgeCollision" x="816" y="1464" width="24" height="120"/> <object id="86" name="Bridge" type="LowerBridgeCollision" x="816" y="1464" width="24" height="120"/>
<object id="98" name="Player Spawn" type="PlayerSpawnLocation" x="4968" y="4440" width="24" height="24"/>
</objectgroup> </objectgroup>
<objectgroup id="9" name="Level Zones"> <objectgroup id="9" name="Level Zones" locked="1">
<object id="87" name="Upper Level" type="UpperZone" x="1176" y="1080" width="4344" height="672"/> <object id="87" name="Upper Level" type="UpperZone" x="1176" y="1080" width="4344" height="672"/>
<object id="88" name="Upper Level" type="UpperZone" x="1188" y="522" width="3100" height="1734"/> <object id="88" name="Upper Level" type="UpperZone" x="1188" y="522" width="3100" height="1734"/>
<object id="89" name="Upper Level" type="UpperZone" x="138" y="492" width="678" height="1422"/> <object id="89" name="Upper Level" type="UpperZone" x="138" y="492" width="678" height="1422"/>

Loading…
Cancel
Save