diff --git a/include/Screeps/Room.hpp b/include/Screeps/Room.hpp index 4360990..cbf7c5f 100644 --- a/include/Screeps/Room.hpp +++ b/include/Screeps/Room.hpp @@ -61,19 +61,16 @@ public: template std::vector> find(std::function predicate = {}) const { - std::vector> objects = find(T::findConstant); if (predicate) - objects.erase(std::remove_if(objects.begin(), objects.end(), - [predicate](const std::unique_ptr& object) - { - if (auto* ptr = dynamic_cast(object.get())) - return !predicate(*ptr); - else - return true; - }), - objects.end()); - - return objects; + { + auto p = [&](const JS::Value& value) + { + return predicate(T(value)); + }; + return find(T::findConstant, p); + } + else + return find(T::findConstant); } int findExitTo(const std::string& room); diff --git a/src/RoomObject.cpp b/src/RoomObject.cpp index d58d64a..31dfcd3 100644 --- a/src/RoomObject.cpp +++ b/src/RoomObject.cpp @@ -63,36 +63,42 @@ std::unique_ptr createRoomObject(JS::Value object) }; // FIXME: sort by rarity - if (is("StructureRoad")) - return std::make_unique(std::move(object)); - else if (is("StructureWall")) - return std::make_unique(std::move(object)); - else if (is("StructureRampart")) - return std::make_unique(std::move(object)); - else if (is("StructureExtension")) - return std::make_unique(std::move(object)); + if (is("Structure")) + { + std::string type = object["structureType"].as(); + if (type == Screeps::STRUCTURE_ROAD) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_WALL) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_RAMPART) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_EXTENSION) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_CONTAINER) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_TOWER) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_LINK) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_SPAWN) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_CONTROLLER) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_STORAGE) + return std::make_unique(std::move(object)); + else if (type == Screeps::STRUCTURE_EXTRACTOR) + return std::make_unique(std::move(object)); + else + return nullptr; + } else if (is("Creep")) return std::make_unique(std::move(object)); - else if (is("StructureContainer")) - return std::make_unique(std::move(object)); else if (is("Source")) return std::make_unique(std::move(object)); else if (is("ConstructionSite")) return std::make_unique(std::move(object)); - else if (is("StructureTower")) - return std::make_unique(std::move(object)); - else if (is("StructureLink")) - return std::make_unique(std::move(object)); - else if (is("StructureSpawn")) - return std::make_unique(std::move(object)); else if (is("Ruin")) return std::make_unique(std::move(object)); - else if (is("StructureController")) - return std::make_unique(std::move(object)); - else if (is("StructureStorage")) - return std::make_unique(std::move(object)); - else if (is("StructureExtractor")) - return std::make_unique(std::move(object)); else if (is("Deposit")) return std::make_unique(std::move(object)); else if (is("Flag"))