Debug map toggle configuration paramater added. Added in tiled and scaled versions of interface 9-patch patterning.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
pull/28/head
parent 17838ffb8b
commit bff7eabef5
  1. 60
      Crawler/Crawler.cpp
  2. 1
      Crawler/Crawler.h
  3. 79
      Crawler/Menu.cpp
  4. 6
      Crawler/Menu.h
  5. 13
      Crawler/TMXParser.h
  6. 11
      Crawler/TSXParser.h
  7. 3
      Crawler/assets/config/configuration.txt

@ -21,6 +21,7 @@
INCLUDE_EMITTER_LIST INCLUDE_EMITTER_LIST
bool _DEBUG_MAP_LOAD_INFO = false;
//360x240 //360x240
vi2d WINDOW_SIZE={24*15,24*10}; vi2d WINDOW_SIZE={24*15,24*10};
safemap<std::string,Animate2D::FrameSequence>ANIMATION_DATA; safemap<std::string,Animate2D::FrameSequence>ANIMATION_DATA;
@ -47,6 +48,8 @@ Crawler::Crawler()
utils::datafile::Read(DATA,"assets/config/configuration.txt"); utils::datafile::Read(DATA,"assets/config/configuration.txt");
_DEBUG_MAP_LOAD_INFO=bool("debug_map_load_info"_I);
std::string CONFIG_PATH = "config_path"_S; std::string CONFIG_PATH = "config_path"_S;
std::string GFX_CONFIG = CONFIG_PATH + "gfx_config"_S; std::string GFX_CONFIG = CONFIG_PATH + "gfx_config"_S;
@ -78,12 +81,6 @@ bool Crawler::OnUserCreate(){
InitializeDefaultKeybinds(); InitializeDefaultKeybinds();
InitializeLevels(); InitializeLevels();
circleCooldownPoints.push_back({0,0});
for(int i=0;i<=360;i+=4){
float angle=util::degToRad(i)-PI/2;
circleCooldownPoints.push_back(vf2d{cos(angle),sin(angle)});
}
player=std::make_unique<Warrior>(); player=std::make_unique<Warrior>();
//Initialize Camera. //Initialize Camera.
@ -93,18 +90,7 @@ bool Crawler::OnUserCreate(){
camera.SetWorldBoundary({0,0},WORLD_SIZE*24); camera.SetWorldBoundary({0,0},WORLD_SIZE*24);
camera.EnableWorldBoundary(false); camera.EnableWorldBoundary(false);
for(auto&val:DATA["Images"].GetKeys()){ InitializeGraphics();
std::string key=val.first;
std::string imgFile=DATA["Images"][key].GetString();
std::cout<<"Loading image "+imgFile+"..."<<std::endl;
GFX[imgFile];
if(GFX[imgFile].Load("GFX_Prefix"_S+imgFile,nullptr,false,false)!=rcode::OK){
std::cout<<" WARNING! Failed to load "+imgFile+"!";
throw;
}
}
GFX.SetInitialized();
std::cout<<GFX.size()<<" images have been loaded."<<std::endl;
Menu::InitializeMenus(); Menu::InitializeMenus();
@ -1681,3 +1667,41 @@ void Crawler::RenderMenu(){
Menu::stack.back()->Draw(this); Menu::stack.back()->Draw(this);
} }
} }
void Crawler::InitializeGraphics(){
circleCooldownPoints.push_back({0,0});
for(int i=0;i<=360;i+=4){
float angle=util::degToRad(i)-PI/2;
circleCooldownPoints.push_back(vf2d{cos(angle),sin(angle)});
}
for(auto&val:DATA["Images"].GetKeys()){
std::string key=val.first;
std::string imgFile=DATA["Images"][key].GetString();
std::cout<<"Loading image "+imgFile+"..."<<std::endl;
if(GFX[imgFile].Load("GFX_Prefix"_S+imgFile,nullptr,false,false)!=rcode::OK){
std::cout<<" WARNING! Failed to load "+imgFile+"!";
throw;
}
}
//Specifically split up the 9 patch image into multiple pieces.
Renderable&patchImg=GFX["GFX_Prefix"_S+"Images.GFX_9Patch"_S];
Pixel::Mode prevMode=GetPixelMode();
SetPixelMode(Pixel::Mode::MASK);
for(int x=0;x<3;x++){
for(int y=0;y<3;y++){
std::string patchKey="9patch_"+std::to_string(x)+std::to_string(y)+".png";
GFX[patchKey].Create("Interface.9PatchSize"_i[0],"Interface.9PatchSize"_i[1],false,false);
SetDrawTarget(GFX[patchKey].Sprite());
Clear(BLANK);
DrawPartialSprite({0,0},patchImg.Sprite(),{x*"Interface.9PatchSize"_i[0],y*"Interface.9PatchSize"_i[1]},{"Interface.9PatchSize"_i[0],"Interface.9PatchSize"_i[1]});
GFX[patchKey].Decal()->Update();
SetDrawTarget(nullptr);
}
}
SetPixelMode(prevMode);
GFX.SetInitialized();
std::cout<<GFX.size()<<" images have been loaded."<<std::endl;
}

