From eeb24934a34bcc90c2ffa9270d8c15e61eb902d8 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Thu, 16 Nov 2023 20:41:59 -0600 Subject: [PATCH] Added an end zone ring graphic. --- Crawler/Crawler.cpp | 42 +++++++++++++++++++++------- Crawler/Crawler.h | 3 +- Crawler/Crawler.tiled-project | 5 ++++ Crawler/Monster.cpp | 10 +++---- Crawler/Player.cpp | 10 +++---- Crawler/TMXParser.h | 31 ++++++++++++-------- Crawler/Version.h | 2 +- Crawler/assets/Campaigns/1_1_v2.tmx | 10 +++++-- Crawler/assets/config/gfx/gfx.txt | 1 + Crawler/assets/finishring.png | Bin 0 -> 19459 bytes 10 files changed, 78 insertions(+), 36 deletions(-) create mode 100644 Crawler/assets/finishring.png diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index 6079f867..31d1f060 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -550,6 +550,8 @@ void Crawler::PopulateRenderLists(){ backgroundEffectsUpper.clear(); foregroundEffectsLower.clear(); foregroundEffectsUpper.clear(); + endZones.clear(); + upperEndZones.clear(); tilePreparationList.clear(); tileForegroundList.clear(); @@ -595,6 +597,15 @@ void Crawler::PopulateRenderLists(){ backgroundEffectsLower.push_back(e); } } + + for(ZoneData&zone:MAP_DATA[GetCurrentLevel()].ZoneData["EndZone"]){ + if(zone.isUpper){ + upperEndZones.push_back(zone); + }else{ + endZones.push_back(zone); + } + } + std::sort(monstersBeforeUpper.begin(),monstersBeforeUpper.end(),[](Monster*m1,Monster*m2){return m1->GetPos().yGetPos().y;}); std::sort(monstersBeforeLower.begin(),monstersBeforeLower.end(),[](Monster*m1,Monster*m2){return m1->GetPos().yGetPos().y;}); std::sort(monstersAfterUpper.begin(),monstersAfterUpper.end(),[](Monster*m1,Monster*m2){return m1->GetPos().yGetPos().y;}); @@ -652,6 +663,12 @@ void Crawler::RenderWorld(float fElapsedTime){ } }; + auto RenderZone=[&](geom2d::rect&zone){ + game->SetDecalMode(DecalMode::ADDITIVE); + view.DrawDecal(zone.pos,GFX["finishring.png"].Decal(),vf2d(zone.size)/vf2d(GFX["finishring.png"].Sprite()->Size()),{255,255,255,uint8_t(abs(sin(game->levelTime))*255)}); + game->SetDecalMode(DecalMode::NORMAL); + }; + enum class RenderMode{ REFLECTIVE_TILES, NORMAL_TILES, @@ -785,6 +802,9 @@ void Crawler::RenderWorld(float fElapsedTime){ for(Effect*e:backgroundEffectsLower){ e->rendered=false; } + for(ZoneData&zone:endZones){ + RenderZone(zone.zone); + } for(Monster*m:monstersBeforeLower){ m->Draw(); } @@ -933,6 +953,9 @@ void Crawler::RenderWorld(float fElapsedTime){ for(Effect*e:backgroundEffectsUpper){ e->rendered=false; } + for(ZoneData&zone:upperEndZones){ + RenderZone(zone.zone); + } for(Monster*m:monstersBeforeUpper){ m->Draw(); } @@ -1288,14 +1311,13 @@ void Crawler::LoadLevel(MapName map){ return zoneSet.second; } } - return std::vector>{}; + return std::vector{}; }; - - for(geom2d::rect&zone:GetUpperZones()){ - int zoneX=zone.pos.x/game->GetCurrentMap().tilewidth; //snap to grid - int zoneY=zone.pos.y/game->GetCurrentMap().tilewidth; - int zoneW=zone.right().start.x/game->GetCurrentMap().tilewidth-zoneX; - int zoneH=zone.bottom().start.y/game->GetCurrentMap().tilewidth-zoneY; + for(ZoneData&zone:GetUpperZones()){ + int zoneX=zone.zone.pos.x/game->GetCurrentMap().tilewidth; //snap to grid + int zoneY=zone.zone.pos.y/game->GetCurrentMap().tilewidth; + int zoneW=zone.zone.right().start.x/game->GetCurrentMap().tilewidth-zoneX; + int zoneH=zone.zone.bottom().start.y/game->GetCurrentMap().tilewidth-zoneY; for(int x=zoneX;xCrawler::GetTileCollision(MapName map,vf2d pos,bool upperLevel) if(pos.x<0||pos.y<0||pos.x>=GetCurrentMap().width*game->GetCurrentMap().tilewidth||pos.y>=GetCurrentMap().height*game->GetCurrentMap().tilewidth)return NO_COLLISION; #pragma region Lower Bridge Collision Check if(!upperLevel){ //We are looking for lower bridge collisions. - for(geom2d::rect&zone:MAP_DATA[map].ZoneData["LowerBridgeCollision"]){ - if(geom2d::contains(zone,pos)){ + for(ZoneData&zone:MAP_DATA[map].ZoneData["LowerBridgeCollision"]){ + if(geom2d::contains(zone.zone,pos)){ return {{0,0},{game->GetCurrentMap().tilewidth,game->GetCurrentMap().tilewidth}}; } } @@ -1505,7 +1527,7 @@ MapName Crawler::GetCurrentLevel(){ return currentLevel; } -std::map>>&Crawler::GetZoneData(MapName map){ +std::map>&Crawler::GetZoneData(MapName map){ return MAP_DATA[map].ZoneData; } diff --git a/Crawler/Crawler.h b/Crawler/Crawler.h index f1496310..f14e9dd6 100644 --- a/Crawler/Crawler.h +++ b/Crawler/Crawler.h @@ -63,6 +63,7 @@ public: private: std::vector>foregroundEffects,backgroundEffects,foregroundEffectsToBeInserted,backgroundEffectsToBeInserted; std::vectortilePreparationList,tileForegroundList; + std::vectorendZones,upperEndZones; std::vectorcircleCooldownPoints; std::mapMAP_TILESETS; vf2d worldShake={}; @@ -139,7 +140,7 @@ public: bool HasTileCollision(MapName map,vf2d pos,bool upperLevel=false); MapName GetCurrentLevel(); bool IsBridgeLayer(LayerTag&layer); - std::map>>&GetZoneData(MapName map); + std::map>&GetZoneData(MapName map); void PopulateRenderLists(); void ChangePlayerClass(Class cl); std::string GetString(std::string key); diff --git a/Crawler/Crawler.tiled-project b/Crawler/Crawler.tiled-project index ba5ae5ac..fe25f51f 100644 --- a/Crawler/Crawler.tiled-project +++ b/Crawler/Crawler.tiled-project @@ -66,6 +66,11 @@ "drawFill": true, "id": 23, "members": [ + { + "name": "Upper?", + "type": "bool", + "value": false + } ], "name": "EndZone", "type": "class", diff --git a/Crawler/Monster.cpp b/Crawler/Monster.cpp index acd9c6aa..d6ce3cda 100644 --- a/Crawler/Monster.cpp +++ b/Crawler/Monster.cpp @@ -257,14 +257,14 @@ bool Monster::SetPos(vf2d pos){ return resultX|resultY; } void Monster::Moved(){ - ZoneData&zoneData=game->GetZoneData(game->GetCurrentLevel()); - for(geom2d::rect&upperLevelZone:zoneData["UpperZone"]){ - if(geom2d::overlaps(upperLevelZone,pos)){ + std::map>&zoneData=game->GetZoneData(game->GetCurrentLevel()); + for(ZoneData&upperLevelZone:zoneData["UpperZone"]){ + if(geom2d::overlaps(upperLevelZone.zone,pos)){ upperLevel=true; } } - for(geom2d::rect&lowerLevelZone:zoneData["LowerZone"]){ - if(geom2d::overlaps(lowerLevelZone,pos)){ + for(ZoneData&lowerLevelZone:zoneData["LowerZone"]){ + if(geom2d::overlaps(lowerLevelZone.zone,pos)){ upperLevel=false; } } diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index 47af91e2..2863555b 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -604,14 +604,14 @@ void Player::Moved(){ spawner.SetTriggered(true); } } - ZoneData&zoneData=game->GetZoneData(game->GetCurrentLevel()); - for(geom2d::rect&upperLevelZone:zoneData["UpperZone"]){ - if(geom2d::overlaps(upperLevelZone,pos)){ + std::map>&zoneData=game->GetZoneData(game->GetCurrentLevel()); + for(ZoneData&upperLevelZone:zoneData["UpperZone"]){ + if(geom2d::overlaps(upperLevelZone.zone,pos)){ upperLevel=true; } } - for(geom2d::rect&lowerLevelZone:zoneData["LowerZone"]){ - if(geom2d::overlaps(lowerLevelZone,pos)){ + for(ZoneData&lowerLevelZone:zoneData["LowerZone"]){ + if(geom2d::overlaps(lowerLevelZone.zone,pos)){ upperLevel=false; } } diff --git a/Crawler/TMXParser.h b/Crawler/TMXParser.h index dae028d0..3f5012d4 100644 --- a/Crawler/TMXParser.h +++ b/Crawler/TMXParser.h @@ -76,6 +76,11 @@ struct SpawnerTag{ friend std::ostream& operator << (std::ostream& os, SpawnerTag& rhs); }; +struct ZoneData{ + geom2d::rectzone; + bool isUpper=false; +}; + struct Map{ MapTag MapData; std::string name; @@ -85,7 +90,7 @@ struct Map{ std::string mapType=""; std::setspawns; std::map SpawnerData; //Spawn groups have IDs, mobs associate which spawner they are tied to via this ID. - std::map>> ZoneData; + std::map> ZoneData; std::string FormatLayerData(std::ostream& os, std::vectortiles); std::string FormatSpawnerData(std::ostream& os, std::maptiles); friend std::ostream& operator << (std::ostream& os, Map& rhs); @@ -114,6 +119,7 @@ class TMXParser{ bool buildingSpawner=false; SpawnerTag obj; int prevSpawner; + ZoneData*prevZoneData=nullptr; void ParseTag(std::string tag); int monsterPropertyTagCount=-1; XMLTag monsterTag; @@ -126,7 +132,6 @@ class TMXParser{ TMXParser(std::string file); }; -typedef std::map>> ZoneData; //#define TMX_PARSER_SETUP //Toggle for code-writing. #ifdef TMX_PARSER_SETUP @@ -161,7 +166,7 @@ typedef std::map>> ZoneData; return std::stod(data[dataTag]); } bool XMLTag::GetBool(std::string dataTag) { - if (data[dataTag]=="0") { + if (data[dataTag]=="0"||data[dataTag]=="false") { return false; } else { return true; @@ -315,6 +320,9 @@ typedef std::map>> ZoneData; prevSpawner=newTag.GetInteger("id"); } } else + if(newTag.tag=="property"&&newTag.data["name"]=="Upper?"&&prevZoneData!=nullptr){ + prevZoneData->isUpper=newTag.GetBool("value"); + }else if (newTag.tag=="property"&&newTag.data["name"]=="Optimize"&&newTag.data["value"]=="true") { parsedMapInfo.MapData.optimized=true; } else @@ -357,12 +365,13 @@ typedef std::map>> ZoneData; if (newTag.tag=="object"&&newTag.data.find("type")!=newTag.data.end()){ //This is an object with a type that doesn't fit into other categories, we can add it to ZoneData. if(parsedMapInfo.ZoneData.find(newTag.data["type"])!=parsedMapInfo.ZoneData.end()){ - std::vector>&zones=parsedMapInfo.ZoneData[newTag.data["type"]]; - zones.push_back({{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}}); + std::vector&zones=parsedMapInfo.ZoneData.at(newTag.data["type"]); + zones.emplace_back(geom2d::rect{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}}); + prevZoneData=&zones.back(); } else { - std::vector>zones; - zones.push_back({{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}}); - parsedMapInfo.ZoneData[newTag.data["type"]]=zones; + std::vector&zones=parsedMapInfo.ZoneData[newTag.data["type"]]; + zones.emplace_back(geom2d::rect{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}}); + prevZoneData=&zones.back(); } }else{ if(_DEBUG_MAP_LOAD_INFO)std::cout<<"Unsupported tag format! Ignoring."<<"\n"; @@ -423,9 +432,9 @@ typedef std::map>> ZoneData; SpawnerTag&spawner=spawnerData.second; for(auto&zoneData:parsedMapInfo.ZoneData){ if(zoneData.first=="UpperZone"){ - std::vector>&zones=zoneData.second; - for(geom2d::rect&zone:zones){ - if(geom2d::overlaps(zone,geom2d::rect{{spawner.ObjectData.GetInteger("x"),spawner.ObjectData.GetInteger("y")},{spawner.ObjectData.GetInteger("width"),spawner.ObjectData.GetInteger("height")}})){ + std::vector&zones=zoneData.second; + for(ZoneData&zone:zones){ + if(geom2d::overlaps(zone.zone,geom2d::rect{{spawner.ObjectData.GetInteger("x"),spawner.ObjectData.GetInteger("y")},{spawner.ObjectData.GetInteger("width"),spawner.ObjectData.GetInteger("height")}})){ spawner.upperLevel=true; goto continueSpawnerLoop; } diff --git a/Crawler/Version.h b/Crawler/Version.h index 92ba25a7..5db2fc83 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -33,7 +33,7 @@ SUCH DAMAGE. #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 1 -#define VERSION_BUILD 2886 +#define VERSION_BUILD 2903 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/Campaigns/1_1_v2.tmx b/Crawler/assets/Campaigns/1_1_v2.tmx index cf8a7bc0..2752890c 100644 --- a/Crawler/assets/Campaigns/1_1_v2.tmx +++ b/Crawler/assets/Campaigns/1_1_v2.tmx @@ -1,5 +1,5 @@ - + @@ -1269,7 +1269,11 @@ - + + + + + @@ -1965,6 +1969,6 @@ - + diff --git a/Crawler/assets/config/gfx/gfx.txt b/Crawler/assets/config/gfx/gfx.txt index 9232fd76..9fee7653 100644 --- a/Crawler/assets/config/gfx/gfx.txt +++ b/Crawler/assets/config/gfx/gfx.txt @@ -38,6 +38,7 @@ Images GFX_SlimeKing_Cast = monsters/Slime King - Cast.png GFX_SkillOverlayIcon = skill_overlay_icon.png GFX_SkillOverlayIconOverlay = skill_overlay_icon_overlay.png + GFX_FinishRing = finishring.png # Ability Icons GFX_Warrior_BattleCry_Icon = Ability Icons/battlecry.png diff --git a/Crawler/assets/finishring.png b/Crawler/assets/finishring.png new file mode 100644 index 0000000000000000000000000000000000000000..61ca8204a89a4bd8e132ac8fb93819309b412eda GIT binary patch literal 19459 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 a|M-8cEk9-6z+hqk0000