diff --git a/Adventures in Lestoria/Adventures in Lestoria.tiled-project b/Adventures in Lestoria/Adventures in Lestoria.tiled-project index d10f46b4..dfc6b606 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.tiled-project +++ b/Adventures in Lestoria/Adventures in Lestoria.tiled-project @@ -526,6 +526,45 @@ ], "valuesAsFlags": false }, + { + "color": "#ffa0a0a4", + "drawFill": true, + "id": 42, + "members": [ + { + "name": "Spawn1", + "type": "object", + "value": 0 + }, + { + "name": "Spawn2", + "type": "object", + "value": 0 + }, + { + "name": "Spawn3", + "type": "object", + "value": 0 + }, + { + "name": "Spawn4", + "type": "object", + "value": 0 + }, + { + "name": "Spawn5", + "type": "object", + "value": 0 + } + ], + "name": "SpawnController", + "type": "class", + "useAs": [ + "property", + "object", + "project" + ] + }, { "color": "#ffe67300", "drawFill": true, diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index 653a2988..b7622f0c 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -94,9 +94,10 @@ bool _DEBUG_MAP_LOAD_INFO = false; vi2d WINDOW_SIZE={24*15,24*10}; safemapANIMATION_DATA; std::vector>MONSTER_LIST; -std::vectorSPAWNER_LIST; +std::unordered_mapSPAWNER_LIST; std::vector>DAMAGENUMBER_LIST; std::vector>BULLET_LIST; +std::optional>SPAWNER_CONTROLLER; safemapGFX; utils::datafile DATA; AiL*game; @@ -2390,6 +2391,7 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){ #pragma endregion SPAWNER_LIST.clear(); + SPAWNER_CONTROLLER={}; foregroundTileGroups.clear(); upperForegroundTileGroups.clear(); MONSTER_LIST.clear(); @@ -2452,6 +2454,17 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){ #pragma region Monster Spawn Data Setup (Loading phase 2) LoadingScreen::AddPhase([&](){ SetMosaicEffect(1U); + std::unordered_setIdsToDisable; // + if(MAP_DATA[GetCurrentLevel()].spawnControllerIDs.has_value()){ + std::queuespawnController=MAP_DATA[GetCurrentLevel()].spawnControllerIDs.value(); + while(!spawnController.empty()){ + const int spawnerId=spawnController.front(); + spawnController.pop(); + auto result=IdsToDisable.insert(spawnerId); + if(!result.second)ERR(std::format("WARNING! Duplicate spawnerId {} detected when loading monster spawners. THIS SHOULD NOT BE HAPPENING!",spawnerId)); + } + } + for(auto&[key,value]:MAP_DATA[GetCurrentLevel()].SpawnerData){ SpawnerTag&spawnData=MAP_DATA[GetCurrentLevel()].SpawnerData[key]; std::vector>monster_list; @@ -2461,8 +2474,14 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){ std::string monsterName=monster.GetString("value"); monster_list.push_back({monsterName,{monster.GetInteger("x")-spawnData.ObjectData.GetFloat("x"),monster.GetInteger("y")-spawnData.ObjectData.GetFloat("y")}}); } - SPAWNER_LIST.push_back(MonsterSpawner{{spawnData.ObjectData.GetFloat("x"),spawnData.ObjectData.GetFloat("y")},spawnerRadius*2,monster_list,spawnData.upperLevel,spawnData.bossNameDisplay}); + + const int spawnerId=spawnData.ObjectData.GetInteger("id"); + + if(SPAWNER_LIST.count(spawnerId))ERR(std::format("WARNING! Spawner ID {} for Map {} is somehow duplicated! THIS SHOULD NOT BE HAPPENING!",spawnData.ObjectData.GetInteger("id"),GetCurrentMapDisplayName())) + SPAWNER_LIST[spawnerId]=MonsterSpawner{{spawnData.ObjectData.GetFloat("x"),spawnData.ObjectData.GetFloat("y")},spawnerRadius*2,monster_list,spawnData.upperLevel,spawnData.bossNameDisplay}; + if(IdsToDisable.count(spawnerId))SPAWNER_LIST.at(spawnerId).SetTriggered(true,false); //Force this spawner to be deactivated because it is in a spawn controller. } + SPAWNER_CONTROLLER=MAP_DATA[GetCurrentLevel()].spawnControllerIDs; return true; }); #pragma endregion @@ -3493,8 +3512,9 @@ void AiL::InitializeDefaultKeybinds(){ } void AiL::SetBossNameDisplay(std::string name,float time){ + const bool HasNotBeenDisplayedYet=bossName==""; bossName=name; - bossDisplayTimer=time; + if(HasNotBeenDisplayedYet)bossDisplayTimer=time; //Only display once. } bool AiL::InBossEncounter(){ diff --git a/Adventures in Lestoria/DEFINES.h b/Adventures in Lestoria/DEFINES.h index c41dbee2..78d998cb 100644 --- a/Adventures in Lestoria/DEFINES.h +++ b/Adventures in Lestoria/DEFINES.h @@ -41,9 +41,12 @@ All rights reserved. using BackdropName=std::string; +using MonsterSpawnerID=int; + #define INCLUDE_ANIMATION_DATA extern safemapANIMATION_DATA; #define INCLUDE_MONSTER_LIST extern std::vector>MONSTER_LIST; -#define INCLUDE_SPAWNER_LIST extern std::vectorSPAWNER_LIST; +#define INCLUDE_SPAWNER_LIST extern std::unordered_mapSPAWNER_LIST; +#define INCLUDE_SPAWNER_CONTROLLER extern std::optional>SPAWNER_CONTROLLER; #define INCLUDE_DAMAGENUMBER_LIST extern std::vector>DAMAGENUMBER_LIST; #define INCLUDE_game extern AiL*game; #define INCLUDE_MONSTER_DATA extern std::mapMONSTER_DATA; diff --git a/Adventures in Lestoria/Monster.cpp b/Adventures in Lestoria/Monster.cpp index 4d784d2d..9a2873bc 100644 --- a/Adventures in Lestoria/Monster.cpp +++ b/Adventures in Lestoria/Monster.cpp @@ -60,6 +60,8 @@ INCLUDE_game INCLUDE_BULLET_LIST INCLUDE_DATA INCLUDE_GFX +INCLUDE_SPAWNER_LIST +INCLUDE_SPAWNER_CONTROLLER safemap>STRATEGY_DATA; std::unordered_mapMonsterData::imgs; @@ -332,7 +334,7 @@ bool Monster::Update(float fElapsedTime){ if(!HasIframes()){ for(std::unique_ptr&m:MONSTER_LIST){ if(&*m==this)continue; - if(!m->HasIframes()&&OnUpperLevel()==m->OnUpperLevel()&&abs(m->GetZ()-GetZ())<=1&&geom2d::overlaps(geom2d::circle(pos,GetCollisionRadius()),geom2d::circle(m->GetPos(),12*m->GetSizeMult()/2))){ + if(!m->HasIframes()&&OnUpperLevel()==m->OnUpperLevel()&&abs(m->GetZ()-GetZ())<=1&&geom2d::overlaps(geom2d::circle(pos,GetCollisionRadius()),geom2d::circle(m->GetPos(),m->GetCollisionRadius()))){ m->Collision(*this); geom2d::line line(pos,m->GetPos()); float dist = line.length(); @@ -810,16 +812,25 @@ void Monster::OnDeath(){ if(isBoss){ game->ReduceBossEncounterMobCount(); + if(game->BossEncounterMobCount()==0){ - ZoneData exitRing{geom2d::rect{vi2d{GetPos()-vf2d{"boss_spawn_ring_radius"_F,"boss_spawn_ring_radius"_F}},vi2d{"boss_spawn_ring_radius"_I*2,"boss_spawn_ring_radius"_I*2}},OnUpperLevel()}; + const bool exitRingShouldNotSpawn=SPAWNER_CONTROLLER.has_value()&&!SPAWNER_CONTROLLER.value().empty(); + + if(exitRingShouldNotSpawn){ //See if we have a spawn controller and if we do, spawn the monsters from it instead of spawning the boss ring first. + const int nextSpawnerId=SPAWNER_CONTROLLER.value().front(); + SPAWNER_CONTROLLER.value().pop(); + SPAWNER_LIST[nextSpawnerId].SetTriggered(true); + }else{ + ZoneData exitRing{geom2d::rect{vi2d{GetPos()-vf2d{"boss_spawn_ring_radius"_F,"boss_spawn_ring_radius"_F}},vi2d{"boss_spawn_ring_radius"_I*2,"boss_spawn_ring_radius"_I*2}},OnUpperLevel()}; - const geom2d::rectarenaBounds=game->GetZones().at("BossArena")[0].zone; - geom2d::rectclampedArena{vi2d(arenaBounds.pos+"boss_spawn_ring_radius"_I),vi2d(arenaBounds.size-"boss_spawn_ring_radius"_I*2)}; + const geom2d::rectarenaBounds=game->GetZones().at("BossArena")[0].zone; + geom2d::rectclampedArena{vi2d(arenaBounds.pos+"boss_spawn_ring_radius"_I),vi2d(arenaBounds.size-"boss_spawn_ring_radius"_I*2)}; - exitRing.zone.pos.x=std::clamp(exitRing.zone.pos.x,clampedArena.pos.x-"boss_spawn_ring_radius"_I,clampedArena.pos.x-"boss_spawn_ring_radius"_I+clampedArena.size.x); - exitRing.zone.pos.y=std::clamp(exitRing.zone.pos.y,clampedArena.pos.y-"boss_spawn_ring_radius"_I,clampedArena.pos.y-"boss_spawn_ring_radius"_I+clampedArena.size.y); + exitRing.zone.pos.x=std::clamp(exitRing.zone.pos.x,clampedArena.pos.x-"boss_spawn_ring_radius"_I,clampedArena.pos.x-"boss_spawn_ring_radius"_I+clampedArena.size.x); + exitRing.zone.pos.y=std::clamp(exitRing.zone.pos.y,clampedArena.pos.y-"boss_spawn_ring_radius"_I,clampedArena.pos.y-"boss_spawn_ring_radius"_I+clampedArena.size.y); - game->AddZone("EndZone",exitRing); //Create a 144x144 ring around the dead boss. + game->AddZone("EndZone",exitRing); //Create a 144x144 ring around the dead boss. + } } } @@ -1043,7 +1054,7 @@ const std::optionalMonster::GetTotalLifetime()const{ return MONSTER_DATA.at(GetName()).GetLifetime(); } const float Monster::GetCollisionRadius()const{ - return MONSTER_DATA.at(GetName()).GetCollisionRadius(); + return MONSTER_DATA.at(GetName()).GetCollisionRadius()*GetSizeMult(); } void Monster::MarkForDeletion(){ diff --git a/Adventures in Lestoria/MonsterData.cpp b/Adventures in Lestoria/MonsterData.cpp index 17abbbb9..666a3171 100644 --- a/Adventures in Lestoria/MonsterData.cpp +++ b/Adventures in Lestoria/MonsterData.cpp @@ -185,7 +185,7 @@ void MonsterData::InitializeMonsterData(){ if(DATA["Monsters"][MonsterName].HasProperty("Invulnerable"))monster.invulnerable=DATA["Monsters"][MonsterName]["Invulnerable"].GetBool(); if(DATA["Monsters"][MonsterName].HasProperty("Lifetime"))monster.lifetime=DATA["Monsters"][MonsterName]["Lifetime"].GetReal(); - monster.collisionRadius=12*monster.GetSizeMult()/2.f; + monster.collisionRadius=8; if(DATA["Monsters"][MonsterName].HasProperty("Collision Radius"))monster.collisionRadius=DATA["Monsters"][MonsterName]["Collision Radius"].GetReal(); if(hasFourWaySpriteSheet)monster.SetUsesFourWaySprites(); @@ -436,5 +436,5 @@ const std::optionalMonsterData::GetLifetime()const{ return lifetime; } const float MonsterData::GetCollisionRadius()const{ - return collisionRadius*GetSizeMult(); + return collisionRadius; } \ No newline at end of file diff --git a/Adventures in Lestoria/Player.cpp b/Adventures in Lestoria/Player.cpp index c4afc045..c84514ec 100644 --- a/Adventures in Lestoria/Player.cpp +++ b/Adventures in Lestoria/Player.cpp @@ -867,7 +867,7 @@ void Player::Moved(){ castPrepAbility->waitForRelease=true; CancelCast(); } - for(MonsterSpawner&spawner:SPAWNER_LIST){ + for(auto&[spawnerID,spawner]:SPAWNER_LIST){ if(!spawner.SpawnTriggered()&&spawner.DoesUpperLevelSpawning()==OnUpperLevel()&&geom2d::contains(geom2d::rect{spawner.GetPos(),spawner.GetRange()},pos)){ if(GameState::STATE==GameState::states[States::GAME_RUN]){ if(!Tutorial::TaskIsComplete(TutorialTaskName::USE_ATTACK)){ diff --git a/Adventures in Lestoria/Stone_Elemental.cpp b/Adventures in Lestoria/Stone_Elemental.cpp index cf54968b..235f2833 100644 --- a/Adventures in Lestoria/Stone_Elemental.cpp +++ b/Adventures in Lestoria/Stone_Elemental.cpp @@ -96,8 +96,8 @@ void Monster::STRATEGY::STONE_ELEMENTAL(Monster&m,float fElapsedTime,std::string m.phase=STONE_PILLAR_CAST; m.F(A::CASTING_TIMER)=ConfigFloat("Stone Pillar Cast Time"); m.V(A::LOCKON_POS)=game->GetPlayer()->GetPos(); - game->AddEffect(std::make_unique(m.V(A::LOCKON_POS),ConfigFloat("Stone Pillar Cast Time"),"range_indicator.png",m.OnUpperLevel(),vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()/12.f)*1.1f,0.3f,vf2d{},ConfigPixel("Stone Pillar Spell Circle Color"),util::random(2*PI),util::degToRad(ConfigFloat("Stone Pillar Spell Circle Rotation Spd"))),true); - game->AddEffect(std::make_unique(m.V(A::LOCKON_POS),ConfigFloat("Stone Pillar Cast Time"),"spell_insignia.png",m.OnUpperLevel(),vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()/12.f)*0.75f,0.3f,vf2d{},ConfigPixel("Stone Pillar Spell Insignia Color"),util::random(2*PI),util::degToRad(ConfigFloat("Stone Pillar Spell Insignia Rotation Spd"))),true); + game->AddEffect(std::make_unique(m.V(A::LOCKON_POS),ConfigFloat("Stone Pillar Cast Time"),"range_indicator.png",m.OnUpperLevel(),vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Pillar").GetSizeMult()/12.f)*1.1f,0.3f,vf2d{},ConfigPixel("Stone Pillar Spell Circle Color"),util::random(2*PI),util::degToRad(ConfigFloat("Stone Pillar Spell Circle Rotation Spd"))),true); + game->AddEffect(std::make_unique(m.V(A::LOCKON_POS),ConfigFloat("Stone Pillar Cast Time"),"spell_insignia.png",m.OnUpperLevel(),vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Pillar").GetSizeMult()/12.f)*0.75f,0.3f,vf2d{},ConfigPixel("Stone Pillar Spell Insignia Color"),util::random(2*PI),util::degToRad(ConfigFloat("Stone Pillar Spell Insignia Rotation Spd"))),true); }break; case 1:{ m.PerformAnimation("ROCK TOSS CAST"); @@ -128,9 +128,9 @@ void Monster::STRATEGY::STONE_ELEMENTAL(Monster&m,float fElapsedTime,std::string if(m.F(A::CASTING_TIMER)<=0.f){ game->SpawnMonster(m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Pillar"),m.OnUpperLevel()); ReturnToWaitingPhase(); - game->Hurt(m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Pillar").GetCollisionRadius(),m.GetAttack(),m.OnUpperLevel(),0.f,HurtType::PLAYER); + game->Hurt(m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Pillar").GetSizeMult(),m.GetAttack(),m.OnUpperLevel(),0.f,HurtType::PLAYER); } - if(geom2d::overlaps(geom2d::circle{m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()},geom2d::circle{m.GetPos(),m.GetCollisionRadius()})){ + if(geom2d::overlaps(geom2d::circle{m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Pillar").GetSizeMult()},geom2d::circle{m.GetPos(),m.GetCollisionRadius()})){ geom2d::linestonePillarCastLine{m.V(A::LOCKON_POS),m.GetPos()}; const vf2d targetWalkPos=stonePillarCastLine.rpoint(stonePillarCastLine.length()+48.f); m.target=targetWalkPos; diff --git a/Adventures in Lestoria/TMXParser.h b/Adventures in Lestoria/TMXParser.h index 8c42196b..225b804e 100644 --- a/Adventures in Lestoria/TMXParser.h +++ b/Adventures in Lestoria/TMXParser.h @@ -46,6 +46,7 @@ All rights reserved. #include "ItemMapData.h" #include "Class.h" #include "MonsterData.h" +#include INCLUDE_MONSTER_DATA @@ -133,7 +134,8 @@ private: std::unordered_mapdevCompletionTrialTime; BackdropName backdrop=""; std::setspawns; - std::map SpawnerData; //Spawn groups have IDs, mobs associate which spawner they are tied to via this ID. + std::mapSpawnerData; //Spawn groups have IDs, mobs associate which spawner they are tied to via this ID. + std::optional>spawnControllerIDs; std::map> ZoneData; const std::map>&GetZones()const; public: @@ -146,6 +148,8 @@ public: const float GetDevCompletionTime(Class cl)const; const MapName&GetMapName()const; const std::string_view GetMapDisplayName()const; + const bool HasMoreSpawns()const; //Returns whether or not there are more spawns for the spawn controller. + const int Spawn_pop(); //Grabs the next spawn controller ID and removes it from the stack. 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); @@ -184,6 +188,7 @@ class TMXParser{ XMLTag npcTag; XMLTag spawnerLinkTag; StagePlate*currentStagePlate=nullptr; + std::optionalspawnControllerTag; std::vectoraccumulatedMonsterTags; std::mapstagePlates; bool infiniteMap=false; @@ -312,6 +317,15 @@ class TMXParser{ const std::string_view Map::GetMapDisplayName()const{ return name; } + const bool Map::HasMoreSpawns()const{ + return spawnControllerIDs.has_value()&&spawnControllerIDs.value().size()>0; + } + const int Map::Spawn_pop(){ + if(!HasMoreSpawns())ERR("WARNING! Trying to pop from queue when there are no items! Make sure to use HasMoreSpawns() first!"); + const int nextSpawnId=spawnControllerIDs.value().front(); + spawnControllerIDs.value().pop(); + return nextSpawnId; + } NPCData::NPCData(){} NPCData::NPCData(XMLTag npcTag){ const std::arraytags={"Function","NPC Name","Roaming Range","Unlock Condition","Spritesheet","x","y"}; @@ -435,6 +449,7 @@ class TMXParser{ inNPCTag=false; parsedMapInfo.npcs.push_back(NPCData{npcTag}); } + if(newTag.tag=="object"&&newTag.data["type"]!="SpawnController"&&spawnControllerTag.has_value())spawnControllerTag={}; if (newTag.tag=="map"){ if(stoi(newTag.data["infinite"])==1){ @@ -454,6 +469,9 @@ class TMXParser{ parsedMapInfo.LayerData.push_back(l); currentLayerTag=&parsedMapInfo.LayerData.back(); }else + if (newTag.tag=="object"&&newTag.data["type"]=="SpawnController"){ + spawnControllerTag=newTag; + }else if (newTag.tag=="object"&&newTag.data["type"]=="SpawnGroup"){ if(newTag.GetInteger("id")!=0){ parsedMapInfo.SpawnerData[newTag.GetInteger("id")]={newTag}; @@ -518,6 +536,10 @@ class TMXParser{ monsterTag=newTag; monsterPropertyTagCount=0; }else + if(newTag.tag=="property"&&spawnControllerTag.has_value()) { + if(!parsedMapInfo.HasMoreSpawns())parsedMapInfo.spawnControllerIDs=std::queue{}; + parsedMapInfo.spawnControllerIDs.value().push(newTag.GetInteger("value")); + }else if (newTag.tag=="property"&&inNPCTag) { npcTag.data[newTag.data["name"]]=newTag.data["value"]; }else diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index 6d55270c..185b55ec 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_PATCH 0 -#define VERSION_BUILD 9362 +#define VERSION_BUILD 9378 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/assets/Campaigns/Boss_2_B.tmx b/Adventures in Lestoria/assets/Campaigns/Boss_2_B.tmx index 6f13e53b..a3b54ea9 100644 --- a/Adventures in Lestoria/assets/Campaigns/Boss_2_B.tmx +++ b/Adventures in Lestoria/assets/Campaigns/Boss_2_B.tmx @@ -1,5 +1,5 @@ - + @@ -601,8 +601,47 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -614,7 +653,7 @@ - + diff --git a/Adventures in Lestoria/assets/maps/Monster_Presets.tmx b/Adventures in Lestoria/assets/maps/Monster_Presets.tmx index 7cbf5e20..d2f737e5 100644 --- a/Adventures in Lestoria/assets/maps/Monster_Presets.tmx +++ b/Adventures in Lestoria/assets/maps/Monster_Presets.tmx @@ -1,5 +1,5 @@ - + @@ -23,5 +23,8 @@ + + + diff --git a/Adventures in Lestoria/assets/maps/Monsters/Hawk_NOXP.tx b/Adventures in Lestoria/assets/maps/Monsters/Hawk_NOXP.tx index ba5704fe..a9d2813d 100644 --- a/Adventures in Lestoria/assets/maps/Monsters/Hawk_NOXP.tx +++ b/Adventures in Lestoria/assets/maps/Monsters/Hawk_NOXP.tx @@ -1,5 +1,5 @@ diff --git a/Adventures in Lestoria/assets/maps/Monsters/Major Hawk.tx b/Adventures in Lestoria/assets/maps/Monsters/Major Hawk.tx new file mode 100644 index 00000000..0cb2ac4e --- /dev/null +++ b/Adventures in Lestoria/assets/maps/Monsters/Major Hawk.tx @@ -0,0 +1,5 @@ + + diff --git a/Adventures in Lestoria/assets/maps/Monsters/Zephy, King of Birds.tx b/Adventures in Lestoria/assets/maps/Monsters/Zephy, King of Birds.tx new file mode 100644 index 00000000..8209d01d --- /dev/null +++ b/Adventures in Lestoria/assets/maps/Monsters/Zephy, King of Birds.tx @@ -0,0 +1,5 @@ + + diff --git a/Adventures in Lestoria/assets/maps/monsters-tileset.png b/Adventures in Lestoria/assets/maps/monsters-tileset.png index 5080d54c..29e816cc 100644 Binary files a/Adventures in Lestoria/assets/maps/monsters-tileset.png and b/Adventures in Lestoria/assets/maps/monsters-tileset.png differ diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index d13cb4db..cbb3121f 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