@ -130,6 +130,7 @@ public:
void DisplayBossEncounterInfo(); void DisplayBossEncounterInfo();
void BossDamageDealt(int damage); void BossDamageDealt(int damage);
void ReduceBossEncounterMobCount(); void ReduceBossEncounterMobCount();
void InitializeGraphics();
struct TileGroupData{ struct TileGroupData{
vi2d tilePos; vi2d tilePos;

@ -75,26 +75,11 @@ void Menu::Update(Crawler*game){
void Menu::Draw(Crawler*game){ void Menu::Draw(Crawler*game){
vf2d upperLeftPos=game->GetScreenSize()/2-size/2; vf2d upperLeftPos=game->GetScreenSize()/2-size/2;
vf2d patchSize=vf2d{float("Interface.9PatchSize"_i[0]),float("Interface.9PatchSize"_i[1])}; if(scaled){
DrawScaledWindow(game,upperLeftPos);
//Upper-Left }else{
game->DrawPartialDecal(upperLeftPos-patchSize,patchSize,GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*0},patchSize); DrawTiledWindow(game,upperLeftPos);
//Upper-Right }
game->DrawPartialDecal(upperLeftPos+vf2d{size.x,-patchSize.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*0},patchSize);
//Bottom-Left
game->DrawPartialDecal(upperLeftPos+vf2d{-patchSize.x,size.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*2},patchSize);
//Bottom-Right
game->DrawPartialDecal(upperLeftPos+vf2d{size.x,size.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*2},patchSize);
//Top
game->DrawPartialDecal(upperLeftPos+vf2d{0,-patchSize.y},patchSize+vf2d{size.x,0},GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*0},patchSize);
//Left
game->DrawPartialDecal(upperLeftPos+vf2d{-patchSize.x,0},patchSize+vf2d{0,size.y},GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*1},patchSize);
//Right
game->DrawPartialDecal(upperLeftPos+vf2d{size.x,0},patchSize+vf2d{0,size.y},GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*1},patchSize);
//Bottom
game->DrawPartialDecal(upperLeftPos+vf2d{0,size.y},patchSize+vf2d{size.x,0},GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*2},patchSize);
//Center
game->DrawPartialDecal(upperLeftPos,patchSize+size,GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*1},patchSize);
for(auto&key:buttons){ for(auto&key:buttons){
for(auto&button:key.second){ for(auto&button:key.second){
@ -235,3 +220,57 @@ void Menu::KeyboardButtonNavigation(Crawler*game,vf2d menuPos){
} }
} }
} }
void Menu::SetScaledPatchBorder(bool scaled){
this->scaled=scaled;
}
void Menu::DrawScaledWindow(Crawler*game,vf2d menuPos){
vf2d patchSize={"Interface.9PatchSize"_f[0],"Interface.9PatchSize"_f[1]};
//Upper-Left
game->DrawPartialDecal(menuPos-patchSize,patchSize,GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*0},patchSize);
//Upper-Right
game->DrawPartialDecal(menuPos+vf2d{size.x,-patchSize.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*0},patchSize);
//Bottom-Left
game->DrawPartialDecal(menuPos+vf2d{-patchSize.x,size.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*2},patchSize);
//Bottom-Right
game->DrawPartialDecal(menuPos+vf2d{size.x,size.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*2},patchSize);
//Top
game->DrawPartialDecal(menuPos+vf2d{0,-patchSize.y},vf2d{size.x,patchSize.y},GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*0},patchSize);
//Left
game->DrawPartialDecal(menuPos+vf2d{-patchSize.x,0},vf2d{patchSize.x,size.y},GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*1},patchSize);
//Right
game->DrawPartialDecal(menuPos+vf2d{size.x,0},vf2d{patchSize.x,size.y},GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*1},patchSize);
//Bottom
game->DrawPartialDecal(menuPos+vf2d{0,size.y},vf2d{size.x,patchSize.y},GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*2},patchSize);
//Center
game->DrawPartialDecal(menuPos,size,GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*1},patchSize);
}
void Menu::DrawTiledWindow(Crawler*game,vf2d menuPos){
vf2d patchSize={"Interface.9PatchSize"_f[0],"Interface.9PatchSize"_f[1]};
//Upper-Left
game->DrawPartialDecal(menuPos-patchSize,patchSize,GetPatchPart(0,0).Decal(),{0,0},patchSize);
//Upper-Right
game->DrawPartialDecal(menuPos+vf2d{size.x,-patchSize.y},patchSize,GetPatchPart(2,0).Decal(),{0,0},patchSize);
//Bottom-Left
game->DrawPartialDecal(menuPos+vf2d{-patchSize.x,size.y},patchSize,GetPatchPart(0,2).Decal(),{0,0},patchSize);
//Bottom-Right
game->DrawPartialDecal(menuPos+vf2d{size.x,size.y},patchSize,GetPatchPart(2,2).Decal(),{0,0},patchSize);
//Top
game->DrawPartialDecal(menuPos+vf2d{0,-patchSize.y},vf2d{size.x,patchSize.y},GetPatchPart(1,0).Decal(),{0,0},vf2d{size.x,patchSize.y});
//Left
game->DrawPartialDecal(menuPos+vf2d{-patchSize.x,0},vf2d{patchSize.x,size.y},GetPatchPart(0,1).Decal(),{0,0},vf2d{patchSize.x,size.y});
//Right
game->DrawPartialDecal(menuPos+vf2d{size.x,0},vf2d{patchSize.x,size.y},GetPatchPart(2,1).Decal(),{0,0},vf2d{patchSize.x,size.y});
//Bottom
game->DrawPartialDecal(menuPos+vf2d{0,size.y},vf2d{size.x,patchSize.y},GetPatchPart(1,2).Decal(),{0,0},vf2d{size.x,patchSize.y});
//Center
game->DrawPartialDecal(menuPos,size,GetPatchPart(1,1).Decal(),{0,0},patchSize);
}
Renderable&Menu::GetPatchPart(int x,int y){
return GFX["9patch_"+std::to_string(x)+std::to_string(y)+".png"];
}

