CDamageArrayHandler::CDamageArrayHandler(LuaParser* defsParser) { #define DEFAULT_ARMORDEF_NAME "default" try { const LuaTable rootTable = defsParser->GetRoot().SubTable("ArmorDefs"); if (!rootTable.IsValid()) throw content_error("Error loading ArmorDefs"); // GetKeys() sorts the keys, so can not simply push_back before call rootTable.GetKeys(armorDefKeys); armorDefKeys.insert(armorDefKeys.begin(), DEFAULT_ARMORDEF_NAME); armorDefNameIdxMap[DEFAULT_ARMORDEF_NAME] = 0; LOG("[%s] number of ArmorDefs: " _STPF_, __FUNCTION__, armorDefKeys.size()); // expects the following structure, subtables must be in array-format: // // {"tanks" = {[1] = "supertank", [2] = "megatank"}, "infantry" = {[1] = "dude"}, ...} // // the old (pre-95.0) <key, value> subtable definitions are no longer supported! // for (unsigned int armorDefIdx = 1; armorDefIdx < armorDefKeys.size(); armorDefIdx++) { const std::string armorDefName = StringToLower(armorDefKeys[armorDefIdx]); if (armorDefName == DEFAULT_ARMORDEF_NAME) { // ignore, no need to clear entire table LOG_L(L_WARNING, "[%s] ArmorDefs: tried to define the \"%s\" armor type!", __FUNCTION__, DEFAULT_ARMORDEF_NAME); continue; } armorDefNameIdxMap[armorDefName] = armorDefIdx; const LuaTable armorDefTable = rootTable.SubTable(armorDefKeys[armorDefIdx]); const unsigned int numArmorDefEntries = armorDefTable.GetLength(); for (unsigned int armorDefEntryIdx = 0; armorDefEntryIdx < numArmorDefEntries; armorDefEntryIdx++) { const std::string& unitDefName = StringToLower(armorDefTable.GetString(armorDefEntryIdx + 1, "")); const auto armorDefTableIt = armorDefNameIdxMap.find(unitDefName); if (armorDefTableIt == armorDefNameIdxMap.end()) { armorDefNameIdxMap[unitDefName] = armorDefIdx; continue; } LOG_L(L_WARNING, "[%s] UnitDef \"%s\" in ArmorDef \"%s\" already belongs to ArmorDef category %d!", __FUNCTION__, unitDefName.c_str(), armorDefName.c_str(), armorDefTableIt->second); } } } catch (const content_error&) { armorDefNameIdxMap.clear(); armorDefNameIdxMap[DEFAULT_ARMORDEF_NAME] = 0; armorDefKeys.clear(); armorDefKeys.push_back(DEFAULT_ARMORDEF_NAME); } }
MoveDefHandler::MoveDefHandler(LuaParser* defsParser) { const LuaTable rootTable = defsParser->GetRoot().SubTable("MoveDefs"); if (!rootTable.IsValid()) throw content_error("Error loading movement definitions"); CRC crc; for (int tt = 0; tt < CMapInfo::NUM_TERRAIN_TYPES; ++tt) { const CMapInfo::TerrainType& terrType = mapInfo->terrainTypes[tt]; crc << terrType.tankSpeed << terrType.kbotSpeed; crc << terrType.hoverSpeed << terrType.shipSpeed; } moveDefs.reserve(rootTable.GetLength()); for (size_t num = 1; /* no test */; num++) { const LuaTable moveDefTable = rootTable.SubTable(num); if (!moveDefTable.IsValid()) { break; } moveDefs.emplace_back(moveDefTable, num); const MoveDef& md = moveDefs.back(); moveDefNames[md.name] = md.pathType; crc << md.GetCheckSum(); } CMoveMath::noHoverWaterMove = (mapInfo->water.damage >= MAX_ALLOWED_WATER_DAMAGE_HMM); CMoveMath::waterDamageCost = (mapInfo->water.damage >= MAX_ALLOWED_WATER_DAMAGE_GMM)? 0.0f: (1.0f / (1.0f + mapInfo->water.damage * 0.1f)); crc << CMoveMath::waterDamageCost; crc << CMoveMath::noHoverWaterMove; checksum = crc.GetDigest(); }
static inline void GetGroundScars(std::unordered_map<std::string, STex>& textures) { LuaParser resourcesParser("gamedata/resources.lua", SPRING_VFS_MOD_BASE, SPRING_VFS_ZIP); if (!resourcesParser.Execute()) { LOG_L(L_ERROR, "Failed to load resources: %s", resourcesParser.GetErrorLog().c_str()); } const LuaTable scarsTable = resourcesParser.GetRoot().SubTable("graphics").SubTable("scars"); for (int i = 1; i <= scarsTable.GetLength(); ++i) { std::string texName = scarsTable.GetString(i, IntToString(i, "scars/scar%i.bmp")); std::string texName2 = texName + ".dds"; //FIXME auto name = IntToString(i); try { textures[ name ] = LoadTexture(texName); textures[GetExtraTextureName(name)] = LoadTexture(texName2); } catch(const content_error& err) { LOG_L(L_ERROR, "%s", err.what()); } } }