From 4fe852b16252142cfdce5de9c7890ecd0975030e Mon Sep 17 00:00:00 2001 From: Future Date: Sun, 19 May 2024 09:30:19 +0200 Subject: [PATCH 1/3] feat: dump leaderboard definitions on T6 --- docs/SupportedAssetTypes.md | 2 +- src/Common/Game/T6/T6_Assets.h | 13 +++ .../Game/T6/Json/JsonLeaderboardDef.h | 84 +++++++++++++++++++ .../AssetDumperLeaderboardDef.cpp | 29 +++++++ .../AssetDumpers/AssetDumperLeaderboardDef.h | 16 ++++ .../JsonLeaderboardDefWriter.cpp | 84 +++++++++++++++++++ .../LeaderboardDef/JsonLeaderboardDefWriter.h | 11 +++ src/ObjWriting/Game/T6/ZoneDumperT6.cpp | 3 +- 8 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h create mode 100644 src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp create mode 100644 src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.h create mode 100644 src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp create mode 100644 src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h diff --git a/docs/SupportedAssetTypes.md b/docs/SupportedAssetTypes.md index deeca7c4..4d69498e 100644 --- a/docs/SupportedAssetTypes.md +++ b/docs/SupportedAssetTypes.md @@ -194,7 +194,7 @@ The following section specify which assets are supported to be dumped to disk (u | FxImpactTable | ❌ | ❌ | | | RawFile | ✅ | ✅ | | | StringTable | ✅ | ✅ | | -| LeaderboardDef | ❌ | ❌ | | +| LeaderboardDef | ✅ | ❌ | | | XGlobals | ❌ | ❌ | | | ddlRoot_t | ❌ | ❌ | | | Glasses | ❌ | ❌ | | diff --git a/src/Common/Game/T6/T6_Assets.h b/src/Common/Game/T6/T6_Assets.h index 581745fb..3cdf952c 100644 --- a/src/Common/Game/T6/T6_Assets.h +++ b/src/Common/Game/T6/T6_Assets.h @@ -1949,6 +1949,19 @@ namespace T6 LBUPDATE_TYPE_COUNT = 0x3, }; + enum LbTrackType + { + TRK_ALLTIME = 0x0, + TRK_WEEKLY = 0x1, + TRK_MONTHLY = 0x2, + TRK_PRESTIGE_ALLTIME = 0x3, + TRK_PRESTIGE_WEEKLY = 0x4, + TRK_PRESTIGE_MONTHLY = 0x5, + TRK_DAILY = 0x6, + TRK_PRESTIGE_DAILY = 0x7, + TRK_COUNT + }; + struct LeaderboardDef { const char* name; diff --git a/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h b/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h new file mode 100644 index 00000000..83457795 --- /dev/null +++ b/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h @@ -0,0 +1,84 @@ +#pragma once + +#include "Game/T6/T6.h" + +#include "Json/JsonCommon.h" +#include "Json/JsonExtension.h" +#include +#include +#include +#include +#include + +namespace T6 +{ + NLOHMANN_JSON_SERIALIZE_ENUM(LbColType, + { + {LBCOL_TYPE_NUMBER, "number" }, + {LBCOL_TYPE_TIME, "time" }, + {LBCOL_TYPE_LEVELXP, "levelxp" }, + {LBCOL_TYPE_PRESTIGE, "prestige" }, + {LBCOL_TYPE_BIGNUMBER, "bignumber"}, + {LBCOL_TYPE_PERCENT, "percent" }, + {LBCOL_TYPE_TIME_FULL, "time_full"}, + }); + + NLOHMANN_JSON_SERIALIZE_ENUM(LbAggType, + { + {LBAGG_TYPE_MIN, "min" }, + {LBAGG_TYPE_MAX, "max" }, + {LBAGG_TYPE_ADD, "add" }, + {LBAGG_TYPE_REPLACE, "replace"}, + }); + + NLOHMANN_JSON_SERIALIZE_ENUM(LbUpdateType, + { + {LBUPDATE_TYPE_NORMAL, "normal" }, + {LBUPDATE_TYPE_RANK, "rank" }, + {LBUPDATE_TYPE_COMBINE, "combine"}, + }); + + NLOHMANN_JSON_SERIALIZE_ENUM(LbTrackType, + { + {TRK_ALLTIME, "ALLTIME" }, + {TRK_WEEKLY, "WEEKLY" }, + {TRK_MONTHLY, "MONTHLY" }, + {TRK_PRESTIGE_ALLTIME, "PRESTIGE_ALLTIME"}, + {TRK_PRESTIGE_WEEKLY, "PRESTIGE_WEEKLY" }, + {TRK_PRESTIGE_MONTHLY, "PRESTIGE_MONTHLY"}, + {TRK_DAILY, "DAILY" }, + {TRK_PRESTIGE_DAILY, "PRESTIGE_DAILY" }, + }); + + class JsonColumnDef + { + public: + std::string name; + int colId; + int dwColIndex; + bool hidden; + std::string statName; + LbColType type; + int precision; + LbAggType agg; + std::string localization; + int uiCalColX; + int uiCalColY; + }; + + NLOHMANN_DEFINE_TYPE_EXTENSION(JsonColumnDef, name, colId, dwColIndex, hidden, statName, type, precision, agg, localization, uiCalColX, uiCalColY); + + class JsonLeaderboardDef + { + public: + unsigned int id; + int dwColumnCount; + std::optional xpColId; + std::optional prestigeColId; + std::vector columns; + LbUpdateType updateType; + std::vector trackTypes; + }; + + NLOHMANN_DEFINE_TYPE_EXTENSION(JsonLeaderboardDef, id, dwColumnCount, xpColId, prestigeColId, columns, updateType, trackTypes); +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp new file mode 100644 index 00000000..75a08a41 --- /dev/null +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp @@ -0,0 +1,29 @@ +#include "AssetDumperLeaderboardDef.h" + +#include "Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h" + +#include +#include + +using namespace T6; + +std::string AssetDumperLeaderboardDef::GetFileNameForAsset(const std::string& assetName) +{ + + return std::format("leaderboards/{}.json", assetName); +} + +bool AssetDumperLeaderboardDef::ShouldDump(XAssetInfo* asset) +{ + return true; +} + +void AssetDumperLeaderboardDef::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) +{ + const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset->m_name)); + + if (!assetFile) + return; + + DumpLeaderboardDefAsJson(*assetFile, asset->Asset()); +} diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.h new file mode 100644 index 00000000..057d4252 --- /dev/null +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Dumping/AbstractAssetDumper.h" +#include "Game/T6/T6.h" + +namespace T6 +{ + class AssetDumperLeaderboardDef final : public AbstractAssetDumper + { + static std::string GetFileNameForAsset(const std::string& assetName); + + protected: + _NODISCARD bool ShouldDump(XAssetInfo* asset) override; + void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; + }; +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp b/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp new file mode 100644 index 00000000..0ec0dcee --- /dev/null +++ b/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp @@ -0,0 +1,84 @@ +#include "JsonLeaderboardDefWriter.h" + +#include "Game/T6/CommonT6.h" +#include "Game/T6/Json/JsonLeaderboardDef.h" + +#include +#include + +using namespace nlohmann; +using namespace T6; + +namespace +{ + class JsonDumper + { + public: + explicit JsonDumper(std::ostream& stream) + : m_stream(stream) + { + } + + void Dump(const LeaderboardDef* leaderboardDef) + { + JsonLeaderboardDef jsonLeaderboardDef; + CreateJsonLeaderboardDef(jsonLeaderboardDef, *leaderboardDef); + + json jRoot = jsonLeaderboardDef; + + jRoot["_type"] = "leaderboard"; + jRoot["_version"] = 1; + + m_stream << std::setw(4) << jRoot << "\n"; + } + + private: + static void CreateJsonColumnDef(JsonColumnDef& jColumnDef, const LbColumnDef& lbColumnDef) + { + jColumnDef.name = lbColumnDef.name; + jColumnDef.colId = lbColumnDef.colId; + jColumnDef.dwColIndex = lbColumnDef.dwColIndex; + jColumnDef.hidden = lbColumnDef.hidden; + jColumnDef.statName = lbColumnDef.statName; + jColumnDef.type = lbColumnDef.type; + jColumnDef.precision = lbColumnDef.precision; + jColumnDef.agg = lbColumnDef.agg; + jColumnDef.localization = lbColumnDef.localization; + jColumnDef.uiCalColX = lbColumnDef.uiCalColX; + jColumnDef.uiCalColY = lbColumnDef.uiCalColY; + } + + static void CreateJsonLeaderboardDef(JsonLeaderboardDef& jLeaderboardDef, const LeaderboardDef& leaderboardDef) + { + jLeaderboardDef.id = leaderboardDef.id; + jLeaderboardDef.dwColumnCount = leaderboardDef.dwColumnCount; + jLeaderboardDef.xpColId = (leaderboardDef.xpColId < 0) ? std::nullopt : std::make_optional(leaderboardDef.xpColId); + jLeaderboardDef.prestigeColId = (leaderboardDef.prestigeColId < 0) ? std::nullopt : std::make_optional(leaderboardDef.prestigeColId); + + jLeaderboardDef.columns.resize(leaderboardDef.columnCount); + for (auto i = 0; i < leaderboardDef.columnCount; ++i) + CreateJsonColumnDef(jLeaderboardDef.columns[i], leaderboardDef.columns[i]); + + jLeaderboardDef.updateType = leaderboardDef.updateType; + + for (auto i = 0; i < LbTrackType::TRK_COUNT; ++i) + { + if ((leaderboardDef.trackTypes & (1 << i)) != 0) + { + jLeaderboardDef.trackTypes.emplace_back(static_cast(i)); + } + } + } + + std::ostream& m_stream; + }; +} // namespace + +namespace T6 +{ + void DumpLeaderboardDefAsJson(std::ostream& stream, const LeaderboardDef* leaderboardDef) + { + JsonDumper dumper(stream); + dumper.Dump(leaderboardDef); + } +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h b/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h new file mode 100644 index 00000000..cdc31389 --- /dev/null +++ b/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Dumping/AssetDumpingContext.h" +#include "Game/T6/T6.h" + +#include + +namespace T6 +{ + void DumpLeaderboardDefAsJson(std::ostream& stream, const LeaderboardDef* leaderboardDef); +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/ZoneDumperT6.cpp b/src/ObjWriting/Game/T6/ZoneDumperT6.cpp index f781a54d..9fe2ba76 100644 --- a/src/ObjWriting/Game/T6/ZoneDumperT6.cpp +++ b/src/ObjWriting/Game/T6/ZoneDumperT6.cpp @@ -2,6 +2,7 @@ #include "AssetDumpers/AssetDumperFontIcon.h" #include "AssetDumpers/AssetDumperGfxImage.h" +#include "AssetDumpers/AssetDumperLeaderboardDef.h" #include "AssetDumpers/AssetDumperLocalizeEntry.h" #include "AssetDumpers/AssetDumperMaterial.h" #include "AssetDumpers/AssetDumperPhysConstraints.h" @@ -75,7 +76,7 @@ bool ZoneDumper::DumpZone(AssetDumpingContext& context) const // DUMP_ASSET_POOL(AssetDumperFxImpactTable, m_fx_impact_table, ASSET_TYPE_IMPACT_FX) DUMP_ASSET_POOL(AssetDumperRawFile, m_raw_file, ASSET_TYPE_RAWFILE) DUMP_ASSET_POOL(AssetDumperStringTable, m_string_table, ASSET_TYPE_STRINGTABLE) - // DUMP_ASSET_POOL(AssetDumperLeaderboardDef, m_leaderboard, ASSET_TYPE_LEADERBOARD) + DUMP_ASSET_POOL(AssetDumperLeaderboardDef, m_leaderboard, ASSET_TYPE_LEADERBOARD) // DUMP_ASSET_POOL(AssetDumperXGlobals, m_xglobals, ASSET_TYPE_XGLOBALS) // DUMP_ASSET_POOL(AssetDumperDDLRoot, m_ddl, ASSET_TYPE_DDL) // DUMP_ASSET_POOL(AssetDumperGlasses, m_glasses, ASSET_TYPE_GLASSES) From 2a1ec18f6a75719390e8af680b219768d33368dc Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 19 May 2024 13:07:04 +0200 Subject: [PATCH 2/3] chore: only dump leaderboard values for t6 when they are relevant for the column --- src/Common/Game/T6/T6_Assets.h | 4 +- .../Game/T6/Json/JsonLeaderboardDef.h | 19 +++---- .../AssetDumperLeaderboardDef.cpp | 1 - .../JsonLeaderboardDefWriter.cpp | 49 +++++++++++++------ 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/Common/Game/T6/T6_Assets.h b/src/Common/Game/T6/T6_Assets.h index 3cdf952c..08105163 100644 --- a/src/Common/Game/T6/T6_Assets.h +++ b/src/Common/Game/T6/T6_Assets.h @@ -1946,7 +1946,8 @@ namespace T6 LBUPDATE_TYPE_NORMAL = 0x0, LBUPDATE_TYPE_RANK = 0x1, LBUPDATE_TYPE_COMBINE = 0x2, - LBUPDATE_TYPE_COUNT = 0x3, + + LBUPDATE_TYPE_COUNT }; enum LbTrackType @@ -1959,6 +1960,7 @@ namespace T6 TRK_PRESTIGE_MONTHLY = 0x5, TRK_DAILY = 0x6, TRK_PRESTIGE_DAILY = 0x7, + TRK_COUNT }; diff --git a/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h b/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h index 83457795..b869724d 100644 --- a/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h +++ b/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h @@ -55,18 +55,19 @@ namespace T6 public: std::string name; int colId; - int dwColIndex; - bool hidden; - std::string statName; + std::optional dwColIndex; + std::optional hidden; + std::optional statName; LbColType type; - int precision; - LbAggType agg; - std::string localization; - int uiCalColX; - int uiCalColY; + std::optional precision; + LbAggType aggregationFunction; + std::optional localization; + std::optional uiCalColX; + std::optional uiCalColY; }; - NLOHMANN_DEFINE_TYPE_EXTENSION(JsonColumnDef, name, colId, dwColIndex, hidden, statName, type, precision, agg, localization, uiCalColX, uiCalColY); + NLOHMANN_DEFINE_TYPE_EXTENSION( + JsonColumnDef, name, colId, dwColIndex, hidden, statName, type, precision, aggregationFunction, localization, uiCalColX, uiCalColY); class JsonLeaderboardDef { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp index 75a08a41..8d01c329 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp @@ -9,7 +9,6 @@ using namespace T6; std::string AssetDumperLeaderboardDef::GetFileNameForAsset(const std::string& assetName) { - return std::format("leaderboards/{}.json", assetName); } diff --git a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp b/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp index 0ec0dcee..f8c30e4a 100644 --- a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp +++ b/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp @@ -19,7 +19,7 @@ namespace { } - void Dump(const LeaderboardDef* leaderboardDef) + void Dump(const LeaderboardDef* leaderboardDef) const { JsonLeaderboardDef jsonLeaderboardDef; CreateJsonLeaderboardDef(jsonLeaderboardDef, *leaderboardDef); @@ -37,23 +37,42 @@ namespace { jColumnDef.name = lbColumnDef.name; jColumnDef.colId = lbColumnDef.colId; - jColumnDef.dwColIndex = lbColumnDef.dwColIndex; - jColumnDef.hidden = lbColumnDef.hidden; - jColumnDef.statName = lbColumnDef.statName; + + if (lbColumnDef.dwColIndex >= 0) + jColumnDef.dwColIndex = lbColumnDef.dwColIndex; + + if (lbColumnDef.hidden) + jColumnDef.hidden = lbColumnDef.hidden; + + if (lbColumnDef.statName && lbColumnDef.statName[0]) + jColumnDef.statName = lbColumnDef.statName; + jColumnDef.type = lbColumnDef.type; - jColumnDef.precision = lbColumnDef.precision; - jColumnDef.agg = lbColumnDef.agg; - jColumnDef.localization = lbColumnDef.localization; - jColumnDef.uiCalColX = lbColumnDef.uiCalColX; - jColumnDef.uiCalColY = lbColumnDef.uiCalColY; + + if (lbColumnDef.precision != 0) + jColumnDef.precision = lbColumnDef.precision; + + jColumnDef.aggregationFunction = lbColumnDef.agg; + + if (lbColumnDef.localization && lbColumnDef.localization[0]) + jColumnDef.localization = lbColumnDef.localization; + + if (lbColumnDef.uiCalColX != 0 || lbColumnDef.uiCalColY != 0) + { + jColumnDef.uiCalColX = lbColumnDef.uiCalColX; + jColumnDef.uiCalColY = lbColumnDef.uiCalColY; + } } static void CreateJsonLeaderboardDef(JsonLeaderboardDef& jLeaderboardDef, const LeaderboardDef& leaderboardDef) { jLeaderboardDef.id = leaderboardDef.id; jLeaderboardDef.dwColumnCount = leaderboardDef.dwColumnCount; - jLeaderboardDef.xpColId = (leaderboardDef.xpColId < 0) ? std::nullopt : std::make_optional(leaderboardDef.xpColId); - jLeaderboardDef.prestigeColId = (leaderboardDef.prestigeColId < 0) ? std::nullopt : std::make_optional(leaderboardDef.prestigeColId); + + if (leaderboardDef.xpColId >= 0) + jLeaderboardDef.xpColId = leaderboardDef.xpColId; + if (leaderboardDef.prestigeColId >= 0) + jLeaderboardDef.prestigeColId = leaderboardDef.prestigeColId; jLeaderboardDef.columns.resize(leaderboardDef.columnCount); for (auto i = 0; i < leaderboardDef.columnCount; ++i) @@ -61,12 +80,12 @@ namespace jLeaderboardDef.updateType = leaderboardDef.updateType; - for (auto i = 0; i < LbTrackType::TRK_COUNT; ++i) + for (auto i = 0; i < TRK_COUNT; ++i) { - if ((leaderboardDef.trackTypes & (1 << i)) != 0) - { + const auto trackTypeMask = 1 << i; + + if (leaderboardDef.trackTypes & trackTypeMask) jLeaderboardDef.trackTypes.emplace_back(static_cast(i)); - } } } From 374fc7fe5de40a4f1f1844f690fce21ecfa9a8af Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 19 May 2024 13:16:07 +0200 Subject: [PATCH 3/3] chore: rename t6 leaderboardDef folder to leaderboard --- .../Game/T6/{Json => Leaderboard}/JsonLeaderboardDef.h | 0 .../Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp | 2 +- .../JsonLeaderboardDefWriter.cpp | 2 +- .../{LeaderboardDef => Leaderboard}/JsonLeaderboardDefWriter.h | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/ObjCommon/Game/T6/{Json => Leaderboard}/JsonLeaderboardDef.h (100%) rename src/ObjWriting/Game/T6/{LeaderboardDef => Leaderboard}/JsonLeaderboardDefWriter.cpp (98%) rename src/ObjWriting/Game/T6/{LeaderboardDef => Leaderboard}/JsonLeaderboardDefWriter.h (100%) diff --git a/src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h b/src/ObjCommon/Game/T6/Leaderboard/JsonLeaderboardDef.h similarity index 100% rename from src/ObjCommon/Game/T6/Json/JsonLeaderboardDef.h rename to src/ObjCommon/Game/T6/Leaderboard/JsonLeaderboardDef.h diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp index 8d01c329..2d83e5bd 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperLeaderboardDef.cpp @@ -1,6 +1,6 @@ #include "AssetDumperLeaderboardDef.h" -#include "Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h" +#include "Game/T6/Leaderboard/JsonLeaderboardDefWriter.h" #include #include diff --git a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp b/src/ObjWriting/Game/T6/Leaderboard/JsonLeaderboardDefWriter.cpp similarity index 98% rename from src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp rename to src/ObjWriting/Game/T6/Leaderboard/JsonLeaderboardDefWriter.cpp index f8c30e4a..609c03d9 100644 --- a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.cpp +++ b/src/ObjWriting/Game/T6/Leaderboard/JsonLeaderboardDefWriter.cpp @@ -1,7 +1,7 @@ #include "JsonLeaderboardDefWriter.h" #include "Game/T6/CommonT6.h" -#include "Game/T6/Json/JsonLeaderboardDef.h" +#include "Game/T6/Leaderboard/JsonLeaderboardDef.h" #include #include diff --git a/src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h b/src/ObjWriting/Game/T6/Leaderboard/JsonLeaderboardDefWriter.h similarity index 100% rename from src/ObjWriting/Game/T6/LeaderboardDef/JsonLeaderboardDefWriter.h rename to src/ObjWriting/Game/T6/Leaderboard/JsonLeaderboardDefWriter.h