@ -16,12 +16,14 @@ class Menu{
std::map<int/*Y*/,std::vector<MenuComponent*>>buttons; //Buttons are stored in rows followed by their column order. std::map<int/*Y*/,std::vector<MenuComponent*>>buttons; //Buttons are stored in rows followed by their column order.
vi2d selection={-1,-1}; vi2d selection={-1,-1};
vf2d size; //Size in tiles (24x24), every menu will be tile-based vf2d size; //Size in tiles (24x24), every menu will be tile-based
bool scaled=false; //Whether or not the patch border is supposed to be scaled or tiled.
public: public:
Menu(); Menu();
Menu(vf2d size); Menu(vf2d size);
void AddComponent(MenuComponent*button); void AddComponent(MenuComponent*button);
void Update(Crawler*game); void Update(Crawler*game);
void Draw(Crawler*game); void Draw(Crawler*game);
void SetScaledPatchBorder(bool scaled);
static void InitializeMenus(); static void InitializeMenus();
static void OpenMenu(MenuType menu); static void OpenMenu(MenuType menu);
static std::vector<Menu*>stack; static std::vector<Menu*>stack;
@ -29,7 +31,11 @@ private:
void MenuSelect(Crawler*game); void MenuSelect(Crawler*game);
static const Menu InitializeTestMenu(); static const Menu InitializeTestMenu();
static const Menu InitializeTestSubMenu(); static const Menu InitializeTestSubMenu();
//X (0-3), Y (0-2) for specific 9-patch tile (tiled version).
static Renderable&GetPatchPart(int x,int y);
void KeyboardButtonNavigation(Crawler*game,vf2d menuPos); void KeyboardButtonNavigation(Crawler*game,vf2d menuPos);
void DrawScaledWindow(Crawler*game,vf2d menuPos);
void DrawTiledWindow(Crawler*game,vf2d menuPos);
}; };

