diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarVehicleDatabase.cpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/game/StarVehicleDatabase.cpp')
-rw-r--r-- | source/game/StarVehicleDatabase.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/source/game/StarVehicleDatabase.cpp b/source/game/StarVehicleDatabase.cpp new file mode 100644 index 0000000..cb1a302 --- /dev/null +++ b/source/game/StarVehicleDatabase.cpp @@ -0,0 +1,66 @@ +#include "StarVehicleDatabase.hpp" +#include "StarVehicle.hpp" +#include "StarJsonExtra.hpp" +#include "StarRoot.hpp" +#include "StarAssets.hpp" + +namespace Star { + +VehicleDatabase::VehicleDatabase() { + auto assets = Root::singleton().assets(); + auto files = assets->scanExtension("vehicle"); + assets->queueJsons(files); + for (auto file : files) { + try { + auto config = assets->json(file); + String name = config.getString("name"); + + if (m_vehicles.contains(name)) + throw VehicleDatabaseException::format("Repeat vehicle name '%s'", name); + + m_vehicles.add(move(name), make_pair(move(file), move(config))); + } catch (StarException const& e) { + throw VehicleDatabaseException(strf("Error loading vehicle '%s'", file), e); + } + } +} + +VehiclePtr VehicleDatabase::create(String const& vehicleName, Json const& extraConfig) const { + auto configPair = m_vehicles.ptr(vehicleName); + if (!configPair) + throw VehicleDatabaseException::format("No such vehicle named '%s'", vehicleName); + return make_shared<Vehicle>(configPair->second, configPair->first, extraConfig); +} + +ByteArray VehicleDatabase::netStore(VehiclePtr const& vehicle) const { + DataStreamBuffer ds; + ds.write(vehicle->baseConfig().getString("name")); + ds.write(vehicle->dynamicConfig()); + return ds.takeData(); +} + +VehiclePtr VehicleDatabase::netLoad(ByteArray const& netStore) const { + DataStreamBuffer ds(netStore); + + String name = ds.read<String>(); + auto dynamicConfig = ds.read<Json>(); + auto vehicle = create(name, dynamicConfig); + + return vehicle; +} + +Json VehicleDatabase::diskStore(VehiclePtr const& vehicle) const { + return JsonObject{ + {"name", vehicle->baseConfig().getString("name")}, + {"dynamicConfig", vehicle->dynamicConfig()}, + {"state", vehicle->diskStore()} + }; +} + +VehiclePtr VehicleDatabase::diskLoad(Json const& diskStore) const { + auto vehicle = create(diskStore.getString("name"), diskStore.get("dynamicConfig")); + vehicle->diskLoad(diskStore.get("state")); + return vehicle; +} + +} |