diff --git a/sample_project/Palettes/Charset.npal b/sample_project/Palettes/Charset.npal index 4a1ca05d5..14f5f59a0 100644 Binary files a/sample_project/Palettes/Charset.npal and b/sample_project/Palettes/Charset.npal differ diff --git a/sample_project/Palettes/Chester.npal b/sample_project/Palettes/Chester.npal index e818a2669..77a2e0475 100644 --- a/sample_project/Palettes/Chester.npal +++ b/sample_project/Palettes/Chester.npal @@ -1 +1 @@ -M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö \ No newline at end of file +N1;14fc3dd8-42ff-4bf9-81f1-a010cc5ac251;M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö diff --git a/sample_project/Palettes/Dirt.npal b/sample_project/Palettes/Dirt.npal index 8be698b17..4e80b6938 100644 --- a/sample_project/Palettes/Dirt.npal +++ b/sample_project/Palettes/Dirt.npal @@ -1 +1 @@ -M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö \ No newline at end of file +N1;0f75977f-1c52-45f8-9793-52ea2dc200a0;M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö diff --git a/sample_project/Palettes/Logo.npal b/sample_project/Palettes/Logo.npal index cdf83857b..ec33e96e1 100644 --- a/sample_project/Palettes/Logo.npal +++ b/sample_project/Palettes/Logo.npal @@ -1 +1 @@ -M2;net.drinkingtea.nostalgia.core.Palette;1;PÛ{³ÖCˆ \ No newline at end of file +N1;c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed;M2;net.drinkingtea.nostalgia.core.Palette;1;PÛ{³ÖCˆ diff --git a/sample_project/Scenes/Chester.nscn b/sample_project/Scenes/Chester.nscn index 535b35f0e..7b0ee0984 100644 Binary files a/sample_project/Scenes/Chester.nscn and b/sample_project/Scenes/Chester.nscn differ diff --git a/sample_project/TileSheets/Charset.ng b/sample_project/TileSheets/Charset.ng index 105b95fef..48914c0bf 100644 Binary files a/sample_project/TileSheets/Charset.ng and b/sample_project/TileSheets/Charset.ng differ diff --git a/sample_project/TileSheets/Chester.ng b/sample_project/TileSheets/Chester.ng index 2759e89c2..963a9e85a 100644 Binary files a/sample_project/TileSheets/Chester.ng and b/sample_project/TileSheets/Chester.ng differ diff --git a/sample_project/TileSheets/Dirt.ng b/sample_project/TileSheets/Dirt.ng index 8fa39b538..6d80ec4db 100644 Binary files a/sample_project/TileSheets/Dirt.ng and b/sample_project/TileSheets/Dirt.ng differ diff --git a/sample_project/TileSheets/Logo.ng b/sample_project/TileSheets/Logo.ng index 7e1e5450f..fdd2cabb2 100644 Binary files a/sample_project/TileSheets/Logo.ng and b/sample_project/TileSheets/Logo.ng differ diff --git a/sample_project/TileSheets/NS_Logo.ng b/sample_project/TileSheets/NS_Logo.ng index 5c8a7f951..f118210ad 100644 Binary files a/sample_project/TileSheets/NS_Logo.ng and b/sample_project/TileSheets/NS_Logo.ng differ diff --git a/src/nostalgia/foundation/context.hpp b/src/nostalgia/foundation/context.hpp index a127b553f..404844910 100644 --- a/src/nostalgia/foundation/context.hpp +++ b/src/nostalgia/foundation/context.hpp @@ -21,7 +21,6 @@ class Context { ox::StringView appName = "Nostalgia Foundation App"; #ifndef OX_BARE_METAL AssetManager assetManager; - bool useUuids = false; ox::HashMap pathToUuid; ox::HashMap uuidToPath; ox::Vector converters; diff --git a/src/nostalgia/foundation/media.hpp b/src/nostalgia/foundation/media.hpp index 1f50dbcfc..716517fe5 100644 --- a/src/nostalgia/foundation/media.hpp +++ b/src/nostalgia/foundation/media.hpp @@ -37,7 +37,7 @@ ox::Result getPreloadAddr(foundation::Context *ctx, ox::CRStringVie template ox::Result> readObjFile( foundation::Context *ctx, - ox::CRStringView assetId, + ox::StringView assetId, bool forceLoad) noexcept { constexpr auto readConvert = [](Context *ctx, const ox::Buffer &buff) -> ox::Result { auto [obj, err] = readAsset(buff); @@ -50,20 +50,24 @@ ox::Result> readObjFile( return std::move(obj); }; ox::StringView path; - if (ctx->useUuids) { + ox::UUIDStr uuidStr; + if (beginsWith(assetId, "uuid://")) { + assetId = assetId.substr(7); path = ctx->uuidToPath[assetId]; } else { path = assetId; + uuidStr = ctx->pathToUuid[path].toString(); + assetId = uuidStr; } if (forceLoad) { - oxRequire(buff, ctx->rom->read(assetId)); + oxRequire(buff, ctx->rom->read(path)); oxRequire(obj, readConvert(ctx, buff)); oxRequire(cached, ctx->assetManager.setAsset(assetId, obj)); return cached; } else { auto [cached, err] = ctx->assetManager.getAsset(assetId); if (err) { - oxRequire(buff, ctx->rom->read(assetId)); + oxRequire(buff, ctx->rom->read(path)); oxRequire(obj, readConvert(ctx, buff)); oxReturnError(ctx->assetManager.setAsset(assetId, obj).moveTo(&cached)); } diff --git a/src/nostalgia/tools/pack/pack.cpp b/src/nostalgia/tools/pack/pack.cpp index 6d2fd9ef2..7bf0c649c 100644 --- a/src/nostalgia/tools/pack/pack.cpp +++ b/src/nostalgia/tools/pack/pack.cpp @@ -13,7 +13,7 @@ namespace nostalgia { -static ox::Error pathToInode(ox::FileSystem *dest, ox::ModelObject *obj) noexcept { +static ox::Error pathToInode(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelObject *obj) noexcept { auto &o = *obj; auto type = static_cast(o["type"].get()); auto &data = o["data"].get(); @@ -29,28 +29,32 @@ static ox::Error pathToInode(ox::FileSystem *dest, ox::ModelObject *obj) noexcep case ox::FileAddressType::None: return {}; } + if (beginsWith(path, "uuid://")) { + const auto uuid = ox::StringView(path).substr(7); + path = ctx->uuidToPath[uuid]; + } oxRequire(s, dest->stat(path)); oxReturnError(o["type"].set(static_cast(ox::FileAddressType::Inode))); return data.set(2, s.inode); } -static ox::Error transformFileAddressesObj(ox::FileSystem *dest, ox::ModelObject *obj) noexcept; -static ox::Error transformFileAddressesVec(ox::FileSystem *dest, ox::ModelValueVector *v) noexcept; +static ox::Error transformFileAddressesObj(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelObject *obj) noexcept; +static ox::Error transformFileAddressesVec(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelValueVector *v) noexcept; -static ox::Error transformFileAddresses(ox::FileSystem *dest, ox::ModelValue *v) noexcept { +static ox::Error transformFileAddresses(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelValue *v) noexcept { if (v->type() == ox::ModelValue::Type::Object) { auto &obj = v->get(); - return transformFileAddressesObj(dest, &obj); + return transformFileAddressesObj(ctx, dest, &obj); } else if (v->type() == ox::ModelValue::Type::Vector) { auto &vec = v->get(); - return transformFileAddressesVec(dest, &vec); + return transformFileAddressesVec(ctx, dest, &vec); } return {}; } -static ox::Error transformFileAddressesVec(ox::FileSystem *dest, ox::ModelValueVector *v) noexcept { +static ox::Error transformFileAddressesVec(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelValueVector *v) noexcept { for (auto &f : *v) { - oxReturnError(transformFileAddresses(dest, &f)); + oxReturnError(transformFileAddresses(ctx, dest, &f)); } return {}; } @@ -59,13 +63,13 @@ static ox::Error transformFileAddressesVec(ox::FileSystem *dest, ox::ModelValueV * Convert path references in Claw data to inodes to save space * @return error */ -static ox::Error transformFileAddressesObj(ox::FileSystem *dest, ox::ModelObject *obj) noexcept { +static ox::Error transformFileAddressesObj(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelObject *obj) noexcept { if (obj->typeName() == "net.drinkingtea.ox.FileAddress" && obj->typeVersion() == 1) { - return pathToInode(dest, obj); + return pathToInode(ctx, dest, obj); } for (auto &f : *obj) { auto &v = f->value; - oxReturnError(transformFileAddresses(dest, &v)); + oxReturnError(transformFileAddresses(ctx, dest, &v)); } return {}; } @@ -80,7 +84,7 @@ static ox::Error doTransformations(foundation::Context *ctx, ox::TypeStore *ts, } // transform FileAddresses oxRequireM(obj, foundation::readAsset(ts, buff)); - oxReturnError(transformFileAddressesObj(dest, &obj)); + oxReturnError(transformFileAddressesObj(ctx, dest, &obj)); oxReturnError(ox::writeClaw(&obj).moveTo(&buff)); // write file to dest oxReturnError(dest->write(s.inode, buff.data(), buff.size()));