@ -72,6 +72,7 @@ typedef std::map<std::string,std::vector<geom2d::rect<int>>> ZoneData;
#ifdef TMX_PARSER_SETUP #ifdef TMX_PARSER_SETUP
#undef TMX_PARSER_SETUP #undef TMX_PARSER_SETUP
extern bool _DEBUG_MAP_LOAD_INFO;
const std::string XMLTag::FormatTagData(std::map<std::string,std::string>tiles){ const std::string XMLTag::FormatTagData(std::map<std::string,std::string>tiles){
std::string displayStr=""; std::string displayStr="";
for (std::map<std::string,std::string>::iterator it=data.begin();it!=data.end();it++) { for (std::map<std::string,std::string>::iterator it=data.begin();it!=data.end();it++) {
@ -192,7 +193,7 @@ typedef std::map<std::string,std::vector<geom2d::rect<int>>> ZoneData;
if(valid&&data.length()>0){ if(valid&&data.length()>0){
if (newTag.tag.length()==0) { //Tag's empty, so first line is the tag. if (newTag.tag.length()==0) { //Tag's empty, so first line is the tag.
newTag.tag=data; newTag.tag=data;
std::cout<<"Tag: "<<newTag.tag<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Tag: "<<newTag.tag<<"\n";
} else { } else {
std::string key = data.substr(0,data.find("=")); std::string key = data.substr(0,data.find("="));
std::string value = data.substr(data.find("=")+1,std::string::npos); std::string value = data.substr(data.find("=")+1,std::string::npos);
@ -202,7 +203,7 @@ typedef std::map<std::string,std::vector<geom2d::rect<int>>> ZoneData;
value = value.substr(0,value.length()-1); value = value.substr(0,value.length()-1);
newTag.data[key]=value; newTag.data[key]=value;
std::cout<<" "<<key<<":"<<newTag.data[key]<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<" "<<key<<":"<<newTag.data[key]<<"\n";
} }
} }
} }
@ -267,9 +268,9 @@ typedef std::map<std::string,std::vector<geom2d::rect<int>>> ZoneData;
accumulatedMonsterTags.push_back(monsterTag); accumulatedMonsterTags.push_back(monsterTag);
monsterPropertyTagCount=-1; monsterPropertyTagCount=-1;
} else { } else {
std::cout<<"Unsupported tag format! Ignoring."<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Unsupported tag format! Ignoring."<<"\n";
} }
std::cout<<"\n"<<"=============\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"\n"<<"=============\n";
} }
TMXParser::TMXParser(std::string file){ TMXParser::TMXParser(std::string file){
std::ifstream f(file,std::ios::in); std::ifstream f(file,std::ios::in);
@ -314,7 +315,7 @@ typedef std::map<std::string,std::vector<geom2d::rect<int>>> ZoneData;
} }
if(infiniteMap){ if(infiniteMap){
std::cout<<"Infinite map detected. Parsing stopped early."<<std::endl; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Infinite map detected. Parsing stopped early."<<std::endl;
} }
for(XMLTag&monster:accumulatedMonsterTags){ for(XMLTag&monster:accumulatedMonsterTags){
@ -340,6 +341,6 @@ typedef std::map<std::string,std::vector<geom2d::rect<int>>> ZoneData;
std::sort(parsedMapInfo.TilesetData.begin(),parsedMapInfo.TilesetData.end(),[](XMLTag&t1,XMLTag&t2){return t1.GetInteger("firstgid")<t2.GetInteger("firstgid");}); std::sort(parsedMapInfo.TilesetData.begin(),parsedMapInfo.TilesetData.end(),[](XMLTag&t1,XMLTag&t2){return t1.GetInteger("firstgid")<t2.GetInteger("firstgid");});
std::cout<<"Parsed Map Data:\n"<<parsedMapInfo<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Parsed Map Data:\n"<<parsedMapInfo<<"\n";
} }
#endif #endif

