/* * Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved. */ #pragma once #include #include #include #include "context.hpp" #include "typeconv.hpp" namespace nostalgia::core { template ox::Result> readObj(Context *ctx, const ox::FileAddress &file, bool forceLoad = false) noexcept { #ifndef OX_BARE_METAL constexpr auto readConvert = [](const ox::Buffer &buff) -> ox::Result { auto [obj, err] = ox::readClaw(buff); if (err) { if (err != ox::Error_ClawTypeVersionMismatch && err != ox::Error_ClawTypeMismatch) { return err; } oxReturnError(convert(buff, T::TypeName, T::TypeVersion, &obj)); } return obj; }; oxRequire(path, file.getPath()); if (forceLoad) { oxRequire(buff, ctx->rom->read(file)); oxRequire(obj, readConvert(buff)); oxRequire(cached, ctx->assetManager.template setAsset(path, obj)); return cached; } else { auto [cached, err] = ctx->assetManager.template getAsset(path); if (err) { oxRequire(buff, ctx->rom->read(file)); oxRequire(obj, readConvert(buff)); oxReturnError(ctx->assetManager.template setAsset(path, obj).moveTo(&cached)); } return cached; } #else return OxError(1); #endif } ox::Result> loadRomFs(const char *path) noexcept; ox::Result loadRom(const char *path = "") noexcept; void unloadRom(char*) noexcept; }