diff --git a/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp b/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp index 80923458..88b0f985 100644 --- a/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp +++ b/src/nostalgia/modules/core/include/nostalgia/core/gfx.hpp @@ -121,11 +121,20 @@ ox::Error loadSpritePalette( CompactPalette const&palette, size_t page = 0) noexcept; +ox::Error loadBgPalette( + Context &ctx, + size_t palBank, + ox::StringViewCR palettePath) noexcept; + ox::Error loadBgPalette( Context &ctx, size_t palBank, ox::FileAddress const&paletteAddr) noexcept; +ox::Error loadSpritePalette( + Context &ctx, + ox::StringViewCR palettePath) noexcept; + ox::Error loadSpritePalette( Context &ctx, ox::FileAddress const&paletteAddr) noexcept; @@ -143,6 +152,14 @@ ox::Error loadBgTileSheet( size_t srcTileIdx, size_t tileCnt) noexcept; +ox::Error loadBgTileSheet( + Context &ctx, + unsigned cbb, + ox::StringViewCR tsPath, + size_t dstTileIdx, + size_t srcTileIdx, + size_t tileCnt) noexcept; + ox::Error loadBgTileSheet( Context &ctx, unsigned cbb, @@ -157,6 +174,12 @@ ox::Error loadBgTileSheet( CompactTileSheet const&ts, ox::Optional const&paletteBank = {}) noexcept; +ox::Error loadBgTileSheet( + Context &ctx, + unsigned cbb, + ox::StringViewCR tilesheetPath, + ox::Optional const&paletteBank) noexcept; + ox::Error loadBgTileSheet( Context &ctx, unsigned cbb, @@ -168,6 +191,11 @@ ox::Error loadSpriteTileSheet( CompactTileSheet const&ts, bool loadDefaultPalette) noexcept; +ox::Error loadSpriteTileSheet( + Context &ctx, + ox::StringViewCR tilesheetPath, + bool loadDefaultPalette = false) noexcept; + ox::Error loadSpriteTileSheet( Context &ctx, ox::FileAddress const&tilesheetAddr, diff --git a/src/nostalgia/modules/core/src/gfx.cpp b/src/nostalgia/modules/core/src/gfx.cpp index 46102256..c0ecf501 100644 --- a/src/nostalgia/modules/core/src/gfx.cpp +++ b/src/nostalgia/modules/core/src/gfx.cpp @@ -18,6 +18,14 @@ int tileRows(Context&) noexcept { return GbaTileRows; } +ox::Error loadBgPalette( + Context &ctx, + size_t palBank, + ox::StringViewCR palettePath) noexcept { + oxRequire(pal, keel::readObj(keelCtx(ctx), palettePath)); + return loadBgPalette(ctx, palBank, *pal, 0); +} + ox::Error loadBgPalette( Context &ctx, size_t palBank, @@ -26,6 +34,13 @@ ox::Error loadBgPalette( return loadBgPalette(ctx, palBank, *pal, 0); } +ox::Error loadSpritePalette( + Context &ctx, + ox::StringViewCR palettePath) noexcept { + oxRequire(pal, keel::readObj(keelCtx(ctx), palettePath)); + return loadSpritePalette(ctx, *pal, 0); +} + ox::Error loadSpritePalette( Context &ctx, ox::FileAddress const&paletteAddr) noexcept { @@ -44,6 +59,26 @@ ox::Error loadBgTileSheet( return loadBgTileSheet(ctx, cbb, *ts, dstTileIdx, srcTileIdx, tileCnt); } +ox::Error loadBgTileSheet( + Context &ctx, + unsigned cbb, + ox::StringViewCR tsPath, + size_t dstTileIdx, + size_t srcTileIdx, + size_t tileCnt) noexcept { + oxRequire(ts, keel::readObj(keelCtx(ctx), tsPath)); + return loadBgTileSheet(ctx, cbb, *ts, dstTileIdx, srcTileIdx, tileCnt); +} + +ox::Error loadBgTileSheet( + Context &ctx, + unsigned cbb, + ox::StringViewCR tilesheetPath, + ox::Optional const&paletteBank) noexcept { + oxRequire(ts, keel::readObj(keelCtx(ctx), tilesheetPath)); + return loadBgTileSheet(ctx, cbb, *ts, paletteBank); +} + ox::Error loadBgTileSheet( Context &ctx, unsigned cbb, @@ -53,6 +88,14 @@ ox::Error loadBgTileSheet( return loadBgTileSheet(ctx, cbb, *ts, paletteBank); } +ox::Error loadSpriteTileSheet( + Context &ctx, + ox::StringViewCR tilesheetPath, + bool loadDefaultPalette) noexcept { + oxRequire(ts, readObj(keelCtx(ctx), tilesheetPath)); + return loadSpriteTileSheet(ctx, *ts, loadDefaultPalette); +} + ox::Error loadSpriteTileSheet( Context &ctx, ox::FileAddress const&tilesheetAddr, @@ -213,12 +256,11 @@ void puts( int const column, int const row, ox::StringViewCR str) noexcept { - auto const col = static_cast(column); for (auto i = 0u; i < str.bytes(); ++i) { setBgTile( ctx, 0, - static_cast(col + i), + column + static_cast(i), row, static_cast(charMap[static_cast(str[i])])); } diff --git a/src/nostalgia/player/CMakeLists.txt b/src/nostalgia/player/CMakeLists.txt index 45412f44..d2609578 100644 --- a/src/nostalgia/player/CMakeLists.txt +++ b/src/nostalgia/player/CMakeLists.txt @@ -1,7 +1,6 @@ add_executable( nostalgia WIN32 app.cpp - main.cpp ) # enable LTO @@ -23,6 +22,8 @@ endif() target_link_libraries( nostalgia NostalgiaKeelModules + NostalgiaProfile + OlympicApplib OxLogConn ) diff --git a/src/nostalgia/player/app.cpp b/src/nostalgia/player/app.cpp index 8c73f7fb..4191b0ab 100644 --- a/src/nostalgia/player/app.cpp +++ b/src/nostalgia/player/app.cpp @@ -65,8 +65,8 @@ static void testKeyEventHandler(turbine::Context &tctx, turbine::Key key, bool d [[maybe_unused]] static ox::Error runTest(turbine::Context &tctx) { - constexpr ox::FileAddress TileSheetAddr = ox::StringLiteral("/TileSheets/Charset.ng"); - constexpr ox::FileAddress PaletteAddr = ox::StringLiteral("/Palettes/Chester.npal"); + constexpr ox::StringView TileSheetAddr{"/TileSheets/Charset.ng"}; + constexpr ox::StringView PaletteAddr{"/Palettes/Chester.npal"}; oxRequireM(cctx, core::init(tctx)); turbine::setApplicationData(tctx, cctx.get()); oxRequire(tsStat, turbine::rom(tctx)->stat(PaletteAddr)); @@ -84,24 +84,24 @@ static ox::Error runTest(turbine::Context &tctx) { static ox::Error runTileSheetSetTest(turbine::Context &tctx) { // this should make the screen display 'ABCDB', with the A being upside down // and the first B being backwards - constexpr ox::FileAddress PaletteAddr = ox::StringLiteral("/Palettes/Charset.npal"); + constexpr ox::StringView PaletteAddr{"/Palettes/Charset.npal"}; oxRequireM(cctx, core::init(tctx)); turbine::setApplicationData(tctx, cctx.get()); oxRequire(tsStat, turbine::rom(tctx)->stat(PaletteAddr)); core::TileSheetSet const set{ .bpp = 4, .entries = { - { .tilesheet = ox::StringLiteral("/TileSheets/Chester.ng"), .sections{{.begin = 0, .tiles = 1}} }, - { .tilesheet = ox::StringLiteral("/TileSheets/AB.ng"), .sections{{.begin = 0, .tiles = 2}} }, - { .tilesheet = ox::StringLiteral("/TileSheets/CD.ng"), .sections{{.begin = 0, .tiles = 2}} }, - { .tilesheet = ox::StringLiteral("/TileSheets/AB.ng"), .sections{{.begin = 1, .tiles = 1}} }, + { .tilesheet = ox::StringLiteral{"/TileSheets/Chester.ng"}, .sections{{.begin = 0, .tiles = 1}} }, + { .tilesheet = ox::StringLiteral{"/TileSheets/AB.ng"}, .sections{{.begin = 0, .tiles = 2}} }, + { .tilesheet = ox::StringLiteral{"/TileSheets/CD.ng"}, .sections{{.begin = 0, .tiles = 2}} }, + { .tilesheet = ox::StringLiteral{"/TileSheets/AB.ng"}, .sections{{.begin = 1, .tiles = 1}} }, }, }; constexpr auto bgPalBank = 1; oxReturnError(core::loadBgTileSheet(*cctx, 0, set)); oxReturnError(core::loadSpriteTileSheet(*cctx, set)); oxReturnError(core::loadBgPalette(*cctx, bgPalBank, PaletteAddr)); - oxReturnError(core::loadBgPalette(*cctx, 0, ox::StringLiteral("/Palettes/Chester.npal"))); + oxReturnError(core::loadBgPalette(*cctx, 0, PaletteAddr)); oxReturnError(core::loadSpritePalette(*cctx, PaletteAddr)); core::setBgStatus(*cctx, 0, true); core::setBgTile(*cctx, 0, 10, 9, { .tileIdx = 1, .palBank = bgPalBank, .flipX = 0, .flipY = 1 }); @@ -147,7 +147,7 @@ static void sceneKeyEventHandler(turbine::Context &tctx, turbine::Key key, bool [[maybe_unused]] static ox::Error runScene(turbine::Context &tctx) { - constexpr ox::FileAddress SceneAddr = ox::StringLiteral("/Scenes/Chester.nscn"); + constexpr ox::StringView SceneAddr{"/Scenes/Chester.nscn"}; oxRequireM(cctx, core::init(tctx)); oxRequire(scn, keel::readObj(keelCtx(tctx), SceneAddr)); turbine::setUpdateHandler(tctx, sceneUpdateHandler); @@ -157,7 +157,20 @@ static ox::Error runScene(turbine::Context &tctx) { return turbine::run(tctx); } -ox::Error run(ox::UniquePtr &&fs) noexcept { - oxRequireM(tctx, turbine::init(std::move(fs), "Nostalgia")); +namespace olympic { + +ox::Error run( + [[maybe_unused]] ox::StringView project, + [[maybe_unused]] ox::StringView appName, + [[maybe_unused]] ox::StringView projectDataDir, + ox::SpanView args) noexcept { + if (args.size() < 2) { + return OxError(1, "Please provide path to project directory or OxFS file."); + } + auto const path = args[1]; + oxRequireM(fs, keel::loadRomFs(path)); + oxRequireM(tctx, turbine::init(std::move(fs), project)); return runTileSheetSetTest(*tctx); } + +} \ No newline at end of file diff --git a/src/nostalgia/player/main.cpp b/src/nostalgia/player/main.cpp deleted file mode 100644 index 8cba0686..00000000 --- a/src/nostalgia/player/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. - */ - -#include -#include - -#include - -#include "../modules/keelmodules.hpp" - -#include "app.hpp" - -static ox::Error run(int argc, const char **argv) noexcept { -#ifndef OX_BARE_METAL - // GBA doesn't need the modules and calling this doubles the size of the - // binary. - nostalgia::registerKeelModules(); -#endif - if (argc < 2) { - return OxError(1, "Please provide path to project directory or OxFS file."); - } - const auto path = argv[1]; - oxRequireM(fs, keel::loadRomFs(path)); - return run(std::move(fs)); -} - -#ifdef _WIN32 -int WinMain() { - auto const argc = __argc; - auto const argv = const_cast(__argv); -#else -int main(int argc, const char **argv) { -#endif - OX_INIT_DEBUG_LOGGER(loggerConn, "Nostalgia Player") - ox::Error err; - err = run(argc, argv); - oxAssert(err, "Something went wrong..."); - if (err) { - oxErrf("Failure: {}\n", toStr(err)); - } - return static_cast(err); -}