@ -34,6 +34,7 @@ class TSXParser{
#ifdef TSX_PARSER_SETUP #ifdef TSX_PARSER_SETUP
#undef TSX_PARSER_SETUP #undef TSX_PARSER_SETUP
extern bool _DEBUG_MAP_LOAD_INFO;
Tileset&TSXParser::GetData() { Tileset&TSXParser::GetData() {
return parsedTilesetInfo; return parsedTilesetInfo;
} }
@ -73,7 +74,7 @@ class TSXParser{
if(valid&&data.length()>0){ if(valid&&data.length()>0){
if (newTag.tag.length()==0) { //Tag's empty, so first line is the tag. if (newTag.tag.length()==0) { //Tag's empty, so first line is the tag.
newTag.tag=data; newTag.tag=data;
std::cout<<"Tag: "<<newTag.tag<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Tag: "<<newTag.tag<<"\n";
} else { } else {
std::string key = data.substr(0,data.find("=")); std::string key = data.substr(0,data.find("="));
std::string value = data.substr(data.find("=")+1,std::string::npos); std::string value = data.substr(data.find("=")+1,std::string::npos);
@ -83,7 +84,7 @@ class TSXParser{
value = value.substr(0,value.length()-1); value = value.substr(0,value.length()-1);
newTag.data[key]=value; newTag.data[key]=value;
std::cout<<" "<<key<<":"<<newTag.data[key]<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<" "<<key<<":"<<newTag.data[key]<<"\n";
} }
} }
} }
@ -129,12 +130,12 @@ class TSXParser{
TileCollisionData data; TileCollisionData data;
data.collision=geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}}; data.collision=geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}};
if(parsedTilesetInfo.CollisionData.count(previousTagID)){ if(parsedTilesetInfo.CollisionData.count(previousTagID)){
std::cout<<"WARNING! There was already collision data defined for tile "<<previousTagID<<"!"<<std::endl; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"WARNING! There was already collision data defined for tile "<<previousTagID<<"!"<<std::endl;
throw; throw;
} }
parsedTilesetInfo.CollisionData[previousTagID]=data; parsedTilesetInfo.CollisionData[previousTagID]=data;
} }
std::cout<<"\n"<<"=============\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"\n"<<"=============\n";
} }
TSXParser::TSXParser(std::string file) TSXParser::TSXParser(std::string file)
:previousTagID(-1){ :previousTagID(-1){
@ -167,6 +168,6 @@ class TSXParser{
} }
} }
std::cout<<"Parsed Tileset Data:\n"<<parsedTilesetInfo<<"\n"; if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Parsed Tileset Data:\n"<<parsedTilesetInfo<<"\n";
} }
#endif #endif

@ -36,6 +36,9 @@ class_list = Warrior, Thief, Ranger, Trapper, Wizard, Witch
# Whether or not to show individual data accesses from config data structure. # Whether or not to show individual data accesses from config data structure.
debug_access_options = 0 debug_access_options = 0
# Shows map loading output
debug_map_load_info = 0
# Shows extra info about the player on the HUD # Shows extra info about the player on the HUD
debug_player_info = 0 debug_player_info = 0

Loading…
Cancel
Save