store ship module layout in shipyard blueprint

This commit is contained in:
2026-06-04 21:38:46 +02:00
parent 42b51cc6f4
commit 3e19e44f24
6 changed files with 252 additions and 18 deletions

View File

@@ -7,6 +7,7 @@
#include "BuildingType.h"
#include "Rotation.h"
#include "ShipLayout.h"
namespace
{
@@ -50,6 +51,20 @@ std::string serialize(const std::vector<Blueprint>& blueprints)
bldTbl.insert("offset_x", static_cast<int64_t>(b.offset.x()));
bldTbl.insert("offset_y", static_cast<int64_t>(b.offset.y()));
bldTbl.insert("recipe_id", b.recipeId);
if (b.shipLayout.has_value())
{
toml::array modArr;
for (const PlacedModule& pm : b.shipLayout->placedModules)
{
toml::table modTbl;
modTbl.insert("type", pm.moduleId);
modTbl.insert("x", static_cast<int64_t>(pm.position.x()));
modTbl.insert("y", static_cast<int64_t>(pm.position.y()));
modTbl.insert("rotation", rotationToString(pm.rotation));
modArr.push_back(std::move(modTbl));
}
bldTbl.insert("modules", std::move(modArr));
}
bldArr.push_back(std::move(bldTbl));
}
@@ -123,6 +138,27 @@ std::vector<Blueprint> deserialize(const std::string& tomlContent)
bb.offset.setX(static_cast<int>((*bldTbl)["offset_x"].value_or(int64_t{0})));
bb.offset.setY(static_cast<int>((*bldTbl)["offset_y"].value_or(int64_t{0})));
bb.recipeId = (*bldTbl)["recipe_id"].value_or(std::string{});
const toml::array* modArr = (*bldTbl)["modules"].as_array();
if (modArr)
{
ShipLayoutConfig layout;
for (std::size_t k = 0; k < modArr->size(); ++k)
{
const toml::table* modTbl = (*modArr)[k].as_table();
if (!modTbl) { continue; }
const std::optional<std::string> modType = (*modTbl)["type"].value<std::string>();
const std::optional<int64_t> x = (*modTbl)["x"].value<int64_t>();
const std::optional<int64_t> y = (*modTbl)["y"].value<int64_t>();
const std::optional<std::string> rotStr = (*modTbl)["rotation"].value<std::string>();
if (!modType || !x || !y || !rotStr) { continue; }
PlacedModule pm;
pm.moduleId = *modType;
pm.position = QPoint(static_cast<int>(*x), static_cast<int>(*y));
pm.rotation = parseRotation(*rotStr);
layout.placedModules.push_back(std::move(pm));
}
bb.shipLayout = std::move(layout);
}
bp.buildings.push_back(std::move(bb));
}
}

View File

@@ -1,5 +1,6 @@
#pragma once
#include <optional>
#include <string>
#include <vector>
@@ -8,6 +9,7 @@
#include "BuildingType.h"
#include "Rotation.h"
#include "ShipLayout.h"
struct BlueprintBuilding
{
@@ -15,6 +17,7 @@ struct BlueprintBuilding
Rotation rotation;
QPoint offset; // tile offset from bounding-box center (floor for even sizes)
std::string recipeId; // empty = none selected
std::optional<ShipLayoutConfig> shipLayout;
};
struct Blueprint