From 8f425199119e34ef8f50aa36a26361c9bd3c2d48 Mon Sep 17 00:00:00 2001 From: Malte Langkabel Date: Mon, 3 Aug 2026 22:27:05 +0200 Subject: [PATCH] extract loadBuildings into ConfigLoaderBuildings.cpp Continues the ConfigLoader.cpp domain split. Pure move of loadBuildings; no domain-specific helpers to relocate here. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01YHcUerKAZKWNvSKJxYKbnG --- src/lib/config/CMakeLists.txt | 1 + src/lib/config/ConfigLoader.cpp | 49 -------------------- src/lib/config/ConfigLoaderBuildings.cpp | 58 ++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 49 deletions(-) create mode 100644 src/lib/config/ConfigLoaderBuildings.cpp diff --git a/src/lib/config/CMakeLists.txt b/src/lib/config/CMakeLists.txt index 4ee18e2..627c23d 100644 --- a/src/lib/config/CMakeLists.txt +++ b/src/lib/config/CMakeLists.txt @@ -22,6 +22,7 @@ SET(SRCS ${CMAKE_CURRENT_SOURCE_DIR}/Formula.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ConfigLoader.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ConfigLoaderWorld.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ConfigLoaderBuildings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/SurfaceMask.cpp ${CMAKE_CURRENT_SOURCE_DIR}/BlueprintSerializer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ShipLayoutBlueprintSerializer.cpp diff --git a/src/lib/config/ConfigLoader.cpp b/src/lib/config/ConfigLoader.cpp index 19adeac..a055d65 100644 --- a/src/lib/config/ConfigLoader.cpp +++ b/src/lib/config/ConfigLoader.cpp @@ -91,55 +91,6 @@ std::vector parsePlacedModules(const toml::array& arr, // --- Per-file loaders ----------------------------------------------------- -BuildingsConfig ConfigLoader::loadBuildings(const std::string& path) -{ - const std::string file = "buildings.toml"; - toml::table tbl = parseFile(path, file); - - BuildingsConfig cfg; - const toml::array& arr = requireArray(tbl["building"], file, "building"); - - for (std::size_t i = 0; i < arr.size(); ++i) - { - const std::string elemPath = "building[" + std::to_string(i) + "]"; - const toml::table* bt = arr[i].as_table(); - if (bt == nullptr) - { - throw makeError(file, elemPath, "not a table"); - } - toml::table& mt = const_cast(*bt); - - BuildingDef def; - def.id = requireString(mt["id"], file, elemPath + ".id"); - def.cost = static_cast(requireInt(mt["cost"], file, elemPath + ".cost")); - def.playerPlaceable = requireBool(mt["player_placeable"], file, elemPath + ".player_placeable"); - def.constructionTimeSeconds = requireDouble(mt["construction_time_seconds"], file, elemPath + ".construction_time_seconds"); - def.surfaceMask = requireStringArray(mt["surface_mask"], file, elemPath + ".surface_mask"); - - if (mt.contains("output_buffer_capacity")) - { - def.outputBufferCapacity = static_cast( - requireInt(mt["output_buffer_capacity"], file, elemPath + ".output_buffer_capacity")); - } - - if (mt.contains("tooltip")) - { - def.tooltip = requireString(mt["tooltip"], file, elemPath + ".tooltip"); - } - - const std::optional parsedType = parseBuildingType(def.id); - if (!parsedType) - { - throw makeError(file, elemPath + ".id", "unknown building id '" + def.id + "'"); - } - def.type = *parsedType; - - cfg.buildings.push_back(std::move(def)); - } - - return cfg; -} - RecipesConfig ConfigLoader::loadRecipes(const std::string& path) { const std::string file = "recipes.toml"; diff --git a/src/lib/config/ConfigLoaderBuildings.cpp b/src/lib/config/ConfigLoaderBuildings.cpp new file mode 100644 index 0000000..1c17a23 --- /dev/null +++ b/src/lib/config/ConfigLoaderBuildings.cpp @@ -0,0 +1,58 @@ +#include "ConfigLoader.h" + +#include +#include +#include + +#include "toml.hpp" + +#include "TomlHelpers.h" + +BuildingsConfig ConfigLoader::loadBuildings(const std::string& path) +{ + const std::string file = "buildings.toml"; + toml::table tbl = parseFile(path, file); + + BuildingsConfig cfg; + const toml::array& arr = requireArray(tbl["building"], file, "building"); + + for (std::size_t i = 0; i < arr.size(); ++i) + { + const std::string elemPath = "building[" + std::to_string(i) + "]"; + const toml::table* bt = arr[i].as_table(); + if (bt == nullptr) + { + throw makeError(file, elemPath, "not a table"); + } + toml::table& mt = const_cast(*bt); + + BuildingDef def; + def.id = requireString(mt["id"], file, elemPath + ".id"); + def.cost = static_cast(requireInt(mt["cost"], file, elemPath + ".cost")); + def.playerPlaceable = requireBool(mt["player_placeable"], file, elemPath + ".player_placeable"); + def.constructionTimeSeconds = requireDouble(mt["construction_time_seconds"], file, elemPath + ".construction_time_seconds"); + def.surfaceMask = requireStringArray(mt["surface_mask"], file, elemPath + ".surface_mask"); + + if (mt.contains("output_buffer_capacity")) + { + def.outputBufferCapacity = static_cast( + requireInt(mt["output_buffer_capacity"], file, elemPath + ".output_buffer_capacity")); + } + + if (mt.contains("tooltip")) + { + def.tooltip = requireString(mt["tooltip"], file, elemPath + ".tooltip"); + } + + const std::optional parsedType = parseBuildingType(def.id); + if (!parsedType) + { + throw makeError(file, elemPath + ".id", "unknown building id '" + def.id + "'"); + } + def.type = *parsedType; + + cfg.buildings.push_back(std::move(def)); + } + + return cfg; +}