store ship module layout in shipyard blueprint
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user