std::vector<ObjectTemplate> AObjectTypeHandler::getTemplates(si32 terrainType) const// FIXME: replace with ETerrainType { std::vector<ObjectTemplate> templates = getTemplates(); std::vector<ObjectTemplate> filtered; std::copy_if(templates.begin(), templates.end(), std::back_inserter(filtered), [&](const ObjectTemplate & obj) { return obj.canBePlacedAt(ETerrainType(terrainType)); }); // H3 defines allowed terrains in a weird way - artifacts, monsters and resources have faulty masks here // Perhaps we should re-define faulty templates and remove this workaround (already done for resources) if (type == Obj::ARTIFACT || type == Obj::MONSTER) return templates; else return filtered; }
std::string nameFromType (int typ) { switch(ETerrainType(typ)) { case ETerrainType::DIRT: return std::string("DIRTTL.DEF"); case ETerrainType::SAND: return std::string("SANDTL.DEF"); case ETerrainType::GRASS: return std::string("GRASTL.DEF"); case ETerrainType::SNOW: return std::string("SNOWTL.DEF"); case ETerrainType::SWAMP: return std::string("SWMPTL.DEF"); case ETerrainType::ROUGH: return std::string("ROUGTL.DEF"); case ETerrainType::SUBTERRANEAN: return std::string("SUBBTL.DEF"); case ETerrainType::LAVA: return std::string("LAVATL.DEF"); case ETerrainType::WATER: return std::string("WATRTL.DEF"); case ETerrainType::ROCK: return std::string("ROCKTL.DEF"); case ETerrainType::BORDER: //TODO use me break; default: //TODO do something here break; } return std::string(); }
std::set<ETerrainType> CJsonRmgTemplateLoader::parseTerrainTypes(const JsonVector & terTypeStrings, const std::set<ETerrainType> & defaultTerrainTypes) const { std::set<ETerrainType> terTypes; if (terTypeStrings.empty()) //nothing was specified return defaultTerrainTypes; for(const auto & node : terTypeStrings) { const auto & terTypeStr = node.String(); if(terTypeStr == "all") return defaultTerrainTypes; auto pos = vstd::find_pos(GameConstants::TERRAIN_NAMES, terTypeStr); if (pos != -1) { terTypes.insert(ETerrainType(pos)); } else { throw std::runtime_error("Terrain type is invalid."); } } return terTypes; }
CFaction * CTownHandler::loadFromJson(const JsonNode &source) { auto faction = new CFaction(); faction->name = source["name"].String(); VLC->modh->identifiers.requestIdentifier ("creature", source["commander"], [=](si32 commanderID) { faction->commander = CreatureID(commanderID); }); faction->creatureBg120 = source["creatureBackground"]["120px"].String(); faction->creatureBg130 = source["creatureBackground"]["130px"].String(); faction->nativeTerrain = ETerrainType(vstd::find_pos(GameConstants::TERRAIN_NAMES, source["nativeTerrain"].String())); int alignment = vstd::find_pos(EAlignment::names, source["alignment"].String()); if (alignment == -1) faction->alignment = EAlignment::NEUTRAL; else faction->alignment = static_cast<EAlignment::EAlignment>(alignment); if (!source["town"].isNull()) { faction->town = new CTown; faction->town->faction = faction; loadTown(*faction->town, source["town"]); } else faction->town = nullptr; if (!source["puzzleMap"].isNull()) loadPuzzle(*faction, source["puzzleMap"]); return faction; }