From 6d6ccb5778308f20271a0b31ca12497e9e89d8a2 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:15:34 +0200 Subject: [PATCH 01/33] Translate Gold's in-game OPTION screen src/ui/gen2/OptionsMenu.lua had zero Strings() calls: every row label and every cart-original display value (FAST/MID/SLOW, ON/OFF, SHIFT/SET, MONO/STEREO, the PRINT contrast ladder, :TYPE) was a bare literal baked into the module-level ROWS table, invisible to a translation mod's `strings` registry (reported against a real Gold build, gen1recomp#1642). The Gen 1 OPTION screen (src/ui/OptionsMenu.lua) already routes every one of its equivalent rows through Strings(). ROWS is built once at require time, before any mod's Strings.load has a catalog to answer from, so wrapping its literals directly in Strings() would freeze the English (src/core/Strings.lua's own note on this). Labels and cart-original display strings are wrapped in Strings.source instead -- an identity marker that keeps the catalog generator's harvest of them, without changing when the lookup runs -- and drawPanel resolves them live through plain Strings() calls, the same split PR #1450 used for the clock and day-of-week screens. Also routed the two port-added rows (SCREEN POS, VIBRATION) and the touch pad ON/OFF row through Strings() at their value call sites, matching how the Gen 1 screen already treats the same shared ScreenPosition.label/TouchControls.hapticLabel helpers -- both return raw, untranslated text on their own. Left MUSIC VOL/SFX VOL's OFF/level readout and the MUSIC FILTER ladder (OFF/1X/2X/3X) untranslated, since that mirrors the Gen 1 screen's own established choice for the same two helpers. --- src/ui/gen2/OptionsMenu.lua | 116 +++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 49 deletions(-) diff --git a/src/ui/gen2/OptionsMenu.lua b/src/ui/gen2/OptionsMenu.lua index 3ff6f334..5d8d62c8 100644 --- a/src/ui/gen2/OptionsMenu.lua +++ b/src/ui/gen2/OptionsMenu.lua @@ -22,6 +22,7 @@ local Chrome = require("src.ui.gen2.Chrome") local Logger = require("src.core.Logger") local Runtime = require("src.mods.Runtime") local Save = require("src.core.gen2.Save") +local Strings = require("src.core.Strings") local OptionsMenu = {} OptionsMenu.__index = OptionsMenu @@ -42,43 +43,60 @@ end -- Each row: the label, the option key it edits, and the cycle of values with -- the exact strings the cart prints (trailing spaces included -- they are what -- blank the longer previous value, e.g. "MID " over "SLOW"). +-- Labels and cart-original display strings are wrapped in Strings.source so +-- the catalog generator harvests them even though this table is built once +-- at require time, before any mod's Strings.load has a catalog to answer +-- from (src/core/Strings.lua's own note on this). The lookup itself happens +-- live, in drawPanel, through plain Strings(...) calls. local ROWS = { { - label = "TEXT SPEED", key = "textSpeed", + label = Strings.source("TEXT SPEED"), key = "textSpeed", values = { "FAST", "MID", "SLOW" }, - display = { FAST = "FAST", MID = "MID ", SLOW = "SLOW" }, - }, - { - label = "BATTLE SCENE", key = "battleScene", - values = { true, false }, - display = { [true] = "ON ", [false] = "OFF" }, - }, - { - label = "BATTLE STYLE", key = "battleStyle", - values = { "SHIFT", "SET" }, - display = { SHIFT = "SHIFT", SET = "SET " }, - }, - { - label = "SOUND", key = "sound", - values = { "MONO", "STEREO" }, - display = { MONO = "MONO ", STEREO = "STEREO" }, - }, - { - label = "PRINT", key = "print", - values = { "LIGHTEST", "LIGHTER", "NORMAL", "DARKER", "DARKEST" }, display = { - LIGHTEST = "LIGHTEST", LIGHTER = "LIGHTER ", NORMAL = "NORMAL ", - DARKER = "DARKER ", DARKEST = "DARKEST ", + FAST = Strings.source("FAST"), MID = Strings.source("MID "), + SLOW = Strings.source("SLOW"), }, }, { - label = "MENU ACCOUNT", key = "menuAccount", + label = Strings.source("BATTLE SCENE"), key = "battleScene", + values = { true, false }, + display = { + [true] = Strings.source("ON "), [false] = Strings.source("OFF"), + }, + }, + { + label = Strings.source("BATTLE STYLE"), key = "battleStyle", + values = { "SHIFT", "SET" }, + display = { + SHIFT = Strings.source("SHIFT"), SET = Strings.source("SET "), + }, + }, + { + label = Strings.source("SOUND"), key = "sound", + values = { "MONO", "STEREO" }, + display = { + MONO = Strings.source("MONO "), STEREO = Strings.source("STEREO"), + }, + }, + { + label = Strings.source("PRINT"), key = "print", + values = { "LIGHTEST", "LIGHTER", "NORMAL", "DARKER", "DARKEST" }, + display = { + LIGHTEST = Strings.source("LIGHTEST"), LIGHTER = Strings.source("LIGHTER "), + NORMAL = Strings.source("NORMAL "), DARKER = Strings.source("DARKER "), + DARKEST = Strings.source("DARKEST "), + }, + }, + { + label = Strings.source("MENU ACCOUNT"), key = "menuAccount", values = { false, true }, - display = { [false] = "OFF", [true] = "ON " }, + display = { + [false] = Strings.source("OFF"), [true] = Strings.source("ON "), + }, }, -- FRAME is the textbox border style, 1-8, and prints its number after the -- word TYPE rather than in the shared value column. - { label = "FRAME", key = "frame", frame = true }, + { label = Strings.source("FRAME"), key = "frame", frame = true }, -- Everything from here down is the port's, not the cart's. They are the -- same settings the Gen 1 OPTION screen carries and they drive the same -- shared modules, so a player who learns them in Red knows them here. The @@ -86,17 +104,17 @@ local ROWS = { -- -- The two volume rows clamp at the ends rather than wrapping, the way -- pokered's text-speed cursor does, so holding left reaches OFF and stays. - { id = "controls", label = "CONTROLS", port = true, + { id = "controls", label = Strings.source("CONTROLS"), port = true, activate = function(game) require("src.ui.Screens").push(game, "BindingsMenu") end }, - { label = "MUSIC VOL", key = "musicVol", port = true, + { label = Strings.source("MUSIC VOL"), key = "musicVol", port = true, cycle = function(options, delta) options.musicVol = stepVolume(options.musicVol, delta) require("src.core.Music").setVolumeLevel(options.musicVol) end, text = function(options) return volLabel(options.musicVol) end }, - { label = "SFX VOL", key = "sfxVol", port = true, + { label = Strings.source("SFX VOL"), key = "sfxVol", port = true, cycle = function(options, delta) options.sfxVol = stepVolume(options.sfxVol, delta) require("src.core.Sound").setVolumeLevel(options.sfxVol) @@ -104,7 +122,7 @@ local ROWS = { text = function(options) return volLabel(options.sfxVol) end }, -- Each filter step keeps 40% of the previous step's treble, so 2X and 3X -- are the 1X low-pass applied twice and three times over. - { label = "MUSIC FILTER", key = "musicFilter", port = true, + { label = Strings.source("MUSIC FILTER"), key = "musicFilter", port = true, cycle = function(options, delta) options.musicFilter = ((options.musicFilter or 0) + delta) % #FILTERS require("src.core.Music").setFilterLevel(options.musicFilter) @@ -112,7 +130,7 @@ local ROWS = { text = function(options) return FILTERS[(options.musicFilter or 0) + 1] end }, - { label = "GAME SPEED", key = "speed", port = true, + { label = Strings.source("GAME SPEED"), key = "speed", port = true, cycle = function(options, delta) local GameSpeed = require("src.core.GameSpeed") options.speed = GameSpeed.cycle(options.speed, delta) @@ -120,7 +138,7 @@ local ROWS = { text = function(options) return require("src.core.GameSpeed").levelLabel(options.speed) end }, - { label = "ZOOM", key = "zoom", port = true, + { label = Strings.source("ZOOM"), key = "zoom", port = true, cycle = function(options, delta, game) local Zoom = require("src.render.Zoom") local scale = Zoom.windowFitScale() @@ -136,7 +154,7 @@ local ROWS = { -- a boundary; WATER / TREES force one outdoor block; BLACK is a flat void. -- #1418. Same key the Gen 1 OPTION screen uses, different ladder (FADE -- is Gold's default because that is already what the maps call for). - { label = "VOID FILL", key = "voidFill", port = true, + { label = Strings.source("VOID FILL"), key = "voidFill", port = true, cycle = function(options, delta) local BorderFill = require("src.world.gen2.BorderFill") BorderFill.setVoidFill(options.voidFill or "fade") @@ -145,7 +163,7 @@ local ROWS = { text = function(options) return require("src.world.gen2.BorderFill").voidFillLabel(options.voidFill) end }, - { label = "TILT", key = "tilt", port = true, + { label = Strings.source("TILT"), key = "tilt", port = true, cycle = function(options, delta) local Tilt = require("src.render.Tilt") -- Four levels (OFF, 15, 35, 50); left steps back through them. @@ -160,7 +178,7 @@ local ROWS = { -- CGB game whose colour comes from its own palettes, so there are no packs -- to swap -- what there is instead is the choice to turn that colour OFF, -- down to the grey Game Boy or the green one. GBC is the default. - { label = "COLOR", key = "color", port = true, + { label = Strings.source("COLOR"), key = "color", port = true, cycle = function(options, delta) local GbcPalette = require("src.render.GbcPalette") GbcPalette.setMode(options.color or "gbc") @@ -169,7 +187,7 @@ local ROWS = { text = function(options) return require("src.render.GbcPalette").modeLabel(options.color or "gbc") end }, - { label = "GBC FX", key = "gbcfx", port = true, + { label = Strings.source("GBC FX"), key = "gbcfx", port = true, cycle = function(options, delta) local GBCFX = require("src.render.GBCFX") if not GBCFX.isSupported() then @@ -183,7 +201,7 @@ local ROWS = { text = function(options) return require("src.render.GBCFX").levelLabel(options.gbcfx or 0) end }, - { label = "VIDEO MODE", key = "videoMode", port = true, + { label = Strings.source("VIDEO MODE"), key = "videoMode", port = true, cycle = function(options, delta) local VideoMode = require("src.core.VideoMode") options.videoMode = VideoMode.cycle(options.videoMode, delta) @@ -194,20 +212,20 @@ local ROWS = { return VideoMode.normalize(options.videoMode) == "borderless" and "FULL" or "WINDOWED" end }, - { label = "SCREEN POS", key = "screenPos", port = true, + { label = Strings.source("SCREEN POS"), key = "screenPos", port = true, cycle = function(options, delta) local ScreenPosition = require("src.core.ScreenPosition") options.screenPos = ScreenPosition.cycle(options.screenPos, delta) ScreenPosition.setMode(options.screenPos) end, text = function(options) - return require("src.core.ScreenPosition").label(options.screenPos) + return Strings(require("src.core.ScreenPosition").label(options.screenPos)) end }, - { id = "touchControls", label = "TOUCH PAD", port = true, + { id = "touchControls", label = Strings.source("TOUCH PAD"), port = true, text = function(options) local tc = options.touchControls local on = not (type(tc) == "table" and tc.enabled == false) - return on and "ON" or "OFF" + return on and Strings("ON") or Strings("OFF") end, cycle = function(options, _delta, game) local tc = type(options.touchControls) == "table" and options.touchControls or {} @@ -216,13 +234,13 @@ local ROWS = { require("src.core.TouchControls"):applyOptions(options) if game and game.persistOptions then game:persistOptions() end end }, - { id = "touchLayout", label = "TOUCH LAYOUT", port = true, + { id = "touchLayout", label = Strings.source("TOUCH LAYOUT"), port = true, activate = function(game) game.stack:push(require("src.ui.TouchControlsEditor").new(game)) end }, - { id = "haptics", label = "VIBRATION", port = true, + { id = "haptics", label = Strings.source("VIBRATION"), port = true, text = function(options) - return require("src.core.TouchControls").hapticLabel(options.haptics) + return Strings(require("src.core.TouchControls").hapticLabel(options.haptics)) end, cycle = function(options, delta, game) local TC = require("src.core.TouchControls") @@ -231,7 +249,7 @@ local ROWS = { TC.buzz(options.haptics) if game and game.persistOptions then game:persistOptions() end end }, - { label = "MAX FPS", key = "fpsCap", port = true, + { label = Strings.source("MAX FPS"), key = "fpsCap", port = true, cycle = function(options, delta) local FrameCap = require("src.core.FrameCap") options.fpsCap = FrameCap.cycle(options.fpsCap, delta) @@ -240,7 +258,7 @@ local ROWS = { text = function(options) return require("src.core.FrameCap").label(options.fpsCap) end }, - { label = "CANCEL", cancel = true }, + { label = Strings.source("CANCEL"), cancel = true }, } -- The cart's screen is one full-height textbox with every row on it. This one @@ -424,9 +442,9 @@ function OptionsMenu:drawPanel() local row = self.rows[i] if row then local labelY = 2 + (slot - 1) * 2 - Chrome.print(row.label, 2, labelY) + Chrome.print(Strings(row.label), 2, labelY) if row.frame then - Chrome.print(":TYPE", 10, labelY + 1) + Chrome.print(Strings(":TYPE"), 10, labelY + 1) Chrome.print(tostring(self.options.frame or 1), 16, labelY + 1) elseif row.text then Chrome.print(":", 10, labelY + 1) @@ -434,7 +452,7 @@ function OptionsMenu:drawPanel() elseif row.values then Chrome.print(":", 10, labelY + 1) local value = self.options[row.key] - local text = row.display and row.display[value] or tostring(value) + local text = row.display and Strings(row.display[value]) or tostring(value) Chrome.print(text, 11, labelY + 1) elseif type(row.value) == "function" then -- the Gen 1 row's value reader (src/ui/OptionRows.lua:4), so a mod row From c2e1d810f9d5928fc54639940dc81024b01ffe5b Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:15:43 +0200 Subject: [PATCH 02/33] Cover the Gold OPTION screen translation fix with a targeted test Drives OptionsMenu:drawPanel() with a mod-loaded Strings catalog and checks the translated text reaches Font.draw for a cart-original row (label and its display value), a port-added row's label, and CANCEL, plus a vanilla no-mod case proving the fallback is unchanged. Reverting src/ui/gen2/OptionsMenu.lua to its pre-fix content fails 4 of the 9 checks, reproducing the reported bug exactly. --- .../gen2_options_menu_translation_test.lua | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 tests/engine/gen2_options_menu_translation_test.lua diff --git a/tests/engine/gen2_options_menu_translation_test.lua b/tests/engine/gen2_options_menu_translation_test.lua new file mode 100644 index 00000000..2ce171c3 --- /dev/null +++ b/tests/engine/gen2_options_menu_translation_test.lua @@ -0,0 +1,121 @@ +-- Gold's OPTION screen (src/ui/gen2/OptionsMenu.lua) used to draw every row +-- label -- and the cart-original value strings (FAST/MID/SLOW, ON/OFF, +-- SHIFT/SET, ...) -- as bare literals baked into the module-level ROWS +-- table, invisible to a translation mod's `strings` registry (reported +-- against a real Gold build, gen1recomp#1642). This drives +-- OptionsMenu:drawPanel() with a mod-loaded Strings catalog and checks the +-- translated text reaches Font.draw, for both a cart-original row (label + +-- display value) and a port-added row (label only -- its value already +-- comes pre-translated from the shared module it calls, same as the Gen 1 +-- OPTION screen's equivalent rows), plus a vanilla no-mod case proving the +-- fallback is unchanged. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") + +love = require("tests.love_stub") + +require("src.core.Logger").warn = function() end + +-- Chrome.print (the only draw call this screen makes) goes straight to +-- Font.draw, so recording that call is enough to see exactly what text +-- reached the screen -- same technique as +-- tests/engine/status_abbreviation_translation_test.lua. Stubbed before +-- OptionsMenu (and the Chrome module it requires) ever loads, so Chrome's +-- own `local Font = require(...)` captures this stub instead of the real +-- module. +local drawn +package.loaded["src.render.Font"] = { + draw = function(text, x, y) + drawn[#drawn + 1] = { text = text, x = x, y = y } + end, + drawCode = function() end, + drawBox = function() end, +} + +local OptionsMenu = require("src.ui.gen2.OptionsMenu") +local Strings = require("src.core.Strings") + +local function drawnAt(x, y) + for _, d in ipairs(drawn) do + if d.x == x and d.y == y then return d.text end + end + return nil +end + +-- Chrome.print multiplies tile coordinates by 8 (src/ui/gen2/Chrome.lua); +-- drawPanel puts labels at tile x=2 and values at tile x=11. +local LABEL_X = 2 * 8 +local VALUE_X = 11 * 8 + +local function rowIndex(rows, id) + for i, row in ipairs(rows) do + if row.id == id then return i end + end +end + +-- ---------------------------------------------- vanilla: no mod catalog +do + local menu = OptionsMenu.new({}) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(LABEL_X, 2 * 8), "TEXT SPEED", + "row 1's label draws in English with no mod loaded") + -- Save.DEFAULT_OPTIONS.textSpeed is "MID", the cart's own default. + T.eq(drawnAt(VALUE_X, 3 * 8), "MID ", + "and its cart-original display value too") +end + +-- ------------------------------------------------- a translation mod's turn +do + Strings.load({ + strings = { + ["TEXT SPEED"] = "VITESSE TEXTE", + ["MID "] = "MOY ", + ["CONTROLS"] = "COMMANDES", + ["CANCEL"] = "ANNULER", + }, + }) + + local menu = OptionsMenu.new({}) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(LABEL_X, 2 * 8), "VITESSE TEXTE", + "a mod catalog reaches a cart-original row's label") + T.eq(drawnAt(VALUE_X, 3 * 8), "MOY ", + "and its cart-original display value") + + -- CONTROLS is the first port-added row; scroll to it so it lands in the + -- VISIBLE_ROWS=7 window drawPanel actually draws. + local index = rowIndex(menu.rows, "controls") + T.check(index ~= nil, "CONTROLS is one of the rows") + menu.index = index + menu:ensureVisible() + drawn = {} + menu:drawPanel() + local slot = index - menu.scroll + T.eq(drawnAt(LABEL_X, (2 + (slot - 1) * 2) * 8), "COMMANDES", + "and a port-added row's label is translated too") + + -- CANCEL is the last row, built into ROWS like any other -- there is no + -- separate hook to fall through if this one row is missed. + local cancelMenu = OptionsMenu.new({}) + local cancelIndex = #cancelMenu.rows + T.check(cancelMenu.rows[cancelIndex].cancel, "the last row is CANCEL") + cancelMenu.index = cancelIndex + cancelMenu:ensureVisible() + drawn = {} + cancelMenu:drawPanel() + local cancelSlot = cancelIndex - cancelMenu.scroll + T.eq(drawnAt(LABEL_X, (2 + (cancelSlot - 1) * 2) * 8), "ANNULER", + "CANCEL, the way out of the menu, is translated too") + + -- Module state is process-global (see tests/gen2_clock_test.lua's own + -- note); this suite gets its own process from tests/tier_runner.lua, but + -- leaving the catalog loaded past this point would still mistranslate + -- every check below it in this file. + Strings.load({}) + T.check(not Strings.active(), "the catalog is unloaded for the checks after this one") +end + +T.finish("gen2_options_menu_translation_test") From 24a7ff86d407ac925256c715a08144bb877032c0 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sat, 22 Aug 2026 20:10:13 +0200 Subject: [PATCH 03/33] Stop drawing invisible TTF text on Gold's palette-shaded screens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chrome.printThrough (src/ui/gen2/Chrome.lua) runs a string through the GbcPalette shade-remap shader whenever a palette is given, so a screen whose background is not white -- the naming/keyboard screen, Diploma, Pokegear, Credits -- gets its text colour resolved from the same palette as everything else on it. The shader recovers a shade by reading the RED CHANNEL of an already-rasterized 2bpp tile pixel (src/render/GbcPalette.lua's SHADER_SOURCE), which assumes the texture underneath is one of the four flat GB shades. A TTF glyph is not: LÖVE's font rasterizer stores glyph coverage as alpha over a plain white texture and lets the current tint carry the ink colour, so that same red-channel read always comes back 1.0 -- shade 0 -- painting every TTF character the exact colour of the paper rect printThrough had just drawn behind it. Since a mod loads a TTF through src/core/Strings.lua's font registry precisely so a translation is not boxed into a handful of tile-page glyphs, every translation mod that ships one hit this: reported against a real Gold build where the naming screen's on-screen keyboard, Diploma and the Pokegear all went blank the moment the mod's TTF took over rendering (gen1recomp#1642). Gen 1 has no such shader, which is why the same mod draws fine there. A TTF glyph carries no discrete shade to recover in the first place, so skip the shader for one and tint it with the palette's own ink colour directly -- the same shade-3 entry the shader's `rgb = pal3` branch would have mapped a black tile pixel to. The switch is per GLYPH rather than per string: a TTF-mod build still keeps multi-byte charmap sequences (the naming screen's own / cells, the 'd/'l/'s ligatures) and anything a mod names in ttf.tiles on their ROM tiles (src/render/Font.lua's Font.split), so one call can mix both kinds of glyph, and a tile glyph drawn alongside a TTF one still needs the shader to pick up a mod's COLOR/rBGP settings correctly. --- src/ui/gen2/Chrome.lua | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/ui/gen2/Chrome.lua b/src/ui/gen2/Chrome.lua index 12f8a802..6a147077 100644 --- a/src/ui/gen2/Chrome.lua +++ b/src/ui/gen2/Chrome.lua @@ -138,11 +138,39 @@ function Chrome.printThrough(text, tx, ty, palette, invert) local paper = pal[1] or { 255, 255, 255 } love.graphics.setColor(paper[1] / 255, paper[2] / 255, paper[3] / 255, 1) love.graphics.rectangle("fill", tx * 8, ty * 8, width, 8) - love.graphics.setColor(1, 1, 1, 1) + -- Per glyph, not per string: a TTF-mod build still keeps the multi-byte + -- charmap sequences (the naming screen's /, the 'd/'l/'s ligatures) + -- and anything the mod names in ttf.tiles (Font.lua's own note on keeping + -- digits tile-based for column alignment) on their ROM tiles, so a string + -- can freely mix the two kinds of glyph. + local ink = pal[4] or { 0, 0, 0 } local previous = love.graphics.getShader() - GbcPalette.useRaw(pal) - Font.draw(text, tx * 8, ty * 8) - love.graphics.setShader(previous) + local shaded = false + local pen = tx * 8 + for _, code in ipairs(Font.encode(text)) do + if code >= Font.TTF_BASE then + -- The shader below recovers a shade from the RED CHANNEL of an already + -- flat-shaded 2bpp tile sheet -- exactly what a TTF glyph is not. + -- LÖVE's font rasterizer stores glyph coverage as alpha over a plain + -- white texture, which this shader reads back as shade 0 no matter how + -- solid the glyph looks, painting the character the SAME colour as the + -- paper rect just drawn above it: invisible (reported against a real + -- Gold build with a TTF translation mod active, gen1recomp#1642). A TTF + -- glyph has no discrete shade to recover in the first place, so skip + -- the shader for it and tint it with the palette's own ink colour + -- (shade 3, the same entry `rgb = pal3` would have mapped a black tile + -- pixel to) directly. + if shaded then love.graphics.setShader(previous); shaded = false end + love.graphics.setColor(ink[1] / 255, ink[2] / 255, ink[3] / 255, 1) + elseif not shaded then + love.graphics.setColor(1, 1, 1, 1) + GbcPalette.useRaw(pal) + shaded = true + end + Font.drawCode(code, pen, ty * 8) + pen = pen + Font.advanceOf(code) + end + if shaded then love.graphics.setShader(previous) end love.graphics.setColor(0, 0, 0, 1) return width end From f76a8b2f96785aa2096c2b81a007e94bbf4818f3 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sat, 22 Aug 2026 20:10:27 +0200 Subject: [PATCH 04/33] Cover the invisible-TTF-text fix with a targeted test No real shader runs headless (love_stub does not stub newShader), so this cannot check a rendered pixel. Font.encode/drawCode/advanceOf/ width are replaced with fakes that hand printThrough a fixed list of glyph codes, so what is checked is the two things that decide the outcome: which glyphs skip the shade-remap shader, and what colour is active when each one draws -- for an all-tile string, an all-TTF one, a string that mixes both (proving the switch is per glyph, not per call), an inverted call, and DMG mode's own resolved palette. Reverting src/ui/gen2/Chrome.lua to its pre-fix content fails every TTF-mode check. A per-string version of the fix (Font.ttfActive() checked once for the whole call instead of per glyph) also fails the mixed-string case here, since it would flatten the naming screen's tile-based / cells to a plain ink tint whenever a TTF is loaded at all, losing their shader-remapped colour even though they never draw from the TTF. --- .../gen2_chrome_print_through_ttf_test.lua | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 tests/engine/gen2_chrome_print_through_ttf_test.lua diff --git a/tests/engine/gen2_chrome_print_through_ttf_test.lua b/tests/engine/gen2_chrome_print_through_ttf_test.lua new file mode 100644 index 00000000..068d0a2f --- /dev/null +++ b/tests/engine/gen2_chrome_print_through_ttf_test.lua @@ -0,0 +1,133 @@ +-- Chrome.printThrough (src/ui/gen2/Chrome.lua) used to run every string +-- through the GbcPalette shade-remap shader whenever a palette was given, +-- with no regard for whether the glyph it was about to draw came from a +-- tile page or from a TTF. The shader recovers a shade by reading the +-- RED CHANNEL of an already-rasterized 2bpp tile pixel (SHADER_SOURCE in +-- src/render/GbcPalette.lua); a TTF glyph is LÖVE's own anti-aliased +-- coverage mask, drawn as plain white with the current tint carrying the +-- ink colour, which that same channel read always reports as shade 0 -- +-- painting every character the SAME colour as the paper rect printThrough +-- had just drawn behind it, i.e. invisible. Reported against a real Gold +-- build running a TTF translation mod: the naming screen's keyboard, +-- Diploma and Pokegear text all vanish, since all three draw through this +-- one routine (gen1recomp#1642). +-- +-- The switch is per GLYPH, not per string: a TTF-mod build still keeps +-- multi-byte charmap sequences (the naming screen's own / cells, +-- the 'd/'l/'s ligatures) and anything a mod names in ttf.tiles on their ROM +-- tiles (src/render/Font.lua's Font.split), so one call can mix both kinds +-- of glyph and each must take its own path. +-- +-- No real shader runs headless (love_stub does not stub newShader), so this +-- cannot check a rendered pixel. Font.encode/drawCode/advanceOf/width are +-- replaced with fakes that hand printThrough a fixed list of glyph codes, +-- so what is checked is the two things that decide the outcome: which +-- glyphs skip the shader, and what colour is active when each one draws. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") + +love = require("tests.love_stub") + +require("src.core.Logger").warn = function() end + +local Chrome = require("src.ui.gen2.Chrome") +local GbcPalette = require("src.render.GbcPalette") +local Font = require("src.render.Font") + +-- Palette arrays are 1-indexed shade 0..3, same order GbcPalette.useRaw +-- reads (src/render/GbcPalette.lua channel()). +local PALETTE = { { 200, 220, 255 }, { 150, 170, 220 }, { 90, 100, 160 }, { 10, 10, 30 } } + +local TILE_CODE = 0x80 +local TTF_CODE = Font.TTF_BASE + 65 -- 'A', were it decoded + +-- "text" is a plain list of glyph codes for this suite; Font.width/encode +-- pass it straight through, matching how a real caller's string would +-- decode to a list of codes. +Font.width = function(codes) return #codes * 8 end +Font.encode = function(codes) return codes end +Font.advanceOf = function(_code) return 8 end + +local drawn +Font.drawCode = function(code, x, y) + drawn[#drawn + 1] = { code = code, x = x, y = y, color = { love.graphics.getColor() } } +end + +local useRawCalls +local realUseRaw = GbcPalette.useRaw +GbcPalette.useRaw = function(...) + useRawCalls = useRawCalls + 1 + return realUseRaw(...) +end + +GbcPalette.available = function() return true end + +local function colorsEq(a, b) + return math.abs(a[1] - b[1]) < 1e-9 and math.abs(a[2] - b[2]) < 1e-9 + and math.abs(a[3] - b[3]) < 1e-9 +end + +-- ------------------------------------------------------- all tile glyphs +do + useRawCalls = 0 + drawn = {} + Chrome.printThrough({ TILE_CODE, TILE_CODE }, 0, 0, PALETTE) + T.eq(useRawCalls, 1, "one shaded run binds the shader once, not per glyph") + T.eq(#drawn, 2, "both glyphs drew") + for i, d in ipairs(drawn) do + T.check(colorsEq(d.color, { 1, 1, 1, 1 }), + ("tile glyph %d is tinted white, letting the shader pick the colour"):format(i)) + end +end + +-- -------------------------------------------------------- all TTF glyphs +do + useRawCalls = 0 + drawn = {} + Chrome.printThrough({ TTF_CODE, TTF_CODE }, 0, 0, PALETTE) + T.eq(useRawCalls, 0, "a TTF glyph never binds the shade-remap shader") + T.eq(#drawn, 2, "both glyphs drew") + local ink = Chrome.throughPalette(PALETTE, false)[4] + for i, d in ipairs(drawn) do + T.check(colorsEq(d.color, { ink[1] / 255, ink[2] / 255, ink[3] / 255, 1 }), + ("TTF glyph %d is tinted with the palette's own ink colour"):format(i)) + end +end + +-- --------------------------------------------- mixed: tile, TTF, then tile +do + useRawCalls = 0 + drawn = {} + Chrome.printThrough({ TILE_CODE, TTF_CODE, TILE_CODE }, 0, 0, PALETTE) + T.eq(useRawCalls, 2, + "the shader re-binds once per return to a tile glyph, not once for the whole string") + T.eq(#drawn, 3, "all three glyphs drew") + local ink = Chrome.throughPalette(PALETTE, false)[4] + T.check(colorsEq(drawn[1].color, { 1, 1, 1, 1 }), "1st (tile) glyph: white/shaded") + T.check(colorsEq(drawn[2].color, { ink[1] / 255, ink[2] / 255, ink[3] / 255, 1 }), + "2nd (TTF) glyph, mid-string, still gets the ink tint") + T.check(colorsEq(drawn[3].color, { 1, 1, 1, 1 }), "3rd (tile) glyph: shaded again") +end + +-- ---------------------------------------------------- inverted TTF ink +do + drawn = {} + Chrome.printThrough({ TTF_CODE }, 0, 0, PALETTE, true) + local ink = Chrome.throughPalette(PALETTE, true)[4] + T.check(colorsEq(drawn[1].color, { ink[1] / 255, ink[2] / 255, ink[3] / 255, 1 }), + "an inverted call tints TTF ink with the inverted palette's own shade-3 entry") +end + +-- ---------------------------------------------- DMG mode's own TTF ink +do + GbcPalette.setMode("dmg") + drawn = {} + Chrome.printThrough({ TTF_CODE }, 0, 0, PALETTE) + local ink = Chrome.throughPalette(PALETTE, false)[4] + T.check(colorsEq(drawn[1].color, { ink[1] / 255, ink[2] / 255, ink[3] / 255, 1 }), + "DMG mode's own resolved palette (four grey hardware shades) still reaches the TTF ink") + GbcPalette.setMode("gbc") +end + +T.finish("gen2_chrome_print_through_ttf_test") From 3470e3c4ae7510bff118cab35f3c24818b8d6ea7 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sat, 22 Aug 2026 20:25:52 +0200 Subject: [PATCH 05/33] Translate Gold's naming/keyboard screen src/ui/gen2/NamingScreen.lua had zero Strings() calls: every prompt (YOUR NAME?/RIVAL'S NAME?/MOTHER'S NAME?/BOX NAME?/NICKNAME?), the on-screen keyboard's own letters, and the lower/UPPER/DEL/END bottom row were bare literals, invisible to a translation mod's `strings` registry (reported against a real Gold build, gen1recomp#1642). The Gen 1 naming screen (src/ui/NamingScreen.lua) already routes its title and every keyboard cell through Strings(); this mirrors that. NamingScreen.TYPES and the bottom-row label tables are built once at require time, before any mod's Strings.load has a catalog to answer from, so their literals are wrapped in Strings.source -- an identity marker that keeps the catalog generator's harvest of them -- and drawPanel resolves them live through plain Strings() calls, the same split used for Gold's OPTION screen and PR #1450's clock screens. The nickname header ("'S" then "NICKNAME?", two lines because Chrome.printThrough draws one row at a time) folds the mon name into the first line's own format string, Strings("%s'S", self.monName), rather than translating just the "'S" suffix: a language whose possessive is not a bare suffix appended to the name can restructure that whole line instead of being stuck splicing one on. --- src/ui/gen2/NamingScreen.lua | 42 +++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/ui/gen2/NamingScreen.lua b/src/ui/gen2/NamingScreen.lua index 4857499c..f60084c4 100644 --- a/src/ui/gen2/NamingScreen.lua +++ b/src/ui/gen2/NamingScreen.lua @@ -21,6 +21,7 @@ local Chrome = require("src.ui.gen2.Chrome") local Font = require("src.render.Font") local GbcPalette = require("src.render.GbcPalette") local Runtime = require("src.mods.Runtime") +local Strings = require("src.core.Strings") local NamingScreen = {} NamingScreen.__index = NamingScreen @@ -67,8 +68,15 @@ local BOX_INPUT_LOWER = { -- case target names the board it SWITCHES TO, not the one it is on: the last -- row of NameInputUpper is "lower DEL END" and the last row of -- NameInputLower is "UPPER DEL END" (data/text/name_input_chars.asm). -local BOTTOM_UPPER_LABELS = { "lower", "DEL", "END" } -local BOTTOM_LOWER_LABELS = { "UPPER", "DEL", "END" } +-- Wrapped in Strings.source, not Strings: both tables are built once at +-- require time, before any mod's Strings.load has a catalog to answer from +-- (src/core/Strings.lua's own note on this); drawPanel resolves them live. +local BOTTOM_UPPER_LABELS = { + Strings.source("lower"), Strings.source("DEL"), Strings.source("END"), +} +local BOTTOM_LOWER_LABELS = { + Strings.source("UPPER"), Strings.source("DEL"), Strings.source("END"), +} -- Cursor tile for each target: NamingScreen_AnimateCursor's .CaseDelEnd adds -- pixel $00 / $30 / $60 to the cursor's own XCOORD of 24 (`depixel 10, 3`), -- which is OAM x 24 / 72 / 120 and so screen tile 2 / 8 / 14. The bracket is @@ -81,10 +89,10 @@ local BOTTOM_CURSOR_TILES = 5 -- NAME_* types (constants/menu_constants.asm order) as prompts + field sizes. -- Lengths are the ASM's *_NAME_LENGTH - 1, i.e. usable characters. NamingScreen.TYPES = { - player = { prompt = "YOUR NAME?", maxLength = 7, sprite = "SPRITE_CHRIS" }, - rival = { prompt = "RIVAL'S NAME?", maxLength = 7, sprite = "SPRITE_RIVAL" }, - mom = { prompt = "MOTHER'S NAME?", maxLength = 7, sprite = "SPRITE_MOM" }, - box = { prompt = "BOX NAME?", maxLength = 8, isBox = true }, + player = { prompt = Strings.source("YOUR NAME?"), maxLength = 7, sprite = "SPRITE_CHRIS" }, + rival = { prompt = Strings.source("RIVAL'S NAME?"), maxLength = 7, sprite = "SPRITE_RIVAL" }, + mom = { prompt = Strings.source("MOTHER'S NAME?"), maxLength = 7, sprite = "SPRITE_MOM" }, + box = { prompt = Strings.source("BOX NAME?"), maxLength = 8, isBox = true }, nickname = { prompt = nil, maxLength = 10 }, } @@ -103,7 +111,7 @@ function NamingScreen.new(game, opts) self.kind = kind self.isBox = opts.isBox or kind.isBox or false self.maxLength = opts.maxLength or kind.maxLength or 7 - self.prompt = opts.prompt or kind.prompt or "NICKNAME?" + self.prompt = opts.prompt or kind.prompt or Strings.source("NICKNAME?") self.monName = opts.monName self.onDone = opts.onDone self.onCancel = opts.onCancel @@ -493,11 +501,15 @@ function NamingScreen:drawPanel() end local pal = self.palette if self.monName then - -- Nickname header is two lines: "'S" then "NICKNAME?". - Chrome.printThrough(self.monName .. "'S", 5, 2, pal) - Chrome.printThrough("NICKNAME?", 5, 4, pal) + -- Nickname header is two lines: "'S" then "NICKNAME?". Kept as two + -- Strings() calls, one per line (Chrome.printThrough draws a single row), + -- with the mon name folded into the first line's own format string so a + -- language whose possessive is not a bare suffix can restructure that + -- line rather than being stuck splicing one on. + Chrome.printThrough(Strings("%s'S", self.monName), 5, 2, pal) + Chrome.printThrough(Strings("NICKNAME?"), 5, 4, pal) else - Chrome.printThrough(self.prompt, 5, 2, pal) + Chrome.printThrough(Strings(self.prompt), 5, 2, pal) end self:drawEntry(5, self.isBox and 4 or 6) @@ -509,14 +521,18 @@ function NamingScreen:drawPanel() for col = 0, 8 do local ch = line[col + 1] if ch and ch ~= " " and ch ~= "" then - Chrome.printThrough(ch, 2 + col * 2, keyboardTop + row * 2, pal) + -- Same seam the Gen 1 board's cells go through (src/ui/NamingScreen + -- .lua's own Strings(cell)): a script whose alphabet does not fit + -- A-Z can swap a cell's glyph without needing the heavier + -- ui.naming.grid hook this screen also offers. + Chrome.printThrough(Strings(ch), 2 + col * 2, keyboardTop + row * 2, pal) end end end local labels = self.lower and BOTTOM_LOWER_LABELS or BOTTOM_UPPER_LABELS local bottomY = keyboardTop + bottom * 2 for i, label in ipairs(labels) do - Chrome.printThrough(label, BOTTOM_LABEL_TX[i], bottomY, pal) + Chrome.printThrough(Strings(label), BOTTOM_LABEL_TX[i], bottomY, pal) end local function cursor() self:drawCursorBox(self:cursorTile()) end From 745374d8ae12bcb4e863f54d98b5661c97cefc4f Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sat, 22 Aug 2026 20:26:08 +0200 Subject: [PATCH 06/33] Cover the naming screen translation fix with a targeted test Drives NamingScreen:drawPanel() with a mod-loaded Strings catalog and checks the translated text reaches Font.draw for the prompt, a keyboard cell, the lower/END bottom-row labels, and both lines of the nickname header (checking the mod's word order actually took, not just the mon name splicing in), plus a vanilla no-mod case proving the fallback is unchanged. Reverting src/ui/gen2/NamingScreen.lua to its pre-fix content fails 6 of the 9 checks, reproducing the reported gap exactly. --- .../gen2_naming_screen_translation_test.lua | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tests/engine/gen2_naming_screen_translation_test.lua diff --git a/tests/engine/gen2_naming_screen_translation_test.lua b/tests/engine/gen2_naming_screen_translation_test.lua new file mode 100644 index 00000000..cf285f7e --- /dev/null +++ b/tests/engine/gen2_naming_screen_translation_test.lua @@ -0,0 +1,100 @@ +-- Gold's naming/keyboard screen (src/ui/gen2/NamingScreen.lua) had zero +-- Strings() calls: every prompt (YOUR NAME?/RIVAL'S NAME?/MOTHER'S NAME?/ +-- BOX NAME?/NICKNAME?), the on-screen keyboard's own letters, and the +-- lower/UPPER/DEL/END bottom-row labels were bare literals, invisible to a +-- translation mod's `strings` registry (reported against a real Gold build, +-- gen1recomp#1642). The Gen 1 naming screen (src/ui/NamingScreen.lua) already +-- routes its title and every keyboard cell through Strings(). +-- +-- GbcPalette.available() is false headless (no real shader compiles), so +-- Chrome.printThrough already falls back to the plain, unshaded Chrome.print +-- -- this drives that path directly and checks the translated text reaches +-- Font.draw, the same technique +-- tests/engine/gen2_options_menu_translation_test.lua uses for the OPTION +-- screen. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") + +love = require("tests.love_stub") + +require("src.core.Logger").warn = function() end + +local drawn +package.loaded["src.render.Font"] = { + draw = function(text, x, y) + drawn[#drawn + 1] = { text = text, x = x, y = y } + end, + drawCode = function() end, + drawBox = function() end, +} + +local NamingScreen = require("src.ui.gen2.NamingScreen") +local Strings = require("src.core.Strings") + +local function drawnAt(x, y) + for _, d in ipairs(drawn) do + if d.x == x and d.y == y then return d.text end + end + return nil +end + +-- Chrome.print multiplies tile coordinates by 8 (src/ui/gen2/Chrome.lua); +-- the prompt lands at tile (5, 2), the keyboard's first cell at (2, 8). +local PROMPT_X, PROMPT_Y = 5 * 8, 2 * 8 +local FIRST_CELL_X, FIRST_CELL_Y = 2 * 8, 8 * 8 + +-- ---------------------------------------------- vanilla: no mod catalog +do + local screen = NamingScreen.new({}, { type = "player" }) + drawn = {} + screen:drawPanel() + T.eq(drawnAt(PROMPT_X, PROMPT_Y), "YOUR NAME?", + "the player-name prompt draws in English with no mod loaded") + T.eq(drawnAt(FIRST_CELL_X, FIRST_CELL_Y), "A", + "and the keyboard's first cell too") +end + +-- ------------------------------------------------- a translation mod's turn +do + Strings.load({ + strings = { + ["YOUR NAME?"] = "TON NOM?", + ["A"] = "À", + ["lower"] = "minusc", + ["END"] = "FIN", + ["%s'S"] = "DE %s", + ["NICKNAME?"] = "SURNOM?", + }, + }) + + local screen = NamingScreen.new({}, { type = "player" }) + drawn = {} + screen:drawPanel() + T.eq(drawnAt(PROMPT_X, PROMPT_Y), "TON NOM?", + "a mod catalog reaches the prompt") + T.eq(drawnAt(FIRST_CELL_X, FIRST_CELL_Y), "À", + "and a keyboard cell") + + -- The bottom row: lower/DEL/END at tile y = keyboardTop + bottom*2. + local bottomY = (screen:keyboardTop() + screen:bottomRow() * 2) * 8 + T.eq(drawnAt(2 * 8, bottomY), "minusc", "the case-switch label is translated") + T.eq(drawnAt(15 * 8, bottomY), "FIN", "and END, the way out of the screen") + + -- The nickname header: two lines, the mon name folded into the first. + local nickScreen = NamingScreen.new({}, { type = "nickname", monName = "BULBASAUR" }) + drawn = {} + nickScreen:drawPanel() + T.eq(drawnAt(PROMPT_X, PROMPT_Y), "DE BULBASAUR", + "the nickname header's first line takes the mod's own word order") + T.eq(drawnAt(PROMPT_X, 4 * 8), "SURNOM?", "and its second line") + + -- Module state is process-global (see tests/gen2_clock_test.lua's own + -- note); this suite gets its own process from tests/tier_runner.lua, but + -- leaving the catalog loaded past this point would still mistranslate + -- every check below it in this file. + Strings.load({}) + T.check(not Strings.active(), "the catalog is unloaded for the checks after this one") +end + +T.finish("gen2_naming_screen_translation_test") From 6d55da0ed2b747bb9f31372825887220c280d30f Mon Sep 17 00:00:00 2001 From: syybott Date: Sat, 22 Aug 2026 16:39:11 -0500 Subject: [PATCH 07/33] Add mod options screen marker --- src/ui/Screens.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ui/Screens.lua b/src/ui/Screens.lua index e52b8d12..59b483e1 100644 --- a/src/ui/Screens.lua +++ b/src/ui/Screens.lua @@ -124,6 +124,14 @@ local function build(game, id, ...) inst = factory.new(game, ...) end inst.screenId = inst.screenId or id + -- Standardized opt-in marker for mod-created options/settings screens. + -- A mod may declare `isModOptions = true` on its screen factory table or + -- on the returned instance. Either way the flag is propagated so that other + -- UI mods can detect mod options screens reliably without brittle screenId + -- string-matching (issue #1697). + if factory.isModOptions and inst.isModOptions == nil then + inst.isModOptions = true + end return inst end From bdbdbf2ed6185129a0d0f2058fb0141bc8fa5aa5 Mon Sep 17 00:00:00 2001 From: david Date: Sat, 22 Aug 2026 18:10:05 -0700 Subject: [PATCH 08/33] Centralize ROM cache publication contract --- src/import/CacheContract.lua | 196 ++++++++++++++++ src/import/RomImporter.lua | 209 ++---------------- tests/engine/rom_cache_contract_test.lua | 176 +++++++++++++++ .../engine/rom_importer_source_tree_test.lua | 38 ++-- tests/engine/trade_art_import.lua | 14 +- 5 files changed, 413 insertions(+), 220 deletions(-) create mode 100644 src/import/CacheContract.lua create mode 100644 tests/engine/rom_cache_contract_test.lua diff --git a/src/import/CacheContract.lua b/src/import/CacheContract.lua new file mode 100644 index 00000000..9aef281e --- /dev/null +++ b/src/import/CacheContract.lua @@ -0,0 +1,196 @@ +-- Engine-owned contract for generated ROM caches. +-- +-- A cache is playable only when its versioned marker matches the ROM and every +-- required output for that version exists. Extraction writers may differ by +-- platform, but they must publish through this contract so partial staging +-- cannot look ready to the runtime. +local GameVersion = require("src.core.GameVersion") + +local CacheContract = {} + +CacheContract.FORMAT = "rom-cache-v10:" +CacheContract.MARKER_PATH = "rom-cache.complete" + +CacheContract.REQUIRED_FILES = { + "data/generated/constants.lua", + "data/generated/maps.lua", + "data/generated/text.lua", + "data/generated/field.lua", + "data/generated/battle_anims.lua", + "assets/generated/title/pokemon_logo.png", + "assets/generated/fonts/font.png", + "assets/generated/battle/front/pikachu.png", + "assets/generated/battle/anims/move_anim_0.png", + "assets/generated/battle/anims/move_anim_1.png", + "assets/generated/audio/programs.bin", + "assets/generated/trade/game_boy.png", +} + +CacheContract.VERSION_REQUIRED_FILES = { + yellow = { + "assets/generated/battle/trainers/jessie_james.png", + "assets/generated/battle/profoakb.png", + "assets/generated/pikachu/pikapic_1.png", + }, +} + +CacheContract.VERSION_REQUIRED_FILES_OVERRIDE = { + gold = { + "data/generated/constants.lua", + "data/generated/maps.lua", + "data/generated/roofs.lua", + "data/generated/sprites.lua", + "data/generated/scripts.lua", + "data/generated/text.lua", + -- The engine's label-keyed strings are separate from Gen 2 script text. + -- Caches made before RomExtractorGen2:extractText must be rebuilt so + -- src/core/RomText.lua does not silently fall back to built-in wording. + "data/generated/rom_text.lua", + "data/generated/pokemon.lua", + "data/generated/tilesets.lua", + "data/generated/audio.lua", + "data/generated/marts.lua", + "assets/generated/fonts/font.png", + "assets/generated/fonts/frames.png", + "assets/generated/title/pokemon_logo.png", + "assets/generated/title/title_screen.png", + "assets/generated/title/hooh.png", + "assets/generated/title/hooh_5.png", + "assets/generated/title/clouds.png", + "assets/generated/title/copyright_splash.png", + "data/generated/oak_speech.lua", + "assets/generated/intro/oak.png", + "assets/generated/intro/cal.png", + "assets/generated/tilesets/johto.png", + "assets/generated/tilesets/roofs/new_bark.png", + "assets/generated/sprites/chris.png", + "assets/generated/battle/front/chikorita.png", + "assets/generated/battle/front/pikachu.png", + "assets/generated/battle/front/marill.png", + "assets/generated/battle/trainers/falkner.png", + "assets/generated/battle/hud/balls.png", + "assets/generated/audio/programs.bin", + "assets/generated/slots/gold_slots_1.png", + "assets/generated/card_flip/card_flip_1.png", + "assets/generated/pc/mail_item.png", + }, +} +CacheContract.VERSION_REQUIRED_FILES_OVERRIDE.silver = + CacheContract.VERSION_REQUIRED_FILES_OVERRIDE.gold + +function CacheContract.requiredFilesFor(version) + local override = CacheContract.VERSION_REQUIRED_FILES_OVERRIDE[version] + if override then return override, true end + return CacheContract.REQUIRED_FILES, false +end + +function CacheContract.markerFor(version) + return CacheContract.FORMAT .. GameVersion.info(version).sha1 +end + +-- Keep the process-global CacheFs prefix isolated even when a filesystem +-- adapter raises while probing or publishing. The real CacheFs methods +-- return errors, but this also makes the contract safe for platform adapters +-- that surface I/O failures as Lua errors. +local function withVersionPrefix(version, fs, action) + local saved = fs.prefix + fs.prefix = GameVersion.cachePrefix(version) + local ok, first, second = pcall(action) + fs.prefix = saved + if not ok then return false, first end + return true, first, second +end + +function CacheContract.allRequiredFilesExist(version, fs) + fs = fs or require("src.import.CacheFs") + local ok, complete, missing = withVersionPrefix(version, fs, function() + local required, isOverride = CacheContract.requiredFilesFor(version) + local missingPath + for _, path in ipairs(required) do + if not fs.exists(path) then missingPath = path; break end + end + if not missingPath and not isOverride then + for _, path in ipairs(CacheContract.VERSION_REQUIRED_FILES[version] or {}) do + if not fs.exists(path) then missingPath = path; break end + end + end + return missingPath == nil, missingPath + end) + if not ok then return false, complete end + return complete, missing +end + +function CacheContract.readMarker(version, fs) + fs = fs or require("src.import.CacheFs") + local ok, marker, readError = withVersionPrefix(version, fs, function() + return fs.read(CacheContract.MARKER_PATH) + end) + if not ok then return nil, marker end + -- LÖVE may return contents plus a byte count; only a nil contents result + -- makes the auxiliary value an error. CacheFs' portable reader returns + -- just the contents, so this remains adapter-neutral. + if marker == nil then return nil, readError end + return marker +end + +function CacheContract.isReady(version, fs) + fs = fs or require("src.import.CacheFs") + if CacheContract.sourceTreeHasData(version) then return true end + local marker, readError = CacheContract.readMarker(version, fs) + if readError or marker ~= CacheContract.markerFor(version) then return false end + return CacheContract.allRequiredFilesExist(version, fs) +end + +function CacheContract.publish(version, fs) + fs = fs or require("src.import.CacheFs") + local complete, missing = CacheContract.allRequiredFilesExist(version, fs) + if not complete then + -- A caller may be retrying over a partially replaced cache. Do not + -- leave its old marker advertising readiness after this failed check. + local removed, removeError = withVersionPrefix(version, fs, function() + if not fs.remove then + error("cache filesystem cannot remove the completion marker") + end + return fs.remove(CacheContract.MARKER_PATH) + end) + if not removed then + return false, "cache is incomplete; missing " .. tostring(missing) + .. "; could not remove completion marker: " .. tostring(removeError) + end + return false, "cache is incomplete; missing " .. tostring(missing) + end + local changed, ok, err = withVersionPrefix(version, fs, function() + return fs.write(CacheContract.MARKER_PATH, CacheContract.markerFor(version)) + end) + if not changed then return false, tostring(ok) end + return ok, err +end + +function CacheContract.sourceTreeHasData(version) + if not (love and love.filesystem and love.filesystem.getInfo + and love.filesystem.getRealDirectory and love.filesystem.getSource) then + return false + end + local prefix = version == "red" and "" or GameVersion.cachePrefix(version) + local required, isOverride = CacheContract.requiredFilesFor(version) + local source = love.filesystem.getSource() + for _, path in ipairs(required) do + local fullPath = prefix .. path + if love.filesystem.getInfo(fullPath, "file") == nil + or love.filesystem.getRealDirectory(fullPath) ~= source then + return false + end + end + if not isOverride then + for _, path in ipairs(CacheContract.VERSION_REQUIRED_FILES[version] or {}) do + local fullPath = prefix .. path + if love.filesystem.getInfo(fullPath, "file") == nil + or love.filesystem.getRealDirectory(fullPath) ~= source then + return false + end + end + end + return true +end + +return CacheContract diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index aa6ea4cf..152fe88e 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -28,137 +28,12 @@ local function pickFile(...) return fn(...) and true or false end --- Cache generation tag; bump to force every imported version to re-extract. --- v9: Yellow audio re-anchored on pokeyellow.sym (#522) -- stale caches --- carry Red's bank $1f header, wave-table, and CryData offsets. --- v10: maps carry their raw map-header/connection/object bytes and tilesets --- their Tilesets row (#889), which a .sav export replays so a Continue on --- real hardware has a map to load; a v9 cache has none of them and exports --- the same unbootable save as before. --- Deliberately NOT bumped for the Gold trainer-pic gap: this tag invalidates --- every version at once, and that gap is Gold-only. A per-version marker in --- VERSION_REQUIRED_FILES_OVERRIDE.gold re-imports exactly the caches that lack --- the stage, which is what the Yellow markers below already do for #439/#557. --- Reach for a bump when the change spans versions or has no single file to --- point at. -local CACHE_FORMAT = "rom-cache-v10:" --- The completion marker is written under each version's cache prefix --- (red/rom-cache.complete, blue/rom-cache.complete, ...). -local MARKER_PATH = "rom-cache.complete" - --- The marker a finished import writes for a version: the generation tag plus --- that version's ROM hash, so both a format bump and a swapped ROM invalidate. -local function markerFor(version) - return CACHE_FORMAT .. GameVersion.info(version).sha1 -end +local CacheContract = require("src.import.CacheContract") local COMMUNITY_URL = "https://bois.icu" local TRUST_WARNING = "if you did not get this from bryanthaboi's github " .. "or a link from the discord that bryanthaboi himself posted, just know " .. "it might have been tampered with. go to the discord to verify " .. COMMUNITY_URL .. " (or click the logo above)" -local REQUIRED_FILES = { - "data/generated/constants.lua", - "data/generated/maps.lua", - "data/generated/text.lua", - "data/generated/field.lua", - "data/generated/battle_anims.lua", - "assets/generated/title/pokemon_logo.png", - "assets/generated/fonts/font.png", - "assets/generated/battle/front/pikachu.png", - "assets/generated/battle/anims/move_anim_0.png", - "assets/generated/battle/anims/move_anim_1.png", - "assets/generated/audio/programs.bin", - -- The trade cinematic's Game Boy / cable art. Caches built before #750 - -- carry none of it and fall back to plain rectangles, so listing one of - -- the files re-imports them without a CACHE_FORMAT bump. - "assets/generated/trade/game_boy.png", -} - --- Files only one version's cache carries. A version that predates one of --- them re-imports on its own, without dragging the other versions through a --- CACHE_FORMAT bump. -local VERSION_REQUIRED_FILES = { - yellow = { - "assets/generated/battle/trainers/jessie_james.png", -- #439 - -- Oak's own back pic and the pikapic base frames only exist in caches - -- built after their manifest symbols landed, so an older Yellow cache - -- has to re-import to stop falling back to the old man's back pic and - -- to the battle front pic (#557, #561). Both are gated on manifest - -- symbols in RomExtractor, so these markers must only ever list files - -- tools/rom_manifest_yellow.json can actually produce -- otherwise the - -- cache reads as incomplete and re-importing cannot clear it. - "assets/generated/battle/profoakb.png", - "assets/generated/pikachu/pikapic_1.png", - }, -} - --- Gold Phase 1 writes a thinner cache than Gen 1 (no battle anim sheets, --- trade art, or field.lua payload yet -- see docs/gold-phase1.md). This --- list replaces REQUIRED_FILES entirely for that version so a successful --- Gen 2 extract is not stuck as "incomplete" waiting on Gen 1 markers. -local VERSION_REQUIRED_FILES_OVERRIDE = { - gold = { - "data/generated/constants.lua", - "data/generated/maps.lua", - "data/generated/roofs.lua", -- Phase 2: forces re-import of Phase 1 caches - "data/generated/sprites.lua", -- OW sheets (Chris + NPCs) - "data/generated/scripts.lua", -- disassembled map scripts - "data/generated/text.lua", -- decoded Gen 2 dialogue strings - -- The engine's own strings, keyed by label rather than by address. A - -- cache built before RomExtractorGen2:extractText has none, and every - -- line that reads through src/core/RomText.lua would silently keep - -- printing its Lua fallback, so this re-imports those caches rather than - -- bumping CACHE_FORMAT and dragging Red, Blue and Yellow through it too. - "data/generated/rom_text.lua", - "data/generated/pokemon.lua", - "data/generated/tilesets.lua", - "data/generated/audio.lua", - -- Mart shelves + the heal machine art ride the same import, so listing - -- marts.lua alone re-imports the caches from before either existed - -- (empty shop shelves, no Pokecenter light show). - "data/generated/marts.lua", - "assets/generated/fonts/font.png", - "assets/generated/fonts/frames.png", -- the seven other OPTION textbox frames - "assets/generated/title/pokemon_logo.png", - "assets/generated/title/title_screen.png", -- TitleScreenTilemap composition - "assets/generated/title/hooh.png", - "assets/generated/title/hooh_5.png", -- wing-flap frames force re-import - "assets/generated/title/clouds.png", - "assets/generated/title/copyright_splash.png", - "data/generated/oak_speech.lua", -- Oak texts + trainer pics - "assets/generated/intro/oak.png", - "assets/generated/intro/cal.png", - "assets/generated/tilesets/johto.png", - "assets/generated/tilesets/roofs/new_bark.png", - "assets/generated/sprites/chris.png", - "assets/generated/battle/front/chikorita.png", - "assets/generated/battle/front/pikachu.png", - "assets/generated/battle/front/marill.png", -- Oak speech demo mon - -- The trainer class pics (TrainerPicPointers). FALKNER is row 0 of that - -- table, so a cache that produced any class pic at all produced this one. - -- Listed for the reason the Yellow markers above are: a cache built before - -- the stage existed reads as INCOMPLETE and re-imports itself, so this - -- particular gap cannot survive a tag bump being forgotten again. It - -- costs nothing on a current cache and is the difference between every - -- trainer battle opening with a picture and opening with none. - "assets/generated/battle/trainers/falkner.png", - -- BattleStart_TrainerHuds cannot draw its party rows from a cache made - -- before the four ball tiles were extracted (#1502). - "assets/generated/battle/hud/balls.png", - "assets/generated/audio/programs.bin", - -- Goldenrod Game Corner reel + board art (#1581). menu_gfx.lua used to - -- advertise these paths even when Slots*LZ / CardFlip* were absent from - -- the manifest, so a cache that never wrote the PNGs still looked - -- complete and SlotMachine crashed on its labelled-cell fallback. - "assets/generated/slots/gold_slots_1.png", - "assets/generated/card_flip/card_flip_1.png", - -- PCMailGFX (engine/pokemon/bills_pc.asm:2170-2173) - "assets/generated/pc/mail_item.png", - }, -} --- Same Gen 2 extract, so a Silver cache is complete when the same files exist. -VERSION_REQUIRED_FILES_OVERRIDE.silver = VERSION_REQUIRED_FILES_OVERRIDE.gold - -- "Split-screen ROM selector" first-run palette (matches the FirstRun mockup): -- a dark neon arcade panel, one column per game. -- Red, Blue, and Yellow share the same importer flow once listed in @@ -211,58 +86,6 @@ local PAL = { chipInkGold = { 58, 44, 0 }, -- #3a2c00 dark "Y" on the gold chip } --- Per-version required cache files. Gold replaces the Gen 1 list entirely --- (VERSION_REQUIRED_FILES_OVERRIDE); Yellow adds a few extra markers. -local function requiredFilesFor(version) - local override = VERSION_REQUIRED_FILES_OVERRIDE[version] - if override then return override, true end - return REQUIRED_FILES, false -end - --- CacheFs.exists checks the game folder directly for a portable install, --- otherwise the save directory through love.filesystem. It honors --- CacheFs.prefix, so we point it at the version's cache subtree (red/, --- blue/, yellow/, gold/). -local function allRequiredFilesExist(version) - local CacheFs = require("src.import.CacheFs") - local saved = CacheFs.prefix - CacheFs.prefix = GameVersion.cachePrefix(version) - local ok = true - local required, isOverride = requiredFilesFor(version) - for _, path in ipairs(required) do - if not CacheFs.exists(path) then ok = false; break end - end - if ok and not isOverride then - for _, path in ipairs(VERSION_REQUIRED_FILES[version] or {}) do - if not CacheFs.exists(path) then ok = false; break end - end - end - CacheFs.prefix = saved - return ok -end - --- A developer checkout / Python build leaves generated data in the physfs --- source: Red at the historical root, Blue/Yellow/Gold in their versioned --- trees. Imported Red caches still live under red/. Check source paths --- directly so that cache prefix cannot hide Red's source tree, and keep --- save-dir caches from counting as current source data. -local function sourceTreeHasData(version) - if not love.filesystem.getRealDirectory then return false end - local prefix = version == "red" and "" or GameVersion.cachePrefix(version) - local required, isOverride = requiredFilesFor(version) - for _, path in ipairs(required) do - if love.filesystem.getInfo(prefix .. path, "file") == nil then return false end - end - if not isOverride then - for _, path in ipairs(VERSION_REQUIRED_FILES[version] or {}) do - if love.filesystem.getInfo(prefix .. path, "file") == nil then return false end - end - end - local path = prefix .. required[1] - local real = love.filesystem.getRealDirectory(path) - return real == love.filesystem.getSource() -end - -- ------- ROM cache location -- -- The extracted cache (data/generated, assets/generated) plus the @@ -318,10 +141,15 @@ local function purgeSaveDirCache() -- / yellow/ / gold/ prefix) so it cannot shadow the portable game-folder cache. for _, version in ipairs(GameVersion.ORDER) do local prefix = GameVersion.cachePrefix(version) - if saveDirHas(prefix .. MARKER_PATH) or saveDirHas(prefix .. REQUIRED_FILES[1]) then + local required = CacheContract.requiredFilesFor(version) + local hasRequired = false + for _, path in ipairs(required) do + if saveDirHas(prefix .. path) then hasRequired = true; break end + end + if saveDirHas(prefix .. CacheContract.MARKER_PATH) or hasRequired then removeTree(prefix .. "data/generated") removeTree(prefix .. "assets/generated") - love.filesystem.remove(prefix .. MARKER_PATH) + love.filesystem.remove(prefix .. CacheContract.MARKER_PATH) end end end @@ -336,13 +164,7 @@ function RomImporter.isReady(version) -- save-directory copy that would otherwise shadow it at runtime. purgeSaveDirCache() end - -- Generated data in a developer checkout / Python build is always current. - if sourceTreeHasData(version) then return true end - local saved = CacheFs.prefix - CacheFs.prefix = GameVersion.cachePrefix(version) - local marker = CacheFs.read(MARKER_PATH) - CacheFs.prefix = saved - return marker == markerFor(version) and allRequiredFilesExist(version) + return CacheContract.isReady(version, CacheFs) end function RomImporter.syncAndroidShortcuts(activeVersion) @@ -1574,12 +1396,9 @@ function RomImporter.new(onComplete, opts) self.ready[version] = ready -- a marker present but for an older cache generation / different ROM means -- "update required" (re-import) rather than a clean first-run choose - local saved = CacheFs.prefix - CacheFs.prefix = info.cachePrefix - local marker = CacheFs.read(MARKER_PATH) - CacheFs.prefix = saved + local marker = CacheContract.readMarker(version, CacheFs) self.returning[version] = - (not ready) and marker ~= nil and marker ~= markerFor(version) + (not ready) and marker ~= nil and marker ~= CacheContract.markerFor(version) self.romName[version] = "pokemon_" .. info.id .. ((info.id == "yellow" or GameVersion.generation(version) == 2) and ".gbc" or ".gb") @@ -1889,10 +1708,10 @@ function RomImporter:startData(data, displayName) local cleared, clearError = pcall(function() removeTree(prefix .. "data/generated") removeTree(prefix .. "assets/generated") - love.filesystem.remove(prefix .. MARKER_PATH) + love.filesystem.remove(prefix .. CacheContract.MARKER_PATH) CacheFs.removeTree("data/generated") CacheFs.removeTree("assets/generated") - CacheFs.remove(MARKER_PATH) + CacheFs.remove(CacheContract.MARKER_PATH) end) CacheFs.prefix = savedPrefix if not cleared then @@ -1964,7 +1783,7 @@ function RomImporter:_completeImport(version, prefix, displayName) -- appear once every required file is in place. local savedPrefix = CacheFs.prefix CacheFs.prefix = prefix - local ok, writeError = CacheFs.write(MARKER_PATH, markerFor(version)) + local ok, writeError = CacheContract.publish(version, CacheFs) CacheFs.prefix = savedPrefix if not ok then error("could not finish the private cache: " .. tostring(writeError)) diff --git a/tests/engine/rom_cache_contract_test.lua b/tests/engine/rom_cache_contract_test.lua new file mode 100644 index 00000000..f5f5102d --- /dev/null +++ b/tests/engine/rom_cache_contract_test.lua @@ -0,0 +1,176 @@ +-- The cache contract is the shared Lua-side publication boundary. A writer +-- may stage outputs in any order, but readiness is published only after the +-- version-specific required set exists. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +local check = T.check +local eq = T.eq +local CacheContract = require("src.import.CacheContract") + +local fs = { prefix = "initial/", files = {} } +local writes = {} +function fs.exists(path) + return fs.files[fs.prefix .. path] ~= nil +end +function fs.read(path) + return fs.files[fs.prefix .. path] +end +function fs.write(path, value) + writes[#writes + 1] = fs.prefix .. path + fs.files[fs.prefix .. path] = value + return true +end +function fs.remove(path) + fs.files[fs.prefix .. path] = nil +end + +local required, isOverride = CacheContract.requiredFilesFor("red") +check(not isOverride, "Red uses the shared required-file list") +check(#required > 0, "Red has required outputs") +eq(CacheContract.markerFor("red"), + CacheContract.FORMAT .. "ea9bcae617fdf159b045185467ae58b2e4a48b9a", + "marker contains format and Red SHA-1") + +for index = 1, #required - 1 do + fs.files["red/" .. required[index]] = true +end +local complete, missing = CacheContract.allRequiredFilesExist("red", fs) +check(not complete, "missing output keeps cache incomplete") +eq(missing, required[#required], "missing output is reported") +local published, publishError = CacheContract.publish("red", fs) +check(not published, "incomplete cache is not published") +check(publishError ~= nil, "incomplete publication explains the missing output") +check(fs.files["red/" .. CacheContract.MARKER_PATH] == nil, + "incomplete cache has no completion marker") + +-- Publication must remove a stale marker left by an interrupted replacement, +-- and must restore the caller prefix on both the success and failure paths. +fs.files["red/" .. CacheContract.MARKER_PATH] = "old-marker" +local removedMarker = CacheContract.publish("red", fs) +check(not removedMarker, "incomplete retry is still rejected") +check(fs.files["red/" .. CacheContract.MARKER_PATH] == nil, + "incomplete retry removes a stale completion marker") +eq(fs.prefix, "initial/", "incomplete publication restores the caller prefix") + +fs.files["red/" .. required[#required]] = true +fs.prefix = "caller/prefix/" +fs.files["red/" .. required[#required]] = true +for _, path in ipairs(required) do fs.files["red/" .. path] = true end +published, publishError = CacheContract.publish("red", fs) +check(published, "complete cache is published") +eq(publishError, nil, "complete publication has no error") +eq(fs.prefix, "caller/prefix/", "publication restores the caller prefix") +eq(fs.files["red/" .. CacheContract.MARKER_PATH], CacheContract.markerFor("red"), + "marker is written under the version prefix") +local marker = CacheContract.readMarker("red", fs) +eq(marker, CacheContract.markerFor("red"), "marker reads through the version prefix") +eq(writes[#writes], "red/" .. CacheContract.MARKER_PATH, + "the marker is the only publication write and comes last") + +-- Every supported version gets its own marker and complete cache semantics; +-- Yellow adds its three outputs, while Gold/Silver replace the Gen 1 set. +for _, version in ipairs({ "red", "blue", "yellow", "gold", "silver" }) do + local versionFiles, override = CacheContract.requiredFilesFor(version) + for _, path in ipairs(versionFiles) do + fs.files[version .. "/" .. path] = true + end + if not override then + for _, path in ipairs(CacheContract.VERSION_REQUIRED_FILES[version] or {}) do + fs.files[version .. "/" .. path] = true + end + end + local ready, missing = CacheContract.allRequiredFilesExist(version, fs) + check(ready, version .. " complete cache is ready (" .. tostring(missing) .. ")") + local didPublish = CacheContract.publish(version, fs) + check(didPublish, version .. " complete cache publishes") + eq(fs.files[version .. "/" .. CacheContract.MARKER_PATH], + CacheContract.markerFor(version), version .. " marker is version-scoped") + eq(fs.prefix, "caller/prefix/", version .. " publication restores prefix") + check(CacheContract.isReady(version, fs), version .. " complete cache is ready") +end + +local gold, goldOverride = CacheContract.requiredFilesFor("gold") +check(goldOverride, "Gold uses a version-specific required set") +local goldSet = {} +for _, path in ipairs(gold) do goldSet[path] = true end +check(goldSet["assets/generated/battle/hud/balls.png"], + "Gold required set includes trainer HUD art") +check(not goldSet["assets/generated/trade/game_boy.png"], + "Gold required set excludes Gen 1 trade art") +check(goldSet["data/generated/rom_text.lua"], + "Gold required set includes the Gen 2 engine text table") +local silver = CacheContract.requiredFilesFor("silver") +local silverSet = {} +for _, path in ipairs(silver) do silverSet[path] = true end +check(silverSet["data/generated/rom_text.lua"], + "Silver required set includes the Gen 2 engine text table") +check(not silverSet["assets/generated/trade/game_boy.png"], + "Silver required set excludes Gen 1 trade art") +check(CacheContract.VERSION_REQUIRED_FILES.yellow ~= nil, + "Yellow has version-specific required outputs") + +-- A throwing adapter must not strand the process in its temporary prefix. +local throwingFs = { prefix = "before/" } +function throwingFs.exists() error("probe failed") end +local probed, probeError = CacheContract.allRequiredFilesExist("blue", throwingFs) +check(not probed and probeError ~= nil, "filesystem probe errors are returned") +eq(throwingFs.prefix, "before/", "probe errors restore the caller prefix") +function throwingFs.write() error("write failed") end +function throwingFs.remove() end +for _, path in ipairs(CacheContract.REQUIRED_FILES) do + throwingFs.files = throwingFs.files or {} + throwingFs.files["blue/" .. path] = true +end +function throwingFs.exists(path) + return throwingFs.files[throwingFs.prefix .. path] ~= nil +end +local wrote = CacheContract.publish("blue", throwingFs) +check(not wrote, "write errors are returned") +eq(throwingFs.prefix, "before/", "write errors restore the caller prefix") + +-- Source-tree readiness must use the same version lists and reject a cache +-- when LÖVE cannot identify a real source directory. +local oldLove = love +love = nil +check(not CacheContract.sourceTreeHasData("red"), + "source-tree check is safe without LÖVE") +local sourceFiles = {} +love = { + filesystem = { + getRealDirectory = function(path) return sourceFiles[path] end, + getSource = function() return "/source" end, + getInfo = function(path) + return sourceFiles[path] and { type = "file" } or nil + end, + }, +} +for _, path in ipairs(CacheContract.REQUIRED_FILES) do sourceFiles[path] = "/source" end +check(CacheContract.sourceTreeHasData("red"), + "Red source tree uses the shared required set") +sourceFiles[CacheContract.REQUIRED_FILES[2]] = "/save" +check(not CacheContract.sourceTreeHasData("red"), + "source-tree readiness rejects a cache-overlaid required file") +sourceFiles = {} +local goldFiles = CacheContract.requiredFilesFor("gold") +for _, path in ipairs(goldFiles) do sourceFiles["gold/" .. path] = "/source" end +check(CacheContract.sourceTreeHasData("gold"), + "Gold source tree uses its override set") +love = oldLove + +-- Both importer completion paths must call the shared publication boundary. +local importerFile = assert(io.open("src/import/RomImporter.lua", "r")) +local importerSource = importerFile:read("*a") +importerFile:close() +local completionCalls = 0 +for _ in importerSource:gmatch("CacheContract%.publish%(%s*version") do + completionCalls = completionCalls + 1 +end +eq(completionCalls, 1, + "both thread and coroutine paths converge on one publishing helper") +check(importerSource:find("self:_completeImport%(version, prefix, displayName%)") + ~= nil, "coroutine completion uses the shared helper") +check(importerSource:find("pcall%(self%._completeImport") ~= nil, + "thread completion uses the shared helper") + +T.finish("rom cache contract") diff --git a/tests/engine/rom_importer_source_tree_test.lua b/tests/engine/rom_importer_source_tree_test.lua index 508ba043..4ac595cb 100644 --- a/tests/engine/rom_importer_source_tree_test.lua +++ b/tests/engine/rom_importer_source_tree_test.lua @@ -1,32 +1,34 @@ --- sourceTreeHasData must use each version's required-file list. Gold's --- cache has no Gen 1 trade art / pikachu.png; validating it against --- REQUIRED_FILES made a Gold source tree look incomplete forever. +-- sourceTreeHasData must use the engine-owned cache contract. Gold's cache has +-- no Gen 1 trade art; validating it against the Gen 1 list made a Gold source +-- tree look incomplete forever. package.path = "./?.lua;./?/init.lua;" .. package.path local T = require("tests.harness") local check = T.check +local CacheContract = require("src.import.CacheContract") local f = assert(io.open("src/import/RomImporter.lua", "r")) local src = f:read("*a") f:close() -local start = src:find("local function sourceTreeHasData", 1, true) -check(start ~= nil, "sourceTreeHasData is defined") -local finish = src:find("\nfunction RomImporter.isReady", start, true) -check(finish ~= nil, "sourceTreeHasData ends before isReady") -local body = src:sub(start, finish) +local readyStart = src:find("function RomImporter.isReady", 1, true) +check(readyStart ~= nil, "isReady is defined") +local readyEnd = src:find("\nfunction RomImporter.syncAndroidShortcuts", readyStart, true) +check(readyEnd ~= nil, "isReady ends before the next importer helper") +local readyBody = src:sub(readyStart, readyEnd) -check(body:find("requiredFilesFor", 1, true) ~= nil, - "sourceTreeHasData uses requiredFilesFor (Gold override, not Gen 1 only)") -check(body:find("ipairs(REQUIRED_FILES)", 1, true) == nil, - "sourceTreeHasData does not iterate the Gen 1 REQUIRED_FILES list raw") +check(readyBody:find("CacheContract.isReady", 1, true) ~= nil, + "isReady delegates source-tree and cache readiness to the contract") +check(readyBody:find("ipairs(REQUIRED_FILES)", 1, true) == nil, + "isReady does not iterate the Gen 1 REQUIRED_FILES list raw") -local helperStart = src:find("local function requiredFilesFor", 1, true) -check(helperStart ~= nil, "requiredFilesFor helper exists") -local helper = src:sub(helperStart, start) -check(helper:find("VERSION_REQUIRED_FILES_OVERRIDE", 1, true) ~= nil, - "requiredFilesFor consults VERSION_REQUIRED_FILES_OVERRIDE") -check(src:find('"assets/generated/battle/hud/balls.png"', 1, true) ~= nil, +local required, isOverride = CacheContract.requiredFilesFor("gold") +check(isOverride, "Gold uses the override required-file list") +local requiredSet = {} +for _, path in ipairs(required) do requiredSet[path] = true end +check(requiredSet["assets/generated/battle/hud/balls.png"], "Gold caches require the trainer HUD ball sheet") +check(not requiredSet["assets/generated/trade/game_boy.png"], + "Gold does not inherit the Gen 1 trade-art requirement") T.finish() diff --git a/tests/engine/trade_art_import.lua b/tests/engine/trade_art_import.lua index 71736adf..28cbed6f 100644 --- a/tests/engine/trade_art_import.lua +++ b/tests/engine/trade_art_import.lua @@ -84,15 +84,15 @@ if extractor then end -- a cache imported before #750 has none of the art; listing one of the --- files in REQUIRED_FILES is what makes it re-import -local importer = readFile("src/import/RomImporter.lua") -T.check(importer ~= nil, "src/import/RomImporter.lua is readable") -if importer then - local required = importer:match("local REQUIRED_FILES = {(.-)\n}") - T.check(required ~= nil, "REQUIRED_FILES parses") +-- files in the engine-owned cache contract is what makes it re-import +local contract = readFile("src/import/CacheContract.lua") +T.check(contract ~= nil, "src/import/CacheContract.lua is readable") +if contract then + local required = contract:match("CacheContract.REQUIRED_FILES = {(.-)\n}") + T.check(required ~= nil, "CacheContract.REQUIRED_FILES parses") T.check(required ~= nil and required:find( '"assets/generated/trade/game_boy.png"', 1, true) ~= nil, - "REQUIRED_FILES makes pre-#750 caches re-import the trade art") + "cache contract makes pre-#750 caches re-import the trade art") end T.finish("trade art import") From cb504e53284a6fdc078327383a5a7ae89af17484 Mon Sep 17 00:00:00 2001 From: Caorthann <274241274+caorthann-celt@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:36:15 +0100 Subject: [PATCH 09/33] =?UTF-8?q?Update=20UWP=20L=C3=96VE=20backend=20for?= =?UTF-8?q?=20HTTP=20requests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ports/uwp/third_party/love/README.md | 2 +- ports/uwp/third_party/love/bin/love.dll | Bin 3470336 -> 3487744 bytes ports/uwp/third_party/love/lib/lovestatic.lib | Bin 15660 -> 15668 bytes ports/uwp/third_party/manifest.json | 6 +++--- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ports/uwp/third_party/love/README.md b/ports/uwp/third_party/love/README.md index cca8b2fa..2d0ea9d5 100644 --- a/ports/uwp/third_party/love/README.md +++ b/ports/uwp/third_party/love/README.md @@ -1,6 +1,6 @@ # LÖVE UWP binaries -These x64 UWP Release binaries were built from [`caorthann-celt/love-xbox-uwp`](https://github.com/caorthann-celt/love-xbox-uwp) at commit `cdf85f28ed794c95d6f5f7e3a8f23ca9ee1fbdcb`. +These x64 UWP Release binaries were built from [`caorthann-celt/love-xbox-uwp`](https://github.com/caorthann-celt/love-xbox-uwp) at commit `3f51bf0be5f3f86e5934da3893caba2b817f82c1`. The build uses LÖVE 11.5, LuaJIT, SDL2, and ANGLE. Keep the DLLs and import libraries together; they are one binary interface. diff --git a/ports/uwp/third_party/love/bin/love.dll b/ports/uwp/third_party/love/bin/love.dll index 306fc5c504b82b11c2c8f648e5d68ef23540039b..aff9cd5c99c65e796823dedbe2c49ac102434668 100644 GIT binary patch delta 910899 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

|LhFfUO6K;0q4mTJFQs7)eCsEgJC1b0 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%0AoiQ`c~ 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 XtG*++<0n^N^D6iM_a!v@+~WTS8`uJH delta 896925 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

ZUB+GES?1QM$BT4%}1p5x=4Xn4d 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�+WF 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 z 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 delta 582 zcmY+=O=uHA7zW^(B-3m**`%iR&?b?Pso9D@WJ%nrD2NI|J*Wju4=epK5vqwgq>>dBL!f`=A=4+TLCf(qJ`ieDBjIER<#d*@qN=3%u~y%zCq z?Ac_bGwJEX6Zb#YKfAF!V8WYCIV##zVq8woC z12&WHg&8Ygh;+JxvGcf0xDbh-zmxn}2j6TxpaDH>EPVV0KKqs<>(49FIf zv?GeDKOqK*qcAktGD(_>qBD>XbHr!OQZz_QxU22q?T7^>zG~gr9`x`o6oWe7;N;f7 zHy+-L$3flI7sCrBA?OKM7FtMmjWmlSFXB*0=jG+?v$#+5Ma+kEF&|^>J$S3+AM2}I z+g#!XeLa9};b_ Date: Sat, 22 Aug 2026 21:36:37 +0100 Subject: [PATCH 10/33] Add controller support to Skin Studio --- main.lua | 14 ++++---- src/ui/SkinStudio.lua | 84 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 11 deletions(-) diff --git a/main.lua b/main.lua index 7b6fba4c..e3a8bc57 100644 --- a/main.lua +++ b/main.lua @@ -722,7 +722,7 @@ function love.gamepadpressed(joystick, button) end return end - if Studio then return end + if Studio then return Studio.gamepadpressed(joystick, button) end if Importer then return Importer:gamepadpressed(joystick, button) end if not Game then return end Game:gamepadpressed(joystick, button) @@ -742,7 +742,7 @@ function love.gamepadreleased(joystick, button) end return end - if Studio then return end + if Studio then return Studio.gamepadreleased(joystick, button) end if Importer then return Importer:gamepadreleased(joystick, button) end if not Game then return end Game:gamepadreleased(joystick, button) @@ -762,7 +762,7 @@ function love.gamepadaxis(joystick, axis, value) end return end - if Studio then return end + if Studio then return Studio.gamepadaxis(joystick, axis, value) end if Importer then return Importer:gamepadaxis(joystick, axis, value) end if not Game then return end Game:gamepadaxis(joystick, axis, value) @@ -782,7 +782,7 @@ function love.joystickpressed(joystick, button) end return end - if Studio then return end + if Studio then return Studio.joystickpressed(joystick, button) end if Importer then return Importer:joystickpressed(joystick, button) end if not Game then return end Game:joystickpressed(joystick, button) @@ -802,7 +802,7 @@ function love.joystickreleased(joystick, button) end return end - if Studio then return end + if Studio then return Studio.joystickreleased(joystick, button) end if Importer then return Importer:joystickreleased(joystick, button) end if not Game then return end Game:joystickreleased(joystick, button) @@ -822,7 +822,7 @@ function love.joystickaxis(joystick, axis, value) end return end - if Studio then return end + if Studio then return Studio.joystickaxis(joystick, axis, value) end if Importer then return Importer:joystickaxis(joystick, axis, value) end if not Game then return end Game:joystickaxis(joystick, axis, value) @@ -842,7 +842,7 @@ function love.joystickhat(joystick, hat, direction) end return end - if Studio then return end + if Studio then return Studio.joystickhat(joystick, hat, direction) end if Importer then return Importer:joystickhat(joystick, hat, direction) end if not Game then return end Game:joystickhat(joystick, hat, direction) diff --git a/src/ui/SkinStudio.lua b/src/ui/SkinStudio.lua index b27aa26e..d7a111d8 100644 --- a/src/ui/SkinStudio.lua +++ b/src/ui/SkinStudio.lua @@ -6,6 +6,8 @@ local TouchControls = require("src.core.TouchControls") local SaveData = require("src.core.SaveData") local FilePicker = require("src.core.FilePicker") local SafeArea = require("src.core.SafeArea") +local GamepadMap = require("src.core.GamepadMap") +local PadCursor = require("src.ui.PadCursor") local Studio = {} @@ -501,6 +503,7 @@ function Studio.load(opts) Studio.thumbs = {} Studio.pointerX, Studio.pointerY = nil, nil Studio.pointerDown, Studio.touchId = false, nil + PadCursor.reset() -- Studio always opens on the library. Creating and choosing a skin are -- first-class tasks, not controls buried inside the editor workspace. Studio.mode = "library" @@ -758,6 +761,7 @@ function Studio.unload() Studio.undoStack, Studio.redoStack = {}, {} Studio.pointerX, Studio.pointerY = nil, nil Studio.pointerDown, Studio.touchId = false, nil + PadCursor.reset() end -- The Studio is a real touch editor on Android and iOS. Keeping this here, @@ -2678,7 +2682,12 @@ function Studio.draw() local f = Studio._frame Kit.layout(f.w, f.h) local mx, my = love.mouse.getPosition() - if Studio.pointerX ~= nil then mx, my = Studio.pointerX, Studio.pointerY end + local px, py, padActive = PadCursor.pointer() + if padActive then + mx, my = px, py + elseif Studio.pointerX ~= nil then + mx, my = Studio.pointerX, Studio.pointerY + end Kit.beginFrame(mx, my, Studio.clicked, Studio.wheel) Studio.clicked, Studio.wheel = false, 0 Theme.fill(0, 0, W, H, PAL.bg, 1) @@ -2691,19 +2700,26 @@ function Studio.draw() Kit.blockClicks = false Studio.drawOverlay(f.w, f.h) Kit.endFrame() + PadCursor.draw() end -- ---------------------------------------------------------------- input -function Studio.update() +function Studio.update(dt) + PadCursor.update(dt or 0) + local x, y, active = PadCursor.pointer() + if active and Studio.pointerDown then Studio.mousemoved(x, y) end + local wheel = PadCursor.takeWheel() + if wheel ~= 0 then Studio.wheelmoved(0, wheel) end if not Studio.pendingPlay then return end Studio.pendingPlay = false local onPlay, version, canvas = Studio.onPlay, Studio.version, Studio.canvas() if onPlay then onPlay(version, canvas) end end -function Studio.mousepressed(x, y, button) +function Studio.mousepressed(x, y, button, fromPad) if button ~= 1 then return end + if not fromPad then PadCursor.yieldToPointer() end Studio.pointerX, Studio.pointerY = x, y Studio.pointerDown = true Studio.clicked = true @@ -2760,6 +2776,65 @@ function Studio.touchpressed(id, x, y) return Studio.mousepressed(x, y, 1) end +local function closeFromPad() + if Studio.confirm then + Studio.confirmNo() + elseif Studio.modal then + Studio.closeModal() + elseif Studio.mode == "editor" then + Studio.backToLibrary() + elseif Studio.onClose then + Studio.onClose() + end +end + +local function handlePadAction(action) + if action == "a" then + local x, y = PadCursor.pointer() + Studio.mousepressed(x, y, 1, true) + elseif action == "b" then + closeFromPad() + end +end + +function Studio.gamepadpressed(joystick, button) + handlePadAction(PadCursor.gamepadpressed(joystick, button)) +end + +function Studio.gamepadreleased(joystick, button) + PadCursor.gamepadreleased(joystick, button) + if GamepadMap.mapGamepadButton(button) == "a" then + local x, y = PadCursor.pointer() + Studio.mousereleased(x, y, 1) + end +end + +function Studio.gamepadaxis(joystick, axis, value) + PadCursor.gamepadaxis(joystick, axis, value) +end + +function Studio.joystickpressed(joystick, button) + handlePadAction(PadCursor.joystickpressed(joystick, button)) +end + +function Studio.joystickreleased(joystick, button) + PadCursor.joystickreleased(joystick, button) + if GamepadMap.ignoreRawForJoystick(joystick) then return end + local padButton = GamepadMap.mapRawToGamepadButton(button) + if padButton and GamepadMap.mapGamepadButton(padButton) == "a" then + local x, y = PadCursor.pointer() + Studio.mousereleased(x, y, 1) + end +end + +function Studio.joystickaxis(joystick, axis, value) + PadCursor.joystickaxis(joystick, axis, value) +end + +function Studio.joystickhat(joystick, hat, direction) + PadCursor.joystickhat(joystick, hat, direction) +end + function Studio.touchmoved(id, x, y) if Studio.touchId ~= id then return end return Studio.mousemoved(x, y) @@ -2774,7 +2849,8 @@ end function Studio.wheelmoved(_, dy) if Studio.mode == "editor" and not Studio.modalUp() and dy and dy ~= 0 then local work = Studio.canvasWorkspace - local mx, my = Studio.pointerX, Studio.pointerY + local mx, my, active = PadCursor.pointer() + if not active then mx, my = Studio.pointerX, Studio.pointerY end if (not mx or not my) and love and love.mouse and love.mouse.getPosition then mx, my = love.mouse.getPosition() end From 0147e3d87b28807a809f834ee53f7ec1a787449b Mon Sep 17 00:00:00 2001 From: Bo Layer Date: Sun, 23 Aug 2026 03:17:27 -0600 Subject: [PATCH 11/33] feat(mod-api): add composable map occupancy seam --- data/scripts/story3.lua | 33 ++++- docs/modding.md | 50 +++++++ .../0013-map-occupancy-and-active-block.md | 131 ++++++++++++++++++ src/world/WorldAPI.lua | 30 ++++ 4 files changed, 237 insertions(+), 7 deletions(-) create mode 100644 docs/rfcs/0013-map-occupancy-and-active-block.md diff --git a/data/scripts/story3.lua b/data/scripts/story3.lua index d2d4dbd5..787b0d99 100644 --- a/data/scripts/story3.lua +++ b/data/scripts/story3.lua @@ -2,6 +2,8 @@ -- ghost, elevators, the Game Corner coins/prizes, the SS Anne departure -- and the Hall of Fame record. Each cites its pokered source. +local Runtime = require("src.mods.Runtime") + local M = {} -- ------------------------------------------------------------------- @@ -909,17 +911,34 @@ M.VERMILION_DOCK = { local f = game.save.flags if Flags.get(game.save, "EVENT_SS_ANNE_LEFT") then -- the ship is long gone: erase her right away, and anyone who - -- still lands here is sent back out past the guard + -- still lands here is sent back out past the guard unless a mod + -- explicitly permits this occupied map state. This hook surrounds + -- only the ejection decision; the map's complete onEnter chain has + -- already run and the departed ship remains erased. for _, b in ipairs(DOCK_SHIP_BLOCKS) do ow.map:setBlock(b.bx, b.by, b.water) end ow.map.renderer:rebuild() - local TextBox = require("src.render.TextBox") - game.stack:push(TextBox.new(game, - game.data.text._VermilionCitySailor1ShipSetSailText - or "The ship set sail.", function() - ow:startWarpTo("VERMILION_CITY", 18, 29, "up") - end)) + local occupancyAllowed = false + if Runtime.wantsHook("map.occupancy_allowed") then + local player = ow.player or {} + occupancyAllowed = Runtime.call("map.occupancy_allowed", + function() return false end, game, { + mapId = "VERMILION_DOCK", + reason = "ss_anne_departed", + gameVersion = game.save and game.save.version, + x = player.cellX, + y = player.cellY, + }) == true + end + if not occupancyAllowed then + local TextBox = require("src.render.TextBox") + game.stack:push(TextBox.new(game, + game.data.text._VermilionCitySailor1ShipSetSailText + or "The ship set sail.", function() + ow:startWarpTo("VERMILION_CITY", 18, 29, "up") + end)) + end elseif f.EVENT_GOT_HM01 and ow.player.cellY == 2 then -- VermilionDockSSAnneLeavesScript: only stepping OFF the ship -- triggers the departure (wDestinationWarpID == 1 in pokered) -- diff --git a/docs/modding.md b/docs/modding.md index 7c724404..73c8d853 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -228,6 +228,56 @@ optional visual `tileRows` at 2x resolution, and optional `tileDetailRows` at read-only snapshots; mods choose which layers to render. Red and Gold expose the same contract while applying their own object and event visibility rules. +### Active Gen 1 block checks + +Red, Blue, and Yellow expose +`mod.world:activeBlockAt(mapId, blockX, blockY)`. It returns the numeric block +ID at one zero-based block coordinate only when `mapId` is the active map. +The value is a scalar snapshot: changing it cannot change the map. This lets a +mod compare a small runtime map signature before it applies a lawful authored +replacement, without reading the mutable map or ROM cache through engine +internals. + +The method fails closed. Before an overworld exists it returns +`nil, "no overworld"`; for a different active map it returns +`nil, "map is not active"`; non-numeric, non-finite, or fractional coordinates +return `nil, "invalid block coordinates"`; and negative or out-of-range +coordinates return `nil, "block coordinates out of bounds"`. An unavailable +or malformed active block returns `nil, "block unavailable"`. The caller must +require every expected cell to match before changing presentation. This method +is Gen 1-only; Gold callers receive no parity promise for it. + +### Conditional map occupancy + +`map.occupancy_allowed` is a narrow Gen 1 hook around a map script's vanilla +decision to eject the player from an otherwise valid loaded map. Its first +call site is the post-departure `VERMILION_DOCK` branch. The ship has already +been erased when the hook runs, and the hook does not replace or suppress any +base or peer map handler. + +The wrapper receives `(next, game, context)`. The dock context is a copied +`{ mapId = "VERMILION_DOCK", reason = "ss_anne_departed", gameVersion, x, y }` +record. Vanilla returns `false`. Return exactly `true` to allow the player to +remain; every other value denies occupancy and preserves the normal message +and warp. A composable wrapper calls downstream first and only adds its own +permission: + +```lua +mod.hooks:wrap("map.occupancy_allowed", function(next, game, ctx) + local allowed = next(game, ctx) + local mine = ctx.mapId == "VERMILION_DOCK" + and ctx.reason == "ss_anne_departed" + and myPublicEligibilityCheck(game) + return allowed == true or mine == true +end) +``` + +With no wrapper, the hook allocates no context and vanilla behavior is byte-for- +byte unchanged. A throwing wrapper is isolated by the normal hook bus. A nil, +string, number, table, or other malformed final answer fails closed. Disabling +or uninstalling the permitting mod therefore restores vanilla ejection without +changing the S.S. Anne story flag or restoring the ship. + ## Party ordering Companion UIs and alternate party screens can call diff --git a/docs/rfcs/0013-map-occupancy-and-active-block.md b/docs/rfcs/0013-map-occupancy-and-active-block.md new file mode 100644 index 00000000..1066ddc3 --- /dev/null +++ b/docs/rfcs/0013-map-occupancy-and-active-block.md @@ -0,0 +1,131 @@ +# RFC 0013: Conditional map occupancy and active-block reads + +## Status + +Proposed. + +## Motivation + +The Gen 1 Vermilion Dock script correctly ejects a player who enters after the +S.S. Anne has departed. A content mod can add a city-side route back to that +empty harbor, but it cannot preserve the dock visit: replacing the complete +dock handler would discard vanilla behavior and peer handlers, while an added +handler cannot cancel the base handler's ejection. + +A mod that changes one active map block also needs to prove that it is looking +at the expected Red, Blue, or Yellow layout before it acts. `mapOverview()` is +intentionally presentation-oriented and does not expose block identity. +Requiring internal `Map` state or generated ROM data would cross the public mod +boundary and make a wrong-version edit difficult to fail closed. + +## Decision and plan extended + +This extends Route B in `CONTRIBUTING-mods.md`: new behavior is additive, +ordinary hook composition remains the authority, an empty hook chain is a +provable no-op, and mods receive copied or scalar data rather than mutable +engine state. It supports the approved Mew-under-the-truck implementation plan +without adding any Mew-specific rule, asset, flag, or content to the engine. + +## Exact API delta + +### `map.occupancy_allowed` + +The post-departure `VERMILION_DOCK` script calls this hook after it replaces the +ship blocks with water and immediately before it would display the departure +message and warp the player to Vermilion City. + +A wrapper has this shape: + +```lua +function(next, game, context) -> boolean +``` + +The context is a new table with these fields: + +| Field | Meaning | +|---|---| +| `mapId` | `"VERMILION_DOCK"` at this call site | +| `reason` | Stable reason key `"ss_anne_departed"` | +| `gameVersion` | Active save version (`red`, `blue`, or `yellow`) when present | +| `x`, `y` | Current player cell coordinates when present | + +Vanilla returns `false`. The player remains only when the final chain result is +exactly `true`. Absent, throwing, or malformed wrappers therefore preserve +ejection. A wrapper composes by calling `next(game, context)` and returning +true when either downstream or its own narrow rule permits occupancy. The hook +does not replace `MapScripts` registration, merging, or dispatch, and does not +change the departure flag or reconstruct the ship. + +The call is guarded by `Runtime.wantsHook`, so an empty chain allocates no +context and follows the prior branch exactly. + +### `WorldAPI:activeBlockAt` + +Gen 1's public `mod.world` facade adds: + +```lua +activeBlockAt(mapId, blockX, blockY) -> blockId + | nil, reason +``` + +`mapId` must equal the active map ID. Coordinates are finite, integral, +zero-based block coordinates. A successful result is a numeric scalar copied +from the active runtime map. The method never returns the map's mutable block +array and never writes game or save state. + +Failure reasons are stable: + +| Condition | Reason | +|---|---| +| No active overworld map | `no overworld` | +| `mapId` differs from the active map | `map is not active` | +| Coordinate has the wrong type, is non-finite, or is fractional | `invalid block coordinates` | +| Coordinate is negative or outside the active map | `block coordinates out of bounds` | +| Active block data is absent or malformed | `block unavailable` | + +Requiring the expected map ID and rejecting all ambiguous input lets a mod +compare every cell in its version-specific signature before it calls an +existing mutation API. Red, Blue, and Yellow each use their own loaded map +data. Gold does not gain this method in this RFC. + +## Migration and compatibility + +Existing mods change nothing. No hook, event, registry, manifest field, save +field, map handler, or WorldAPI method is removed or renamed. With no hook +subscriber the departed-dock behavior is unchanged. Existing callers cannot +invoke the new WorldAPI method accidentally. + +The occupancy answer is not persisted by the engine. Disabling or uninstalling +a mod removes its wrapper through normal owner cleanup, so a later dock entry +uses vanilla ejection. The engine writes no new save state and neither API +returns or serializes ROM or save data. + +## Verification requirements + +The parity gate must prove: + +- vanilla departed-dock message and warp remain with no subscriber; +- one permission wrapper can allow occupancy without removing the ship-erasure + work or any map handler; +- multiple cooperative wrappers preserve downstream permission; +- absent, throwing, nil, false, and malformed hook answers fail closed; +- Red, Blue, and Yellow contexts keep their version identity separate; +- disabling or removing the owner restores vanilla behavior without a save + migration; +- `activeBlockAt` accepts only the active map and valid in-range integral + coordinates, returns a scalar, and never mutates map or save state; and +- the test fixtures and resulting changes contain no ROM or save payload. + +The hook must be driven through a real public `hooks:wrap` chain. The block API +must be exercised through a public `WorldAPI` instance. Tests must not replace +the production map handler with a test-only implementation. + +## Docs with the change + +`docs/modding.md` documents both contracts, their failure behavior, the +cooperative wrapper pattern, and the Gen 1-only block method. No registry or +schema changes occur, so generated registry documentation is unchanged. + +## Deprecation etiquette + +Nothing is removed, superseded, or deprecated. diff --git a/src/world/WorldAPI.lua b/src/world/WorldAPI.lua index 69b9eea2..a7abd4f3 100644 --- a/src/world/WorldAPI.lua +++ b/src/world/WorldAPI.lua @@ -117,6 +117,36 @@ function WorldAPI:current() facing = p and p.facing } end +local function validBlockCoordinate(value) + return type(value) == "number" and value == value + and value ~= math.huge and value ~= -math.huge + and value == math.floor(value) +end + +-- Read one block from the active Gen 1 map without exposing the mutable block +-- array. Requiring the expected map id makes a stale signature fail closed +-- if a warp or reload moved the player before the caller completed its check. +-- Block coordinates are zero-based, matching replaceBlock. +function WorldAPI:activeBlockAt(mapId, bx, by) + local ow = self:overworld() + if not ow or not ow.map then return nil, NO_OVERWORLD end + local map = ow.map + if map.id ~= mapId then return nil, "map is not active" end + if not validBlockCoordinate(bx) or not validBlockCoordinate(by) then + return nil, "invalid block coordinates" + end + local def = map.def + if not def or type(def.width) ~= "number" or type(def.height) ~= "number" + or bx < 0 or by < 0 or bx >= def.width or by >= def.height then + return nil, "block coordinates out of bounds" + end + local blockId = map:blockAt(bx, by) + if not validBlockCoordinate(blockId) or blockId < 0 then + return nil, "block unavailable" + end + return blockId +end + -- Companion UIs may offer party ordering while the player is in free roam. -- The same guard that makes opening a menu safe keeps scripts, transitions, -- movement and screens above the overworld from observing a mid-action swap. From c9221daa90d7fba96b4ba4a6443e4910499cc130 Mon Sep 17 00:00:00 2001 From: Bo Layer Date: Sun, 23 Aug 2026 03:18:17 -0600 Subject: [PATCH 12/33] fix(mod-api): fail closed on malformed map blocks --- docs/modding.md | 11 +++++++++-- docs/rfcs/0013-map-occupancy-and-active-block.md | 9 ++++++++- src/world/WorldAPI.lua | 14 ++++++++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/modding.md b/docs/modding.md index 73c8d853..8687c7a2 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -272,12 +272,19 @@ mod.hooks:wrap("map.occupancy_allowed", function(next, game, ctx) end) ``` -With no wrapper, the hook allocates no context and vanilla behavior is byte-for- -byte unchanged. A throwing wrapper is isolated by the normal hook bus. A nil, +With no wrapper, the hook allocates no context and vanilla behavior is +unchanged. A throwing wrapper is isolated by the normal hook bus. A nil, string, number, table, or other malformed final answer fails closed. Disabling or uninstalling the permitting mod therefore restores vanilla ejection without changing the S.S. Anne story flag or restoring the ship. +Normal hook-chain ownership applies: a wrapper that does not call `next` +intentionally owns the final answer and does not run lower-priority wrappers. +Permission wrappers must call `next` as shown above to compose. A noncompliant +wrapper that returns false without calling `next` safely denies occupancy and +can suppress downstream permission by this standard rule. A malformed answer +also fails closed and cannot force occupancy. + ## Party ordering Companion UIs and alternate party screens can call diff --git a/docs/rfcs/0013-map-occupancy-and-active-block.md b/docs/rfcs/0013-map-occupancy-and-active-block.md index 1066ddc3..cfb796db 100644 --- a/docs/rfcs/0013-map-occupancy-and-active-block.md +++ b/docs/rfcs/0013-map-occupancy-and-active-block.md @@ -56,6 +56,12 @@ true when either downstream or its own narrow rule permits occupancy. The hook does not replace `MapScripts` registration, merging, or dispatch, and does not change the departure flag or reconstruct the ship. +As with every wrapper hook, a callback that does not call `next` intentionally +owns the final answer and does not run lower-priority callbacks. Permission +wrappers must call downstream to compose. A false, non-forwarding wrapper +safely denies occupancy and can suppress downstream permission by this normal +rule. A malformed final result also fails closed and cannot permit occupancy. + The call is guarded by `Runtime.wantsHook`, so an empty chain allocates no context and follows the prior branch exactly. @@ -108,7 +114,8 @@ The parity gate must prove: - one permission wrapper can allow occupancy without removing the ship-erasure work or any map handler; - multiple cooperative wrappers preserve downstream permission; -- absent, throwing, nil, false, and malformed hook answers fail closed; +- absent, throwing, nil, false, malformed, and non-forwarding hook answers fail + closed according to the normal wrapper-chain rule; - Red, Blue, and Yellow contexts keep their version identity separate; - disabling or removing the owner restores vanilla behavior without a save migration; diff --git a/src/world/WorldAPI.lua b/src/world/WorldAPI.lua index a7abd4f3..e204d635 100644 --- a/src/world/WorldAPI.lua +++ b/src/world/WorldAPI.lua @@ -136,12 +136,18 @@ function WorldAPI:activeBlockAt(mapId, bx, by) return nil, "invalid block coordinates" end local def = map.def - if not def or type(def.width) ~= "number" or type(def.height) ~= "number" - or bx < 0 or by < 0 or bx >= def.width or by >= def.height then + if not def or not validBlockCoordinate(def.width) or def.width <= 0 + or not validBlockCoordinate(def.height) or def.height <= 0 then + return nil, "block unavailable" + end + if bx < 0 or by < 0 or bx >= def.width or by >= def.height then return nil, "block coordinates out of bounds" end - local blockId = map:blockAt(bx, by) - if not validBlockCoordinate(blockId) or blockId < 0 then + if type(def.blocks) ~= "table" or type(map.blockAt) ~= "function" then + return nil, "block unavailable" + end + local ok, blockId = pcall(map.blockAt, map, bx, by) + if not ok or not validBlockCoordinate(blockId) or blockId < 0 then return nil, "block unavailable" end return blockId From 3b7fc428585ff4ce2361dfd29e16a25f489b983b Mon Sep 17 00:00:00 2001 From: Bo Layer Date: Sun, 23 Aug 2026 03:20:23 -0600 Subject: [PATCH 13/33] test(mod-api): gate Mew dock seams --- .../engine/mew_dock_private_artifact_gate.lua | 49 ++ tests/engine/mew_dock_seam_contract.lua | 428 ++++++++++++++++++ 2 files changed, 477 insertions(+) create mode 100644 tests/engine/mew_dock_private_artifact_gate.lua create mode 100644 tests/engine/mew_dock_seam_contract.lua diff --git a/tests/engine/mew_dock_private_artifact_gate.lua b/tests/engine/mew_dock_private_artifact_gate.lua new file mode 100644 index 00000000..1402aefd --- /dev/null +++ b/tests/engine/mew_dock_private_artifact_gate.lua @@ -0,0 +1,49 @@ +-- Static privacy gate for the narrow Mew dock engine branch. It checks the +-- Git publication set, not ignored local imports: user ROMs and progress +-- saves may exist on a developer machine but must never become tracked files. + +package.path = "./?.lua;./?/init.lua;" .. package.path +local T = require("tests.harness") + +local pipe = io.popen("git ls-files 2>" .. (package.config:sub(1, 1) == "\\" and "nul" or "/dev/null")) +local paths = {} +if pipe then + for path in pipe:lines() do paths[#paths + 1] = path:gsub("\\", "/") end + pipe:close() +end + +T.check(#paths > 100, + "privacy gate inspects a real Git publication set instead of passing vacuously") + +local forbiddenExtensions = { + gb = true, gbc = true, gba = true, sav = true, srm = true, + rom = true, z64 = true, v64 = true, n64 = true, nds = true, + sfc = true, smc = true, +} +local forbiddenRuntimeRoots = { + ["save.lua"] = true, + ["save_blue.lua"] = true, + ["save_yellow.lua"] = true, + ["save_gold.lua"] = true, + ["options.lua"] = true, +} + +local binaryLeaks, runtimeLeaks = {}, {} +for _, path in ipairs(paths) do + local lower = path:lower() + local ext = lower:match("%.([^./\\]+)$") + if forbiddenExtensions[ext] then binaryLeaks[#binaryLeaks + 1] = path end + if forbiddenRuntimeRoots[lower] + or lower:match("^saves/") + or lower:match("^imports/") + or lower:match("^mods%-data/") then + runtimeLeaks[#runtimeLeaks + 1] = path + end +end + +T.eq(#binaryLeaks, 0, + "tracked publication contains no ROM/save binaries: " .. table.concat(binaryLeaks, ", ")) +T.eq(#runtimeLeaks, 0, + "tracked publication contains no runtime save/import data: " .. table.concat(runtimeLeaks, ", ")) + +T.finish("mew dock private artifact gate") diff --git a/tests/engine/mew_dock_seam_contract.lua b/tests/engine/mew_dock_seam_contract.lua new file mode 100644 index 00000000..627dfca6 --- /dev/null +++ b/tests/engine/mew_dock_seam_contract.lua @@ -0,0 +1,428 @@ +-- Contract gate for the two narrow Gen 1 seams added for a composable +-- post-departure S.S. Anne dock mod. The suite is ROM-free: it drives the +-- real hook bus and WorldAPI against hand-written maps and save snapshots. + +package.path = "./?.lua;./?/init.lua;" .. package.path +love = love or require("tests.love_stub") + +local T = require("tests.harness") +local Hooks = require("src.mods.Hooks") +local Runtime = require("src.mods.Runtime") +local WorldAPI = require("src.world.WorldAPI") + +local oldHooks = Runtime.hooks +local oldTextBox = package.loaded["src.render.TextBox"] + +package.loaded["src.render.TextBox"] = { + new = function(_, text, done) return { text = text, done = done } end, +} + +local story = dofile("data/scripts/story3.lua") +local VERSIONS = { "red", "blue", "yellow" } + +local function newDock(version, wrappers) + local blocks, pushes, warps = {}, {}, {} + local rebuilds = 0 + local save = { + version = version, + flags = { EVENT_SS_ANNE_LEFT = true }, + marker = "save-must-not-change", + } + local map = { + id = "VERMILION_DOCK", + setBlock = function(_, bx, by, block) + blocks[bx .. "," .. by] = block + end, + renderer = { rebuild = function() rebuilds = rebuilds + 1 end }, + } + local game = { + save = save, + data = { text = { + _VermilionCitySailor1ShipSetSailText = "The ship set sail.", + } }, + stack = { push = function(_, value) pushes[#pushes + 1] = value end }, + } + local ow = { + map = map, + player = { cellX = 14, cellY = 2, facing = "down" }, + startWarpTo = function(_, ...) + warps[#warps + 1] = { ... } + end, + } + + local hooks = Hooks.new() + Runtime.hooks = hooks + for _, entry in ipairs(wrappers or {}) do + hooks:wrap("map.occupancy_allowed", entry.fn, entry.priority or 0, + entry.owner) + end + + story.VERMILION_DOCK.onEnter(game, ow) + if pushes[1] and pushes[1].done then pushes[1].done() end + return { + blocks = blocks, pushes = pushes, warps = warps, rebuilds = rebuilds, + save = save, map = map, game = game, ow = ow, hooks = hooks, + } +end + +local function allowedWrapper(owner, inspect) + return { + owner = owner, + fn = function(nextFn, game, ctx) + if inspect then inspect(game, ctx) end + local downstream = nextFn(game, ctx) + local ownClaim = true + return downstream == true or ownClaim == true + end, + } +end + +-- With no subscriber, the post-departure branch remains byte-for-byte +-- vanilla in effect: erase the ship, show its line, and eject the player. +do + local run = newDock("red") + T.eq(run.rebuilds, 1, "vanilla re-entry rebuilds the erased dock") + T.eq(run.blocks["5,1"], 1, "vanilla re-entry erases the upper hull") + T.eq(run.blocks["8,2"], 13, "vanilla re-entry erases the lower hull") + T.eq(#run.pushes, 1, "vanilla re-entry shows the ship-set-sail line") + T.eq(run.pushes[1].text, "The ship set sail.", + "vanilla re-entry preserves its dialogue") + T.eq(run.warps[1] and run.warps[1][1], "VERMILION_CITY", + "vanilla re-entry ejects to Vermilion City") +end + +-- The new permission seam is post-departure only. An ordinary HM01 exit +-- must not invoke it or change the existing departure-script path. +do + local hookCalls, queued = 0, nil + local hooks = Hooks.new() + Runtime.hooks = hooks + hooks:wrap("map.occupancy_allowed", function(nextFn, game, ctx) + hookCalls = hookCalls + 1 + return nextFn(game, ctx) + end, 0, "must_not_run") + + local savedMusic = package.loaded["src.core.Music"] + package.loaded["src.core.Music"] = { + stop = function() end, + play = function() end, + } + local game = { + save = { version = "red", flags = { EVENT_GOT_HM01 = true } }, + data = {}, + } + local ow = { + player = { cellX = 14, cellY = 2 }, + startDustAnim = function(_, _, _, done) if done then done() end end, + queueScript = function(_, rows) queued = rows end, + } + story.VERMILION_DOCK.onEnter(game, ow) + package.loaded["src.core.Music"] = savedMusic + + T.eq(hookCalls, 0, "normal HM01 departure never calls the occupancy seam") + T.eq(game.save.flags.EVENT_SS_ANNE_LEFT, true, + "normal HM01 departure still sets the vanilla event flag") + T.check(type(queued) == "table" and #queued > 0, + "normal HM01 departure still queues its sail-away script") +end + +-- One cooperative claimant may permit occupancy. The callback receives a +-- detached data snapshot, not the live overworld, map, player, or save. +do + local seenGame, seenCtx + local run = newDock("red", { allowedWrapper("mew_fixture", function(game, ctx) + seenGame = game + seenCtx = { + mapId = ctx.mapId, reason = ctx.reason, gameVersion = ctx.gameVersion, + x = ctx.x, y = ctx.y, + } + ctx.mapId, ctx.x, ctx.y = "MUTATED", -1, -1 + end) }) + T.eq(seenGame, run.game, "occupancy callback receives the live game explicitly") + T.same(seenCtx, { + mapId = "VERMILION_DOCK", reason = "ss_anne_departed", + gameVersion = "red", x = 14, y = 2, + }, "occupancy context is the exact detached Red dock snapshot") + T.eq(run.ow.map.id, "VERMILION_DOCK", "context mutation cannot change the map") + T.eq(run.ow.player.cellX, 14, "context mutation cannot change player X") + T.eq(run.ow.player.cellY, 2, "context mutation cannot change player Y") + T.eq(run.save.marker, "save-must-not-change", "permission check does not mutate save") + T.same(run.save, { + version = "red", flags = { EVENT_SS_ANNE_LEFT = true }, + marker = "save-must-not-change", + }, "permission check preserves the complete save snapshot") + T.eq(#run.pushes, 0, "an exact true suppresses the vanilla rejection dialog") + T.eq(#run.warps, 0, "an exact true permits post-departure dock occupancy") + T.eq(run.blocks["5,1"], 1, "permitted occupancy still erases the departed ship") + T.eq(run.rebuilds, 1, "permitted occupancy still rebuilds the water layout") +end + +-- Standard hook composition also means a non-cooperative false/no-next +-- wrapper can suppress downstream claims. This remains safe because false +-- is denial; it cannot accidentally grant occupancy. +do + local downstreamCalls = 0 + local run = newDock("red", { + { + owner = "denier", priority = 10, + fn = function() return false end, + }, + { + owner = "unreached_claimant", priority = 0, + fn = function() + downstreamCalls = downstreamCalls + 1 + return true + end, + }, + }) + T.eq(downstreamCalls, 0, "no-next denial suppresses downstream by hook semantics") + T.eq(run.warps[1] and run.warps[1][1], "VERMILION_CITY", + "non-cooperative false remains fail-closed") +end + +-- Cooperative peers all run through next(). A lower-priority peer claim is +-- preserved by a higher-priority peer that has no claim of its own. +do + local calls, contextIdentity = {}, nil + local run = newDock("blue", { + { + owner = "peer_high", priority = 10, + fn = function(nextFn, game, ctx) + calls[#calls + 1] = "high-before" + contextIdentity = ctx + local allowed = nextFn(game, ctx) + calls[#calls + 1] = "high-after" + return allowed == true or false + end, + }, + { + owner = "peer_low", priority = 0, + fn = function(nextFn, game, ctx) + calls[#calls + 1] = "low" + T.eq(ctx, contextIdentity, "peer wrappers share one detached snapshot instance") + local allowed = nextFn(game, ctx) + local ownClaim = true + return allowed == true or ownClaim == true + end, + }, + }) + T.same(calls, { "high-before", "low", "high-after" }, + "multiple peer handlers preserve hook-chain order") + T.eq(#run.warps, 0, "a cooperative peer claim survives the whole chain") +end + +-- Absent, throwing, or malformed callbacks fail closed. Only boolean true +-- can turn off ejection; truthy strings/tables/numbers do not grant access. +do + local malformed = { + { label = "nil", value = nil }, + { label = "false", value = false }, + { label = "string", value = "yes" }, + { label = "number", value = 1 }, + { label = "table", value = {} }, + } + for _, case in ipairs(malformed) do + local run = newDock("red", { { + owner = "malformed_" .. case.label, + fn = function() return case.value end, + } }) + T.eq(run.warps[1] and run.warps[1][1], "VERMILION_CITY", + "malformed " .. case.label .. " permission fails closed") + end + + local beforeNext = newDock("red", { { + owner = "throws_before_next", + fn = function() error("fixture throws before next", 0) end, + } }) + T.eq(beforeNext.warps[1] and beforeNext.warps[1][1], "VERMILION_CITY", + "throwing callback before next fails closed") + + local afterNext = newDock("red", { { + owner = "throws_after_next", + fn = function(nextFn, game, ctx) + nextFn(game, ctx) + error("fixture throws after next", 0) + end, + } }) + T.eq(afterNext.warps[1] and afterNext.warps[1][1], "VERMILION_CITY", + "throwing callback after next keeps the downstream denial") +end + +-- The context carries one version only. A Red-only claimant must not leak +-- access into Blue or Yellow, and each call gets its own snapshot. +do + local contexts = {} + for _, version in ipairs(VERSIONS) do + local run = newDock(version, { { + owner = "red_only", + fn = function(nextFn, game, ctx) + contexts[#contexts + 1] = ctx + local downstream = nextFn(game, ctx) + return downstream == true or ctx.gameVersion == "red" + end, + } }) + T.eq(#run.warps == 0, version == "red", + version .. " occupancy is decided only by its own version context") + end + T.eq(contexts[1].gameVersion, "red", "Red context stays Red") + T.eq(contexts[2].gameVersion, "blue", "Blue context stays Blue") + T.eq(contexts[3].gameVersion, "yellow", "Yellow context stays Yellow") + T.check(contexts[1] ~= contexts[2] and contexts[2] ~= contexts[3], + "Red, Blue, and Yellow calls do not share context tables") +end + +-- Removing the owner is the engine's disable/uninstall path. It restores +-- vanilla denial immediately and leaves no save flag or serialized state. +do + local run = newDock("yellow", { allowedWrapper("removable") }) + T.eq(#run.warps, 0, "installed owner may grant Yellow dock occupancy") + run.hooks:removeOwner("removable") + local pushes, warps = {}, {} + run.game.stack.push = function(_, value) pushes[#pushes + 1] = value end + run.ow.startWarpTo = function(_, ... ) warps[#warps + 1] = { ... } end + story.VERMILION_DOCK.onEnter(run.game, run.ow) + if pushes[1] and pushes[1].done then pushes[1].done() end + T.eq(warps[1] and warps[1][1], "VERMILION_CITY", + "disabling the owner restores vanilla ejection") + T.eq(run.hooks.chains["map.occupancy_allowed"], nil, + "uninstall removes the occupancy chain itself") + T.eq(run.save.marker, "save-must-not-change", + "disable/uninstall writes no persistent permission state") + T.same(run.save, { + version = "yellow", flags = { EVENT_SS_ANNE_LEFT = true }, + marker = "save-must-not-change", + }, "disable/uninstall preserves the complete Yellow save snapshot") +end + +-- activeBlockAt is read-only and fail-closed. A successful call exposes +-- only one scalar from the active runtime layout, never its backing table. +local function blockApi(version, blockAt) + local backing = { 4, 5, 6, 8, 9, 10 } + local map = { + id = "VERMILION_DOCK", + def = { width = 3, height = 2, blocks = backing }, + blockAt = blockAt or function(_, bx, by) + return backing[by * 3 + bx + 1] + end, + } + local world = { isOverworld = true, map = map } + local game = { + save = { version = version }, + stack = { states = { world } }, + overworld = world, + } + return WorldAPI.new(game, "contract_fixture"), backing, game, map +end + +do + for _, version in ipairs(VERSIONS) do + local api, backing = blockApi(version) + local block, err = api:activeBlockAt("VERMILION_DOCK", 1, 0) + T.eq(block, 5, version .. " reads its active dock block") + T.eq(err, nil, version .. " valid active block has no error") + block = 99 + T.eq(backing[2], 5, version .. " scalar result cannot mutate the map") + end + + local api = blockApi("red") + local wrong, wrongErr = api:activeBlockAt("VERMILION_CITY", 1, 0) + T.eq(wrong, nil, "wrong map has no block result") + T.eq(wrongErr, "map is not active", "wrong map fails closed explicitly") + + local invalid = { + { "nil x", nil, 0 }, { "string x", "1", 0 }, { "table x", {}, 0 }, + { "fraction x", 0.5, 0 }, { "negative infinity x", -math.huge, 0 }, + { "infinity y", 0, math.huge }, { "NaN y", 0, 0 / 0 }, + } + for _, case in ipairs(invalid) do + local value, err = api:activeBlockAt("VERMILION_DOCK", case[2], case[3]) + T.eq(value, nil, case[1] .. " returns no block") + T.eq(err, "invalid block coordinates", case[1] .. " is rejected by type") + end + for _, coords in ipairs({ { -1, 0 }, { 0, -1 }, { 3, 0 }, { 0, 2 } }) do + local value, err = api:activeBlockAt("VERMILION_DOCK", coords[1], coords[2]) + T.eq(value, nil, "out-of-bounds coordinate returns no block") + T.eq(err, "block coordinates out of bounds", "bounds fail closed explicitly") + end +end + +do + local malformed = { + { label = "nil", get = function() return nil end }, + { label = "negative", get = function() return -1 end }, + { label = "fractional", get = function() return 1.5 end }, + { label = "infinite", get = function() return math.huge end }, + { label = "NaN", get = function() return 0 / 0 end }, + { label = "string", get = function() return "4" end }, + { label = "table", get = function() return {} end }, + { label = "throwing", get = function() error("bad map", 0) end }, + } + for _, case in ipairs(malformed) do + local api = blockApi("red", case.get) + local block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "malformed active block " .. case.label .. " returns no value") + T.eq(err, "block unavailable", + "malformed active block " .. case.label .. " fails closed") + end +end + + +-- Invalid map shapes are untrusted runtime data too. None may escape as a +-- block or raise through the mod facade. +do + local badDefs = { + { label = "missing def", value = nil }, + { label = "missing width", value = { height = 2, blocks = {} } }, + { label = "string width", value = { width = "3", height = 2, blocks = {} } }, + { label = "fractional width", value = { width = 1.5, height = 2, blocks = {} } }, + { label = "nonpositive width", value = { width = 0, height = 2, blocks = {} } }, + { label = "infinite height", value = { width = 3, height = math.huge, blocks = {} } }, + { label = "missing blocks", value = { width = 3, height = 2 } }, + { label = "scalar blocks", value = { width = 3, height = 2, blocks = 4 } }, + } + for _, case in ipairs(badDefs) do + local api, _, _, map = blockApi("red") + map.def = case.value + local block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, case.label .. " returns no block") + T.eq(err, "block unavailable", case.label .. " fails closed") + end + + local api, _, _, map = blockApi("red") + map.blockAt = nil + local block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "missing blockAt returns no block") + T.eq(err, "block unavailable", "missing blockAt fails closed") + map.blockAt = "not a function" + block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "malformed blockAt returns no block") + T.eq(err, "block unavailable", "malformed blockAt fails closed") + + api, _, _, map = blockApi("red") + map.def.blocks = {} + block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "sparse stored block slot returns no block") + T.eq(err, "block unavailable", "sparse stored block slot fails closed") + + api, _, _, map = blockApi("red") + map.def.blocks[1] = "4" + block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "malformed stored block slot returns no block") + T.eq(err, "block unavailable", "malformed stored block slot fails closed") + + api, _, _, map = blockApi("red", function() return 5 end) + block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "stored/accessor mismatch returns no block") + T.eq(err, "block unavailable", "stored/accessor mismatch fails closed") +end + +do + local api = WorldAPI.new({ stack = { states = {} } }, "contract_fixture") + local block, err = api:activeBlockAt("VERMILION_DOCK", 0, 0) + T.eq(block, nil, "no-overworld lookup returns no block") + T.eq(err, "no overworld", "no-overworld lookup reports its state") +end + +Runtime.hooks = oldHooks +package.loaded["src.render.TextBox"] = oldTextBox +T.finish("mew dock seam contract") From d17f0725d80481e47b74ea406a4c4bccbd574295 Mon Sep 17 00:00:00 2001 From: Bo Layer Date: Sun, 23 Aug 2026 03:20:43 -0600 Subject: [PATCH 14/33] fix(mod-api): validate active block storage --- data/scripts/story3.lua | 4 ++-- docs/modding.md | 3 +++ docs/rfcs/0013-map-occupancy-and-active-block.md | 4 ++++ src/world/WorldAPI.lua | 7 ++++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/data/scripts/story3.lua b/data/scripts/story3.lua index 787b0d99..826a7f96 100644 --- a/data/scripts/story3.lua +++ b/data/scripts/story3.lua @@ -913,8 +913,8 @@ M.VERMILION_DOCK = { -- the ship is long gone: erase her right away, and anyone who -- still lands here is sent back out past the guard unless a mod -- explicitly permits this occupied map state. This hook surrounds - -- only the ejection decision; the map's complete onEnter chain has - -- already run and the departed ship remains erased. + -- only the ejection decision; map-script registration and dispatch + -- stay unchanged, and the departed ship remains erased. for _, b in ipairs(DOCK_SHIP_BLOCKS) do ow.map:setBlock(b.bx, b.by, b.water) end diff --git a/docs/modding.md b/docs/modding.md index 8687c7a2..ab0ba7e9 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -247,6 +247,9 @@ or malformed active block returns `nil, "block unavailable"`. The caller must require every expected cell to match before changing presentation. This method is Gen 1-only; Gold callers receive no parity promise for it. +The same unavailable result covers missing or sparse active block storage and +an accessor result that does not match its validated active block slot. + ### Conditional map occupancy `map.occupancy_allowed` is a narrow Gen 1 hook around a map script's vanilla diff --git a/docs/rfcs/0013-map-occupancy-and-active-block.md b/docs/rfcs/0013-map-occupancy-and-active-block.md index cfb796db..64e6aa04 100644 --- a/docs/rfcs/0013-map-occupancy-and-active-block.md +++ b/docs/rfcs/0013-map-occupancy-and-active-block.md @@ -89,6 +89,10 @@ Failure reasons are stable: | Coordinate is negative or outside the active map | `block coordinates out of bounds` | | Active block data is absent or malformed | `block unavailable` | +The block slot and the active map accessor must both contain the same valid +nonnegative integer. Missing or sparse storage and inconsistent accessor data +return `block unavailable`. + Requiring the expected map ID and rejecting all ambiguous input lets a mod compare every cell in its version-specific signature before it calls an existing mutation API. Red, Blue, and Yellow each use their own loaded map diff --git a/src/world/WorldAPI.lua b/src/world/WorldAPI.lua index e204d635..bdab92a3 100644 --- a/src/world/WorldAPI.lua +++ b/src/world/WorldAPI.lua @@ -146,8 +146,13 @@ function WorldAPI:activeBlockAt(mapId, bx, by) if type(def.blocks) ~= "table" or type(map.blockAt) ~= "function" then return nil, "block unavailable" end + local stored = def.blocks[by * def.width + bx + 1] + if not validBlockCoordinate(stored) or stored < 0 then + return nil, "block unavailable" + end local ok, blockId = pcall(map.blockAt, map, bx, by) - if not ok or not validBlockCoordinate(blockId) or blockId < 0 then + if not ok or not validBlockCoordinate(blockId) or blockId < 0 + or blockId ~= stored then return nil, "block unavailable" end return blockId From dd0f0e08921e035cecf762787ecc115ffb52c511 Mon Sep 17 00:00:00 2001 From: "DESKTOP-8SRFDDM\\cam95" Date: Sat, 22 Aug 2026 21:21:02 -0500 Subject: [PATCH 15/33] engine: seams for mod-driven world actors and link sessions Five small additions. None of them mention the mod that prompted them. WorldAPI handles gain stepNow, canStep, placeAt, isMoving and setPassable. scriptMove queues onto OverworldState.scriptMoves, and a non-empty scriptMoves is how the overworld knows a cutscene is running, so it gates handleInput -- an actor animated that way freezes the player's controls for as long as it walks. Right for Oak marching to his lab, wrong for anything moving on its own schedule. stepNow sets the same per-tile state without the queue. It skips the collision check on purpose: the caller is replaying a move that was decided somewhere else, and re-judging it here would let the two copies disagree about where the actor is. canStep is there for callers that do want the map's opinion. OverworldController raises world.talk around the NPC talk path. An object from spawnNpc has no TEXT_* id, so the vanilla path has nothing to say for one; a mod that owns the object wraps this and does not call next. LinkState.newFromSession adopts a transport that is already paired, so a mode can tunnel a battle through a connection it already has rather than opening a second one. The hello and fingerprint exchange still runs. When the battle ends, link.battle_ended carries the result and both lockstep party copies -- cable rules leave the real party alone, so that is the only place the damage exists. Game:startNewGame(opts) is the title's NEW GAME closure made callable, with opts.intro=false to land straight in the world. CodeEntry.new takes an optional {length=, charset=} so the same widget can enter an address or a room code. Co-Authored-By: Claude Fable 5 --- src/core/Game.lua | 47 +++++++++++++-------- src/link/CodeEntry.lua | 69 ++++++++++++++++++++++++------- src/link/LinkState.lua | 54 +++++++++++++++++++++++- src/world/OverworldController.lua | 8 +++- src/world/WorldAPI.lua | 67 ++++++++++++++++++++++++++++++ 5 files changed, 211 insertions(+), 34 deletions(-) diff --git a/src/core/Game.lua b/src/core/Game.lua index b1b730b9..bbe9c9eb 100644 --- a/src/core/Game.lua +++ b/src/core/Game.lua @@ -147,29 +147,42 @@ function Game:bootConfig() return boot end +-- NEW GAME, as a call: a fresh skeleton (through save.new_game, so a mod +-- can reshape it), the overworld at the skeleton's spawn, and the intro +-- screen on top. The title menu's NEW GAME row is this; a mod that starts a +-- game on its own terms -- a match, a challenge mode -- calls it directly. +-- +-- opts.intro = false skips the newGame screen (Oak's speech) so the player +-- lands straight in the world; the skeleton then has to carry a name and a +-- party, which is the caller's job via save.new_game. +function Game:startNewGame(opts) + local OverworldState = require("src.world.OverworldController") + while self.stack:top() do self.stack:pop() end + -- New Game keeps the standalone options.lua preferences + self.sessionStartedAt = os.time() + self.save = SaveData.newGame(self:bootConfig()) + -- no bucket carry-over: mod state from an abandoned session must + -- not leak into a fresh slot; mods seed via save.created instead + self:adoptSave(self.save) + ModRuntime.emit("save.created", { save = self.save }) + self:applyOptions(self.save.options) + self.stack:push(OverworldState, self.save.player.map, + self.save.player.x, self.save.player.y, + self.save.player.facing, + { via = "boot", freshBoot = true }) + if not (opts and opts.intro == false) then + Screens.push(self, bootScreens(self).newGame or "OakSpeech", + function() end) + end +end + -- the title screen with its NEW GAME / CONTINUE wiring; used at boot -- and by the START-menu QUIT confirmation function Game:makeTitleState() local OverworldState = require("src.world.OverworldController") local factory = Screens.get(self, bootScreens(self).title or "TitleState") local title = factory.new(self, { - onNewGame = function() - while self.stack:top() do self.stack:pop() end - -- New Game keeps the standalone options.lua preferences - self.sessionStartedAt = os.time() - self.save = SaveData.newGame(self:bootConfig()) - -- no bucket carry-over: mod state from an abandoned session must - -- not leak into a fresh slot; mods seed via save.created instead - self:adoptSave(self.save) - ModRuntime.emit("save.created", { save = self.save }) - self:applyOptions(self.save.options) - self.stack:push(OverworldState, self.save.player.map, - self.save.player.x, self.save.player.y, - self.save.player.facing, - { via = "boot", freshBoot = true }) - Screens.push(self, bootScreens(self).newGame or "OakSpeech", - function() end) - end, + onNewGame = function() self:startNewGame() end, onContinue = function() local loaded, recovered = SaveData.load() if loaded then diff --git a/src/link/CodeEntry.lua b/src/link/CodeEntry.lua index f0335662..23c74241 100644 --- a/src/link/CodeEntry.lua +++ b/src/link/CodeEntry.lua @@ -1,28 +1,63 @@ --- Shared 6-slot room-code entry widget: the digit-scrub interaction --- LinkState's own `ipDigits`/`addrPos` already uses for IP entry, over the --- Crockford-32-style alphabet pokeserver room/tournament codes are drawn --- from (23456789ABCDEFGHJKMNPQRSTUVWXYZ -- no 0/O/1/I/L, so a code read --- aloud or handwritten never has to be checked twice). +-- Shared slot-scrub entry widget: the digit-scrub interaction LinkState's +-- own `ipDigits`/`addrPos` already uses for IP entry, over the Crockford-32 +-- style alphabet pokeserver room/tournament codes are drawn from +-- (23456789ABCDEFGHJKMNPQRSTUVWXYZ -- no 0/O/1/I/L, so a code read aloud or +-- handwritten never has to be checked twice). +-- +-- The Gen 1 naming grid cannot stand in for this: it has no digits at all +-- (data/text/alphabets.asm is letters and punctuation), so a room code or +-- an address typed there would be unenterable. That is what this exists +-- for. +-- +-- new() takes an optional {length=, charset=} so the same interaction can +-- carry something other than a room code -- a dotted IP over "0123456789.", +-- say. Both default to the room-code shape, so existing callers are +-- unaffected and CodeEntry.LENGTH / CodeEntry.CHARSET still describe them. local CodeEntry = {} CodeEntry.CHARSET = "23456789ABCDEFGHJKMNPQRSTUVWXYZ" CodeEntry.LENGTH = 6 -function CodeEntry.new() +-- state carries its own length/charset so a caller holding two widgets of +-- different shapes cannot have one read the other's alphabet +function CodeEntry.new(opts) + local charset = (opts and opts.charset) or CodeEntry.CHARSET + local length = (opts and opts.length) or CodeEntry.LENGTH local chars = {} - for i = 1, CodeEntry.LENGTH do chars[i] = 1 end -- index into CHARSET, 1-based - return { chars = chars, pos = 1 } + for i = 1, length do chars[i] = 1 end -- index into charset, 1-based + return { chars = chars, pos = 1, charset = charset, length = length } end -local N = #CodeEntry.CHARSET +-- Seed the slots from an existing string: prefilling the LAN address means +-- the player scrubs the last octet instead of all twelve digits. Anything +-- not in the charset lands on slot 1's character. +-- Slots past the end of the seed -- and any character the charset does not +-- carry -- land on the charset's blank where it has one, so seeding a +-- 15-slot address widget with "192.168.1.40" reads back as that address and +-- not as "192.168.1.40000". A charset with no blank (the room code's) has +-- nowhere to put one, so those fall back to the first character as before. +function CodeEntry.fromText(text, opts) + local state = CodeEntry.new(opts) + local blank = state.charset:find(" ", 1, true) or 1 + for i = 1, state.length do + local ch = tostring(text or ""):sub(i, i) + state.chars[i] = (ch ~= "" and state.charset:find(ch, 1, true)) or blank + end + return state +end + +local function charsetOf(state) return state.charset or CodeEntry.CHARSET end +local function lengthOf(state) return state.length or CodeEntry.LENGTH end function CodeEntry.up(state) - state.chars[state.pos] = state.chars[state.pos] % N + 1 + local n = #charsetOf(state) + state.chars[state.pos] = state.chars[state.pos] % n + 1 end function CodeEntry.down(state) - state.chars[state.pos] = (state.chars[state.pos] - 2) % N + 1 + local n = #charsetOf(state) + state.chars[state.pos] = (state.chars[state.pos] - 2) % n + 1 end function CodeEntry.left(state) @@ -30,14 +65,18 @@ function CodeEntry.left(state) end function CodeEntry.right(state) - state.pos = math.min(CodeEntry.LENGTH, state.pos + 1) + state.pos = math.min(lengthOf(state), state.pos + 1) +end + +-- the character in slot i, which is what a draw loop wants +function CodeEntry.charAt(state, i) + local charset = charsetOf(state) + return charset:sub(state.chars[i], state.chars[i]) end function CodeEntry.text(state) local out = {} - for i = 1, CodeEntry.LENGTH do - out[i] = CodeEntry.CHARSET:sub(state.chars[i], state.chars[i]) - end + for i = 1, lengthOf(state) do out[i] = CodeEntry.charAt(state, i) end return table.concat(out) end diff --git a/src/link/LinkState.lua b/src/link/LinkState.lua index c2464beb..44ae1841 100644 --- a/src/link/LinkState.lua +++ b/src/link/LinkState.lua @@ -112,6 +112,32 @@ function LinkState.newJoinOnline(game, code) return self end +-- Adopt a transport that is ALREADY paired and skip the connect UI: an +-- overworld multiplayer session handing one pair of players off to a battle +-- or a trade. The caller has settled which mode and which side hosts, so +-- all that is left is the hello exchange every link session runs before it +-- commits -- the fingerprint/mod compatibility check still gets its say, +-- exactly as it would have on the LAN or ONLINE path. +-- +-- `transport` is anything Session accepts (update/poll/send/close plus the +-- .paired/.closed/.error fields), which is what lets a mod route a battle +-- over a channel of its own. Ownership transfers with it: exitWith closes +-- the session, so the caller's transport is done once this state unwinds. +-- +-- opts.forceLevel the level rule, normally chosen on the battleOptions +-- screen; an adopted session has no menu to pick it on +function LinkState.newFromSession(game, transport, mode, isHost, opts) + local self = LinkState.new(game) + self.net = Session.new(transport, { role = isHost and "host" or "guest", + kind = "link" }) + self.adopted = true + self.adoptedMode, self.adoptedHost = mode, isHost and true or false + self.forceLevel = opts and opts.forceLevel or nil + self.stage = "adopted" + self:sendHello(isHost and mode or nil) + return self +end + function LinkState:exitWith(message, reason) DiscordPresence.setJoinCode(nil) self.game.linkSession = nil -- back to the player's own GAME SPEED @@ -203,8 +229,9 @@ function LinkState:decideCompat(mode, isHost) mods = peer and peer.mods, fingerprint = peer and peer.fingerprint }, }) if self.verdict == "full" or self.verdict == "vanilla_peer" then - if isHost and mode == "battle" then + if isHost and mode == "battle" and not self.adopted then -- host picks the level rule now, before the parties are exchanged + -- (an adopted session had it passed in; see newFromSession) self.stage = "battleOptions" else self:startMode(mode, isHost) @@ -243,6 +270,16 @@ function LinkState:update(dt) end end + -- handed over from an already-paired session (LinkState.newFromSession): + -- both hellos are in flight, and the first one to land settles compat and + -- drops us straight into the agreed mode + if self.stage == "adopted" then + if self:pollHello() then + self:decideCompat(self.adoptedMode, self.adoptedHost) + end + return + end + if self.stage == "menu" then if input:wasPressed("down") then self.index = self.index % 3 + 1 @@ -497,11 +534,26 @@ function LinkState:update(dt) return end self.game.stack:push(battle) + self.battle = battle self.stage = "battleRunning" end elseif self.stage == "battleRunning" then if self.game.stack:top() == self then + -- the lockstep copies carry the damage the real party never takes + -- (cable rules), so a mode that wants it -- a tournament ladder, a + -- battle royale -- reads it from here before the state unwinds + local battle = self.battle + if battle then + Runtime.emit("link.battle_ended", { + result = battle.result or "ended", + myParty = battle.playerParty, + theirParty = battle.enemyParty, + peerName = self.peerName, + role = self.isHost and "host" or "guest", + }) + end + self.battle = nil self:exitWith(nil) -- battle finished end end diff --git a/src/world/OverworldController.lua b/src/world/OverworldController.lua index e0391b3f..47dda17e 100644 --- a/src/world/OverworldController.lua +++ b/src/world/OverworldController.lua @@ -1993,7 +1993,13 @@ function OverworldState:interact() -- talk() lands the follower on its cell first. require("src.world.PikachuFollower").talk(Game, self, npc) elseif not npc.moving then - self:talkTo(npc) + -- world.talk: the A press on an object, before the map's text tables + -- get it. A runtime object a mod spawned (WorldAPI:spawnNpc) carries + -- no TEXT_* id, so the vanilla path has nothing to say for it; a mod + -- that owns the object wraps this and simply does not call next(). + -- Everything else falls straight through to talkTo as before. + Runtime.call("world.talk", function(ow, target) ow:talkTo(target) end, + self, npc) end interacted(self, fx, fy, "npc", npc) return diff --git a/src/world/WorldAPI.lua b/src/world/WorldAPI.lua index 69b9eea2..d4f3d800 100644 --- a/src/world/WorldAPI.lua +++ b/src/world/WorldAPI.lua @@ -5,6 +5,7 @@ -- quiet no-op, never a crash. Reaching into OverworldState internals -- stays unsupported; anything a mod legitimately needs belongs here. +local Collision = require("src.world.Collision") local Logger = require("src.core.Logger") local FieldDefaults = require("src.world.FieldDefaults") local Map = require("src.world.Map") @@ -407,6 +408,72 @@ function Handle:position() return self.npc.cellX, self.npc.cellY end +-- Walk one tile starting NOW, outside the scripted-movement queue. +-- +-- scriptMove queues onto OverworldState.scriptMoves, and a non-empty +-- scriptMoves is how the overworld knows a cutscene is running -- it gates +-- handleInput (OverworldController "local scripted = ... #self.scriptMoves > +-- 0"), so an actor animated that way freezes the player's controls for as +-- long as it walks. That is right for Oak marching to his lab and wrong for +-- an actor that moves on its own schedule: a networked player's ghost, an +-- ambient walker. This is the same per-tile state scriptMove sets, minus +-- the queue and therefore minus the lockout. +-- +-- Collision is deliberately not checked. The caller is replaying a move +-- that was already decided somewhere else (validated on the peer's machine, +-- or authored), and re-judging it here would let the two copies disagree +-- about where the actor is. Use canStep first if you want the check. +function Handle:stepNow(dir) + local npc = self.npc + if not Collision.DELTA[dir] then return nil, "bad direction: " .. tostring(dir) end + if npc.moving then return nil, "already moving" end + npc.facing = dir + npc.targetX, npc.targetY = Collision.target(npc.cellX, npc.cellY, dir) + npc.moving = true + npc.progress = 0 + return true +end + +-- Would stepNow land somewhere legal? Exposed separately so a caller that +-- does want the map's opinion can ask for it without giving up the "replay +-- verbatim" default above. +function Handle:canStep(dir) + local ow = self.ow + if not (ow and ow.map) then return false end + return Collision.canMove(ow.map, ow.entities, self.npc, dir) and true or false +end + +-- Snap to a cell with no animation: a warp arrival, or a resync that has +-- drifted too far to walk off. Clears any step in flight so the entity +-- cannot land on its old target a frame later. +function Handle:placeAt(x, y, facing) + local npc = self.npc + npc.moving = false + npc.marching = false + npc.targetX, npc.targetY = nil, nil + npc.progress = 0 + npc.cellX, npc.cellY = x, y + npc.px, npc.py = x * 16, y * 16 + if facing then npc.facing = facing end + return true +end + +-- True while a step is still animating, so a driver can pace itself rather +-- than stomping a move in flight. +function Handle:isMoving() + return self.npc.moving and true or false +end + +-- Whether the player may walk through this object (Collision.occupied skips +-- passable entities -- Yellow's companion Pikachu is the engine's own user +-- of the flag). It still draws and can still be talked to; it just stops +-- being an obstacle, which is what a dynamic actor wants when standing in a +-- doorway would otherwise wall someone in. +function Handle:setPassable(passable) + self.npc.passable = passable and true or false + return true +end + function WorldAPI:npc(mapId, indexOrName) local ow = self:overworld() if not ow then return nil, NO_OVERWORLD end From 01c5eb21899dada06e040b53faf1e179d0549366 Mon Sep 17 00:00:00 2001 From: "DESKTOP-8SRFDDM\\cam95" Date: Sun, 23 Aug 2026 10:19:06 -0500 Subject: [PATCH 16/33] tests, docs: cover world.talk and link.battle_ended gate_meta_coverage asks every extension point for a unit test through the public mod API, a no-mod parity test, and docs. The seams commit shipped the call sites and owed the rest. Both cases drive the real engine path, and both assert the unhooked build first, so they fail if the seam is deleted and if it changes vanilla behaviour. world_talk stands an object on the faced cell: with no mod the A press reaches talkTo, with a mod that owns the object it does not, and an object the mod ignores still falls through. link_battle_ended parks a session at the end of a battle and checks the event carries the result, the role, and both party copies. The parity side needed nothing. gate_hooks and gate_events walk the live catalog, so both seams were covered structurally as soon as the call sites existed. Co-Authored-By: Claude Fable 5 --- docs/modding.md | 74 +++++++++++++++++ tests/modkit/cases/link_battle_ended.lua | 99 ++++++++++++++++++++++ tests/modkit/cases/world_talk.lua | 100 +++++++++++++++++++++++ 3 files changed, 273 insertions(+) create mode 100644 tests/modkit/cases/link_battle_ended.lua create mode 100644 tests/modkit/cases/world_talk.lua diff --git a/docs/modding.md b/docs/modding.md index 7c724404..1a2251b0 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -265,6 +265,80 @@ Red exposes FLY separately because it requires a destination picker: and `mod.world:flyTo(mapId)` accepts only a visited destination from the native Fly town list. Gold does not expose these two methods yet. +## Self-driven world actors + +`mod.world:spawnNpc()` returns a handle whose `scriptMove` queues onto the +overworld's scripted-movement list. A non-empty list is how the overworld +knows a cutscene is running, so it gates player input for as long as the +actor walks -- right for Oak marching to his lab, wrong for an actor that +moves on its own schedule (a networked player's ghost, an ambient walker). +Five handle methods drive one without that lockout: + +```lua +local ghost = mod.world:spawnNpc({ map = "ROUTE_1", x = 5, y = 7, + sprite = "SPRITE_RED" }) +if ghost:canStep("up") then ghost:stepNow("up") end -- one tile, now +if not ghost:isMoving() then ghost:placeAt(9, 3, "down") end -- snap, no walk +ghost:setPassable(true) -- walk-through +``` + +`stepNow(dir)` sets the same per-tile state `scriptMove` does, minus the +queue. It deliberately does **not** check collision: a caller replaying a +move that was already decided elsewhere (validated on a peer's machine, or +authored) would let the two copies disagree about where the actor is if this +re-judged it. Ask `canStep(dir)` first when you do want the map's opinion. +`placeAt(x, y, facing)` snaps with no animation and clears any step in +flight, for a warp arrival or a resync too far gone to walk off. +`isMoving()` lets a driver pace itself instead of stomping a move already +running. `setPassable(flag)` is the flag `Collision.occupied` skips (the +engine's own user is Yellow's companion Pikachu); a passable object still +draws and can still be talked to. + +An object spawned this way carries no `TEXT_*` id, so the vanilla talk path +has nothing to say for it. The **`world.talk`** hook is the A press on an +object, raised before the map's text tables get it: + +```lua +mod.hooks:wrap("world.talk", function(next, ow, target) + if mine(target) then + say(target) -- the mod answers for an object it owns + return -- ...by not calling next() + end + return next(ow, target) -- everything else falls through unchanged +end) +``` + +With no subscriber the A press reaches `talkTo` exactly as before. An object +mid-step raises no hook, matching the vanilla gate. + +## Adopting an already-paired link session + +`LinkState.newFromSession(game, transport, mode, isHost, opts)` starts a link +session on a transport that is *already* paired, skipping the address/code +entry UI while keeping the hello and fingerprint compatibility exchange +intact. `transport` is anything `Session` accepts, which is what lets a mode +tunnel a battle through its own connection rather than opening a second one. + +When the battle finishes, **`link.battle_ended`** reports the outcome: + +```lua +mod.events:on("link.battle_ended", function(ev) + -- ev = { result, myParty, theirParty, peerName, role } +end) +``` + +The party copies are the point. Cable rules leave the real party untouched, +so a mode built on link battles -- a tournament ladder, a battle royale -- +has no other way to learn what the fight cost, and by the time the state +unwinds the battle object is gone. `role` is `"host"` or `"guest"`. + +Two smaller pieces support the same shape of mode. `Game:startNewGame(opts)` +is the title screen's NEW GAME closure made callable, with `opts.intro = +false` to land straight in the world -- a mode that hands out its own starting +state has no use for Oak's speech. `CodeEntry.new` takes an optional +`{ length = , charset = }`, so the slot-scrub widget that enters a link code +can also carry a room code or an address. + ## Read-only battle snapshots `mod.battle:snapshot()` returns `nil` outside a battle and a copied battle diff --git a/tests/modkit/cases/link_battle_ended.lua b/tests/modkit/cases/link_battle_ended.lua new file mode 100644 index 00000000..93c5ff9c --- /dev/null +++ b/tests/modkit/cases/link_battle_ended.lua @@ -0,0 +1,99 @@ +-- A sandboxed mod can read the outcome of a link battle -- who won, and the +-- lockstep party copies -- through the public event surface. +-- +-- The copies are the point. Cable rules leave the real party untouched, so +-- a mode built on link battles (a tournament ladder, a battle royale) has no +-- other way to learn what the fight cost; by the time the state unwinds the +-- battle object is gone. + +package.path = "./?.lua;./?/init.lua;" .. package.path +love = love or require("tests.love_stub") + +local T = require("tests.modkit") +local LinkState = require("src.link.LinkState") + +local FIXTURE = { + ["mods/outcome_probe/manifest.json"] = [[{ + "id": "outcome_probe", + "name": "Outcome Probe", + "version": "1.0.0", + "entry": "main.lua", + "api": 2 + }]], + ["mods/outcome_probe/main.lua"] = [[ + local mod = ... + mod.exports.seen = 0 + mod.events:on("link.battle_ended", function(ev) + mod.exports.seen = mod.exports.seen + 1 + mod.exports.result = ev.result + mod.exports.role = ev.role + mod.exports.peerName = ev.peerName + mod.exports.myLead = ev.myParty and ev.myParty[1] + mod.exports.theirLead = ev.theirParty and ev.theirParty[1] + end) + ]], +} + +-- a link session parked at the end of a battle: no transport, so update() +-- goes straight to the stage that reports the outcome +local function finishedSession(result, isHost) + local ls + ls = setmetatable({ + stage = "battleRunning", + isHost = isHost, + peerName = "BLUE", + net = nil, + battle = { + result = result, + playerParty = { { species = "RATTATA", hp = 3 } }, + enemyParty = { { species = "PIDGEY", hp = 0 } }, + }, + game = { input = {}, stack = { top = function() return ls end } }, + }, { __index = LinkState }) + -- the real exit unwinds the whole link stack; the event is what is under + -- test, so record the exit rather than run it + ls.exitWith = function() ls.exited = true end + return ls +end + +-- ------- no mod: the battle still ends, nothing observes it + +local vanilla = T.sdk.loadNone({}) +local quiet = finishedSession("win", true) +quiet:update(0) +T.check(quiet.exited, "with no mod loaded the finished battle still unwinds") +T.eq(quiet.battle, nil, "and lets go of the battle") +vanilla.release() + +-- ------- a mod reads the outcome and both party copies + +local run = T.sdk.loadMods({ "mods/outcome_probe" }, { fs = T.sdk.memfs(FIXTURE) }) +T.eq(#run.errors, 0, + "the public outcome probe loads clean (" .. tostring(run.errors[1]) .. ")") + +local session = finishedSession("win", true) +session:update(0) +local out = run.loader.exports.outcome_probe or {} +T.eq(out.seen, 1, "a finished link battle raises the event once") +T.eq(out.result, "win", "the outcome is reported") +T.eq(out.role, "host", "so is which side of the cable we were") +T.eq(out.peerName, "BLUE", "and who we played") +T.eq(out.myLead and out.myLead.species, "RATTATA", + "the lockstep copy of our party comes with it") +T.eq(out.myLead and out.myLead.hp, 3, + "carrying the damage the real party never took") +T.eq(out.theirLead and out.theirLead.species, "PIDGEY", + "and the copy of theirs") +T.check(session.exited, "the state unwinds afterwards, as it always did") +T.eq(session.battle, nil, "and the battle is released") + +-- the guest side says so +local guest = finishedSession("lose", false) +guest:update(0) +T.eq(run.loader.exports.outcome_probe.seen, 2, "the guest reports too") +T.eq(run.loader.exports.outcome_probe.role, "guest", "as the guest") +T.eq(run.loader.exports.outcome_probe.result, "lose", "with its own outcome") + +run.release() + +T.finish("link_battle_ended") diff --git a/tests/modkit/cases/world_talk.lua b/tests/modkit/cases/world_talk.lua new file mode 100644 index 00000000..7ae3c73f --- /dev/null +++ b/tests/modkit/cases/world_talk.lua @@ -0,0 +1,100 @@ +-- A sandboxed mod can claim the A press on an object it owns, using only +-- public mod surfaces, and an unhooked build still talks to it as before. +-- +-- The seam exists because a runtime object (WorldAPI:spawnNpc) carries no +-- TEXT_* id: the vanilla talk path has nothing to say for one, so a mod that +-- spawned it has to be able to answer instead. + +package.path = "./?.lua;./?/init.lua;" .. package.path +love = love or require("tests.love_stub") + +local T = require("tests.modkit") +local OverworldState = require("src.world.OverworldController") + +local FIXTURE = { + ["mods/talk_probe/manifest.json"] = [[{ + "id": "talk_probe", + "name": "Talk Probe", + "version": "1.0.0", + "entry": "main.lua", + "api": 2 + }]], + ["mods/talk_probe/main.lua"] = [[ + local mod = ... + mod.hooks:wrap("world.talk", function(next, ow, target) + if target and target.claimedByMod then + mod.exports.claimed = target.id + return -- deliberately not calling next(): the mod answers instead + end + return next(ow, target) + end) + ]], +} + +-- enough of an overworld to reach the A press: a player facing one cell, an +-- object standing on it, and a map with no counter to talk across +local function fixtureOverworld(npc) + local ow + ow = setmetatable({ + npcs = { npc }, + player = { + facing = "up", + facingCell = function() return 4, 5 end, + }, + map = { + id = "FIX_ROUTE", + isCounterCell = function() return false end, + }, + talked = {}, + }, { __index = OverworldState }) + -- the vanilla destination, recorded rather than run: talkTo walks into the + -- map's text tables, which a fixture map does not have + ow.talkTo = function(_, target) ow.talked[#ow.talked + 1] = target.id end + return ow +end + +local function objectAt(id, claimed) + return { id = id, cellX = 4, cellY = 5, targetX = 4, targetY = 5, + moving = false, claimedByMod = claimed or nil, def = {} } +end + +-- ------- no mod: the A press lands in the vanilla talk path + +local vanilla = T.sdk.loadNone({}) +local plain = fixtureOverworld(objectAt("SIGNPOST_MAN")) +plain:interact() +T.eq(#plain.talked, 1, "with no mod loaded the A press reaches talkTo") +T.eq(plain.talked[1], "SIGNPOST_MAN", "and it is handed the object it faced") +vanilla.release() + +-- ------- a mod that owns the object answers for it + +local run = T.sdk.loadMods({ "mods/talk_probe" }, { fs = T.sdk.memfs(FIXTURE) }) +T.eq(#run.errors, 0, + "the public talk probe loads clean (" .. tostring(run.errors[1]) .. ")") + +local owned = fixtureOverworld(objectAt("GHOST_PLAYER", true)) +owned:interact() +local out = run.loader.exports.talk_probe or {} +T.eq(out.claimed, "GHOST_PLAYER", "a public hook sees the object it owns") +T.eq(#owned.talked, 0, + "and a hook that does not call next keeps the vanilla text path out of it") + +-- ...while everything the mod does not own falls straight through +local other = fixtureOverworld(objectAt("NURSE_JOY")) +other:interact() +T.eq(#other.talked, 1, "an object the mod does not claim still reaches talkTo") +T.eq(other.talked[1], "NURSE_JOY", "unchanged") + +-- an object mid-step is not talkable in either build (walk_npc.asm), so the +-- hook must not fire for one either +local walking = fixtureOverworld(objectAt("WALKER", true)) +walking.npcs[1].moving = true +walking:interact() +T.eq(run.loader.exports.talk_probe.claimed, "GHOST_PLAYER", + "an object mid-step raises no talk hook") +T.eq(#walking.talked, 0, "and reaches no talk path at all") + +run.release() + +T.finish("world_talk") From b550db3abb6a3683b81999a84bbbc622211c4b7d Mon Sep 17 00:00:00 2001 From: "DESKTOP-8SRFDDM\\cam95" Date: Sun, 23 Aug 2026 10:35:12 -0500 Subject: [PATCH 17/33] rfc: guard the new seams and write RFC 0014 Route B in CONTRIBUTING-mods.md asks an event/hook change for five things. This adds the two that were missing and fixes what the third turned up. link.battle_ended built its payload unconditionally. Route B is explicit that a new event must not allocate when nothing wants it, and every other emit in the engine already guards -- Runtime.wants now gates this one too, so an unsubscribed build runs the branch exactly as it did. world.talk was handing Runtime.call a closure built fresh on every A press, purely to have a fallthrough to pass. It is a file-local now, so an unhooked press allocates nothing it did not allocate before. The RFC covers motivation, the API delta with call sites, migration (nothing changes for existing mods), and verification. The backward-compatibility statement is in it: every item is a new name or a new optional argument, and example_mew_starter -- api 1, category = "GAMEPLAY", whole-species copy -- still loads, which run_modkit proves on every run. No registry or schema field is added, so gen_registry_docs has nothing to emit for this change. Running it does show pre-existing drift in docs/modding/reference/registries.md (timeFishGroups, an objects refinement) from earlier Schemas.lua edits that were never regenerated; that is not this branch's to carry, so it is left alone. Co-Authored-By: Claude Fable 5 --- ...driven-actors-and-adopted-link-sessions.md | 158 ++++++++++++++++++ src/link/LinkState.lua | 2 +- src/world/OverworldController.lua | 7 +- tests/modkit/cases/link_battle_ended.lua | 4 + 4 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 docs/rfcs/0014-mod-driven-actors-and-adopted-link-sessions.md diff --git a/docs/rfcs/0014-mod-driven-actors-and-adopted-link-sessions.md b/docs/rfcs/0014-mod-driven-actors-and-adopted-link-sessions.md new file mode 100644 index 00000000..4294bcbe --- /dev/null +++ b/docs/rfcs/0014-mod-driven-actors-and-adopted-link-sessions.md @@ -0,0 +1,158 @@ +# RFC 0014: Mod-driven world actors and adopted link sessions + +## Status + +Proposed. + +## Motivation + +A mod can already spawn a runtime object with `mod.world:spawnNpc` and can +already start a link battle. It cannot make either of them behave like +something the mod itself owns. + +Three walls, each of which stops a mode rather than inconveniencing it: + +**An actor cannot move on its own schedule.** The only public way to animate a +spawned object is `Handle:scriptMove`, which queues onto +`OverworldState.scriptMoves`. A non-empty `scriptMoves` is how the overworld +knows a cutscene is running -- `handleInput` gates on it -- so anything +animated that way freezes the player's controls for as long as it walks. That +is correct for Oak marching into his lab and wrong for an ambient walker or a +networked player's ghost, which move continuously and must not lock anyone out. + +**A spawned object cannot answer the A press.** Talking is resolved from the +map's text tables by `TEXT_*` id. A runtime object has no id, so the vanilla +path has nothing to say for it, and the mod that created it has no way to say +anything either. + +**A link battle cannot ride a connection the mod already has.** `LinkState` +owns pairing, so a mode that already has a socket to its peer must either open +a second connection for the battle or reimplement lockstep. And when the +battle ends, cable rules leave the real party untouched, so the damage exists +only in the battle's own copies -- which are gone by the time the state +unwinds. A mode built on link battles cannot learn what the fight cost. + +The immediate consumer is an overworld multiplayer mode, but nothing here is +specific to it: the first two are wanted by any mod with an actor that moves +itself, and the third by any mode that runs battles over its own transport -- +a tournament ladder, a draft, a gauntlet. + +## The decision it extends + +This adds nothing to the compatibility surface's shape; it extends the +**additive, guarded seam convention** that Route B in `CONTRIBUTING-mods.md` +documents, and is gated by the parity guarantee `tests/engine/gate_meta_coverage.lua` +enforces ("21-testing-and-ci: a parity gate for every extension point"; M14). + +There is no in-repo D-number registry to amend; the consuming design lives +outside this repository, as it did for RFC 0011. + +## Exact API delta + +### New hook: `world.talk` + +```lua +mod.hooks:wrap("world.talk", function(next, ow, target) + -- ow = the OverworldState raising it + -- target = the object on the faced cell + if mine(target) then + say(target) + return -- the mod answered; the text path is skipped + end + return next(ow, target) -- anything else falls through unchanged +end) +``` + +Call site: `OverworldState:interact`, on the branch that has already resolved +an object on the faced cell (including across a counter) and confirmed it is +not mid-step and not the Pikachu follower. It runs before the map's text +tables are consulted. With no subscriber, `Runtime.call` invokes the vanilla +fallthrough, which is a file-local function rather than a per-press closure, +so an unhooked A press allocates nothing it did not allocate before. + +### New event: `link.battle_ended` + +```lua +mod.events:on("link.battle_ended", function(ev) + -- ev = { + -- result = "win" | "lose" | "draw" | "ended", + -- myParty = lockstep copy of our party, + -- theirParty = lockstep copy of theirs, + -- peerName = string, + -- role = "host" | "guest", + -- } +end) +``` + +Call site: `LinkState:update`, in the `battleRunning` stage, once the battle +state has been popped and before `exitWith` unwinds the link stack. Guarded by +`Runtime.wants("link.battle_ended")`, so with no subscriber no payload table +is allocated and the branch runs exactly as before. + +The party copies are the point of the event. They are the lockstep records the +battle actually fought with, which is where the damage lives under cable rules. + +### New `WorldAPI` handle methods + +```lua +handle:stepNow(dir) --> true when the step started +handle:canStep(dir) --> would stepNow land somewhere legal? +handle:placeAt(x, y, dir) --> snap, no animation, clears a step in flight +handle:isMoving() --> true while a step is animating +handle:setPassable(flag) --> may the player walk through this object? +``` + +`stepNow` sets the same per-tile state `scriptMove` does, without the queue and +therefore without the input lockout. It does **not** consult collision: the +intended caller is replaying a move already decided elsewhere (validated on a +peer, or authored), and re-judging it locally would let two copies of the same +actor disagree about where it is. `canStep` is the separate opinion for callers +that want it. `setPassable` sets the flag `Collision.occupied` already honours +for Yellow's companion Pikachu; a passable object still draws and still talks. + +### Two supporting changes + +`Game:startNewGame(opts)` -- the title screen's NEW GAME closure, made callable, +with `opts.intro = false` to land directly in the world. A mode that issues its +own starting state has no use for the intro cutscene. + +`CodeEntry.new(shape)` -- accepts an optional `{ length =, charset = }`, so the +slot-scrub widget that enters a link code can also carry a room code or a +host:port address. Called with no argument it is byte-for-byte the previous +widget. + +## Migration and compatibility + +**Existing mods change nothing.** Every item above is a new name or a new +optional argument; no existing name, payload, signature, or default changes. + +The v1 surface is unaffected: `content.X:register/override/get`, `events:on`, +`hooks:wrap`, `mod.log`, `mod:read`, the manifest v1 fields and +`pokemon.before_give` all behave as before. `mods/example_mew_starter` -- api 1, +`category = "GAMEPLAY"`, whole-species copy -- loads unchanged, which +`tests/run_modkit.lua` proves on every run. + +With no subscriber to either seam, Red, Blue, Yellow, Gold and Silver behave +exactly as they did: the A press reaches `talkTo`, the link battle unwinds +without building an event payload, and no handle method is reachable unless a +mod calls it. + +## Verification + +- `tests/modkit/cases/world_talk.lua` drives the real `OverworldState:interact` + path. It asserts the unhooked build first (the A press reaches `talkTo`), + then that a mod owning the object suppresses the text path by not calling + `next`, that an object the mod ignores still falls through, and that an + object mid-step raises no hook at all. +- `tests/modkit/cases/link_battle_ended.lua` drives the real `LinkState:update` + path. It asserts that with nothing subscribed the event is not wanted (so no + payload is built) and the battle still unwinds, then that a subscriber + receives the result, the role, the peer name and both party copies including + the damage the real party never took, from both sides of the cable. +- `tests/engine/gate_hooks.lua` and `tests/engine/gate_events.lua` walk the live + catalog, so both seams are parity-gated structurally; `gate_meta_coverage` + passes 208/208 with both names covered and no DEBT entry added. + +## Deprecation etiquette + +Nothing is removed, renamed, superseded or deprecated. diff --git a/src/link/LinkState.lua b/src/link/LinkState.lua index 44ae1841..9e119a5d 100644 --- a/src/link/LinkState.lua +++ b/src/link/LinkState.lua @@ -544,7 +544,7 @@ function LinkState:update(dt) -- (cable rules), so a mode that wants it -- a tournament ladder, a -- battle royale -- reads it from here before the state unwinds local battle = self.battle - if battle then + if battle and Runtime.wants("link.battle_ended") then Runtime.emit("link.battle_ended", { result = battle.result or "ended", myParty = battle.playerParty, diff --git a/src/world/OverworldController.lua b/src/world/OverworldController.lua index 47dda17e..4696f9fa 100644 --- a/src/world/OverworldController.lua +++ b/src/world/OverworldController.lua @@ -1964,6 +1964,10 @@ function OverworldState:pushableAtCell(cx, cy) return nil end +-- world.talk's fallthrough, hoisted so the A press does not build a closure +-- on every press just to have one to hand a hook nobody may have wrapped +local function vanillaTalk(ow, target) ow:talkTo(target) end + -- what the A press resolved to, for world.interacted's listeners local function interacted(self, fx, fy, kind, target) Runtime.emit("world.interacted", { mapId = self.map.id, x = fx, y = fy, @@ -1998,8 +2002,7 @@ function OverworldState:interact() -- no TEXT_* id, so the vanilla path has nothing to say for it; a mod -- that owns the object wraps this and simply does not call next(). -- Everything else falls straight through to talkTo as before. - Runtime.call("world.talk", function(ow, target) ow:talkTo(target) end, - self, npc) + Runtime.call("world.talk", vanillaTalk, self, npc) end interacted(self, fx, fy, "npc", npc) return diff --git a/tests/modkit/cases/link_battle_ended.lua b/tests/modkit/cases/link_battle_ended.lua index 93c5ff9c..c27916fe 100644 --- a/tests/modkit/cases/link_battle_ended.lua +++ b/tests/modkit/cases/link_battle_ended.lua @@ -58,7 +58,11 @@ end -- ------- no mod: the battle still ends, nothing observes it +local Runtime = require("src.mods.Runtime") + local vanilla = T.sdk.loadNone({}) +T.check(not Runtime.wants("link.battle_ended"), + "with nothing subscribed the event is not wanted, so no payload is built") local quiet = finishedSession("win", true) quiet:update(0) T.check(quiet.exited, "with no mod loaded the finished battle still unwinds") From 5807b8d83688e91a39895285118776b192e19076 Mon Sep 17 00:00:00 2001 From: 1jamie Date: Sun, 23 Aug 2026 10:46:19 -0500 Subject: [PATCH 18/33] Refactor session management and resource cleanup - Replaced `teardownMountedSession` and `flushEditorPackageLoaded` with a unified `SessionLifecycle` approach for managing session transitions and resource cleanup. - Implemented `SessionLifecycle.endEditorSession` and `SessionLifecycle.endGameSession` to streamline the teardown process for editor and game sessions. - Introduced `Assets.releaseSession` to handle GPU resource release at session end, ensuring efficient memory management. - Updated `Game` and `Game2` reset methods to include world and canvas resource releases. - Enhanced `MapLoader` with a new `releaseAll` method for eager GPU cache cleanup. - Added tests to verify the new session lifecycle functionality and resource management. This commit improves the stability and performance of in-process transitions, particularly during editor and game session changes. further improves and addresses #1662 specifically around android gc pressure. --- main.lua | 99 ++------------ src/core/ChipAudio.lua | 4 +- src/core/Game.lua | 13 ++ src/core/Game2.lua | 16 +++ src/core/SessionLifecycle.lua | 101 +++++++++++++++ src/net/Fetch.lua | 4 +- src/render/Assets.lua | 27 +++- src/render/Renderer.lua | 2 + src/update/Check.lua | 4 +- src/world/MapLoader.lua | 17 ++- src/world/OverworldController.lua | 5 + src/world/gen2/World.lua | 31 +++++ tests/engine/android_host_extension_test.lua | 9 +- .../engine/launcher_session_teardown_test.lua | 121 ++++++++++++++---- tests/engine/quit_thread_shutdown.lua | 19 ++- tests/mod_graphics_tests.lua | 12 ++ 16 files changed, 353 insertions(+), 131 deletions(-) create mode 100644 src/core/SessionLifecycle.lua diff --git a/main.lua b/main.lua index 7b6fba4c..62175e4d 100644 --- a/main.lua +++ b/main.lua @@ -84,40 +84,8 @@ local closeEditor -- forward declaration: openEditor hands it to the editor -- Drop CacheFs / Data / mod Runtime / Assets / LegacyCompat for one mounted -- version session (save editor or game). closeEditor and returnToLauncher --- both go through here so neither path can forget a singleton the other resets. -local function teardownMountedSession(version) - if version then - require("src.import.CacheFs").unmountVersion(version) - end - require("src.core.Data"):unloadGenerated() - local Runtime = require("src.mods.Runtime") - if Runtime.reset then Runtime.reset() end - local Assets = require("src.render.Assets") - if Assets.installLoader then Assets.installLoader(nil) end - local okCompat, LegacyCompat = pcall(require, "src.mods.LegacyCompat") - if okCompat and LegacyCompat.reset then LegacyCompat.reset() end -end - --- Evict every save-editor module from package.loaded without a hardcoded --- panel whitelist. Flat require names (App, Party, …) resolve under --- tools/save-editor/; path-style keys may also appear. A key is flushed --- when it names a save-editor path or when tools/save-editor/{panels/}K.lua --- exists for a flat name K -- new panels are picked up automatically. -local function flushEditorPackageLoaded() - local fs = love and love.filesystem - local function isEditorFlat(name) - if not (fs and fs.getInfo) then return false end - if name:find("[./]") then return false end - return fs.getInfo("tools/save-editor/" .. name .. ".lua") ~= nil - or fs.getInfo("tools/save-editor/panels/" .. name .. ".lua") ~= nil - end - for k in pairs(package.loaded) do - if type(k) == "string" - and (k:find("save%-editor", 1, false) or isEditorFlat(k)) then - package.loaded[k] = nil - end - end -end +-- both go through SessionLifecycle so neither path forgets a singleton. +local SessionLifecycle = require("src.core.SessionLifecycle") -- The editor's modules use flat names (require("Kit"), require("Party")), so -- their directories have to be on the require path. It must be @@ -194,9 +162,7 @@ local function openEditor(version, slotId) local okReq, appOrErr = pcall(require, "App") if not okReq then editorMode = false - if version then - require("src.import.CacheFs").unmountVersion(version) - end + SessionLifecycle.endEditorSession({ version = version, app = nil }) restoreWindow() Importer = editorHost editorHost = nil @@ -216,10 +182,7 @@ local function openEditor(version, slotId) editorMode = false if EditorApp.unload then pcall(EditorApp.unload) end EditorApp = nil - if version then - teardownMountedSession(version) - end - flushEditorPackageLoaded() + SessionLifecycle.endEditorSession({ version = version, app = nil }) restoreWindow() Importer = editorHost editorHost = nil @@ -238,13 +201,10 @@ end -- next Edit or Play does not inherit the editor's dead mod loader. function closeEditor() local version = editorVersion + local app = EditorApp editorMode = false - if EditorApp and EditorApp.unload then EditorApp.unload() end EditorApp = nil - if version then - teardownMountedSession(version) - end - flushEditorPackageLoaded() + SessionLifecycle.endEditorSession({ version = version, app = app }) editorVersion = nil restoreWindow() Importer = editorHost @@ -345,40 +305,14 @@ end local function returnToLauncher() if not Game then return end - pcall(function() require("src.core.Music").stop() end) - pcall(function() require("src.core.Sound").stop() end) - if package.loaded["src.core.ChipAudio"] then - pcall(package.loaded["src.core.ChipAudio"].shutdown) - end - if package.loaded["src.core.DiscordPresence"] then - pcall(package.loaded["src.core.DiscordPresence"].shutdown) - end - if package.loaded["src.core.gen2.Clock"] then - pcall(package.loaded["src.core.gen2.Clock"].shutdown) - end - if package.loaded["src.net.Gen1Tls"] then - pcall(package.loaded["src.net.Gen1Tls"].shutdown) - end - if love.audio and love.audio.stop then - pcall(love.audio.stop) - end - pcall(function() require("src.render.SecondScreen").setEnabled(false) end) - local GameVersion = require("src.core.GameVersion") local currentVersion = GameVersion.get() - teardownMountedSession(currentVersion) - - if Game.reset then - pcall(function() Game:reset() end) - end + SessionLifecycle.endGameSession(Game) Game = nil autopilot = nil driverCo = nil - local Input = require("src.core.Input") - local TouchControls = require("src.core.TouchControls") - Input:reset() - TouchControls:reset() + SessionLifecycle.endMountedSession(currentVersion) require("src.core.Orientation").applyOptions( require("src.core.SaveData").loadOptions()) @@ -1181,22 +1115,7 @@ function love.quit() pcall(function() require("src.core.DiscordPresence").shutdown() end) - -- LOVE waits for every live love.thread before the process exits, and both - -- background workers idle in a loop that only a "quit" command breaks, so - -- without this the process outlived the window and the next launch re-entered - -- the dead one instead of starting fresh (#339) - if package.loaded["src.core.ChipAudio"] then - pcall(package.loaded["src.core.ChipAudio"].shutdown) - end - if package.loaded["src.update.Check"] then - pcall(package.loaded["src.update.Check"].shutdown) - end - -- The launcher's fetch pool is the same story: its workers idle in - -- Channel:demand(), which never returns on its own, so a launcher that ever - -- touched the network would hang the process on exit (#339's shape again). - if package.loaded["src.net.Fetch"] then - pcall(package.loaded["src.net.Fetch"].shutdown) - end + SessionLifecycle.endProcess() end function love.filedropped(file) diff --git a/src/core/ChipAudio.lua b/src/core/ChipAudio.lua index b7b09faa..ef07d40e 100644 --- a/src/core/ChipAudio.lua +++ b/src/core/ChipAudio.lua @@ -371,7 +371,7 @@ function ChipAudio.shutdown() if workerReady and cmdCh then cmdCh:push({ cmd = "quit" }) end if worker then pcall(function() worker:wait() end) end worker, cmdCh, outCh = nil, nil, nil - workerReady = false + workerReady = nil end function ChipAudio.currentSource() @@ -498,6 +498,8 @@ end -- program (20 §2 cache contract, chip music row) Assets.register(ChipAudio.invalidate) +require("src.core.SessionLifecycle").registerProcessShutdown(ChipAudio.shutdown) + -- --------------------------------------------------------------------------- -- one-shot effects (SFX, cries, low-health alarm): synchronous static Sources -- --------------------------------------------------------------------------- diff --git a/src/core/Game.lua b/src/core/Game.lua index b1b730b9..71ae4d68 100644 --- a/src/core/Game.lua +++ b/src/core/Game.lua @@ -1389,12 +1389,25 @@ function Game:reset() if self.stack and self.stack.clear then pcall(function() self.stack:clear() end) end + if self.world and self.world.release then + pcall(function() self.world:release() end) + end + if self._canvases then + for _, canvas in pairs(self._canvases) do + if canvas and canvas.release then pcall(canvas.release, canvas) end + end + end if self.renderer and self.renderer.releaseCanvases then pcall(function() self.renderer:releaseCanvases() end) end local keys = {} for key, value in pairs(self) do if type(value) ~= "function" then + if key ~= "world" and key ~= "renderer" and key ~= "_canvases" then + if type(value) == "table" and value.release then + pcall(value.release, value) + end + end keys[#keys + 1] = key end end diff --git a/src/core/Game2.lua b/src/core/Game2.lua index 4ab8a479..145c97ed 100644 --- a/src/core/Game2.lua +++ b/src/core/Game2.lua @@ -2130,9 +2130,25 @@ function Game2:reset() if self.stack and self.stack.clear then pcall(function() self.stack:clear() end) end + if self.world and self.world.release then + pcall(function() self.world:release() end) + end + if self._canvases then + for _, canvas in pairs(self._canvases) do + if canvas and canvas.release then pcall(canvas.release, canvas) end + end + end + if self.renderer and self.renderer.releaseCanvases then + pcall(function() self.renderer:releaseCanvases() end) + end local keys = {} for key, value in pairs(self) do if type(value) ~= "function" then + if key ~= "world" and key ~= "renderer" and key ~= "_canvases" then + if type(value) == "table" and value.release then + pcall(value.release, value) + end + end keys[#keys + 1] = key end end diff --git a/src/core/SessionLifecycle.lua b/src/core/SessionLifecycle.lua new file mode 100644 index 00000000..84508a67 --- /dev/null +++ b/src/core/SessionLifecycle.lua @@ -0,0 +1,101 @@ +-- Central session lifecycle orchestrator. Subsystems register teardown hooks +-- at module load (Assets release/invalidate bus, process shutdown below); the +-- host only calls phase entry points. +-- +-- Three tiers: +-- mount endMountedSession — GPU release + CacheFs/Data/Runtime/Assets +-- game endGameSession — audio + game:reset; workers stay alive +-- process endProcess — worker shutdown on real app exit (love.quit) +-- +-- Hot reload (Assets.flush / installLoader) stays invalidate-only forever. + +local SessionLifecycle = {} + +local processShutdowns = {} + +function SessionLifecycle.registerProcessShutdown(fn) + processShutdowns[#processShutdowns + 1] = fn +end + +-- Drop CacheFs / Data / mod Runtime / Assets / LegacyCompat for one mounted +-- version session (save editor or game). GPU release runs before soft +-- invalidate via installLoader(nil). +function SessionLifecycle.endMountedSession(version) + local Assets = require("src.render.Assets") + if Assets.releaseSession then Assets.releaseSession() end + if version then + require("src.import.CacheFs").unmountVersion(version) + end + require("src.core.Data"):unloadGenerated() + local Runtime = require("src.mods.Runtime") + if Runtime.reset then Runtime.reset() end + if Assets.installLoader then Assets.installLoader(nil) end + local okCompat, LegacyCompat = pcall(require, "src.mods.LegacyCompat") + if okCompat and LegacyCompat.reset then LegacyCompat.reset() end +end + +-- Evict every save-editor module from package.loaded without a hardcoded +-- panel whitelist. Flat require names (App, Party, …) resolve under +-- tools/save-editor/; path-style keys may also appear. +local function flushEditorPackageLoaded() + local fs = love and love.filesystem + local function isEditorFlat(name) + if not (fs and fs.getInfo) then return false end + if name:find("[./]") then return false end + return fs.getInfo("tools/save-editor/" .. name .. ".lua") ~= nil + or fs.getInfo("tools/save-editor/panels/" .. name .. ".lua") ~= nil + end + for k in pairs(package.loaded) do + if type(k) == "string" + and (k:find("save%-editor", 1, false) or isEditorFlat(k)) then + package.loaded[k] = nil + end + end +end + +function SessionLifecycle.endEditorSession(opts) + opts = opts or {} + if opts.app and opts.app.unload then pcall(opts.app.unload) end + flushEditorPackageLoaded() + if opts.version then + SessionLifecycle.endMountedSession(opts.version) + end +end + +-- EXIT GAME / intent_game before dropping Game. Stops audio and resets the +-- live game instance so map/GPU holders are gone before endMountedSession. +function SessionLifecycle.endGameSession(game) + pcall(function() require("src.core.Music").stop() end) + pcall(function() require("src.core.Sound").stop() end) + if package.loaded["src.core.ChipAudio"] then + pcall(package.loaded["src.core.ChipAudio"].shutdown) + end + if package.loaded["src.core.DiscordPresence"] then + pcall(package.loaded["src.core.DiscordPresence"].shutdown) + end + if package.loaded["src.core.gen2.Clock"] then + pcall(package.loaded["src.core.gen2.Clock"].shutdown) + end + if package.loaded["src.net.Gen1Tls"] then + pcall(package.loaded["src.net.Gen1Tls"].shutdown) + end + if love.audio and love.audio.stop then + pcall(love.audio.stop) + end + pcall(function() require("src.render.SecondScreen").setEnabled(false) end) + + if game and game.reset then + pcall(function() game:reset() end) + end + + local Input = require("src.core.Input") + local TouchControls = require("src.core.TouchControls") + Input:reset() + TouchControls:reset() +end + +function SessionLifecycle.endProcess() + for _, fn in ipairs(processShutdowns) do pcall(fn) end +end + +return SessionLifecycle diff --git a/src/net/Fetch.lua b/src/net/Fetch.lua index 2a987125..9e8562cf 100644 --- a/src/net/Fetch.lua +++ b/src/net/Fetch.lua @@ -227,7 +227,9 @@ function Fetch.shutdown() end for _, th in ipairs(workers) do pcall(function() th:wait() end) end workers = {} - cmdCh, resCh, quitCh, ready = nil, nil, nil, false + cmdCh, resCh, quitCh, ready = nil, nil, nil, nil end +require("src.core.SessionLifecycle").registerProcessShutdown(Fetch.shutdown) + return Fetch diff --git a/src/render/Assets.lua b/src/render/Assets.lua index afcc577b..3469d0f1 100644 --- a/src/render/Assets.lua +++ b/src/render/Assets.lua @@ -14,6 +14,8 @@ local Assets = {} local cache = {} -- downstream caches that must empty when the search path changes local invalidators = {} +-- optional GPU release hooks for session end (never run on hot reload flush) +local releasers = {} -- The loader bridge: overrideOrder() yields mods highest-priority-first -- and derivedPath(rel) yields an existing save/mod-derived//. @@ -68,8 +70,18 @@ function Assets.imageData(path) return love.image.newImageData(Assets.resolve(path)) end -function Assets.register(invalidate) - invalidators[#invalidators + 1] = invalidate +-- Register a cache invalidator, or { invalidate = fn, release = fn } when a +-- module caches LOVE Images/Canvases and can eagerly free them at session end. +-- release is optional and is NOT run on flush/invalidate (HotReload safe). +-- MapLoader is the canonical split-hook example: invalidateAll clears tables +-- without GPU release; releaseAll evicts every resident map renderer. +function Assets.register(hooks) + if type(hooks) == "function" then + invalidators[#invalidators + 1] = hooks + return + end + if hooks.invalidate then invalidators[#invalidators + 1] = hooks.invalidate end + if hooks.release then releasers[#releasers + 1] = hooks.release end end -- hot reload's single entry point (20-developer-tooling): drop the central @@ -82,6 +94,17 @@ end Assets.flush = Assets.invalidate +-- In-process return-to-launcher / editor close: release central Images and +-- run release hooks only. Does not call invalidate hooks (MapLoader must +-- keep invalidateAll separate from releaseAll). +function Assets.releaseSession() + for _, img in pairs(cache) do + if img and img.release then pcall(img.release, img) end + end + cache = {} + for _, fn in ipairs(releasers) do pcall(fn) end +end + -- Loader:load hands over the live mod set once the merge is done. Load -- order is priority ascending, so the search walks it backwards: the mod -- that wins the record merge wins the asset lookup too. diff --git a/src/render/Renderer.lua b/src/render/Renderer.lua index 5ed14d47..08ddbe21 100644 --- a/src/render/Renderer.lua +++ b/src/render/Renderer.lua @@ -117,6 +117,8 @@ function Renderer:releaseCanvases() self.worldOverride = nil end +Renderer.release = Renderer.releaseCanvases + function Renderer:init() -- 160x144 real pixels, never DPI-scaled: see src/render/PixelCanvas.lua -- (#208). Every canvas below is sized in framebuffer pixels for the same diff --git a/src/update/Check.lua b/src/update/Check.lua index b918f2f3..938889e0 100644 --- a/src/update/Check.lua +++ b/src/update/Check.lua @@ -343,7 +343,9 @@ function Check.shutdown() if cmdCh then cmdCh:push({ cmd = "quit" }) end if worker then pcall(function() worker:wait() end) end worker, cmdCh, stateCh = nil, nil, nil - workerReady = false + workerReady = nil end +require("src.core.SessionLifecycle").registerProcessShutdown(Check.shutdown) + return Check diff --git a/src/world/MapLoader.lua b/src/world/MapLoader.lua index 0452fec0..c52e3ed4 100644 --- a/src/world/MapLoader.lua +++ b/src/world/MapLoader.lua @@ -114,12 +114,25 @@ function MapLoader.invalidateAll() lru = {} end +-- Eagerly release every resident map's TileRenderer GPU objects. Only safe +-- when nothing live holds map instances (session end after game:reset). +function MapLoader.releaseAll() + local ids = {} + for id in pairs(cache) do ids[#ids + 1] = id end + for _, id in ipairs(ids) do MapLoader.evict(id) end +end + -- kept as the pre-v2 name MapLoader.clearCache = MapLoader.invalidateAll -- the cached Map objects own the per-map TileRenderer instances, so a flush -- that skipped this one would leave live SpriteBatches built from the old --- search path (14 cache-invalidation contract, rows 1 and 3) -Assets.register(MapLoader.invalidateAll) +-- search path (14 cache-invalidation contract, rows 1 and 3). invalidateAll +-- deliberately does NOT release GPU (hot reload / live overworld); releaseAll +-- is the session-end path only. +Assets.register({ + invalidate = MapLoader.invalidateAll, + release = MapLoader.releaseAll, +}) return MapLoader diff --git a/src/world/OverworldController.lua b/src/world/OverworldController.lua index e0391b3f..1f02377d 100644 --- a/src/world/OverworldController.lua +++ b/src/world/OverworldController.lua @@ -228,6 +228,11 @@ function OverworldState.computeNeighbors(maps, rootId, hops, reachW, reachH) return out end +function OverworldState:exit() + self.map = nil + self.neighbors = nil +end + function OverworldState:enter(mapId, x, y, facing, opts) Game = require("src.core.Game") Game.overworld = self diff --git a/src/world/gen2/World.lua b/src/world/gen2/World.lua index ef84997a..ec83fa7b 100644 --- a/src/world/gen2/World.lua +++ b/src/world/gen2/World.lua @@ -5257,6 +5257,37 @@ function World:dropMapImages(mapId) if self.connectionMaps then self.connectionMaps[mapId] = nil end end +local function safeRelease(obj) + if obj and obj ~= false and obj.release then pcall(obj.release, obj) end +end + +-- Eagerly free session-owned GPU caches. Assets.image-backed atlases are +-- nilled without release; unique bakes, strips, and roof composites are released. +function World:release() + if self.mapImages then + for _, img in pairs(self.mapImages) do safeRelease(img) end + self.mapImages = {} + end + if self.scrollStrips then + for _, strip in pairs(self.scrollStrips) do safeRelease(strip) end + self.scrollStrips = {} + end + safeRelease(self.tiltCanvas) + self.tiltCanvas = nil + if self.grassAtlases then + for _, atlas in pairs(self.grassAtlases) do safeRelease(atlas) end + self.grassAtlases = {} + end + if self.atlasCache then + for key, atlas in pairs(self.atlasCache) do + if key:find("|", 1, true) then safeRelease(atlas) end + end + self.atlasCache = {} + end + self.animQuads = nil + self.connectionMaps = nil +end + -- LoadMapAttributes' refill, for every map the session has edited. Neighbour -- strips share the same buffer on the cart, so a connection crossing reloads -- them too: this runs on any setMap, seamless or not. diff --git a/tests/engine/android_host_extension_test.lua b/tests/engine/android_host_extension_test.lua index 4033cbed..efe7a839 100644 --- a/tests/engine/android_host_extension_test.lua +++ b/tests/engine/android_host_extension_test.lua @@ -88,8 +88,13 @@ check(destroy < destroyTeardown and destroyTeardown < destroySuper, local mainFile = assert(io.open("main.lua", "rb")) local main = mainFile:read("*a") mainFile:close() -check(main:find('require("src.render.SecondScreen").setEnabled(false)', 1, true), - "returning from a game disables mod-owned secondary output") +check(main:find("SessionLifecycle.endGameSession", 1, true), + "returning from a game goes through SessionLifecycle.endGameSession") +local lifecycleFile = assert(io.open("src/core/SessionLifecycle.lua", "rb")) +local lifecycle = lifecycleFile:read("*a") +lifecycleFile:close() +check(lifecycle:find('require("src.render.SecondScreen").setEnabled(false)', 1, true), + "endGameSession disables mod-owned secondary output") check(not source:lower():find("openxr", 1, true), "generic Android activity must not require OpenXR") diff --git a/tests/engine/launcher_session_teardown_test.lua b/tests/engine/launcher_session_teardown_test.lua index 6ceee3e2..e63d3fd7 100644 --- a/tests/engine/launcher_session_teardown_test.lua +++ b/tests/engine/launcher_session_teardown_test.lua @@ -1,5 +1,5 @@ -- In-process launcher session teardown: Game:reset, Renderer canvas release, --- Runtime/Assets/LegacyCompat cleanup, and editor package.loaded discovery flush. +-- SessionLifecycle mount/game tiers, and editor package.loaded discovery flush. -- luajit tests/engine/launcher_session_teardown_test.lua package.path = "./?.lua;./?/init.lua;" .. package.path @@ -12,8 +12,12 @@ local Runtime = require("src.mods.Runtime") local Assets = require("src.render.Assets") local LegacyCompat = require("src.mods.LegacyCompat") local Game = require("src.core.Game") +local Game2 = require("src.core.Game2") local Renderer = require("src.render.Renderer") local StateStack = require("src.core.StateStack") +local SessionLifecycle = require("src.core.SessionLifecycle") +local MapLoader = require("src.world.MapLoader") +local World = require("src.world.gen2.World") -- ---- Game:reset drops instance state, keeps methods ---------------------- do @@ -38,6 +42,35 @@ do check(StateStack:top() == nil, "Game:reset cleared the shared StateStack") end +-- ---- Game2:reset releases world GPU and present canvases ------------------ +do + local game2 = Game2.new() + local canvas = love.graphics.newCanvas(4, 4) + game2.world = World.new({}) + game2.world.mapImages = { ["MAP|d|1"] = canvas } + game2._canvases = { love.graphics.newCanvas(8, 8) } + game2:reset() + check(canvas.released == true, "Game2:reset releases World mapImages") + check(game2.world == nil, "Game2:reset clears world reference") + check(game2._canvases == nil, "Game2:reset clears _canvases") +end + +-- ---- World:release frees owned GPU caches -------------------------------- +do + local world = World.new({}) + local bake = love.graphics.newCanvas(16, 16) + local strip = love.graphics.newCanvas(8, 64) + local tilt = love.graphics.newCanvas(160, 144) + world.mapImages = { ["R1|DAY|1"] = bake } + world.scrollStrips = { ["TS|1|0,0"] = strip } + world.tiltCanvas = tilt + world:release() + check(bake.released == true, "World:release frees map bake canvases") + check(strip.released == true, "World:release frees scroll strips") + check(tilt.released == true, "World:release frees tiltCanvas") + eq(next(world.mapImages), nil, "World:release clears mapImages table") +end + -- ---- Renderer:init releases prior canvases before realloc ---------------- do local first = love.graphics.newCanvas(16, 16) @@ -52,14 +85,13 @@ do "Renderer:init allocates a fresh primary canvas") check(Renderer.canvas.released ~= true, "the new primary canvas is not released") - -- second init also releases the one just created local second = Renderer.canvas Renderer:init() check(second.released == true, "a second Renderer:init releases the canvas from the prior init") end --- ---- Shared singleton teardown contract (closeEditor / returnToLauncher) +-- ---- SessionLifecycle.endMountedSession (closeEditor / returnToLauncher) -- do Runtime.install({ emit = function() end }, { call = function() end }, { "e" }) Assets.installLoader({ @@ -68,44 +100,79 @@ do }) LegacyCompat.reports = { some_mod = { order = {} } } - -- Mirrors main.lua teardownMountedSession without mounting CacheFs. - require("src.core.Data"):unloadGenerated() - Runtime.reset() - Assets.installLoader(nil) - LegacyCompat.reset() + SessionLifecycle.endMountedSession(nil) - check(Runtime.errors == nil, "teardown clears Runtime.errors") - check(Assets.loader == nil, "teardown clears Assets.loader") - eq(next(LegacyCompat.reports), nil, "teardown clears LegacyCompat.reports") + check(Runtime.errors == nil, "endMountedSession clears Runtime.errors") + check(Assets.loader == nil, "endMountedSession clears Assets.loader") + eq(next(LegacyCompat.reports), nil, "endMountedSession clears LegacyCompat.reports") end --- ---- Editor package.loaded discovery flush (no panel whitelist) --------- +-- ---- releaseSession empties MapLoader via releaseAll, not flush ------------- +do + local data = { + maps = { T1 = { id = "T1", tileset = "TS", width = 1, height = 1, + blocks = { 0 }, borderBlock = 0, objects = {}, warps = {}, signs = {} } }, + tilesets = { TS = { id = "TS", image = "assets/generated/t.png", + walkable = {}, blocks = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }, + tilesPerRow = 1 } }, + } + MapLoader.load(data, "T1") + check(MapLoader.cached("T1") ~= nil, "MapLoader holds a map before release") + Assets.releaseSession() + check(MapLoader.cached("T1") == nil, + "releaseSession evicts MapLoader via releaseAll") +end + +-- ---- Editor package.loaded discovery flush via endEditorSession ----------- do love.filesystem.write("tools/save-editor/App.lua", "return {}") love.filesystem.write("tools/save-editor/panels/NewPanel.lua", "return {}") package.loaded["App"] = { stale = true } package.loaded["NewPanel"] = { stale = true } - package.loaded["src.core.Data"] = package.loaded["src.core.Data"] -- keep + package.loaded["src.core.Data"] = package.loaded["src.core.Data"] - local function isEditorFlat(name) - if name:find("[./]") then return false end - return love.filesystem.getInfo("tools/save-editor/" .. name .. ".lua") ~= nil - or love.filesystem.getInfo("tools/save-editor/panels/" .. name .. ".lua") ~= nil - end - for k in pairs(package.loaded) do - if type(k) == "string" - and (k:find("save%-editor", 1, false) or isEditorFlat(k)) then - package.loaded[k] = nil - end - end + SessionLifecycle.endEditorSession({ version = nil, app = nil }) - check(package.loaded["App"] == nil, "discovery flush drops flat App") + check(package.loaded["App"] == nil, "endEditorSession drops flat App") check(package.loaded["NewPanel"] == nil, - "discovery flush drops a new panel without a hardcoded list") + "endEditorSession drops a new panel without a hardcoded list") check(package.loaded["src.core.Data"] ~= nil, - "discovery flush leaves engine modules alone") + "endEditorSession leaves engine modules alone") love.filesystem.remove("tools/save-editor/App.lua") love.filesystem.remove("tools/save-editor/panels/NewPanel.lua") end +-- ---- Fetch shutdown clears ready so Play-again can respawn workers --------- +do + local Fetch = require("src.net.Fetch") + local spawnAttempts = 0 + love.thread = love.thread or {} + local savedNewThread = love.thread.newThread + local savedGetChannel = love.thread.getChannel + love.thread.getChannel = function() + return { + clear = function() end, + push = function() end, + pop = function() return nil end, + demand = function() end, + } + end + love.thread.newThread = function() + spawnAttempts = spawnAttempts + 1 + return { + start = function() end, + wait = function() end, + getError = function() return nil end, + } + end + Fetch.available() + local afterFirst = spawnAttempts + Fetch.shutdown() + Fetch.available() + check(spawnAttempts > afterFirst, + "Fetch.available retries worker spawn after shutdown (ready=nil)") + love.thread.newThread = savedNewThread + love.thread.getChannel = savedGetChannel +end + T.finish("launcher_session_teardown_test") diff --git a/tests/engine/quit_thread_shutdown.lua b/tests/engine/quit_thread_shutdown.lua index a0dff35b..4f8a3589 100644 --- a/tests/engine/quit_thread_shutdown.lua +++ b/tests/engine/quit_thread_shutdown.lua @@ -182,11 +182,20 @@ check(checkSrc:match('cmd%.cmd == "quit"%s*then%s*\n%s*break') ~= nil, local mainSrc = source("main.lua") local quitHook = mainSrc:match("\nfunction love%.quit%(%).-\nend\n") check(quitHook ~= nil, "love.quit is still a single top-level function") -quitHook = quitHook or "" -check(quitHook:find('package.loaded["src.core.ChipAudio"].shutdown', 1, true) ~= nil, - "love.quit shuts the chip worker down") -check(quitHook:find('package.loaded["src.update.Check"].shutdown', 1, true) ~= nil, - "love.quit shuts the update worker down") +check(mainSrc:find("SessionLifecycle.endProcess()", 1, true) ~= nil, + "love.quit shuts workers down via SessionLifecycle.endProcess") + +local lifecycleSrc = source("src/core/SessionLifecycle.lua") +check(lifecycleSrc:find("registerProcessShutdown", 1, true) ~= nil, + "SessionLifecycle exposes registerProcessShutdown") +check(lifecycleSrc:find("function SessionLifecycle.endProcess()", 1, true) ~= nil, + "SessionLifecycle.endProcess fans out registered hooks") +check(source("src/core/ChipAudio.lua"):find("registerProcessShutdown(ChipAudio.shutdown)", 1, true) ~= nil, + "ChipAudio registers its shutdown hook at load") +check(source("src/update/Check.lua"):find("registerProcessShutdown(Check.shutdown)", 1, true) ~= nil, + "Check registers its shutdown hook at load") +check(source("src/net/Fetch.lua"):find("registerProcessShutdown(Fetch.shutdown)", 1, true) ~= nil, + "Fetch registers its shutdown hook at load") -- The Android half: LOVE keeps the JVM process after the native main returns, -- so the quit event exits the process outright. It has to sit after the diff --git a/tests/mod_graphics_tests.lua b/tests/mod_graphics_tests.lua index 5b9ff89d..f60ac7d1 100644 --- a/tests/mod_graphics_tests.lua +++ b/tests/mod_graphics_tests.lua @@ -218,8 +218,12 @@ for name, module in pairs({ Assets = Assets, TileRenderer = TileRenderer, end check(type(require("src.world.MapLoader").invalidateAll) == "function", "MapLoader keeps its wave-1 invalidateAll") +check(type(require("src.world.MapLoader").releaseAll) == "function", + "MapLoader exposes releaseAll for session end") check(type(require("src.core.Sound").invalidate) == "function", "Sound keeps its wave-1 invalidate") +check(type(Assets.releaseSession) == "function", + "Assets exposes releaseSession for in-process session end") -- the central cache hands back one image per resolved path, and flush -- fans out to every registered downstream cache @@ -240,6 +244,14 @@ Assets.register(function() reached = true end) Assets.flush() check(reached, "a throwing invalidator does not stop the fan-out") +-- flush/invalidate must not run release hooks (HotReload / live overworld safe) +local releaseCalls = 0 +Assets.register({ release = function() releaseCalls = releaseCalls + 1 end }) +Assets.flush() +check(releaseCalls == 0, "flush() does not call release hooks") +Assets.releaseSession() +check(releaseCalls == 1, "releaseSession() calls registered release hooks") + -- ------- animated tiles as tileset data local overworld = TileRenderer.defaultAnimatedTiles( From ca4d3d283ceac5aacca28472437a6ca1bbf1e67a Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Sun, 23 Aug 2026 12:10:28 -0400 Subject: [PATCH 19/33] Add Pokemon Crystal as a sixth supported version Crystal boots from a user-supplied ROM, imports a full cache and is playable: copyright, the Crystal intro movie, the animated title, gender select, Oak, and out into Johto. 122 of the cart's 169 script specials are implemented. Import and data - tools/make_crystal_manifest.py derives the manifest by importing make_gold_manifest as a library, with three additive keyword seams. Gold and Silver still regenerate byte-identical, which is the standing requirement for touching that generator. - crystal_symbol_deltas.py and crystal_movie_symbols.py carry the symbol delta: Crystal renames the credits mons, splits the trainer card, Pokegear and pack-pal blocks by gender, and replaces the intro and title outright. - Crystal-only manifest keys: engineFlagOrder (162 flags to Gold's 93, so the badge block sits one higher) and unownCharmap (the main charmap parser stops at the first newcharmap so the two cannot contaminate each other). Extractor - RomExtractorGen2 becomes three-edition. Crystal corrections: PAL_MAP_BANK 0x13, a flat PICS_FIX pic bank, audio bank 0x5e, the mapSongs id-100 hole, seven NPC trades, a TradeTexts stride of 8, the five Crystal tileset anim steps with per-row degrade, and the column-major trainer card portraits. - New: animated front sprites (frames, bitmasks, play and idle scripts), the Battle Tower roster, Kris assets, Mobile System GB art, and the Crystal intro and title via src/import/CrystalMovie.lua. Engine - GameVersion gains engine(id) and fixes(id). Gold and Silver keep their original bugs where the bug is not hardware dependent; Crystal gets the fixes Crystal shipped: Lucky Number boxes 10-14, surfing onto an NPC, and the Reflect and Light Screen defence overflow. - Crystal story: Suicune and Eusine, Celebi behind the GS Ball flag, the Ruins of Alph chambers, Buena, the Move Tutor, the Poke Seer, and the Battle Tower including the wInBattleTowerBattle badge-boost guard. - Kris and the gender flag, animated fronts in battle and the summary screen, and mon caught data. Verification - Every extracted asset is pixel-compared against pret's own source PNGs. - Gold caches are byte-identical before and after, file for file. - New Crystal suites plus a T2 Gen 2 tier; the full suite passes. --- CONTRIBUTING-mods.md | 30 +- README.md | 20 +- build-linux-arm-sbc.sh | 2 +- build-rg34xxsp.sh | 4 +- docs/mod-api-gen2-compat.md | 8 +- docs/new-features.md | 1 + docs/preparing-your-mod-for-gen2.md | 2 +- docs/switch-transfer.md | 8 +- scripts/build.sh | 5 +- scripts/build_android.sh | 55 +- scripts/linux-arm64/build_appimage.sh | 2 + .../linux-arm64/selftest_build_linux_arm64.sh | 2 + scripts/pack_love.sh | 3 +- scripts/run.sh | 3 +- scripts/switch/pack_sd_zip.sh | 14 +- scripts/switch/selftest_build_switch.sh | 4 +- scripts/test.sh | 64 +- src/battle/gen2/Battle.lua | 25 +- src/battle/gen2/Catching.lua | 42 + src/battle/gen2/Damage.lua | 31 +- src/battle/gen2/Mon.lua | 103 +- src/core/Game2.lua | 9 +- src/core/GameVersion.lua | 52 +- src/core/LaunchOptions.lua | 1 + src/core/SaveData.lua | 6 +- src/core/gen2/BattleTower.lua | 503 + src/core/gen2/Breeding.lua | 21 +- src/core/gen2/Evolution.lua | 6 + src/core/gen2/Happiness.lua | 23 +- src/core/gen2/Roamers.lua | 146 +- src/core/gen2/Save.lua | 91 +- src/debug/SwitchDiagnostics.lua | 5 +- src/import/CrystalMovie.lua | 396 + src/import/LauncherView.lua | 36 +- src/import/RomExtractorGen2.lua | 1122 +- src/import/RomImporter.lua | 84 +- src/render/MonAnim.lua | 164 + src/save_convert/SaveConvert.lua | 14 +- src/script/gen2/Opcodes.lua | 134 +- src/script/gen2/Specials.lua | 378 +- src/script/gen2/Vm.lua | 90 +- src/script/gen2/specials/battle_tower.lua | 397 + src/script/gen2/specials/crystal_extras.lua | 508 + src/script/gen2/specials/crystal_story.lua | 298 + src/script/gen2/specials/unown_words.lua | 29 + src/sync/SyncMods.lua | 2 +- src/ui/Screens.lua | 49 +- src/ui/gen2/BattleState.lua | 85 +- src/ui/gen2/BattleTowerMenu.lua | 220 + src/ui/gen2/BuenaPassword.lua | 170 + src/ui/gen2/CrystalIntro.lua | 1282 + src/ui/gen2/Diploma.lua | 6 +- src/ui/gen2/GenderSelect.lua | 139 + src/ui/gen2/HallOfFame.lua | 27 +- src/ui/gen2/MagnetTrainRide.lua | 21 +- src/ui/gen2/MoveTutor.lua | 163 + src/ui/gen2/NamePick.lua | 48 +- src/ui/gen2/NamingScreen.lua | 17 +- src/ui/gen2/OakSpeech.lua | 103 +- src/ui/gen2/PackMenu.lua | 19 +- src/ui/gen2/PhotoStudio.lua | 2 +- src/ui/gen2/Pokegear.lua | 164 +- src/ui/gen2/SummaryMenu.lua | 65 +- src/ui/gen2/TitleState.lua | 162 +- src/ui/gen2/TrainerCard.lua | 33 +- src/ui/gen2/UnownPrinter.lua | 2 +- src/ui/kit/Theme.lua | 5 +- src/world/gen2/FieldMoves.lua | 84 +- src/world/gen2/UnownWords.lua | 225 + src/world/gen2/World.lua | 239 +- tests/crystal_import_test.lua | 165 + tests/crystal_world_test.lua | 158 + tests/drivers/crystal_battle_tower_shots.lua | 173 + tests/drivers/crystal_boot_smoke.lua | 249 + tests/drivers/crystal_f2_save_and_vars.lua | 227 + tests/drivers/crystal_gender_flag_shots.lua | 260 + tests/drivers/crystal_gender_shots.lua | 234 + tests/drivers/crystal_intro_shots.lua | 117 + tests/drivers/crystal_story_shots.lua | 278 + tests/drivers/crystal_tower_battle_f1.lua | 277 + tests/drivers/crystal_unown_chambers.lua | 182 + tests/drivers/crystal_unown_words_shots.lua | 104 + tests/drivers/gate_chamber_fieldmoves.lua | 119 + tests/drivers/gate_gold_untouched.lua | 80 + tests/drivers/gate_tower_noshim.lua | 236 + .../engine/android_shortcuts_payload_test.lua | 10 +- tests/engine/crystal_version_test.lua | 218 + tests/engine/gate_gen2_mod_api.lua | 1 + tests/engine/gen2_script_opcodes_test.lua | 292 + tests/engine/launcher_gold_touch_rows.lua | 5 +- tests/engine/launcher_skins_tab.lua | 18 +- tests/engine/mod_targets_tests.lua | 32 +- .../rom_importer_nx_saves_inbox_test.lua | 3 +- tests/engine/uwp_baseroms_test.lua | 4 +- tests/gen2_badges_test.lua | 25 + tests/gen2_battle_tower_battle_test.lua | 603 + tests/gen2_battle_tower_test.lua | 629 + tests/gen2_battletype_escape_test.lua | 55 + tests/gen2_chamber_fieldmoves_test.lua | 71 + tests/gen2_crystal_anim_test.lua | 139 + tests/gen2_crystal_caught_data_test.lua | 314 + tests/gen2_crystal_extras_test.lua | 559 + tests/gen2_crystal_gender_flag_test.lua | 144 + tests/gen2_crystal_gender_test.lua | 334 + tests/gen2_crystal_mobile_gfx_test.lua | 463 + tests/gen2_crystal_story_test.lua | 555 + tests/gen2_crystal_townmap_test.lua | 421 + tests/gen2_crystal_vars_test.lua | 401 + tests/gen2_font_ui_test.lua | 47 +- tests/gen2_menus_test.lua | 9 +- tests/gen2_reflect_overflow_test.lua | 183 + tests/gen2_rom_text_test.lua | 18 +- tests/gen2_save_test.lua | 20 +- tests/gen2_unown_chambers_test.lua | 233 + tests/gen2_unown_printer_test.lua | 5 +- tests/gen2_unown_words_test.lua | 310 + tests/gen2_version_fixes_test.lua | 231 + tests/gen2_vm_test.lua | 8 +- tests/mod_ui_tests.lua | 2 +- tests/parity_hpcolor_og_palette.lua | 8 +- tests/parity_text_markers.lua | 12 +- tests/rom_importer_last_version_test.lua | 9 +- tests/run_gen2.lua | 50 + tests/run_tests.lua | 32 +- tests/save_editor_gen2_tests.lua | 398 +- tools/build_rom_data.py | 28 +- tools/crystal_movie_symbols.py | 72 + tools/crystal_symbol_deltas.py | 147 + tools/make_crystal_manifest.py | 170 + tools/make_gold_manifest.py | 238 +- tools/modkit.py | 6 +- tools/rom_data.py | 3 + tools/rom_manifest_crystal.json | 24663 ++++++++++++++++ tools/save-editor/App.lua | 9 +- tools/save-editor/Catalog.lua | 15 +- tools/save-editor/Gen.lua | 81 +- tools/save-editor/Gen2Flags.lua | 275 + tools/save-editor/Ops.lua | 70 + tools/save-editor/State.lua | 1 + tools/save-editor/panels/Items.lua | 39 +- tools/save-editor/panels/MonEditor.lua | 69 +- 141 files changed, 43306 insertions(+), 583 deletions(-) create mode 100644 src/core/gen2/BattleTower.lua create mode 100644 src/import/CrystalMovie.lua create mode 100644 src/render/MonAnim.lua create mode 100644 src/script/gen2/specials/battle_tower.lua create mode 100644 src/script/gen2/specials/crystal_extras.lua create mode 100644 src/script/gen2/specials/crystal_story.lua create mode 100644 src/script/gen2/specials/unown_words.lua create mode 100644 src/ui/gen2/BattleTowerMenu.lua create mode 100644 src/ui/gen2/BuenaPassword.lua create mode 100644 src/ui/gen2/CrystalIntro.lua create mode 100644 src/ui/gen2/GenderSelect.lua create mode 100644 src/ui/gen2/MoveTutor.lua create mode 100644 src/world/gen2/UnownWords.lua create mode 100644 tests/crystal_import_test.lua create mode 100644 tests/crystal_world_test.lua create mode 100644 tests/drivers/crystal_battle_tower_shots.lua create mode 100644 tests/drivers/crystal_boot_smoke.lua create mode 100644 tests/drivers/crystal_f2_save_and_vars.lua create mode 100644 tests/drivers/crystal_gender_flag_shots.lua create mode 100644 tests/drivers/crystal_gender_shots.lua create mode 100644 tests/drivers/crystal_intro_shots.lua create mode 100644 tests/drivers/crystal_story_shots.lua create mode 100644 tests/drivers/crystal_tower_battle_f1.lua create mode 100644 tests/drivers/crystal_unown_chambers.lua create mode 100644 tests/drivers/crystal_unown_words_shots.lua create mode 100644 tests/drivers/gate_chamber_fieldmoves.lua create mode 100644 tests/drivers/gate_gold_untouched.lua create mode 100644 tests/drivers/gate_tower_noshim.lua create mode 100644 tests/engine/crystal_version_test.lua create mode 100644 tests/engine/gen2_script_opcodes_test.lua create mode 100644 tests/gen2_battle_tower_battle_test.lua create mode 100644 tests/gen2_battle_tower_test.lua create mode 100644 tests/gen2_battletype_escape_test.lua create mode 100644 tests/gen2_chamber_fieldmoves_test.lua create mode 100644 tests/gen2_crystal_anim_test.lua create mode 100644 tests/gen2_crystal_caught_data_test.lua create mode 100644 tests/gen2_crystal_extras_test.lua create mode 100644 tests/gen2_crystal_gender_flag_test.lua create mode 100644 tests/gen2_crystal_gender_test.lua create mode 100644 tests/gen2_crystal_mobile_gfx_test.lua create mode 100644 tests/gen2_crystal_story_test.lua create mode 100644 tests/gen2_crystal_townmap_test.lua create mode 100644 tests/gen2_crystal_vars_test.lua create mode 100644 tests/gen2_reflect_overflow_test.lua create mode 100644 tests/gen2_unown_chambers_test.lua create mode 100644 tests/gen2_unown_words_test.lua create mode 100644 tests/gen2_version_fixes_test.lua create mode 100644 tests/run_gen2.lua create mode 100644 tools/crystal_movie_symbols.py create mode 100644 tools/crystal_symbol_deltas.py create mode 100644 tools/make_crystal_manifest.py create mode 100644 tools/rom_manifest_crystal.json create mode 100644 tools/save-editor/Gen2Flags.lua diff --git a/CONTRIBUTING-mods.md b/CONTRIBUTING-mods.md index 3030138f..7a2f525d 100644 --- a/CONTRIBUTING-mods.md +++ b/CONTRIBUTING-mods.md @@ -140,8 +140,8 @@ ship text. ### 4. `games` (and the legacy `gen2compat`) -Pokemon Gold and Silver are Gen 2, and they run their own battle engine, -overworld, script VM and save format. The mod API is shared across both +Pokemon Gold, Silver and Crystal are Gen 2, and they run their own battle +engine, overworld, script VM and save format. The mod API is shared across both generations (same hook names, same event names, same registry names) but Gen 2 cannot serve all of it yet, so it is opt-in. Say which games the mod is for: @@ -150,19 +150,20 @@ cannot serve all of it yet, so it is opt-in. Say which games the mod is for: ``` Each entry is a version id (`"red"`, `"blue"`, `"yellow"`, `"gold"`, -`"silver"`), a generation (`"gen1"`, `"gen2"`) or `"all"`; +`"silver"`, `"crystal"`), a generation (`"gen1"`, `"gen2"`) or `"all"`; `src/mods/ModTargets.lua` resolves them off `GameVersion.ORDER` so nothing -restates the game list. `python3 tools/modkit.py scaffold my_mod --games -gen1,gen2` writes the key for you. The mod still installs to one directory, -`mods//`, shared by every game -- targeting is declared, never filed. +restates the game list, which is why `"gen2"` covers Crystal as well as Gold +and Silver. `python3 tools/modkit.py scaffold my_mod --games gen1,gen2` writes +the key for you. The mod still installs to one directory, `mods//`, shared +by every game -- targeting is declared, never filed. Absent means Gen 1 only, which is what every mod written before the key existed was tested as. `"gen2compat": true` is the legacy spelling, still accepted and purely additive (it *adds* the Gen 2 games), so no manifest can lose a game it -already ran on. On a Gold or Silver boot a mod claiming no Gen 2 game is not -loaded at all: the manager lists it as `ENABLED (NOT THIS GAME)` and says why, -because a mod that half-applies reads as a broken mod. Claim Gen 2 once you -have actually run your mod on Gold or Silver. +already ran on. On a Gen 2 boot a mod claiming no Gen 2 game is not loaded at +all: the manager lists it as `ENABLED (NOT THIS GAME)` and says why, because a +mod that half-applies reads as a broken mod. Claim Gen 2 once you have actually +run your mod on Gold, Silver or Crystal. Every token is enforced, per game: the loader gates on the same `ModTargets.supports` answer both mod surfaces draw, so `"games": ["blue"]` @@ -172,10 +173,11 @@ manifest with neither key still covers every Gen 1 game, so nothing written before the key existed changes behavior; list both generations or say `"all"` when you mean everywhere. -`docs/mod-api-gen2-compat.md` is the compatibility matrix: what works on Gold -and Silver today (40 of the 46 registries, 40 event and 44 hook names shared with Gen 1, -and 24 Gen 2-only ones), which registries have no Gen 2 home and drop their -writes with a report, and which hooks and events are still to come. +`docs/mod-api-gen2-compat.md` is the compatibility matrix: what works on Gold, +Silver and Crystal today (40 of the 46 registries, 40 event and 44 hook names +shared with Gen 1, and 24 Gen 2-only ones), which registries have no Gen 2 home +and drop their writes with a report, and which hooks and events are still to +come. `docs/preparing-your-mod-for-gen2.md` is the step-by-step migration guide for a Gen 1 mod, and it is the one to start from. diff --git a/README.md b/README.md index f213eb27..d769fb0d 100644 --- a/README.md +++ b/README.md @@ -56,14 +56,16 @@ And before you say, "that's not a recomp", you're wrong. Recomp is an acronym. * [![Watch the latest update video](https://img.youtube.com/vi/yi7LkWQPKKM/maxresdefault.jpg)](https://youtu.be/yi7LkWQPKKM) This project does not include a ROM, emulate the Game Boy, transpile assembly, -or download a disassembly. A canonical US Poke Red, Blue, Yellow, Gold, or -Silver ROM is the only game content input. +or download a disassembly. A canonical US Poke Red, Blue, Yellow, Gold, +Silver, or Crystal ROM is the only game content input. The ROM is verified, used during import, and then released from memory. It is not copied into the cache. Later launches load the private generated cache and -do not ask for the ROM again. Red, Blue, Yellow, Gold, and Silver can all be -imported side by side. Gold and Silver are Gen 2 Phase 1 (import + launcher; -see `docs/gold-phase1.md`): the Gen 2 engine is still under construction. +do not ask for the ROM again. Red, Blue, Yellow, Gold, Silver, and Crystal can +all be imported side by side. Gold, Silver, and Crystal are Gen 2 Phase 1 +(import + launcher; see `docs/gold-phase1.md`): the Gen 2 engine is still under +construction, and Crystal is the newest of the three, so the launcher lists it +as Crystal (Beta). ## Quick Start @@ -71,14 +73,16 @@ Open the desktop app. On first boot, choose your legally obtained `.gb` / `.gbc` file or drop it onto the window. Import takes a few seconds and the game starts automatically. -Only the canonical US Red, Blue, Yellow (1 MiB), Gold, and Silver (2 MiB) -ROMs are accepted. The importer verifies SHA-1 before creating any game data: +Only the canonical US Red, Blue, Yellow (1 MiB), Gold, Silver, and Crystal +(2 MiB) ROMs are accepted. The importer verifies SHA-1 before creating any +game data: - Red: `ea9bcae617fdf159b045185467ae58b2e4a48b9a` - Blue: `d7037c83e1ae5b39bde3c30787637ba1d4c48ce2` - Yellow: `cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1` - Gold: `d8b8a3600a465308c9953dfa04f0081c05bdcb94` - Silver: `49b163f7e57702bc939d642a18f591de55d92dae` +- Crystal: `f4cd194bdee0d04ca4eac29e09b8e4e9d818c133` The packaged app contains neither a ROM nor pre-extracted game data. Music, sound effects, and cries are synthesized while the game runs from compact @@ -219,7 +223,7 @@ entry: a desktop shortcut per game, a Steam entry, or a handheld frontend. | Option | Effect | | --- | --- | -| `--game=red` | boot Red, skipping the launcher (`blue`, `yellow`, `gold` and `silver` too, or just `r` / `b` / `y` / `g` / `s`) | +| `--game=red` | boot Red, skipping the launcher (`blue`, `yellow`, `gold`, `silver` and `crystal` too, or just `r` / `b` / `y` / `g` / `s` / `c`) | | `--slot=2` | load that save slot; takes a slot number or a slot id | | `--launcher` | open the launcher anyway, so you can edit a shortcut you already made | diff --git a/build-linux-arm-sbc.sh b/build-linux-arm-sbc.sh index 0884f27d..43ee86a1 100755 --- a/build-linux-arm-sbc.sh +++ b/build-linux-arm-sbc.sh @@ -134,7 +134,7 @@ mkdir -p "$GAME_SRC" main.lua conf.lua src libs data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ - tools/rom_manifest_silver.json \ + tools/rom_manifest_silver.json tools/rom_manifest_crystal.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') if unzip -Z1 "$WORK/game-payload.zip" \ | grep -Eq '^(data|assets)/generated/[^/]+|^(data|assets)/generated/.+/'; then diff --git a/build-rg34xxsp.sh b/build-rg34xxsp.sh index 3702d226..bfa0f8c4 100755 --- a/build-rg34xxsp.sh +++ b/build-rg34xxsp.sh @@ -92,7 +92,7 @@ mkdir -p "$GAME_SRC" main.lua conf.lua src libs data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ - tools/rom_manifest_silver.json \ + tools/rom_manifest_silver.json tools/rom_manifest_crystal.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') payload_list="$(unzip -Z1 "$WORK/game-payload.zip")" printf '%s\n' "$payload_list" \ @@ -102,6 +102,8 @@ printf '%s\n' "$payload_list" | grep -qxF "tools/rom_manifest_gold.json" \ || fail "payload is missing tools/rom_manifest_gold.json" printf '%s\n' "$payload_list" | grep -qxF "tools/rom_manifest_silver.json" \ || fail "payload is missing tools/rom_manifest_silver.json" +printf '%s\n' "$payload_list" | grep -qxF "tools/rom_manifest_crystal.json" \ + || fail "payload is missing tools/rom_manifest_crystal.json" unzip -q "$WORK/game-payload.zip" -d "$GAME_SRC" rm -f "$WORK/game-payload.zip" diff --git a/docs/mod-api-gen2-compat.md b/docs/mod-api-gen2-compat.md index 716a2607..54f94243 100644 --- a/docs/mod-api-gen2-compat.md +++ b/docs/mod-api-gen2-compat.md @@ -55,10 +55,10 @@ The short version, for an author deciding what to write: ``` `games` is an optional array of version ids (`"red"`, `"blue"`, `"yellow"`, -`"gold"`, `"silver"`), generations (`"gen1"`, `"gen2"`, case-insensitive) or -`"all"`. `src/mods/ModTargets.lua` resolves the tokens off `GameVersion.ORDER` -and `GameVersion.generation`, so nothing anywhere restates the game list. -`"gen2"` now expands to both Gold and Silver. +`"gold"`, `"silver"`, `"crystal"`), generations (`"gen1"`, `"gen2"`, +case-insensitive) or `"all"`. `src/mods/ModTargets.lua` resolves the tokens off +`GameVersion.ORDER` and `GameVersion.generation`, so nothing anywhere restates +the game list. `"gen2"` now expands to Gold, Silver and Crystal. `Manifest.validate` stores the resolved, ORDER-sorted ids on `manifest.games` and **derives** `manifest.gen2compat` from them, which is the one field the loader's gate reads. diff --git a/docs/new-features.md b/docs/new-features.md index 7d5f43f5..dccc76ea 100644 --- a/docs/new-features.md +++ b/docs/new-features.md @@ -19,5 +19,6 @@ Features intentionally added beyond the original Pokémon Red, Blue, and Yellow ## Gen 2 Specifics * **Pokémon Silver** as an importable, launcher-selectable version alongside Gold +* **Pokémon Crystal** as an importable, launcher-selectable version alongside Gold and Silver * **Mod manager** with Gen 1 mod adapters, per-game targeting, and `modkit gen2check` * **Followers** for mods, plus Gen 2-only registries and hooks diff --git a/docs/preparing-your-mod-for-gen2.md b/docs/preparing-your-mod-for-gen2.md index 382a3d21..486e6b6a 100644 --- a/docs/preparing-your-mod-for-gen2.md +++ b/docs/preparing-your-mod-for-gen2.md @@ -176,7 +176,7 @@ something the filesystem encodes. | token | means | | --- | --- | -| `"red"`, `"blue"`, `"yellow"`, `"gold"`, `"silver"` | that one game (a version id from `GameVersion.ORDER`) | +| `"red"`, `"blue"`, `"yellow"`, `"gold"`, `"silver"`, `"crystal"` | that one game (a version id from `GameVersion.ORDER`) | | `"gen1"`, `"gen2"` | every game of that generation (case-insensitive; `"gen 2"` also parses) | | `"all"` | every game this engine has | diff --git a/docs/switch-transfer.md b/docs/switch-transfer.md index 798a8f85..ed363464 100644 --- a/docs/switch-transfer.md +++ b/docs/switch-transfer.md @@ -22,8 +22,8 @@ Player install (what to download, title override) stays in | Loose iteration pair | `sdmc:/switch/gen1recomp/gen1recomp.nro` **and** `game.love` beside it | | ROM inbox | LÖVE save dir → `imports/` (launcher shows the live `getSaveDirectory()` path; under MTP often `1: SD Card//imports/`) | | Mod zip inbox | Same save dir → `imports/mods/` then MODS → **Scan again** | -| Save `.sav` inbox | Same save dir → `imports/saves/red\|blue\|yellow\|gold\|silver/` then that game's SAVE FILES → **Import save** (Gold / Silver cart `.sav` not supported yet) | -| Save exports | Same save dir → `exports/red\|blue\|yellow\|gold\|silver/` (pull after **Export save**; Gold / Silver cart `.sav` not supported yet) | +| Save `.sav` inbox | Same save dir → `imports/saves/red\|blue\|yellow\|gold\|silver\|crystal/` then that game's SAVE FILES → **Import save** (Gen 2 cart `.sav` not supported yet, on Gold, Silver or Crystal) | +| Save exports | Same save dir → `exports/red\|blue\|yellow\|gold\|silver\|crystal/` (pull after **Export save**; Gen 2 cart `.sav` not supported yet, on Gold, Silver or Crystal) | | Opt-in diagnostics | Empty `switch-debug.txt` in the save dir → `switch.log` | | Lua error log | `lua-error.log` in the save dir | @@ -54,8 +54,8 @@ macOS, not a Mac-only requirement. 3. Create `switch/gen1recomp/` if needed; extract the release zip at SD root (or copy NRO / `game.love` for loose). 4. For ROMs/mods/saves, open the save-dir `imports/`, `imports/mods/`, - `imports/saves//`, or - `exports//` + `imports/saves//`, or + `exports//` path the launcher prints. 5. Wait for the queue; refresh; exit MTP responder; title-override launch. diff --git a/scripts/build.sh b/scripts/build.sh index 10b3aec8..3861b84e 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -79,7 +79,7 @@ else main.lua conf.lua src data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ - tools/rom_manifest_silver.json \ + tools/rom_manifest_silver.json tools/rom_manifest_crystal.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') fi # Materialize the listing once and grep the file: piping unzip straight into @@ -101,7 +101,8 @@ for required in tools/save-editor/App.lua tools/save-editor/Kit.lua \ src/ui/kit/Kit.lua \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ - tools/rom_manifest_silver.json; do + tools/rom_manifest_silver.json \ + tools/rom_manifest_crystal.json; do grep -qxF "$required" "$LOVE_LISTING" \ || fail "game.love is missing $required" done diff --git a/scripts/build_android.sh b/scripts/build_android.sh index e5b508a5..4389548f 100755 --- a/scripts/build_android.sh +++ b/scripts/build_android.sh @@ -34,6 +34,8 @@ GOLD_MANIFEST_RELATIVE="tools/rom_manifest_gold.json" GOLD_MANIFEST_URL="${GOLD_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_gold.json}" SILVER_MANIFEST_RELATIVE="tools/rom_manifest_silver.json" SILVER_MANIFEST_URL="${SILVER_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_silver.json}" +CRYSTAL_MANIFEST_RELATIVE="tools/rom_manifest_crystal.json" +CRYSTAL_MANIFEST_URL="${CRYSTAL_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_crystal.json}" VERSION="" PACKAGE_ONLY=false @@ -246,6 +248,54 @@ ensure_silver_manifest() { fail "Silver import manifest is unavailable. Git recovery failed and could not download $SILVER_MANIFEST_URL" } +crystal_manifest_is_valid() { + local path="$1" + python3 - "$path" <<'PY' +import json, pathlib, sys + +try: + manifest = json.loads(pathlib.Path(sys.argv[1]).read_text()) +except (OSError, ValueError): + raise SystemExit(1) + +raise SystemExit(0 if manifest.get("romSha1") == + "f4cd194bdee0d04ca4eac29e09b8e4e9d818c133" else 1) +PY +} + +ensure_crystal_manifest() { + local manifest="$ROOT/$CRYSTAL_MANIFEST_RELATIVE" + local staged + staged="$(mktemp)" + + if crystal_manifest_is_valid "$manifest"; then + rm -f "$staged" + return + fi + + warn "Crystal import manifest is missing or invalid; recovering it before packaging" + if git -C "$ROOT" show "HEAD:$CRYSTAL_MANIFEST_RELATIVE" > "$staged" 2>/dev/null \ + && crystal_manifest_is_valid "$staged"; then + mkdir -p "$(dirname "$manifest")" + mv "$staged" "$manifest" + say "restored Crystal import manifest from this checkout's Git data" + return + fi + + if command -v curl >/dev/null 2>&1 \ + && curl --fail --location --retry 2 --connect-timeout 15 \ + --output "$staged" "$CRYSTAL_MANIFEST_URL" \ + && crystal_manifest_is_valid "$staged"; then + mkdir -p "$(dirname "$manifest")" + mv "$staged" "$manifest" + say "downloaded Crystal import manifest from the project repository" + return + fi + + rm -f "$staged" + fail "Crystal import manifest is unavailable. Git recovery failed and could not download $CRYSTAL_MANIFEST_URL" +} + # --------------------------------------------------------------- branding # love-android 11.5+ reads app id / name / orientation from gradle.properties. # Manifest still gets permission trims. Re-applied every build so refreshing @@ -312,6 +362,7 @@ pack_game_love() { ensure_yellow_manifest ensure_gold_manifest ensure_silver_manifest + ensure_crystal_manifest mkdir -p "$EMBED_ASSETS" rm -f "$LOVE_FILE" # tools/save-editor ships with the app: the launcher's Edit button on a save @@ -326,7 +377,7 @@ pack_game_love() { main.lua conf.lua src data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ - tools/rom_manifest_silver.json \ + tools/rom_manifest_silver.json tools/rom_manifest_crystal.json \ -x '*.DS_Store' -x '*/.git/*' -x '*/.DS_Store' \ -x 'data/generated/*' -x 'assets/generated/*') # List once and match against the captured text: piping unzip straight into @@ -350,6 +401,8 @@ pack_game_love() { || fail "game.love is missing the Gold ROM import manifest" grep -qx 'tools/rom_manifest_silver.json' <<< "$archive_entries" \ || fail "game.love is missing the Silver ROM import manifest" + grep -qx 'tools/rom_manifest_crystal.json' <<< "$archive_entries" \ + || fail "game.love is missing the Crystal ROM import manifest" # This gate exists because the launcher's UI toolkit once lived outside # src/ (libs/flexlove) and was added to scripts/build.sh's payload and to # no other packager, so Android and iOS built an APK/IPA whose launcher diff --git a/scripts/linux-arm64/build_appimage.sh b/scripts/linux-arm64/build_appimage.sh index 59d59a71..1c6af56d 100755 --- a/scripts/linux-arm64/build_appimage.sh +++ b/scripts/linux-arm64/build_appimage.sh @@ -368,6 +368,8 @@ grep -qxF "tools/rom_manifest_gold.json" "$WORK/love-listing.txt" \ || fail "game.love is missing tools/rom_manifest_gold.json" grep -qxF "tools/rom_manifest_silver.json" "$WORK/love-listing.txt" \ || fail "game.love is missing tools/rom_manifest_silver.json" +grep -qxF "tools/rom_manifest_crystal.json" "$WORK/love-listing.txt" \ + || fail "game.love is missing tools/rom_manifest_crystal.json" # The .desktop's Icon= resolves against the AppDir root by basename, and # .DirIcon is what appimaged and file-manager thumbnailers read. cp "$IN/icon.png" "$APPDIR/$APP_NAME.png" diff --git a/scripts/linux-arm64/selftest_build_linux_arm64.sh b/scripts/linux-arm64/selftest_build_linux_arm64.sh index 8320222b..47fc5e59 100755 --- a/scripts/linux-arm64/selftest_build_linux_arm64.sh +++ b/scripts/linux-arm64/selftest_build_linux_arm64.sh @@ -171,5 +171,7 @@ grep -qxF "tools/rom_manifest_gold.json" "$temp_dir/love-listing.txt" \ || fail "shared payload is missing tools/rom_manifest_gold.json" grep -qxF "tools/rom_manifest_silver.json" "$temp_dir/love-listing.txt" \ || fail "shared payload is missing tools/rom_manifest_silver.json" +grep -qxF "tools/rom_manifest_crystal.json" "$temp_dir/love-listing.txt" \ + || fail "shared payload is missing tools/rom_manifest_crystal.json" say "Linux arm64 self-test passed" diff --git a/scripts/pack_love.sh b/scripts/pack_love.sh index a32653b5..7136088d 100755 --- a/scripts/pack_love.sh +++ b/scripts/pack_love.sh @@ -50,7 +50,7 @@ rm -f "$OUTPUT" main.lua conf.lua src data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ - tools/rom_manifest_silver.json \ + tools/rom_manifest_silver.json tools/rom_manifest_crystal.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') if [ -f "$ROOT/PATCH_NOTES.md" ]; then (cd "$ROOT" && zip -q "$OUTPUT" PATCH_NOTES.md) @@ -96,6 +96,7 @@ for required in tools/save-editor/App.lua tools/save-editor/Kit.lua \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ tools/rom_manifest_silver.json \ + tools/rom_manifest_crystal.json \ src/ui/kit/Kit.lua \ src/import/LauncherView.lua; do grep -qxF "$required" "$LISTING" \ diff --git a/scripts/run.sh b/scripts/run.sh index 6cfefde1..cf89e593 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -19,7 +19,8 @@ if [ ! -f "$ROOT/data/generated/maps.lua" ] \ && [ ! -f "$ROOT/blue/data/generated/maps.lua" ] \ && [ ! -f "$ROOT/yellow/data/generated/maps.lua" ] \ && [ ! -f "$ROOT/gold/data/generated/maps.lua" ] \ - && [ ! -f "$ROOT/silver/data/generated/maps.lua" ]; then + && [ ! -f "$ROOT/silver/data/generated/maps.lua" ] \ + && [ ! -f "$ROOT/crystal/data/generated/maps.lua" ]; then fail "generated data missing, run scripts/setup.sh first" fi diff --git a/scripts/switch/pack_sd_zip.sh b/scripts/switch/pack_sd_zip.sh index 1d0478a9..d6277899 100755 --- a/scripts/switch/pack_sd_zip.sh +++ b/scripts/switch/pack_sd_zip.sh @@ -71,15 +71,15 @@ First install or update (same steps): your saves, imported ROMs, mods, and options. Re-extracting only replaces the NRO(s) and these help files. 3. Launch with title override (hold R on HOME, open any title → hbmenu). - 4. Copy a legal Pokemon Red/Blue .gb or Yellow/Gold/Silver .gbc into: + 4. Copy a legal Pokemon Red/Blue .gb or Yellow/Gold/Silver/Crystal .gbc into: switch/gen1recomp/pokemon-love2d/imports/ then use Scan again in the launcher if needed. Inboxes (drop files here via MTP / SD / FTP): imports/ — ROM .gb / .gbc imports/mods/ — community mod .zip - imports/saves/red|blue|yellow|gold|silver/ — raw .sav import (Gold/Silver cart .sav not yet) - exports/red|blue|yellow|gold|silver/ — pull after Export save (Gold/Silver not yet) + imports/saves/red|blue|yellow|gold|silver|crystal/ - raw .sav import (Gen 2 cart .sav not yet) + exports/red|blue|yellow|gold|silver|crystal/ - pull after Export save (Gen 2 not yet) Full guide: https://github.com/bryanthaboi/gen1recomp/blob/main/docs/switch-install.md EOF @@ -92,7 +92,7 @@ write_readme() { } write_readme "$SAVE_ROOT/imports/README.txt" \ - "Put a legal Pokemon Red/Blue .gb or Yellow/Gold/Silver .gbc here, then Scan again in the launcher." + "Put a legal Pokemon Red/Blue .gb or Yellow/Gold/Silver/Crystal .gbc here, then Scan again in the launcher." write_readme "$SAVE_ROOT/imports/mods/README.txt" \ "Put community mod .zip files here, then MODS → Scan again." write_readme "$SAVE_ROOT/imports/saves/red/README.txt" \ @@ -105,6 +105,8 @@ write_readme "$SAVE_ROOT/imports/saves/gold/README.txt" \ "Gold cart .sav import is not supported yet. Folder reserved so MTP matches the other games." write_readme "$SAVE_ROOT/imports/saves/silver/README.txt" \ "Silver cart .sav import is not supported yet. Folder reserved so MTP matches the other games." +write_readme "$SAVE_ROOT/imports/saves/crystal/README.txt" \ + "Crystal cart .sav import is not supported yet. Folder reserved so MTP matches the other games." write_readme "$SAVE_ROOT/exports/red/README.txt" \ "After Export save (Red), copy the .sav out of this folder via MTP / SD / FTP." write_readme "$SAVE_ROOT/exports/blue/README.txt" \ @@ -115,6 +117,8 @@ write_readme "$SAVE_ROOT/exports/gold/README.txt" \ "Gold cart .sav export is not supported yet. Folder reserved so MTP matches the other games." write_readme "$SAVE_ROOT/exports/silver/README.txt" \ "Silver cart .sav export is not supported yet. Folder reserved so MTP matches the other games." +write_readme "$SAVE_ROOT/exports/crystal/README.txt" \ + "Crystal cart .sav export is not supported yet. Folder reserved so MTP matches the other games." rm -f "$OUT_ZIP" ( @@ -145,11 +149,13 @@ REQUIRED=( "switch/gen1recomp/pokemon-love2d/imports/saves/yellow/README.txt" "switch/gen1recomp/pokemon-love2d/imports/saves/gold/README.txt" "switch/gen1recomp/pokemon-love2d/imports/saves/silver/README.txt" + "switch/gen1recomp/pokemon-love2d/imports/saves/crystal/README.txt" "switch/gen1recomp/pokemon-love2d/exports/red/README.txt" "switch/gen1recomp/pokemon-love2d/exports/blue/README.txt" "switch/gen1recomp/pokemon-love2d/exports/yellow/README.txt" "switch/gen1recomp/pokemon-love2d/exports/gold/README.txt" "switch/gen1recomp/pokemon-love2d/exports/silver/README.txt" + "switch/gen1recomp/pokemon-love2d/exports/crystal/README.txt" ) for rel in "${REQUIRED[@]}"; do printf '%s\n' "$LISTING" | grep -Fq "$rel" || fail "zip missing $rel" diff --git a/scripts/switch/selftest_build_switch.sh b/scripts/switch/selftest_build_switch.sh index 946a1107..88fa4846 100755 --- a/scripts/switch/selftest_build_switch.sh +++ b/scripts/switch/selftest_build_switch.sh @@ -272,11 +272,13 @@ for rel in \ "switch/gen1recomp/pokemon-love2d/imports/saves/yellow/README.txt" \ "switch/gen1recomp/pokemon-love2d/imports/saves/gold/README.txt" \ "switch/gen1recomp/pokemon-love2d/imports/saves/silver/README.txt" \ + "switch/gen1recomp/pokemon-love2d/imports/saves/crystal/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/red/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/blue/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/yellow/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/gold/README.txt" \ - "switch/gen1recomp/pokemon-love2d/exports/silver/README.txt" + "switch/gen1recomp/pokemon-love2d/exports/silver/README.txt" \ + "switch/gen1recomp/pokemon-love2d/exports/crystal/README.txt" do printf '%s\n' "$ZIP_LIST" | grep -Fq "$rel" || PACK_MISSING="${PACK_MISSING} ${rel}" done diff --git a/scripts/test.sh b/scripts/test.sh index 57be8d0a..71760e19 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -5,8 +5,8 @@ # them fails. The tier split is what makes that possible: T1/T2/T4 need # nothing but the committed fixture dataset, so they run anywhere -- # including CI, which has no ROM. T3 asserts Pokemon Red facts and needs -# data/generated/, so it is skipped automatically when the ROM has never -# been imported rather than failing the run. +# data/generated/ or an imported Red cache, so it is skipped automatically +# when neither exists rather than failing the run. # # scripts/test.sh every tier this checkout can run # scripts/test.sh --quick skip the slow content tier @@ -16,6 +16,13 @@ # # LUA overrides the interpreter (luajit here; CI installs lua5.4 too, but # the engine targets LuaJIT/5.1 semantics so luajit is the default). +# +# POKEPORT_TEST_CACHES points at one LOVE identity holding an imported cache +# per version (red/ blue/ yellow/ gold/ silver/ crystal/); each is exported as +# RED_CACHE .. CRYSTAL_CACHE for the suites that read one. Build it with: +# POKEPORT_IDENTITY=pokeport-test-caches POKEPORT_VERSION= \ +# POKEPORT_IMPORT_ONLY=1 POKEPORT_IMPORT_ROM="" love . +# An explicit RED_CACHE/GOLD_CACHE/... in the environment always wins. set -uo pipefail @@ -32,7 +39,7 @@ for arg in "$@"; do --bless) BLESS=1 ;; --bless-shots) SHOTS=1; BLESS=1 ;; --quick) QUICK=1 ;; - --help|-h) sed -n '2,20p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; + --help|-h) sed -n '2,26p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;; *) echo "unknown option: $arg" >&2; exit 2 ;; esac done @@ -49,6 +56,36 @@ fi # save-editor suite pins that to the default identity. SANDBOX_IDENTITY="ci-$$" +# Per-version caches. POKEPORT_TEST_CACHES names one LOVE identity holding an +# imported cache per version (red/ blue/ yellow/ gold/ silver/ crystal/). +CACHE_IDENTITY=${POKEPORT_TEST_CACHE_IDENTITY:-pokeport-test-caches} +if [ -n "${POKEPORT_TEST_CACHES:-}" ]; then + CACHE_ROOT="$POKEPORT_TEST_CACHES" +elif [ -d "$HOME/Library/Application Support/LOVE/$CACHE_IDENTITY" ]; then + CACHE_ROOT="$HOME/Library/Application Support/LOVE/$CACHE_IDENTITY" +else + CACHE_ROOT="$HOME/.local/share/love/$CACHE_IDENTITY" +fi + +# Only a cache with the importer's completion marker is offered: a half-written +# one would fail suites that are meant to self-skip. +adopt_cache() { + local var="$1" dir="$CACHE_ROOT/$2" + [ -z "${!var:-}" ] || return 0 + [ -f "$dir/rom-cache.complete" ] || return 0 + export "$var=$dir" + echo " $var=$dir" +} + +echo "" +echo "-- per-version caches under $CACHE_ROOT" +adopt_cache RED_CACHE red +adopt_cache BLUE_CACHE blue +adopt_cache YELLOW_CACHE yellow +adopt_cache GOLD_CACHE gold +adopt_cache SILVER_CACHE silver +adopt_cache CRYSTAL_CACHE crystal + FAILED=() run_tier() { local label="$1"; shift @@ -77,6 +114,7 @@ fi run_tier "T0 ROM builder version routing" python3 tests/build_rom_data_cli_test.py run_tier "T0 ROM manifest generator pin/overrides" python3 tests/rom_manifest_generator_test.py +run_tier "T0 Crystal manifest + specials coverage" "$LUA" tests/crystal_import_test.lua run_tier "T0 switch CI workflow content gate" "$LUA" tests/switch_ci_workflows_test.lua run_tier "T0 switch transfer docs gate" "$LUA" tests/switch_transfer_docs_test.lua # NX Blue/Yellow asset overlay: ROM-free, must run on every checkout so a @@ -87,6 +125,9 @@ run_tier "T0 NX Yellow/Blue boot (dynamic paths)" "$LUA" tests/engine/nx_yellow_ run_tier "T0 NX Gold cache load (maps.lua prefix)" "$LUA" tests/engine/cache_fs_gold_nx_load_test.lua run_tier "T0 touch-controls pad cursor" "$LUA" tests/engine/touch_controls_pad_cursor_test.lua run_tier "T1/T2 engine invariants + parity gates" "$LUA" tests/run_engine.lua +# Gen 2 / Crystal: ROM-free (own fixtures, or a self-skip on a missing cache), +# so it runs here rather than behind the Red content gate below. +run_tier "T2 Gen 2 / Crystal suites" "$LUA" tests/run_gen2.lua run_tier "T4 mod-SDK" "$LUA" tests/run_modkit.lua run_tier "T4 title checkpoint cold restart" \ bash tests/integration/title_checkpoint_cold_start.sh @@ -133,7 +174,19 @@ run_content_behavior() { return 1 } +# The Red dataset is the source tree's when tools/build_data.py wrote one, and +# otherwise the imported Red cache, through Data:load's POKEPORT_DATA_DIR hook. +HAVE_RED_DATA=0 if [ -f data/generated/maps.lua ]; then + HAVE_RED_DATA=1 +elif [ -n "${RED_CACHE:-}" ] && [ -f "$RED_CACHE/data/generated/maps.lua" ]; then + HAVE_RED_DATA=1 + export POKEPORT_DATA_DIR="$RED_CACHE/data/generated" + echo "" + echo "-- T3 content: reading Red from $POKEPORT_DATA_DIR" +fi + +if [ "$HAVE_RED_DATA" = "1" ]; then if [ "$QUICK" = "1" ]; then echo "" echo "-- T3 content: skipped (--quick)" @@ -163,8 +216,9 @@ if [ -f data/generated/maps.lua ]; then fi else echo "" - echo "-- T3 content + run_link_tests: skipped (no data/generated/ --" - echo " import a ROM to run them; the modded-link cases ran in T4)" + echo "-- T3 content + run_link_tests: skipped (no data/generated/ and no" + echo " RED_CACHE -- import a ROM to run them; the modded-link cases ran" + echo " in T4 and the Gen 2 suites in T2)" fi # ------- golden screenshots: needs love + a display diff --git a/src/battle/gen2/Battle.lua b/src/battle/gen2/Battle.lua index a9da9619..2cc93065 100644 --- a/src/battle/gen2/Battle.lua +++ b/src/battle/gen2/Battle.lua @@ -166,6 +166,9 @@ Battle.SUBSTATUS_ITEMS = { -- be run from or Roared away. Battle.BATTLETYPE_FORCESHINY = 7 Battle.BATTLETYPE_TRAP = 9 +-- ../pokecrystal/constants/battle_constants.asm:102-103, Crystal-only appends +Battle.BATTLETYPE_CELEBI = 11 +Battle.BATTLETYPE_SUICUNE = 12 -- LostBattle's .canlose arm (engine/battle/core.asm:2766): the only battle -- type whose loss still prints the trainer's own line instead of a whiteout. Battle.BATTLETYPE_CANLOSE = 1 @@ -247,6 +250,10 @@ function Battle.new(opts) -- (BATTLETYPE_FISH is the one condition LureBallMultiplier reads), and the -- FORCESHINY / TRAP no-escape rules will hang off the same field. self.battleType = opts.battleType + -- wInBattleTowerBattle (../pokecrystal/constants/ram_constants.asm:38), set + -- around the Tower's own StartBattle (engine/events/battle_tower/ + -- battle_tower.asm:220-223) and cleared again at :253-254. + self.inBattleTowerBattle = opts.battleTower and true or false self.events = {} self.turn = 0 self.over = false @@ -765,6 +772,9 @@ end function Battle:battleStat(mon, key) local value = (mon.stats or {})[key] or 1 if mon ~= self.player then return value end + -- BadgeStatBoosts' second early return (engine/battle/core.asm:6786-6788): + -- adventure badges do not follow the player into the standardised Tower. + if self.inBattleTowerBattle then return value end local badge = Battle.BADGE_STAT_BOOSTS[key] if badge and self:hasBadge("badges", badge) then return Battle.boostStat(value) @@ -783,6 +793,8 @@ end -- boosts the damage. Each type appears once, so this is a plain scan. function Battle:badgeTypeBoost(attacker, moveType) if attacker ~= self.player or not moveType then return false end + -- DoBadgeTypeBoosts' own tower guard (engine/battle/misc.asm:152-154). + if self.inBattleTowerBattle then return false end for _, row in ipairs(Battle.BADGE_TYPE_BOOSTS) do if row.type == moveType then return self:hasBadge(row.store, row.badge) @@ -3965,6 +3977,16 @@ function Battle:usableMoves(mon) return out end +-- ../pokecrystal/engine/battle/core.asm:3687-3694 refuses TRAP, CELEBI, +-- FORCESHINY and SUICUNE; pokegold's :3476-3479 has only the first and third. +function Battle:noEscapeBattleType() + local t = self.battleType + return t == Battle.BATTLETYPE_FORCESHINY + or t == Battle.BATTLETYPE_TRAP + or t == Battle.BATTLETYPE_CELEBI + or t == Battle.BATTLETYPE_SUICUNE +end + -- Running: Gen 2's odds (engine/battle/core.asm TryToRunAwayFromBattle) are -- based on the speed ratio and how many times you have tried this battle. -- Trainers never let you run. @@ -3978,8 +4000,7 @@ function Battle:tryRun(pSpd) -- BATTLETYPE_FORCESHINY jump straight to .cant_escape, ahead of the -- trainer check and any speed math. Without this, running from the Red -- Gyarados returned a WIN to the script and forfeited the one-shot shiny. - if self.battleType == Battle.BATTLETYPE_FORCESHINY - or self.battleType == Battle.BATTLETYPE_TRAP then + if self:noEscapeBattleType() then self:emit({ kind = "message", text = "Can't escape!" }) self.runRefused = true return false diff --git a/src/battle/gen2/Catching.lua b/src/battle/gen2/Catching.lua index 8284add5..625159d4 100644 --- a/src/battle/gen2/Catching.lua +++ b/src/battle/gen2/Catching.lua @@ -25,6 +25,7 @@ -- names src/battle/BattleState.lua raises on Gen 1, with the same argument -- order and the same payload keys (docs/mod-api-gen2-compat.md). local Runtime = require("src.mods.Runtime") +local Mon = require("src.battle.gen2.Mon") local Catching = {} @@ -337,6 +338,47 @@ function Catching.statusBonus(status, opts) return bonuses[status] or 0 end +-- constants/landmark_constants.asm:24, the fallback when no cache is passed. +Catching.LANDMARK_NATIONAL_PARK = 19 + +local function landmarkIndex(opts, id, fallback) + local data = opts and (opts.data or (opts.battle and opts.battle.data)) + local rows = (opts and opts.landmarks) + or (data and data.gen2Landmarks and data.gen2Landmarks.landmarks) + local row = rows and rows[id] + return (row and row.index) or fallback +end + +-- GetWorldMapLocation with the POKECENTER_2F backup-map swap +-- (engine/pokemon/caught_data.asm:177-193) and the Bug Contest override (:73-81). +function Catching.caughtLandmark(opts) + opts = opts or {} + if opts.bugContest then + return landmarkIndex(opts, "LANDMARK_NATIONAL_PARK", + Catching.LANDMARK_NATIONAL_PARK) + end + if opts.landmark then return opts.landmark end + local map = opts.map + if map and map.id == "POKECENTER_2F" and opts.backupMap then + map = opts.backupMap + end + return (map and map.landmark) or 0 +end + +-- SetCaughtData (engine/pokemon/caught_data.asm:163-199); no-op off Crystal. +function Catching.stampCaughtData(mon, opts) + opts = opts or {} + if not Mon.hasCaughtData(opts.version) then return mon end + local save = opts.save or (opts.battle and opts.battle.save) + return Mon.setCaughtData(mon, { + level = opts.level or (type(mon) == "table" and mon.level) or 0, + timeOfDay = opts.timeOfDay, + landmark = Catching.caughtLandmark(opts), + playerGender = opts.playerGender + or (save and save.player and save.player.gender), + }) +end + -- Does the ball catch? Returns caught and the final rate (wFinalCatchRate). -- A rate of 255 or a Master Ball is certain. -- diff --git a/src/battle/gen2/Damage.lua b/src/battle/gen2/Damage.lua index 58a2b112..df97a1d4 100644 --- a/src/battle/gen2/Damage.lua +++ b/src/battle/gen2/Damage.lua @@ -21,8 +21,13 @@ -- per-move as in Gen 4: type ids below FIRE are physical. type_chart.lua's -- records carry that as `category`. +local GameVersion = require("src.core.GameVersion") + local Damage = {} +-- ../pokecrystal/constants/battle_constants.asm:78 +Damage.MAX_STAT_VALUE = 999 + -- data/battle/critical_hit_chances.asm, as "1 in N". Damage.CRITICAL_CHANCES = { [0] = 15, 8, 4, 3, 2, 2, 2 } @@ -60,7 +65,23 @@ end function Damage.applyStage(value, stage) local numerator, denominator = Damage.stageMultiplier(stage) local out = math.floor(value * numerator / denominator) - return math.max(1, out) + -- ../pokecrystal/engine/battle/core.asm:6739 + return math.max(1, math.min(Damage.MAX_STAT_VALUE, out)) +end + +-- TruncateHL_BC: ../pokegold/engine/battle/effect_commands.asm:2625 runs one +-- pass, ../pokecrystal/engine/battle/effect_commands.asm:2644 loops it. +function Damage.truncateStats(attack, defense, fixed) + local a = math.max(0, math.floor(attack or 0)) + local d = math.max(0, math.floor(defense or 0)) + while a > 255 or d > 255 do + d = math.floor(d / 4) + if d == 0 then d = 1 end + a = math.floor(a / 4) + if a == 0 then a = 1 end + if not fixed then break end + end + return a % 256, d % 256 end -- Is this move physical? `types` is type_chart.lua's `types` table. @@ -169,6 +190,8 @@ end -- random(n) -- 0..n-1, for the variation roll -- screen -- Reflect/Light Screen active on the defender -- defenseHalved -- EFFECT_SELFDESTRUCT's srl c +-- reflectOverflowFixed -- override GameVersion.fixes()'s TruncateHL_BC +-- answer; ../pokecrystal/engine/battle/effect_commands.asm:2644 -- -- Returns damage, info where info carries the pieces a battle message needs: -- effectiveness (x10), critical, physical, variation. @@ -204,6 +227,12 @@ function Damage.calc(opts) defense = defense * 2 end + -- PlayerAttackDamage hands DamageCalc one-byte stats + -- (../pokecrystal/engine/battle/effect_commands.asm:2604). + local fixed = opts.reflectOverflowFixed + if fixed == nil then fixed = GameVersion.fixes().reflectOverflow == true end + attack, defense = Damage.truncateStats(attack, defense, fixed) + -- BattleCommand_DamageCalc (effect_commands.asm:2905-2913): Selfdestruct and -- Explosion halve the defence, never below 1. if opts.defenseHalved then defense = math.max(1, math.floor(defense / 2)) end diff --git a/src/battle/gen2/Mon.lua b/src/battle/gen2/Mon.lua index 5f515567..ca7d363e 100644 --- a/src/battle/gen2/Mon.lua +++ b/src/battle/gen2/Mon.lua @@ -17,6 +17,7 @@ -- with a sign bit on the n^2 term. pokemon.lua carries those five numbers per -- GROWTH_* so this needs no hardcoded table. +local GameVersion = require("src.core.GameVersion") local Unown = require("src.core.gen2.Unown") -- The mod event bus. pokemon.level_up and pokemon.move_learned are the SAME -- names src/battle/Experience.lua and src/battle/BattleState.lua raise on @@ -32,6 +33,102 @@ Mon.PARTY_SIZE = 6 -- DVs are 0..15 each; Attack's low bit pair also decides gender and shininess. Mon.MAX_DV = 15 +-- MON_CAUGHTDATA's two packed bytes and their masks -- +-- constants/pokemon_data_constants.asm:93-99, :120-130. +Mon.CAUGHT_TIME_MASK = 0xc0 +Mon.CAUGHT_LEVEL_MASK = 0x3f +Mon.CAUGHT_GENDER_MASK = 0x80 +Mon.CAUGHT_LOCATION_MASK = 0x7f +Mon.CAUGHT_EGG_LEVEL = 1 +-- constants/landmark_constants.asm:111-113 +Mon.LANDMARK_EVENT = 0x7f +Mon.LANDMARK_GIFT = 0x7e + +-- Gold spends the same word on `rb_skip 2` and has no SetCaughtData -- +-- pokegold constants/pokemon_data_constants.asm:93. +function Mon.hasCaughtData(version) + return GameVersion.engine(version) == "crystal" +end + +-- wTimeOfDay is only MORN / DAY / NITE (engine/rtc/rtc.asm:48-55), stored +-- `inc a`'d so 0 stays free -- engine/pokemon/caught_data.asm:169-172. +local CAUGHT_TIME = { MORN = 1, DAY = 2, NITE = 3, DARK = 3 } + +function Mon.caughtTimeOf(timeOfDay) + if type(timeOfDay) == "string" then return CAUGHT_TIME[timeOfDay] or 0 end + if type(timeOfDay) ~= "number" then return 0 end + local id = math.floor(timeOfDay) + if id < 0 or id > 3 then return 0 end + if id > 2 then id = 2 end + return id + 1 +end + +-- wPlayerGender's bit 0 is PLAYERGENDER_FEMALE_F (constants/ram_constants.asm:177). +local CAUGHT_GENDER = { + girl = "girl", female = "girl", boy = "boy", male = "boy", +} + +function Mon.caughtGenderOf(gender) + if gender == true then return "girl" end + if gender == false then return "boy" end + if type(gender) ~= "string" then return nil end + return CAUGHT_GENDER[gender:lower()] +end + +local function landmarkByte(landmark) + if type(landmark) ~= "number" then return 0 end + return math.floor(landmark) % 0x80 +end + +-- SetBoxmonOrEggmonCaughtData (engine/pokemon/caught_data.asm:168-199); the +-- egg path hands CAUGHT_EGG_LEVEL in as `level` (:239-242). +function Mon.setCaughtData(mon, opts) + if type(mon) ~= "table" then return mon end + opts = opts or {} + mon.caughtTime = Mon.caughtTimeOf(opts.timeOfDay) + mon.caughtLevel = math.max(0, math.floor(opts.level or mon.level or 0)) + mon.caughtLocation = landmarkByte(opts.landmark) + mon.caughtByGender = Mon.caughtGenderOf(opts.playerGender) or "boy" + return mon +end + +-- CAUGHT_BY_UNKNOWN / GIRL / BOY, the code SetGiftMonCaughtData takes in `b` +-- (constants/pokemon_data_constants.asm:126-128). +Mon.CAUGHT_BY = { unknown = 0, girl = 1, boy = 2 } + +-- SetGiftMonCaughtData (engine/pokemon/caught_data.asm:226-233): `rrc b / or +-- LANDMARK_GIFT` puts CAUGHT_BY_BOY on $7f, LANDMARK_EVENT, not on a gender bit. +function Mon.setGiftCaughtData(mon, caughtBy) + if type(mon) ~= "table" then return mon end + local code = Mon.CAUGHT_BY[tostring(caughtBy):lower()] or 0 + local rotated = math.floor(code / 2) + (code % 2) * Mon.CAUGHT_GENDER_MASK + local unpacked = Mon.unpackCaughtData(0, Mon.LANDMARK_GIFT + rotated) + mon.caughtTime, mon.caughtLevel = 0, 0 + mon.caughtLocation = unpacked.caughtLocation + mon.caughtByGender = unpacked.caughtByGender + return mon +end + +-- The packed pair, as engine/pokemon/caught_data.asm:169-199 stores it. +function Mon.packCaughtData(mon) + mon = type(mon) == "table" and mon or {} + local time = math.floor(tonumber(mon.caughtTime) or 0) % 4 + local level = math.floor(tonumber(mon.caughtLevel) or 0) % 0x40 + local location = landmarkByte(tonumber(mon.caughtLocation) or 0) + local female = Mon.caughtGenderOf(mon.caughtByGender) == "girl" + return time * 0x40 + level, (female and Mon.CAUGHT_GENDER_MASK or 0) + location +end + +function Mon.unpackCaughtData(byte0, byte1) + byte0, byte1 = math.floor(byte0 or 0) % 256, math.floor(byte1 or 0) % 256 + return { + caughtTime = math.floor(byte0 / 0x40), + caughtLevel = byte0 % 0x40, + caughtLocation = byte1 % 0x80, + caughtByGender = (byte1 >= Mon.CAUGHT_GENDER_MASK) and "girl" or "boy", + } +end + local function rand(a, b) if love and love.math and love.math.random then return love.math.random(a, b) @@ -362,7 +459,11 @@ function Mon.new(data, species, level, opts) status = nil, -- 70 for a caught mon, 120 for a gift/hatched one. happiness = opts.happiness or 70, - caughtLevel = level, + caughtLevel = opts.caughtLevel or level, + -- MON_CAUGHTDATA, absent on Gold -- constants/pokemon_data_constants.asm:93-99. + caughtTime = opts.caughtTime, + caughtLocation = opts.caughtLocation, + caughtByGender = opts.caughtByGender, -- shiny.roll / gender.roll get the species and level as context; opts.shiny -- still wins, because a FORCED shiny battle (Red Gyarados) is the cart -- overriding the roll rather than a roll to be hooked. diff --git a/src/core/Game2.lua b/src/core/Game2.lua index 4ab8a479..176ee13f 100644 --- a/src/core/Game2.lua +++ b/src/core/Game2.lua @@ -19,6 +19,7 @@ local Clock = require("src.core.gen2.Clock") local FixedStep = require("src.core.FixedStep") local Font = require("src.render.Font") local GamepadMap = require("src.core.GamepadMap") +local GameVersion = require("src.core.GameVersion") local Input = require("src.core.Input") local Music = require("src.core.Music") local Save = require("src.core.gen2.Save") @@ -288,8 +289,6 @@ function Game2:continueGame(save) self:startWorld() -- After the adopt and after the world is standing, which is where Gen 1 -- emits it (src/core/Game.lua:1127, once the stack has been rebuilt). - -- `meta` stays absent on a Gold save, which stamps no meta block; modsDiff - -- is derived from it and so comes back empty rather than missing. if modsDiff then local notice = SaveData.modsDiffNotice(modsDiff, save.meta) if notice then require("src.core.Logger").warn("%s", notice) end @@ -354,10 +353,14 @@ function Game2:showTitle() }) end +-- ../pokegold/engine/movie/intro.asm:1 GoldSilverIntro, and Crystal's own +-- program at ../pokecrystal/engine/movie/intro.asm:1 CrystalIntro. function Game2:showIntro() self.stack:clear() self.phase = "boot" - Screens.push(self, "Gen2GoldSilverIntro", { + local id = (GameVersion.engine() == "crystal") + and "Gen2CrystalIntro" or "Gen2GoldSilverIntro" + Screens.push(self, id, { onDone = function() self:showTitle() end, diff --git a/src/core/GameVersion.lua b/src/core/GameVersion.lua index b6435b86..e9b57cc7 100644 --- a/src/core/GameVersion.lua +++ b/src/core/GameVersion.lua @@ -1,6 +1,6 @@ -- Which game this process is running: Red (the historical default), Blue, --- Yellow, Gold, or Silver. One source of truth for everything that differs by --- version -- the accepted ROM hash, the import manifest, where the +-- Yellow, Gold, Silver, or Crystal. One source of truth for everything that +-- differs by version -- the accepted ROM hash, the import manifest, where the -- extracted cache lives, and the save-file suffix -- so the importer, -- cache mount, SaveData, title screen and palette all agree. -- @@ -8,8 +8,9 @@ -- saves are untouched, but its extracted cache lives under red/ like Blue, -- Yellow, and Gold (issue #899); a legacy root cache is moved into red/ once -- by CacheFs.migrateLegacyRedCache. All supported versions can be imported --- and selected side by side. Gold and Silver are Gen 2 (see --- docs/gold-phase1.md). +-- and selected side by side. Gold, Silver and Crystal are Gen 2 (see +-- docs/gold-phase1.md); `generation` splits Gen 1 from Gen 2 and `engine` +-- splits Gold/Silver from Crystal within Gen 2. -- -- Zero requires, so it loads during love.conf and under plain Lua for tools -- and tests. The active version is a process-global set once at boot from @@ -27,6 +28,8 @@ GameVersion.VERSIONS = { manifest = "tools/rom_manifest.json", cachePrefix = "red/", -- red/data/generated, red/assets/generated (#899) saveSuffix = "", -- save.lua / save.lua.bak / save.lua.tmp + -- Absent reads as "gen1" (GameVersion.engine) + engine = "gen1", }, blue = { id = "blue", @@ -37,6 +40,7 @@ GameVersion.VERSIONS = { manifest = "tools/rom_manifest_blue.json", cachePrefix = "blue/", -- blue/data/generated, blue/assets/generated saveSuffix = "_blue", -- save_blue.lua / .bak / .tmp + engine = "gen1", }, yellow = { id = "yellow", @@ -47,6 +51,7 @@ GameVersion.VERSIONS = { manifest = "tools/rom_manifest_yellow.json", cachePrefix = "yellow/", -- yellow/data/generated, yellow/assets/generated saveSuffix = "_yellow", -- save_yellow.lua / .bak / .tmp + engine = "gen1", }, -- Gen 2, Phase 1 (docs/gold-phase1.md): a 2 MiB cart, twice the size of -- the Gen 1 ROMs above, imported through RomExtractorGen2 instead of @@ -64,6 +69,7 @@ GameVersion.VERSIONS = { saveSuffix = "_gold", -- save_gold.lua / .bak / .tmp -- Absent reads as 1 (GameVersion.generation) generation = 2, + engine = "gs", }, -- Gold's engine with edition-selected data; the manifest is derived from -- Gold's by tools/make_silver_manifest.py. @@ -77,11 +83,34 @@ GameVersion.VERSIONS = { cachePrefix = "silver/", -- silver/data/generated, silver/assets/generated saveSuffix = "_silver", -- save_silver.lua / .bak / .tmp generation = 2, + engine = "gs", + }, + crystal = { + id = "crystal", + label = "Crystal", + displayName = "Pokemon Crystal", + launcherName = "Crystal (Beta)", + sha1 = "f4cd194bdee0d04ca4eac29e09b8e4e9d818c133", + manifest = "tools/rom_manifest_crystal.json", + cachePrefix = "crystal/", -- crystal/data/generated, crystal/assets/generated + saveSuffix = "_crystal", -- save_crystal.lua / .bak / .tmp + generation = 2, + engine = "crystal", + fixes = { + -- pokegold/docs/bugs_and_glitches.md:61 + luckyNumberBoxes = true, + -- pokegold/docs/bugs_and_glitches.md:88 + surfOntoNpc = true, + -- pokecrystal/engine/battle/effect_commands.asm:2614 + reflectOverflow = true, + }, }, } --- Launcher column order. -GameVersion.ORDER = { "red", "blue", "yellow", "gold", "silver" } +local NO_FIXES = {} + +-- Launcher column order. Append only (src/mods/ModProfile.lua encodes by index). +GameVersion.ORDER = { "red", "blue", "yellow", "gold", "silver", "crystal" } GameVersion.current = "red" @@ -115,6 +144,17 @@ function GameVersion.generation(id) return GameVersion.info(id).generation or 1 end +-- "gen1" | "gs" | "crystal": lineage within a generation. +function GameVersion.engine(id) + return GameVersion.info(id).engine or "gen1" +end + +-- Cart bugs a version FIXED, by fix name; an absent row reads {} and stays bugged. +function GameVersion.fixes(id) + local info = GameVersion.info(id) + return (info and info.fixes) or NO_FIXES +end + -- Metadata for a version id, defaulting to the active one. function GameVersion.info(id) return GameVersion.VERSIONS[id or GameVersion.current] diff --git a/src/core/LaunchOptions.lua b/src/core/LaunchOptions.lua index 7317ba8a..18a692b2 100644 --- a/src/core/LaunchOptions.lua +++ b/src/core/LaunchOptions.lua @@ -40,6 +40,7 @@ local function normalizeVersion(v) y = "yellow", yellow = "yellow", g = "gold", gold = "gold", s = "silver", silver = "silver", + c = "crystal", crystal = "crystal", } v = alias[v] or v if GameVersion.VERSIONS and not GameVersion.VERSIONS[v] then return nil end diff --git a/src/core/SaveData.lua b/src/core/SaveData.lua index 53e44f3c..514bd433 100644 --- a/src/core/SaveData.lua +++ b/src/core/SaveData.lua @@ -1486,8 +1486,10 @@ function SaveData.runMigrations(save, modChains, activeMods) -- every step whose from-format the save has not passed yet runs, in -- (from, registration) order; a save at the current format runs none local fmt = (save.meta and save.meta.format) or 1 - for _, m in ipairs(coreMigrations) do - if m.from >= fmt then m.fn(save) end + if GameVersion.generation() == 1 then + for _, m in ipairs(coreMigrations) do + if m.from >= fmt then m.fn(save) end + end end -- a save that predates meta records an empty mod set: an old vanilla -- save becomes a v2 vanilla save diff --git a/src/core/gen2/BattleTower.lua b/src/core/gen2/BattleTower.lua new file mode 100644 index 00000000..9a18cda9 --- /dev/null +++ b/src/core/gen2/BattleTower.lua @@ -0,0 +1,503 @@ +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1 and +-- ../pokecrystal/engine/events/battle_tower/rules.asm:27. + +local Breeding = require("src.core.gen2.Breeding") +local HallOfFame = require("src.core.gen2.HallOfFame") +local Mon = require("src.battle.gen2.Mon") +local Save = require("src.core.gen2.Save") + +local BattleTower = {} + +-- ../pokecrystal/constants/battle_tower_constants.asm:1-7 +BattleTower.PARTY_LENGTH = 3 +BattleTower.STREAK_LENGTH = 7 +BattleTower.NUM_UNIQUE_MON = 21 +BattleTower.NUM_UNIQUE_TRAINERS = 70 +BattleTower.TRAINERDATALENGTH = 36 + +-- ../pokecrystal/constants/battle_tower_constants.asm:47 GS_BALL_AVAILABLE +BattleTower.GS_BALL_AVAILABLE = 0x0b + +-- ../pokecrystal/constants/battle_tower_constants.asm:55-61 +BattleTower.NO_CHALLENGE = 0 +BattleTower.SAVED_AND_LEFT = 1 +BattleTower.CHALLENGE_IN_PROGRESS = 2 +BattleTower.WON_CHALLENGE = 3 +BattleTower.RECEIVED_REWARD = 4 + +-- ../pokecrystal/constants/battle_tower_constants.asm:63-67 +BattleTower.REWARD_QUANTITY = 5 +BattleTower.MIN_REWARD = "HP_UP" +BattleTower.MAX_REWARD = "CALCIUM" +BattleTower.SKIPPED_REWARD = "LUCKY_PUNCH" +BattleTower.FALLBACK_REWARD = "POTION" + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1471-1492 bit 0, +-- :978-1008 bit 1 of sBattleTowerSaveFileFlags. +BattleTower.SAVEFILE_REGISTERED = 1 +BattleTower.SAVEFILE_EXPLANATION = 2 + +-- ../pokecrystal/constants/battle_tower_constants.asm:11-43 +BattleTower.ACTIONS = { + CHECK_EXPLANATION_READ = 0, + SET_EXPLANATION_READ = 1, + GET_CHALLENGE_STATE = 2, + SAVE_AND_QUIT = 3, + CHALLENGECANCELED = 4, + ACTION_05 = 5, + ACTION_06 = 6, + SAVELEVELGROUP = 7, + LOADLEVELGROUP = 8, + CHECKSAVEFILEISYOURS = 9, + ACTION_0A = 10, + GSBALL = 11, + ACTION_0C = 12, + ACTION_0D = 13, + EGGTICKET = 14, + ACTION_0F = 15, + ACTION_10 = 16, + ACTION_11 = 17, + ACTION_12 = 18, + ACTION_13 = 19, + ACTION_14 = 20, + ACTION_15 = 21, + ACTION_16 = 22, + ACTION_17 = 23, + LEVEL_CHECK = 24, + UBERS_CHECK = 25, + RESETDATA = 26, + GIVEREWARD = 27, + ACTION_1C = 28, + ACTION_1D = 29, + CHOOSEREWARD = 30, + SAVEOPTIONS = 31, +} +BattleTower.NUM_ACTIONS = 32 + +-- ../pokecrystal/ram/wram.asm:1703 wNrOfBeatenBattleTowerTrainers, which +-- ../pokecrystal/maps/BattleTowerBattleRoom.asm:38 reads back with `readmem`. +BattleTower.WRAM_NR_BEATEN = 0xcf64 + +-- ../pokecrystal/constants/battle_tower_constants.asm:49-53 `battletowertext`. +BattleTower.TEXT_INTRO = 1 +BattleTower.TEXT_WIN = 2 +BattleTower.TEXT_LOSS = 3 + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:39-55, in the order +-- BattleTower_ExecuteJumptable prints them. +BattleTower.RULE_HEADER_TEXT = "_ExcuseMeYoureNotReadyText" +BattleTower.RULE_FAIL_TEXTS = { + "_OnlyThreeMonMayBeEnteredText", + "_TheMonMustAllBeDifferentKindsText", + "_TheMonMustNotHoldTheSameItemsText", + "_YouCantTakeAnEggText", +} +-- ../pokecrystal/engine/events/battle_tower/rules.asm:61-68 +BattleTower.RULE_TAIL_TEXT = "_BattleTowerReturnWhenReadyText" +-- ../pokecrystal/engine/events/battle_tower/rules.asm:28-31 wStringBuffer2. +BattleTower.RULE_PARTY_COUNT_TEXT = "3" + +-- ../pokecrystal/mobile/mobile_46.asm:3936-3958 BattleTower_UbersCheck. +BattleTower.UBERS = { + MEWTWO = true, MEW = true, LUGIA = true, HO_OH = true, CELEBI = true, +} +BattleTower.UBER_MIN_LEVEL = 70 + +-- ../pokecrystal/mobile/mobile_46.asm:3869-3887 Strings_L10ToL100 and +-- Strings_Ll0ToL40. +BattleTower.MAX_LEVEL_GROUP = 10 +BattleTower.PRE_HOF_LEVEL_GROUPS = 4 + +local function counter(value) + return math.max(0, math.floor(tonumber(value) or 0)) +end + +-- ../pokecrystal/ram/sram.asm:147-172, on top of Save.battleTowerState. +function BattleTower.state(save) + local tower = Save.battleTowerState(save) + -- ../pokecrystal/ram/sram.asm:156 sBTChoiceOfLevelGroup + tower.levelGroup = counter(tower.levelGroup) + -- ../pokecrystal/ram/sram.asm:159 sBattleTowerSaveFileFlags + tower.saveFileFlags = counter(tower.saveFileFlags) % 256 + -- ../pokecrystal/ram/sram.asm:158 sBTTrainers, $ff for an unused slot + if type(tower.trainers) ~= "table" then tower.trainers = {} end + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1449-1469 s5_aa8d + if tower.reentry == nil then tower.reentry = false end + return tower +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1471-1483 and +-- :984-989: `and 1` / `and 2`, so the answer is the MASKED byte, not a boolean. +function BattleTower.saveFileFlag(save, mask) + local tower = BattleTower.state(save) + return (math.floor(tower.saveFileFlags / mask) % 2 == 1) and mask or 0 +end + +function BattleTower.setSaveFileFlag(save, mask) + local tower = BattleTower.state(save) + if math.floor(tower.saveFileFlags / mask) % 2 == 0 then + tower.saveFileFlags = tower.saveFileFlags + mask + end + return tower.saveFileFlags +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:890-904 +function BattleTower.resetTrainers(save) + local tower = BattleTower.state(save) + tower.trainers = {} + tower.streak = 0 + return tower +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1016-1022 +function BattleTower.setChallengeState(save, state) + local tower = BattleTower.state(save) + tower.challenge = counter(state) + return tower.challenge +end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:206-211 +function BattleTower.partyCountOk(party) + return #party == BattleTower.PARTY_LENGTH +end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:218-277 +-- CheckPartyValueIsUnique: eggs are skipped on both sides and a zero value +-- never collides, because `ld a, [hl] / and a / jr z, .next` drops it first. +local function valuesUnique(party, get) + local count = #party + for i = 1, count - 1 do + local mon = party[i] + if not Breeding.isEgg(mon) then + local value = get(mon) + if value ~= nil and value ~= 0 then + for j = i + 1, count do + local other = party[j] + if not Breeding.isEgg(other) and get(other) == value then + return false + end + end + end + end + end + return true +end + +local function speciesOf(mon) return mon and mon.species or nil end +local function itemOf(mon) return mon and mon.item or nil end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:213-216 +function BattleTower.speciesUnique(party) + return valuesUnique(party, speciesOf) +end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:279-282 +function BattleTower.itemsUnique(party) + return valuesUnique(party, itemOf) +end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:284-299 +function BattleTower.partyHasEgg(party) + for _, mon in ipairs(party) do + if Breeding.isEgg(mon) then return true end + end + return false +end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:27-37 and :94-103: every +-- check runs, the first failure prints the header first, and a tail line +-- follows any failure at all. Returns the text labels in printing order. +function BattleTower.checkRules(party) + party = party or {} + local failed = { + not BattleTower.partyCountOk(party), + not BattleTower.speciesUnique(party), + not BattleTower.itemsUnique(party), + BattleTower.partyHasEgg(party), + } + local lines, any = {}, false + for index = 1, #BattleTower.RULE_FAIL_TEXTS do + if failed[index] then + if not any then + any = true + lines[#lines + 1] = BattleTower.RULE_HEADER_TEXT + end + lines[#lines + 1] = BattleTower.RULE_FAIL_TEXTS[index] + end + end + if any then lines[#lines + 1] = BattleTower.RULE_TAIL_TEXT end + return lines, any +end + +-- ../pokecrystal/mobile/mobile_46.asm:1156-1166: the Hall of Fame flag is what +-- opens rooms above L40, and the last row is always CANCEL. +function BattleTower.levelGroupCount(save) + if HallOfFame.hasEntered(save) then return BattleTower.MAX_LEVEL_GROUP end + return BattleTower.PRE_HOF_LEVEL_GROUPS +end + +function BattleTower.levelGroupRows(save) + local rows = {} + for group = 1, BattleTower.levelGroupCount(save) do + rows[group] = { group = group, level = group * 10 } + end + return rows +end + +-- ../pokecrystal/mobile/mobile_46.asm:1264-1267 `dec a / and $fe / srl a`, the +-- BATTLE ROOM pair the hallway walks to (../pokecrystal/maps/BattleTowerHallway.asm:40-47). +function BattleTower.roomOf(group) + return math.floor((math.max(1, counter(group)) - 1) / 2) +end + +-- ../pokecrystal/mobile/mobile_46.asm:3892-3934 BattleTower_LevelCheck +function BattleTower.levelCheck(party, group) + local cap = counter(group) * 10 + for _, mon in ipairs(party or {}) do + if (tonumber(mon.level) or 0) > cap then return true end + end + return false +end + +-- ../pokecrystal/mobile/mobile_46.asm:3936-3989 BattleTower_UbersCheck: below +-- the L70 rooms an uber under L70 is refused, and its name goes in wcd49. +function BattleTower.ubersCheck(party, group) + if counter(group) >= BattleTower.UBER_MIN_LEVEL / 10 then return nil end + for _, mon in ipairs(party or {}) do + if BattleTower.UBERS[mon.species] + and (tonumber(mon.level) or 0) < BattleTower.UBER_MIN_LEVEL then + return mon.species + end + end + return nil +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:955-976: a +-- `maskbits` roll over HP_UP..CALCIUM that folds the overshoot back to the +-- bottom of the range and rerolls LUCKY_PUNCH. +function BattleTower.rollReward(order, random) + if type(order) ~= "table" then return nil end + local low, high + for index, name in pairs(order) do + if name == BattleTower.MIN_REWARD then low = index end + if name == BattleTower.MAX_REWARD then high = index end + end + if not (low and high) then return nil end + local span = high - low + 1 + local mask = 1 + while mask < span do mask = mask * 2 end + for _ = 1, 64 do + local roll = random(mask) % mask + if roll >= span then roll = roll - span end + local item = order[low + roll] + if item ~= BattleTower.SKIPPED_REWARD then return item end + end + return order[low] +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:906-933: five of +-- the reward only fit when the ITEM pocket has a free slot, or already holds +-- the reward with room for five more. Otherwise the desk hands over a POTION, +-- which the script reads as "your PACK is stuffed full". +function BattleTower.rewardFits(slots, capacity, held) + if counter(slots) < counter(capacity) then return true end + if held == nil then return false end + return counter(held) < 99 - BattleTower.REWARD_QUANTITY + 1 +end + +-- The opponent draw, all of it ../pokecrystal/engine/events/battle_tower/ +-- load_trainer.asm, over RomExtractorGen2's Crystal-only `battleTower` block. + +-- data/generated/trainers.lua `battleTower`, absent on Gold and Silver. +function BattleTower.roster(data) + local trainers = data and (data.gen2Trainers or data.trainers) + local roster = trainers and trainers.battleTower + if type(roster) ~= "table" then return nil end + if type(roster.trainers) ~= "table" or type(roster.groups) ~= "table" then + return nil + end + return roster +end + +-- ../pokecrystal/ram/sram.asm:162-173 sBTMonOfTrainers: the last team's three +-- species and the one before that's, which the draw refuses to repeat. +function BattleTower.prevTeams(save) + local tower = BattleTower.state(save) + local teams = tower.prevTeams + if type(teams) ~= "table" then + teams = {} + tower.prevTeams = teams + end + if type(teams.prev) ~= "table" then teams.prev = {} end + if type(teams.prevPrev) ~= "table" then teams.prevPrev = {} end + return teams +end + +-- ../pokecrystal/engine/events/battle_tower/load_trainer.asm:104-105 reads the +-- room back as `ld a, [wBTChoiceOfLvlGroup] / dec a`, so group 0 indexes +-- BEFORE the table; battle_tower.asm:1129-1141 is what can only save 1..10. +function BattleTower.opponentGroup(save, roster) + local groups = (roster and roster.levelGroups) or BattleTower.MAX_LEVEL_GROUP + local group = counter(BattleTower.state(save).levelGroup) + if group < 1 then return 1 end + if group > groups then return groups end + return group +end + +-- load_trainer.asm:24-38 and :101-166 reroll until the roll passes; one draw +-- from the survivors is the same distribution and cannot spin. An empty +-- survivor set is where the cart's own loop would hang, so it draws unfiltered. +local function drawFiltered(count, random, accept) + local pool = {} + for index = 1, count do + if accept(index) then pool[#pool + 1] = index end + end + if #pool == 0 then return random(count) end + return pool[random(#pool)] +end + +-- ../pokecrystal/engine/events/battle_tower/load_trainer.asm:22-60. The roll +-- is refused while it names anybody already in sBTTrainers, and the winner is +-- written into the slot sNrOfBeatenBattleTowerTrainers points at. +function BattleTower.chooseTrainer(save, roster, random) + local tower = BattleTower.state(save) + -- :29-37, the ceiling read out of the cart: Crystal 1.0 masks with + -- BATTLETOWER_NUM_UNIQUE_MON and can only ever draw the first 21 rows. + local ceiling = counter(roster.sampleTrainers) + if ceiling < 1 or ceiling > #roster.trainers then ceiling = #roster.trainers end + local seen = {} + for slot = 1, BattleTower.STREAK_LENGTH do + local held = tonumber(tower.trainers[slot]) + if held then seen[held] = true end + end + local index = drawFiltered(ceiling, random, function(row) + return not seen[row - 1] + end) + tower.trainers[math.min(counter(tower.streak), BattleTower.STREAK_LENGTH - 1) + + 1] = index - 1 + return roster.trainers[index] +end + +-- ../pokecrystal/engine/events/battle_tower/load_trainer.asm:94-208. Three +-- draws out of the chosen level group, each refusing a species this team +-- already holds, an ITEM this team already holds, and any species from the +-- last two teams. wBT_OTTrainer was zero-filled and its three item slots set +-- to $ff first (:7-17), which is why an unfilled slot collides with nothing. +function BattleTower.chooseTeam(save, roster, group, random) + local rows = roster.groups[group] or {} + local teams = BattleTower.prevTeams(save) + local picked, species, items = {}, {}, {} + for _ = 1, BattleTower.PARTY_LENGTH do + local index = drawFiltered(#rows, random, function(row) + local mon = rows[row] + if not mon then return false end + if species[mon.species] then return false end + if mon.item ~= nil and items[mon.item] then return false end + for _, seen in ipairs(teams.prev) do + if seen == mon.species then return false end + end + for _, seen in ipairs(teams.prevPrev) do + if seen == mon.species then return false end + end + return true + end) + local mon = rows[index] + if not mon then break end + picked[#picked + 1] = mon + species[mon.species] = true + if mon.item ~= nil then items[mon.item] = true end + end + -- :195-206, after all three: this team becomes sBTMonPrevTrainer and the + -- one it displaces becomes sBTMonPrevPrevTrainer. + local prev = {} + for slot, mon in ipairs(picked) do prev[slot] = mon.species end + teams.prevPrev = teams.prev + teams.prev = prev + return picked +end + +-- The whole of `special LoadOpponentTrainerAndPokemon`, as one record. The +-- cart keeps it in wBT_OTTrainer, which is WRAM bank 3 and is NOT saved -- +-- only the sBTTrainers slot and the two previous teams this walk writes are. +function BattleTower.drawOpponent(data, save, random) + local roster = BattleTower.roster(data) + if not roster then return nil end + local group = BattleTower.opponentGroup(save, roster) + local trainer = BattleTower.chooseTrainer(save, roster, random) + if not trainer then return nil end + local rows = BattleTower.chooseTeam(save, roster, group, random) + return { + index = trainer.index, + name = trainer.name, + class = trainer.class, + classId = trainer.classId, + sprite = roster.classSprites and roster.classSprites[trainer.classId], + group = group, + rows = rows, + } +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:549-570 +-- CopyBTTrainer_FromBT_OT_TowBT_OTTemp, which is the first thing +-- ReadBTTrainerParty does: the challenge is now in progress and the streak +-- counter steps BEFORE the battle, which is why beating the seventh opponent +-- leaves the counter on BATTLETOWER_STREAK_LENGTH. +function BattleTower.beginBattle(save) + local tower = BattleTower.state(save) + tower.challenge = BattleTower.CHALLENGE_IN_PROGRESS + tower.streak = counter(tower.streak) + 1 + return tower.streak +end + +-- ReadBTTrainerParty's .otpartymon_loop (battle_tower.asm:349-376) copies the +-- whole party_struct into wOTPartyMon, so nothing here is rolled: the stored +-- stats go on top of Mon.new's, which agree with them anyway. +-- The ROM nicknames never show: load_trainer.asm:171-190 overwrites each one +-- with GetPokemonName, so the rows carry none. +function BattleTower.battleParty(data, rows) + local party = {} + for _, row in ipairs(rows or {}) do + local moves = nil + if row.moves and #row.moves > 0 then + moves = {} + for slot, id in ipairs(row.moves) do + local def = data and data.moves and data.moves[id] + local max = (def and def.pp) or 0 + moves[slot] = { + id = id, + pp = (row.pp and row.pp[slot]) or max, + maxPp = max, + } + end + end + local dvs = row.dvs or {} + local statExp = row.statExp or {} + local mon = Mon.new(data, row.species, row.level, { + moves = moves, + item = row.item, + dvs = { attack = dvs.attack, defense = dvs.defense, + speed = dvs.speed, special = dvs.special }, + statExp = { hp = statExp.hp, attack = statExp.attack, + defense = statExp.defense, speed = statExp.speed, + special = statExp.special }, + happiness = row.happiness, + }) + if mon then + if row.stats then + mon.stats = { + hp = row.stats.hp, attack = row.stats.attack, + defense = row.stats.defense, speed = row.stats.speed, + specialAttack = row.stats.specialAttack, + specialDefense = row.stats.specialDefense, + } + end + mon.maxHp = row.maxHp or mon.maxHp + mon.hp = row.hp or mon.maxHp + mon.experience = row.experience or mon.experience + party[#party + 1] = mon + end + end + return party +end + +return BattleTower diff --git a/src/core/gen2/Breeding.lua b/src/core/gen2/Breeding.lua index 25a82de5..57db6832 100644 --- a/src/core/gen2/Breeding.lua +++ b/src/core/gen2/Breeding.lua @@ -883,6 +883,11 @@ function Breeding.withdraw(data, save, which) rebuilt.status = nil for _, move in ipairs(rebuilt.moves) do move.pp = move.maxPp end rebuilt.caughtLevel = mon.caughtLevel or rebuilt.caughtLevel + -- RetrieveBreedmon copies the stored struct back whole, MON_CAUGHTDATA + -- included -- engine/pokemon/move_mon.asm:805. + rebuilt.caughtTime = mon.caughtTime + rebuilt.caughtLocation = mon.caughtLocation + rebuilt.caughtByGender = mon.caughtByGender rebuilt.ot, rebuilt.otId = mon.ot, mon.otId -- CalcExpAtLevel, which is the experience loss. rebuilt.experience = Mon.experienceForLevel(growthOf(data, def), newLevel) @@ -1077,7 +1082,9 @@ end -- Returns the new record plus a table of side effects the caller owes: -- { species = , togepi = bool } -- SetSeenAndCaughtMon, and the -- EVENT_TOGEPI_HATCHED flag the ASM sets by hand for exactly one species. -function Breeding.hatch(data, save, index, nickname) +-- `where` is the hatch site for SetEggMonCaughtData: landmark, timeOfDay and +-- playerGender -- engine/pokemon/breeding.asm:228. +function Breeding.hatch(data, save, index, nickname, where) local party = (save and save.party) or {} local egg = party[index] if not Breeding.isEgg(egg) then return nil end @@ -1097,6 +1104,18 @@ function Breeding.hatch(data, save, index, nickname) hatched.ot = egg.ot or (save.player and save.player.name) hatched.otId = egg.otId or (save.player and save.player.id) hatched.caughtLevel = egg.level or Breeding.EGG_LEVEL + -- SetEggMonCaughtData swaps wCurPartyLevel for CAUGHT_EGG_LEVEL around the + -- shared setter -- engine/pokemon/caught_data.asm:235-246. + if Mon.hasCaughtData(save and save.version) then + where = where or {} + Mon.setCaughtData(hatched, { + level = Mon.CAUGHT_EGG_LEVEL, + timeOfDay = where.timeOfDay, + landmark = where.landmark, + playerGender = where.playerGender + or (save.player and save.player.gender), + }) + end party[index] = hatched Breeding.markPokedex(save, egg.species) diff --git a/src/core/gen2/Evolution.lua b/src/core/gen2/Evolution.lua index d295debb..fe18a59d 100644 --- a/src/core/gen2/Evolution.lua +++ b/src/core/gen2/Evolution.lua @@ -357,6 +357,7 @@ Evolution.MON_FIELDS = { experience = true, dvs = true, stats = true, hp = true, maxHp = true, types = true, moves = true, item = true, status = true, happiness = true, caughtLevel = true, shiny = true, gender = true, + caughtTime = true, caughtLocation = true, caughtByGender = true, } -- Turn `mon` into `entry.into`. Returns the NEW record; the caller writes it @@ -410,6 +411,11 @@ function Evolution.apply(data, mon, entry) evolved.experience = mon.experience evolved.status = mon.status evolved.caughtLevel = mon.caughtLevel + -- Nothing between GetBaseData and the PARTYMON_STRUCT_LENGTH copy back + -- touches MON_CAUGHTDATA -- engine/pokemon/evolve.asm:291-293. + evolved.caughtTime = mon.caughtTime + evolved.caughtLocation = mon.caughtLocation + evolved.caughtByGender = mon.caughtByGender -- Anything a future field adds to a party record (mail, pokerus) rides along -- rather than being silently dropped. Only fields Mon.new does NOT own may -- be carried: copying `nickname` back would undo diff --git a/src/core/gen2/Happiness.lua b/src/core/gen2/Happiness.lua index c31daedf..400a058f 100644 --- a/src/core/gen2/Happiness.lua +++ b/src/core/gen2/Happiness.lua @@ -86,8 +86,11 @@ Happiness.EVENT = { ENERGYROOT = 16, -- 10 REVIVALHERB = 17, -- 11 GROOMING = 18, -- 12 + -- Crystal only; Gold's enum stops at GROOMING + -- (pokegold constants/pokemon_data_constants.asm:205). + GAINLEVELATHOME = 19, -- 13 } -Happiness.NUM_EVENTS = 18 +Happiness.NUM_EVENTS = 19 -- data/events/happiness_changes.asm, transcribed row for row. The three -- columns are the three tiers below, in order. @@ -110,6 +113,7 @@ Happiness.CHANGES = { { -10, -10, -15 }, -- 10 Used Energy Root (bitter) { -15, -15, -20 }, -- 11 Used Revival Herb (bitter) { 3, 3, 1 }, -- 12 Grooming + { 10, 6, 4 }, -- 13 Gained a level where it was caught (Crystal) } -- Which of HappinessChanges' three columns a CURRENT value reads. The cart @@ -174,6 +178,23 @@ function Happiness.change(mon, event) return value end +-- LevelUpHappinessMod: the caught location masked with CAUGHT_LOCATION_MASK +-- against the current landmark -- engine/pokemon/level_up_happiness.asm:1-20. +function Happiness.levelUpEvent(mon, landmark) + local caught = type(mon) == "table" and tonumber(mon.caughtLocation) or nil + landmark = tonumber(landmark) + if not (caught and landmark) then return "GAINLEVEL" end + if math.floor(caught) % 0x80 ~= math.floor(landmark) % 0x80 then + return "GAINLEVEL" + end + return "GAINLEVELATHOME" +end + +-- The `callfar ChangeHappiness` that follows -- level_up_happiness.asm:19. +function Happiness.levelUp(mon, landmark) + return Happiness.change(mon, Happiness.levelUpEvent(mon, landmark)) +end + -- The same event across a party, which is how the Gym Leader award is written -- out longhand in engine/battle/core.asm InitEnemyTrainer: -- diff --git a/src/core/gen2/Roamers.lua b/src/core/gen2/Roamers.lua index 9526f5f6..f60ce4e5 100644 --- a/src/core/gen2/Roamers.lua +++ b/src/core/gen2/Roamers.lua @@ -1,5 +1,5 @@ -- The two pieces of Gen 2 world state that override where a wild mon comes --- from: the three roaming legendaries, and swarms. +-- from: the roaming legendaries, and swarms. -- -- Both live in one module because they are the same KIND of thing -- a -- persistent record that sits in front of a map's own encounter table -- and @@ -26,6 +26,7 @@ -- pair InitRoamMons never writes and BattleEnd_HandleRoamMons writes when a -- beast is caught or beaten -- is nil. +local GameVersion = require("src.core.GameVersion") local Mon = require("src.battle.gen2.Mon") local Runtime = require("src.mods.Runtime") @@ -37,7 +38,7 @@ local Roamers = {} -- map connection or a door triggers) and JumpRoamMons (the scatter a fly or a -- teleport triggers) -- so a tracker mod sees every hop. -- --- index the roamer slot, 1 Raikou / 2 Entei / 3 Suicune +-- index the roamer slot, 1 Raikou / 2 Entei / 3 Suicune (Gold only) -- slot that roamer record, already carrying the new map -- species the beast's species id -- from the map id it left @@ -68,9 +69,31 @@ Roamers.SPECIES = { { species = "ENTEI", level = 40, map = "ROUTE_37" }, { species = "SUICUNE", level = 40, map = "ROUTE_38" }, } -Roamers.COUNT = 3 Roamers.LEVEL = 40 +-- pokecrystal/engine/overworld/wildmons.asm:493 seeds Raikou and Entei only, +-- so the roster is read out of the cache when the cache carries one. +local function startMapFor(species) + for _, row in ipairs(Roamers.SPECIES) do + if row.species == species then return row.map end + end + return nil +end + +function Roamers.roster(encounters) + local extracted = encounters and encounters.roamMons + if type(extracted) ~= "table" or #extracted == 0 then return Roamers.SPECIES end + local rows = {} + for _, row in ipairs(extracted) do + rows[#rows + 1] = { + species = row.species, + level = row.level or Roamers.LEVEL, + map = row.map or startMapFor(row.species), + } + end + return rows +end + -- data/wild/roammon_maps.asm, entry for entry and in order. The order matters -- twice over: `.Update` picks a connection by a two-bit index into the list, so -- shuffling one row changes which route a beast walks to, and JumpRoamMon picks @@ -185,7 +208,7 @@ end -- The save record -------------------------------------------------------------------------- -- --- save.roamers is a three-slot array in the order above, written first by the +-- save.roamers is a slot array in the roster order above, written first by the -- InitRoamMons special (src/script/gen2/Specials.lua) when the Burned Tower -- basement script fires. Each slot: -- @@ -215,13 +238,15 @@ function Roamers.slot(save, index) end -- InitRoamMons. Safe to call twice: the Burned Tower script is behind a scene --- flag, but a re-init would hand the player three fresh beasts, so this only --- writes when there is nothing there. +-- flag, but a re-init would hand the player fresh beasts, so this only writes +-- when there is nothing there. function Roamers.init(save, opts) if type(save) ~= "table" then return nil end if save.roamers and not (opts and opts.force) then return save.roamers end + local encounters = opts and (opts.encounters + or (opts.data and opts.data.gen2Encounters)) local list = {} - for _, row in ipairs(Roamers.SPECIES) do + for _, row in ipairs(Roamers.roster(encounters)) do list[#list + 1] = { species = row.species, level = row.level, @@ -413,7 +438,23 @@ end -- -- the roaming battle is one attack long unless it is trapped. The other -- two lists are the same routine's 50% and 10% gates and live here so the -- battle engine has one place to read them from. -Roamers.ALWAYS_FLEE = { RAIKOU = true, ENTEI = true, SUICUNE = true } +-- pokegold/data/wild/flee_mons.asm:34 lists Suicune; pokecrystal's:34 ends the +-- list at Entei, which is what makes maps/TinTower1F.asm:119 catchable. +Roamers.ALWAYS_FLEE_BY_ENGINE = { + gs = { RAIKOU = true, ENTEI = true, SUICUNE = true }, + crystal = { RAIKOU = true, ENTEI = true }, +} + +function Roamers.alwaysFleeMons(versionId) + return Roamers.ALWAYS_FLEE_BY_ENGINE[GameVersion.engine(versionId)] + or Roamers.ALWAYS_FLEE_BY_ENGINE.gs +end + +-- src/battle/gen2/Battle.lua:4070 reads AlwaysFleeMons by species name. +Roamers.ALWAYS_FLEE = setmetatable({}, { + __index = function(_, species) return Roamers.alwaysFleeMons()[species] end, +}) + Roamers.OFTEN_FLEE = { CUBONE = true, ARTICUNO = true, ZAPDOS = true, MOLTRES = true, QUAGSIRE = true, DELIBIRD = true, PHANPY = true, TEDDIURSA = true, @@ -433,29 +474,79 @@ local Swarm = {} Roamers.Swarm = Swarm -- The state, on the save: --- save.swarmMap wSwarmMapGroup / wSwarmMapNumber, as a map id +-- save.swarmMaps the stored map pairs, keyed by swarm kind +-- save.swarmMap the Gold single pair, kept as the legacy alias -- save.dailyFlags.swarm DAILYFLAGS1_SWARM_F -- save.dailyFlags.fishingSwarm wFishingSwarmFlag (FISHSWARM_* 0/1/2) -- save.dailyResetDay the day wDailyResetTimer was last restarted -- -- src/world/gen2/World.lua:setSwarm and the ActivateFishingSwarm special --- already write the first three; this module is where they are READ and where --- they expire. +-- already write the flags and the alias; this module is where they are READ +-- and where they expire. -- constants/script_constants.asm, ActivateFishingSwarm setval arguments. Swarm.FISH_NONE = 0 Swarm.FISH_QWILFISH = 1 Swarm.FISH_REMORAID = 2 +-- pokecrystal/constants/script_constants.asm:256-257 -- the kind byte Crystal +-- puts in front of a `swarm` map, choosing between its two stored pairs. +Swarm.KIND_ORDER = { "DUNSPARCE", "YANMA" } +Swarm.KINDS = { [0] = "DUNSPARCE", [1] = "YANMA" } +Swarm.DEFAULT_KIND = "DUNSPARCE" + +local KIND_NAMES = { DUNSPARCE = true, YANMA = true } + +local function kindName(kind) + if type(kind) == "number" then return Swarm.KINDS[kind] or Swarm.DEFAULT_KIND end + if KIND_NAMES[kind] then return kind end + return Swarm.DEFAULT_KIND +end + +-- pokegold/engine/events/specials.asm:288-293 has the one pair, so a Gold save +-- (and every save written before this record was keyed) folds onto that key. +local function goldShape(maps) + return maps.YANMA == nil +end + +function Swarm.maps(save) + if type(save) ~= "table" then return nil end + local maps = save.swarmMaps + if type(maps) ~= "table" then + maps = {} + save.swarmMaps = maps + end + if save.swarmMap ~= nil and goldShape(maps) then + maps[Swarm.DEFAULT_KIND] = save.swarmMap + end + return maps +end + +local function anyMap(save) + if type(save) ~= "table" then return false end + if save.swarmMap ~= nil then return true end + local maps = save.swarmMaps + if type(maps) ~= "table" then return false end + for _, name in ipairs(Swarm.KIND_ORDER) do + if maps[name] ~= nil then return true end + end + return false +end + -- StoreSwarmMapIndices, which FALLS THROUGH into SetSwarmFlag: one command -- writes the map pair AND the daily flag. A port that stored only the map -- would leave the Dunsparce call live for the rest of the game, because -- CheckSwarmFlag answers off the flag and clears the pair itself. -function Swarm.set(save, mapId) +-- +-- pokecrystal/engine/events/specials.asm:290-306 picks the pair off c instead. +function Swarm.set(save, mapId, kind) if type(save) ~= "table" then return false end save.dailyFlags = save.dailyFlags or {} save.dailyFlags.swarm = true - save.swarmMap = mapId + local name = kindName(kind) + local maps = Swarm.maps(save) + maps[name] = mapId + if name == Swarm.DEFAULT_KIND then save.swarmMap = mapId end return true end @@ -475,9 +566,22 @@ function Swarm.active(save) and save.dailyFlags.swarm == true end -function Swarm.mapId(save) +function Swarm.mapId(save, kind) if not Swarm.active(save) then return nil end - return save.swarmMap + local maps = Swarm.maps(save) + return maps and maps[kindName(kind)] or nil +end + +-- pokecrystal/engine/overworld/wildmons.asm:414-451 tests Dunsparce first and +-- falls through to Yanma, so a map both are on answers Dunsparce. +function Swarm.onMap(save, mapId) + if mapId == nil or not Swarm.active(save) then return nil end + local maps = Swarm.maps(save) + if not maps then return nil end + for _, name in ipairs(Swarm.KIND_ORDER) do + if maps[name] == mapId then return name end + end + return nil end function Swarm.fishing(save) @@ -493,6 +597,12 @@ function Swarm.check(save) if type(save) ~= "table" then return 1 end if Swarm.active(save) then return 0 end if save.dailyFlags then save.dailyFlags.fishingSwarm = nil end + -- pokecrystal/engine/overworld/time.asm:103-112 zeroes wSwarmFlags whole, + -- which strands both of Crystal's pairs on the one daily tick. + local maps = save.swarmMaps + if type(maps) == "table" then + for _, name in ipairs(Swarm.KIND_ORDER) do maps[name] = nil end + end save.swarmMap = nil return 1 end @@ -518,10 +628,10 @@ end -- rather than needing its own timer. Returns true when the swarm ended on -- this call. function Swarm.timeEvents(save, day) + local hadMap = anyMap(save) local reset = Swarm.checkDailyReset(save, day) - local hadMap = save and save.swarmMap ~= nil Swarm.check(save) - return reset and hadMap and (save.swarmMap == nil) + return reset and hadMap and not anyMap(save) end -- _SwarmWildmonCheck: the swarm table is searched BEFORE the Johto/Kanto one, @@ -538,7 +648,7 @@ end -- lookup here falls through to the map's own list. function Swarm.entry(save, encounters, mapId, kind) if not encounters then return nil end - if Swarm.mapId(save) ~= mapId then return nil end + if not Swarm.onMap(save, mapId) then return nil end local table_ = (kind == "water") and encounters.swarmWater or encounters.swarmGrass return table_ and table_[mapId] or nil diff --git a/src/core/gen2/Save.lua b/src/core/gen2/Save.lua index edc7b862..b9faa345 100644 --- a/src/core/gen2/Save.lua +++ b/src/core/gen2/Save.lua @@ -133,10 +133,33 @@ local function fs() return love.filesystem end --- The blank-name fallback is the first PlayerNameArray row, which differs --- per edition -- data/player_names.asm:12-23. -function Save.defaultPlayerName(version) - return (version or GameVersion.get()) == "silver" and "SILVER" or "GOLD" +-- The first PlayerNameArray row -- pokegold data/player_names.asm:12-22, and +-- Crystal's gender-split arrays at data/player_names.asm:12-16, :31-35. +Save.DEFAULT_PLAYER_NAMES = { + gold = "GOLD", + silver = "SILVER", + crystal = "CHRIS", +} + +-- FemalePlayerNameArray's first row, the `.Kris` dname NamePlayer falls back to +-- (data/player_names.asm:31-32, engine/menus/intro_menu.asm:768-781). +Save.DEFAULT_PLAYER_NAMES_FEMALE = { + crystal = "KRIS", +} + +-- wPlayerGender as this save spells it (constants/ram_constants.asm:176-177). +function Save.isFemale(save) + local player = type(save) == "table" and save.player + return (player and player.gender) == "female" +end + +function Save.defaultPlayerName(version, gender) + version = version or GameVersion.get() + if gender == "female" then + local female = Save.DEFAULT_PLAYER_NAMES_FEMALE[version] + if female then return female end + end + return Save.DEFAULT_PLAYER_NAMES[version] or "GOLD" end -- A fresh Gen 2 save. `opts` carries what the intro collected: player name, @@ -148,10 +171,13 @@ function Save.newGame(opts) version = GameVersion.get(), generation = 2, player = { - name = opts.playerName or Save.defaultPlayerName(), + name = opts.playerName + or Save.defaultPlayerName(nil, opts.gender or "male"), -- _ResetWRAM rolls wPlayerID out of hRandomSub/hRandomAdd -- (engine/menus/intro_menu.asm:41-49). id = opts.trainerId or rand(0, 65535), + -- InitCrystalData zeroes wPlayerGender before InitGender is even offered + -- (engine/menus/init_gender.asm:1-6). gender = opts.gender or "male", money = 3000, coins = 0, @@ -379,6 +405,49 @@ local function normalizePokerus(mons) end end +-- ../pokecrystal/ram/sram.asm:140 sGSBallFlag. nil is the cleared byte. +Save.GS_BALL_STATES = { have = true, given = true, used = true } + +local function counter(value) + return math.max(0, math.floor(tonumber(value) or 0)) +end + +-- ../pokecrystal/ram/sram.asm:138 "SRAM Crystal Data", created on demand the +-- way Mail.state creates sPartyMail, so a Crystal handler can index freely. +function Save.crystalState(save) + local crystal = save.crystal or {} + save.crystal = crystal + if crystal.celebiCaught == nil then crystal.celebiCaught = false end + crystal.beasts = crystal.beasts or {} + -- ../pokecrystal/ram/wram.asm:3342 wBuenasPassword, :3343 wBlueCardBalance. + local buena = crystal.buenaPassword or {} + crystal.buenaPassword = buena + buena.prizesToday = counter(buena.prizesToday) + buena.streak = counter(buena.streak) + -- ../pokecrystal/engine/events/move_tutor.asm:1 MoveTutor. + crystal.moveTutor = crystal.moveTutor or {} + if crystal.moveTutor.used == nil then crystal.moveTutor.used = false end + -- ../pokecrystal/ram/wram.asm:3445 wUnlockedUnowns. + crystal.unownWords = crystal.unownWords or {} + return crystal +end + +-- ../pokecrystal/ram/sram.asm:147 "SRAM Battle Tower". `reward` stays nil +-- until one is won, which is sBattleTowerReward's zero byte (:160). +function Save.battleTowerState(save) + local tower = save.battleTower or {} + save.battleTower = tower + -- ../pokecrystal/ram/sram.asm:155 sNrOfBeatenBattleTowerTrainers. + tower.streak = counter(tower.streak) + tower.best = counter(tower.best) + -- ../pokecrystal/ram/sram.asm:150 sBattleTowerChallengeState: 0 normal, 2 tower. + tower.challenge = counter(tower.challenge) + -- ../pokecrystal/ram/sram.asm:162 sBTMonOfTrainers. + tower.prevTeams = tower.prevTeams or {} + if tower.inChallenge == nil then tower.inChallenge = false end + return tower +end + -- Fill in anything a save (or an older save) is missing, so callers can index -- freely. Runs on both newGame and load. function Save.normalize(save) @@ -390,7 +459,11 @@ function Save.normalize(save) end save.generation = 2 save.player = save.player or {} - save.player.name = save.player.name or Save.defaultPlayerName(save.version) + -- _ResetWRAM leaves wPlayerGender at 0, PLAYERGENDER_MALE, and Gold never + -- writes it -- constants/ram_constants.asm:177. + save.player.gender = save.player.gender or "male" + save.player.name = save.player.name + or Save.defaultPlayerName(save.version, save.player.gender) save.player.id = save.player.id or rand(0, 65535) save.player.money = math.max(0, math.min(save.player.money or 0, Save.MAX_MONEY)) save.player.coins = math.max(0, math.min(save.player.coins or 0, Save.MAX_COINS)) @@ -462,6 +535,12 @@ function Save.normalize(save) save.playTime = save.playTime or { hours = 0, minutes = 0, seconds = 0, frames = 0 } save.rtc = save.rtc or {} + -- ../pokecrystal/ram/sram.asm:138,147: both regions are Crystal's own, so a + -- Gold or Silver file never grows either key. + if GameVersion.engine(save.version) == "crystal" then + Save.crystalState(save) + Save.battleTowerState(save) + end -- HallOfFame.record fills in the count and the roster list, and trims a -- roster that a corrupt file grew past NUM_HOF_TEAMS -- the same guard the -- party gets below, for the same reason. diff --git a/src/debug/SwitchDiagnostics.lua b/src/debug/SwitchDiagnostics.lua index 04ed4403..07e2b849 100644 --- a/src/debug/SwitchDiagnostics.lua +++ b/src/debug/SwitchDiagnostics.lua @@ -249,12 +249,13 @@ function SwitchDiagnostics.probeAssets(version) end -- Shallow listing so we can see if the extract tree exists at all. - local roots = { "yellow", "blue", "gold", "silver", "assets", + local roots = { "yellow", "blue", "gold", "silver", "crystal", "assets", "yellow/assets/generated", "yellow/assets/generated/sprites", "blue/assets/generated/sprites", "gold/assets/generated", "gold/assets/generated/sprites", "gold/data/generated", "silver/assets/generated", - "silver/data/generated" } + "silver/data/generated", "crystal/assets/generated", + "crystal/data/generated" } for _, dir in ipairs(roots) do local info = filesystem.getInfo(dir) if info and info.type == "directory" and filesystem.getDirectoryItems then diff --git a/src/import/CrystalMovie.lua b/src/import/CrystalMovie.lua new file mode 100644 index 00000000..b0d943cb --- /dev/null +++ b/src/import/CrystalMovie.lua @@ -0,0 +1,396 @@ +-- Crystal's intro movie and title screen extraction (pokecrystal +-- engine/movie/intro.asm:1678-1777, engine/movie/title.asm:364-374). +-- Called from RomExtractorGen2's extractIntro/extractTitle stages when +-- edition == "crystal"; reads through the passed-in extractor and never +-- mutates it. + +local ImageWriter = require("src.import.ImageWriter") + +local CrystalMovie = {} + +local TILE_BYTES = 16 +local SHEET_TILES = 16 + +-- vBGMap tilemaps and attrmaps are one full 32x32 map +-- (engine/movie/intro.asm:1611-1628 decompresses $40 tiles = 1024 bytes). +local MAP_BYTES = 1024 + +local function padTiles(raw, count) + local length = count * TILE_BYTES + while #raw > length do table.remove(raw) end + while #raw < length do raw[#raw + 1] = 0 end + return raw +end + +-- Lay `count` tiles of `source` (from tile `from`, 0-based) over `target` +-- starting at tile `at` (0-based). +local function overlayTiles(target, source, at, from, count) + for offset = 1, count * TILE_BYTES do + target[at * TILE_BYTES + offset] = source[from * TILE_BYTES + offset] or 0 + end + return target +end + +local function blankTiles(count) + local out = {} + for index = 1, count * TILE_BYTES do out[index] = 0 end + return out +end + +-- Sheets are 16 tiles per row so tile id N resolves to (N % 16, N / 16), +-- the same layout data/sprite_anims/oam.asm:120-136 assumes. +local function writeSheet(self, raw, count, relative) + padTiles(raw, count) + local rows = math.ceil(count / SHEET_TILES) + padTiles(raw, rows * SHEET_TILES) + self:write2bpp(raw, SHEET_TILES * 8, rows * 8, relative, true) + return "assets/generated/" .. relative +end + +local function readMap(self, label) + local bytes = self:decompressLz3Symbol(label) + while #bytes > MAP_BYTES do table.remove(bytes) end + while #bytes < MAP_BYTES do bytes[#bytes + 1] = 0 end + return bytes +end + +-- 16 palettes: 8 BG then 8 OBJ (engine/movie/intro.asm:123-130 copies +-- `16 palettes` over wBGPals1, which wOBPals1 follows). +local function readPalettes(self, label) + local symbol = self:symbol(label) + local flat = self:colors(symbol.bank, symbol.address, 64) + local bg, obj = {}, {} + for pal = 0, 7 do + local a, b = {}, {} + for slot = 1, 4 do + a[slot] = flat[pal * 4 + slot] + b[slot] = flat[(pal + 8) * 4 + slot] + end + bg[pal + 1], obj[pal + 1] = a, b + end + return { bg = bg, obj = obj } +end + +local function readColors(self, label, count) + local symbol = self:symbol(label) + return self:colors(symbol.bank, symbol.address, count) +end + +function CrystalMovie.extractIntro(self) + self:beginStage("Intro movie") + local out = { + generation = 2, + layout = "crystal", + source = "ROM:CrystalIntro (engine/movie/intro.asm)", + } + + local unowns = padTiles(self:decompressLz3Symbol("IntroUnownsGFX"), 128) + local grassSym = self:symbol("IntroGrass4GFX") + local grass4 = self.rom:bytes(grassSym.bank, grassSym.address, TILE_BYTES) + + local unownsPath = writeSheet(self, unowns, 128, "intro/unowns_tiles.png") + local pulsePath = writeSheet(self, + self:decompressLz3Symbol("IntroPulseGFX"), 16, "intro/pulse_sprites.png") + local backgroundPath = writeSheet(self, + self:decompressLz3Symbol("IntroBackgroundGFX"), 128, + "intro/background_tiles.png") + local runPath = writeSheet(self, + self:decompressLz3Symbol("IntroSuicuneRunGFX"), 192, + "intro/suicune_run_sprites.png") + local pichuPath = writeSheet(self, + self:decompressLz3Symbol("IntroPichuWooperGFX"), 128, + "intro/pichu_wooper_sprites.png") + self:tick("Intro movie", 1, 4) + + -- IntroScene15: jump BG at vTiles2 plus IntroGrass4GFX at vTiles1 tile 0, + -- i.e. BG id $80 (engine/movie/intro.asm:744-753). + local jump = blankTiles(256) + overlayTiles(jump, self:decompressLz3Symbol("IntroSuicuneJumpGFX"), 0, 0, 128) + overlayTiles(jump, grass4, 0x80, 0, 1) + local jumpPath = writeSheet(self, jump, 256, "intro/suicune_jump_tiles.png") + + -- The same grass tile is the whole of the SUICUNE_AWAY object's sheet + -- (data/sprite_anims/oam.asm:136 base $80; engine/movie/intro.asm:750-753). + local unownBack = blankTiles(144) + overlayTiles(unownBack, self:decompressLz3Symbol("IntroUnownBackGFX"), 0, 0, 48) + overlayTiles(unownBack, grass4, 0x80, 0, 1) + local unownBackPath = writeSheet(self, unownBack, 144, + "intro/unown_back_sprites.png") + + -- IntroScene17 loads 255 tiles from vTiles1, so BG id $80 is close tile 0 + -- and ids wrap through $00-$7e (engine/movie/intro.asm:825-828). + local closeRaw = padTiles(self:decompressLz3Symbol("IntroSuicuneCloseGFX"), 255) + local close = blankTiles(256) + for id = 0, 255 do + local from = (id + 128) % 256 + if from < 255 then overlayTiles(close, closeRaw, id, from, 1) end + end + local closePath = writeSheet(self, close, 256, "intro/suicune_close_tiles.png") + + -- IntroScene19: suicune_back at vTiles2, the Unown ring at vTiles1, and + -- grass over vTiles1 tile $7f = BG id $ff (engine/movie/intro.asm:890-901). + local back = blankTiles(256) + overlayTiles(back, self:decompressLz3Symbol("IntroSuicuneBackGFX"), 0, 0, 128) + overlayTiles(back, unowns, 128, 0, 128) + overlayTiles(back, grass4, 0xff, 0, 1) + local backPath = writeSheet(self, back, 256, "intro/suicune_back_tiles.png") + + local crystalUnownsPath = writeSheet(self, + self:decompressLz3Symbol("IntroCrystalUnownsGFX"), 32, + "intro/crystal_unowns_tiles.png") + + -- Intro_RustleGrass swaps 4 tiles at vTiles2 tile $09 through grass1/2/3 + -- (engine/movie/intro.asm:1521-1547); one 16-tile row, frame f at f*4. + local grassStrip = blankTiles(16) + for frame, label in ipairs({ "IntroGrass1GFX", "IntroGrass2GFX", + "IntroGrass3GFX" }) do + local sym = self:symbol(label) + overlayTiles(grassStrip, + self.rom:bytes(sym.bank, sym.address, 4 * TILE_BYTES), (frame - 1) * 4, + 0, 4) + end + out.grassFrames = writeSheet(self, grassStrip, 16, "intro/grass_anim.png") + self:tick("Intro movie", 2, 4) + + local unownPals = readPalettes(self, "IntroUnownsPalette") + local backgroundPals = readPalettes(self, "IntroBackgroundPalette") + local suicunePals = readPalettes(self, "IntroSuicunePalette") + local closePals = readPalettes(self, "IntroSuicuneClosePalette") + local crystalUnownsPals = readPalettes(self, "IntroCrystalUnownsPalette") + + local function act(tiles, sprites, tilemapLabel, attrmapLabel, palettes) + return { + tiles = tiles, + sprites = sprites, + tilemap = readMap(self, tilemapLabel), + attrmap = readMap(self, attrmapLabel), + palettes = palettes, + } + end + + out.acts = { + unownA = act(unownsPath, pulsePath, + "IntroUnownATilemap", "IntroUnownAAttrmap", unownPals), + unownHI = act(unownsPath, pulsePath, + "IntroUnownHITilemap", "IntroUnownHIAttrmap", unownPals), + unowns = act(unownsPath, pulsePath, + "IntroUnownsTilemap", "IntroUnownsAttrmap", unownPals), + background = act(backgroundPath, runPath, + "IntroBackgroundTilemap", "IntroBackgroundAttrmap", backgroundPals), + suicuneJump = act(jumpPath, unownBackPath, + "IntroSuicuneJumpTilemap", "IntroSuicuneJumpAttrmap", suicunePals), + suicuneClose = act(closePath, nil, + "IntroSuicuneCloseTilemap", "IntroSuicuneCloseAttrmap", closePals), + suicuneBack = act(backPath, unownBackPath, + "IntroSuicuneBackTilemap", "IntroSuicuneBackAttrmap", suicunePals), + crystalUnowns = act(crystalUnownsPath, nil, + "IntroCrystalUnownsTilemap", "IntroCrystalUnownsAttrmap", + crystalUnownsPals), + } + -- IntroScene7/10 load pichu_wooper into VRAM bank 1 + -- (engine/movie/intro.asm:340-348); OAM_BANK1 picks this sheet. + out.acts.background.sprites1 = pichuPath + self:tick("Intro movie", 3, 4) + + out.fades = { + toWhite = {}, + unownAppear = readColors(self, "Intro_Scene20_AppearUnown.pal1", 4), + unownAppear2 = readColors(self, "Intro_Scene20_AppearUnown.pal2", 4), + wordFast = readColors(self, "Intro_FadeUnownWordPals.FastFadePalettes", 16), + wordSlow = readColors(self, "Intro_FadeUnownWordPals.SlowFadePalettes", 16), + } + -- Intro_Scene24_ApplyPaletteFade steps 8 rows of one palette each + -- (engine/movie/intro.asm:1155-1189). + local fade = readColors(self, "Intro_Scene24_ApplyPaletteFade.FadePals", 32) + for row = 0, 7 do + local pal = {} + for slot = 1, 4 do pal[slot] = fade[row * 4 + slot] end + out.fades.toWhite[row + 1] = pal + end + + self:write("intro", out) + self:tick("Intro movie", 4, 4) + return out +end + +-------------------------------------------------------------------------- + +local function shadeOf(r) + if r > 0.9 then return 0 end + if r > 0.5 then return 1 end + if r > 0.2 then return 2 end + return 3 +end + +local function tilesFrom2bpp(raw) + local tiles = {} + for offset = 1, #raw - (#raw % TILE_BYTES), TILE_BYTES do + local one = {} + for index = offset, offset + TILE_BYTES - 1 do one[#one + 1] = raw[index] end + tiles[#tiles + 1] = ImageWriter.decode2bpp(one, 8, 8, true) + end + return tiles +end + +local function blitTile(target, tile, tx, ty) + if not tile then return end + for y = 0, 7 do + for x = 0, 7 do + local r, g, b, a = tile:getPixel(x, y) + if a ~= 0 then target:setPixel(tx + x, ty + y, r, g, b, a) end + end + end +end + +local function colorize(image, palFor) + local w, h = image:getDimensions() + local out = ImageWriter.blank(w, h, 0, 0, 0, 0) + for y = 0, h - 1 do + for x = 0, w - 1 do + local r, _, _, a = image:getPixel(x, y) + if a ~= 0 then + local pal = palFor(x, y) + local c = pal[shadeOf(r) + 1] or pal[4] or { 0, 0, 0 } + out:setPixel(x, y, c[1] / 255, c[2] / 255, c[3] / 255, 1) + end + end + end + return out +end + +function CrystalMovie.extractTitle(self) + self:beginStage("Title screen") + + -- TitleLogoGFX decompresses to vTiles1, so BG id $80 is logo tile 0 and + -- ids $00-$1b wrap on past it (engine/movie/title.asm:91-94). + local logoTiles = tilesFrom2bpp(self:decompressLz3Symbol("TitleLogoGFX")) + -- TitleSuicuneGFX fills vTiles4-vTiles5: bank-1 ids $80-$ff then $00-$7f + -- (engine/movie/title.asm:24-27). + local suicuneTiles = tilesFrom2bpp(self:decompressLz3Symbol("TitleSuicuneGFX")) + local gemTiles = tilesFrom2bpp(self:decompressLz3Symbol("TitleCrystalGFX")) + local pals = readPalettes(self, "TitleScreenPalettes") + self:tick("Title screen", 1, 5) + + -- Attribute regions from _TitleScreen's ByteFills + -- (engine/movie/title.asm:39-85): logo gradient rows, the version strip, + -- pal 7 on the window copyright line, pal 0 everywhere else. + local function bgPalAt(col, row) + if row == 9 and col >= 5 and col <= 15 then return 1 end + if row >= 3 and row <= 4 then return 2 end + if row == 5 then return 3 end + if row == 6 then return 4 end + if row == 7 then return 5 end + if row >= 8 and row <= 9 then return 6 end + if row == 17 then return 7 end + return 0 + end + + local shade = ImageWriter.blank(160, 144, 0, 0, 0, 0) + -- DrawTitleGraphic lays 7 rows of 20 running tiles from d=$80 + -- (engine/movie/title.asm:107-112,275-302). + for row = 0, 6 do + for col = 0, 19 do + blitTile(shade, logoTiles[row * 20 + col + 1], col * 8, (row + 3) * 8) + end + end + -- Copyright line: 13 tiles from d=$c on the window's row 0, shown at + -- hWY = $88 (engine/movie/title.asm:114-119; engine/menus/intro_menu.asm:1121-1122). + for index = 0, 12 do + blitTile(shade, logoTiles[128 + 12 + index + 1], (3 + index) * 8, 17 * 8) + end + + local colored = colorize(shade, function(x, y) + return pals.bg[bgPalAt(math.floor(x / 8), math.floor(y / 8)) + 1] + end) + self:save(colored, "title/crystal_screen.png") + self:save(shade, "title/crystal_screen_gray.png") + + local logo = ImageWriter.blank(160, 56, 0, 0, 0, 0) + ImageWriter.blit(logo, colored, 0, 0, 0, 24, 160, 56) + self:save(logo, "title/crystal_logo.png") + local wordmark = ImageWriter.blank(88, 8, 0, 0, 0, 0) + ImageWriter.blit(wordmark, colored, 0, 0, 40, 72, 88, 8) + self:save(wordmark, "title/crystal_wordmark.png") + self:tick("Title screen", 2, 5) + + -- LoadSuicuneFrame: 6 rows of 8 tiles at hlcoord 6,12, row stride 16; + -- frame bases $80/$88/$00/$08 (engine/movie/title.asm:245-273). + local suicunePaths, suicuneGrayPaths = {}, {} + for index, base in ipairs({ 0x00, 0x08, 0x80, 0x88 }) do + local frame = ImageWriter.blank(64, 48, 0, 0, 0, 0) + for row = 0, 5 do + for col = 0, 7 do + blitTile(frame, suicuneTiles[base + row * 16 + col + 1], + col * 8, row * 8) + end + end + local tinted = colorize(frame, function() return pals.bg[1] end) + local rel = ("title/crystal_suicune_%d.png"):format(index) + self:save(tinted, rel) + suicunePaths[index] = "assets/generated/" .. rel + local grayRel = ("title/crystal_suicune_%d_gray.png"):format(index) + self:save(frame, grayRel) + suicuneGrayPaths[index] = "assets/generated/" .. grayRel + if index == 1 then self:save(tinted, "title/crystal_suicune.png") end + end + self:tick("Title screen", 3, 5) + + -- InitializeBackground: five 48x16 strips of six 8x16 OBJs, consecutive + -- tile pairs, OBJ pal 0, OAM_PRIO (engine/movie/title.asm:304-338). + local gem = ImageWriter.blank(48, 80, 0, 0, 0, 0) + for strip = 0, 4 do + for slot = 0, 5 do + local tile = strip * 12 + slot * 2 + blitTile(gem, gemTiles[tile + 1], slot * 8, strip * 16) + blitTile(gem, gemTiles[tile + 2], slot * 8, strip * 16 + 8) + end + end + local gemTinted = colorize(gem, function() return pals.obj[1] end) + self:save(gemTinted, "title/crystal_gem.png") + self:save(gem, "title/crystal_gem_gray.png") + self:tick("Title screen", 4, 5) + + local function unit(color) return { color[1] / 255, color[2] / 255, color[3] / 255 } end + + local data = { + generation = 2, + layout = "crystal_title", + source = "ROM:TitleSuicuneGFX + TitleLogoGFX + TitleCrystalGFX" + .. " + TitleScreenPalettes", + screen = "assets/generated/title/crystal_screen.png", + screenGray = "assets/generated/title/crystal_screen_gray.png", + image = "assets/generated/title/crystal_logo.png", + wordmark = "assets/generated/title/crystal_wordmark.png", + suicune = "assets/generated/title/crystal_suicune.png", + suicuneFrames = suicunePaths, + suicuneFramesGray = suicuneGrayPaths, + -- hlcoord 6, 12 (engine/movie/title.asm:252) in screen pixels. + suicuneX = 48, + suicuneY = 96, + -- SuicuneFrameIterator advances every 8 frames (engine/movie/title.asm:217-243). + suicuneEvery = 8, + gem = "assets/generated/title/crystal_gem.png", + gemGray = "assets/generated/title/crystal_gem_gray.png", + -- Strip 0 starts at OAM (64, -$22) and stops at OAM y 22, i.e. screen + -- (56, 6) (engine/movie/title.asm:306-311,340-362). + gemX = 56, + gemY = 6, + gemFromY = -50, + gemStep = 2, + -- TitleScreenEntrance: hSCX from +112 to 0 by 4 with alternating-line + -- signage over the logo's 80 lines; the copyright window sits at + -- hWY = $88 only after it lands (engine/menus/intro_menu.asm:1078-1111). + entrance = { scx = 112, step = 4, lines = 80, hideBelow = 136 }, + entranceSfx = "Sfx_TitleScreenEntrance", + -- TitleScreenTimer (engine/menus/intro_menu.asm:1125-1136). + timeoutFrames = 73 * 60 + 36, + sky = unit(pals.bg[1][1]), + below = unit(pals.bg[1][1]), + palettes = { bg = pals.bg, obj = pals.obj }, + } + self:write("title", data) + self:tick("Title screen", 5, 5) + return data +end + +return CrystalMovie diff --git a/src/import/LauncherView.lua b/src/import/LauncherView.lua index 2f20a15d..f88c6b11 100644 --- a/src/import/LauncherView.lua +++ b/src/import/LauncherView.lua @@ -405,6 +405,7 @@ end local CART_COLOR = { red = PAL.railRed, blue = PAL.railBlue, yellow = PAL.railGold, gold = PAL.railAmber, silver = PAL.railSilver, + crystal = PAL.railCrystal, } local function cartColor(version) return CART_COLOR[version] or PAL.green @@ -1062,6 +1063,8 @@ local GAME_TABS = { label = "Gold" }, { id = "silver", key = "tab-silver", letter = "S", color = PAL.railSilver, label = "Silver" }, + { id = "crystal", key = "tab-crystal", letter = "C", + color = PAL.railCrystal, label = "Crystal" }, } local HEADER_TABS = { @@ -3555,24 +3558,37 @@ end -- also what a controller reaches after the tab row. local function buildGameModal(imp, m) local pad = math.floor(18 * m.s) - local gap = math.floor(8 * m.s) - local w = math.floor(360 * m.s) - local h = pad + Kit.textHeight("button") + math.floor(12 * m.s) - + #GAME_TABS * (m.btnH + gap) + m.btnH + pad - local px, py, pw = modalPanel(m, w, h) + local headH = Kit.textHeight("button") + math.floor(12 * m.s) + local avail = m.H - 2 * m.pad + local cols, gap, btnH = 1, math.floor(8 * m.s), m.btnH + local function rows() return math.ceil(#GAME_TABS / cols) + 1 end + local function total() return 2 * pad + headH + rows() * btnH + + (rows() - 1) * gap end + if total() > avail then cols = 2 end + if total() > avail then gap = math.max(2, math.floor(3 * m.s)) end + if total() > avail then + btnH = math.max(Kit.tapMin(), + btnH - math.ceil((total() - avail) / rows())) + end + local nrows = rows() - 1 + local w = math.floor((cols > 1 and 440 or 360) * m.s) + local px, py, pw = modalPanel(m, w, total()) local cy = py + pad Kit.text("button", Strings("Choose game"), px + pad, cy, PAL.heading) - cy = cy + Kit.textHeight("button") + math.floor(12 * m.s) + cy = cy + headH local chrome = headerChrome(imp) - for _, g in ipairs(GAME_TABS) do - btn(imp, px + pad, cy, pw - 2 * pad, m.btnH, "gamepop-" .. g.id, + local colW = math.floor((pw - 2 * pad - (cols - 1) * gap) / cols) + for i, g in ipairs(GAME_TABS) do + local bx = px + pad + ((i - 1) % cols) * (colW + gap) + local by = cy + math.floor((i - 1) / cols) * (btnH + gap) + btn(imp, bx, by, colW, btnH, "gamepop-" .. g.id, Strings(g.label), { face = "tab", font = "small", letter = g.letter, color = g.color, active = imp.tab == g.id, action = chrome.tab[g.id] }) - cy = cy + m.btnH + gap end - btn(imp, px + pad, cy, pw - 2 * pad, m.btnH, "gamepop-close", + cy = cy + nrows * (btnH + gap) + btn(imp, px + pad, cy, pw - 2 * pad, btnH, "gamepop-close", Strings("Close"), { font = "small", action = function() imp._gamePopup = nil end }) end diff --git a/src/import/RomExtractorGen2.lua b/src/import/RomExtractorGen2.lua index 1ad47af4..0de65b5d 100644 --- a/src/import/RomExtractorGen2.lua +++ b/src/import/RomExtractorGen2.lua @@ -7,6 +7,7 @@ local bit = require("bit") local GameVersion = require("src.core.GameVersion") local ImageWriter = require("src.import.ImageWriter") local LuaWriter = require("src.import.LuaWriter") +local MonAnim = require("src.render.MonAnim") local Rom = require("src.import.Rom") -- engine/gfx/load_pics.asm FixPicBank. `dba_pic` does NOT store the real @@ -19,6 +20,9 @@ local FIX_PIC_BANK = { [0x14] = 0x20, -- BANK("Pics 13") [0x1f] = 0x2e, -- BANK("Pics 14") } +-- ../pokecrystal/engine/gfx/load_pics.asm:250 EXPORT DEF PICS_FIX EQU $36, and +-- ../pokecrystal/macros/data.asm:93-96 stores BANK(pic) - PICS_FIX flat. +local PICS_FIX = 0x36 local RomExtractorGen2 = {} RomExtractorGen2.__index = RomExtractorGen2 @@ -48,8 +52,10 @@ local ENV_POINTER_COUNT = 8 -- NUM_ENVIRONMENTS + 1 (row 0 is unused) local MAP_GROUP_COUNT = 26 -- constants/map_constants.asm NUM_MAP_GROUPS -- gfx/tileset_palette_maps.asm lives in "bank2" (main.asm) alongside -- EnvironmentColorsPointers, and the Tilesets row only stores a 16-bit --- pointer, so the bank has to come from here. +-- pointer, so the bank has to come from here. Crystal moved the include to +-- "bank13" (../pokecrystal/main.asm:192-195). local PAL_MAP_BANK = 0x02 +local PAL_MAP_BANK_CRYSTAL = 0x13 -- LoadBallIconGFX.gfx (engine/battle/trainer_huds.asm:225-232); bank $0b -- carries no manifest symbol to resolve it through. local BALL_ICON_GFX = { 0x0b, 0x41a4 } @@ -57,6 +63,10 @@ local BALL_ICON_GFX = { 0x0b, 0x41a4 } -- tiles per byte: low nibble first tile, high nibble second (`dn` in the -- tilepal macro). The high bit of each nibble is the VRAM bank, not colour. local TILESET_TILE_COUNT = 96 +-- ../pokecrystal/home/map.asm:1368 copies a second $60 tiles to VRAM bank 1, +-- and engine/tilesets/map_palettes.asm:40 carries that bank in the id's bit 7. +local TILESET_VRAM_TILES = 256 +local CRYSTAL_PAL_MAP_BYTES = 112 -- Every Gen 2 back pic is 6x6 tiles (48x48); only front pics vary in size. local BACK_PIC_TILES = 6 @@ -99,10 +109,27 @@ local MENU_HEADER_LENGTH = 8 -- its own terminator inside its 11 bytes. local NPCTRADE_STRUCT_LENGTH = 32 local MON_NAME_LENGTH, NAME_LENGTH = 11, 11 +-- ../pokecrystal/constants/npc_trade_constants.asm:23 adds NPC_TRADE_FOREST, +-- and :48 adds TRADE_DIALOGSET_GIRL, so PrintTradeText's row stride grows too +-- (../pokecrystal/engine/events/npc_trade.asm:389-395 `ld bc, 2 * 4`). local NUM_NPC_TRADES = 6 +local NUM_NPC_TRADES_CRYSTAL = 7 -- constants/script_constants.asm NUM_BUG_CONTESTANTS, "not counting the -- player", which data/events/bug_contest_flags.asm asserts its length against. local NUM_BUG_CONTESTANTS = 10 +-- ../pokecrystal/constants/script_constants.asm:323-324 NUM_UNOWN_WALLS and +-- UNOWN_WALL_MENU_HEADER_SIZE. +local NUM_UNOWN_WALLS = 4 +local UNOWN_WALL_HEADER_SIZE = 5 +-- constants/item_constants.asm NUM_TM_HM: 50 TMs + 7 HMs in both trees. +local NUM_TM_HM = 57 +-- ../pokecrystal/constants/pokemon_data_constants.asm:113-115. +local PARTYMON_STRUCT_LENGTH = 48 +local NICKNAMED_MON_STRUCT_LENGTH = PARTYMON_STRUCT_LENGTH + MON_NAME_LENGTH +-- ../pokecrystal/data/battle_tower/parties.asm:2, and +-- ../pokecrystal/constants/battle_tower_constants.asm:4. +local BT_LEVEL_GROUPS = 10 +local BT_PARTY_LENGTH = 3 -- constants/phone_constants.asm PHONE_CONTACT_SIZE and SPECIALCALL_SIZE. local PHONE_CONTACT_SIZE = 12 local SPECIALCALL_SIZE = 6 @@ -175,19 +202,35 @@ local function copy(value) end function RomExtractorGen2.new(romData, manifest, progress) + -- _GOLD / _SILVER: the labels are shared, the data behind a handful of + -- them is not (gfx/misc.asm:9-20 vs :46-57). + local edition = GameVersion.forSha1(manifest.romSha1) or "gold" return setmetatable({ rom = Rom.new(romData), manifest = manifest, symbols = manifest.symbols, progress = progress, stage = 0, - -- _GOLD / _SILVER: the labels are shared, the data behind a handful of - -- them is not (gfx/misc.asm:9-20 vs :46-57). - edition = GameVersion.forSha1(manifest.romSha1) == "silver" - and "silver" or "gold", + edition = edition, + -- ../pokecrystal/macros/scripts/events.asm:540 renumbers every command + -- from $52 up, so the whole table has to be resolved per edition. + opcodes = Opcodes.forEdition(edition), }, RomExtractorGen2) end +-- gfx/tileset_palette_maps.asm's bank (../pokecrystal/main.asm:192-195). +function RomExtractorGen2:palMapBank() + if self.edition == "crystal" then return PAL_MAP_BANK_CRYSTAL end + return PAL_MAP_BANK +end + +-- A `dba_pic` bank byte back to the real ROM bank: Gold's three-entry remap +-- (macros/data.asm:101-107) or Crystal's flat `+ PICS_FIX`. +function RomExtractorGen2:picBank(stored) + if self.edition == "crystal" then return stored + PICS_FIX end + return FIX_PIC_BANK[stored] or stored +end + function RomExtractorGen2:symbol(name) local location = self.symbols[name] if not location then error("required symbol is missing: " .. tostring(name)) end @@ -254,17 +297,21 @@ end -- square). pret builds these with `rgbgfx --columns`, so the 2bpp stream -- is column-major; ImageWriter.columnsToRows puts them back into a normal -- top-to-bottom PNG (same as Gen 1's interleave handling). +-- Returns the whole stream: past the base picture are the animation's extra +-- tiles, GetAnimatedEnemyFrontpic's second Get2bpp. +-- ../pokecrystal/engine/gfx/load_pics.asm:132-171 function RomExtractorGen2:writeCompressedPic(label, tiles, relative) - local pixels = self:decompressLz3Symbol(label) + local stream = self:decompressLz3Symbol(label) local size = tiles * 8 local byteLength = size * size / 4 - while #pixels < byteLength do pixels[#pixels + 1] = 0 end - while #pixels > byteLength do table.remove(pixels) end + local pixels = {} + for index = 1, byteLength do pixels[index] = stream[index] or 0 end pixels = ImageWriter.columnsToRows(pixels, tiles, tiles) -- pokegold engine/battle/core.asm GetTrainerBackpic: no hardware masking, -- so matte the white backdrop like Gen 1's writeCompressedPic does. self:save(ImageWriter.matteColor0( ImageWriter.decode2bpp(pixels, size, size)), relative) + return stream end function RomExtractorGen2:extractConstants() @@ -407,6 +454,19 @@ function RomExtractorGen2:extractFont() ImageWriter.blit(extraImg, solidImg, 0, 0, 0, 0, 8, 8) -- $60 ImageWriter.blit(extraImg, solidImg, 8, 0, 8, 0, 8, 8) -- $61 end + -- Crystal splits the pair and makes the arrow 2bpp: black.1bpp at $60, + -- up_arrow.2bpp at $61 (../pokecrystal/gfx/font.asm:51,63; + -- ../pokecrystal/engine/gfx/load_font.asm:44-48,59-64). + if self.symbols["FontsExtra_SolidBlackGFX"] then + local solid = self:symbol("FontsExtra_SolidBlackGFX") + ImageWriter.blit(extraImg, inkFrom1bpp( + self.rom:bytes(solid.bank, solid.address, 8), 8, 8), 0, 0, 0, 0, 8, 8) + end + if self.symbols["FontsExtra2_UpArrowGFX"] then + local arrow = self:symbol("FontsExtra2_UpArrowGFX") + ImageWriter.blit(extraImg, inkFrom2bpp( + self.rom:bytes(arrow.bank, arrow.address, 16), 8, 8), 8, 0, 0, 0, 8, 8) + end if self.symbols["PokegearPhoneIconGFX"] then local phone = self:symbol("PokegearPhoneIconGFX") local phoneImg = inkFrom2bpp( @@ -518,13 +578,15 @@ function RomExtractorGen2:battleObjectPals() return out end --- A tileset's PalMap: 48 bytes, two tiles apiece. `tilepal` emits --- `dn (bank | PAL_BG_second), (bank | PAL_BG_first)`, so the low nibble is --- the even tile and the high nibble the odd one; masking to 3 bits drops the --- OAM_BANK flag and leaves the PAL_BG_* slot. Returned 1-based so the value --- indexes an 8-entry Lua palette set directly. +-- A tileset's PalMap: 48 bytes on Gold and 112 on Crystal, two tiles apiece. +-- `tilepal` emits `dn (bank | PAL_BG_second), (bank | PAL_BG_first)`, so the +-- low nibble is the even tile and the high nibble the odd one; masking to 3 +-- bits drops the OAM_BANK flag and leaves the PAL_BG_* slot. Returned 1-based +-- so the value indexes an 8-entry Lua palette set directly. function RomExtractorGen2:readPalMap(address) - local raw = self.rom:bytes(PAL_MAP_BANK, address, TILESET_TILE_COUNT / 2) + local length = TILESET_TILE_COUNT / 2 + if self.edition == "crystal" then length = CRYSTAL_PAL_MAP_BYTES end + local raw = self.rom:bytes(self:palMapBank(), address, length) local out = {} for i, byte in ipairs(raw) do out[(i - 1) * 2 + 1] = byte % 8 + 1 @@ -681,6 +743,13 @@ local ANIM_FUNCTIONS = { "ScrollTileLeft", "ScrollTileRight", "AnimateWhirlpoolTile", "AnimateLavaBubbleTile1", "AnimateLavaBubbleTile2", "AnimateTowerPillarTile", "FlickeringCaveEntrancePalette", + -- Crystal only: TilesetParkAnim and TilesetForestAnim stop aliasing + -- Tileset0Anim and name these instead + -- (../pokecrystal/data/tileset_anims.asm:25,38, + -- ../pokecrystal/engine/tilesets/tileset_anims.asm:159,234,277,316,354). + "AnimateFountainTile", + "ForestTreeLeftAnimation", "ForestTreeRightAnimation", + "ForestTreeLeftAnimation2", "ForestTreeRightAnimation2", } local ANIM_BANK = 0x3f @@ -727,44 +796,50 @@ function RomExtractorGen2:readTilesetAnim(address, byAddress, strips) local arg = self.rom:word(ANIM_BANK, at) local func = self.rom:word(ANIM_BANK, at + 2) local name = byAddress[func] - if not name then return nil end - local frame = { func = name } - -- A vTiles2 argument is the VRAM tile the step writes; a wTileAnimBuffer - -- one is WRAM and has no tile id. - if arg >= VTILES2 and arg < VTILES2 + 0x800 then - frame.tile = math.floor((arg - VTILES2) / 16) - end - local kind = ANIM_POINTER_KIND[name] - if kind then - local dest = self.rom:word(ANIM_BANK, arg) - if dest >= VTILES2 and dest < VTILES2 + 0x800 then - frame.tile = math.floor((dest - VTILES2) / 16) - local strip = self:animStrip(strips, - ("%s_%02x"):format(kind, frame.tile), kind, - ANIM_BANK, self.rom:word(ANIM_BANK, arg + 2)) - frame.sheet, frame.frames = strip.image, strip.frames - end - elseif name == "AnimateLavaBubbleTile1" or name == "AnimateLavaBubbleTile2" - then - -- Both take no argument: tile $5b and tile $38, one strip (:254, :279). - frame.tile = (name == "AnimateLavaBubbleTile1") and 0x5b or 0x38 - local lava = self.symbols["LavaBubbleTileFrames"] - if lava then - local strip = self:animStrip( - strips, "lava", "lava", lava[1], lava[2]) - frame.sheet, frame.frames = strip.image, strip.frames - end - elseif name == "ReadTileToAnimBuffer" then - pending = { h = 0, v = 0 } - elseif name == "ScrollTileRightLeft" then - if pending then pending.h = pending.h + 1 end - elseif name == "ScrollTileDown" then - if pending then pending.v = pending.v + 1 end - elseif name == "ScrollTileUp" then - if pending then pending.v = pending.v - 1 end - elseif name == "WriteTileFromAnimBuffer" then - if pending and frame.tile then frame.scroll = pending end + -- _AnimateTileset runs one row per frame off wTilesetAnim + -- (../pokecrystal/engine/tilesets/tileset_anims.asm:1-3), so a step with + -- no symbol costs that frame rather than the whole program. + local frame = { func = name or ("unknown_%04x"):format(func) } + if not name then pending = nil + else + -- A vTiles2 argument is the VRAM tile the step writes; a wTileAnimBuffer + -- one is WRAM and has no tile id. + if arg >= VTILES2 and arg < VTILES2 + 0x800 then + frame.tile = math.floor((arg - VTILES2) / 16) + end + local kind = ANIM_POINTER_KIND[name] + if kind then + local dest = self.rom:word(ANIM_BANK, arg) + if dest >= VTILES2 and dest < VTILES2 + 0x800 then + frame.tile = math.floor((dest - VTILES2) / 16) + local strip = self:animStrip(strips, + ("%s_%02x"):format(kind, frame.tile), kind, + ANIM_BANK, self.rom:word(ANIM_BANK, arg + 2)) + frame.sheet, frame.frames = strip.image, strip.frames + end + elseif name == "AnimateLavaBubbleTile1" + or name == "AnimateLavaBubbleTile2" then + -- Both take no argument: tile $5b and tile $38, one strip (:254, :279). + frame.tile = (name == "AnimateLavaBubbleTile1") and 0x5b or 0x38 + local lava = self.symbols["LavaBubbleTileFrames"] + if lava then + local strip = self:animStrip( + strips, "lava", "lava", lava[1], lava[2]) + frame.sheet, frame.frames = strip.image, strip.frames + end + elseif name == "ReadTileToAnimBuffer" then + pending = { h = 0, v = 0 } + elseif name == "ScrollTileRightLeft" then + if pending then pending.h = pending.h + 1 end + elseif name == "ScrollTileDown" then + if pending then pending.v = pending.v + 1 end + elseif name == "ScrollTileUp" then + if pending then pending.v = pending.v - 1 end + elseif name == "WriteTileFromAnimBuffer" then + if pending and frame.tile then frame.scroll = pending end + pending = nil + end end frames[#frames + 1] = frame if name == "DoneTileAnimation" then @@ -774,6 +849,19 @@ function RomExtractorGen2:readTilesetAnim(address, byAddress, strips) return nil end +-- ../pokecrystal/home/map.asm:1357-1370 LoadTilesetGFX's two CopyBytes. +local function crystalTilesetSheet(pixels) + local half = TILESET_TILE_COUNT * 16 + local bank1 = (TILESET_VRAM_TILES / 2) * 16 + local out = {} + for i = 1, bank1 + half do out[i] = 0 end + for i = 1, half do + out[i] = pixels[i] or 0 + out[bank1 + i] = pixels[half + i] or 0 + end + return out +end + -- Every Tilesets row is TILESET_LENGTH (15) bytes: dba GFX, dba Meta, -- dba Coll, dw Anim, dw NULL, dw PalMap (data/tilesets.asm's `tileset` -- macro). Row 0 is the unused "Tileset0" alias of TilesetJohto, and row @@ -783,7 +871,10 @@ function RomExtractorGen2:extractTilesets() self:beginStage("World tiles") local order = self.manifest.constants.tilesetOrder local headers = self:symbol("Tilesets") - local imageWidth, imageHeight = 128, 48 + local twoBank = self.edition == "crystal" + local sheetTiles = twoBank and TILESET_VRAM_TILES or TILESET_TILE_COUNT + local imageWidth = 128 + local imageHeight = sheetTiles / (imageWidth / 8) * 8 local byteLength = imageWidth * imageHeight / 4 -- A cache built from a manifest without the tileset_anims symbols simply @@ -815,6 +906,7 @@ function RomExtractorGen2:extractTilesets() local compressed = self.rom:bytes( gfxBank, gfxAddress, 0x8000 - gfxAddress) local pixels = Rom.decompressLz3(compressed) + if twoBank then pixels = crystalTilesetSheet(pixels) end while #pixels < byteLength do pixels[#pixels + 1] = 0 end while #pixels > byteLength do table.remove(pixels) end local base = constName:lower():gsub("^tileset_", "") @@ -851,9 +943,9 @@ function RomExtractorGen2:extractTilesets() collision = collision, -- Anim callbacks live in bank $3f (data/tilesets.asm). anim = self:readTilesetAnim(animAddress, animByAddress, animStrips), - palMap = { bank = PAL_MAP_BANK, address = palMapAddress }, - -- Which of the eight loaded BG palettes each of the 96 tiles draws - -- with, 1-based into palettes.bg slots (see readPalMap). + palMap = { bank = self:palMapBank(), address = palMapAddress }, + -- Which of the eight loaded BG palettes each sheet tile draws with, + -- 1-based into palettes.bg slots (see readPalMap). tilePalettes = self:readPalMap(palMapAddress), } self:tick("World tiles", index, #order) @@ -1340,6 +1432,129 @@ function RomExtractorGen2:extractMonSprites(out) return out end +-- GetMonFramesPointer reads the pointer out of BANK(FramesPointers) but the +-- blob out of BANK(KantoFrames) below this and BANK(JohtoFrames) at or above. +-- ../pokecrystal/engine/gfx/pic_animation.asm:956-1000 +local JOHTO_POKEMON = 152 + +-- A frames blob is one `dw` per frame -- the first points past the list, so +-- the gap IS the count -- then a bitmask id and one tile per set bit. +-- ../pokecrystal/engine/gfx/pic_animation.asm:487-519 +function RomExtractorGen2:readMonFrames(bank, address, bitmaskBank, bitmaskAddress, + tiles) + local first = self.rom:word(bank, address) + local count = (first - address) / 2 + if count < 1 or count > 64 or count % 1 ~= 0 then return nil end + local width = MonAnim.BITMASK_BYTES[tiles] + if not width then return nil end + local bitmasks, ids, frames = {}, {}, {} + for index = 1, count do + local pointer = self.rom:word(bank, address + (index - 1) * 2) + local raw = self.rom:byte(bank, pointer) + local slot = ids[raw] + if not slot then + slot = #bitmasks + 1 + ids[raw] = slot + bitmasks[slot] = self.rom:bytes( + bitmaskBank, bitmaskAddress + raw * width, width) + end + local list = {} + for bit = 0, tiles * tiles - 1 do + local byte = bitmasks[slot][math.floor(bit / 8) + 1] or 0 + if math.floor(byte / 2 ^ (bit % 8)) % 2 == 1 then + list[#list + 1] = self.rom:byte(bank, pointer + #list + 1) + end + end + frames[index] = { bitmask = slot, tiles = list } + end + return frames, bitmasks +end + +-- A script is (command, parameter) pairs; $ff ends it, $fe/$fd are the repeat +-- pair and everything else is a frame id with a duration. +-- ../pokecrystal/macros/scripts/pic_anims.asm:1-27 +function RomExtractorGen2:readMonAnimScript(bank, address) + local rows = {} + for index = 0, 127 do + local command = self.rom:byte(bank, address + index * 2) + if command == MonAnim.END then return rows end + rows[#rows + 1] = { command, self.rom:byte(bank, address + index * 2 + 1) } + end + return nil +end + +-- One column of whole pictures, the base picture first, matted the way +-- writeCompressedPic mattes the static pic. +function RomExtractorGen2:writeMonAnimSheet(stream, tiles, frames, bitmasks, + relative) + local size = tiles * 8 + local perTile = 16 + local available = math.floor(#stream / perTile) + local sheet = ImageWriter.blank(size, size * (#frames + 1), 0, 0, 0, 0) + local data = { tiles = tiles, frames = frames, bitmasks = bitmasks } + for index = 0, #frames do + local map = MonAnim.tileMap(data, index) + if not map then return nil end + local raw = {} + for _, id in ipairs(map) do + if id >= available then return nil end + for offset = 1, perTile do raw[#raw + 1] = stream[id * perTile + offset] end + end + local image = ImageWriter.matteColor0(ImageWriter.decode2bpp( + ImageWriter.columnsToRows(raw, tiles, tiles), size, size)) + ImageWriter.blit(sheet, image, 0, index * size) + end + self:save(sheet, relative) + return "assets/generated/" .. relative +end + +-- The four pointer tables, or nil when this ROM names none of them. +function RomExtractorGen2:monAnimTables(unown) + local prefix = unown and "Unown" or "" + local names = { anim = prefix .. "AnimationPointers", + idle = prefix .. "AnimationIdlePointers", + bitmasks = prefix .. "BitmasksPointers", + frames = prefix .. "FramesPointers" } + local out = {} + for key, name in pairs(names) do + local location = self.symbols[name] + if not location then return nil end + out[key] = { bank = location[1], address = location[2] } + end + -- KantoFrames shares FramesPointers' section and JohtoFrames shares + -- UnownFramesPointers', so both data banks come off those two symbols. + -- ../pokecrystal/main.asm:439-449 + local johto = self.symbols["UnownFramesPointers"] + if not johto then return nil end + out.kantoFrames = out.frames.bank + out.johtoFrames = unown and out.frames.bank or johto[1] + return out +end + +-- Everything one pic needs to animate, or nil when the data does not read +-- back cleanly. +function RomExtractorGen2:monAnimation(tables, index, tiles, stream, name) + if not (tables and stream and tiles) then return nil end + local frames, bitmasks = self:readMonFrames( + (index < JOHTO_POKEMON) and tables.kantoFrames or tables.johtoFrames, + self.rom:word(tables.frames.bank, tables.frames.address + (index - 1) * 2), + tables.bitmasks.bank, + self.rom:word(tables.bitmasks.bank, + tables.bitmasks.address + (index - 1) * 2), + tiles) + if not frames then return nil end + local play = self:readMonAnimScript(tables.anim.bank, + self.rom:word(tables.anim.bank, tables.anim.address + (index - 1) * 2)) + local idle = self:readMonAnimScript(tables.idle.bank, + self.rom:word(tables.idle.bank, tables.idle.address + (index - 1) * 2)) + if not (play and idle and #play > 0) then return nil end + local sheet = self:writeMonAnimSheet(stream, tiles, frames, bitmasks, + "battle/anim/" .. name .. ".png") + if not sheet then return nil end + return { tiles = tiles, sheet = sheet, count = #frames, + bitmasks = bitmasks, frames = frames, play = play, idle = idle } +end + -- BaseData rows are BASE_DATA_SIZE (32) bytes, and -- unlike Gen 1's Kanto -- reorder -- the row index already IS the dex number (data/pokemon/ -- base_stats.asm lists species in constants/pokemon_constants.asm order, @@ -1434,11 +1649,17 @@ function RomExtractorGen2:extractPokemon() -- TMHMMoves maps a TM/HM number to the move it teaches; a species' BASE_TMHM -- bitfield is indexed by that same number (see the tmhm macro), so decoding - -- it needs this table rather than a move id. - local tmhmList = {} + -- it needs this table rather than a move id. Crystal appends the three move + -- tutors as numbers 58-60 (../pokecrystal/data/moves/tmhm_moves.asm:20-25, + -- ../pokecrystal/constants/item_constants.asm:304-310), which are teachable + -- but are not TMs, so they come out as their own list. + local tmhmList, tutorList = {}, {} for i = 0, 63 do local moveId = self.rom:byte(tmhmMoves.bank, tmhmMoves.address + i) if moveId == 0 then break end + if i + 1 > NUM_TM_HM then + tutorList[i + 1 - NUM_TM_HM] = moveOrder[moveId] or moveId + end tmhmList[i + 1] = moveOrder[moveId] or moveId end @@ -1461,6 +1682,8 @@ function RomExtractorGen2:extractPokemon() end local out = { growthRates = growth, tmhmMoves = tmhmList } + if #tutorList > 0 then out.tutorMoves = tutorList end + local animTables = self:monAnimTables(false) for index, species in ipairs(speciesOrder) do if species then local row = self.rom:bytes( @@ -1472,11 +1695,17 @@ function RomExtractorGen2:extractPokemon() local asset = self.manifest.pokemonAssets[species] local tiles = row[18] % 16 -- BASE_PIC_SIZE low nibble, tiles wide/tall - local front, back + local front, back, anim if asset and asset.frontLabel then - self:writeCompressedPic(asset.frontLabel, tiles, + local stream = self:writeCompressedPic(asset.frontLabel, tiles, "battle/front/" .. asset.front .. ".png") front = asset.front + if animTables and asset.animLabel and asset.framesLabel + and asset.bitmaskLabel and asset.idleLabel then + local ok, result = pcall(self.monAnimation, self, animTables, index, + tiles, stream, asset.front) + if ok then anim = result else self:trace(species .. " anim: " .. tostring(result)) end + end end if asset and asset.backLabel then -- Back pics are ALWAYS 6x6 tiles (48x48). BASE_PIC_SIZE's low nibble @@ -1518,13 +1747,17 @@ function RomExtractorGen2:extractPokemon() -- TM/HM number n * 8 + i + 1 (the tmhm macro's layout). local tmhmRaw = { row[25], row[26], row[27], row[28], row[29], row[30], row[31], row[32] } - local tmhm = {} + local tmhm, tutorMoves = {}, {} for byteIndex, byteValue in ipairs(tmhmRaw) do for bit = 0, 7 do if math.floor(byteValue / 2 ^ bit) % 2 == 1 then local number = (byteIndex - 1) * 8 + bit + 1 local move = tmhmList[number] - if move then tmhm[#tmhm + 1] = move end + if move and number > NUM_TM_HM then + tutorMoves[#tutorMoves + 1] = move + elseif move then + tmhm[#tmhm + 1] = move + end end end end @@ -1554,11 +1787,13 @@ function RomExtractorGen2:extractPokemon() eggGroupsRaw = row[24], tmhmRaw = tmhmRaw, tmhm = tmhm, + tutorMoves = (#tutorMoves > 0) and tutorMoves or nil, evolutions = evolutions, levelMoves = levelMoves, eggMoves = eggMoves, spriteFront = front and ("assets/generated/battle/front/" .. front .. ".png") or nil, spriteBack = back and ("assets/generated/battle/back/" .. back .. ".png") or nil, + anim = anim, } end self:tick("Pokemon", index, #speciesOrder) @@ -1571,13 +1806,14 @@ function RomExtractorGen2:extractPokemon() local symbol = self:symbol("UnownPicPointers") local letters = {} local tiles = out.UNOWN.picSize or 6 + local unownTables = self:monAnimTables(true) for index = 0, 25 do local letter = string.char(string.byte("A") + index) local base = symbol.address + index * 6 local entry = {} + local frontStream local function readPic(offset, size, folder, key) - local bank = FIX_PIC_BANK[self.rom:byte(symbol.bank, base + offset)] - or self.rom:byte(symbol.bank, base + offset) + local bank = self:picBank(self.rom:byte(symbol.bank, base + offset)) local address = self.rom:word(symbol.bank, base + offset + 1) local rel = ("battle/%s/unown_%s.png"):format(folder, letter:lower()) local ok, err = pcall(function() @@ -1589,11 +1825,12 @@ function RomExtractorGen2:extractPokemon() for _, byte in ipairs(nextBank) do compressed[#compressed + 1] = byte end - local pixels = Rom.decompressLz3(compressed) + local stream = Rom.decompressLz3(compressed) + if key == "spriteFront" then frontStream = stream end local pixelSize = size * 8 local byteLength = pixelSize * pixelSize / 4 - while #pixels < byteLength do pixels[#pixels + 1] = 0 end - while #pixels > byteLength do table.remove(pixels) end + local pixels = {} + for i = 1, byteLength do pixels[i] = stream[i] or 0 end pixels = ImageWriter.columnsToRows(pixels, size, size) self:write2bpp(pixels, pixelSize, pixelSize, rel) end) @@ -1605,6 +1842,15 @@ function RomExtractorGen2:extractPokemon() end readPic(0, tiles, "front", "spriteFront") readPic(3, 6, "back", "spriteBack") + if unownTables and frontStream then + local ok, result = pcall(self.monAnimation, self, unownTables, + index + 1, tiles, frontStream, "unown_" .. letter:lower()) + if ok then + entry.anim = result + else + self:trace(("unown %s anim: %s"):format(letter, tostring(result))) + end + end letters[letter] = entry end out.UNOWN.letters = letters @@ -1614,6 +1860,7 @@ function RomExtractorGen2:extractPokemon() or (letters.A and letters.A.spriteFront) out.UNOWN.spriteBack = out.UNOWN.spriteBack or (letters.A and letters.A.spriteBack) + out.UNOWN.anim = out.UNOWN.anim or (letters.A and letters.A.anim) end self:write("pokemon", out) @@ -1629,6 +1876,11 @@ end -- FillTitleScreenPals / title_bg_gold.pal colorize BG zones; title_fg.pal -- tints Ho-Oh. Clouds (rows 11+) scroll via LYOverrides in retail. function RomExtractorGen2:extractTitle() + -- Crystal has no title tilemap: DrawTitleGraphic composes on the fly + -- (../pokecrystal/engine/movie/title.asm:104-118). + if self.edition == "crystal" then + return require("src.import.CrystalMovie").extractTitle(self) + end self:beginStage("Title screen") local function tilesFrom2bpp(raw, transparent) @@ -2077,12 +2329,22 @@ local CREDITS_SCENES = { { species = "ELEKID", label = "CreditsElekidGFX", frames = 3 }, { species = "SENTRET", label = "CreditsSentretGFX", frames = 4 }, } +-- ../pokecrystal/engine/movie/credits.asm:610-613; each is $400 bytes, so all +-- four run 4 frames of 4x4 tiles rather than Gold's 3/3/3/4. +local CREDITS_SCENES_CRYSTAL = { + { species = "PICHU", label = "CreditsPichuGFX", frames = 4 }, + { species = "SMOOCHUM", label = "CreditsSmoochumGFX", frames = 4 }, + { species = "DITTO", label = "CreditsDittoGFX", frames = 4 }, + { species = "IGGLYBUFF", label = "CreditsIgglybuffGFX", frames = 4 }, +} local CREDITS_BORDER_TILES = 9 local CREDITS_THEEND_TILES = 16 function RomExtractorGen2:extractCredits() self:beginStage("Credits") - local steps = #CREDITS_SCENES + 3 + local sceneList = (self.edition == "crystal") + and CREDITS_SCENES_CRYSTAL or CREDITS_SCENES + local steps = #sceneList + 3 local data = { generation = 2, source = "ROM:CreditsBorderGFX + CreditsGFX + TheEndGFX" @@ -2114,7 +2376,7 @@ function RomExtractorGen2:extractCredits() self:tick("Credits", 2, steps) local scenes = {} - for index, scene in ipairs(CREDITS_SCENES) do + for index, scene in ipairs(sceneList) do if self.symbols[scene.label] then local sym = self:symbol(scene.label) local raw = self.rom:bytes(sym.bank, sym.address, scene.frames * 16 * 16) @@ -2130,7 +2392,7 @@ function RomExtractorGen2:extractCredits() end self:tick("Credits", 2 + index, steps) end - if #scenes == #CREDITS_SCENES then data.scenes = scenes end + if #scenes == #sceneList then data.scenes = scenes end if self.symbols["CreditsPalettes"] then local pal = self:symbol("CreditsPalettes") @@ -2370,7 +2632,10 @@ end -- generation-2 channel driver. Banks are NOT Gen 1's {2,8,31}. function RomExtractorGen2:extractAudio(maps) self:beginStage("Sound programs") + -- "Songs 5" and "Crystal Sound Effects" are bank $5e + -- (../pokecrystal/layout.link:246-249). local bankOrder = { 0x07, 0x33, 0x3a, 0x3b, 0x3c, 0x3d } + if self.edition == "crystal" then bankOrder[#bankOrder + 1] = 0x5e end local chunks = {} for index, bank in ipairs(bankOrder) do local first = Rom.offset(bank, 0x4000) + 1 @@ -2410,10 +2675,17 @@ function RomExtractorGen2:extractAudio(maps) local wave = self:symbol("WaveSamples") local drums = self:symbol("Drumkits") local mapSongs = {} + -- GetMapMusic (home/map.asm:2204-2207) takes MUSIC_MAHOGANY_MART and the + -- RADIO_TOWER_MUSIC bit off the table before it ever indexes Music. On Gold + -- both fall outside NUM_MUSIC_SONGS and drop out on their own; Crystal's + -- MUSIC_MAHOGANY_MART aliases MUSIC_SUICUNE_BATTLE ($64), which resolves. + -- ../pokecrystal/constants/music_constants.asm:112,120. + local MUSIC_MAHOGANY_MART, RADIO_TOWER_MUSIC = 100, 0x80 if maps then for mapId, def in pairs(maps) do local id = def.music - if type(id) == "number" and id > 0 then + if type(id) == "number" and id > 0 + and id ~= MUSIC_MAHOGANY_MART and id < RADIO_TOWER_MUSIC then local label = musicOrder[id + 1] if label and songs[label] then mapSongs[mapId] = label @@ -2738,7 +3010,9 @@ function RomExtractorGen2:readEventTables() -- so the cache carries the items.lua key the rest of the port indexes with. local itemOrder = self.manifest.constants.itemOrder or {} local tradeRows = {} - for row = 0, NUM_NPC_TRADES - 1 do + local tradeCount = (self.edition == "crystal") + and NUM_NPC_TRADES_CRYSTAL or NUM_NPC_TRADES + for row = 0, tradeCount - 1 do local base = trades.address + row * NPCTRADE_STRUCT_LENGTH local raw = self.rom:bytes(trades.bank, base, 3) local dvBase = base + 3 + MON_NAME_LENGTH @@ -2770,7 +3044,10 @@ function RomExtractorGen2:readEventTables() -- The trade conversation's five lines, one set per TRADE_DIALOGSET_*. -- PrintTradeText is `TradeTexts + 6 * dialog + 2 * dialogset`, so the table -- is stored dialog-major: three INTROs, then three CANCELs, and so on. + -- Crystal's fourth dialogset makes the row stride 8 + -- (../pokecrystal/engine/events/npc_trade.asm:389-399 `ld bc, 2 * 4`). local tradeTexts = self:symbol("TradeTexts") + local tradeStride = (self.edition == "crystal") and 8 or 6 local dialogs = { "TRADE_DIALOG_INTRO", "TRADE_DIALOG_CANCEL", "TRADE_DIALOG_WRONG", "TRADE_DIALOG_COMPLETE", "TRADE_DIALOG_AFTER" } local sets = consts.tradeDialogOrder or {} @@ -2783,7 +3060,7 @@ function RomExtractorGen2:readEventTables() local row, bufRow = {}, {} for s = 1, #sets do local addr = self.rom:word(tradeTexts.bank, - tradeTexts.address + (d - 1) * 6 + (s - 1) * 2) + tradeTexts.address + (d - 1) * tradeStride + (s - 1) * 2) local buffers = {} row[sets[s]] = self:decodeGen2Text(tradeTexts.bank, addr, charmap, buffers) @@ -2872,6 +3149,35 @@ function RomExtractorGen2:readEventTables() } out.decorationOrder = consts.decoDescOrder + -- ../pokecrystal/data/events/unown_walls.asm:7 UnownWalls and :15 MenuHeaders_UnownWalls; + -- macros/coords.asm:71 `menu_coords` emits y before x. + local unownWalls = self.symbols.UnownWalls + local unownHeaders = self.symbols.MenuHeaders_UnownWalls + local unownMap = self.manifest.unownCharmap + if unownWalls and unownHeaders and unownMap then + local walls = {} + local address = unownWalls[2] + for wall = 0, NUM_UNOWN_WALLS - 1 do + local chars, word = {}, {} + while true do + local byte = self.rom:byte(unownWalls[1], address) + address = address + 1 + if byte == 0xff then break end + chars[#chars + 1] = byte + word[#word + 1] = unownMap[tostring(byte)] or "?" + end + local head = self.rom:bytes( + unownHeaders[1], unownHeaders[2] + wall * UNOWN_WALL_HEADER_SIZE, + UNOWN_WALL_HEADER_SIZE) + walls[wall + 1] = { + id = wall, word = table.concat(word), chars = chars, + flags = head[1], + y1 = head[2], x1 = head[3], y2 = head[4], x2 = head[5], + } + end + out.unownWalls = walls + end + return out end @@ -3366,7 +3672,7 @@ function RomExtractorGen2:extractScriptsAndText(maps, stdScripts) commands[#commands + 1] = { op = "truncated", reason = "read" } break end - local info = Opcodes[opcode] + local info = self.opcodes[opcode] if not info then commands[#commands + 1] = { op = "unknown", code = opcode, @@ -3395,7 +3701,9 @@ function RomExtractorGen2:extractScriptsAndText(maps, stdScripts) if info.name == "writetext" or info.name == "jumptext" or info.name == "jumptextfaceplayer" then cmd.text = ensureText(bank, wordFromArgs(args)) - elseif info.name == "farwritetext" then + -- farjumptext is Crystal's new $52 and carries a dba, not a dw + -- (../pokecrystal/engine/overworld/scripting.asm:318-327). + elseif info.name == "farwritetext" or info.name == "farjumptext" then local tBank, tAddr = dbaFromArgs(args) cmd.text = ensureText(tBank, tAddr) elseif info.name == "checkevent" or info.name == "setevent" @@ -3613,7 +3921,7 @@ function RomExtractorGen2:extractInitialEvents() if not romAddrOk(bank, pc) then break end local okByte, opcode = pcall(self.rom.byte, self.rom, bank, pc) if not okByte then break end - local info = Opcodes[opcode] + local info = self.opcodes[opcode] if not info then break end local size = info.size local okArgs, args = true, {} @@ -3678,10 +3986,7 @@ local PREDEFPAL_GAMEFREAK_LOGO_BG = 78 -- indexes straight off it. The star is 1x2 tiles and the OAM set mirrors it -- to make the other half; the sparkle strip is 3 frames in a row. function RomExtractorGen2:splashGfx() - if not (self.symbols.GameFreakLogoGFX - and self.symbols.GameFreakLogoStarsGFX) then - return nil - end + if not self.symbols.GameFreakLogoGFX then return nil end local gfx = self:symbol("GameFreakLogoGFX") local raw = self.rom:bytes(gfx.bank, gfx.address, 28 * 8) local presents, logo = {}, {} @@ -3695,21 +4000,47 @@ function RomExtractorGen2:splashGfx() -- finds a logo image there, and now it is the right one. self:save(inkFrom1bpp(logo, 24, 40), "intro/gamefreak_logo.png") - local stars = self:symbol("GameFreakLogoStarsGFX") - local starRaw = self.rom:bytes(stars.bank, stars.address, 2 * 16) - local sparkleRaw = self.rom:bytes(stars.bank, stars.address + 2 * 16, 3 * 16) - -- 2bpp with shade 0 transparent, the way every OBJ sheet is written. - self:write2bpp(starRaw, 8, 16, "splash/star.png", true) - self:write2bpp(sparkleRaw, 24, 8, "splash/sparkle.png", true) - - return { + local out = { presents = "assets/generated/splash/presents.png", logo = "assets/generated/splash/logo.png", - star = "assets/generated/splash/star.png", - sparkle = "assets/generated/splash/sparkle.png", obPalette = self:predefPal(PREDEFPAL_GAMEFREAK_LOGO_OB), bgPalette = self:predefPal(PREDEFPAL_GAMEFREAK_LOGO_BG), } + + if self.symbols.GameFreakLogoStarsGFX then + local stars = self:symbol("GameFreakLogoStarsGFX") + local starRaw = self.rom:bytes(stars.bank, stars.address, 2 * 16) + local sparkleRaw = self.rom:bytes( + stars.bank, stars.address + 2 * 16, 3 * 16) + -- 2bpp with shade 0 transparent, the way every OBJ sheet is written. + self:write2bpp(starRaw, 8, 16, "splash/star.png", true) + self:write2bpp(sparkleRaw, 24, 8, "splash/sparkle.png", true) + out.star = "assets/generated/splash/star.png" + out.sparkle = "assets/generated/splash/sparkle.png" + end + + -- Crystal has no stars: GameFreakPresentsInit decompresses ditto.2bpp.lz and + -- requests 8 tiles to vTiles0 and 8 more from +$80 tiles to vTiles1 + -- (../pokecrystal/engine/movie/splash.asm:61-88). The whole 256-tile sheet + -- is written as one 16-wide page so tile n is (n % 16, n / 16). + if self.symbols.GameFreakDittoGFX then + local ditto = self:decompressLz3Symbol("GameFreakDittoGFX") + local tiles = math.floor(#ditto / 16) + local rows = math.ceil(tiles / 16) + while #ditto < rows * 16 * 16 do ditto[#ditto + 1] = 0 end + self:write2bpp(ditto, 128, rows * 8, "splash/ditto.png", true) + out.ditto = "assets/generated/splash/ditto.png" + out.dittoTiles = tiles + out.dittoTilesWide = 16 + end + -- gfx/splash/ditto_fade.pal, one colour per step of the pink-to-orange fade + -- Ditto runs as it becomes the logo. + if self.symbols.GameFreakDittoPaletteFade then + local fade = self:symbol("GameFreakDittoPaletteFade") + out.dittoFade = self:colors(fade.bank, fade.address, 16) + end + + return out end -- The engine's own strings, keyed by the label the disassembly gives them. @@ -3764,17 +4095,39 @@ function RomExtractorGen2:extractOakSpeech(pokemon) if self.symbols.Shrink2Pic then pcall(self.writeCompressedPic, self, "Shrink2Pic", 7, "intro/shrink2.png") end + -- The player pic OakSpeech draws: Crystal's DrawIntroPlayerPic picks + -- Chris/Kris by gender (../pokecrystal/engine/gfx/player_gfx.asm:170-201), + -- both raw column-major 7x7 2bpp (../pokecrystal/Makefile:319,321). + local playerPic, playerPicFemale = nil, nil + for key, label in pairs({ chris = "ChrisPic", kris = "KrisPic" }) do + if self.symbols[label] then + local sym = self:symbol(label) + local pixels = ImageWriter.columnsToRows( + self.rom:bytes(sym.bank, sym.address, 7 * 7 * 16), 7, 7) + self:write2bpp(pixels, 56, 56, "intro/" .. key .. ".png") + if key == "chris" then + playerPic = "assets/generated/intro/chris.png" + else + playerPicFemale = "assets/generated/intro/kris.png" + end + end + end local splash = self:splashGfx() - local marill = pokemon and pokemon.MARILL + -- OakSpeech's demo mon: MARILL on Gold (../pokegold/engine/menus/ + -- intro_menu.asm:519), WOOPER on Crystal (../pokecrystal/engine/menus/ + -- intro_menu.asm:652). + local demoSpecies = (self.edition == "crystal") and "WOOPER" or "MARILL" + local demoMon = pokemon and pokemon[demoSpecies] local data = { generation = 2, source = "ROM:OakSpeech (_OakText1-7, PokemonProfPic, CalPic)", music = "Music_Route30", - demoSpecies = "MARILL", + demoSpecies = demoSpecies, oakPic = "assets/generated/intro/oak.png", - playerPic = "assets/generated/intro/cal.png", - marillPic = marill and marill.spriteFront - or "assets/generated/battle/front/marill.png", + playerPic = playerPic or "assets/generated/intro/cal.png", + playerPicFemale = playerPicFemale, + marillPic = demoMon and demoMon.spriteFront + or ("assets/generated/battle/front/%s.png"):format(demoSpecies:lower()), shrink1 = "assets/generated/intro/shrink1.png", shrink2 = "assets/generated/intro/shrink2.png", gamefreakLogo = "assets/generated/intro/gamefreak_logo.png", @@ -4201,6 +4554,56 @@ function RomExtractorGen2:readRoamMaps() return out end +-- InitRoamMons (engine/overworld/wildmons.asm) is straight-line +-- `ld a, n` / `ld [wRoamMonN], a` writes with one `xor a` before the HP +-- pair, so the roster is read out of the code rather than a table: Gold seeds +-- three beasts (:488-529), Crystal two (../pokecrystal/.../wildmons.asm: +-- 493-524). roam_struct is species, level, group, number, hp, dvs +-- (macros/ram.asm:218-225), so the writes land at base+0..base+4, stride 7. +local ROAMMON_STRUCT_LENGTH = 7 +local LD_A_N, LD_NN_A, XOR_A, RET = 0x3e, 0xea, 0xaf, 0xc9 + +function RomExtractorGen2:readRoamMons() + local symbol = self:symbol("InitRoamMons") + local writes, order = {}, {} + local at, acc = symbol.address, 0 + for _ = 1, 128 do + if not romAddrOk(symbol.bank, at + 2) then return nil end + local op = self.rom:byte(symbol.bank, at) + if op == RET then break end + if op == XOR_A then + acc, at = 0, at + 1 + elseif op == LD_A_N then + acc, at = self.rom:byte(symbol.bank, at + 1), at + 2 + elseif op == LD_NN_A then + local dest = self.rom:word(symbol.bank, at + 1) + if writes[dest] == nil then order[#order + 1] = dest end + writes[dest] = acc + at = at + 3 + else + return nil + end + end + -- wRoamMon1..3 are consecutive (../pokecrystal/ram/wram.asm:3486-3488), so + -- the first destination written is wRoamMon1Species. + local base = order[1] + if not base then return nil end + local roamers = {} + for slot = 0, 2 do + local at2 = base + slot * ROAMMON_STRUCT_LENGTH + local species = writes[at2] + if not species or species == 0 then break end + roamers[#roamers + 1] = { + species = self:speciesName(species), + level = writes[at2 + 1], + mapGroup = writes[at2 + 2], + mapNumber = writes[at2 + 3], + map = self:mapNameByIds(writes[at2 + 2] or 0, writes[at2 + 3] or 0), + } + end + return (#roamers > 0) and roamers or nil +end + -- data/wild/bug_contest_mons.asm. A shape of its own, and deliberately not -- read through readGrassTable: there is no map key, no per-time rate and no -- seven-slot list, just `db %, species, min, max` rows that @@ -4399,6 +4802,12 @@ function RomExtractorGen2:extractEncounters() local swarmWater = self.symbols.SwarmWaterWildMons and self:readWaterTable("SwarmWaterWildMons") or nil local roamMaps = self.symbols.RoamMaps and self:readRoamMaps() or nil + local roamMons = nil + if self.symbols.InitRoamMons then + local ok, result = pcall(self.readRoamMons, self) + roamMons = ok and result or nil + if not ok then self:trace("roam mons: " .. tostring(result)) end + end local data = { generation = 2, @@ -4414,6 +4823,7 @@ function RomExtractorGen2:extractEncounters() swarmGrass = swarmGrass, swarmWater = swarmWater, roamMaps = roamMaps, + roamMons = roamMons, } self:trace("writing encounters.lua") self:write("encounters", data) @@ -4421,6 +4831,150 @@ function RomExtractorGen2:extractEncounters() return data end +-- ../pokecrystal/engine/events/battle_tower/load_trainer.asm:29-38 and +-- :117-119. Both rejection loops are `maskbits N / cp N / jr nc, .resample`, +-- which rgbasm lays down as E6 mask / FE count / 30 rel -- so the ceiling the +-- cart really samples against is read here rather than written down. Crystal +-- 1.0 and 1.1 differ in exactly this byte (:33-37). +function RomExtractorGen2:btSampleCeiling(label) + local symbol = self:symbol(label) + local raw = self.rom:bytes(symbol.bank, symbol.address, 24) + for index = 1, #raw - 4 do + if raw[index] == 0xe6 and raw[index + 2] == 0xfe + and raw[index + 4] == 0x30 then + return raw[index + 3] + end + end + error("battle tower sample ceiling not found at " .. label) +end + +-- One `party_struct` (../pokecrystal/macros/ram.asm party_struct, laid out by +-- ../pokecrystal/constants/pokemon_data_constants.asm:75-113). Every word in +-- it is big-endian, which is what `bigdw` / `bigdt` in parties.asm emit. +function RomExtractorGen2:readBattleTowerMon(bank, address, moveOrder, itemOrder) + local raw = self.rom:bytes(bank, address, PARTYMON_STRUCT_LENGTH) + local function word(index) return raw[index] * 0x100 + raw[index + 1] end + local moves, pp = {}, {} + for slot = 0, 3 do + local moveId = raw[3 + slot] + if moveId ~= 0 then + moves[#moves + 1] = moveOrder[moveId] or moveId + -- MON_PP's top two bits are the PP Ups (constants/pokemon_data_ + -- constants.asm:135 PP_UP_MASK); no Tower row uses them, and masking + -- here keeps a count out of the port's pp field either way. + pp[#pp + 1] = raw[24 + slot] % 64 + end + end + local item = itemOrder[raw[2]] + if item == "NO_ITEM" then item = nil end + return { + species = self:speciesName(raw[1]), + item = item, + moves = moves, + pp = pp, + otId = word(7), + experience = raw[9] * 0x10000 + raw[10] * 0x100 + raw[11], + statExp = { + hp = word(12), attack = word(14), defense = word(16), + speed = word(18), special = word(20), + }, + -- MON_DVS: two nibble pairs, attack/defense then speed/special. + dvs = { + attack = math.floor(raw[22] / 16), defense = raw[22] % 16, + speed = math.floor(raw[23] / 16), special = raw[23] % 16, + }, + happiness = raw[28], + level = raw[32], + -- MON_HP / MON_MAXHP / MON_STATS, stored rather than recomputed: the cart + -- copies these bytes straight into wOTPartyMon. + hp = word(35), + maxHp = word(37), + stats = { + hp = word(37), attack = word(39), defense = word(41), + speed = word(43), specialAttack = word(45), specialDefense = word(47), + }, + } +end + +-- The Battle Tower roster. A separate table from Trainers/TrainerGroups in +-- every way: the trainers are 70 fixed-width name+class rows +-- (../pokecrystal/data/battle_tower/classes.asm:1-4 `bt_trainer`), and their +-- parties are not read from the trainer row at all -- LoadRandomBattleTowerMon +-- draws three FULLY BUILT party_structs out of BattleTowerMons, which is ten +-- level groups of twenty-one mons carrying their own DVs, stat exp, PP and +-- final stats. So none of extractTrainers' TRAINERTYPE_* walk applies here. +-- +-- Gold and Silver have neither symbol and get nil. +function RomExtractorGen2:readBattleTowerRoster(consts, charmap) + if not (self.symbols["BattleTowerTrainers"] + and self.symbols["BattleTowerMons"]) then + return nil + end + local classOrder = consts.trainerClassOrder or {} + local spriteOrder = consts.spriteOrder or {} + local moveOrder = consts.moveOrder or {} + local itemOrder = consts.itemOrder or {} + local trainerSym = self:symbol("BattleTowerTrainers") + local monSym = self:symbol("BattleTowerMons") + -- BattleTowerMons is the label straight after BattleTowerTrainers + -- (../pokecrystal/engine/events/battle_tower/load_trainer.asm:210-212 + -- includes classes.asm then parties.asm), so the gap IS the row count. + local uniqueTrainers = + math.floor((monSym.address - trainerSym.address) / NAME_LENGTH) + local uniqueMon = self:btSampleCeiling("LoadRandomBattleTowerMon.resample") + local trainers = {} + for index = 0, uniqueTrainers - 1 do + local address = trainerSym.address + index * NAME_LENGTH + local raw = self.rom:bytes(trainerSym.bank, address, NAME_LENGTH - 1) + local classId = self.rom:byte(trainerSym.bank, address + NAME_LENGTH - 1) + trainers[index + 1] = { + index = index, + name = self.rom:decodeText(raw, charmap, 0x50), + class = classId, + classId = classOrder[classId + 1], + } + end + local groups = {} + for group = 1, BT_LEVEL_GROUPS do + local rows = {} + for slot = 0, uniqueMon - 1 do + local address = monSym.address + + ((group - 1) * uniqueMon + slot) * NICKNAMED_MON_STRUCT_LENGTH + rows[slot + 1] = self:readBattleTowerMon( + monSym.bank, address, moveOrder, itemOrder) + end + groups[group] = rows + end + -- ../pokecrystal/data/trainers/sprites.asm:1-3, one SPRITE_* per trainer class starting at + -- class 1; LoadOpponentTrainerAndPokemonWithOTSprite indexes it with + -- `wBT_OTTrainerClass - 1` (battle_tower.asm:1540-1550). The table stops + -- one row short of the class list: `assert_table_length NUM_TRAINER_CLASSES + -- - 1 ; exclude MYSTICALMAN` (../pokecrystal/data/trainers/sprites.asm:70). + local sprites = {} + if self.symbols["BTTrainerClassSprites"] then + local spriteSym = self:symbol("BTTrainerClassSprites") + for classId = 1, #classOrder - 2 do + local byte = self.rom:byte(spriteSym.bank, spriteSym.address + classId - 1) + sprites[classOrder[classId + 1]] = spriteOrder[byte] or byte + end + end + return { + source = "ROM:BattleTowerTrainers + BattleTowerMons" + .. " + BTTrainerClassSprites", + partyLength = BT_PARTY_LENGTH, + levelGroups = BT_LEVEL_GROUPS, + uniqueMon = uniqueMon, + uniqueTrainers = uniqueTrainers, + -- The trainer draw's own ceiling, which on Crystal 1.0 is uniqueMon and + -- not uniqueTrainers (load_trainer.asm:33-37). + sampleTrainers = + self:btSampleCeiling("LoadOpponentTrainerAndPokemon.resample"), + trainers = trainers, + groups = groups, + classSprites = sprites, + } +end + -- Trainers. TrainerGroups is indexed by trainer class - 1 (the table starts -- at FALKNER = 1); each group is a run of variable-length parties whose shape -- depends on the party's own TRAINERTYPE_* byte, ending at -1. @@ -4566,6 +5120,7 @@ function RomExtractorGen2:extractTrainers() } self:tick("Trainers", classIndex, #classOrder) end + out.battleTower = self:readBattleTowerRoster(consts, charmap) self:write("trainers", out) return out end @@ -4910,6 +5465,11 @@ function RomExtractorGen2:introPalettes() end function RomExtractorGen2:extractIntro() + -- Crystal's intro is a different program with its own asset set + -- (../pokecrystal/engine/movie/intro.asm:1 CrystalIntro, :1678-1777 GFX). + if self.edition == "crystal" then + return require("src.import.CrystalMovie").extractIntro(self) + end self:beginStage("Intro movie") local out = { generation = 2, source = "ROM:Intro_*GFX/Tilemap/Meta" } @@ -5045,6 +5605,25 @@ function RomExtractorGen2:extractMenuGfx() if ok then hud.playerBack = "assets/generated/battle/player_back.png" end end + -- GetKrisBackpic, six tiles square like Chris but stored raw rather than lz3 + -- (../pokecrystal/engine/gfx/player_gfx.asm:209-217). + if self.symbols["KrisBackpic"] then + local sym = self:symbol("KrisBackpic") + local ok = pcall(function() + local size = BACK_PIC_TILES * 8 + local pixels = ImageWriter.columnsToRows( + self.rom:bytes(sym.bank, sym.address, + BACK_PIC_TILES * BACK_PIC_TILES * 16), + BACK_PIC_TILES, BACK_PIC_TILES) + self:save(ImageWriter.matteColor0( + ImageWriter.decode2bpp(pixels, size, size)), + "battle/player_back_female.png") + end) + if ok then + hud.playerBackFemale = "assets/generated/battle/player_back_female.png" + end + end + -- GetTrainerBackpic's "Special exception for Dude": the catching tutorial -- draws DudeBackpic in that same box, from the same bank and at the same six -- tiles square (src/core/gen2/CatchTutorial.lua). @@ -5069,8 +5648,7 @@ function RomExtractorGen2:extractMenuGfx() -- index 1 is TRAINER_NONE (class 0), which the `dec a` skips. if index >= 2 then local base = symbol.address + (index - 2) * 3 - local bank = FIX_PIC_BANK[self.rom:byte(symbol.bank, base)] - or self.rom:byte(symbol.bank, base) + local bank = self:picBank(self.rom:byte(symbol.bank, base)) local address = self.rom:word(symbol.bank, base + 1) local rel = ("battle/trainers/%s.png"):format(class:lower()) local ok, err = pcall(function() @@ -5095,6 +5673,24 @@ function RomExtractorGen2:extractMenuGfx() end end end + -- HOF_LoadTrainerFrontpic sets wTrainerClass to CHRIS or KRIS and loads + -- ChrisPic / KrisPic (../pokecrystal/engine/gfx/player_gfx.asm:138,203,206). + for class, label in pairs({ CHRIS = "ChrisPic", KRIS = "KrisPic" }) do + if self.symbols[label] then + local sym = self:symbol(label) + local rel = ("battle/trainers/%s.png"):format(class:lower()) + local ok, err = pcall(function() + local pixels = ImageWriter.columnsToRows( + self.rom:bytes(sym.bank, sym.address, 7 * 7 * 16), 7, 7) + self:write2bpp(pixels, 56, 56, rel) + end) + if ok then + pics[class] = "assets/generated/" .. rel + else + self:trace(("trainer pic %s: %s"):format(class, tostring(err))) + end + end + end hud.trainerPics = pics end @@ -5181,10 +5777,23 @@ function RomExtractorGen2:extractMenuGfx() -- constants/item_data_constants.asm *_POCKET order. pack.pocketOrder = { "ITEM", "BALL", "KEY_ITEM", "TM_HM" } - local packPals = self:symbol("_CGB_PackPals.PackPals") - pack.palettes = {} - for i = 0, 5 do - pack.palettes[i + 1] = self:colors(packPals.bank, packPals.address + i * 8, 4) + -- Crystal splits the pack palette by player gender + -- (../pokecrystal/engine/gfx/cgb_layouts.asm:818,821); the FillBoxCGB zones + -- below are byte-identical in both trees (:792-811 vs pokegold :715-734). + local function packPalettes(symbol) + local out2 = {} + for i = 0, 5 do + out2[i + 1] = self:colors(symbol.bank, symbol.address + i * 8, 4) + end + return out2 + end + local packPals = self.symbols["_CGB_PackPals.PackPals"] + and self:symbol("_CGB_PackPals.PackPals") + or self:symbol("_CGB_PackPals.ChrisPackPals") + pack.palettes = packPalettes(packPals) + if self.symbols["_CGB_PackPals.KrisPackPals"] then + pack.palettesFemale = + packPalettes(self:symbol("_CGB_PackPals.KrisPackPals")) end -- _CGB_PackPals' FillBoxCGB calls, as {x, y, width, height, palette}. pack.paletteZones = { @@ -5848,10 +6457,20 @@ function RomExtractorGen2:pokegearGfx() kanto = self:readFlatTilemap("KantoMap", cells), } - local pals = self:symbol("PokegearPals") - gear.palettes = {} - for i = 0, 5 do - gear.palettes[i + 1] = self:colors(pals.bank, pals.address + i * 8, 4) + -- Crystal picks the set by player gender + -- (../pokecrystal/engine/gfx/color.asm:1330,1333). + local function gearPalettes(symbol) + local out2 = {} + for i = 0, 5 do + out2[i + 1] = self:colors(symbol.bank, symbol.address + i * 8, 4) + end + return out2 + end + local pals = self.symbols["PokegearPals"] and self:symbol("PokegearPals") + or self:symbol("MalePokegearPals") + gear.palettes = gearPalettes(pals) + if self.symbols["FemalePokegearPals"] then + gear.palettesFemale = gearPalettes(self:symbol("FemalePokegearPals")) end -- TownMapPals.PalMap: 48 bytes covering tiles $00..$5f, 1-based so the value -- indexes gear.palettes directly. @@ -5878,13 +6497,45 @@ end -- of BadgeGFX with TrainerCard_JohtoBadgesOAM as their template table. function RomExtractorGen2:trainerCardGfx() local card = {} - local chris = self:symbol("ChrisPicAndTrainerCardGFX") - -- 41 tiles padded out to three 16-tile rows so the sheet is addressable as - -- (id % 16, id / 16) like every other one here. - local cardTiles = self.rom:bytes(chris.bank, chris.address, 41 * 16) - while #cardTiles < 48 * 16 do cardTiles[#cardTiles + 1] = 0 end - self:write2bpp(cardTiles, 128, 24, "trainer_card/card.png") - card.card = "assets/generated/trainer_card/card.png" + -- Crystal keeps the same $23-portrait-then-6-frame-tiles VRAM layout but + -- splits the source into three labels and a gender pair: GetCardPic copies + -- $23 tiles of Chris/KrisCardPic to vTiles2 $00 and 6 tiles of + -- TrainerCardGFX to $23 (../pokecrystal/engine/gfx/player_gfx.asm:96-112). + local function cardSheet(portraitLabel, frameLabel, relative) + local cardTiles + if frameLabel then + local portrait = self:symbol(portraitLabel) + local frame = self:symbol(frameLabel) + -- Crystal builds the 5x7 portrait with --columns + -- (../pokecrystal/Makefile:324-325); the 6 frame tiles have no such rule. + cardTiles = ImageWriter.columnsToRows( + self.rom:bytes(portrait.bank, portrait.address, 35 * 16), 5, 7) + for _, byte in ipairs(self.rom:bytes(frame.bank, frame.address, 6 * 16)) + do + cardTiles[#cardTiles + 1] = byte + end + else + local sym = self:symbol(portraitLabel) + cardTiles = self.rom:bytes(sym.bank, sym.address, 41 * 16) + end + -- 41 tiles padded out to three 16-tile rows so the sheet is addressable as + -- (id % 16, id / 16) like every other one here. + while #cardTiles < 48 * 16 do cardTiles[#cardTiles + 1] = 0 end + self:write2bpp(cardTiles, 128, 24, relative) + return "assets/generated/" .. relative + end + + if self.symbols["ChrisPicAndTrainerCardGFX"] then + card.card = cardSheet("ChrisPicAndTrainerCardGFX", nil, + "trainer_card/card.png") + else + card.card = cardSheet("ChrisCardPic", "TrainerCardGFX", + "trainer_card/card.png") + if self.symbols["KrisCardPic"] then + card.cardFemale = cardSheet("KrisCardPic", "TrainerCardGFX", + "trainer_card/card_f.png") + end + end card.cardTilesWide = 16 card.portraitTiles = 35 card.portraitWide = 5 @@ -6204,6 +6855,254 @@ function RomExtractorGen2:readBattleAnimGfx() return out end +-- Mobile System GB art: `tiles` is the ROM block's tile count and `wide` the +-- tile width its own PNG uses (../pokecrystal/Makefile:340-350). +local MOBILE_SHEETS = { + -- ../pokecrystal/mobile/mobile_5c.asm:290,293,296,753,866 + { key = "asciiFont", file = "ascii_font", + label = "AsciiFontGFX", tiles = 110, wide = 16 }, + { key = "pichuAnimated", file = "pichu_animated", + label = "PichuAnimatedMobileGFX", tiles = 193, wide = 16, lz = true }, + { key = "electroBall", file = "electro_ball", + label = "ElectroBallMobileGFX", tiles = 83, wide = 16, lz = true }, + { key = "pichuBorder", file = "pichu_border", + label = "PichuBorderMobileGFX", tiles = 24, wide = 4 }, + { key = "stadium2N64", file = "stadium2_n64", + label = "Stadium2N64GFX", tiles = 73, wide = 11 }, + -- ../pokecrystal/mobile/mobile_5e.asm:2,5,8,11,14,18,931,934,941 + { key = "card", file = "card", label = "MobileCardGFX", + tiles = 32, wide = 16 }, + { key = "chrisSilhouette", file = "chris_silhouette", + label = "ChrisSilhouetteGFX", tiles = 35, wide = 5 }, + { key = "krisSilhouette", file = "kris_silhouette", + label = "KrisSilhouetteGFX", tiles = 35, wide = 5 }, + { key = "card2", file = "card_2", label = "MobileCard2GFX", + tiles = 23, wide = 12 }, + { key = "cardLargeSprite", file = "card_large_sprite", + label = "CardLargeSpriteAndFolderGFX", tiles = 8, wide = 4 }, + { key = "cardFolder", file = "card_folder", + label = "CardLargeSpriteAndFolderGFX", tiles = 65, wide = 6, + offset = 8 * 16 }, + { key = "cardSprite", file = "card_sprite", + label = "CardSpriteGFX", tiles = 4, wide = 2 }, + { key = "dialpad", file = "dialpad", label = "DialpadGFX", + tiles = 76, wide = 16 }, + { key = "dialpadCursor", file = "dialpad_cursor", + label = "DialpadCursorGFX", tiles = 5, wide = 2 }, + { key = "cardList", file = "card_list", + label = "MobileCardListGFX", tiles = 24, wide = 12 }, + -- ../pokecrystal/mobile/mobile_5f.asm:84,87,3528 + { key = "haveWant", file = "havewant", label = "HaveWantGFX", + tiles = 144, wide = 16 }, + { key = "select", file = "select", label = "MobileSelectGFX", + tiles = 32, wide = 4 }, + { key = "pokemonNews", file = "pokemon_news", + label = "PokemonNewsGFX", tiles = 72, wide = 8 }, + -- ../pokecrystal/mobile/mobile_5b.asm:206,758 + { key = "splash", file = "mobile_splash", + label = "MobileSystemSplashScreen_InitGFX.Tiles", tiles = 76, wide = 14 }, + { key = "adapterCheck", file = "mobile_splash_check", + label = "MobileAdapterCheckGFX", tiles = 48, wide = 16 }, + -- ../pokecrystal/mobile/mobile_42.asm:1733,1736,1757,1760 and + -- ../pokecrystal/mobile/mobile_40.asm:6921 + { key = "trade", file = "mobile_trade", label = "MobileTradeGFX", + tiles = 128, wide = 8, lz = true }, + { key = "tradeSprites", file = "mobile_trade_sprites", + label = "MobileTradeSpritesGFX", tiles = 16, wide = 4, lz = true }, + { key = "cable1", file = "mobile_cable_1", + label = "MobileCable1GFX", tiles = 16, wide = 4 }, + { key = "cable2", file = "mobile_cable_2", + label = "MobileCable2GFX", tiles = 16, wide = 4 }, + { key = "tradeLights", file = "mobile_trade_lights", + label = "MobileTradeLightsGFX", tiles = 4, wide = 2 }, + -- ../pokecrystal/mobile/mobile_45_sprite_engine.asm:311 and + -- ../pokecrystal/mobile/mobile_41.asm:1115 + { key = "dialing", file = "dialing", label = "MobileDialingGFX", + tiles = 20, wide = 2 }, + { key = "dialingFrame", file = "dialing_frame", + label = "MobileDialingFrameGFX", tiles = 8, wide = 2 }, + -- ../pokecrystal/mobile/mobile_22.asm:518 and + -- ../pokecrystal/mobile/fixed_words.asm:3231 + { key = "ezChatCursor", file = "ez_chat_cursor", + label = "EZChatCursorGFX", tiles = 2, wide = 1 }, + { key = "selectStart", file = "select_start", + label = "SelectStartGFX", tiles = 6, wide = 3 }, + -- ../pokecrystal/mobile/mobile_12.asm:1007,1010, the only 1bpp pair + { key = "upArrow", file = "up_arrow", label = "MobileUpArrowGFX", + tiles = 1, wide = 1, bpp = 1 }, + { key = "downArrow", file = "down_arrow", label = "MobileDownArrowGFX", + tiles = 1, wide = 1, bpp = 1 }, + -- ../pokecrystal/engine/menus/main_menu.asm:24 and + -- ../pokecrystal/gfx/font.asm:58 + { key = "menu", file = "mobile_menu", label = "MobileMenuGFX", + tiles = 13, wide = 13 }, + { key = "phoneTiles", file = "phone_tiles", + label = "MobilePhoneTilesGFX", tiles = 17, wide = 2 }, + -- ../pokecrystal/engine/link/mystery_gift.asm:1606,1920,1923 + { key = "mysteryGift", file = "mystery_gift/mystery_gift", + label = "MysteryGiftGFX", tiles = 67, wide = 16 }, + { key = "cardTrade", file = "mystery_gift/card_trade", + label = "CardTradeGFX", tiles = 64, wide = 16 }, + { key = "cardTradeSprite", file = "mystery_gift/card_sprite", + label = "CardTradeSpriteGFX", tiles = 8, wide = 4 }, +} + +local MOBILE_MAPS = { + -- ../pokecrystal/mobile/mobile_5c.asm:756,759,762,765,768,771,874,878 + { key = "passwordTop", file = "password_top", + label = "PasswordTopTilemap", bytes = 140 }, + { key = "passwordBottom", file = "password_bottom", + label = "PasswordBottomTilemap", bytes = 220 }, + { key = "passwordShift", file = "password_shift", + label = "PasswordShiftTilemap", bytes = 140 }, + { key = "passwordAttrmap", file = "password_attrmap", + label = "MobilePasswordAttrmap", bytes = 360 }, + { key = "centerTilemap", file = "mobile_center_tilemap", + label = "ChooseMobileCenterTilemap", bytes = 360 }, + { key = "centerAttrmap", file = "mobile_center_attrmap", + label = "ChooseMobileCenterAttrmap", bytes = 360 }, + { key = "stadium2N64Tilemap", file = "stadium2_n64_tilemap", + label = "Stadium2N64Tilemap", bytes = 360 }, + { key = "stadium2N64Attrmap", file = "stadium2_n64_attrmap", + label = "Stadium2N64Attrmap", bytes = 360 }, + -- ../pokecrystal/mobile/mobile_5e.asm:925,928 + { key = "dialpadTilemap", file = "dialpad_tilemap", + label = "DialpadTilemap", bytes = 360 }, + { key = "dialpadAttrmap", file = "dialpad_attrmap", + label = "DialpadAttrmap", bytes = 360 }, + -- ../pokecrystal/mobile/mobile_5f.asm:91,3534 + { key = "haveWantMap", file = "havewant_map", + label = "HaveWantMap", bytes = 1136 }, + { key = "newsAttrmap", file = "pokemon_news_attrmap", + label = "PokemonNewsTileAttrmap", bytes = 1128 }, + -- ../pokecrystal/mobile/mobile_5b.asm:209,212 + { key = "splashTilemap", file = "mobile_splash_tilemap", + label = "MobileSystemSplashScreen_InitGFX.Tilemap", bytes = 360 }, + { key = "splashAttrmap", file = "mobile_splash_attrmap", + label = "MobileSystemSplashScreen_InitGFX.Attrmap", bytes = 360 }, + -- ../pokecrystal/mobile/mobile_45_2.asm:1368,1369, one label over both + { key = "pichuBorderTilemap", file = "pichu_border_tilemap", + label = "PichuBorderMobileTilemapAttrmap", bytes = 384 }, + { key = "pichuBorderAttrmap", file = "pichu_border_attrmap", + label = "PichuBorderMobileTilemapAttrmap", bytes = 384, offset = 384 }, + -- ../pokecrystal/mobile/mobile_42.asm:1739,1742 + { key = "tradeTilemap", file = "mobile_trade_tilemap", + label = "MobileTradeTilemapLZ", bytes = 1024, lz = true }, + { key = "tradeAttrmap", file = "mobile_trade_attrmap", + label = "MobileTradeAttrmapLZ", bytes = 1024, lz = true }, +} + +-- ../pokecrystal/mobile/mobile_5b.asm:215 and the other INCLUDEd .pal files; +-- `colors` is the RGB word count, not the palette count. +local MOBILE_PALETTES = { + { key = "splash", label = "MobileSplashScreenPalettes", colors = 32 }, + { key = "password", label = "MobilePasswordPalettes", colors = 32 }, + { key = "pokemonNews", label = "PokemonNewsPalettes", colors = 32 }, + { key = "pichuBorderOB", label = "PichuBorderMobileOBPalettes", colors = 32 }, + { key = "pichuBorderBG", label = "PichuBorderMobileBGPalettes", colors = 4 }, + { key = "tradeBG", label = "MobileTradeBGPalettes", colors = 32 }, + { key = "tradeOB1", label = "MobileTradeOB1Palettes", colors = 32 }, + { key = "tradeOB2", label = "MobileTradeOB2Palettes", colors = 32 }, + { key = "tradeLights", label = "MobileTradeLightsPalettes", colors = 16 }, + { key = "adapters", label = "MobileAdapterPalettes", colors = 8 }, + { key = "unusedPulses", label = "UnusedMobilePulsePalettes", colors = 8 }, +} + +-- The mobile banks at ../pokecrystal/main.asm:187-575, which no Gold tree has. +function RomExtractorGen2:extractMobileGfx() + if self.edition ~= "crystal" then return nil end + local CacheFs = require("src.import.CacheFs") + self:trace("Mobile System GB graphics") + + local sheets, maps, palettes = {}, {}, {} + local total = #MOBILE_SHEETS + #MOBILE_MAPS + local step = 0 + + for _, row in ipairs(MOBILE_SHEETS) do + step = step + 1 + self:tick("Mobile graphics", step, total) + if self.symbols[row.label] then + local perTile = (row.bpp == 1) and 8 or 16 + local rel = ("mobile/%s.png"):format(row.file) + local ok, err = pcall(function() + local sym = self:symbol(row.label) + local offset = row.offset or 0 + local bytes + if row.lz then + bytes = self:decompressLz3Symbol(row.label) + else + bytes = self.rom:bytes(sym.bank, sym.address + offset, + row.tiles * perTile) + offset = 0 + end + local rows = math.ceil(row.tiles / row.wide) + local need = rows * row.wide * perTile + local pixels = {} + for index = 1, need do pixels[index] = bytes[offset + index] or 0 end + local width, height = row.wide * 8, rows * 8 + if row.bpp == 1 then + self:save(ImageWriter.decode1bpp(pixels, width, height), rel) + else + self:write2bpp(pixels, width, height, rel) + end + sheets[row.key] = { + path = "assets/generated/" .. rel, + tiles = row.tiles, tilesWide = row.wide, + } + end) + if not ok then + self:trace(("mobile sheet %s: %s"):format(row.key, tostring(err))) + end + end + end + + for _, row in ipairs(MOBILE_MAPS) do + step = step + 1 + self:tick("Mobile graphics", step, total) + if self.symbols[row.label] then + local rel = ("assets/generated/mobile/%s.bin"):format(row.file) + local ok, err = pcall(function() + local sym = self:symbol(row.label) + local blob + if row.lz then + local bytes = self:decompressLz3Symbol(row.label) + local chars = {} + for index = 1, row.bytes do + chars[index] = string.char(bytes[index] or 0) + end + blob = table.concat(chars) + else + local first = Rom.offset(sym.bank, sym.address) + 1 + (row.offset or 0) + blob = self.rom.data:sub(first, first + row.bytes - 1) + end + local written, writeError = CacheFs.write(rel, blob) + if not written then error(tostring(writeError)) end + maps[row.key] = { path = rel, bytes = row.bytes } + end) + if not ok then + self:trace(("mobile map %s: %s"):format(row.key, tostring(err))) + end + end + end + + for _, row in ipairs(MOBILE_PALETTES) do + if self.symbols[row.label] then + local sym = self:symbol(row.label) + palettes[row.key] = self:colors(sym.bank, sym.address, row.colors) + end + end + + local data = { + generation = 2, + source = "ROM:mobile/*.asm + engine/link/mystery_gift.asm", + sheets = sheets, + maps = maps, + palettes = palettes, + } + self:write("mobile_gfx", data) + return data +end + function RomExtractorGen2:extractBattleAnims() self:beginStage("Battle animations") local moveOrder = (self.manifest.constants or {}).moveOrder or {} @@ -6340,6 +7239,7 @@ function RomExtractorGen2:run() results.icons = self:extractIcons() results.intro = self:extractIntro() results.menuGfx = self:extractMenuGfx() + results.mobileGfx = self:extractMobileGfx() results.oakSpeech = self:extractOakSpeech(results.pokemon) results.title = self:extractTitle() results.credits = self:extractCredits() diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index aa6ea4cf..20b573dc 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -155,6 +155,53 @@ local VERSION_REQUIRED_FILES_OVERRIDE = { -- PCMailGFX (engine/pokemon/bills_pc.asm:2170-2173) "assets/generated/pc/mail_item.png", }, + crystal = { + "data/generated/constants.lua", + "data/generated/maps.lua", + "data/generated/roofs.lua", + "data/generated/sprites.lua", + "data/generated/scripts.lua", + "data/generated/text.lua", + "data/generated/rom_text.lua", + "data/generated/pokemon.lua", + "data/generated/encounters.lua", + "data/generated/tilesets.lua", + "data/generated/landmarks.lua", + "data/generated/audio.lua", + "data/generated/marts.lua", + "data/generated/oak_speech.lua", + "data/generated/title.lua", + "data/generated/intro.lua", + "assets/generated/fonts/font.png", + "assets/generated/fonts/frames.png", + "assets/generated/title/crystal_logo.png", + "assets/generated/title/crystal_wordmark.png", + "assets/generated/title/crystal_suicune.png", + "assets/generated/splash/ditto.png", + "assets/generated/intro/chris.png", + "assets/generated/intro/kris.png", + "assets/generated/intro/suicune_run_sprites.png", + "assets/generated/intro/unowns_tiles.png", + "assets/generated/intro/oak.png", + "assets/generated/tilesets/johto.png", + "assets/generated/tilesets/roofs/new_bark.png", + "assets/generated/sprites/chris.png", + "assets/generated/sprites/kris.png", + "assets/generated/battle/front/chikorita.png", + "assets/generated/battle/front/wooper.png", + "assets/generated/battle/front/pikachu.png", + "assets/generated/battle/trainers/falkner.png", + "assets/generated/battle/hud/balls.png", + "assets/generated/audio/programs.bin", + "assets/generated/slots/gold_slots_1.png", + "assets/generated/card_flip/card_flip_1.png", + "assets/generated/pc/mail_item.png", + "assets/generated/trainer_card/card_f.png", + "data/generated/mobile_gfx.lua", + "assets/generated/battle/player_back_female.png", + "assets/generated/battle/trainers/kris.png", + "assets/generated/battle/trainers/chris.png", + }, } -- Same Gen 2 extract, so a Silver cache is complete when the same files exist. VERSION_REQUIRED_FILES_OVERRIDE.silver = VERSION_REQUIRED_FILES_OVERRIDE.gold @@ -605,6 +652,27 @@ local function isAcceptedRomSize(n) return n == ROM_BYTES_GEN1 or n == ROM_BYTES_GEN2 end +local function cartLabels(generation) + local out = {} + for _, id in ipairs(GameVersion.ORDER) do + if generation == nil or GameVersion.generation(id) == generation then + out[#out + 1] = GameVersion.info(id).label + end + end + return out +end + +local function cartsSlashed(generation) + return table.concat(cartLabels(generation), "/") +end + +local function cartsProse() + local names = cartLabels(nil) + local last = table.remove(names) + if #names == 0 then return last end + return table.concat(names, ", ") .. ", or " .. last +end + local function savesInboxDir(version) return SAVES_INBOX_DIR .. "/" .. tostring(version) end @@ -1849,18 +1917,18 @@ function RomImporter:startData(data, displayName) return end if not isAcceptedRomSize(#data) then - self:setError(("Expected a 1 MiB Game Boy ROM (Red/Blue/Yellow) or a " - .. "2 MiB Game Boy Color ROM (Gold/Silver); this file is %.2f MiB.") - :format(#data / 1024 / 1024)) + self:setError(("Expected a 1 MiB Game Boy ROM (%s) or a " + .. "2 MiB Game Boy Color ROM (%s); this file is %.2f MiB.") + :format(cartsSlashed(1), cartsSlashed(2), #data / 1024 / 1024)) return end local actualHash = sha1(data) local version = GameVersion.forSha1(actualHash) if not version then self:setError(("Unsupported ROM (SHA-1 %s). This needs a clean US Pokemon " - .. "Red, Blue, Yellow, Gold, or Silver dump; patched, trimmed or " + .. "%s dump; patched, trimmed or " .. "\"fixed\" dumps " - .. "(tagged [b] or [BF]) never verify."):format(actualHash)) + .. "(tagged [b] or [BF]) never verify."):format(actualHash, cartsProse())) return end local info = GameVersion.info(version) @@ -2965,8 +3033,10 @@ function RomImporter:resumeAfterOverlay() end function RomImporter:_cycleTab(delta) - local order = { "red", "blue", "yellow", "gold", "silver", - "mods", "find", "skins", "bug" } + local order = { "mods", "find", "skins", "bug" } + for i = #GameVersion.ORDER, 1, -1 do + table.insert(order, 1, GameVersion.ORDER[i]) + end local idx = 1 for i, id in ipairs(order) do if id == self.tab then idx = i; break end diff --git a/src/render/MonAnim.lua b/src/render/MonAnim.lua new file mode 100644 index 00000000..15c8b52e --- /dev/null +++ b/src/render/MonAnim.lua @@ -0,0 +1,164 @@ +-- ../pokecrystal/engine/gfx/pic_animation.asm:544 ConvertAndApplyBitmask +-- ../pokecrystal/engine/gfx/pic_animation.asm:356 PokeAnim_DoAnimScript + +local MonAnim = {} +MonAnim.__index = MonAnim + +-- .Sizes db 4, 5, 7: bitmask bytes for a 5x5, 6x6 and 7x7 pic. +-- ../pokecrystal/engine/gfx/pic_animation.asm:534 +MonAnim.BITMASK_BYTES = { [5] = 4, [6] = 5, [7] = 7 } + +-- ../pokecrystal/macros/scripts/pic_anims.asm:13-27 +MonAnim.END = 0xff +MonAnim.SETREPEAT = 0xfe +MonAnim.DOREPEAT = 0xfd + +-- .NextBit walks the row first, so bit i is row i % height, column i / height. +-- ../pokecrystal/engine/gfx/pic_animation.asm:746 +function MonAnim.tileMap(data, frame) + local tiles = data and data.tiles + if not tiles then return nil end + local count = tiles * tiles + local out = {} + for i = 1, count do out[i] = i - 1 end + if not frame or frame <= 0 then return out end + local row = data.frames and data.frames[frame] + local mask = row and data.bitmasks and data.bitmasks[row.bitmask] + if not (row and mask) then return nil end + local cursor = 1 + for i = 0, count - 1 do + local byte = mask[math.floor(i / 8) + 1] or 0 + if math.floor(byte / 2 ^ (i % 8)) % 2 == 1 then + local id = row.tiles[cursor] + if id == nil then return nil end + out[i + 1] = id + cursor = cursor + 1 + end + end + return out +end + +-- PokeAnim_GetDuration: a * (1 + [wPokeAnimSpeed] / 16), truncated to 8 bits. +-- ../pokecrystal/engine/gfx/pic_animation.asm:413 +function MonAnim.duration(param, speed) + param = param % 256 + local scaled = math.floor(param * (speed or 0) / 16) % 256 + return (scaled + param) % 256 +end + +-- The PokeAnims programs less their cry commands; "wait" is SetWait's 18. +-- ../pokecrystal/engine/gfx/pic_animation.asm:69-77, :150-164 +local SCENES = { + battle = { "setup", "play" }, + battleSlow = { "setup2", "play" }, + menu = { "setup", "play", "wait", "idle", "play" }, +} + +MonAnim.SCENE_WAIT = 18 + +function MonAnim.scenes() return SCENES end + +function MonAnim.new(data, scene) + local steps = SCENES[scene or "battle"] + if not (data and steps and data.play and #data.play > 0) then return nil end + return setmetatable({ + data = data, + steps = steps, + step = 1, + frame = 0, + speed = 0, + script = nil, + pc = 1, + repeatTimer = 0, + waiting = false, + waitCounter = 0, + sceneWait = nil, + done = false, + }, MonAnim) +end + +function MonAnim:finished() return self.done end + +-- PokeAnim_GetFrame's `and a / ret z`: command 0 is the base picture. +-- ../pokecrystal/engine/gfx/pic_animation.asm:431-435 +function MonAnim:currentFrame() return self.frame end + +function MonAnim:beginScript(rows, speed) + self.script = rows or {} + self.speed = speed + self.pc = 1 + self.repeatTimer = 0 + self.waiting = false + self.waitCounter = 0 +end + +-- One tick of PokeAnim_DoAnimScript; true once the script has hit endanim. +-- ../pokecrystal/engine/gfx/pic_animation.asm:370-411 +function MonAnim:runScript() + if self.waiting then + self.waitCounter = (self.waitCounter - 1) % 256 + if self.waitCounter == 0 then self.waiting = false end + return false + end + for _ = 1, 256 do + local row = self.script[self.pc] + self.pc = self.pc + 1 + if row == nil then return true end + local command = row[1] + if command == MonAnim.END then + return true + elseif command == MonAnim.SETREPEAT then + self.repeatTimer = row[2] + elseif command == MonAnim.DOREPEAT then + -- .DoRepeat returns on both `ret z` (:397-406). + if self.repeatTimer == 0 then return false end + self.repeatTimer = self.repeatTimer - 1 + if self.repeatTimer == 0 then return false end + self.pc = row[2] + 1 + else + self.frame = command + self.waiting = true + self.waitCounter = MonAnim.duration(row[2], self.speed) + -- StartWaitAnim falls through into .WaitAnim (:383-388), so the frame + -- it places is the frame the counter first ticks on. + self.waitCounter = (self.waitCounter - 1) % 256 + if self.waitCounter == 0 then self.waiting = false end + return false + end + end + return true +end + +-- One iteration of AnimateFrontpic's .loop: one scene command per frame. +-- ../pokecrystal/engine/gfx/pic_animation.asm:79-89 +function MonAnim:update() + if self.done then return end + local step = self.steps[self.step] + if step == nil then + -- PokeAnim_Finish's DeinitFrames puts the base picture back (:224-228). + self.frame = 0 + self.done = true + return + end + if step == "setup" or step == "setup2" or step == "idle" then + local rows = (step == "idle") and self.data.idle or self.data.play + self:beginScript(rows, step == "setup2" and 4 or 0) + self.step = self.step + 1 + return + end + if step == "wait" then + self.sceneWait = (self.sceneWait or MonAnim.SCENE_WAIT) - 1 + if self.sceneWait <= 0 then + self.sceneWait = nil + self.step = self.step + 1 + end + return + end + if self:runScript() then + -- PokeAnim_Play redraws the base picture as the script ends (:196-205). + self.frame = 0 + self.step = self.step + 1 + end +end + +return MonAnim diff --git a/src/save_convert/SaveConvert.lua b/src/save_convert/SaveConvert.lua index e022faba..8181e048 100644 --- a/src/save_convert/SaveConvert.lua +++ b/src/save_convert/SaveConvert.lua @@ -21,6 +21,7 @@ -- require alone cannot see them there (#420). local GenSave = require("src.save_convert.GenSave") +local GameVersion = require("src.core.GameVersion") local SaveConvert = {} @@ -228,10 +229,11 @@ SaveConvert.mergeDefaults = mergeDefaults -- codec exists yet. Both directions answer with a plain message the -- launcher's save card renders as-is, instead of pushing a Gen 2 save -- table through Gen 1 offsets and surfacing a codec traceback. -local GEN2_SAV_UNSUPPORTED = { - gold = "Pokemon Gold", - silver = "Pokemon Silver", -} +local function gen2CartName(gameVersion) + if not GameVersion.VERSIONS[gameVersion] then return nil end + if GameVersion.generation(gameVersion) ~= 2 then return nil end + return GameVersion.info(gameVersion).displayName +end -- importSav(bytes, version, gameVersion) -> saveTable, err -- bytes: the raw 32768-byte SRAM string. Validates size and the main-data @@ -245,7 +247,7 @@ function SaveConvert.importSav(bytes, version, gameVersion) if type(bytes) ~= "string" then return nil, "expected raw save bytes as a string" end - local gen2Name = GEN2_SAV_UNSUPPORTED[gameVersion] + local gen2Name = gen2CartName(gameVersion) if gen2Name then return nil, gen2Name .. " uses a Gen 2 cart save; importing one is not supported yet." end @@ -281,7 +283,7 @@ function SaveConvert.exportSav(saveTable, gameVersion) if type(saveTable) ~= "table" then return nil, "expected a save table" end - local gen2Name = GEN2_SAV_UNSUPPORTED[gameVersion] + local gen2Name = gen2CartName(gameVersion) if gen2Name then return nil, gen2Name .. " uses a Gen 2 cart save; exporting one is not supported yet." end diff --git a/src/script/gen2/Opcodes.lua b/src/script/gen2/Opcodes.lua index 80c34eb2..0972ecc3 100644 --- a/src/script/gen2/Opcodes.lua +++ b/src/script/gen2/Opcodes.lua @@ -173,6 +173,113 @@ local Opcodes = { [0xa1] = { name = "warpfacing", size = 5 }, } +-- pokegold/macros/scripts/events.asm:1015 DEF NUM_EVENT_COMMANDS EQU $a2 +Opcodes.NUM_EVENT_COMMANDS = 0xa2 + +-- pokecrystal/macros/scripts/events.asm:1-539 is identical to pokegold's, so +-- $00..$51 is copied; :541 inserts farjumptext and shifts everything after it. +local CRYSTAL = {} +for byte = 0x00, 0x51 do + local row = Opcodes[byte] + CRYSTAL[byte] = { name = row.name, size = row.size } +end + +-- pokecrystal/macros/scripts/events.asm:541-1066, cross-checked against +-- ScriptCommandTable at pokecrystal/engine/overworld/scripting.asm:64-237. +CRYSTAL[0x52] = { name = "farjumptext", size = 3 } +CRYSTAL[0x53] = { name = "jumptext", size = 2 } +CRYSTAL[0x54] = { name = "waitbutton", size = 0 } +CRYSTAL[0x55] = { name = "promptbutton", size = 0 } +CRYSTAL[0x56] = { name = "pokepic", size = 1 } +CRYSTAL[0x57] = { name = "closepokepic", size = 0 } +CRYSTAL[0x58] = { name = "_2dmenu", size = 0 } +CRYSTAL[0x59] = { name = "verticalmenu", size = 0 } +CRYSTAL[0x5a] = { name = "loadpikachudata", size = 0 } +CRYSTAL[0x5b] = { name = "randomwildmon", size = 0 } +CRYSTAL[0x5c] = { name = "loadtemptrainer", size = 0 } +CRYSTAL[0x5d] = { name = "loadwildmon", size = 2 } +CRYSTAL[0x5e] = { name = "loadtrainer", size = 2 } +CRYSTAL[0x5f] = { name = "startbattle", size = 0 } +CRYSTAL[0x60] = { name = "reloadmapafterbattle", size = 0 } +CRYSTAL[0x61] = { name = "catchtutorial", size = 1 } +CRYSTAL[0x62] = { name = "trainertext", size = 1 } +CRYSTAL[0x63] = { name = "trainerflagaction", size = 1 } +CRYSTAL[0x64] = { name = "winlosstext", size = 4 } +CRYSTAL[0x65] = { name = "scripttalkafter", size = 0 } +CRYSTAL[0x66] = { name = "endifjustbattled", size = 0 } +CRYSTAL[0x67] = { name = "checkjustbattled", size = 0 } +CRYSTAL[0x68] = { name = "setlasttalked", size = 1 } +CRYSTAL[0x69] = { name = "applymovement", size = 3 } +CRYSTAL[0x6a] = { name = "applymovementlasttalked", size = 2 } +CRYSTAL[0x6b] = { name = "faceplayer", size = 0 } +CRYSTAL[0x6c] = { name = "faceobject", size = 2 } +CRYSTAL[0x6d] = { name = "variablesprite", size = 2 } +CRYSTAL[0x6e] = { name = "disappear", size = 1 } +CRYSTAL[0x6f] = { name = "appear", size = 1 } +CRYSTAL[0x70] = { name = "follow", size = 2 } +CRYSTAL[0x71] = { name = "stopfollow", size = 0 } +CRYSTAL[0x72] = { name = "moveobject", size = 3 } +CRYSTAL[0x73] = { name = "writeobjectxy", size = 1 } +CRYSTAL[0x74] = { name = "loademote", size = 1 } +CRYSTAL[0x75] = { name = "showemote", size = 3 } +CRYSTAL[0x76] = { name = "turnobject", size = 2 } +CRYSTAL[0x77] = { name = "follownotexact", size = 2 } +CRYSTAL[0x78] = { name = "earthquake", size = 1 } +CRYSTAL[0x79] = { name = "changemapblocks", size = 3 } +CRYSTAL[0x7a] = { name = "changeblock", size = 3 } +CRYSTAL[0x7b] = { name = "reloadmap", size = 0 } +CRYSTAL[0x7c] = { name = "refreshmap", size = 0 } +CRYSTAL[0x7d] = { name = "writecmdqueue", size = 2 } +CRYSTAL[0x7e] = { name = "delcmdqueue", size = 1 } +CRYSTAL[0x7f] = { name = "playmusic", size = 2 } +CRYSTAL[0x80] = { name = "encountermusic", size = 0 } +CRYSTAL[0x81] = { name = "musicfadeout", size = 3 } +CRYSTAL[0x82] = { name = "playmapmusic", size = 0 } +CRYSTAL[0x83] = { name = "dontrestartmapmusic", size = 0 } +CRYSTAL[0x84] = { name = "cry", size = 2 } +CRYSTAL[0x85] = { name = "playsound", size = 2 } +CRYSTAL[0x86] = { name = "waitsfx", size = 0 } +CRYSTAL[0x87] = { name = "warpsound", size = 0 } +CRYSTAL[0x88] = { name = "specialsound", size = 0 } +CRYSTAL[0x89] = { name = "autoinput", size = 3 } +CRYSTAL[0x8a] = { name = "newloadmap", size = 1 } +CRYSTAL[0x8b] = { name = "pause", size = 1 } +CRYSTAL[0x8c] = { name = "deactivatefacing", size = 1 } +CRYSTAL[0x8d] = { name = "sdefer", size = 2 } +CRYSTAL[0x8e] = { name = "warpcheck", size = 0 } +CRYSTAL[0x8f] = { name = "stopandsjump", size = 2 } +CRYSTAL[0x90] = { name = "endcallback", size = 0 } +CRYSTAL[0x91] = { name = "end", size = 0 } +CRYSTAL[0x92] = { name = "reloadend", size = 1 } +CRYSTAL[0x93] = { name = "endall", size = 0 } +CRYSTAL[0x94] = { name = "pokemart", size = 3 } +CRYSTAL[0x95] = { name = "elevator", size = 2 } +CRYSTAL[0x96] = { name = "trade", size = 1 } +CRYSTAL[0x97] = { name = "askforphonenumber", size = 1 } +CRYSTAL[0x98] = { name = "phonecall", size = 2 } +CRYSTAL[0x99] = { name = "hangup", size = 0 } +CRYSTAL[0x9a] = { name = "describedecoration", size = 1 } +CRYSTAL[0x9b] = { name = "fruittree", size = 1 } +CRYSTAL[0x9c] = { name = "specialphonecall", size = 2 } +CRYSTAL[0x9d] = { name = "checkphonecall", size = 0 } +CRYSTAL[0x9e] = { name = "verbosegiveitem", size = 2 } +CRYSTAL[0x9f] = { name = "verbosegiveitemvar", size = 2 } +-- events.asm:1003-1008: Crystal's swarm is `db flag` then `map_id`, not a bare +-- map_id; Script_swarm makes three GetScriptByte calls (scripting.asm:654-662). +CRYSTAL[0xa0] = { name = "swarm", size = 3 } +CRYSTAL[0xa1] = { name = "halloffame", size = 0 } +CRYSTAL[0xa2] = { name = "credits", size = 0 } +CRYSTAL[0xa3] = { name = "warpfacing", size = 5 } +CRYSTAL[0xa4] = { name = "battletowertext", size = 1 } +CRYSTAL[0xa5] = { name = "getlandmarkname", size = 2 } +CRYSTAL[0xa6] = { name = "gettrainerclassname", size = 2 } +CRYSTAL[0xa7] = { name = "getname", size = 3 } +CRYSTAL[0xa8] = { name = "wait", size = 1 } +CRYSTAL[0xa9] = { name = "checksave", size = 0 } + +-- pokecrystal/macros/scripts/events.asm:1068 DEF NUM_EVENT_COMMANDS EQU $aa +CRYSTAL.NUM_EVENT_COMMANDS = 0xaa + -- Commands that end the current linear path (jumps transfer control). -- -- `fruittree` and `describedecoration` are ScriptJumps (Script_fruittree does @@ -185,9 +292,13 @@ local Opcodes = { -- these four regardless. `catchtutorial` is deliberately NOT here: it ends on -- `jp Script_reloadmap` and the script really does continue afterwards, the -- same way `reloadmap` itself does. +-- +-- `farjumptext` is Crystal-only and joins them for the same reason `jumptext` +-- is here: pokecrystal/engine/overworld/scripting.asm:318-327 ends on +-- `jp ScriptJump` into JumpTextScript. Opcodes.TERMINATORS = { sjump = true, farsjump = true, memjump = true, jumpstd = true, - jumptext = true, jumptextfaceplayer = true, + jumptext = true, farjumptext = true, jumptextfaceplayer = true, stopandsjump = true, ["end"] = true, endall = true, endcallback = true, reloadend = true, fruittree = true, describedecoration = true, @@ -198,10 +309,12 @@ Opcodes.TERMINATORS = { -- behind it. Every row above is keyed by the opcode byte the cart carries, and -- src/import/RomExtractorGen2.lua resolves a command as Opcodes[byte]: a byte -- that is not in that table breaks the pointer walk into an `unknown` row. Give --- a mod verb one of the free bytes ($a2..$ff) and ROM data that happens to start --- with it would decode as a mod call instead of ending the walk, so the free --- space stays free and the extension op is reachable only by NAME -- which is to --- say, only from a row a mod wrote, never from one the extractor did. +-- a mod verb one of the free bytes and ROM data that happens to start with it +-- would decode as a mod call instead of ending the walk, so the free space stays +-- free and the extension op is reachable only by NAME -- which is to say, only +-- from a row a mod wrote, never from one the extractor did. The free space is +-- per dialect and the intersection is what matters: Gold leaves $a2..$ff +-- (events.asm:1015), Crystal only $aa..$ff (events.asm:1068). -- -- src/script/gen2/Vm.lua:runModCommand is the only reader; the contract for the -- row shapes and the verb table is documented there. @@ -211,4 +324,15 @@ function Opcodes.key(bank, address) return string.format("%02x:%04x", bank, address) end +CRYSTAL.TERMINATORS = Opcodes.TERMINATORS +CRYSTAL.MOD_COMMAND = Opcodes.MOD_COMMAND +CRYSTAL.key = Opcodes.key + +-- Gold and Silver share one dialect (pokegold/macros/scripts/events.asm:540); +-- Crystal renumbers from $52 (pokecrystal/macros/scripts/events.asm:541). +function Opcodes.forEdition(edition) + if edition == "crystal" then return CRYSTAL end + return Opcodes +end + return Opcodes diff --git a/src/script/gen2/Specials.lua b/src/script/gen2/Specials.lua index 6a29da98..b45b4065 100644 --- a/src/script/gen2/Specials.lua +++ b/src/script/gen2/Specials.lua @@ -1,7 +1,7 @@ -- The `special` command's handlers (data/events/special_pointers.asm). -- -- Lifted out of src/script/gen2/Vm.lua because the two are different kinds of --- code: the VM is one interpreter with a shared control flow, and this is 112 +-- code: the VM is one interpreter with a shared control flow, and this is 169 -- INDEPENDENT routines that happen to share a dispatch table. Growing them -- inside runList's else-chain would have buried the interpreter. -- @@ -9,9 +9,9 @@ -- which the extractor turns into constants.specialOrder, and Vm:specialName -- resolves the one into the other; keying on the label rather than on the -- number means a repointed table cannot silently call the wrong routine, and --- it means a test can assert the mapping against the cache. This cache's --- order has 112 rows -- the asm file's 113 `add_special` matches include the --- MACRO line itself. +-- it means a test can assert the mapping against the cache. A Gold cache's +-- order has 112 rows and a Crystal one 169 -- the asm files' `add_special` +-- match counts are one higher each, because they include the MACRO line. -- -- Three kinds of entry live here: -- @@ -52,6 +52,7 @@ -- it, plus the fruit trees and the daily rollover Kurt waits on. local Apricorns = require("src.core.gen2.Apricorns") local BugContest = require("src.core.gen2.BugContest") +local GameVersion = require("src.core.GameVersion") local Happiness = require("src.core.gen2.Happiness") local Phone = require("src.core.gen2.Phone") local Pokerus = require("src.core.gen2.Pokerus") @@ -175,6 +176,20 @@ local function selectMon(vm, prompt) return picked.index, picked.mon end +Specials.shared = { + TRUE = TRUE, + FALSE = FALSE, + block = Specials.block, + hooks = hooks, + party = party, + save = save, + data = data, + answer = answer, + nameMon = nameMon, + selectMon = selectMon, + showRawHeld = showRawHeld, +} + -------------------------------------------------------------------------- -- Magikarp lengths (engine/events/magikarp.asm) -------------------------------------------------------------------------- @@ -1058,7 +1073,7 @@ end -- -- is drawn on the cartridge itself, and only the A press farcalls -- PrintUnownStamp. src/ui/gen2/UnownPrinter.lua is that viewer and takes the -- A press nowhere, which is what a cartridge with nothing in its link port --- does; PrintDiploma next door has no viewer half at all and stays a stub. +-- does; PrintDiploma next door shows its page and prints nothing either. -- -- `ld a, [wUnownDex] / and a / ret z` is the gate: with no Unown caught the -- special returns before it draws anything. The routine never writes @@ -1117,6 +1132,10 @@ H.FadeOutToBlack = function(vm) fade(vm, "outBlack") end H.FadeInFromWhite = function(vm) fade(vm, "inWhite") end H.FadeInFromBlack = function(vm) fade(vm, "inBlack") end +-- engine/tilesets/timeofday_pals.asm:130: FillWhiteBGColor, then the same +-- c=$9 / b=4 time-pal walk FadeInFromWhite runs, stepped by hand. +H.BattleTowerFade = function(vm) fade(vm, "inWhite") end + -- ClearBGPalettes / ClearBGPalettesBufferScreen / ClearTilemap: the screen is -- blanked to the background colour under a fade that is already down. The -- port fades with a flat sheet, so the sheet IS the cleared screen. @@ -1152,6 +1171,20 @@ H.LoadUsedSpritesGFX = function(vm) if h.reloadSprites then h.reloadSprites(false) end end +-- ../pokecrystal/engine/overworld/warp_connection.asm:311, `ld b, SCGB_MAPPALS / jp +-- GetSGBLayout`: the map's own palette layout, reapplied and nothing else. +H.LoadMapPalettes = function(vm) + local h = hooks(vm) + if h.reloadSprites then h.reloadSprites(true) end +end + +-- engine/overworld/overworld.asm:40: the used-sprite list rebuilt and its +-- VRAM pack reloaded, with no palette pass -- LoadUsedSpritesGFX's arm. +H.RefreshSprites = function(vm) + local h = hooks(vm) + if h.reloadSprites then h.reloadSprites(false) end +end + -- UpdatePlayerSprite: the player's sheet is a pure function of wPlayerState -- (data/sprites/player_sprites.asm ChrisStateSprites), which is what makes -- getting on and off a Lapras a one-byte change rather than an animation. @@ -1160,6 +1193,16 @@ H.UpdatePlayerSprite = function(vm) if h.updatePlayerSprite then h.updatePlayerSprite() end end +-- engine/events/specials.asm:21 -> engine/overworld/map_objects.asm:2515: +-- bit 7 of wScriptVar gates the routine, bits 6-4 are the OBJ palette. +H.SetPlayerPalette = function(vm) + local value = (vm.scriptVar or 0) % 0x100 + if value < 0x80 then return end + vm.playerPalette = math.floor(value / 0x10) % 8 + local h = hooks(vm) + if h.setPlayerPalette then h.setPlayerPalette(vm.playerPalette) end +end + -- ---- 58-62 sound and the water -------------------------------------------- -- WaitSFX: hold until the sound effect that is playing finishes. The VM has @@ -1445,6 +1488,22 @@ local function trailingDigitsShared(a, b) end Specials.trailingDigitsShared = trailingDigitsShared +-- pokegold/constants/pokemon_data_constants.asm:122-123 +local NUM_BOXES, NUM_BOXES_JP = 14, 9 + +-- pokegold/engine/events/lucky_number.asm:22-102: sBox (the OPEN box) is walked +-- before .BoxesLoop skips it, and .BoxesLoop stops at NUM_BOXES_JP not NUM_BOXES. +local function luckyNumberBoxOrder(record) + local current = math.floor(tonumber(record and record.currentBox) or 1) + local last = GameVersion.fixes().luckyNumberBoxes and NUM_BOXES or NUM_BOXES_JP + local order = { current } + for index = 1, last do + if index ~= current then order[#order + 1] = index end + end + return order +end +Specials.luckyNumberBoxOrder = luckyNumberBoxOrder + local function luckyPrizeFor(shared) if shared >= 5 then return 1 end if shared >= 3 then return 2 end @@ -1508,8 +1567,9 @@ H.CheckForLuckyNumberWinners = function(vm) end end for _, mon in ipairs(party(vm)) do consider(mon, false) end - for _, box in pairs((record and record.boxes) or {}) do - for _, mon in ipairs(box or {}) do consider(mon, true) end + local boxes = (record and record.boxes) or {} + for _, index in ipairs(luckyNumberBoxOrder(record)) do + for _, mon in ipairs(boxes[index] or {}) do consider(mon, true) end end answer(vm, best) if bestMon then @@ -1586,9 +1646,17 @@ local KURT_MENU_FLAGS = 0x80 + 0x20 -- CANCEL. Both refusals -- FindApricornsInBag's `scf` for a pack with no -- apricorn in it at all, and the `jr c, .nope` for pressing B -- answer -- `xor a`, which is the FALSE `.Cancel` waits on. +-- +-- ../pokecrystal/engine/events/kurt.asm:19-45 is the same routine with a +-- quantity menu bolted on, and its `xor a / ld [wKurtApricornQuantity], a` +-- (:24) and `ld a, [wItemQuantityChange] / ld [...], a` (:45) are what +-- ../pokecrystal/maps/KurtsHouse.asm:197's `verbosegiveitemvar LEVEL_BALL, +-- VAR_KURT_APRICORNS` counts out. Kurt_SelectQuantity is not ported, so the +-- count written here is the one apricorn Apricorns.takeApricorn tosses. H.SelectApricornForKurt = function(vm) local h = hooks(vm) local record = save(vm) + if h.setKurtApricornQuantity then h.setKurtApricornQuantity(0) end local list = Apricorns.bagList(record and record.inventory) if list.empty then return answer(vm, FALSE) end @@ -1612,7 +1680,10 @@ H.SelectApricornForKurt = function(vm) local item = h.itemIndex and h.itemIndex(apricorn) if not item or item == 0 then return answer(vm, FALSE) end answer(vm, item) - Apricorns.takeApricorn(record, apricorn) + if Apricorns.takeApricorn(record, apricorn) + and h.setKurtApricornQuantity then + h.setKurtApricornQuantity(1) + end end -- ---- 88-89 the first party slot ------------------------------------------- @@ -1917,7 +1988,7 @@ local OAK_RATINGS = { -- Celadon Mansion 3F reads VAR_DEXCAUGHT for itself and is what runs -- `special Diploma` (H.Diploma below, src/ui/gen2/Diploma.lua) and -- then sets EVENT_ENABLE_DIPLOMA_PRINTING for the Graphic Artist's - -- `special PrintDiploma` (also stubbed: "printer: no Game Boy Printer"). + -- `special PrintDiploma` (H.PrintDiploma, specials/crystal_extras.lua). -- A finished #DEX here just means every rating after this one is this -- same line. { max = 255, sfx = "Sfx_DexFanfare230Plus", text = Strings.source( @@ -2027,7 +2098,7 @@ Specials.ROAMERS = Roamers.SPECIES H.InitRoamMons = function(vm) local record = save(vm) if not record then return end - Roamers.init(record, { force = true }) + Roamers.init(record, { force = true, data = data(vm) }) end -- ---- the #DEX-completion diploma ------------------------------------------- @@ -2328,7 +2399,7 @@ end -- layout, PrintPartyMonPage1) and then SendScreenToPrinter walks it out the -- serial port to a physical Game Boy Printer. There is no peripheral for it -- to reach here -- the same reason H.UnownPrinter's A press goes nowhere and --- PrintDiploma stays stubbed below -- so `ldh a, [hPrinter] / and a / jr nz, +-- PrintDiploma's own print goes nowhere -- so `ldh a, [hPrinter] / and a / jr nz, -- .cancel` is -- hardwired to the nz arm below: the portrait shows, then the print always -- comes back as though the printer errored, which is the honest answer for @@ -2370,11 +2441,137 @@ H.PhotoStudio = function(vm) vm:showRaw(Strings(PHOTO_STUDIO_TEXT.noPhoto)) end +-- ---- 21 the quick save ----------------------------------------------------- +-- +-- TryQuickSave (engine/link/link.asm:2356) is filed with the cable club but is +-- not a link routine: it is `farcall Link_SaveGame`, TRUE on carry clear and +-- FALSE on carry, then `ld c, 30 / call DelayFrames`. Link_SaveGame +-- (engine/menus/save.asm:63) is AskOverwriteSaveFile (:169) plus the ordinary +-- write, so the FALSE arm is a refusal at the overwrite prompt -- which is +-- what ../pokecrystal/maps/BattleTower1F.asm:84-85 backs a challenge out on, +-- and what the four PokeCenter2F cable rows share. +-- +-- Two differences from the cart, neither observable in the answer. +-- AskOverwriteSaveFile's mismatched-ID arm runs ErasePreviousSave (:333) before +-- saving; Save.save replaces the whole file anyway. And SFX_SAVE rings at the +-- write here, where src/ui/gen2/SaveMenu.lua:107 already puts it, rather than +-- after the saved page has typed. + +-- data/text/common_2.asm:1279-1299. +local SAVE_TEXT = { + already = Strings.source( + "There is already a\nsave file. Is it\vOK to overwrite?"), + another = Strings.source( + "There is another\nsave file. Is it\vOK to overwrite?"), + saving = Strings.source("SAVING… DON'T TURN\nOFF THE POWER."), + saved = Strings.source("%s saved\nthe game."), +} + +-- engine/menus/save.asm:247 the 16 frames under SAVING and :251 the 32 the +-- write is followed by; :269 the 30 after the saved page, and link.asm:2367 the +-- 30 TryQuickSave adds on top. Both pages are `hold`s rather than `wait`s +-- because the world does not tick while a box owns the stack (Vm:showRaw). +local SAVING_HOLD = 16 + 32 +local SAVED_HOLD = 30 + 30 + +H.TryQuickSave = function(vm) + local h = hooks(vm) + -- `ld a, [wSaveFileExists] / and a / jr z, .erase`, then + -- CompareLoadedAndSavedPlayerID (:212) picking which question is asked. + local exists, sameId = false, false + if h.saveFileState then exists, sameId = h.saveFileState() end + if exists then + showRawHeld(vm, Strings(sameId and SAVE_TEXT.already or SAVE_TEXT.another)) + if not coroutine.yield({ kind = "yesorno" }) then + return answer(vm, FALSE) + end + end + vm:showRaw(Strings(SAVE_TEXT.saving), true, SAVING_HOLD) + -- _SaveGameData (:273). A veto from the save.write mod hook is the one way + -- this port can refuse a write the cart always completes, and a refusal is + -- the same FALSE the overwrite prompt's NO gives. + if not (h.writeSave and h.writeSave() ~= false) then + return answer(vm, FALSE) + end + if h.playSfxNamed then h.playSfxNamed("Sfx_Save") end + local record = save(vm) + local name = (record and record.player and record.player.name) or "" + vm:showRaw(Strings(SAVE_TEXT.saved, name), true, SAVED_HOLD) + answer(vm, TRUE) +end + -- ---- 111 the dummy -------------------------------------------------------- -- UnusedDummySpecial is a bare `ret`. Listed so the name resolves to a -- handler rather than to the unimplemented ledger. H.UnusedDummySpecial = function() end +-- ---- 109-165 the Crystal rows --------------------------------------------- +-- data/events/special_pointers.asm:124-181, the rows only Crystal has. + +-- ../pokecrystal/engine/pokemon/search_owned.asm:48 CheckOwnMonAnywhere: party then boxes, +-- matching species, OT id and OT name; `ld a, [wPartyCount] / and a / ret z`. +local function ownsMonAnywhere(vm, wanted) + local h = hooks(vm) + local list = party(vm) + if #list == 0 then return false end + local record = save(vm) + local player = record and record.player + local function owns(mon) + if not mon then return false end + if not (h.monIndex and h.monIndex(mon.species) == wanted) then return false end + if player and player.id and mon.otId and mon.otId ~= player.id then + return false + end + if player and player.name and mon.ot and mon.ot ~= player.name then + return false + end + return true + end + for _, mon in ipairs(list) do + if owns(mon) then return true end + end + for _, box in pairs((record and record.boxes) or {}) do + for _, mon in ipairs(box or {}) do + if owns(mon) then return true end + end + end + return false +end + +-- ../pokecrystal/engine/pokemon/search_owned.asm:31 +H.MonCheck = function(vm) + answer(vm, ownsMonAnywhere(vm, vm.scriptVar) and TRUE or FALSE) +end + +-- home/init.asm:1 falls into Init (home/init.asm:35) and on to the copyright +-- splash, which is Game2:softReset rather than Game2:returnToTitle. +H.Reset = function(vm) + local h = hooks(vm) + if h.softReset then h.softReset() end +end + +-- ../pokecrystal/mobile/mobile_41.asm:320 is a bare `ret` with its SRAM counter left behind +-- it as dead code, so a no-op is the whole routine. +H.StubbedTrainerRankings_Healings = function() end + +-- ../pokecrystal/mobile/mobile_41.asm:792: the international ROM answers 0 outright, which +-- is what sends every Pokecenter 2F mobile branch down its cable arm. +H.CheckMobileAdapterStatusSpecial = function(vm) + answer(vm, FALSE) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:187 and :1580, both bare `ret`. +H.UnusedBattleTowerDummySpecial1 = function() end +H.UnusedBattleTowerDummySpecial2 = function() end + +-- ../pokecrystal/engine/overworld/time.asm:136 SampleKenjiBreakCountdown: +-- `call Random / and %11 / add 3`, three to six days into wKenjiBreakTimer, +-- which ../pokecrystal/maps/Route45.asm:50 reads back through VAR_KENJI_BREAK. +H.SampleKenjiBreakCountdown = function(vm) + local h = hooks(vm) + if h.setKenjiBreak then h.setKenjiBreak(Specials.random(4) - 1 + 3) end +end + -------------------------------------------------------------------------- -- The deliberate stubs -------------------------------------------------------------------------- @@ -2394,7 +2591,6 @@ local STUB_ROWS = { { "SetBitsForLinkTradeRequest", nil, "link cable: no Gen 2 cable club" }, { "WaitForLinkedFriend", 0, "link cable: nobody ever connects" }, { "CheckLinkTimeout_Receptionist", 1, "link cable: always times out" }, - { "TryQuickSave", 0, "link cable: the cable club's own save is not ported" }, { "CheckBothSelectedSameRoom", 0, "link cable: no second player" }, { "FailedLinkToPast", 1, "link cable: the Time Capsule is not ported" }, { "CloseLink", nil, "link cable: nothing to close" }, @@ -2415,45 +2611,149 @@ local STUB_ROWS = { { "CheckMysteryGift", 0, "Mystery Gift: no infrared, so no gift is waiting" }, { "GetMysteryGiftItem", 0, "Mystery Gift: nothing to hand over" }, { "UnlockMysteryGift", nil, "Mystery Gift: nothing to unlock" }, - -- The Game Boy Printer. A second peripheral again, and two of the three - -- specials that want it are not in this table: PhotoStudio ports the - -- conversation and the portrait screen (H.PhotoStudio above) and - -- UnownPrinter ports the stamp viewer (H.UnownPrinter above), with only the - -- print itself stubbed inside each. PrintDiploma is the one that is - -- nothing BUT the print -- the diploma's own page is `special Diploma`, a - -- separate row -- so it is all that is left here. + -- The Game Boy Printer. A second peripheral again, and none of the three + -- specials that want it is stubbed any more: PhotoStudio ports the + -- conversation and the portrait screen (H.PhotoStudio above), UnownPrinter + -- ports the stamp viewer (H.UnownPrinter above) and PrintDiploma opens + -- PlaceDiplomaOnScreen (specials/crystal_extras.lua), with only the print + -- itself going nowhere inside each. The row below is superseded by that + -- handler and survives only as the reason. { "PrintDiploma", nil, "printer: no Game Boy Printer" }, - -- Screens the port has not built. Each names what it needs; the value is - -- the arm a cancel takes, so the script backs out rather than proceeding - -- through a transaction that never happened. + -- OverworldTownMap's row is superseded by H.OverworldTownMap + -- (specials/crystal_extras.lua) and survives only as the reason. + -- ../pokecrystal/data/events/special_pointers.asm:58 and pokegold's :63 both + -- carry `add_special UnusedMemoryGame ; unused`, and no script names it. { "OverworldTownMap", nil, "needs the POKeGEAR map card in view mode" }, - { "UnusedMemoryGame", nil, "unused in Gold; needs the memory game screen" }, + { "UnusedMemoryGame", nil, "unused on both carts; no script reaches _MemoryGame" }, + -- data/events/special_pointers.asm:124-181, the rows only Crystal has. + { "BattleTowerRoomMenu", 10, "Battle Tower: $a is the menu's back-out arm" }, + { "BattleTowerBattle", nil, "Battle Tower: no tower battle to run" }, + { "BattleTowerAction", 0, "Battle Tower: 0 is sGSBallFlag clear" }, + { "CheckForBattleTowerRules", 0, "Battle Tower: no challenge in progress" }, + { "Menu_ChallengeExplanationCancel", 0, "Battle Tower: 0 ends the talk" }, + { "LoadOpponentTrainerAndPokemonWithOTSprite", 0, "Battle Tower: no roster" }, + { "BattleTowerMobileError", nil, "Battle Tower: no mobile error to report" }, + { "Function1700ba", nil, "Battle Tower: mobile challenge setup" }, + { "Function170114", nil, "Battle Tower: mobile challenge setup" }, + { "Function1704e1", nil, "Battle Tower: mobile challenge setup" }, + { "AskMobileOrCable", 0, "Mobile System GB: 0 is a B press off the menu" }, + { "Mobile_SelectThreeMons", 0, "Mobile System GB: no three mons picked" }, + { "Function1011f1", nil, "Mobile System GB: enters LINK_MOBILE" }, + { "Function101220", nil, "Mobile System GB: leaves LINK_MOBILE" }, + { "Function101225", 0, "Mobile System GB: mobile trade room teardown" }, + { "Function101231", 0, "Mobile System GB: mobile battle room teardown" }, + { "Function102142", nil, "Mobile System GB: mobile news feed" }, + { "Function103780", 0, "Mobile System GB: the mobile save never happens" }, + { "Function1037c2", 0, "Mobile System GB: no rematch on same settings" }, + { "Function1037eb", 0, "Mobile System GB: no battle time is left" }, + { "Function10383c", 0, "Mobile System GB: the three-mon pick cancels" }, + { "Function10387b", nil, "Mobile System GB: adapter status readback" }, + { "TradeCornerHoldMon", nil, "Mobile System GB: no mobile trade corner" }, + { "Function11ac3e", nil, "Mobile System GB: trade corner submenu" }, + { "Function11b5e8", nil, "Mobile System GB: trade corner submenu" }, + { "Function11b7e5", nil, "Mobile System GB: trade corner submenu" }, + { "Function11b879", 0, "Mobile System GB: trade corner submenu" }, + { "Function11b920", nil, "Mobile System GB: trade corner submenu" }, + { "Function11b93b", nil, "Mobile System GB: trade corner submenu" }, + { "Function11ba38", 0, "Mobile System GB: trade corner submenu" }, + { "Function17d2b6", nil, "Mobile System GB: mobile menu chrome" }, + { "Function17d2ce", 0, "Mobile System GB: mobile menu chrome" }, + { "Function11c1ab", nil, "Mobile System GB: the fixed-word entry screen" }, + { "UnusedFindItemInPCOrBag", 0, "Mobile System GB: unreferenced" }, + { "GiveOddEgg", nil, "the Odd Egg roster is not ported; Route 34 is later" }, + { "DisplayUnownWords", nil, "needs the Unown wall word box" }, + { "HoOhChamber", nil, "the Ruins of Alph secret chambers are not ported" }, + { "OmanyteChamber", nil, "the Ruins of Alph secret chambers are not ported" }, + { "PokeSeer", nil, "needs the Seer's caught-data page" }, + { "BeastsCheck", 0, "the three beasts cannot all be owned this early" }, + { "BuenasPassword", 0, "Buena's show is not ported; 0 is a wrong guess" }, + { "BuenaPrize", nil, "Buena's prize counter is not ported" }, + { "AskRememberPassword", 0, "Buena's show is not ported; 0 declines" }, + { "CelebiShrineEvent", nil, "the GS Ball event needs the mobile stadium" }, + { "CheckCaughtCelebi", 0, "the GS Ball event never runs, so Celebi is free" }, + { "GiveDratini", nil, "the Dragon Shrine moveset swap is past Phase 1" }, + { "MoveTutor", 255, "the tutor is past Phase 1; -1 is its cancel arm" }, } Specials.HANDLERS = H + +-- data/events/special_pointers.asm:124-181, the "; Crystal only" block: one +-- module per owner under src/script/gen2/specials/, merged into HANDLERS here. +Specials.MODULES = { + "crystal_story", + "battle_tower", + "crystal_extras", + "unown_words", +} + +Specials.HANDLER_SOURCE = {} +for name in pairs(H) do Specials.HANDLER_SOURCE[name] = "Specials.lua" end + Specials.STUBS = {} Specials.STUB_REASONS = {} - -for _, row in ipairs(STUB_ROWS) do - local name, value, reason = row[1], row[2], row[3] - Specials.STUB_REASONS[name] = reason - Specials.STUBS[name] = function(vm) - if value ~= nil then vm.scriptVar = value end - end -end +Specials.SUPERSEDED_STUBS = {} -- The dispatch table Vm.SPECIALS is. Built rather than written out so the two -- sets cannot drift, and so a name that ends up in both is a hard error here -- rather than a silent shadow at runtime. Specials.ALL = {} -for name, fn in pairs(Specials.HANDLERS) do - Specials.ALL[name] = fn -end -for name, fn in pairs(Specials.STUBS) do - if Specials.ALL[name] then - error("gen2 special '" .. name .. "' is both implemented and stubbed", 0) - end - Specials.ALL[name] = fn + +local function clear(t) + for key in pairs(t) do t[key] = nil end end +local function rebuild() + clear(Specials.STUBS) + clear(Specials.STUB_REASONS) + clear(Specials.SUPERSEDED_STUBS) + clear(Specials.ALL) + for _, row in ipairs(STUB_ROWS) do + local name, value, reason = row[1], row[2], row[3] + if H[name] then + if Specials.HANDLER_SOURCE[name] == "Specials.lua" then + error("gen2 special '" .. name .. "' is both implemented and stubbed", 0) + end + Specials.SUPERSEDED_STUBS[name] = reason + else + Specials.STUB_REASONS[name] = reason + Specials.STUBS[name] = function(vm) + if value ~= nil then vm.scriptVar = value end + end + end + end + for name, fn in pairs(H) do Specials.ALL[name] = fn end + for name, fn in pairs(Specials.STUBS) do Specials.ALL[name] = fn end +end + +function Specials.merge(handlers, source) + if type(handlers) ~= "table" then + error("gen2 specials module '" .. tostring(source) .. "' returned " + .. type(handlers) .. ", expected a table of name -> function", 0) + end + for name, fn in pairs(handlers) do + if type(name) ~= "string" or type(fn) ~= "function" then + error("gen2 specials module '" .. tostring(source) + .. "' entry [" .. tostring(name) .. "] is not name -> function", 0) + end + local owner = Specials.HANDLER_SOURCE[name] + if owner then + error("gen2 special '" .. name .. "' is defined twice: " + .. owner .. " and " .. tostring(source), 0) + end + H[name] = fn + Specials.HANDLER_SOURCE[name] = source + end + rebuild() + return handlers +end + +package.loaded["src.script.gen2.Specials"] = Specials + +for _, name in ipairs(Specials.MODULES) do + Specials.merge(require("src.script.gen2.specials." .. name), + "specials/" .. name .. ".lua") +end + +rebuild() + return Specials diff --git a/src/script/gen2/Vm.lua b/src/script/gen2/Vm.lua index 4fe546fa..6652153c 100644 --- a/src/script/gen2/Vm.lua +++ b/src/script/gen2/Vm.lua @@ -49,6 +49,14 @@ local MAX_MONEY, MAX_COINS = 999999, 9999 local SFX_ITEM, SFX_HANG_UP = 0x01, 0x6b -- constants/script_constants.asm: EMOTE_FROM_MEM is -1, i.e. the byte $ff. local EMOTE_FROM_MEM = 0xff +-- constants/item_constants.asm:300 DEF ITEM_FROM_MEM EQU $ff +local ITEM_FROM_MEM = 0xff +-- pokecrystal/constants/script_constants.asm:254-257 StoreSwarmMapIndices args. +local SWARM_DUNSPARCE = 0 +-- pokecrystal/constants/text_constants.asm:13-19 wNamedObjectType values. +local NAMED_MON, NAMED_ITEM, NAMED_TRAINER = 1, 4, 7 +-- pokecrystal/engine/overworld/scripting.asm:2336-2347 Script_wait +local WAIT_FRAMES_PER_UNIT = 6 -- constants/misc_constants.asm GS_VERSION: 0 Gold, 1 Silver. local GS_VERSION_GOLD = 0 -- engine/overworld/variables.asm .VarActionTable rows for wMapGroup and @@ -204,7 +212,9 @@ local function runCmd(self, cmd, op) local value = self.callAsmFn(cmd.label, arg1(cmd) or 0, wordArg(cmd, 2)) if value ~= nil then self.scriptVar = value % 256 end end - elseif op == "jumptext" then + elseif op == "jumptext" or op == "farjumptext" then + -- pokecrystal/engine/overworld/scripting.asm:318-327 Script_farjumptext: + -- Script_jumptext with a `dba` for the `dw`, same JumpTextScript. self:emitFace(false) self:showText(cmd.text) return "end" @@ -519,6 +529,36 @@ local function runCmd(self, cmd, op) -- town map draws them two rows deep). local name = self.getLandmarkNameFn and self.getLandmarkNameFn() if name then self:setStringBuffer(name) end + elseif op == "getlandmarkname" then + -- pokecrystal/engine/overworld/scripting.asm:1615-1623: the landmark id + -- comes off the script, then ConvertLandmarkToText and a buffer byte. + local id = cmd.landmark or arg1(cmd) or 0 + local name = self.getLandmarkNameFn and self.getLandmarkNameFn(id) + if name then self:setStringBuffer(name) end + elseif op == "gettrainerclassname" then + -- pokecrystal/engine/overworld/scripting.asm:1644-1647: TRAINER_NAME is + -- preset, so the one id byte ContinueToGetName reads is a trainer group. + if self.getTrainerClassNameFn then + local name = self.getTrainerClassNameFn(cmd.class or arg1(cmd) or 0) + if name then self:setStringBuffer(name) end + end + elseif op == "getname" then + -- pokecrystal/engine/overworld/scripting.asm:1633-1641: a + -- wNamedObjectType byte, an id byte, then GetStringBuffer's buffer byte. + local args = cmd.args or {} + local kind = cmd.kind or args[1] or 0 + local id = cmd.id or args[2] or 0 + local name + if kind == NAMED_MON and self.getMonNameFn then + name = self.getMonNameFn(id) + elseif kind == NAMED_ITEM and self.getItemNameFn then + name = self.getItemNameFn(id) + elseif kind == NAMED_TRAINER and self.getTrainerClassNameFn then + name = self.getTrainerClassNameFn(id) + elseif self.getNameFn then + name = self.getNameFn(kind, id) + end + if name then self:setStringBuffer(name) end elseif op == "getnum" then -- Script_getnum: PrintNum of wScriptVar (PRINTNUM_LEFTALIGN | 1 byte, -- 3 chars) into wStringBuffer1, then GetStringBuffer copies that into @@ -599,9 +639,17 @@ local function runCmd(self, cmd, op) else self.scriptVar = POKEMAIL_REFUSED end - elseif op == "giveitem" or op == "verbosegiveitem" then + elseif op == "giveitem" or op == "verbosegiveitem" + or op == "verbosegiveitemvar" then local item = cmd.item or arg1(cmd) or 0 local qty = cmd.quantity or (cmd.args and cmd.args[2]) or 1 + if op == "verbosegiveitemvar" then + -- pokecrystal/engine/overworld/scripting.asm:486-510: ITEM_FROM_MEM + -- takes the item from wScriptVar, and byte two is a VAR_* id. + if item == ITEM_FROM_MEM then item = (self.scriptVar or 0) % 256 end + local varId = cmd.var or (cmd.args and cmd.args[2]) or 0 + qty = self.readVarFn and self.readVarFn(varId) or 0 + end -- Script_giveitem's own `ld [wCurItem], a` (scripting.asm:1612). It is -- what the standalone `specialsound` inside GiveItemScript reads back: -- CheckItemPocket runs on wCurItem, not on anything the opcode carries. @@ -611,7 +659,7 @@ local function runCmd(self, cmd, op) ok = self.giveItemFn(item, qty) ~= false end self.scriptVar = ok and 1 or 0 - if op == "verbosegiveitem" then + if op == "verbosegiveitem" or op == "verbosegiveitemvar" then local name = self.getItemNameFn and self.getItemNameFn(item) or "?" self:setStringBuffer(name) -- GiveItemScript (engine/overworld/scripting.asm:441-449), command for @@ -1048,10 +1096,20 @@ local function runCmd(self, cmd, op) -- SetSwarmFlag -> DAILYFLAGS1_SWARM. Both halves matter: CheckSwarmFlag -- is what makes the swarm expire, so a port that only stores the map -- leaves the Dunsparce call permanently live. + -- + -- pokecrystal/macros/scripts/events.asm:1003-1008 adds a leading flag byte + -- and specials.asm:290-298 picks the index pair off it, so three operand + -- bytes means the map_id has moved along one. local args = cmd.args or {} - local group = cmd.group or args[1] - local mapNum = cmd.map or args[2] - if self.setSwarmFn then self.setSwarmFn(group, mapNum) end + local kind, group, mapNum + if #args >= 3 then + kind, group, mapNum = args[1], args[2], args[3] + else + kind = SWARM_DUNSPARCE + group = cmd.group or args[1] + mapNum = cmd.map or args[2] + end + if self.setSwarmFn then self.setSwarmFn(group, mapNum, kind) end elseif op == "reloadmapafterbattle" or op == "reloadmap" or op == "refreshmap" then -- Losing ENDS the script. Script_reloadmapafterbattle reads wBattleResult @@ -1617,6 +1675,21 @@ local function runCmd(self, cmd, op) coroutine.yield({ kind = "credits" }) end return "end" + -- ---- Crystal-only verbs ------------------------------------------------ + elseif op == "wait" then + -- pokecrystal/engine/overworld/scripting.asm:2336-2347 Script_wait: SIX + -- frames of DelayFrames per operand unit, not Script_pause's two. + self:waitFrames((cmd.frames or arg1(cmd) or 0) * WAIT_FRAMES_PER_UNIT) + elseif op == "checksave" then + -- pokecrystal/engine/overworld/scripting.asm:2349-2353 writes CheckSave's + -- c: 1 when both sCheckValue bytes match (events/checksave.asm:1-20). + local ok = true + if self.checkSaveFn then ok = self.checkSaveFn() and true or false end + self.scriptVar = ok and 1 or 0 + elseif op == "battletowertext" then + -- pokecrystal/engine/overworld/scripting.asm:447-452 BattleTowerText. + -- Unported: the table consumes the operand and the verb warns once. + self:noteUnknownOp(op) -- ---- commands with no engine behind them yet --------------------------- elseif op == "deactivatefacing" then -- Script_deactivatefacing: wScriptDelay = the byte (left ALONE when the @@ -1960,6 +2033,11 @@ function Vm.new(scripts, text, events, hooks) givePokeMailFn = hooks.givePokeMail, checkPokeMailFn = hooks.checkPokeMail, getLandmarkNameFn = hooks.getLandmarkName, + -- pokecrystal/engine/overworld/scripting.asm:1633-1647, and 2349-2353. + -- Absent on a Gold boot, where no opcode reaches them. + getTrainerClassNameFn = hooks.getTrainerClassName, + getNameFn = hooks.getName, + checkSaveFn = hooks.checkSave, -- loadmenu stashes a header for the verticalmenu / _2dmenu that follows; -- openMenu is the blocking half, modelled on yesorno. openMenuFn = hooks.openMenu, diff --git a/src/script/gen2/specials/battle_tower.lua b/src/script/gen2/specials/battle_tower.lua new file mode 100644 index 00000000..c2b86b9a --- /dev/null +++ b/src/script/gen2/specials/battle_tower.lua @@ -0,0 +1,397 @@ +-- The Battle Tower specials: ../pokecrystal/data/events/special_pointers.asm:132-140 and +-- :150 BattleTowerAction, :152 Menu_ChallengeExplanationCancel. + +local Specials = require("src.script.gen2.Specials") +local S = Specials.shared + +local Bag = require("src.inventory.Bag") +local BattleTower = require("src.core.gen2.BattleTower") +local RomText = require("src.core.RomText") +local Save = require("src.core.gen2.Save") +local Strings = require("src.core.Strings") + +local M = {} + +local TRUE, FALSE = S.TRUE, S.FALSE +local A = BattleTower.ACTIONS + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:190-196 +-- InitBattleTowerChallengeRAM. wNrOfBeatenBattleTowerTrainers is the byte the +-- room script `readmem`s, so it is zeroed in the VM's own memory store. +local function initChallengeRam(vm) + vm.btBattleEnded = 0 + vm.btBeaten = 0 + if vm.mem then vm.mem[BattleTower.WRAM_NR_BEATEN] = 0 end +end + +-- ../pokecrystal/engine/events/battle_tower/rules.asm:57-92, the far labels +-- data/generated/rom_text.lua carries. +local RULE_FALLBACKS = { + _ExcuseMeYoureNotReadyText = + Strings.source("Excuse me.\nYou're not ready."), + _OnlyThreeMonMayBeEnteredText = + Strings.source("Only three POKéMON\nmay be entered."), + _TheMonMustAllBeDifferentKindsText = + Strings.source("The {STRBUF} POKéMON\nmust all be different kinds."), + _TheMonMustNotHoldTheSameItemsText = + Strings.source("The {STRBUF} POKéMON\nmust not hold the same items."), + _YouCantTakeAnEggText = Strings.source("You can't take an\nEGG!"), + _BattleTowerReturnWhenReadyText = + Strings.source("Please return when\nyou're ready."), +} + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1157-1171 +-- BattleTower_CheckSaveFileExistsAndIsYours; the running game IS the loaded +-- save here, so CompareLoadedAndSavedPlayerID can only match. +local function saveFileIsYours(vm) + local record = S.save(vm) + if not (record and record.version) then return FALSE end + return Save.exists(record.version) and TRUE or FALSE +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1024-1127 and +-- :1187-1242, :1314-1447: SRAM bank 5 and WRAM bank 3 belong to the Mobile +-- System GB adapter. A cartridge that never linked reads them as zero, and +-- these are the values that zero produces. +local MOBILE_ARMS = { + [A.ACTION_05] = { value = 0, why = "s5_be46 is 0 until a mobile challenge" }, + [A.ACTION_06] = { why = "clears the mobile challenge bytes" }, + [A.ACTION_0C] = { why = "stamps the mobile challenge day" }, + [A.ACTION_0D] = { value = FALSE, why = "s5_aa47 is 0, so `and a / ret z`" }, + [A.ACTION_0F] = { value = 0, why = "w3_d090 is the adapter's status byte" }, + [A.ACTION_10] = { value = FALSE, why = "s5_a800 is 0, the .NoAction row" }, + [A.ACTION_16] = { why = "stamps the mobile news day" }, + [A.ACTION_17] = { value = FALSE, why = "s5_b2f9 is 0, so `and a / ret z`" }, + [A.LEVEL_CHECK] = { value = 0, why = "s5_b2fb is the stadium's max level" }, + [A.UBERS_CHECK] = { value = 0, why = "s5_b2fb is the stadium's max level" }, +} + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:951-953 +-- BattleTower_SaveOptions writes options.lua, which no `special` hook reaches. +local UNHOOKED_ARMS = { + [A.SAVEOPTIONS] = "needs a saveOptions hook in World:specialHooks", +} + +local ACTIONS = {} + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:978-990 +ACTIONS[A.CHECK_EXPLANATION_READ] = function(vm, tower, record) + local yours = saveFileIsYours(vm) + S.answer(vm, yours) + if yours == 0 then return end + S.answer(vm, BattleTower.saveFileFlag(record, + BattleTower.SAVEFILE_EXPLANATION)) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1001-1008 +ACTIONS[A.SET_EXPLANATION_READ] = function(_vm, _tower, record) + BattleTower.setSaveFileFlag(record, BattleTower.SAVEFILE_EXPLANATION) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:992-999 +ACTIONS[A.GET_CHALLENGE_STATE] = function(vm, tower) + S.answer(vm, tower.challenge) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1010-1012 +ACTIONS[A.SAVE_AND_QUIT] = function(_vm, _tower, record) + BattleTower.setChallengeState(record, BattleTower.SAVED_AND_LEFT) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1014-1022 +ACTIONS[A.CHALLENGECANCELED] = function(_vm, _tower, record) + BattleTower.setChallengeState(record, BattleTower.NO_CHALLENGE) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1129-1141 +ACTIONS[A.SAVELEVELGROUP] = function(vm, tower) + tower.levelGroup = math.max(0, math.floor(tonumber(vm.btLevelGroup) or 0)) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1143-1155 +ACTIONS[A.LOADLEVELGROUP] = function(vm, tower) + vm.btLevelGroup = tower.levelGroup +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1157-1171 +ACTIONS[A.CHECKSAVEFILEISYOURS] = function(vm) + S.answer(vm, saveFileIsYours(vm)) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1173-1177: the +-- pending fade is dropped and the volume goes back to full, which at both +-- call sites follows a `musicfadeout MUSIC_NONE`. +ACTIONS[A.ACTION_0A] = function(vm) + local h = S.hooks(vm) + if h.stopMusic then h.stopMusic() end +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1179-1185: +-- sGSBallFlag reads back as GS_BALL_AVAILABLE once the ball has been offered, +-- and the Goldenrod scene gates itself on its own event flag afterwards. +ACTIONS[A.GSBALL] = function(vm, _tower, record) + local crystal = record and Save.crystalState(record) + local flag = crystal and crystal.gsBall + S.answer(vm, Save.GS_BALL_STATES[flag] and BattleTower.GS_BALL_AVAILABLE or 0) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1311-1312 +-- String_MysteryJP, the OT the Mobile Stadium stamps on an Odd Egg. +local MYSTERY_OT = "\227\129\170\227\129\158\227\131\138\227\131\142" + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1244-1309: the +-- EGG_TICKET is spent only on a party egg carrying String_MysteryJP. +ACTIONS[A.EGGTICKET] = function(vm, _tower, record) + S.answer(vm, FALSE) + local held = record and record.inventory and record.inventory.EGG_TICKET + if not held or held <= 0 then return end + for _, mon in ipairs(S.party(vm)) do + if mon.isEgg and mon.otName == MYSTERY_OT then + mon.otName = "" + Bag.remove(record, "EGG_TICKET", 1) + return S.answer(vm, TRUE) + end + end +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1449-1461 +ACTIONS[A.ACTION_11] = function(_vm, tower) tower.reentry = false end +ACTIONS[A.ACTION_12] = function(_vm, tower) tower.reentry = true end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1463-1469 +ACTIONS[A.ACTION_13] = function(vm, tower) + S.answer(vm, tower.reentry and TRUE or FALSE) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1471-1483 +ACTIONS[A.ACTION_14] = function(vm, _tower, record) + local yours = saveFileIsYours(vm) + S.answer(vm, yours) + if yours == 0 then return end + S.answer(vm, BattleTower.saveFileFlag(record, + BattleTower.SAVEFILE_REGISTERED)) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1485-1492 +ACTIONS[A.ACTION_15] = function(_vm, _tower, record) + BattleTower.setSaveFileFlag(record, BattleTower.SAVEFILE_REGISTERED) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:890-904 +ACTIONS[A.RESETDATA] = function(_vm, _tower, record) + BattleTower.resetTrainers(record) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:906-933 +ACTIONS[A.GIVEREWARD] = function(vm, tower, record) + local h = S.hooks(vm) + local reward = tower.reward or BattleTower.FALLBACK_REWARD + local data = S.data(vm) + local fits = false + if record then + record.inventory = record.inventory or {} + fits = BattleTower.rewardFits(Bag.slots(record, data, "ITEM"), + Bag.capacity(data, "ITEM"), record.inventory[reward]) + end + if not fits then reward = BattleTower.FALLBACK_REWARD end + S.answer(vm, (h.itemIndex and h.itemIndex(reward)) or 0) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:935-949 +ACTIONS[A.ACTION_1C] = function(_vm, _tower, record) + BattleTower.setChallengeState(record, BattleTower.WON_CHALLENGE) +end +ACTIONS[A.ACTION_1D] = function(_vm, _tower, record) + BattleTower.setChallengeState(record, BattleTower.RECEIVED_REWARD) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:955-976. +-- Specials.random answers 1..n, and `% mask` turns that into the 0..mask-1 +-- byte `maskbits` leaves in a. +ACTIONS[A.CHOOSEREWARD] = function(vm, tower) + local data = S.data(vm) + local order = data and data.gen2Constants and data.gen2Constants.itemOrder + tower.reward = BattleTower.rollReward(order, Specials.random) + or BattleTower.FALLBACK_REWARD +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:852-887, the +-- jumptable `special BattleTowerAction` dispatches on wScriptVar. +M.BattleTowerAction = function(vm) + local id = math.floor(tonumber(vm.scriptVar) or 0) + -- ../pokecrystal/ram/sram.asm:147-172, read as the zeroes a fresh cart holds. + local record = S.save(vm) or {} + local tower = BattleTower.state(record) + local run = ACTIONS[id] + if run then return run(vm, tower, record) end + local mobile = MOBILE_ARMS[id] + if mobile then + if mobile.value ~= nil then S.answer(vm, mobile.value) end + return + end + if UNHOOKED_ARMS[id] then return end +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1583-1594: the +-- carry _CheckForBattleTowerRules returns means the party FAILED, and TRUE is +-- what the script's `ifnotequal FALSE` reads as "stop here". +M.CheckForBattleTowerRules = function(vm) + local lines, failed = BattleTower.checkRules(S.party(vm)) + local data = S.data(vm) + -- ../pokecrystal/engine/events/battle_tower/rules.asm:28-31 wStringBuffer2 + vm:setStringBuffer(BattleTower.RULE_PARTY_COUNT_TEXT) + for _, label in ipairs(lines) do + vm:showRaw(RomText(data, label, RULE_FALLBACKS[label] or label)) + end + S.answer(vm, failed and TRUE or FALSE) +end + +-- ../pokecrystal/mobile/mobile_5f.asm:425-468 and its MenuData at :490-495. +-- wScriptVar comes in TRUE for the English rows and leaves holding the row +-- number, or 4 for a B press. +local CHALLENGE_MENU_ROWS = { + Strings.source("Challenge"), + Strings.source("Explanation"), + Strings.source("Cancel"), +} +local CHALLENGE_MENU_CANCEL = 4 + +-- ../pokecrystal/mobile/mobile_5f.asm:484-488 MenuHeader, `menu_coords 0, 0, +-- 14, 7` with STATICMENU_CURSOR | STATICMENU_WRAP. +local CHALLENGE_MENU_FLAGS = 0x80 + 0x20 + +M.Menu_ChallengeExplanationCancel = function(vm) + local h = S.hooks(vm) + local choice = Specials.block(vm, function(done) + if not h.scriptMenu then return done(0) end + h.scriptMenu({ items = CHALLENGE_MENU_ROWS, left = 0, top = 0, + right = 14, bottom = 7, dataFlags = CHALLENGE_MENU_FLAGS, cursor = 1 }, + done) + end) + choice = math.floor(tonumber(choice) or 0) + if choice < 1 or choice > #CHALLENGE_MENU_ROWS then + return S.answer(vm, CHALLENGE_MENU_CANCEL) + end + S.answer(vm, choice) +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1534-1550, whose +-- first act is `farcall LoadOpponentTrainerAndPokemon`: the trainer row, the +-- three mons and the two SRAM tables that stop either repeating. wScriptVar +-- comes in holding the object the opponent walks in as and is NOT written. +M.LoadOpponentTrainerAndPokemonWithOTSprite = function(vm) + local record = S.save(vm) + if not record then return end + -- wBT_OTTrainer is WRAM bank 3, so the drawn opponent rides the VM and not + -- the save; only the sBTTrainers slot and the two previous teams persist. + local opponent = BattleTower.drawOpponent( + S.data(vm), record, Specials.random) + vm.btOpponent = opponent + if not opponent then return end + -- :1552-1575: BTTrainerClassSprites[class - 1] goes into the map object + -- wScriptVar names, and GetUsedSprite loads the sheet. + local h = S.hooks(vm) + if h.setObjectSprite and opponent.sprite then + h.setObjectSprite(math.floor(tonumber(vm.scriptVar) or 0), opponent.sprite) + end +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:181-185 and the +-- RunBattleTowerTrainer arm its jumptable runs at :214-259. +-- +-- The order there is: SET battle mode forced on, wInBattleTowerBattle set, +-- HealParty, ReadBTTrainerParty (which is what steps the streak counter and +-- arms the challenge), StartBattle, HealParty again, and wBattleResult into +-- wScriptVar. A win then copies sNrOfBeatenBattleTowerTrainers into +-- wNrOfBeatenBattleTowerTrainers -- the byte the room script `readmem`s to +-- decide whether all seven are done -- and leaves `count + 1` as the digit +-- Text_NextUpOpponentNo prints. +M.BattleTowerBattle = function(vm) + vm.btBattleEnded = 0 + local record = S.save(vm) + local data = S.data(vm) + local h = S.hooks(vm) + local opponent = vm.btOpponent + if not opponent and record then + opponent = BattleTower.drawOpponent(data, record, Specials.random) + vm.btOpponent = opponent + end + -- A cache with no `battleTower` block on trainers.lua has nobody to send + -- out. LOSE is the room script's own back-out arm + -- (../pokecrystal/maps/BattleTowerBattleRoom.asm:34-37), so the challenge + -- ends rather than looping on an opponent that never appears. + if not (opponent and record) then + vm.btBattleEnded = 1 + return S.answer(vm, 1) + end + -- :229 ReadBTTrainerParty -> CopyBTTrainer_FromBT_OT_TowBT_OTTemp (:549-570) + local streak = BattleTower.beginBattle(record) + -- :228 farcall HealParty, before the send-out. + if h.healParty then h.healParty() end + local classes = data and data.trainers and data.trainers.classes + local class = classes and classes[opponent.classId] + local className = (class and class.name) or opponent.classId + local party = BattleTower.battleParty(data, opponent.rows) + local outcome = Specials.block(vm, function(done) + if not h.startTowerBattle then return done("lose") end + local started = h.startTowerBattle({ + class = opponent.class, + classId = opponent.classId, + className = className, + -- PlaceEnemysName prints the class then the trainer's own name, the + -- same pair World:startScriptedBattle builds for an overworld trainer. + name = className and (className .. " " .. opponent.name) or opponent.name, + trainerName = opponent.name, + party = party, + -- wOtherTrainerClass is a real class here, so the AI weights, the two + -- item slots and the payout all come off its own attributes row. + attributes = class and class.attributes, + baseMoney = class and class.baseMoney, + items = class and class.items, + }, done) + if not started then done("lose") end + end) + -- :235 farcall HealParty, on the way out whichever way it went. + if h.healParty then h.healParty() end + -- :236-237 wBattleResult: WIN is 0. + local won = outcome ~= "lose" + S.answer(vm, won and 0 or 1) + if won and vm.mem then + -- :240-250 + vm.mem[BattleTower.WRAM_NR_BEATEN] = streak % 256 + vm:setStringBuffer(tostring(streak + 1)) + end + -- :257-258 wBattleTowerBattleEnded = TRUE, which ends _BattleTowerBattle. + vm.btBattleEnded = 1 + vm.btOpponent = nil +end + +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1-5, which is +-- InitBattleTowerChallengeRAM plus _BattleTowerRoomMenu +-- (../pokecrystal/mobile/mobile_46.asm:137-177). wScriptVar leaves 0 for a +-- chosen room and $a for the cancel the desk loops back on. +M.BattleTowerRoomMenu = function(vm) + initChallengeRam(vm) + local h = S.hooks(vm) + local record = S.save(vm) + local result = Specials.block(vm, function(done) + if not h.pushScreen then return done(nil) end + local ok = h.pushScreen("Gen2BattleTowerMenu", { + save = record, + party = S.party(vm), + rows = BattleTower.levelGroupRows(record), + monName = h.monName, + onDone = done, + }) + if not ok then done(nil) end + end) + local group = math.floor(tonumber(result) or 0) + if group < 1 or group > BattleTower.MAX_LEVEL_GROUP then + -- ../pokecrystal/mobile/mobile_46.asm:4609-4610 + return S.answer(vm, 0x0a) + end + vm.btLevelGroup = group + S.answer(vm, 0) +end + +return M diff --git a/src/script/gen2/specials/crystal_extras.lua b/src/script/gen2/specials/crystal_extras.lua new file mode 100644 index 00000000..72a08354 --- /dev/null +++ b/src/script/gen2/specials/crystal_extras.lua @@ -0,0 +1,508 @@ +-- ../pokecrystal/data/events/special_pointers.asm:147 MoveTutor, :161 PokeSeer, +-- :162 BuenasPassword, :163 BuenaPrize, :179 AskRememberPassword, +-- :181 UnusedFindItemInPCOrBag, plus the two rows both carts share: +-- :57 OverworldTownMap and :126 PrintDiploma. + +local Bag = require("src.inventory.Bag") +local BugContest = require("src.core.gen2.BugContest") +local Mon = require("src.battle.gen2.Mon") +local Nests = require("src.core.gen2.Nests") +local Save = require("src.core.gen2.Save") +local Specials = require("src.script.gen2.Specials") +local Strings = require("src.core.Strings") + +local S = Specials.shared + +local M = {} + +-- engine/overworld/variables.asm:65 wBlueCardBalance, :66 wBuenasPassword. +local VAR_BLUECARDBALANCE = 0x18 +local VAR_BUENASPASSWORD = 0x19 + +-- maps/RadioTower2F.asm:1 BLUE_CARD_POINT_CAP. +local BLUE_CARD_POINT_CAP = 30 + +local function hooks(vm) + return (vm and vm.specials) or {} +end + +-------------------------------------------------------------------------- +-- MoveTutor -- ../pokecrystal/engine/events/move_tutor.asm:1 +-------------------------------------------------------------------------- + +-- .GetMoveTutorMove (../pokecrystal/engine/events/move_tutor.asm:36) maps +-- MOVETUTOR_FLAMETHROWER..ICE_BEAM onto MT01..MT03, i.e. pokemon.tutorMoves. +local function tutorMove(vm, index) + local d = S.data(vm) + local list = d and d.pokemon and d.pokemon.tutorMoves + if type(list) ~= "table" then return nil end + if index ~= 1 and index ~= 2 then index = 3 end + return list[index] +end + +M.MoveTutor = function(vm) + local h = hooks(vm) + local moveId = tutorMove(vm, vm.scriptVar or 0) + -- ../pokecrystal/engine/events/move_tutor.asm:29 .cancel, which is + -- maps/GoldenrodCity.asm:72 .Incompatible. + if not (moveId and h.pushScreen) then + vm.scriptVar = 255 + return + end + local d = S.data(vm) + local moveDef = d and d.moves and d.moves[moveId] + local learned = Specials.block(vm, function(done) + local ok = h.pushScreen("Gen2MoveTutor", { + move = moveId, + moveName = (moveDef and moveDef.name) or moveId, + onDone = function(taught) done(taught and true or false) end, + }) + if not ok then done(false) end + end) + -- ../pokecrystal/engine/events/move_tutor.asm:25 `xor a ; FALSE` on the learn arm. + vm.scriptVar = learned and 0 or 255 +end + +-------------------------------------------------------------------------- +-- Buena -- ../pokecrystal/engine/events/buena.asm:1, ../pokecrystal/engine/events/buena_menu.asm:1 +-------------------------------------------------------------------------- + +-- data/radio/buenas_passwords.asm, in table order. `kind` is the BUENA_* +-- function of ../pokecrystal/constants/radio_constants.asm:128-131; `points` is both the +-- Blue Card value and the menu width ../pokecrystal/engine/events/buena.asm:9 adds. +local BUENA_PASSWORDS = { + { kind = "mon", points = 10, + words = { "CYNDAQUIL", "TOTODILE", "CHIKORITA" } }, + { kind = "item", points = 12, + words = { "FRESH_WATER", "SODA_POP", "LEMONADE" } }, + { kind = "item", points = 12, + words = { "POTION", "ANTIDOTE", "PARLYZ_HEAL" } }, + { kind = "item", points = 12, + words = { "POKE_BALL", "GREAT_BALL", "ULTRA_BALL" } }, + { kind = "mon", points = 10, + words = { "PIKACHU", "RATTATA", "GEODUDE" } }, + { kind = "mon", points = 10, + words = { "HOOTHOOT", "SPINARAK", "DROWZEE" } }, + { kind = "string", points = 16, + words = { Strings.source("NEW BARK TOWN"), Strings.source("CHERRYGROVE CITY"), + Strings.source("AZALEA TOWN") } }, + { kind = "string", points = 6, + words = { Strings.source("FLYING"), Strings.source("BUG"), + Strings.source("GRASS") } }, + { kind = "move", points = 12, + words = { "TACKLE", "GROWL", "MUD_SLAP" } }, + { kind = "item", points = 12, + words = { "X_ATTACK", "X_DEFEND", "X_SPEED" } }, + { kind = "string", points = 13, + words = { Strings.source("#MON Talk"), Strings.source("#MON Music"), + Strings.source("Lucky Channel") } }, +} + +-- ../pokecrystal/constants/radio_constants.asm:120-121. +local NUM_PASSWORD_CATEGORIES = #BUENA_PASSWORDS +local NUM_PASSWORDS_PER_CATEGORY = 3 + +-- GetBuenasPassword.StringFunctionJumptable (../pokecrystal/engine/pokegear/radio.asm:1534). +local function passwordWord(vm, group, index) + local row = BUENA_PASSWORDS[group + 1] + if not row then return "?" end + local word = row.words[index + 1] + if not word then return "?" end + if row.kind == "string" then return Strings(word) end + local d = S.data(vm) + if row.kind == "mon" then + local def = d and d.pokemon and d.pokemon[word] + return (def and def.name) or word + end + if row.kind == "item" then + local def = d and d.items and d.items[word] + return (def and def.name) or word + end + local def = d and d.moves and d.moves[word] + return (def and def.name) or word +end + +-- BuenasPassword4's two rejection rolls, packed group-high over word-low +-- (../pokecrystal/engine/pokegear/radio.asm:1470-1487). +local function rollPassword(save, day) + local buena = Save.crystalState(save).buenaPassword + buena.word = (Specials.random(NUM_PASSWORD_CATEGORIES) - 1) * 16 + + (Specials.random(NUM_PASSWORDS_PER_CATEGORY) - 1) + buena.day = day + return buena.word +end + +-- DAILYFLAGS2_BUENAS_PASSWORD_F is what makes the roll once a day +-- (../pokecrystal/engine/pokegear/radio.asm:1467, :1489); the day stamp stands in for it. +local function currentPassword(vm) + local record = S.save(vm) + if not record then return 0 end + local buena = Save.crystalState(record).buenaPassword + local today = BugContest.now().day + if buena.word == nil or buena.day ~= today then rollPassword(record, today) end + if vm.writeVarFn then vm.writeVarFn(VAR_BUENASPASSWORD, buena.word % 256) end + return buena.word % 256 +end + +-- ../pokecrystal/engine/events/buena_menu.asm:1-9: carry (NO or B) is 0 and a YES is 1. The +-- question is the script's own writetext at maps/RadioTower2F.asm:119. +M.AskRememberPassword = function(vm) + local yes = coroutine.yield({ kind = "yesorno" }) + S.answer(vm, yes and 1 or 0) +end + +-- ../pokecrystal/engine/events/buena.asm:19-23 `ld a, [wBuenasPassword] / maskbits 3 / cp c`, +-- and :44-49 .PasswordIndices, which makes the menu's answer zero based. +M.BuenasPassword = function(vm) + local h = hooks(vm) + local packed = currentPassword(vm) + local group = math.floor(packed / 16) % 16 + if group >= NUM_PASSWORD_CATEGORIES then group = 0 end + local answer = packed % 4 + local words = {} + for row = 0, NUM_PASSWORDS_PER_CATEGORY - 1 do + words[row + 1] = passwordWord(vm, group, row) + end + if not h.pushScreen then + S.answer(vm, 0) + return + end + local picked = Specials.block(vm, function(done) + local ok = h.pushScreen("Gen2BuenaPassword", { + mode = "password", + words = words, + width = BUENA_PASSWORDS[group + 1].points, + onDone = function(index) done(index or -1) end, + }) + if not ok then done(-1) end + end) + S.answer(vm, (picked == answer) and 1 or 0) +end + +-- data/items/buena_prizes.asm. +local BUENA_PRIZES = { + { item = "ULTRA_BALL", cost = 2 }, + { item = "FULL_RESTORE", cost = 2 }, + { item = "NUGGET", cost = 3 }, + { item = "RARE_CANDY", cost = 3 }, + { item = "PROTEIN", cost = 5 }, + { item = "IRON", cost = 5 }, + { item = "CARBOS", cost = 5 }, + { item = "CALCIUM", cost = 5 }, + { item = "HP_UP", cost = 5 }, +} + +-- ../pokecrystal/data/text/common_3.asm:1082-1116, the six pages BuenaPrintText cycles. +local PRIZE_TEXT = { + which = Strings.source("Which prize would\nyou like?"), + confirm = Strings.source("{STRBUF}?\nIs that right?"), + hereYouGo = Strings.source("Here you go!"), + notEnough = Strings.source("You don't have\nenough points."), + noRoom = Strings.source("You have no room\nfor it."), + comeAgain = Strings.source("Oh. Please come\nback again!"), +} + +-- wBlueCardBalance is a RETVAR_ADDR_DE var, so the point the script awards at +-- maps/RadioTower2F.asm:144-146 and this counter read one store. +local function blueCardBalance(vm) + if not vm.readVarFn then return 0 end + local value = math.floor(tonumber(vm.readVarFn(VAR_BLUECARDBALANCE)) or 0) + if value < 0 then value = 0 end + return math.min(value, BLUE_CARD_POINT_CAP) +end + +local function setBlueCardBalance(vm, value) + if vm.writeVarFn then + vm.writeVarFn(VAR_BLUECARDBALANCE, math.max(0, value) % 256) + end +end + +-- ReceiveItem into wNumItems (../pokecrystal/engine/events/buena.asm:104-110). +local function receiveItem(vm, itemId) + local record = S.save(vm) + if not record then return false end + record.inventory = record.inventory or {} + return Bag.add(record, itemId, 1, S.data(vm)) and true or false +end + +M.BuenaPrize = function(vm) + local h = hooks(vm) + if not h.pushScreen then return end + local d = S.data(vm) + local items = d and d.items + local rows = {} + for i, prize in ipairs(BUENA_PRIZES) do + local def = items and items[prize.item] + rows[i] = { + item = prize.item, + cost = prize.cost, + name = (def and def.name) or prize.item, + } + end + + while true do + -- ../pokecrystal/engine/events/buena.asm:71-83: the page is printed and the menu opens + -- over it, so the box is held the way a `yesorno` page is held. + S.showRawHeld(vm, Strings(PRIZE_TEXT.which)) + local pick = Specials.block(vm, function(done) + local ok = h.pushScreen("Gen2BuenaPassword", { + mode = "prize", + prizes = rows, + balance = blueCardBalance(vm), + onDone = function(index) done(index or 0) end, + }) + if not ok then done(0) end + end) + -- ../pokecrystal/engine/events/buena.asm:84 `jr z, .done`: 0 is the B press. + if not (type(pick) == "number" and rows[pick]) then break end + + local row = rows[pick] + vm:setStringBuffer(row.name) + S.showRawHeld(vm, Strings(PRIZE_TEXT.confirm)) + local sure = coroutine.yield({ kind = "yesorno" }) + if sure then + -- ../pokecrystal/engine/events/buena.asm:95-119: the cost is checked, then ReceiveItem, + -- and only a delivered item spends the points. + local balance = blueCardBalance(vm) + if balance < row.cost then + vm:showRaw(Strings(PRIZE_TEXT.notEnough)) + else + if not receiveItem(vm, row.item) then + vm:showRaw(Strings(PRIZE_TEXT.noRoom)) + else + setBlueCardBalance(vm, balance - row.cost) + if h.playSfxNamed then h.playSfxNamed("Sfx_Transaction") end + vm:showRaw(Strings(PRIZE_TEXT.hereYouGo)) + end + end + end + end + -- ../pokecrystal/engine/events/buena.asm:138-145 .done. + vm:showRaw(Strings(PRIZE_TEXT.comeAgain)) +end + +-------------------------------------------------------------------------- +-- PokeSeer -- ../pokecrystal/engine/events/poke_seer.asm:18 +-------------------------------------------------------------------------- + +-- data/text/common_3.asm:281-445, SeerTexts (../pokecrystal/engine/events/poke_seer.asm:289) +-- in jumptable order, with each text_ram buffer spelled as a directive. +local SEER_TEXT = { + intro = Strings.source("I see all.\nI know all…\fCertainly, I know\nof your #MON!"), + cantTell = Strings.source( + "Whaaaat? I can't\ntell a thing!\fHow could I not\nknow of this?"), + nameLocation = Strings.source("Hm… I see you met\n%s here:\v%s!"), + timeLevel = Strings.source( + "The time was\n%s!\fIts level was %s!\fAm I good or what?"), + trade = Strings.source( + "Hm… %s\ncame from %s\vin a trade?\f%s\nwas where %s\vmet %s!"), + noLocation = Strings.source( + "What!? Incredible!\fI don't understand\nhow, but it is\fincredible!\n" + .. "You are special.\fI can't tell where\nyou met it, but it\v" + .. "was at level %s.\fAm I good or what?"), + egg = Strings.source("Hey!\fThat's an EGG!\fYou can't say that\nyou've met it yet…"), + doNothing = Strings.source("Fufufu! I saw that\nyou'd do nothing!"), +} + +-- SeerAdviceTexts (../pokecrystal/engine/events/poke_seer.asm:357), `dbw level, text`. Field +-- three marks the rows that splice the nickname in. +local SEER_ADVICE = { + { 9, Strings.source( + "Incidentally…\fIt would be wise\nto raise your\f#MON with a\nlittle more care.") }, + { 29, Strings.source( + "Incidentally…\fIt seems to have\ngrown a little.\f%s seems\nto be becoming\v" + .. "more confident."), true }, + { 59, Strings.source( + "Incidentally…\f%s has\ngrown. It's gained\vmuch strength."), true }, + { 89, Strings.source( + "Incidentally…\fIt certainly has\ngrown mighty!\fThis %s\nmust have come\f" + .. "through numerous\n#MON battles.\fIt looks brimming\nwith confidence."), true }, + { 100, Strings.source( + "Incidentally…\fI'm impressed by\nyour dedication.\fIt's been a long\n" + .. "time since I've\fseen a #MON as\nmighty as this\v%s.\fI'm sure that\n" + .. "seeing %s\fin battle would\nexcite anyone."), true }, + { 255, Strings.source( + "Incidentally…\fIt would be wise\nto raise your\f#MON with a\nlittle more care.") }, +} + +-- GetCaughtTime's .times (../pokecrystal/engine/events/poke_seer.asm:203) and +-- UnknownCaughtData's "Unknown@" (:215). +local SEER_TIMES = { + Strings.source("Morning"), Strings.source("Day"), Strings.source("Night"), +} +local SEER_UNKNOWN = Strings.source("Unknown") +local SEER_NO_LEVEL = Strings.source("???") + +-- constants/pokemon_data_constants.asm:130 CAUGHT_EGG_LEVEL and +-- constants/battle_constants.asm:4 EGG_LEVEL. +local CAUGHT_EGG_LEVEL, EGG_LEVEL = 1, 5 + +-- GetCaughtLevel (../pokecrystal/engine/events/poke_seer.asm:148-179). +local function caughtLevel(byte0) + local level = byte0 % 0x40 + if level == 0 then return nil, Strings(SEER_NO_LEVEL) end + if level == CAUGHT_EGG_LEVEL then level = EGG_LEVEL end + return level, tostring(level) +end + +-- GetCaughtLocation (../pokecrystal/engine/events/poke_seer.asm:217-249); the second answer +-- is the SEERACTION_* its two sentinel arms override wSeerAction with. +local function caughtLocation(vm, byte1) + local landmark = byte1 % 0x80 + if landmark == 0 then return Strings(SEER_UNKNOWN), nil end + if landmark == Mon.LANDMARK_EVENT then return nil, "level_only" end + if landmark == Mon.LANDMARK_GIFT then return nil, "cant_tell" end + local record = Nests.landmark(S.data(vm), landmark) + local name = record and record.name + if not name then return Strings(SEER_UNKNOWN), nil end + -- engine/overworld/landmarks.asm:16 GetLandmarkName copies the break byte + -- through; engine/pokegear/townmap_convertlinebreakcharacters.asm:1 is it. + return (tostring(name):gsub("\n", " ")), nil +end + +-- SeerAdvice (../pokecrystal/engine/events/poke_seer.asm:331-355); `sub c` is one byte. +local function seerAdvice(vm, mon, level) + local diff = ((mon.level or 0) - (level or 0)) % 256 + local name = Mon.displayName(mon) + for _, row in ipairs(SEER_ADVICE) do + if diff <= row[1] then + if row[3] then return vm:showRaw(Strings(row[2], name, name)) end + return vm:showRaw(Strings(row[2])) + end + end +end + +M.PokeSeer = function(vm) + vm:showRaw(Strings(SEER_TEXT.intro)) + local _, mon = S.selectMon(vm, "choose") + -- ../pokecrystal/engine/events/poke_seer.asm:38 .cancel. + if not mon then + vm:showRaw(Strings(SEER_TEXT.doNothing)) + return + end + -- :28-29 `cp EGG / jr z, .egg`, plus the IsAPokemon test at :31. + if mon.isEgg then + vm:showRaw(Strings(SEER_TEXT.egg)) + return + end + + local byte0, byte1 = Mon.packCaughtData(mon) + -- ReadCaughtData's `.error` (../pokecrystal/engine/events/poke_seer.asm:104-105, :133). + if byte0 == 0 and byte1 == 0 then + vm:showRaw(Strings(SEER_TEXT.cantTell)) + return + end + + -- ../pokecrystal/engine/events/poke_seer.asm:110-119: the `cp [hl]` on the OT id's second + -- byte is commented out, so only the HIGH byte decides "traded". + local record = S.save(vm) + local playerId = (record and record.player and record.player.id) or 0 + local traded = math.floor((mon.otId or 0) / 256) % 256 + ~= math.floor(playerId / 256) % 256 + + local level, levelText = caughtLevel(byte0) + local place, override = caughtLocation(vm, byte1) + local name = Mon.displayName(mon) + + -- SeerAction2 / SeerAction3 (../pokecrystal/engine/events/poke_seer.asm:81-89). + if override == "cant_tell" then + vm:showRaw(Strings(SEER_TEXT.cantTell)) + return + end + -- SeerAction4 (../pokecrystal/engine/events/poke_seer.asm:91-95). + if override == "level_only" then + vm:showRaw(Strings(SEER_TEXT.noLocation, levelText)) + return seerAdvice(vm, mon, level) + end + + local time = math.floor(byte0 / 0x40) + local timeText = (time > 0 and Strings(SEER_TIMES[time])) or Strings(SEER_UNKNOWN) + + if traded then + -- SeerAction1 (../pokecrystal/engine/events/poke_seer.asm:72-79). + local ot = mon.otName or mon.ot or Strings(SEER_UNKNOWN) + vm:showRaw(Strings(SEER_TEXT.trade, name, ot, place, ot, name)) + else + -- SeerAction0 (../pokecrystal/engine/events/poke_seer.asm:64-70). + vm:showRaw(Strings(SEER_TEXT.nameLocation, name, place)) + end + vm:showRaw(Strings(SEER_TEXT.timeLevel, timeText, levelText)) + seerAdvice(vm, mon, level) +end + +-------------------------------------------------------------------------- +-- UnusedFindItemInPCOrBag -- ../pokecrystal/mobile/mobile_12_2.asm:191 +-------------------------------------------------------------------------- + +-- CheckItem against wNumPCItems, then wNumItems (../pokecrystal/mobile/mobile_12_2.asm:194, +-- :201); either hit is TRUE. +M.UnusedFindItemInPCOrBag = function(vm) + local h = hooks(vm) + local index = vm.scriptVar or 0 + local record = S.save(vm) + local d = S.data(vm) + local id + for key, def in pairs((d and d.items) or {}) do + if type(def) == "table" and def.index == index then id = key break end + end + local pc = record and record.pcItems + if id and type(pc) == "table" and (tonumber(pc[id]) or 0) > 0 then + S.answer(vm, 1) + return + end + if h.hasItem and h.hasItem(index) then + S.answer(vm, 1) + return + end + S.answer(vm, 0) +end + +-------------------------------------------------------------------------- +-- The wall map -- engine/events/specials.asm:100 +-------------------------------------------------------------------------- + +-- OverworldTownMap is `FadeToMenu / farcall _TownMap / ExitAllMenus`, so it +-- never writes wScriptVar; both callers (engine/events/std_scripts.asm:145 +-- TownMapScript and engine/overworld/decorations.asm:1005 +-- DecorationDesc_TownMapPoster) follow it with a bare `closetext`. +-- +-- _TownMap (engine/pokegear/pokegear.asm:1709) draws the SAME region map the +-- POKeGEAR's MAP card draws -- it calls Pokegear_LoadGFX and PokegearMap for +-- it -- with no card strip, no ENGINE_MAP_CARD gate and no A press, which is +-- src/ui/gen2/Pokegear.lua's `townMap` mode. +M.OverworldTownMap = function(vm) + local h = S.hooks(vm) + if not h.pushScreen then return end + Specials.block(vm, function(done) + local ok = h.pushScreen("Gen2Pokegear", { + townMap = true, + onClose = function() done(true) end, + }) + if not ok then done(false) end + end) +end + +-------------------------------------------------------------------------- +-- The printed diploma -- engine/events/specials.asm:448 +-------------------------------------------------------------------------- + +-- _PrintDiploma (engine/printer/printer.asm:382) opens with the very page +-- `special Diploma` shows -- `farcall PlaceDiplomaOnScreen`, +-- engine/events/diploma.asm:12 -- and only then reaches for the serial port. +-- The second sheet is built with hBGMapMode zeroed and SafeLoadTempTilemapToTilemap +-- puts page 1 straight back, so PrintDiplomaPage2 never reaches the screen on +-- the cartridge either: page 1 IS the whole visible routine. +-- +-- The two SendScreenToPrinter passes are the same missing peripheral +-- H.PhotoStudio and H.UnownPrinter degrade around, and .CancelPrinting +-- (maps/CeladonMansion3F.asm:60) is unreferenced, so the cart has no text for +-- a failed print and neither does this. +M.PrintDiploma = function(vm) + local h = S.hooks(vm) + if not h.showDiploma then return end + Specials.block(vm, function(done) + h.showDiploma(function() done(true) end) + end) +end + +return M diff --git a/src/script/gen2/specials/crystal_story.lua b/src/script/gen2/specials/crystal_story.lua new file mode 100644 index 00000000..548ddc69 --- /dev/null +++ b/src/script/gen2/specials/crystal_story.lua @@ -0,0 +1,298 @@ +-- ../pokecrystal/data/events/special_pointers.asm:141 GiveOddEgg, :148 +-- OmanyteChamber, :157 HoOhChamber, :159 CelebiShrineEvent, :160 +-- CheckCaughtCelebi, :164 GiveDratini, :166 BeastsCheck. + +local Specials = require("src.script.gen2.Specials") +local Mon = require("src.battle.gen2.Mon") +local UnownWords = require("src.world.gen2.UnownWords") + +local S = Specials.shared +local M = {} + +-- ../pokecrystal/constants/script_constants.asm:51 VAR_BATTLETYPE. +local VAR_BATTLETYPE = 0x03 +-- ../pokecrystal/constants/battle_constants.asm:102 BATTLETYPE_CELEBI. +local BATTLETYPE_CELEBI = 11 + +-- ../pokecrystal/engine/pokemon/search_owned.asm:6, :11, :16 -- the order the +-- routine writes into wScriptVar before each CheckOwnMonAnywhere. +local BEASTS = { "RAIKOU", "ENTEI", "SUICUNE" } + +-- ../pokecrystal/engine/pokemon/search_owned.asm:1; MonCheck is +-- CheckOwnMonAnywhere (:48) with the answer already written. +M.BeastsCheck = function(vm) + local monCheck = Specials.HANDLERS.MonCheck + local h = S.hooks(vm) + for _, name in ipairs(BEASTS) do + vm.scriptVar = (h.monIndex and h.monIndex(name)) or name + monCheck(vm) + if vm.scriptVar ~= S.TRUE then + S.answer(vm, S.FALSE) + return + end + end + S.answer(vm, S.TRUE) +end + +-- ../pokecrystal/engine/events/dratini.asm:72 .Moveset0, :79 .Moveset1. +local DRATINI = "DRATINI" +local DRATINI_MOVESETS = { + [0] = { "WRAP", "THUNDER_WAVE", "TWISTER", "EXTREMESPEED" }, + [1] = { "WRAP", "LEER", "THUNDER_WAVE", "TWISTER" }, +} + +-- ../pokecrystal/engine/events/dratini.asm:1: `cp $2 / ret nc`, then :16 +-- .CheckForDratini walks the party BACKWARDS from the last slot. +M.GiveDratini = function(vm) + local set = DRATINI_MOVESETS[vm.scriptVar or 0] + if not set then return end + local list = S.party(vm) + local target + for index = #list, 1, -1 do + local mon = list[index] + if mon and mon.species == DRATINI then + target = mon + break + end + end + if not target then return end + -- ../pokecrystal/engine/events/dratini.asm:54: each new move's PP comes from + -- Moves + MOVE_PP, so a PP Up on the replaced slot is dropped. + local defs = S.data(vm) + local moves = defs and defs.moves + target.moves = target.moves or {} + for index, id in ipairs(set) do + local pp = (moves and moves[id] and moves[id].pp) or 0 + target.moves[index] = { id = id, pp = pp, maxPp = pp } + end +end + +-- ../pokecrystal/data/events/odd_eggs.asm:14-33, the `odd_egg_prob` arguments in +-- order; the macro (:5) accumulates them and stores total * $ffff / 100. +local ODD_EGG_PERCENTS = { 8, 1, 16, 3, 16, 3, 14, 2, 10, 2, 12, 2, 10, 1 } + +local ODD_EGG_PROBABILITIES = {} +do + local total = 0 + for index, percent in ipairs(ODD_EGG_PERCENTS) do + total = total + percent + ODD_EGG_PROBABILITIES[index] = math.floor(total * 0xffff / 100) + end +end + +-- ../pokecrystal/data/events/odd_eggs.asm:37 OddEggs, one row per +-- NICKNAMED_MON_STRUCT. +local ODD_EGGS = { + { species = "PICHU", otId = 2048, experience = 125, level = 5, eggSteps = 20, + moves = { "THUNDERSHOCK", "CHARM", "DIZZY_PUNCH" }, + pp = { 30, 20, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 17, attack = 9, defense = 6, speed = 11, + specialAttack = 8, specialDefense = 8 } }, + { species = "PICHU", otId = 256, experience = 125, level = 5, eggSteps = 20, + moves = { "THUNDERSHOCK", "CHARM", "DIZZY_PUNCH" }, + pp = { 30, 20, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 17, attack = 9, defense = 7, speed = 12, + specialAttack = 9, specialDefense = 9 } }, + { species = "CLEFFA", otId = 4096, experience = 125, level = 5, eggSteps = 20, + moves = { "POUND", "CHARM", "DIZZY_PUNCH" }, + pp = { 35, 20, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 20, attack = 7, defense = 7, speed = 6, + specialAttack = 9, specialDefense = 10 } }, + { species = "CLEFFA", otId = 768, experience = 125, level = 5, eggSteps = 20, + moves = { "POUND", "CHARM", "DIZZY_PUNCH" }, + pp = { 35, 20, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 20, attack = 7, defense = 8, speed = 7, + specialAttack = 10, specialDefense = 11 } }, + { species = "IGGLYBUFF", otId = 4096, experience = 125, level = 5, + eggSteps = 20, + moves = { "SING", "CHARM", "DIZZY_PUNCH" }, + pp = { 15, 20, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 24, attack = 8, defense = 6, speed = 6, + specialAttack = 9, specialDefense = 7 } }, + { species = "IGGLYBUFF", otId = 768, experience = 125, level = 5, + eggSteps = 20, + moves = { "SING", "CHARM", "DIZZY_PUNCH" }, + pp = { 15, 20, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 24, attack = 8, defense = 7, speed = 7, + specialAttack = 10, specialDefense = 8 } }, + { species = "SMOOCHUM", otId = 3584, experience = 125, level = 5, + eggSteps = 20, + moves = { "POUND", "LICK", "DIZZY_PUNCH" }, + pp = { 35, 30, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 19, attack = 8, defense = 6, speed = 11, + specialAttack = 13, specialDefense = 11 } }, + { species = "SMOOCHUM", otId = 512, experience = 125, level = 5, + eggSteps = 20, + moves = { "POUND", "LICK", "DIZZY_PUNCH" }, + pp = { 35, 30, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 19, attack = 8, defense = 7, speed = 12, + specialAttack = 14, specialDefense = 12 } }, + { species = "MAGBY", otId = 2560, experience = 125, level = 5, eggSteps = 20, + moves = { "EMBER", "DIZZY_PUNCH" }, + pp = { 25, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 19, attack = 12, defense = 8, speed = 13, + specialAttack = 12, specialDefense = 10 } }, + { species = "MAGBY", otId = 512, experience = 125, level = 5, eggSteps = 20, + moves = { "EMBER", "DIZZY_PUNCH" }, + pp = { 25, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 19, attack = 12, defense = 9, speed = 14, + specialAttack = 13, specialDefense = 11 } }, + { species = "ELEKID", otId = 3072, experience = 125, level = 5, eggSteps = 20, + moves = { "QUICK_ATTACK", "LEER", "DIZZY_PUNCH" }, + pp = { 30, 30, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 19, attack = 11, defense = 8, speed = 14, + specialAttack = 11, specialDefense = 10 } }, + { species = "ELEKID", otId = 512, experience = 125, level = 5, eggSteps = 20, + moves = { "QUICK_ATTACK", "LEER", "DIZZY_PUNCH" }, + pp = { 30, 30, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 19, attack = 11, defense = 9, speed = 15, + specialAttack = 12, specialDefense = 11 } }, + { species = "TYROGUE", otId = 2560, experience = 125, level = 5, + eggSteps = 20, + moves = { "TACKLE", "DIZZY_PUNCH" }, + pp = { 35, 10 }, + dvs = { attack = 0, defense = 0, speed = 0, special = 0 }, + stats = { hp = 18, attack = 8, defense = 8, speed = 8, + specialAttack = 8, specialDefense = 8 } }, + { species = "TYROGUE", otId = 256, experience = 125, level = 5, eggSteps = 20, + moves = { "TACKLE", "DIZZY_PUNCH" }, + pp = { 35, 10 }, + dvs = { attack = 2, defense = 10, speed = 10, special = 10 }, + stats = { hp = 18, attack = 8, defense = 9, speed = 9, + specialAttack = 9, specialDefense = 9 } }, +} + +-- ../pokecrystal/engine/events/odd_egg.asm:93 `.Odd` is the OT NAME +-- (../pokecrystal/mobile/mobile_46.asm:7561); wOddEggName ("EGG") is the nickname. +local ODD_EGG_OT = "ODD" +local ODD_EGG_NICKNAME = "EGG" +local EGG_TICKET = "EGG_TICKET" + +-- ../pokecrystal/engine/events/odd_egg.asm:5-38, one Random word against the +-- cumulative table; the $ffff break is :17. +local function oddEggIndex(roll) + for index = 1, #ODD_EGG_PROBABILITIES do + local probability = ODD_EGG_PROBABILITIES[index] + if probability >= 0xffff then return index end + if roll <= probability then return index end + end + return #ODD_EGG_PROBABILITIES +end + +-- ../pokecrystal/engine/events/odd_egg.asm:40-48, NICKNAMED_MON_STRUCT_LENGTH +-- bytes copied verbatim. +local function buildOddEgg(data, row, save) + if not (data and row) then return nil end + local moves = {} + for index, id in ipairs(row.moves) do + local pp = row.pp[index] or 0 + moves[index] = { id = id, pp = pp, maxPp = pp } + end + local dvs = { + attack = row.dvs.attack, defense = row.dvs.defense, + speed = row.dvs.speed, special = row.dvs.special, + } + local egg = Mon.new(data, row.species, row.level, { + dvs = dvs, + moves = moves, + -- ../pokecrystal/data/events/odd_eggs.asm:57 `bigdw 0 ; HP` + hp = 0, + nickname = ODD_EGG_NICKNAME, + }) + if not egg then return nil end + egg.experience = row.experience + egg.stats = { + hp = row.stats.hp, attack = row.stats.attack, + defense = row.stats.defense, speed = row.stats.speed, + specialAttack = row.stats.specialAttack, + specialDefense = row.stats.specialDefense, + } + egg.maxHp = row.stats.hp + egg.hp = 0 + -- ../pokecrystal/mobile/mobile_46.asm:7528 writes EGG into wPartySpecies while the struct + -- keeps the hatchling's own species. + egg.isEgg = true + -- ../pokecrystal/data/events/odd_eggs.asm:53 `db 20 ; Step cycles to hatch`, + -- the byte MON_HAPPINESS holds while the thing is an egg. + egg.eggSteps = row.eggSteps + egg.ot = ODD_EGG_OT + egg.otName = ODD_EGG_OT + egg.otId = row.otId + if save then Mon.stampOT(save, egg) end + return egg +end + +-- ../pokecrystal/engine/events/odd_egg.asm:1. The party-full refusal is the +-- caller's (../pokecrystal/maps/DayCare.asm:31-32), not the routine's. +M.GiveOddEgg = function(vm) + local record = S.save(vm) + local data = S.data(vm) + if not (record and data) then return end + local party = record.party or {} + record.party = party + if #party >= Mon.PARTY_SIZE then return end + local row = ODD_EGGS[oddEggIndex(Specials.random(0x10000) - 1)] + local egg = buildOddEgg(data, row, record) + if not egg then return end + -- ../pokecrystal/engine/events/odd_egg.asm:50-57 TossItem on the EGG TICKET, + -- ahead of the party write. + local h = S.hooks(vm) + local ticket = h.itemIndex and h.itemIndex(EGG_TICKET) + if ticket and h.takeItem then h.takeItem(ticket, 1) end + party[#party + 1] = egg +end + +-- ../pokecrystal/engine/events/unown_walls.asm:1, run by +-- ../pokecrystal/maps/RuinsOfAlphHoOhChamber.asm:10. +M.HoOhChamber = function(vm) + if not UnownWords.leadIsHoOh(S.party(vm)) then return end + UnownWords.openWall(vm.events, "HO_OH") +end + +-- ../pokecrystal/engine/events/unown_walls.asm:13, run by +-- ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:10; :25 CheckItem then :38 +-- MON_ITEM. +M.OmanyteChamber = function(vm) + if UnownWords.wallOpened(vm.events, "OMANYTE") then return end + local h = S.hooks(vm) + local index = h.itemIndex and h.itemIndex(UnownWords.WATER_STONE) + local inPack = index and h.hasItem and h.hasItem(index) + if not inPack and not UnownWords.waterStoneSlot(S.party(vm)) then return end + UnownWords.openWall(vm.events, "OMANYTE") +end + +-- ../pokecrystal/engine/events/celebi.asm:9; :296 CelebiEvent_SetBattleType is +-- the only state it leaves, and src/world/gen2/World.lua:6161 clears that. +M.CelebiShrineEvent = function(vm) + if vm.writeVarFn then vm.writeVarFn(VAR_BATTLETYPE, BATTLETYPE_CELEBI) end + vm.celebiArmed = true +end + +-- ../pokecrystal/engine/events/celebi.asm:301 reads the bit +-- ../pokecrystal/engine/items/item_effects.asm:545 sets, gated on :542. +M.CheckCaughtCelebi = function(vm) + local caught = vm.celebiArmed == true and vm.battleOutcome == "caught" + vm.celebiArmed = nil + if caught then + local record = S.save(vm) + if record then + local Save = require("src.core.gen2.Save") + Save.crystalState(record).celebiCaught = true + end + end + S.answer(vm, caught and S.TRUE or S.FALSE) +end + +return M diff --git a/src/script/gen2/specials/unown_words.lua b/src/script/gen2/specials/unown_words.lua new file mode 100644 index 00000000..e3a25664 --- /dev/null +++ b/src/script/gen2/specials/unown_words.lua @@ -0,0 +1,29 @@ +-- ../pokecrystal/data/events/special_pointers.asm:151 DisplayUnownWords, run by all four +-- chambers: ../pokecrystal/maps/RuinsOfAlphKabutoChamber.asm:123, +-- ../pokecrystal/maps/RuinsOfAlphHoOhChamber.asm:86, ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:86, +-- ../pokecrystal/maps/RuinsOfAlphAerodactylChamber.asm:85. + +local Specials = require("src.script.gen2.Specials") +local UnownWords = require("src.world.gen2.UnownWords") + +local S = Specials.shared + +local M = {} + +M.DisplayUnownWords = function(vm) + local h = S.hooks(vm) + local world = h.world + local game = world and world.game + if not (game and game.stack) then return end + local wall = UnownWords.wallFor(game.data, vm.scriptVar or 0) + if not wall then return end + S.block(vm, function(done) + local screen = UnownWords.new(game, { + wall = wall, world = world, onClose = function() done(true) end, + }) + local ok = pcall(game.stack.push, game.stack, screen) + if not ok then done(false) end + end) +end + +return M diff --git a/src/sync/SyncMods.lua b/src/sync/SyncMods.lua index 814447e1..51adfda2 100644 --- a/src/sync/SyncMods.lua +++ b/src/sync/SyncMods.lua @@ -7,7 +7,7 @@ SyncMods.MAX_OPTION_TEXT = 256 local function versions() local ok, GameVersion = pcall(require, "src.core.GameVersion") if ok and GameVersion and GameVersion.ORDER then return GameVersion.ORDER end - return { "red", "blue", "yellow", "gold", "silver" } + return { "red", "blue", "yellow", "gold", "silver", "crystal" } end local function defaultDeps() diff --git a/src/ui/Screens.lua b/src/ui/Screens.lua index e52b8d12..424bfa58 100644 --- a/src/ui/Screens.lua +++ b/src/ui/Screens.lua @@ -39,14 +39,30 @@ local BUILTIN = { -- screens and do have ids. local GEN2 = { "BankOfMom", - "BattleState", "BattleTransition", "BoxMenu", "CardFlip", + "BattleState", + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1 the CHALLENGE + -- / EXPLANATION / CANCEL desk menu, Crystal only. + "BattleTowerMenu", + "BattleTransition", "BoxMenu", + -- ../pokecrystal/engine/events/buena.asm:1 the radio-password prompt behind + -- `special BuenasPassword`, Crystal only. + "BuenaPassword", + "CardFlip", -- The Pokecenter PC's whose-PC top menu and the player's item PC behind it; -- Gen2PcMenu below is the storage system both BILL's PC rows open. "CenterPcMenu", "ContestMenu", - "CopyrightSplash", "Credits", "DayCareMenu", "DecorationMenu", "Diploma", + "CopyrightSplash", "Credits", + -- ../pokecrystal/engine/movie/intro.asm:1 CrystalIntro, the Crystal-only + -- peer of GoldSilverIntro below. + "CrystalIntro", + "DayCareMenu", "DecorationMenu", "Diploma", "EggHatchAnim", "ElevatorMenu", "EvolutionAnim", - "GameFreakPresents", "GoldSilverIntro", "HallOfFame", "HeldItemMenu", + "GameFreakPresents", + -- ../pokecrystal/engine/menus/init_gender.asm:23 InitGender, the Crystal-only + -- screen PlayerProfileSetup runs before Oak's speech. + "GenderSelect", + "GoldSilverIntro", "HallOfFame", "HeldItemMenu", -- Gen2InitClock is both timeset.asm screens: the new-game hour/minute pair -- OakSpeech opens with, and Mom's day-of-week wheel. "InitClock", @@ -57,7 +73,11 @@ local GEN2 = { "MailCompose", "MailMenu", "MailRead", "MailboxMenu", -- Gen2MapRadio is the in-house wall radio (`special MapRadio`), not a card. "MapRadio", - "MainMenu", "MartMenu", "MoveDeleter", "NamePick", "NamingScreen", "OakSpeech", + "MainMenu", "MartMenu", "MoveDeleter", + -- ../pokecrystal/engine/events/move_tutor.asm:1 the Goldenrod tutor's own + -- move/party pages, Crystal only. + "MoveTutor", + "NamePick", "NamingScreen", "OakSpeech", "OptionsMenu", "PackMenu", "PartyMenu", "PcMenu", "PhotoStudio", "PokedexMenu", "Pokegear", "SaveMenu", "ScriptMenu", "SlotMachine", "StartMenu", "SummaryMenu", "TitleState", "TradeAnim", "TradeMenu", @@ -66,12 +86,31 @@ local GEN2 = { "UnownPrinter", "UnownPuzzle", } +local GEN2_PENDING = { + BattleTowerMenu = true, + BuenaPassword = true, + MoveTutor = true, +} + +local function moduleExists(name) + local path = "src/ui/gen2/" .. name .. ".lua" + local handle = io.open(path, "r") + if handle then + handle:close() + return true + end + local lfs = love and love.filesystem + return (lfs and lfs.getInfo and lfs.getInfo(path)) ~= nil +end + -- The full ids, in the same order, for tests and for the mod docs. Screens.GEN2_IDS = {} for _, name in ipairs(GEN2) do local id = "Gen2" .. name BUILTIN[id] = "src.ui.gen2." .. name - Screens.GEN2_IDS[#Screens.GEN2_IDS + 1] = id + if not GEN2_PENDING[name] or moduleExists(name) then + Screens.GEN2_IDS[#Screens.GEN2_IDS + 1] = id + end end local cache = {} diff --git a/src/ui/gen2/BattleState.lua b/src/ui/gen2/BattleState.lua index f5d9adae..365b8f67 100644 --- a/src/ui/gen2/BattleState.lua +++ b/src/ui/gen2/BattleState.lua @@ -25,10 +25,12 @@ local Catching = require("src.battle.gen2.Catching") local Chrome = require("src.ui.gen2.Chrome") local Evolution = require("src.core.gen2.Evolution") local GbcPalette = require("src.render.GbcPalette") +local Gen2Save = require("src.core.gen2.Save") local Font = require("src.render.Font") local HpBar = require("src.battle.gen2.HpBar") local ItemEffects = require("src.core.gen2.ItemEffects") local Mon = require("src.battle.gen2.Mon") +local MonAnim = require("src.render.MonAnim") local Palettes = require("src.world.gen2.Palettes") local Pokerus = require("src.core.gen2.Pokerus") local Prize = require("src.battle.gen2.Prize") @@ -306,6 +308,11 @@ function BattleState.new(game, opts) self.playerBackTrueColor = false local hudGfx = data.gen2MenuGfx and data.gen2MenuGfx.battleHud local backPath = hudGfx and hudGfx.playerBack + -- GetTrainerBackpic's gender arm, under the Dude exception + -- (../pokecrystal/engine/battle/core.asm:8984-9008). + if hudGfx and hudGfx.playerBackFemale and Gen2Save.isFemale(self.save) then + backPath = hudGfx.playerBackFemale + end if self.tutorial and hudGfx and hudGfx.dudeBack then backPath = hudGfx.dudeBack end @@ -586,6 +593,65 @@ function BattleState:pic(mon, back) return cached or nil, trueColor, path end +-- Crystal's animated front pics. A cache with no `anim` row -- every Gold +-- and Silver one -- gets nil here and the static pic is drawn as before. +function BattleState:animData(mon) + local def = self.pokemon and mon and self.pokemon[mon.species] + if not def then return nil end + if mon.species == Unown.SPECIES and def.letters then + local entry = def.letters[Unown.monLetter(mon)] + if entry and entry.anim then return entry.anim end + end + return def.anim +end + +-- ANIM_MON_NORMAL, the scene BattleStartMessage runs on the enemy's frontpic. +-- ../pokecrystal/engine/battle/core.asm:9112-9113 +function BattleState:startFrontAnim(mon) + self.frontAnim = nil + local data = self:animData(mon) + if not data then return end + local cached = self.picCache[data.sheet] + if cached == nil then + local ok, image = pcall(Assets.image, data.sheet) + cached = ok and image or false + self.picCache[data.sheet] = cached + end + if not cached then return end + local runner = MonAnim.new(data, "battle") + if not runner then return end + local size = data.tiles * 8 + self.frontAnim = { mon = mon, runner = runner, sheet = cached, size = size, + quads = {} } +end + +-- AnimateFrontpic's .loop, one scene command per frame. +-- ../pokecrystal/engine/gfx/pic_animation.asm:79-89 +function BattleState:stepFrontAnim() + local state = self.frontAnim + if not state then return end + state.runner:update() + if state.runner:finished() then self.frontAnim = nil end +end + +-- The sheet is one column of whole pictures, base first, so a frame is one +-- quad at the size the static pic would have been. +function BattleState:frontAnimFrame(mon) + local state = self.frontAnim + if not (state and mon and state.mon == mon) then return nil end + local frame = state.runner:currentFrame() + if frame <= 0 then return nil end + local quad = state.quads[frame] + if not quad then + local w, h = state.sheet:getDimensions() + if (frame + 1) * state.size > h then return nil end + quad = love.graphics.newQuad(0, frame * state.size, state.size, state.size, + w, h) + state.quads[frame] = quad + end + return state.sheet, quad, state.size +end + -- The battle_sprite_scales registry: record id -> { path, scale }, keyed by the -- ASSET PATH the pic is drawn from rather than by species, which is the only -- handle there is on the pics that are not a species' own (the player's @@ -696,6 +762,13 @@ function BattleState:drawPic(mon, back) end local G = love.graphics local w, h = image:getDimensions() + -- Crystal only: the frame the animation is showing replaces the static + -- picture in the same box, at the same size. + local animSheet, animQuad, animSize + if not (back or trainerBack or enemyTrainer or doll) then + animSheet, animQuad, animSize = self:frontAnimFrame(mon) + if animSheet then w, h = animSize, animSize end + end local px, py local boxTiles if back then @@ -772,6 +845,10 @@ function BattleState:drawPic(mon, back) scale, scale) return end + if animQuad then + G.draw(animSheet, animQuad, px, py, 0, scale, scale) + return + end G.draw(image, px, py, 0, scale, scale) end -- A mod-supplied pic that says it is already coloured is drawn as it is: @@ -1588,7 +1665,10 @@ function BattleState:advanceQueue() if event.intro then self.introTextShown = true end -- BattleStartMessage's `.not_shiny` cries the wild mon before its own line -- (engine/battle/core.asm:8718-8721). - if event.cry then self:playCry(event.cry) end + if event.cry then + self:playCry(event.cry) + self:startFrontAnim(event.cry) + end -- A text_asm tail that plays its own sound, the way Text_BallCaught's -- sound_caught_mon rides the "Gotcha!" line rather than following it. if event.sfx then @@ -1694,6 +1774,7 @@ function BattleState:finishSendOut(after) if not after then return end self:playCry(after.mon) if after.side == "enemy" then + self:startFrontAnim(after.mon) self.showEnemyHud = true else self.showPlayerHud = true @@ -1964,6 +2045,7 @@ function BattleState:update(_dt) -- this state is only still here because ExitBattle has not cleaned up yet. if self.phase == "evolving" or self.phase == "done" then return end self:updateAlarm() + self:stepFrontAnim() local input = self.game and self.game.input if not input then return end @@ -2489,6 +2571,7 @@ function BattleState:openTutorialPack() end Screens.push(self.game, "Gen2PackMenu", { battle = true, + tutorial = true, save = CatchTutorial.dudeSave(), -- An empty world rather than the real one: a DUDE pocket must not reach -- World:useFieldItem, because these buffers are not the player's bag and diff --git a/src/ui/gen2/BattleTowerMenu.lua b/src/ui/gen2/BattleTowerMenu.lua new file mode 100644 index 00000000..b47c0178 --- /dev/null +++ b/src/ui/gen2/BattleTowerMenu.lua @@ -0,0 +1,220 @@ +-- ../pokecrystal/mobile/mobile_46.asm:137-177 _BattleTowerRoomMenu and the +-- jumptable at :625-641 it drives. + +local BattleTower = require("src.core.gen2.BattleTower") +local Chrome = require("src.ui.gen2.Chrome") +local Sound = require("src.core.Sound") +local Strings = require("src.core.Strings") + +local BattleTowerMenu = {} +BattleTowerMenu.__index = BattleTowerMenu +BattleTowerMenu.isOpaque = false + +-- ../pokecrystal/mobile/mobile_46.asm:3854-3858 MenuHeader_119cf7, +-- `menu_coords 12, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1`. +local PICK_X, PICK_Y, PICK_W, PICK_H = 12, 7, 8, 5 +-- ../pokecrystal/mobile/mobile_46.asm:1178-1183, :1222 and :1147 +local ROW_X, ROW_Y = 13, 9 +local ARROW_X, UP_Y, DOWN_Y = 16, 8, 10 + +-- ../pokecrystal/mobile/mobile_46.asm:4635-4639 MenuHeader_11a2de and +-- :4516-4530 BattleTowerRoomMenu2_PlaceYesNoMenu. +local YN_X, YN_Y, YN_W, YN_H = 14, 7, 6, 5 +local YN_TEXT_X, YES_Y, NO_Y = 16, 8, 10 + +-- ../pokecrystal/constants/text_constants.asm:25-32, the box SpeechTextbox +-- fills at ../pokecrystal/mobile/mobile_46.asm:5267. +local SAY_X, SAY_Y, SAY_W, SAY_H = 0, 12, 18, 4 +local SAY_TEXT_X, SAY_TEXT_Y = 1, 14 + +-- ../pokecrystal/mobile/mobile_46.asm:3803-3813, `ld a, $80 / ld [wcd50]` +-- counted down one per frame before the menu restarts. +local MESSAGE_FRAMES = 0x80 + +-- ../pokecrystal/mobile/mobile_46.asm:4609-4610, the code +-- BattleTowerRoomMenu_Cleanup (:512-513) copies into wScriptVar. The chosen +-- room is a separate byte (w3_d800 at :1285), so onDone answers the level +-- group and nil for the cancel. +BattleTowerMenu.CANCELLED = 0x0a + +-- ../pokecrystal/mobile/mobile_46.asm:5488-5491 +local PICK_TEXT = Strings.source("What level do you\nwant to challenge?") +-- ../pokecrystal/mobile/mobile_46.asm:5459-5462 +local TOPS_TEXT = Strings.source("A party POKéMON\ntops this level.") +-- ../pokecrystal/mobile/mobile_46.asm:5464-5471 +local UBER_TEXT = Strings.source( + "%s may go\nonly to BATTLE\nROOMS that are\nLv.70 or higher.") +-- ../pokecrystal/mobile/mobile_46.asm:5473-5476 +local QUIT_TEXT = Strings.source("Cancel your BATTLE\nROOM challenge?") +-- ../pokecrystal/constants/charmap.asm:89 and :192, tiles $61 and $ee. +local UP_ARROW = "\xe2\x96\xb2" +local DOWN_ARROW = "\xe2\x96\xbc" + +-- ../pokecrystal/mobile/mobile_46.asm:3880 and :4623-4627 +local CANCEL_LABEL = Strings.source("CANCEL") +local YES_LABEL = Strings.source("YES") +local NO_LABEL = Strings.source("NO") + +-- ../pokecrystal/mobile/mobile_46.asm:3869-3879 Strings_L10ToL100, six tiles +-- a row. +function BattleTowerMenu.levelLabel(group) + return string.format(" L:%-3d", group * 10):sub(1, 6) +end + +-- opts: save, party, rows (BattleTower.levelGroupRows), monName, +-- onDone(levelGroup) with nil for the cancel +function BattleTowerMenu.new(game, opts) + opts = opts or {} + local self = setmetatable({}, BattleTowerMenu) + self.game = game + self.data = (game and game.data) or {} + self.save = opts.save or (game and game.save) + self.party = opts.party or (self.save and self.save.party) or {} + self.rows = opts.rows or BattleTower.levelGroupRows(self.save) + self.monName = opts.monName + self.onDone = opts.onDone + -- `ld a, $1 / ld [wcd4f], a` (../pokecrystal/mobile/mobile_46.asm:1152-1153) + self.cursor = 1 + self.phase = "pick" + self.message = PICK_TEXT + return self +end + +function BattleTowerMenu:wantsFillScale() return true end + +function BattleTowerMenu:playSfx(name) + local sfx = self.data.audio and self.data.audio.sfx + if sfx and sfx[Sound.resolve(self.data, name)] then + Sound.play(self.data, name) + end +end + +-- The last row is CANCEL (../pokecrystal/mobile/mobile_46.asm:1160, :1165). +function BattleTowerMenu:rowCount() + return #self.rows + 1 +end + +function BattleTowerMenu:finish(group) + if self.done then return end + self.done = true + local game = self.game + if game and game.stack and game.stack:top() == self then game.stack:pop() end + if self.onDone then self.onDone(group) end +end + +-- ../pokecrystal/mobile/mobile_46.asm:3794-3816: the refusal is printed, held +-- for $80 frames and the menu restarts at jumptable index 0. +function BattleTowerMenu:refuse(text) + self.phase = "message" + self.message = text + self.wait = MESSAGE_FRAMES +end + +-- ../pokecrystal/mobile/mobile_46.asm:1258-1286 `.a_button` +function BattleTowerMenu:confirm() + local row = self.rows[self.cursor] + if not row then + -- ../pokecrystal/mobile/mobile_46.asm:1291-1303 `.asm_118a3c` + self.phase = "quit" + self.message = QUIT_TEXT + self.yes = true + return + end + if BattleTower.levelCheck(self.party, row.group) then + return self:refuse(TOPS_TEXT) + end + local uber = BattleTower.ubersCheck(self.party, row.group) + if uber then + local name = (self.monName and self.monName(uber)) or uber + return self:refuse(string.format(UBER_TEXT, name)) + end + self:finish(row.group) +end + +-- ../pokecrystal/mobile/mobile_46.asm:1240-1256: UP walks the level up and +-- rolls over to the first row, DOWN walks it back and rolls over to CANCEL. +function BattleTowerMenu:updatePick() + local input = self.game and self.game.input + if not input then return end + local count = self:rowCount() + if input:wasPressed("up") then + self.cursor = (self.cursor < count) and self.cursor + 1 or 1 + elseif input:wasPressed("down") then + self.cursor = (self.cursor > 1) and self.cursor - 1 or count + elseif input:wasPressed("a") then + self:playSfx("Sfx_ReadText2") + self:confirm() + elseif input:wasPressed("b") then + self:playSfx("Sfx_ReadText2") + self.phase = "quit" + self.message = QUIT_TEXT + self.yes = true + end +end + +-- ../pokecrystal/mobile/mobile_46.asm:4535-4621 +-- BattleTowerRoomMenu2_UpdateYesNoMenu. +function BattleTowerMenu:updateQuit() + local input = self.game and self.game.input + if not input then return end + if input:wasPressed("up") then + self.yes = true + elseif input:wasPressed("down") then + self.yes = false + elseif input:wasPressed("a") then + self:playSfx("Sfx_ReadText2") + if self.yes then return self:finish(nil) end + self.phase = "pick" + self.message = PICK_TEXT + self.cursor = 1 + elseif input:wasPressed("b") then + self:playSfx("Sfx_ReadText2") + self.phase = "pick" + self.message = PICK_TEXT + self.cursor = 1 + end +end + +function BattleTowerMenu:update(_dt) + if self.done then return end + if self.phase == "message" then + self.wait = (self.wait or 0) - 1 + if self.wait > 0 then return end + self.phase = "pick" + self.message = PICK_TEXT + self.cursor = 1 + return + end + if self.phase == "quit" then return self:updateQuit() end + return self:updatePick() +end + +function BattleTowerMenu:drawPanel() + Chrome.textbox(SAY_X, SAY_Y, SAY_W, SAY_H) + Chrome.printWrapped(self.message, SAY_TEXT_X, SAY_TEXT_Y, SAY_W, SAY_H) + if self.phase == "message" then + love.graphics.setColor(1, 1, 1, 1) + return + end + if self.phase == "quit" then + Chrome.box(YN_X, YN_Y, YN_W, YN_H) + Chrome.print(YES_LABEL, YN_TEXT_X, YES_Y) + Chrome.print(NO_LABEL, YN_TEXT_X, NO_Y) + Chrome.cursor(YN_TEXT_X - 1, self.yes and YES_Y or NO_Y) + love.graphics.setColor(1, 1, 1, 1) + return + end + Chrome.box(PICK_X, PICK_Y, PICK_W, PICK_H) + local row = self.rows[self.cursor] + Chrome.print(row and BattleTowerMenu.levelLabel(row.group) or CANCEL_LABEL, + ROW_X, ROW_Y) + Chrome.print(UP_ARROW, ARROW_X, UP_Y) + Chrome.print(DOWN_ARROW, ARROW_X, DOWN_Y) + love.graphics.setColor(1, 1, 1, 1) +end + +function BattleTowerMenu:draw() + self:drawPanel() +end + +return BattleTowerMenu diff --git a/src/ui/gen2/BuenaPassword.lua b/src/ui/gen2/BuenaPassword.lua new file mode 100644 index 00000000..c60adc9f --- /dev/null +++ b/src/ui/gen2/BuenaPassword.lua @@ -0,0 +1,170 @@ +-- Buena's two windows, Crystal only, chosen by `mode`: +-- +-- password ../pokecrystal/engine/events/buena.asm:1 BuenasPassword, whose +-- .MenuHeader is `menu_coords 0, 0, 10, 7` with the right edge +-- moved to left + the category's points byte + 2 (:9-12), and +-- whose .PasswordIndices answer is zero based (:44-49). +-- prize :64 BuenaPrize -- Buena_PlacePrizeMenuBox (:219), +-- Buena_PrizeMenu's scrolling list (:249-261) and +-- PrintBlueCardBalance's "Points" box (:210). 0 is a B press +-- (:236-245). +-- +-- Neither is opaque: engine/events/buena.asm:71-83 prints the prize question +-- BEFORE the list goes up over it, and the password menu stands on the map. + +local Chrome = require("src.ui.gen2.Chrome") +local Sound = require("src.core.Sound") +local Strings = require("src.core.Strings") + +local BuenaPassword = {} +BuenaPassword.__index = BuenaPassword +BuenaPassword.isOpaque = false + +-- GetMenuTextStartCoord (../pokecrystal/home/menu.asm:214) on STATICMENU_CURSOR +-- with no STATICMENU_NO_TOP_SPACING: labels at box + (2,2), cursor one left. +local WORD_X, WORD_Y, WORD_SPACING = 2, 2, 2 +local WORD_BOX_H = 8 + +-- engine/events/buena.asm:219 and :249, as menu_coords lays them down. +local FIELD_X, FIELD_Y, FIELD_W, FIELD_H = 0, 0, 18, 12 +local LIST_BOX_X, LIST_BOX_Y, LIST_BOX_W, LIST_BOX_H = 1, 1, 16, 9 +local LIST_X, LIST_Y, LIST_SPACING = 2, 2, 2 +-- ScrollingMenu_CallFunctions1and2's `add hl, de` on +-- wMenuData_ScrollingMenuWidth (engine/menus/scrolling_menu.asm:424-431). +local POINTS_X = LIST_X + 13 +local VISIBLE_ROWS = 4 +local ARROW_X = LIST_BOX_X + LIST_BOX_W - 1 +local ARROW_UP_Y, ARROW_DOWN_Y = LIST_BOX_Y, LIST_BOX_Y + LIST_BOX_H - 1 + +-- BlueCardBalanceMenuHeader (engine/events/buena.asm:208) and .DrawBox's +-- PlaceString / two spaces / `lb bc, 1, 2` PrintNum (:181-203). +local BALANCE_BOX_X, BALANCE_BOX_Y, BALANCE_BOX_W, BALANCE_BOX_H = 0, 11, 12, 3 +local BALANCE_LABEL_X, BALANCE_LABEL_Y = 1, 12 +local BALANCE_NUM_X = 8 +local POINTS_LABEL = Strings.source("Points") + +local UP_ARROW = "\xe2\x96\xb2" +local DOWN_ARROW = "\xe2\x96\xbc" + +-- opts: mode, and then words/width/onDone(0..2) or prizes/balance/onDone(row) +function BuenaPassword.new(game, opts) + opts = opts or {} + local self = setmetatable({}, BuenaPassword) + self.game = game + self.data = (game and game.data) or {} + self.mode = opts.mode == "prize" and "prize" or "password" + self.words = opts.words or {} + self.width = math.max(1, math.floor(tonumber(opts.width) or 10)) + self.prizes = opts.prizes or {} + self.balance = math.max(0, math.floor(tonumber(opts.balance) or 0)) + self.onDone = opts.onDone + -- engine/events/buena.asm:34 `db 1 ; default option` and :67-68 + -- `ld a, $1 / ld [wMenuSelection], a`. + self.index = 1 + self.scroll = 0 + return self +end + +function BuenaPassword:wantsFillScale() return true end + +function BuenaPassword:count() + if self.mode == "prize" then return #self.prizes end + return #self.words +end + +function BuenaPassword:playSfx(name) + local sfx = self.data.audio and self.data.audio.sfx + if sfx and sfx[Sound.resolve(self.data, name)] then + Sound.play(self.data, name) + end +end + +function BuenaPassword:finish(value) + if self.done then return end + self.done = true + local stack = self.game and self.game.stack + if stack then stack:pop() end + if self.onDone then self.onDone(value) end +end + +function BuenaPassword:ensureVisible() + local rows = math.min(VISIBLE_ROWS, self:count()) + if rows <= 0 then return end + if self.index <= self.scroll then + self.scroll = self.index - 1 + elseif self.index > self.scroll + rows then + self.scroll = self.index - rows + end + self.scroll = math.max(0, math.min(self.scroll, self:count() - rows)) +end + +function BuenaPassword:update(_dt) + if self.done then return end + local input = self.game and self.game.input + if not input then return end + local total = self:count() + if total <= 0 then return self:finish(self.mode == "prize" and 0 or -1) end + -- Neither header sets STATICMENU_WRAP (engine/events/buena.asm:39, :256). + if input:wasPressed("up") then + if self.index > 1 then self.index = self.index - 1 end + elseif input:wasPressed("down") then + if self.index < total then self.index = self.index + 1 end + elseif input:wasPressed("a") then + self:playSfx("Sfx_ReadText2") + if self.mode == "prize" then return self:finish(self.index) end + -- engine/events/buena.asm:44-49 .PasswordIndices is zero based. + return self:finish(self.index - 1) + elseif input:wasPressed("b") then + -- STATICMENU_DISABLE_B (engine/events/buena.asm:39). + if self.mode == "prize" then + self:playSfx("Sfx_ReadText2") + return self:finish(0) + end + end + self:ensureVisible() +end + +function BuenaPassword:drawPasswordPanel() + Chrome.box(0, 0, self.width + 3, WORD_BOX_H) + for i, word in ipairs(self.words) do + local ty = WORD_Y + (i - 1) * WORD_SPACING + if i == self.index then Chrome.cursor(WORD_X - 1, ty) end + Chrome.print(word, WORD_X, ty) + end +end + +function BuenaPassword:drawPrizePanel() + Chrome.box(FIELD_X, FIELD_Y, FIELD_W, FIELD_H) + Chrome.box(LIST_BOX_X, LIST_BOX_Y, LIST_BOX_W, LIST_BOX_H) + for row = 1, VISIBLE_ROWS do + local i = row + self.scroll + local prize = self.prizes[i] + if prize then + local ty = LIST_Y + (row - 1) * LIST_SPACING + if i == self.index then Chrome.cursor(LIST_X - 1, ty) end + Chrome.print(prize.name, LIST_X, ty) + -- .PrintPrizePoints writes one char, `'0' + cost` (buena.asm:281-289). + Chrome.print(tostring(prize.cost % 10), POINTS_X, ty) + end + end + -- SCROLLINGMENU_DISPLAY_ARROWS: the ▲ only once scrolled, the ▼ every pass + -- (engine/menus/scrolling_menu.asm:348-358, :387-395). + if self.scroll > 0 then Chrome.print(UP_ARROW, ARROW_X, ARROW_UP_Y) end + Chrome.print(DOWN_ARROW, ARROW_X, ARROW_DOWN_Y) + + Chrome.box(BALANCE_BOX_X, BALANCE_BOX_Y, BALANCE_BOX_W, BALANCE_BOX_H) + Chrome.print(Strings(POINTS_LABEL), BALANCE_LABEL_X, BALANCE_LABEL_Y) + Chrome.print(Chrome.number(self.balance, 2), BALANCE_NUM_X, BALANCE_LABEL_Y) +end + +function BuenaPassword:drawPanel() + if self.mode == "prize" then return self:drawPrizePanel() end + return self:drawPasswordPanel() +end + +function BuenaPassword:draw() + self:drawPanel() + love.graphics.setColor(1, 1, 1, 1) +end + +return BuenaPassword diff --git a/src/ui/gen2/CrystalIntro.lua b/src/ui/gen2/CrystalIntro.lua new file mode 100644 index 00000000..7f14ecef --- /dev/null +++ b/src/ui/gen2/CrystalIntro.lua @@ -0,0 +1,1282 @@ +-- The Crystal intro movie (pokecrystal engine/movie/intro.asm CrystalIntro), +-- transcribed: the 28-entry scene jumptable stepped once per frame +-- (engine/movie/intro.asm:58-94) over hSCX/hSCY, the two intro counters, live +-- wBGPals2 palettes and a real 32x32 BG map with CGB attributes. +-- Any button skips the whole thing (engine/movie/intro.asm:11-15). + +local bit = require("bit") + +local Assets = require("src.render.Assets") +local Chrome = require("src.ui.gen2.Chrome") +local GbcPalette = require("src.render.GbcPalette") +local Logger = require("src.core.Logger") +local Music = require("src.core.Music") +local Runtime = require("src.mods.Runtime") +local Sound = require("src.core.Sound") +local SpriteAnims = require("src.ui.gen2.SpriteAnims") + +local CrystalIntro = {} +CrystalIntro.__index = CrystalIntro +CrystalIntro.isOpaque = true + +local SCREEN_W, SCREEN_H = 160, 144 +local BG_TILES = 32 +local BG_PIXELS = BG_TILES * 8 + +local INTRO_MUSIC = "Music_CrystalOpening" + +local BLACK = { 0, 0, 0 } +local WHITE = { 255, 255, 255 } + +local OAM_PRIO = SpriteAnims.OAM_PRIO +local OAM_XFLIP = SpriteAnims.OAM_XFLIP +local OAM_YFLIP = SpriteAnims.OAM_YFLIP +-- OAM_BANK1 (constants/hardware.inc:997). +local OAM_BANK1 = 0x08 + +-------------------------------------------------------------------------- +-- Sprite-anim data, registered into SpriteAnims' shared tables +-------------------------------------------------------------------------- + +-- dbsprite (macros/gfx.asm:67-70): y byte first, tile counts mod $100. +local function s(xTile, yTile, xPixel, yPixel, tile, attr) + return { + y = (yTile * 8 + yPixel) % 256, + x = (xTile * 8 + xPixel) % 256, + tile = tile, + attr = attr, + } +end + +-- data/sprite_anims/oam.asm:815-852 .OAMData_IntroSuicune1. +local SUICUNE_1 = { + s( 1, -3, 0, 0, 0x05, 0), s( 2, -3, 0, 0, 0x06, 0), s( 3, -3, 0, 0, 0x07, 0), + s(-3, -2, 0, 0, 0x11, 0), s(-2, -2, 0, 0, 0x12, 0), s(-1, -2, 0, 0, 0x13, 0), + s( 0, -2, 0, 0, 0x14, 0), s( 1, -2, 0, 0, 0x15, 0), s( 2, -2, 0, 0, 0x16, 0), + s( 3, -2, 0, 0, 0x17, 0), + s(-4, -1, 0, 0, 0x20, 0), s(-3, -1, 0, 0, 0x21, 0), s(-2, -1, 0, 0, 0x22, 0), + s(-1, -1, 0, 0, 0x23, 0), s( 0, -1, 0, 0, 0x24, 0), s( 1, -1, 0, 0, 0x25, 0), + s( 2, -1, 0, 0, 0x26, 0), s( 3, -1, 0, 0, 0x27, 0), + s(-4, 0, 0, 0, 0x30, 0), s(-3, 0, 0, 0, 0x31, 0), s(-2, 0, 0, 0, 0x32, 0), + s(-1, 0, 0, 0, 0x33, 0), s( 0, 0, 0, 0, 0x34, 0), s( 1, 0, 0, 0, 0x35, 0), + s( 2, 0, 0, 0, 0x36, 0), + s(-4, 1, 0, 0, 0x40, 0), s(-3, 1, 0, 0, 0x41, 0), s(-2, 1, 0, 0, 0x42, 0), + s(-1, 1, 0, 0, 0x43, 0), s( 0, 1, 0, 0, 0x44, 0), s( 1, 1, 0, 0, 0x45, 0), + s( 2, 1, 0, 0, 0x46, 0), s( 3, 1, 0, 0, 0x47, 0), + s(-4, 2, 0, 0, 0x50, 0), s(-3, 2, 0, 0, 0x51, 0), s( 3, 2, 0, 0, 0x57, 0), +} + +-- data/sprite_anims/oam.asm:854-883 .OAMData_IntroSuicune2. +local SUICUNE_2 = { + s( 0, -3, 0, 0, 0x04, 0), s( 1, -3, 0, 0, 0x05, 0), s( 2, -3, 0, 0, 0x06, 0), + s(-3, -2, 0, 0, 0x11, 0), s(-2, -2, 0, 0, 0x12, 0), s(-1, -2, 0, 0, 0x13, 0), + s( 0, -2, 0, 0, 0x14, 0), s( 1, -2, 0, 0, 0x15, 0), s( 2, -2, 0, 0, 0x16, 0), + s(-3, -1, 0, 0, 0x21, 0), s(-2, -1, 0, 0, 0x22, 0), s(-1, -1, 0, 0, 0x23, 0), + s( 0, -1, 0, 0, 0x24, 0), s( 1, -1, 0, 0, 0x25, 0), s( 2, -1, 0, 0, 0x26, 0), + s(-4, 0, 0, 0, 0x30, 0), s(-3, 0, 0, 0, 0x31, 0), s(-2, 0, 0, 0, 0x32, 0), + s(-1, 0, 0, 0, 0x33, 0), s( 0, 0, 0, 0, 0x34, 0), s( 1, 0, 0, 0, 0x35, 0), + s(-2, 1, 0, 0, 0x42, 0), s(-1, 1, 0, 0, 0x43, 0), s( 0, 1, 0, 0, 0x44, 0), + s( 1, 1, 0, 0, 0x45, 0), + s(-1, 2, 0, 0, 0x53, 0), s( 0, 2, 0, 0, 0x54, 0), s( 1, 2, 0, 0, 0x55, 0), +} + +-- data/sprite_anims/oam.asm:885-916 .OAMData_IntroSuicune3. +local SUICUNE_3 = { + s( 0, -3, 0, 0, 0x04, 0), s( 1, -3, 0, 0, 0x05, 0), + s(-3, -2, 0, 0, 0x11, 0), s(-2, -2, 0, 0, 0x12, 0), s(-1, -2, 0, 0, 0x13, 0), + s( 0, -2, 0, 0, 0x14, 0), s( 1, -2, 0, 0, 0x15, 0), s( 2, -2, 0, 0, 0x16, 0), + s( 3, -2, 0, 0, 0x17, 0), + s(-4, -1, 0, 0, 0x20, 0), s(-3, -1, 0, 0, 0x21, 0), s(-2, -1, 0, 0, 0x22, 0), + s(-1, -1, 0, 0, 0x23, 0), s( 0, -1, 0, 0, 0x24, 0), s( 1, -1, 0, 0, 0x25, 0), + s( 2, -1, 0, 0, 0x26, 0), + s(-4, 0, 0, 0, 0x30, 0), s(-3, 0, 0, 0, 0x31, 0), s(-2, 0, 0, 0, 0x32, 0), + s(-1, 0, 0, 0, 0x33, 0), s( 0, 0, 0, 0, 0x34, 0), s( 1, 0, 0, 0, 0x35, 0), + s(-2, 1, 0, 0, 0x42, 0), s(-1, 1, 0, 0, 0x43, 0), s( 0, 1, 0, 0, 0x44, 0), + s( 1, 1, 0, 0, 0x45, 0), + s(-2, 2, 0, 0, 0x52, 0), s(-1, 2, 0, 0, 0x53, 0), s( 0, 2, 0, 0, 0x54, 0), + s( 1, 2, 0, 0, 0x55, 0), +} + +-- data/sprite_anims/oam.asm:918-950 .OAMData_IntroSuicune4. +local SUICUNE_4 = { + s(-3, -2, 0, 0, 0x11, 0), s(-2, -2, 0, 0, 0x12, 0), s(-1, -2, 0, 0, 0x13, 0), + s( 0, -2, 0, 0, 0x14, 0), s( 1, -2, 0, 0, 0x15, 0), s( 2, -2, 0, 0, 0x16, 0), + s( 3, -2, 0, 0, 0x17, 0), + s(-4, -1, 0, 0, 0x20, 0), s(-3, -1, 0, 0, 0x21, 0), s(-2, -1, 0, 0, 0x22, 0), + s(-1, -1, 0, 0, 0x23, 0), s( 0, -1, 0, 0, 0x24, 0), s( 1, -1, 0, 0, 0x25, 0), + s( 2, -1, 0, 0, 0x26, 0), s( 3, -1, 0, 0, 0x27, 0), + s(-4, 0, 0, 0, 0x30, 0), s(-3, 0, 0, 0, 0x31, 0), s(-2, 0, 0, 0, 0x32, 0), + s(-1, 0, 0, 0, 0x33, 0), s( 0, 0, 0, 0, 0x34, 0), s( 1, 0, 0, 0, 0x35, 0), + s( 2, 0, 0, 0, 0x36, 0), + s(-3, 1, 0, 0, 0x41, 0), s(-2, 1, 0, 0, 0x42, 0), s(-1, 1, 0, 0, 0x43, 0), + s( 0, 1, 0, 0, 0x44, 0), s( 1, 1, 0, 0, 0x45, 0), + s(-3, 2, 0, 0, 0x51, 0), s(-2, 2, 0, 0, 0x52, 0), s( 0, 2, 0, 0, 0x54, 0), + s( 1, 2, 0, 0, 0x55, 0), +} + +-- data/sprite_anims/oam.asm:952-978 .OAMData_IntroPichu: 5x5 block, +-- OBJ pal 1, VRAM bank 1. +local PICHU = {} +for row = 0, 4 do + for col = 0, 4 do + PICHU[#PICHU + 1] = s(col - 3, row - 3, 4, 4, row * 16 + col, + 1 + OAM_BANK1) + end +end + +-- data/sprite_anims/oam.asm:980-997 .OAMData_IntroWooper: 4x4 block, +-- OBJ pal 2, VRAM bank 1. +local WOOPER = {} +for row = 0, 3 do + for col = 0, 3 do + WOOPER[#WOOPER + 1] = s(col - 3, row - 2, 4, 0, row * 4 + col, + 2 + OAM_BANK1) + end +end + +-- data/sprite_anims/oam.asm:999-1017 .OAMData_IntroUnown1/2/3. +local UNOWN_1 = { s(-1, -1, 4, 4, 0x00, 0) } +local UNOWN_2 = { + s(-1, 0, 0, 0, 0x00, 0), s(-1, -1, 0, 0, 0x01, 0), s( 0, -1, 0, 0, 0x02, 0), +} +local UNOWN_3 = { + s(-2, 1, 0, 0, 0x00, 0), s(-2, 0, 0, 0, 0x01, 0), s(-2, -1, 0, 0, 0x02, 0), + s(-1, -1, 0, 0, 0x03, 0), s(-1, -2, 0, 0, 0x04, 0), s( 0, -2, 0, 0, 0x05, 0), + s( 1, -2, 0, 0, 0x06, 0), +} + +-- data/sprite_anims/oam.asm:177-182 .OAMData_IntroUnownF2_1. +local UNOWN_F2_1 = { + s(-1, -1, 0, 0, 0x00, 0), s( 0, -1, 0, 0, 0x00, OAM_XFLIP), + s(-1, 0, 0, 0, 0x00, OAM_YFLIP), s( 0, 0, 0, 0, 0x00, OAM_XFLIP + OAM_YFLIP), +} + +-- data/sprite_anims/oam.asm:1019-1028 .OAMData_IntroUnownF2_2. +local UNOWN_F2_2 = { + s(-2, -1, 0, 0, 0x00, 0), s(-1, -1, 0, 0, 0x01, 0), + s( 0, -1, 0, 0, 0x01, OAM_XFLIP), s( 1, -1, 0, 0, 0x00, OAM_XFLIP), + s(-2, 0, 0, 0, 0x00, OAM_YFLIP), s(-1, 0, 0, 0, 0x01, OAM_YFLIP), + s( 0, 0, 0, 0, 0x01, OAM_XFLIP + OAM_YFLIP), + s( 1, 0, 0, 0, 0x00, OAM_XFLIP + OAM_YFLIP), +} + +-- data/sprite_anims/oam.asm:1030-1043 .OAMData_IntroUnownF2_3. +local UNOWN_F2_3 = { + s(-1, -3, 0, 0, 0x00, 0), s(-1, -2, 0, 0, 0x01, 0), s(-1, -1, 0, 0, 0x02, 0), + s( 0, -3, 0, 0, 0x00, OAM_XFLIP), s( 0, -2, 0, 0, 0x01, OAM_XFLIP), + s( 0, -1, 0, 0, 0x02, OAM_XFLIP), + s(-1, 0, 0, 0, 0x02, OAM_YFLIP), s(-1, 1, 0, 0, 0x01, OAM_YFLIP), + s(-1, 2, 0, 0, 0x00, OAM_YFLIP), + s( 0, 0, 0, 0, 0x02, OAM_XFLIP + OAM_YFLIP), + s( 0, 1, 0, 0, 0x01, OAM_XFLIP + OAM_YFLIP), + s( 0, 2, 0, 0, 0x00, OAM_XFLIP + OAM_YFLIP), +} + +-- data/sprite_anims/oam.asm:1045-1066 .OAMData_IntroUnownF2_4_5: 4x5 block. +local UNOWN_F2_45 = {} +for row = 0, 4 do + for col = 0, 3 do + UNOWN_F2_45[#UNOWN_F2_45 + 1] = s(col - 2, row - 3, 0, 4, row * 4 + col, 0) + end +end + +-- data/sprite_anims/oam.asm:1068-1089 .OAMData_IntroSuicuneAway: a zigzag of +-- twenty grass tiles, OBJ pal 1, behind the BG. +local AWAY = {} +do + local ys = { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1 } + for index, y in ipairs(ys) do + AWAY[#AWAY + 1] = s(index, y, 0, 0, 0x00, 1 + OAM_PRIO) + end + local tail = { { -15, 0 }, { -14, 1 }, { -13, 2 }, { -12, 3 } } + for _, spot in ipairs(tail) do + AWAY[#AWAY + 1] = s(spot[1], spot[2], 0, 0, 0x00, 1 + OAM_PRIO) + end +end + +-- spriteanimoam bases (data/sprite_anims/oam.asm:120-136). +local OAMSETS = { + INTRO_SUICUNE_1 = { 0x00, SUICUNE_1 }, + INTRO_SUICUNE_2 = { 0x08, SUICUNE_2 }, + INTRO_SUICUNE_3 = { 0x60, SUICUNE_3 }, + INTRO_SUICUNE_4 = { 0x68, SUICUNE_4 }, + INTRO_PICHU_1 = { 0x00, PICHU }, + INTRO_PICHU_2 = { 0x05, PICHU }, + INTRO_PICHU_3 = { 0x0a, PICHU }, + INTRO_WOOPER = { 0x50, WOOPER }, + INTRO_UNOWN_1 = { 0x00, UNOWN_1 }, + INTRO_UNOWN_2 = { 0x01, UNOWN_2 }, + INTRO_UNOWN_3 = { 0x04, UNOWN_3 }, + INTRO_UNOWN_F_2_1 = { 0x00, UNOWN_F2_1 }, + INTRO_UNOWN_F_2_2 = { 0x01, UNOWN_F2_2 }, + INTRO_UNOWN_F_2_3 = { 0x03, UNOWN_F2_3 }, + INTRO_UNOWN_F_2_4 = { 0x08, UNOWN_F2_45 }, + INTRO_UNOWN_F_2_5 = { 0x1c, UNOWN_F2_45 }, + INTRO_SUICUNE_AWAY = { 0x80, AWAY }, +} + +local function f(oamset, duration, flags) + return { oamset = oamset, duration = duration, flags = flags or 0 } +end + +-- data/sprite_anims/framesets.asm:429-489. +local FRAMESETS = { + IntroSuicune = { + f("INTRO_SUICUNE_1", 3), f("INTRO_SUICUNE_2", 3), + f("INTRO_SUICUNE_3", 3), f("INTRO_SUICUNE_4", 3), "restart", + }, + IntroSuicune2 = { f("INTRO_SUICUNE_4", 3), f("INTRO_SUICUNE_1", 7), "end" }, + IntroPichu = { + f("INTRO_PICHU_1", 32), f("INTRO_PICHU_2", 7), f("INTRO_PICHU_3", 7), "end", + }, + IntroWooper = { f("INTRO_WOOPER", 3), "end" }, + IntroUnown1 = { + f("INTRO_UNOWN_1", 3), f("INTRO_UNOWN_2", 3), f("INTRO_UNOWN_3", 7), + f("delete", 0), + }, + IntroUnown2 = { + f("INTRO_UNOWN_1", 3, OAM_XFLIP), f("INTRO_UNOWN_2", 3, OAM_XFLIP), + f("INTRO_UNOWN_3", 7, OAM_XFLIP), f("delete", 0), + }, + IntroUnown3 = { + f("INTRO_UNOWN_1", 3, OAM_YFLIP), f("INTRO_UNOWN_2", 3, OAM_YFLIP), + f("INTRO_UNOWN_3", 7, OAM_YFLIP), f("delete", 0), + }, + IntroUnown4 = { + f("INTRO_UNOWN_1", 3, OAM_XFLIP + OAM_YFLIP), + f("INTRO_UNOWN_2", 3, OAM_XFLIP + OAM_YFLIP), + f("INTRO_UNOWN_3", 7, OAM_XFLIP + OAM_YFLIP), f("delete", 0), + }, + IntroUnownF2 = { + f("INTRO_UNOWN_F_2_1", 3), f("INTRO_UNOWN_F_2_2", 3), + f("INTRO_UNOWN_F_2_3", 3), f("INTRO_UNOWN_F_2_4", 7), + f("INTRO_UNOWN_F_2_5", 7), "end", + }, + IntroSuicuneAway = { f("INTRO_SUICUNE_AWAY", 3), "end" }, + IntroUnownF = { f("wait", 0), "end" }, +} + +local function reinit(st, framesetId) + st.framesetId = framesetId + st.duration = 0 + st.frame = -1 +end + +local SEQUENCES = {} + +-- SpriteAnimFunc_IntroSuicune (engine/sprite_anims/functions.asm:750-776): +-- idle while wIntroSceneTimer is 0, then the jump arc on a negated sine. +SEQUENCES.IntroSuicune = function(sys, st) + if (sys.timer or 0) == 0 then return end + st.yOffset = 0 + st.var2 = (st.var2 + 2) % 256 + st.yOffset = SpriteAnims.sine((256 - st.var2) % 256, 32) + reinit(st, "IntroSuicune2") +end + +-- SpriteAnimFunc_IntroPichuWooper (engine/sprite_anims/functions.asm:778-795). +SEQUENCES.IntroPichuWooper = function(_, st) + if st.var1 >= 20 then return end + st.var1 = st.var1 + 2 + st.yOffset = SpriteAnims.sine((256 - st.var1) % 256, 32) +end + +-- SpriteAnimFunc_IntroUnown (engine/sprite_anims/functions.asm:797-821): +-- circle at radius VAR1, three sine steps per frame. +SEQUENCES.IntroUnown = function(_, st) + local angle = st.jt + st.jt = (st.jt + 3) % 256 + st.yOffset = SpriteAnims.sine(angle, st.var1) + st.xOffset = SpriteAnims.cosine(angle, st.var1) +end + +-- SpriteAnimFunc_IntroUnownF (engine/sprite_anims/functions.asm:823-829): +-- wSlotsDelay aliases wIntroSceneFrameCounter (ram/wram.asm:1602,1649). +SEQUENCES.IntroUnownF = function(sys, st) + if (sys.counter or 0) ~= 0x40 then return end + reinit(st, "IntroUnownF2") +end + +-- SpriteAnimFunc_IntroSuicuneAway (engine/sprite_anims/functions.asm:831-837). +SEQUENCES.IntroSuicuneAway = function(_, st) + st.y = (st.y + 16) % 256 +end + +-- data/sprite_anims/objects.asm:81-92. +local OBJECTS = { + INTRO_SUICUNE = { "IntroSuicune", "IntroSuicune" }, + INTRO_PICHU = { "IntroPichu", "IntroPichuWooper" }, + INTRO_WOOPER = { "IntroWooper", "IntroPichuWooper" }, + INTRO_UNOWN = { "IntroUnown1", "IntroUnown" }, + INTRO_UNOWN_F = { "IntroUnownF", "IntroUnownF" }, + INTRO_SUICUNE_AWAY = { "IntroSuicuneAway", "IntroSuicuneAway" }, +} + +local function register(target, entries) + for name, value in pairs(entries) do + if target[name] == nil then target[name] = value end + end +end + +register(SpriteAnims.OAMSETS, OAMSETS) +register(SpriteAnims.FRAMESETS, FRAMESETS) +register(SpriteAnims.OBJECTS, OBJECTS) +register(SpriteAnims.SEQUENCES, SEQUENCES) + +-------------------------------------------------------------------------- +-- Palettes +-------------------------------------------------------------------------- + +local function scale31(value) return math.floor(value * 255 / 31 + 0.5) end + +-- CrystalIntro_UnownFade's three 32-step ramps +-- (engine/movie/intro.asm:1312-1328). +local BW_FADE, LBLUE_FADE, BLUE_FADE = {}, {}, {} +for hue = 0, 31 do + BW_FADE[hue + 1] = { scale31(hue), scale31(hue), scale31(hue) } + LBLUE_FADE[hue + 1] = { 0, scale31(math.floor(hue / 2)), scale31(hue) } + BLUE_FADE[hue + 1] = { 0, 0, scale31(hue) } +end + +local function palCopy(source) + local out = {} + for index = 1, 4 do + local color = source and source[index] + out[index] = color and { color[1], color[2], color[3] } or BLACK + end + return out +end + +local function flatPals(color) + local out = {} + for pal = 1, 8 do out[pal] = { color, color, color, color } end + return out +end + +-------------------------------------------------------------------------- +-- Construction +-------------------------------------------------------------------------- + +function CrystalIntro:wantsFillScale() return true end +function CrystalIntro:drawsWidescreen() return true end + +function CrystalIntro.new(game, opts) + opts = opts or {} + local self = setmetatable({}, CrystalIntro) + self.game = game + self.onDone = opts.onDone + local data = (game and game.data) or {} + self.assets = opts.intro or data.gen2Intro or (game and game.introData) or nil + if not (self.assets and self.assets.acts) then + Logger.warn("crystal intro: no intro.lua in the cache -- re-import " + .. "this version or the movie plays blank") + end + self.images = {} + self.sheets = {} + + self.anims = SpriteAnims.new() + self.scene = 1 + self.phase = 0 + self.hold = 0 + self.done = false + self.frames = 0 + + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + self.treeScroll, self.grassScroll = 0, 0 + self.lyActive = false + self.grassFrame = nil + + self.bgPals = flatPals(BLACK) + self.obPals = flatPals(BLACK) + self.map, self.attr = {}, {} + for index = 1, BG_TILES * BG_TILES do + self.map[index] = 0 + self.attr[index] = 0 + end + self.act = nil + self.mapDirty, self.palsDirty = true, true + return self +end + +-------------------------------------------------------------------------- +-- Scene plumbing +-------------------------------------------------------------------------- + +local function actData(self) + local acts = self.assets and self.assets.acts + return acts and self.act and acts[self.act] or nil +end + +-- ClearSpriteAnims zeroes wSpriteAnimData through wGlobalAnimXOffset +-- (engine/sprite_anims/core.asm:1-11, ram/wram.asm:202-272). +local function clearAnims(self) + self.anims:clear() + self.anims.globalX, self.anims.globalY = 0, 0 +end + +local function fades(self) + return (self.assets and self.assets.fades) or {} +end + +local function markDirty(self) + self.palsDirty = true +end + +local function loadAct(self, key) + self.act = key + self.grassFrame = nil + local act = actData(self) + for index = 1, BG_TILES * BG_TILES do + self.map[index] = act and act.tilemap and act.tilemap[index] or 0 + self.attr[index] = act and act.attrmap and act.attrmap[index] or 0 + end + local palettes = act and act.palettes or {} + for pal = 1, 8 do + self.bgPals[pal] = palCopy(palettes.bg and palettes.bg[pal]) + self.obPals[pal] = palCopy(palettes.obj and palettes.obj[pal]) + end + self.mapDirty, self.palsDirty = true, true +end + +-- Intro_ClearBGPals blacks all 16 palettes and burns two frames +-- (engine/movie/intro.asm:1554-1571); IntroScene26 clears to white instead +-- (engine/movie/intro.asm:1058, home/tilemap.asm:168-196). +local function setup(self, white, fn) + if self.phase == 0 then + self.phase = 1 + local color = white and WHITE or BLACK + self.bgPals = flatPals(color) + self.obPals = flatPals(color) + markDirty(self) + self.hold = 1 + return + end + self.phase = 0 + fn(self) + self.scene = self.scene + 1 +end + +function CrystalIntro:playMusic(song) + local data = self.game and self.game.data + local audio = data and data.audio + if audio and audio.runtime and audio.songs and audio.songs[song] then + Music.play(data, song) + end +end + +function CrystalIntro:playSfx(name) + local data = self.game and self.game.data + local audio = data and data.audio + if audio and audio.runtime and audio.sfx and audio.sfx[name] then + Sound.play(data, name) + end +end + +-- CrystalIntro_UnownFade (engine/movie/intro.asm:1231-1310): zero every BG +-- palette, then write the triangle-wave step of the three ramps into colours +-- 1-3 of palette `pal`. +local function unownFade(self, pal, t) + local step = t % 64 + if step > 31 then step = 63 - step end + self.bgPals = flatPals(BLACK) + local target = self.bgPals[pal + 1] + target[2] = BW_FADE[step + 1] + target[3] = LBLUE_FADE[step + 1] + target[4] = BLUE_FADE[step + 1] + markDirty(self) +end + +-- CrystalIntro_InitUnownAnim (engine/movie/intro.asm:1191-1229): four structs +-- at one spot, radii $08/$18/$28/$38, framesets 4/3/1/2. +local UNOWN_SWIRL = { + { 0x08, "IntroUnown4" }, { 0x18, "IntroUnown3" }, + { 0x28, "IntroUnown1" }, { 0x38, "IntroUnown2" }, +} + +local function initUnownAnim(self, x, y) + for _, spec in ipairs(UNOWN_SWIRL) do + local st = self.anims:init("INTRO_UNOWN", x, y) + if st then + st.var1 = spec[1] + reinit(st, spec[2]) + end + end +end + +-- Intro_ResetLYOverrides / Intro_PerspectiveScrollBG +-- (engine/movie/intro.asm:1630-1676): trees on lines 0-94 at half speed, +-- grass on lines 95-143 at double, hSCX following the tree band. +local function resetLYOverrides(self) + self.treeScroll, self.grassScroll = 0, 0 + self.lyActive = true +end + +local function perspectiveScroll(self) + if self.counter % 2 == 1 then + self.treeScroll = (self.treeScroll + 1) % 256 + end + self.grassScroll = (self.grassScroll + 2) % 256 + self.scx = self.treeScroll +end + +-- Intro_RustleGrass (engine/movie/intro.asm:1521-1547): the four tiles at +-- vTiles2 $09 cycle grass1/grass2/grass3/grass2 for the first 36 frames. +local RUSTLE = { 1, 2, 3, 2 } + +local function rustleGrass(self) + if self.counter >= 36 then return end + local frame = RUSTLE[math.floor(self.counter / 4) % 4 + 1] + if frame ~= self.grassFrame then + self.grassFrame = frame + self.mapDirty = true + end +end + +-- Intro_ColoredSuicuneFrameSwap (engine/movie/intro.asm:1500-1519): toggle +-- bit 3 of every non-zero id below $80 in the visible 20x18 window. +local function frameSwap(self) + for row = 0, 17 do + for col = 0, 19 do + local index = row * BG_TILES + col + 1 + local id = self.map[index] + if id ~= 0 and id < 0x80 then + self.map[index] = bit.bxor(id, 8) + end + end + end + self.mapDirty = true +end + +-------------------------------------------------------------------------- +-- Scenes (engine/movie/intro.asm:96-1153) +-------------------------------------------------------------------------- + +local Scenes = {} + +-- IntroScene1 (engine/movie/intro.asm:96-146). +Scenes[1] = function(self) + setup(self, false, function() + loadAct(self, "unownA") + clearAnims(self) + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene2 (engine/movie/intro.asm:148-170). +Scenes[2] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x80 then + self.scene = 3 + return + end + if a == 0x60 then + initUnownAnim(self, 11 * 8, 11 * 8) + self:playSfx("Sfx_IntroUnown1") + end + self.timer = a + unownFade(self, 0, a) +end + +-- IntroScene3 (engine/movie/intro.asm:172-218). +Scenes[3] = function(self) + setup(self, false, function() + loadAct(self, "background") + resetLYOverrides(self) + self.scx, self.scy = 0, 0 + self.counter = 0 + end) +end + +-- IntroScene4 (engine/movie/intro.asm:220-232). +Scenes[4] = function(self) + perspectiveScroll(self) + if self.counter == 0x80 then + self.scene = 5 + return + end + self.counter = (self.counter + 1) % 256 +end + +-- IntroScene5 (engine/movie/intro.asm:234-285). +Scenes[5] = function(self) + setup(self, false, function() + loadAct(self, "unownHI") + self.lyActive = false + clearAnims(self) + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene6 (engine/movie/intro.asm:287-330). +Scenes[6] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x80 then + self.scene = 7 + return + end + if a == 0x60 then + initUnownAnim(self, 6 * 8, 14 * 8) + self:playSfx("Sfx_IntroUnown1") + self.timer = a + unownFade(self, 1, a) + return + end + if a >= 0x40 then + self.timer = a + unownFade(self, 1, a) + return + end + if a == 0x20 then + initUnownAnim(self, 15 * 8, 7 * 8) + self:playSfx("Sfx_IntroUnown2") + end + self.timer = a + unownFade(self, 0, a) +end + +-- IntroScene7 (engine/movie/intro.asm:332-401). +Scenes[7] = function(self) + setup(self, false, function() + loadAct(self, "background") + resetLYOverrides(self) + clearAnims(self) + self.anims:init("INTRO_SUICUNE", 27 * 8, 13 * 8 + 4) + self.anims.globalX = 0xf0 + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene8 (engine/movie/intro.asm:403-430). +Scenes[8] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a == 0x40 then + self:playSfx("Sfx_IntroSuicune3") + elseif a < 0x40 then + perspectiveScroll(self) + return + end + if self.anims.globalX == 0 then + self:playSfx("Sfx_IntroSuicune2") + self.anims:clear() + self.scene = 9 + return + end + self.anims.globalX = (self.anims.globalX - 8) % 256 +end + +-- IntroScene9 (engine/movie/intro.asm:432-467): palette bands over the +-- whole map, six blocking frames. +Scenes[9] = function(self) + self.lyActive = false + for row = 0, 17 do + local pal = (row < 12 and 1) or (row < 15 and 2) or 3 + for col = 0, BG_TILES - 1 do + self.attr[row * BG_TILES + col + 1] = pal + end + end + self.anims.globalX = 0 + self.counter = 0 + self.mapDirty = true + self.hold = 6 + self.scene = 10 +end + +-- IntroScene10 (engine/movie/intro.asm:469-500). +Scenes[10] = function(self) + rustleGrass(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a == 0xc0 then + self.scene = 11 + return + end + if a == 0x20 then + self.anims:init("INTRO_WOOPER", 6 * 8, 22 * 8) + self:playSfx("Sfx_IntroPichu") + elseif a == 0x40 then + self.anims:init("INTRO_PICHU", 16 * 8, 21 * 8 + 1) + self:playSfx("Sfx_IntroPichu") + end +end + +-- IntroScene11 (engine/movie/intro.asm:502-550). +Scenes[11] = function(self) + setup(self, false, function() + loadAct(self, "unowns") + self.lyActive = false + clearAnims(self) + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene12's .UnownSounds (engine/movie/intro.asm:615-624). +local UNOWN_SOUNDS = { + [0x00] = "Sfx_IntroUnown3", [0x20] = "Sfx_IntroUnown2", + [0x40] = "Sfx_IntroUnown1", [0x60] = "Sfx_IntroUnown2", + [0x80] = "Sfx_IntroUnown3", [0x90] = "Sfx_IntroUnown2", + [0xa0] = "Sfx_IntroUnown1", [0xb0] = "Sfx_IntroUnown2", +} + +-- IntroScene12 (engine/movie/intro.asm:552-613). +Scenes[12] = function(self) + local a = self.counter + local sound = UNOWN_SOUNDS[a] + if sound then self:playSfx(sound) end + self.counter = (a + 1) % 256 + if a >= 0xc0 then + self.scene = 13 + return + end + if a < 0x80 then + self.timer = (a % 0x20) * 2 + unownFade(self, math.floor(a / 0x20), self.timer) + else + self.timer = (a % 0x10) * 4 + unownFade(self, 4 + math.floor((a - 0x80) / 0x10), self.timer) + end +end + +-- IntroScene13 (engine/movie/intro.asm:626-683). +Scenes[13] = function(self) + setup(self, false, function() + loadAct(self, "background") + clearAnims(self) + self.anims:init("INTRO_SUICUNE", 11 * 8, 13 * 8 + 4) + self:playMusic(INTRO_MUSIC) + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene14 (engine/movie/intro.asm:685-728). +Scenes[14] = function(self) + self.scx = (self.scx - 10) % 256 + local a = self.counter + self.counter = (a + 1) % 256 + if a == 0x80 then + self.scene = 15 + return + end + if a == 0x60 then + self:playSfx("Sfx_IntroSuicune4") + end + if a >= 0x60 then + self.timer = 1 + local gx = self.anims.globalX + if gx < 0x88 then + self.anims:clear() + else + self.anims.globalX = (gx - 8) % 256 + end + elseif a >= 0x40 then + self.anims.globalX = (self.anims.globalX - 2) % 256 + end +end + +-- IntroScene15 (engine/movie/intro.asm:730-792). +Scenes[15] = function(self) + setup(self, false, function() + loadAct(self, "suicuneJump") + clearAnims(self) + self.anims:init("INTRO_UNOWN_F", 5 * 8, 8 * 8) + self.anims:init("INTRO_SUICUNE_AWAY", 0, 12 * 8) + self.scx, self.scy = 0, SCREEN_H + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene16 (engine/movie/intro.asm:794-810). +Scenes[16] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x80 then + self.scene = 17 + return + end + if a % 4 == 0 then frameSwap(self) end + if self.scy ~= 0 then + self.scy = (self.scy + 8) % 256 + end +end + +-- IntroScene17 (engine/movie/intro.asm:812-859). +Scenes[17] = function(self) + setup(self, false, function() + loadAct(self, "suicuneClose") + clearAnims(self) + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene18 (engine/movie/intro.asm:861-876). +Scenes[18] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x60 then + self.scene = 19 + return + end + if self.scx ~= 0x60 then + self.scx = (self.scx + 8) % 256 + end +end + +-- IntroScene19 (engine/movie/intro.asm:878-941). +Scenes[19] = function(self) + setup(self, false, function() + loadAct(self, "suicuneBack") + clearAnims(self) + self.anims:init("INTRO_SUICUNE_AWAY", 0, 12 * 8) + self.scx, self.scy = 0, (-5 * 8) % 256 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene20 (engine/movie/intro.asm:943-988). +Scenes[20] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x98 then + self.scene = 21 + return + end + if a >= 0x58 then return end + if a >= 0x40 then + local b = a - 0x18 + if b % 4 == 3 then + local slot = math.floor(b % 0x20 / 4) + self.timer = slot + self.bgPals[slot + 1] = palCopy(fades(self).unownAppear) + markDirty(self) + end + return + end + if a >= 0x28 then return end + self.scy = (self.scy + 1) % 256 +end + +-- IntroScene21 (engine/movie/intro.asm:990-1000). +Scenes[21] = function(self) + frameSwap(self) + self.hold = 3 + self.counter, self.timer = 0, 0 + self.scene = 22 +end + +-- IntroScene22 (engine/movie/intro.asm:1002-1012). +Scenes[22] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x8 then + self.anims:clear() + self.scene = 23 + end +end + +-- IntroScene23 (engine/movie/intro.asm:1014-1018). +Scenes[23] = function(self) + self.counter = 0 + self.scene = 24 +end + +-- IntroScene24 (engine/movie/intro.asm:1020-1042). +Scenes[24] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x20 then + self.counter = 0x40 + self.scene = 25 + return + end + if a % 4 ~= 0 then return end + local toWhite = fades(self).toWhite + local pal = toWhite and toWhite[math.floor(a % 0x20 / 4) + 1] + if not pal then return end + for slot = 1, 8 do + self.bgPals[slot] = palCopy(pal) + end + markDirty(self) +end + +-- IntroScene25 (engine/movie/intro.asm:1044-1054). +Scenes[25] = function(self) + if self.counter - 1 == 0 then + self.scene = 26 + return + end + self.counter = self.counter - 1 +end + +-- IntroScene26 (engine/movie/intro.asm:1056-1103). +Scenes[26] = function(self) + setup(self, true, function() + loadAct(self, "crystalUnowns") + clearAnims(self) + self.scx, self.scy = 0, 0 + self.counter, self.timer = 0, 0 + end) +end + +-- IntroScene27 / Intro_FadeUnownWordPals +-- (engine/movie/intro.asm:1105-1128, :1390-1455). +Scenes[27] = function(self) + local a = self.counter + self.counter = (a + 1) % 256 + if a >= 0x80 then + self.scene = 28 + self.counter = 0x80 + return + end + local t = a % 0x10 + local pal = math.floor(a % 0x80 / 0x10) + local fade = fades(self) + local target = self.bgPals[pal + 1] + if fade.wordFast and fade.wordFast[t + 1] then + target[3] = { unpack(fade.wordFast[t + 1]) } + end + if fade.wordSlow and fade.wordSlow[t + 1] then + target[4] = { unpack(fade.wordSlow[t + 1]) } + end + markDirty(self) +end + +-- IntroScene28 (engine/movie/intro.asm:1130-1153). +Scenes[28] = function(self) + local a = self.counter + if a == 0 then + self.done = true + return + end + self.counter = a - 1 + if a == 0x18 then + self.bgPals = flatPals(WHITE) + self.obPals = flatPals(WHITE) + markDirty(self) + elseif a == 0x8 then + self:playSfx("Sfx_IntroWhoosh") + end +end + +-------------------------------------------------------------------------- +-- Frame loop +-------------------------------------------------------------------------- + +-- CrystalIntro's .loop: the scene function, then PlaySpriteAnimations, then +-- DelayFrame (engine/movie/intro.asm:11-22); in-scene DelayFrames hold the +-- sprites still, so a pending `hold` skips the anim step. +function CrystalIntro:step() + if self.done then return true end + self.frames = self.frames + 1 + if self.hold > 0 then + self.hold = self.hold - 1 + return false + end + local scene = Scenes[self.scene] + if scene then scene(self) end + if self.done then return true end + if self.hold > 0 then return false end + self.anims.timer = self.timer + self.anims.counter = self.counter + self.anims:playFrame() + return self.done +end + +function CrystalIntro:enter() + if Runtime.wants("intro.boot.movie") then + Runtime.emit("intro.boot.movie", { screen = self, game = self.game }) + end +end + +function CrystalIntro:finish() + if self.finished then return end + self.finished = true + self.done = true + if Runtime.wants("intro.boot.movie_ended") then + Runtime.emit("intro.boot.movie_ended", { + screen = self, game = self.game, + skipped = self.skipped and true or false, + frames = self.frames, + }) + end + if self.onDone then self.onDone() end +end + +-- .ShutOffMusic (engine/movie/intro.asm:24-26). +function CrystalIntro:skip() + self.skipped = true + Music.stop() + self:finish() +end + +function CrystalIntro:update(_dt) + if self.finished then return end + local input = self.game and self.game.input + if input then + for _, button in ipairs({ "a", "b", "start", "select" }) do + if input:wasPressed(button) then + self:skip() + return + end + end + end + if self:step() then self:finish() end +end + +-------------------------------------------------------------------------- +-- Drawing +-------------------------------------------------------------------------- + +function CrystalIntro:image(path) + if not path then return nil end + local cached = self.images[path] + if cached == nil then + local ok, img = pcall(Assets.image, path) + cached = ok and img or false + if cached then + cached:setFilter("nearest", "nearest") + end + self.images[path] = cached + end + return cached or nil +end + +function CrystalIntro:sheet(path) + if not path then return nil end + local entry = self.sheets[path] + if entry ~= nil then return entry or nil end + local image = self:image(path) + if not image then + self.sheets[path] = false + return nil + end + local width, height = image:getDimensions() + local quads = {} + for tile = 0, math.floor(width / 8) * math.floor(height / 8) - 1 do + quads[tile] = love.graphics.newQuad( + tile % 16 * 8, math.floor(tile / 16) * 8, 8, 8, width, height) + end + entry = { image = image, quads = quads } + self.sheets[path] = entry + return entry +end + +-- The three layer canvases the CGB attribute byte splits the map into: +-- per-tile colour 0 (the backdrop), colours 1-3 of ordinary tiles, and +-- colours 1-3 of PRIORITY tiles, which beat every OBJ. +local function bakeLayers(self) + if not (self.mapDirty or self.palsDirty) then + return self.backdropCanvas ~= nil + end + local G = love.graphics + if not self.backdropCanvas then + local ok, a = pcall(G.newCanvas, BG_PIXELS, BG_PIXELS) + local ok2, b = pcall(G.newCanvas, BG_PIXELS, BG_PIXELS) + local ok3, c = pcall(G.newCanvas, BG_PIXELS, BG_PIXELS) + if not (ok and ok2 and ok3) then return false end + for _, canvas in ipairs({ a, b, c }) do + canvas:setFilter("nearest", "nearest") + end + self.backdropCanvas, self.lowCanvas, self.highCanvas = a, b, c + end + local act = actData(self) + local sheet = act and self:sheet(act.tiles) + local grass = self.grassFrame + and self:sheet(self.assets and self.assets.grassFrames) + local previous = G.getCanvas() + G.push() + G.origin() + + G.setCanvas(self.backdropCanvas) + G.clear(0, 0, 0, 1) + for pal = 0, 7 do + local color = GbcPalette.color(self.bgPals[pal + 1], 1) or BLACK + G.setColor(color[1] / 255, color[2] / 255, color[3] / 255, 1) + for row = 0, BG_TILES - 1 do + for col = 0, BG_TILES - 1 do + if self.attr[row * BG_TILES + col + 1] % 8 == pal then + G.rectangle("fill", col * 8, row * 8, 8, 8) + end + end + end + end + G.setColor(1, 1, 1, 1) + + local shader = GbcPalette.available() + for _, layer in ipairs({ + { canvas = self.lowCanvas, prio = false }, + { canvas = self.highCanvas, prio = true }, + }) do + G.setCanvas(layer.canvas) + G.clear(0, 0, 0, 0) + if sheet then + for pal = 0, 7 do + if shader then GbcPalette.use(self.bgPals[pal + 1]) end + for row = 0, BG_TILES - 1 do + for col = 0, BG_TILES - 1 do + local index = row * BG_TILES + col + 1 + local attr = self.attr[index] + if attr % 8 == pal and (attr >= 0x80) == layer.prio then + local id = self.map[index] + local quad + local image = sheet.image + if grass and id >= 0x09 and id <= 0x0c then + quad = grass.quads[(self.grassFrame - 1) * 4 + id - 0x09] + image = grass.image + else + quad = sheet.quads[id] + end + if quad then G.draw(image, quad, col * 8, row * 8) end + end + end + end + end + if shader then GbcPalette.clear() end + end + end + G.setCanvas(previous) + G.pop() + self.mapDirty, self.palsDirty = false, false + return true +end + +-- Present a layer at (hSCX, hSCY); with the perspective bands live each +-- scanline takes the tree or grass SCX (engine/movie/intro.asm:1647-1676). +function CrystalIntro:drawLayer(canvas) + local G = love.graphics + G.setColor(1, 1, 1, 1) + if not self.lyActive then + local scx, scy = self.scx % BG_PIXELS, self.scy % BG_PIXELS + for _, ox in ipairs({ 0, BG_PIXELS }) do + for _, oy in ipairs({ 0, BG_PIXELS }) do + G.draw(canvas, -scx + ox, -scy + oy) + end + end + return + end + self.lineQuad = self.lineQuad + or love.graphics.newQuad(0, 0, BG_PIXELS, 1, BG_PIXELS, BG_PIXELS) + for line = 0, SCREEN_H - 1 do + local srcY = (self.scy + line) % BG_PIXELS + local scx = (line < 0x5f and self.treeScroll or self.grassScroll) + % BG_PIXELS + self.lineQuad:setViewport(0, srcY, BG_PIXELS, 1, BG_PIXELS, BG_PIXELS) + G.draw(canvas, self.lineQuad, -scx, line) + G.draw(canvas, self.lineQuad, -scx + BG_PIXELS, line) + end +end + +function CrystalIntro:drawObjects(priority) + local act = actData(self) + local sheet0 = act and self:sheet(act.sprites) + local sheet1 = act and act.sprites1 and self:sheet(act.sprites1) + if not (sheet0 or sheet1) then return end + local G = love.graphics + local oam = self.anims.oam + local shader = GbcPalette.available() + local current = nil + for index = #oam, 1, -1 do + local entry = oam[index] + local behind = bit.band(entry.attr, OAM_PRIO) ~= 0 + if behind == priority then + local sheet = bit.band(entry.attr, OAM_BANK1) ~= 0 and sheet1 or sheet0 + local quad = sheet and sheet.quads[entry.tile] + if quad then + local slot = entry.attr % 8 + if shader and current ~= slot then + GbcPalette.use(self.obPals[slot + 1]) + current = slot + end + local flipX = bit.band(entry.attr, OAM_XFLIP) ~= 0 + local flipY = bit.band(entry.attr, OAM_YFLIP) ~= 0 + G.setColor(1, 1, 1, 1) + G.draw(sheet.image, quad, + entry.x - 8 + (flipX and 8 or 0), entry.y - 16 + (flipY and 8 or 0), + 0, flipX and -1 or 1, flipY and -1 or 1) + end + end + end + if current then GbcPalette.clear() end +end + +function CrystalIntro:renderFrame() + local G = love.graphics + local baked = bakeLayers(self) + if not self.frameCanvas then + local ok, canvas = pcall(G.newCanvas, SCREEN_W, SCREEN_H) + if not ok then return nil end + canvas:setFilter("nearest", "nearest") + self.frameCanvas = canvas + end + local previous = G.getCanvas() + G.push() + G.origin() + G.setCanvas(self.frameCanvas) + G.clear(0, 0, 0, 1) + if baked then + self:drawLayer(self.backdropCanvas) + self:drawObjects(true) + self:drawLayer(self.lowCanvas) + self:drawObjects(false) + self:drawLayer(self.highCanvas) + end + G.setCanvas(previous) + G.pop() + return self.frameCanvas +end + +function CrystalIntro:drawPanel() + local G = love.graphics + local canvas = self:renderFrame() + G.setColor(1, 1, 1, 1) + if canvas then + G.draw(canvas, 0, 0) + return + end + G.setColor(0, 0, 0, 1) + G.rectangle("fill", 0, 0, SCREEN_W, SCREEN_H) + G.setColor(1, 1, 1, 1) +end + +function CrystalIntro:draw() + self:drawPanel() +end + +-- The widescreen surround follows the backdrop: colour 0 of the palette the +-- top-left visible tile's attribute selects, live through the fades. +function CrystalIntro:surroundColor() + local row = math.floor(self.scy / 8) % BG_TILES + local col = math.floor(self.scx / 8) % BG_TILES + local attr = self.attr[row * BG_TILES + col + 1] or 0 + return GbcPalette.color(self.bgPals[attr % 8 + 1], 1) or BLACK +end + +function CrystalIntro:drawWidescreen(winW, winH) + local G = love.graphics + local fill = self:surroundColor() + G.setColor(fill[1] / 255, fill[2] / 255, fill[3] / 255, 1) + G.rectangle("fill", 0, 0, winW, winH) + local scale = Chrome.fitScale(winW, winH) + G.push() + G.translate(Chrome.fitOrigin(winW, winH, scale)) + G.scale(scale, scale) + self:drawPanel() + G.pop() +end + +CrystalIntro.Scenes = Scenes +CrystalIntro.OAMSETS = OAMSETS +CrystalIntro.FRAMESETS = FRAMESETS +CrystalIntro.OBJECTS = OBJECTS +CrystalIntro.SEQUENCES = SEQUENCES +CrystalIntro.unownFade = unownFade + +return CrystalIntro diff --git a/src/ui/gen2/Diploma.lua b/src/ui/gen2/Diploma.lua index 3bc80928..a8dd55ce 100644 --- a/src/ui/gen2/Diploma.lua +++ b/src/ui/gen2/Diploma.lua @@ -2,9 +2,9 @@ -- reached through `special Diploma` after Celadon Mansion 3F's game designer -- checks VAR_DEXCAUGHT == 251). Only page 1 is ever shown in play -- -- PrintDiplomaPage2 is the Game Boy Printer's second sheet --- (engine/printer/printer.asm _PrintDiploma), stubbed separately as --- "printer: no Game Boy Printer" -- so this transcribes PlaceDiplomaOnScreen --- alone, not diploma2.asm. +-- (engine/printer/printer.asm:420), built with hBGMapMode zeroed and undone by +-- SafeLoadTempTilemapToTilemap, so it never reaches the screen on the cart +-- either -- so this transcribes PlaceDiplomaOnScreen alone, not diploma2.asm. -- -- THE CERTIFICATE IS A TILEMAP, NOT A TEXT BOX. PlaceDiplomaOnScreen -- decompresses DiplomaGFX into vTiles2 and then CopyBytes' DiplomaPage1Tilemap diff --git a/src/ui/gen2/GenderSelect.lua b/src/ui/gen2/GenderSelect.lua new file mode 100644 index 00000000..07aca9b9 --- /dev/null +++ b/src/ui/gen2/GenderSelect.lua @@ -0,0 +1,139 @@ +-- ../pokecrystal/engine/menus/init_gender.asm:23-41 InitGender, which +-- PlayerProfileSetup runs before OakSpeech (engine/menus/intro_menu.asm:61-83). + +local Chrome = require("src.ui.gen2.Chrome") +local Music = require("src.core.Music") +local RomText = require("src.core.RomText") +local Sound = require("src.core.Sound") +local Strings = require("src.core.Strings") + +local GenderSelect = {} +GenderSelect.__index = GenderSelect +GenderSelect.isOpaque = true + +-- .MenuData's two items (../pokecrystal/engine/menus/init_gender.asm:50-53), +-- and the wPlayerGender byte each writes (`ld a, [wMenuCursorY] / dec a`). +GenderSelect.OPTIONS = { + { label = "Boy", gender = "male" }, + { label = "Girl", gender = "female" }, +} + +-- menu_coords 6, 4, 12, 9 -- inclusive, so 7 columns by 6 rows. +local BOX_X, BOX_Y, BOX_W, BOX_H = 6, 4, 7, 6 +local TEXT_X, TEXT_Y = BOX_X + 2, BOX_Y + 2 +local CURSOR_X = TEXT_X - 1 +local ROW_STEP = 2 + +-- TEXTBOX_X / TEXTBOX_Y / TEXTBOX_INNERX / TEXTBOX_INNERY +-- (../pokecrystal/constants/text_constants.asm:25-32), the box PrintText fills. +local SAY_X, SAY_Y, SAY_W, SAY_H = 0, 12, 18, 4 +local SAY_TEXT_X, SAY_TEXT_Y = 1, 14 + +-- gfx/new_game/gender_screen.pal:1-4, the one palette LoadGenderScreenPal +-- writes; colour 1 is the tile the screen is filled with. +GenderSelect.GROUND = { 74, 247, 255 } + +-- `ld a, $10 / ld [wMusicFade]` with MUSIC_NONE as the fade target +-- (../pokecrystal/engine/menus/init_gender.asm:59-65). +local FADE_CONTROL = 0x10 +-- `ld c, 10 / call DelayFrames` on the way out +-- (../pokecrystal/engine/menus/init_gender.asm:39-40). +local EXIT_FRAMES = 10 + +local FALLBACK = Strings.source("Are you a boy?\nOr are you a girl?") + +function GenderSelect:wantsFillScale() return true end +function GenderSelect:drawsWidescreen() return true end + +-- opts: onDone(gender), save +function GenderSelect.new(game, opts) + opts = opts or {} + local self = setmetatable({}, GenderSelect) + self.game = game + self.save = opts.save or (game and game.save) + self.onDone = opts.onDone + self.data = (game and game.data) or {} + -- `db 1 ; default option`: the cursor opens on Boy. + self.cursor = 1 + self.exit = nil + self.text = RomText(self.data, "_AreYouABoyOrAreYouAGirlText", + FALLBACK) + return self +end + +function GenderSelect:enter() + Music.fadeOut(FADE_CONTROL) +end + +function GenderSelect:playSfx(name) + local sfx = self.data.audio and self.data.audio.sfx + if sfx and sfx[Sound.resolve(self.data, name)] then + Sound.play(self.data, name) + end +end + +function GenderSelect:choose(index) + local option = GenderSelect.OPTIONS[index] or GenderSelect.OPTIONS[1] + if self.save and self.save.player then + self.save.player.gender = option.gender + end + self.chosen = option.gender + self.exit = EXIT_FRAMES +end + +function GenderSelect:update(_dt) + if self.exit then + self.exit = self.exit - 1 + if self.exit > 0 then return end + self.exit = nil + if self.onDone then self.onDone(self.chosen) end + return + end + local input = self.game and self.game.input + if not input then return end + -- STATICMENU_WRAP, and STATICMENU_DISABLE_B: no `b` arm at all. + if input:wasPressed("up") then + self.cursor = self.cursor > 1 and self.cursor - 1 or #GenderSelect.OPTIONS + elseif input:wasPressed("down") then + self.cursor = self.cursor < #GenderSelect.OPTIONS and self.cursor + 1 or 1 + elseif input:wasPressed("a") or input:wasPressed("start") then + -- MenuClickSound (../pokecrystal/home/menu.asm:793-803). + self:playSfx("Sfx_ReadText2") + self:choose(self.cursor) + end +end + +function GenderSelect:drawPanel() + local G = love.graphics + local ground = GenderSelect.GROUND + G.setColor(ground[1] / 255, ground[2] / 255, ground[3] / 255, 1) + G.rectangle("fill", 0, 0, Chrome.SCREEN_W * 8, Chrome.SCREEN_H * 8) + G.setColor(1, 1, 1, 1) + Chrome.textbox(SAY_X, SAY_Y, SAY_W, SAY_H) + Chrome.printWrapped(self.text, SAY_TEXT_X, SAY_TEXT_Y, SAY_W, SAY_H - 1) + Chrome.box(BOX_X, BOX_Y, BOX_W, BOX_H) + for i, option in ipairs(GenderSelect.OPTIONS) do + local row = TEXT_Y + (i - 1) * ROW_STEP + Chrome.print(option.label, TEXT_X, row) + if i == self.cursor then Chrome.cursor(CURSOR_X, row) end + end +end + +function GenderSelect:draw() + self:drawPanel() +end + +function GenderSelect:drawWidescreen(winW, winH) + local G = love.graphics + G.setColor(1, 1, 1, 1) + G.rectangle("fill", 0, 0, winW, winH) + local scale = Chrome.fitScale(winW, winH) + local ox, oy = Chrome.fitOrigin(winW, winH, scale) + G.push() + G.translate(ox, oy) + G.scale(scale, scale) + self:drawPanel() + G.pop() +end + +return GenderSelect diff --git a/src/ui/gen2/HallOfFame.lua b/src/ui/gen2/HallOfFame.lua index 23ee87ce..d1940f67 100644 --- a/src/ui/gen2/HallOfFame.lua +++ b/src/ui/gen2/HallOfFame.lua @@ -31,10 +31,11 @@ -- can assert them without a graphics device (the same shape -- src/ui/gen2/SummaryMenu.lua uses). -- --- WHAT THE CACHE DOES NOT HAVE. GetTrainerPic for TRAINER_CLASS CAL -- the --- 7x7 picture of the player HOF_AnimatePlayerPic ends on -- is not extracted. --- The player's own 5x7 portrait from the trainer card is, and it is the same --- character, so that stands in and is padded into the 7x7 block the way +-- WHAT THE CACHE MAY NOT HAVE. Gold's HOF_AnimatePlayerPic ends on +-- GetTrainerPic for TRAINER_CLASS CAL, which is not extracted; Crystal's +-- HOF_LoadTrainerFrontpic ends on ChrisPic / KrisPic, which are extracted when +-- the cache is new enough. Failing both, the player's own 5x7 portrait from +-- the trainer card stands in and is padded into the 7x7 block the way -- PlaceGraphic would. ProfOaksPCRating, which the cart prints into the bottom -- box afterwards, needs Oak's PC (still a stub in src/script/gen2/Specials.lua) -- and so the box is drawn empty, exactly as it is before that farcall. @@ -45,6 +46,7 @@ local CommonText = require("src.core.gen2.CommonText") local Core = require("src.core.gen2.HallOfFame") local Font = require("src.render.Font") local GbcPalette = require("src.render.GbcPalette") +local Gen2Save = require("src.core.gen2.Save") local Music = require("src.core.Music") local Palettes = require("src.world.gen2.Palettes") local Sound = require("src.core.Sound") @@ -250,15 +252,26 @@ function HallOfFame.new(game, opts) -- The player's own two pictures. The backpic is a plain image (the battle -- HUD's), the front is the trainer card's 5x7 portrait tile sheet. local menuGfx = data.gen2MenuGfx or {} + -- HOF_AnimatePlayerPic calls GetPlayerBackpic (../pokecrystal/engine/events/ + -- halloffame.asm:520-530, ../pokecrystal/engine/gfx/player_gfx.asm:123-128). + local female = Gen2Save.isFemale(self.save) + local hud = menuGfx.battleHud or {} -- player.sprite, the same hook Gen 1's Hall of Fame raises through -- Sprites.playerPath (src/ui/HallOfFame.lua:100). self.playerBackPath = require("src.pokemon.Sprites").playerPic( - (menuGfx.battleHud or {}).playerBack, + (female and hud.playerBackFemale) or hud.playerBack, { side = "back", kind = "hof", data = data }) + -- HOF_LoadTrainerFrontpic's ChrisPic / KrisPic under class CHRIS / KRIS + -- (../pokecrystal/engine/gfx/player_gfx.asm:138-168). + local pics = hud.trainerPics or {} + self.trainerPicPath = (female and pics.KRIS) or pics.CHRIS local card = menuGfx.trainerCard if card and card.card then + -- GetCardPic's KrisCardPic arm + -- (../pokecrystal/engine/gfx/player_gfx.asm:96-101). self.portrait = TileSheet.new({ - path = card.card, wide = card.cardTilesWide or 16, firstTile = 0, + path = (female and card.cardFemale) or card.card, + wide = card.cardTilesWide or 16, firstTile = 0, }) self.portraitWide = card.portraitWide or 5 self.portraitTiles = card.portraitTiles or 35 @@ -559,6 +572,8 @@ end -- run of tile ids TrainerCard_PrintTopHalfOfCard uses, translated by the -- scroll rather than drawn at a tile coordinate. function HallOfFame:drawPortrait(tileX, tileY) + local pic = self:image(self.trainerPicPath) + if pic then return self:drawScrolled(pic, tileX, tileY, nil) end if not (self.portrait and self.portrait:available()) then return end local G = love.graphics local wide = self.portraitWide diff --git a/src/ui/gen2/MagnetTrainRide.lua b/src/ui/gen2/MagnetTrainRide.lua index 5a3f6a0f..f9f40830 100644 --- a/src/ui/gen2/MagnetTrainRide.lua +++ b/src/ui/gen2/MagnetTrainRide.lua @@ -33,6 +33,7 @@ local Assets = require("src.render.Assets") local Chrome = require("src.ui.gen2.Chrome") +local FieldMoves = require("src.world.gen2.FieldMoves") local GbcPalette = require("src.render.GbcPalette") local MagnetTrain = require("src.core.gen2.MagnetTrain") local Music = require("src.core.Music") @@ -82,6 +83,8 @@ function MagnetTrainRide.new(game, opts) self.data = game and game.data self.onDone = opts.onDone self.finished = false + local save = opts.save or (game and game.save) + self.gender = save and save.player and save.player.gender or nil local field = self.data and self.data.gen2Field local gfx = field and field.magnetTrain @@ -155,8 +158,7 @@ end -- are cut per 8x8 sub-tile rather than by the sheet's 16-pixel width, because -- the OAM data addresses the four tiles of a frame individually. function MagnetTrainRide:playerSheet() - local sprites = self.data and self.data.gen2Sprites - local def = sprites and (sprites.SPRITE_CHRIS or sprites.SPRITE_KRIS) + local def = self:playerSpriteDef() local path = def and def.image if not path then return nil end local ok, image = pcall(Assets.image, path) @@ -357,14 +359,23 @@ function MagnetTrainRide:drawBands(canvas) end end +-- GetPlayerIcon's sheet, which .InitPlayerSpriteAnim pairs with +-- SPRITE_ANIM_OBJ_MAGNET_TRAIN_RED or _BLUE +-- (../pokecrystal/engine/events/magnet_train.asm:131-141, :291-305). +function MagnetTrainRide:playerSpriteDef() + local sprites = self.data and self.data.gen2Sprites + if not sprites then return nil end + return sprites[FieldMoves.playerSprite(self.gender)] + or sprites.SPRITE_CHRIS or sprites.SPRITE_KRIS +end + -- MapObjectPals' PAL_OW_RED, the palette every .OAMData_MagnetTrainRed entry --- names. +-- names, or PAL_OW_BLUE for the _BLUE object Kris rides under. function MagnetTrainRide:playerPalette() local palettes = self.data and self.data.gen2Palettes - local sprites = self.data and self.data.gen2Sprites if not palettes then return nil end return Palettes.spritePalette(palettes, Palettes.clockDaytime(), - sprites and sprites.SPRITE_CHRIS) + self:playerSpriteDef()) end function MagnetTrainRide:drawPlayer() diff --git a/src/ui/gen2/MoveTutor.lua b/src/ui/gen2/MoveTutor.lua new file mode 100644 index 00000000..ad6f0dc4 --- /dev/null +++ b/src/ui/gen2/MoveTutor.lua @@ -0,0 +1,163 @@ +-- ../pokecrystal/engine/events/move_tutor.asm:1 MoveTutor, the submenu +-- FadeToMenu / ChooseMonToLearnTMHM / CloseSubmenu wraps, and :54 +-- CheckCanLearnMoveTutorMove, whose refusals print into a Textbox over the +-- party list (:101-103 `menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1`). +-- +-- ChooseMonToLearnTMHM (../pokecrystal/engine/items/tmhm.asm:73) is +-- InitPartyMenuWithCancel with PARTYMENUACTION_TEACH_TMHM, which is the list +-- src/ui/gen2/PartyMenu.lua already draws when it is handed `tmhm`. + +local Chrome = require("src.ui.gen2.Chrome") +local Happiness = require("src.core.gen2.Happiness") +local Mon = require("src.battle.gen2.Mon") +local PartyMenu = require("src.ui.gen2.PartyMenu") +local Strings = require("src.core.Strings") + +local MoveTutor = {} +MoveTutor.__index = MoveTutor +MoveTutor.isOpaque = true + +-- ../pokecrystal/data/text/common_2.asm:187 _TMHMNotCompatibleText and +-- common_3.asm:1424 _KnowsMoveText. CopyName1 leaves the MOVE in +-- wStringBuffer2 and GetNickname the nickname in wStringBuffer1. +local NOT_COMPATIBLE = Strings.source("%s is\nnot compatible\vwith %s.") +local KNOWS_MOVE = Strings.source("%s knows\n%s.") + +-- CanLearnTMHMMove's bitfield: `add_mt` gives the three tutor moves TMHM +-- flags 58-60 (../pokecrystal/constants/item_constants.asm:295-307), which +-- the cache splits out as `tutorMoves`. +function MoveTutor.canLearn(species, moveId) + if type(species) ~= "table" or not moveId then return false end + for _, id in ipairs(species.tmhm or {}) do + if id == moveId then return true end + end + for _, id in ipairs(species.tutorMoves or {}) do + if id == moveId then return true end + end + return false +end + +-- The same bitfield as a pokemon.lua view, for PartyMenu's ABLE / NOT ABLE +-- column (src/ui/gen2/PartyMenu.lua:735, which walks `tmhm` only). +function MoveTutor.speciesView(pokemon) + local cache = {} + return setmetatable({}, { __index = function(_, key) + local hit = cache[key] + if hit ~= nil then return hit or nil end + local def = pokemon and pokemon[key] + if type(def) ~= "table" then + cache[key] = false + return nil + end + local merged = {} + for field, value in pairs(def) do merged[field] = value end + local list = {} + for _, id in ipairs(def.tmhm or {}) do list[#list + 1] = id end + for _, id in ipairs(def.tutorMoves or {}) do list[#list + 1] = id end + merged.tmhm = list + cache[key] = merged + return merged + end }) +end + +-- opts: move, moveName, onDone(learned) +function MoveTutor.new(game, opts) + opts = opts or {} + local self = setmetatable({}, MoveTutor) + self.game = game + local data = (game and game.data) or {} + self.move = opts.move + self.moveName = opts.moveName or opts.move or "?" + self.onDone = opts.onDone + self.pokemon = opts.pokemon or data.pokemon + self.view = MoveTutor.speciesView(self.pokemon) + self.list = self:buildList() + return self +end + +function MoveTutor:wantsFillScale() return true end +function MoveTutor:drawsWidescreen() return true end + +function MoveTutor:buildList() + return PartyMenu.new(self.game, { + prompt = "teach", + tmhm = { move = self.move }, + pokemon = self.view, + onChoose = function(_, mon) self:picked(mon) end, + onCancel = function() self:finish(false) end, + }) +end + +function MoveTutor:say(body, onDone) + if self.game and self.game.say then return self.game:say(body, onDone) end + if onDone then onDone() end +end + +function MoveTutor:playSfx(name) + local world = self.game and self.game.world + if world and world.playSfxNamed then world:playSfxNamed(name) end +end + +-- CheckCanLearnMoveTutorMove (../pokecrystal/engine/events/move_tutor.asm:54); +-- all three failures fall back into the list, `jr nc, .loop` at :24. +function MoveTutor:picked(mon) + if not mon then return end + local name = Mon.displayName(mon) + if not MoveTutor.canLearn(self.view[mon.species], self.move) then + self:playSfx("Sfx_Wrong") + return self:say(Strings(NOT_COMPATIBLE, self.moveName, name)) + end + -- ../pokecrystal/engine/pokemon/knows_move.asm:16 sets carry and prints, + -- which is the same .didnt_learn arm. + for _, move in ipairs(mon.moves or {}) do + if move.id == self.move then + return self:say(Strings(KNOWS_MOVE, name, self.moveName)) + end + end + local game = self.game + if not (game and game.learnMoveOn) then return self:finish(false) end + game:learnMoveOn(mon, self.move, function(learned) + if not learned then return end + -- :87-88 `ld c, HAPPINESS_LEARNMOVE / callfar ChangeHappiness`. The 4000 + -- coins are the script's own takecoins (maps/GoldenrodCity.asm:124). + Happiness.change(mon, "LEARNMOVE") + self:finish(true) + end) +end + +function MoveTutor:finish(learned) + if self.done then return end + self.done = true + local stack = self.game and self.game.stack + if stack then stack:pop() end + if self.onDone then self.onDone(learned) end +end + +function MoveTutor:update(dt) + if self.done then return end + self.list:update(dt) +end + +function MoveTutor:drawPanel() + self.list:drawPanel() +end + +function MoveTutor:draw() + self.list:draw() +end + +-- PartyMenu:drawWidescreen's own blit: the party page is white to the window +-- edge, at the one integer scale Chrome.fitScale picks. +function MoveTutor:drawWidescreen(winW, winH) + local G = love.graphics + G.setColor(1, 1, 1, 1) + G.rectangle("fill", 0, 0, winW, winH) + local scale = Chrome.fitScale(winW, winH) + G.push() + G.translate(Chrome.fitOrigin(winW, winH, scale)) + G.scale(scale, scale) + self:drawPanel() + G.pop() +end + +return MoveTutor diff --git a/src/ui/gen2/NamePick.lua b/src/ui/gen2/NamePick.lua index 3f2dbee6..dec13836 100644 --- a/src/ui/gen2/NamePick.lua +++ b/src/ui/gen2/NamePick.lua @@ -34,13 +34,25 @@ local NamePick = {} NamePick.__index = NamePick NamePick.isOpaque = true --- data/player_names.asm PlayerNameArray, one half of the IF per edition. -local PRESETS = { "GOLD", "HIRO", "TAYLOR", "KARL" } -local PRESETS_SILVER = { "SILVER", "KAMON", "OSCAR", "MAX" } +-- data/player_names.asm PlayerNameArray, one half of the IF per edition, and +-- Crystal's two arrays at ../pokecrystal/data/player_names.asm:12-16, :31-35. +local PRESETS = { + gold = { "GOLD", "HIRO", "TAYLOR", "KARL" }, + silver = { "SILVER", "KAMON", "OSCAR", "MAX" }, + crystal = { "CHRIS", "MAT", "ALLAN", "JON" }, +} +local PRESETS_FEMALE = { + crystal = { "KRIS", "AMANDA", "JUANA", "JODI" }, +} -local function presetsFor() - local silver = require("src.core.GameVersion").get() == "silver" - return silver and PRESETS_SILVER or PRESETS +-- ShowPlayerNamingChoices picks the header off wPlayerGender +-- (../pokecrystal/engine/gfx/player_gfx.asm:57-62). +local function presetsFor(gender) + local version = require("src.core.GameVersion").get() + if gender == "female" and PRESETS_FEMALE[version] then + return PRESETS_FEMALE[version] + end + return PRESETS[version] or PRESETS.gold end -- menu_coords 0, 0, 10, TEXTBOX_Y - 1 (TEXTBOX_Y = 12). @@ -59,14 +71,16 @@ function NamePick:wantsFillScale() return true end function NamePick:drawsWidescreen() return true end -- opts: onDone(name), font, pic (the CAL frontpic already loaded by the Oak --- speech), picColors, presets +-- speech), picColors, presets, gender function NamePick.new(game, opts) opts = opts or {} local self = setmetatable({}, NamePick) self.game = game self.onDone = opts.onDone + self.gender = opts.gender + or (game and game.save and game.save.player and game.save.player.gender) self.items = { "NEW NAME" } - for _, name in ipairs(opts.presets or presetsFor()) do + for _, name in ipairs(opts.presets or presetsFor(self.gender)) do self.items[#self.items + 1] = name end -- `db 1 ; default option`: the cursor starts on NEW NAME, not on a preset. @@ -96,15 +110,19 @@ end function NamePick:openNaming() local data = self.game and self.game.data or {} local sprites = data.gen2Sprites - local chris = sprites and sprites.SPRITE_CHRIS + local NamingScreen = require("src.ui.gen2.NamingScreen") + local def = sprites and sprites[NamingScreen.playerSprite(self.gender)] local Palettes = require("src.world.gen2.Palettes") Screens.push(self.game, "Gen2NamingScreen", { type = "player", + gender = self.gender, menuGfx = data.gen2MenuGfx, - iconPath = chris and chris.image or nil, - -- Chris is PAL_OW_RED; the naming screen is lit like day. + iconPath = def and def.image or nil, + -- Chris is PAL_OW_RED and Kris PAL_OW_BLUE + -- (../pokecrystal/engine/overworld/player_object.asm:32-39); the naming + -- screen is lit like day. iconColors = data.gen2Palettes - and Palettes.spritePalette(data.gen2Palettes, "DAY", chris) or nil, + and Palettes.spritePalette(data.gen2Palettes, "DAY", def) or nil, onDone = function(name) -- An empty name keeps the default, the way ending entry with nothing -- typed leaves wPlayerName at its preset. @@ -112,7 +130,7 @@ function NamePick:openNaming() if name and #name > 0 then self:choose(name) else - self:choose(self.items[2] or presetsFor()[1]) + self:choose(self.items[2] or presetsFor(self.gender)[1]) end end, }) @@ -152,7 +170,7 @@ function NamePick:update(_dt) if self.fontOk then self:openNaming() else - self:choose(self.items[2] or presetsFor()[1]) + self:choose(self.items[2] or presetsFor(self.gender)[1]) end else -- A preset returns through MovePlayerPicLeft, so the pic walks back @@ -232,7 +250,7 @@ function NamePick:drawWidescreen(winW, winH) end NamePick.PRESETS = PRESETS -NamePick.PRESETS_SILVER = PRESETS_SILVER +NamePick.PRESETS_FEMALE = PRESETS_FEMALE NamePick.presetsFor = presetsFor return NamePick diff --git a/src/ui/gen2/NamingScreen.lua b/src/ui/gen2/NamingScreen.lua index 4857499c..7107e296 100644 --- a/src/ui/gen2/NamingScreen.lua +++ b/src/ui/gen2/NamingScreen.lua @@ -81,19 +81,28 @@ local BOTTOM_CURSOR_TILES = 5 -- NAME_* types (constants/menu_constants.asm order) as prompts + field sizes. -- Lengths are the ASM's *_NAME_LENGTH - 1, i.e. usable characters. NamingScreen.TYPES = { - player = { prompt = "YOUR NAME?", maxLength = 7, sprite = "SPRITE_CHRIS" }, + player = { prompt = "YOUR NAME?", maxLength = 7, sprite = "SPRITE_CHRIS", + spriteFemale = "SPRITE_KRIS" }, rival = { prompt = "RIVAL'S NAME?", maxLength = 7, sprite = "SPRITE_RIVAL" }, mom = { prompt = "MOTHER'S NAME?", maxLength = 7, sprite = "SPRITE_MOM" }, box = { prompt = "BOX NAME?", maxLength = 8, isBox = true }, nickname = { prompt = nil, maxLength = 10 }, } +-- GetPlayerIcon's two sheets (../pokecrystal/engine/gfx/player_gfx.asm:85-93), +-- which is also the pair the header icon here is cut from. +function NamingScreen.playerSprite(gender) + local kind = NamingScreen.TYPES.player + if gender == "female" and kind.spriteFemale then return kind.spriteFemale end + return kind.sprite +end + function NamingScreen:wantsFillScale() return true end function NamingScreen:drawsWidescreen() return true end -- opts: type ("player"/"rival"/"mom"/"box"/"nickname"), prompt, maxLength, --- initial, monName (nickname header), icon/sprite image path, onDone(name), --- onCancel(). +-- initial, monName (nickname header), icon/sprite image path, gender, +-- onDone(name), onCancel(). function NamingScreen.new(game, opts) opts = opts or {} local self = setmetatable({}, NamingScreen) @@ -101,6 +110,8 @@ function NamingScreen.new(game, opts) local kind = NamingScreen.TYPES[opts.type or "player"] or NamingScreen.TYPES.player self.kind = kind + self.gender = opts.gender + or (game and game.save and game.save.player and game.save.player.gender) self.isBox = opts.isBox or kind.isBox or false self.maxLength = opts.maxLength or kind.maxLength or 7 self.prompt = opts.prompt or kind.prompt or "NICKNAME?" diff --git a/src/ui/gen2/OakSpeech.lua b/src/ui/gen2/OakSpeech.lua index a68f6ebb..230693a1 100644 --- a/src/ui/gen2/OakSpeech.lua +++ b/src/ui/gen2/OakSpeech.lua @@ -37,7 +37,9 @@ -- love.graphics.newImage skips overrides/ and AssetTransform output. local Assets = require("src.render.Assets") local Chrome = require("src.ui.gen2.Chrome") +local FieldMoves = require("src.world.gen2.FieldMoves") local Font = require("src.render.Font") +local Gen2Save = require("src.core.gen2.Save") local GbcPalette = require("src.render.GbcPalette") local Logger = require("src.core.Logger") local Music = require("src.core.Music") @@ -98,6 +100,11 @@ function OakSpeech.new(game, opts) self.playerPic = tryImage(require("src.pokemon.Sprites").playerPic( data.playerPic or "assets/generated/intro/cal.png", { side = "front", kind = "intro", data = game and game.data })) + -- DrawIntroPlayerPic's other arm, KrisPic under trainer class KRIS + -- (../pokecrystal/engine/gfx/player_gfx.asm:170-188). + self.playerPicFemale = tryImage(require("src.pokemon.Sprites").playerPic( + data.playerPicFemale or "assets/generated/intro/kris.png", + { side = "front", kind = "intro", data = game and game.data })) self.marillPic = tryImage(data.marillPic or "assets/generated/battle/front/marill.png") self.shrinkPic1 = tryImage(data.shrink1 or "assets/generated/intro/shrink1.png") @@ -114,6 +121,9 @@ function OakSpeech.new(game, opts) self.palettes = palettes self.oakColors = Palettes.trainerColors(palettes, "POKEMON_PROF") self.playerColors = Palettes.trainerColors(palettes, "CAL") + -- KrisPalette is Falkner's row, shared rather than shipped + -- (../pokecrystal/data/trainers/palettes.asm:11-12). + self.playerColorsFemale = Palettes.trainerColors(palettes, "FALKNER") self.marillColors = Palettes.monColors(palettes, self.demoSpecies) self.picColors = nil self.fontOk = false @@ -134,6 +144,23 @@ function OakSpeech.new(game, opts) return self end +-- wPlayerGender, the byte the gender step below writes +-- (../pokecrystal/engine/menus/init_gender.asm:36-38). +function OakSpeech:gender() + local save = self.game and self.game.save + return save and save.player and save.player.gender or nil +end + +-- DrawIntroPlayerPic reads the byte every time it runs, so the pic follows the +-- answer rather than whatever was loaded when the speech opened +-- (../pokecrystal/engine/gfx/player_gfx.asm:170-188). +function OakSpeech:playerPicNow() + if self:gender() == "female" and self.playerPicFemale then + return self.playerPicFemale, self.playerColorsFemale or self.playerColors + end + return self.playerPic, self.playerColors +end + function OakSpeech:text(key) local t = self.texts[key] if type(t) == "string" and #t > 0 then return t end @@ -144,8 +171,8 @@ end -- The vanilla beat list. Ids are the stable anchors a build wrapper inserts -- around; see the header for which of them are shared with Gen 1. -function OakSpeech.defaultSteps(_speech) - return { +function OakSpeech.defaultSteps(speech) + local steps = { -- `farcall InitClock` is the first line of OakSpeech. { id = "init_clock", kind = "initclock" }, -- Intro_PrepTrainerPic POKEMON_PROF, FadeInIntroPic, OakText1. @@ -170,6 +197,14 @@ function OakSpeech.defaultSteps(_speech) { id = "legend", kind = "say", textKey = "_OakText7", pic = "player" }, { id = "shrink", kind = "shrink", textKey = "_OakText7" }, } + -- PlayerProfileSetup's `farcall InitGender` runs before OakSpeech is called. + -- ../pokecrystal/engine/menus/intro_menu.asm:61-67, :79-83 + local data = speech and speech.game and speech.game.data + if FieldMoves.hasGenderChoice(data and data.gen2Sprites) then + table.insert(steps, 1, { id = "gender_select", kind = "gender", + saveKey = "gender" }) + end + return steps end local function sameSteps(steps) return steps end @@ -190,14 +225,24 @@ function OakSpeech:buildSteps() return hooked end -function OakSpeech:enter() +-- `ld de, MUSIC_ROUTE_30 / call PlayMusic`, after InitGender's fade. +-- ../pokecrystal/engine/menus/intro_menu.asm:632-633, init_gender.asm:59-65 +function OakSpeech:startMusic() + if self.musicStarted then return end + self.musicStarted = true local data = self.game and self.game.data if data and data.audio and data.audio.runtime then Music.play(data, self.music, true, { reason = "oak_speech" }) end +end + +function OakSpeech:enter() self.step = 0 self.answers = {} self.steps = self:buildSteps() + if not (self.steps[1] and self.steps[1].kind == "gender") then + self:startMusic() + end if Runtime.wants("intro.oak_speech.started") then Runtime.emit("intro.oak_speech.started", { speech = self, steps = self.steps }) end @@ -211,7 +256,7 @@ end -- same way every pic on this screen does (two shipped colours, bracketed). function OakSpeech:resolvePic(desc) if desc == "oak" then return self.oakPic, self.oakColors end - if desc == "player" then return self.playerPic, self.playerColors end + if desc == "player" then return self:playerPicNow() end if desc == "demo" then return self.marillPic, self.marillColors end if type(desc) ~= "table" then return nil, nil end if desc.type == "pokemon" then @@ -339,21 +384,59 @@ function OakSpeech:openInitClock() end end +-- InitGender, pushed where PlayerProfileSetup farcalls it: before the speech +-- says anything and before its music starts +-- (../pokecrystal/engine/menus/intro_menu.asm:79-83). +function OakSpeech:openGenderSelect(step) + local game = self.game + if not (game and game.stack) then + self:startMusic() + return self:advance() + end + self.busy = true + local pushed = Screens.push(game, "Gen2GenderSelect", { + save = game.save, + onDone = function(gender) + game.stack:pop() + self.busy = false + -- `ld hl, wPlayerName / ld de, .Chris|.Kris / call InitName`, the default + -- NamePlayer lays down before the menu opens + -- (../pokecrystal/engine/menus/intro_menu.asm:768-781). + local save = game.save + if save and save.player then + save.player.name = Gen2Save.defaultPlayerName(save.version, gender) + end + self:recordAnswer(step, gender == "female" and 2 or 1, + gender == "female" and "Girl" or "Boy", gender) + self:startMusic() + self:advance() + end, + }) + if not pushed then + self.busy = false + self:startMusic() + self:advance() + end +end + function OakSpeech:openNamePick(step) self.busy = true local NamePick = require("src.ui.gen2.NamePick") + local gender = self:gender() + local pic, picColors = self:playerPicNow() Screens.push(self.game, "Gen2NamePick", { font = self.game.fontData, + gender = gender, -- NamePlayer opens with MovePlayerPicRight, so the name menu owns the -- pic while it is up: it is the same CAL frontpic this speech has been -- showing, walked over to make room for the box. - pic = self.playerPic, - picColors = self.playerColors, + pic = pic, + picColors = picColors, presets = step.presets or namePresets(self.game, step.presetsWho or step.who or "player", - step.presetsFallback or NamePick.presetsFor()), + step.presetsFallback or NamePick.presetsFor(gender)), onDone = function(name) - name = name or NamePick.presetsFor()[1] + name = name or NamePick.presetsFor(gender)[1] self.game.save.player.name = name self.game.stack:pop() -- NamePick self.busy = false @@ -450,7 +533,9 @@ end function OakSpeech:runStep(step) local kind = step.kind or "say" - if kind == "initclock" then + if kind == "gender" then + self:openGenderSelect(step) + elseif kind == "initclock" then self:openInitClock() elseif kind == "say" then self:applyPic(step) diff --git a/src/ui/gen2/PackMenu.lua b/src/ui/gen2/PackMenu.lua index 5217f3ca..432ad490 100644 --- a/src/ui/gen2/PackMenu.lua +++ b/src/ui/gen2/PackMenu.lua @@ -12,6 +12,7 @@ local Bag = require("src.inventory.Bag") local Chrome = require("src.ui.gen2.Chrome") +local Gen2Save = require("src.core.gen2.Save") local PackGfx = require("src.ui.gen2.PackGfx") local Screens = require("src.ui.Screens") local Strings = require("src.core.Strings") @@ -78,6 +79,21 @@ local ASK_ITEM_MOVE = { "Where should this", "be moved to?" } local NO_POKEMON = { "You don't have a", "#MON!" } local EGG_CANT_HOLD = { "An EGG can't hold", "an item." } +-- _CGB_PackPals' .KrisPackPals arm, and the BATTLETYPE_TUTORIAL test above it +-- that forces the DUDE's (../pokecrystal/engine/gfx/cgb_layouts.asm:770-786). +local function packGfxFor(menuGfx, save, tutorial) + local pack = menuGfx and menuGfx.pack + if not (pack and pack.palettesFemale) then return menuGfx end + if tutorial or not Gen2Save.isFemale(save) then return menuGfx end + local female = {} + for key, value in pairs(pack) do female[key] = value end + female.palettes = pack.palettesFemale + local out = {} + for key, value in pairs(menuGfx) do out[key] = value end + out.pack = female + return out +end + -- The PACK's cursor bytes. Every pocket menu restores its own cursor and -- scroll before ScrollingMenu and writes them back after -- `ld a, -- [wItemsPocketCursor] / ld [wMenuCursorPosition], a` ... `ld a, [wMenuCursorY] @@ -157,7 +173,8 @@ function PackMenu.new(game, opts) end self:restoreCursor() -- The cart's own PACK tiles, when the cache has them. - self.gfx = PackGfx.new(game and game.data and game.data.gen2MenuGfx) + self.gfx = PackGfx.new(packGfxFor( + game and game.data and game.data.gen2MenuGfx, self.save, opts.tutorial)) self:rebuild() return self end diff --git a/src/ui/gen2/PhotoStudio.lua b/src/ui/gen2/PhotoStudio.lua index 2be2d785..d719e709 100644 --- a/src/ui/gen2/PhotoStudio.lua +++ b/src/ui/gen2/PhotoStudio.lua @@ -9,7 +9,7 @@ -- then a second card (PrintPartyMonPage2, the mon's other three moves and -- its non-HP stats) goes out behind it. There is no Game Boy Printer here -- -- same reason src/ui/gen2/UnownPrinter.lua takes its A press nowhere and --- PrintDiploma is stubbed in Specials.lua +-- PrintDiploma's own print goes nowhere -- -- so only page 1 is worth transcribing: it is the portrait itself, the -- part a player actually watches happen, while page 2 only ever existed as -- ink on a strip of thermal paper nobody in this port owns. H.PhotoStudio diff --git a/src/ui/gen2/Pokegear.lua b/src/ui/gen2/Pokegear.lua index 4d94027e..9c1dfdbe 100644 --- a/src/ui/gen2/Pokegear.lua +++ b/src/ui/gen2/Pokegear.lua @@ -21,6 +21,8 @@ -- itself at (0,0) from $46. local Chrome = require("src.ui.gen2.Chrome") +local FieldMoves = require("src.world.gen2.FieldMoves") +local Gen2Save = require("src.core.gen2.Save") local Clock = require("src.core.gen2.Clock") local Font = require("src.render.Font") local Palettes = require("src.world.gen2.Palettes") @@ -56,6 +58,10 @@ local CARDS = { -- card over. One row, so `#self.cards` stays 1 and nothing pages. local FLY_MAP_CARD = { id = "map", label = "FLY" } +-- ../pokecrystal/engine/events/specials.asm:102 OverworldTownMap -> _TownMap +-- (:1757): the wall map and the DECO_TOWN_MAP poster, no strip and no card gate. +local TOWN_MAP_CARD = { id = "map", label = "MAP" } + -- ---------------------------------------------------------------- the radio -- -- engine/pokegear/radio.asm is not a text table: it is a jumptable of code. @@ -877,7 +883,14 @@ function Pokegear.new(game, opts) self.save = opts.save or (game and game.save) local data = game and game.data or {} self.landmarks = opts.landmarks or data.gen2Landmarks + -- TownMap_GetCurrentLandmark (../pokecrystal/engine/pokegear/pokegear.asm:1783) + -- reads the map header itself, so a caller that has no landmark to hand still + -- gets one. self.currentLandmark = opts.currentLandmark + if self.currentLandmark == nil and game and game.currentLandmark then + local ok, id = pcall(game.currentLandmark, game) + if ok then self.currentLandmark = id end + end self.clock = opts.clock self.onClose = opts.onClose self.cards = self:visibleCards() @@ -930,6 +943,15 @@ function Pokegear.new(game, opts) self.flyIndex = (self:region() == "kanto") and #self.fly or 1 end + -- _TownMap (../pokecrystal/engine/pokegear/pokegear.asm:1757): the same map, + -- one card, no ENGINE_MAP_CARD test and no strip to page. + self.townMap = (not self.fly) and opts.townMap and true or nil + if self.townMap then + self.cards = { TOWN_MAP_CARD } + self.cardIndex = 1 + self.mode = "card" + end + -- _CGB_PokegearPals writes wBGPals1 only (engine/gfx/cgb_layouts.asm:157), -- so the RED_WALK icon keeps the overworld's own OBJ palette. self.sprites = opts.sprites or data.gen2Sprites @@ -937,6 +959,10 @@ function Pokegear.new(game, opts) local gfx = (opts.menuGfx or data.gen2MenuGfx or {}).pokegear self.gfx = gfx + -- _CGB_PokegearPals picks FemalePokegearPals off wPlayerGender + -- (../pokecrystal/engine/gfx/cgb_layouts.asm:179-190). + self.gearPals = gfx and ((Gen2Save.isFemale(self.save) + and gfx.palettesFemale) or gfx.palettes) or nil if gfx then self.sheet = TileSheet.new({ path = gfx.tiles, wide = gfx.tilesWide or 16, firstTile = 0, @@ -950,19 +976,25 @@ function Pokegear:styled() return self.sheet ~= nil and self.sheet:available() end +-- MalePokegearPals or FemalePokegearPals, whichever _CGB_PokegearPals would +-- have copied into wBGPals1 (../pokecrystal/engine/gfx/cgb_layouts.asm:179-190). +function Pokegear:pals() + return self.gearPals +end + -- TownMapPals: a nybble per tile id for $00..$5f, palette 0 above that. function Pokegear:colorsFor(tile) - local gfx = self.gfx - if not (gfx and gfx.palettes) then return nil end - if tile >= 0x60 then return gfx.palettes[1] end - return gfx.palettes[(gfx.palMap and gfx.palMap[tile + 1]) or 1] + local pals = self:pals() + if not pals then return nil end + if tile >= 0x60 then return pals[1] end + return pals[(self.gfx.palMap and self.gfx.palMap[tile + 1]) or 1] end -- Every string on a Pokegear card is a run of font tiles laid straight into -- the tilemap, so it wears BG palette 0 (PokegearPals' first entry) rather -- than drawing as black ink over whatever was underneath. function Pokegear:text(str, tx, ty) - local pals = self.gfx and self.gfx.palettes + local pals = self:pals() return Chrome.printThrough(str, tx, ty, pals and pals[1]) end @@ -1079,6 +1111,7 @@ function Pokegear:update(_dt) -- The fly picker owns the whole screen: no strip, no card paging, and B -- answers -1 rather than backing out to the strip. if self.fly then return self:updateFlyMap(input) end + if self.townMap then return self:updateTownMap(input) end if self.mode == "strip" then local stripCard = self:card() if not (stripCard and stripCard.id == "phone") then @@ -1160,8 +1193,9 @@ function Pokegear:region() and landmarks[self.currentLandmark] local index = current and current.index or 0 -- LANDMARK_FAST_SHIP is $5e = 94, past every Kanto landmark and still Johto. - if index == 94 then return "johto" end - if index >= 46 then return "kanto" end + if index == self:landmarkIndex("FAST_SHIP", 0x5e) then return "johto" end + -- `cp KANTO_LANDMARK`, which is PALLET_TOWN's own index. + if index >= self:landmarkIndex("PALLET_TOWN", 0x2e) then return "kanto" end return "johto" end @@ -1605,18 +1639,31 @@ local LANDMARK_PALLET_TOWN = 0x2e local LANDMARK_VICTORY_ROAD = 0x57 local LANDMARK_ROUTE_28 = 0x5d +-- ../pokecrystal/constants/landmark_constants.asm:34 inserts BATTLE_TOWER, so +-- every index above it is one higher than pokegold's; the cache's own record is +-- the authority and the numbers above are the fallback for a dataset without one. +function Pokegear:landmarkIndex(id, fallback) + local records = (self.landmarks or {}).landmarks + local record = records and (records["LANDMARK_" .. id] or records[id]) + local index = record and tonumber(record.index) + return index or fallback +end + -- Returns d (last) and e (first). Kanto's pair comes from -- TownMap_GetKantoLandmarkLimits, which withholds everything west of Victory -- Road until the Hall of Fame is on the record -- before that the Kanto map -- only walks the seven landmarks on the road to Indigo Plateau. function Pokegear:cursorLimits() if self:region() ~= "kanto" then - return LANDMARK_SILVER_CAVE, LANDMARK_NEW_BARK_TOWN + -- `ld d, KANTO_LANDMARK - 1`, which is SILVER_CAVE either way round. + return self:landmarkIndex("SILVER_CAVE", LANDMARK_SILVER_CAVE), + self:landmarkIndex("NEW_BARK_TOWN", LANDMARK_NEW_BARK_TOWN) end + local last = self:landmarkIndex("ROUTE_28", LANDMARK_ROUTE_28) if ((self.save or {}).flags or {}).HALL_OF_FAME then - return LANDMARK_ROUTE_28, LANDMARK_PALLET_TOWN + return last, self:landmarkIndex("PALLET_TOWN", LANDMARK_PALLET_TOWN) end - return LANDMARK_ROUTE_28, LANDMARK_VICTORY_ROAD + return last, self:landmarkIndex("VICTORY_ROAD", LANDMARK_VICTORY_ROAD) end -- The cursor's landmark index. Unset, it is the player's own, which is what @@ -1637,32 +1684,59 @@ end -- PokegearMap_ContinueMap's .DPad. Both branches share the increment or -- decrement that follows them, which is why the wrap writes e - 1 / d + 1 --- rather than e / d. -function Pokegear:moveMapCursor(input) +-- rather than e / d. _TownMap's own .pressed_up / .pressed_down +-- (../pokecrystal/engine/pokegear/pokegear.asm:1853-1877) are the same pair of +-- wraps against the same d/e, so the poster steps through here too. +function Pokegear:stepMapCursor(delta) local last, first = self:cursorLimits() local cursor = self:mapCursorIndex() - if input:wasPressed("up") then + if delta > 0 then -- `cp d / jr c, .wrap_around_up`: below the last landmark the value is -- left alone, at or past it the cursor is slammed to e - 1 first. if cursor >= last then cursor = first - 1 end cursor = cursor + 1 - elseif input:wasPressed("down") then + else -- `cp e / jr nz, .wrap_around_down`: only the first landmark wraps. if cursor == first then cursor = last + 1 end cursor = cursor - 1 + end + self.mapCursor = cursor +end + +function Pokegear:moveMapCursor(input) + if input:wasPressed("up") then + self:stepMapCursor(1) + elseif input:wasPressed("down") then + self:stepMapCursor(-1) elseif input:wasPressed("right") then -- Left and right do not move the cursor at all on this card: they page -- the POKeGEAR. .right takes the PHONE if it is owned and the RADIO if -- it is not; .left always takes the CLOCK. self:switchCard("phone", "radio") - return elseif input:wasPressed("left") then self:switchCard("clock") - return - else + end +end + +-- --------------------------------------------------------------- town map +-- +-- _TownMap's `.loop` (../pokecrystal/engine/pokegear/pokegear.asm:1831-1845) +-- reads hJoyPressed for B and hJoyLast for UP and DOWN, and nothing else: A +-- takes nothing, and left/right have no card to page to. +function Pokegear:updateTownMap(input) + if input:wasPressed("b") then + if self.townMapClosed then return end + self.townMapClosed = true + local stack = self.game and self.game.stack + if stack then stack:pop() end + if self.onClose then self.onClose() end return end - self.mapCursor = cursor + if input:wasPressed("up") then + self:stepMapCursor(1) + elseif input:wasPressed("down") then + self:stepMapCursor(-1) + end end -- ------------------------------------------------------------------ fly map @@ -1796,7 +1870,7 @@ function Pokegear:loadArrowSheet() -- pokegold data/sprite_anims/oam.asm .OAMData_RedWalk: STILL_CURSOR's -- oamset reuses RED_WALK's OAM data, so this wears PAL_OW_RED. palette = (self.playerIcon and self.playerIcon.objColors) - or (gfx.palettes and gfx.palettes[1]), + or (self:pals() and self:pals()[1]), }) end end @@ -1914,7 +1988,7 @@ end -- painted white underneath its strings is what puts a cream bar behind every -- run printThrough lays down. function Pokegear:paperColor() - local pals = self.gfx and self.gfx.palettes + local pals = self:pals() return (pals and pals[1] and pals[1][1]) or { 255, 255, 255 } end @@ -1929,7 +2003,7 @@ end -- space IS a font-page cell on colour 0, which is the contrast the day/time -- window and the map's KANTO label are drawn against. function Pokegear:groundColor() - local pals = self.gfx and self.gfx.palettes + local pals = self:pals() local pal = pals and pals[1] return (pal and pal[#pal]) or { 0, 0, 0 } end @@ -1989,6 +2063,20 @@ function Pokegear:drawFlyBubble() Chrome.cursor(18, 1) end +-- _TownMap.InitTilemap (../pokecrystal/engine/pokegear/pokegear.asm:1891-1918): +-- with no card strip above it the rule turns down at (7,0) and runs back out +-- along row 2, boxing the name plate into the top right corner instead. +function Pokegear:drawTownMapRule() + self:tile(0x06, 0, 0) + for x = 1, 6 do self:tile(0x07, x, 0) end + self:tile(0x17, 7, 0) + self:tile(0x16, 7, 1) + self:tile(0x26, 7, 2) + -- `ld bc, NAME_LENGTH` from (8,2), so the run stops one short of the cap. + for x = 8, 18 do self:tile(0x07, x, 2) end + self:tile(0x17, 19, 2) +end + function Pokegear:drawMap() -- The REGION follows the player (`cp KANTO_LANDMARK` in -- PokegearMap_CheckRegion); the name box follows the CURSOR, which the @@ -2000,11 +2088,15 @@ function Pokegear:drawMap() if self.fly then self:drawFlyBubble() else - self:drawStrip() - -- The header's own bottom rule: $07 across (1,2), with $06 and $17 as caps. - self:tile(0x06, 0, 2) - for x = 1, 18 do self:tile(0x07, x, 2) end - self:tile(0x17, 19, 2) + if self.townMap then + self:drawTownMapRule() + else + self:drawStrip() + -- The header's own bottom rule: $07 across (1,2), with $06 and $17 as caps. + self:tile(0x06, 0, 2) + for x = 1, 18 do self:tile(0x07, x, 2) end + self:tile(0x17, 19, 2) + end -- PokegearMap_UpdateLandmarkName: ClearBox(8,0) 2 rows by 12 columns -- -- with ' ', which is a font-page cell and so reads as BG palette 0's @@ -2047,7 +2139,12 @@ end function Pokegear:loadPlayerIcon() if self.playerIcon ~= nil then return end self.playerIcon = false - local def = self.sprites and self.sprites.SPRITE_CHRIS + -- SPRITE_ANIM_OBJ_RED_WALK or _BLUE_WALK, which is the sheet GetPlayerIcon + -- loaded plus PAL_OW_RED or PAL_OW_BLUE + -- (../pokecrystal/engine/pokegear/pokegear.asm:2737, :2752-2757). + local def = self.sprites + and self.sprites[FieldMoves.playerSprite( + self.save and self.save.player and self.save.player.gender)] if not (def and def.image) then return end local ok, icon = pcall(SpriteRenderer.new, def, "player") if not (ok and icon) then return end @@ -2205,6 +2302,14 @@ function Pokegear:drawPlain() end return end + if self.townMap then + -- No town-map art in this cache, so the name plate the cursor walks is all + -- there is to show (../pokecrystal/engine/pokegear/pokegear.asm:700). + Chrome.box(7, 0, 13, 3) + local current = self:mapLandmark() + Chrome.print(flatName(current and current.name), 9, 1) + return + end Chrome.box(0, 0, 20, 4) local card = self:card() Chrome.print(card and card.label or "", 2, 1) @@ -2282,8 +2387,9 @@ function Pokegear:drawPanel() end -- Last: the arrow is an OBJ and composites over whatever the card drew. -- _FlyMap has no card strip and never animates it - -- (engine/pokegear/pokegear.asm:1999). - if not self.fly then self:drawModeArrow() end + -- (engine/pokegear/pokegear.asm:1999); neither does _TownMap + -- (../pokecrystal/engine/pokegear/pokegear.asm:1757). + if not (self.fly or self.townMap) then self:drawModeArrow() end G.setColor(1, 1, 1, 1) end diff --git a/src/ui/gen2/SummaryMenu.lua b/src/ui/gen2/SummaryMenu.lua index 9ccc3723..38f27dfb 100644 --- a/src/ui/gen2/SummaryMenu.lua +++ b/src/ui/gen2/SummaryMenu.lua @@ -64,6 +64,7 @@ local GbcPalette = require("src.render.GbcPalette") local HpBar = require("src.battle.gen2.HpBar") local ItemEffects = require("src.core.gen2.ItemEffects") local Mon = require("src.battle.gen2.Mon") +local MonAnim = require("src.render.MonAnim") local Palettes = require("src.world.gen2.Palettes") local Pokerus = require("src.core.gen2.Pokerus") local Unown = require("src.core.gen2.Unown") @@ -314,6 +315,55 @@ function SummaryMenu:playCry() if ok and Sound and Sound.playCry then pcall(Sound.playCry, self.game.data, mon.species) end + self:startPicAnim() +end + +-- StatsScreen_PlaceFrontpic loads ANIM_MON_MENU, the longer scene. A cache +-- with no `anim` row -- every Gold and Silver one -- leaves picAnim nil. +-- ../pokecrystal/engine/pokemon/stats_screen.asm:889-901 +function SummaryMenu:startPicAnim() + self.picAnim = nil + local mon = self.mon + local def = mon and self.pokemon and self.pokemon[mon.species] + if not def then return end + local data = def.anim + if mon.species == Unown.SPECIES and def.letters then + local entry = def.letters[Unown.monLetter(mon)] + if entry and entry.anim then data = entry.anim end + end + if not data then return end + local sheet = self:picImage(data.sheet) + if not sheet then return end + local runner = MonAnim.new(data, "menu") + if not runner then return end + self.picAnim = { runner = runner, sheet = sheet, size = data.tiles * 8, + quads = {} } +end + +-- AnimateFrontpic's .loop, one scene command per frame. +-- ../pokecrystal/engine/gfx/pic_animation.asm:79-89 +function SummaryMenu:stepPicAnim() + local state = self.picAnim + if not state then return end + state.runner:update() + if state.runner:finished() then self.picAnim = nil end +end + +-- The sheet is one column of whole pictures, base picture first. +function SummaryMenu:picAnimFrame() + local state = self.picAnim + if not state then return nil end + local frame = state.runner:currentFrame() + if frame <= 0 then return nil end + local quad = state.quads[frame] + if not quad then + local w, h = state.sheet:getDimensions() + if (frame + 1) * state.size > h then return nil end + quad = love.graphics.newQuad(0, frame * state.size, state.size, state.size, + w, h) + state.quads[frame] = quad + end + return state.sheet, quad, state.size end function SummaryMenu:speciesDef() @@ -767,6 +817,7 @@ function SummaryMenu:updateMoveDetail(input) end function SummaryMenu:update(_dt) + self:stepPicAnim() local input = self.game and self.game.input if not input then return end if self.moveDetail then @@ -943,7 +994,7 @@ end -- PrepMonFrontpic at hlcoord 0, 0: a 7x7 block with the pic padded into it and -- the rest of the block left at the palette's colour 0. -function SummaryMenu:drawPicBlock(image, colors) +function SummaryMenu:drawPicBlock(image, colors, quad, size) if not image then return end local G = love.graphics -- A fill behind the pic reads a palette colour directly, so it has to come @@ -952,10 +1003,16 @@ function SummaryMenu:drawPicBlock(image, colors) G.setColor(blank[1] / 255, blank[2] / 255, blank[3] / 255, 1) G.rectangle("fill", 0, 0, 7 * 8, 7 * 8) - local wide = math.floor(image:getWidth() / 8) + local wide = math.floor((size or image:getWidth()) / 8) local pad = PIC_PAD[wide] or PIC_PAD[7] G.setColor(1, 1, 1, 1) - local function body() G.draw(image, pad[1] * 8, pad[2] * 8) end + local function body() + if quad then + G.draw(image, quad, pad[1] * 8, pad[2] * 8) + else + G.draw(image, pad[1] * 8, pad[2] * 8) + end + end if colors and GbcPalette.available() then GbcPalette.with(colors, body) else @@ -970,6 +1027,8 @@ function SummaryMenu:drawPic() if not image then return end local colors = self.palettes and mon.species and Palettes.monColors(self.palettes, mon.species, mon.shiny) or nil + local sheet, quad, size = self:picAnimFrame() + if sheet then return self:drawPicBlock(sheet, colors, quad, size) end self:drawPicBlock(image, colors) end diff --git a/src/ui/gen2/TitleState.lua b/src/ui/gen2/TitleState.lua index 32b36d69..23d33dc5 100644 --- a/src/ui/gen2/TitleState.lua +++ b/src/ui/gen2/TitleState.lua @@ -11,6 +11,7 @@ local Chrome = require("src.ui.gen2.Chrome") local GbcPalette = require("src.render.GbcPalette") local Music = require("src.core.Music") local Runtime = require("src.mods.Runtime") +local Sound = require("src.core.Sound") local SpriteAnims = require("src.ui.gen2.SpriteAnims") local TitleState = {} @@ -121,15 +122,75 @@ function TitleState.new(game, opts) -- How far past the 160px frame trails may fly (GB pixels); set each draw. self.trailMaxX = 200 self.musicStarted = false + + -- engine/movie/title.asm:104-127,217-273,304-338 + self.suicuneColor, self.suicuneGray = {}, {} + if type(title.suicuneFrames) == "table" then + for i, path in ipairs(title.suicuneFrames) do + self.suicuneColor[i] = tryImage(path) + end + end + if type(title.suicuneFramesGray) == "table" then + for i, path in ipairs(title.suicuneFramesGray) do + self.suicuneGray[i] = tryImage(path) + end + end + self.suicuneX = tonumber(title.suicuneX) or 48 + self.suicuneY = tonumber(title.suicuneY) or 96 + -- SuicuneFrameIterator's `and %111` clock (engine/movie/title.asm:217-243). + self.suicuneEvery = tonumber(title.suicuneEvery) or 8 + self.suicuneTick = 0 + self.suicuneFrame = 1 + self.gemColor = tryImage(title.gem) + self.gemGray = tryImage(title.gemGray) + self.gemX = tonumber(title.gemX) or 56 + self.gemRestY = tonumber(title.gemY) or 6 + self.gemStep = tonumber(title.gemStep) or 2 + -- TitleScreenEntrance (engine/menus/intro_menu.asm:1078-1123): hSCX walks + -- to 0 while alternating logo lines converge and the gem descends. + local entrance = type(title.entrance) == "table" and title.entrance or nil + self.entrance = entrance + self.entranceScx = entrance and (tonumber(entrance.scx) or 112) or 0 + self.entranceStep = entrance and (tonumber(entrance.step) or 4) or 4 + self.entranceLines = entrance and (tonumber(entrance.lines) or 80) or 0 + self.entranceHideBelow = entrance and tonumber(entrance.hideBelow) or nil + self.gemY = entrance and (tonumber(title.gemFromY) or -50) or self.gemRestY + self.entranceSfx = title.entranceSfx + self.timeoutFrames = tonumber(title.timeoutFrames) + self.onTimeout = opts.onTimeout + -- The copyright window line is pal 7 (engine/movie/title.asm:40-43); its + -- colour 0 backs the whole band. + local pals = type(title.palettes) == "table" and title.palettes.bg or nil + local band = type(pals) == "table" and type(pals[8]) == "table" + and pals[8][1] or nil + self.bandColor = (type(band) == "table" and #band >= 3) + and { band[1] / 255, band[2] / 255, band[3] / 255, 1 } or { 0, 0, 0, 1 } return self end -function TitleState:enter() +function TitleState:startMusic() + if self.musicStarted then return end local data = self.game and self.game.data - if data and data.audio and data.audio.runtime and not self.musicStarted then + if data and data.audio and data.audio.runtime then Music.play(data, "Music_TitleScreen", true, { reason = "title" }) self.musicStarted = true end +end + +function TitleState:enter() + if self.entrance then + -- _TitleScreen silences the channels and plays the entrance sting; + -- MUSIC_TITLE waits for the entrance to land + -- (engine/movie/title.asm:184,210-213; engine/menus/intro_menu.asm:1118-1119). + Music.stop() + local data = self.game and self.game.data + if data and data.audio and data.audio.runtime and self.entranceSfx + and data.audio.sfx and data.audio.sfx[self.entranceSfx] then + Sound.play(data, self.entranceSfx) + end + else + self:startMusic() + end -- intro.boot.title: the last card of the GS boot cinema, up with its music -- started. Gen 2 only, like the rest of intro.boot.* (see -- src/ui/gen2/CopyrightSplash.lua for why the set is new rather than shared). @@ -197,15 +258,51 @@ function TitleState:stepTrails() self.trails = alive end +-- SuicuneFrameIterator (engine/movie/title.asm:217-249): advance once per +-- `suicuneEvery` frames, cycling the four frame bases. +function TitleState:advanceSuicune() + if #self.suicuneColor == 0 then return end + local c = self.suicuneTick + self.suicuneTick = (c + 1) % 256 + if c % self.suicuneEvery ~= 0 then return end + self.suicuneFrame = math.floor(c % (self.suicuneEvery * 4) + / self.suicuneEvery) + 1 +end + function TitleState:update(_dt) self.frameCounter = self.frameCounter + 1 self:advanceHooh() + self:advanceSuicune() if self.frameCounter % self.cloudScrollEvery == 0 then self.cloudScroll = (self.cloudScroll - 1) % 160 end self:spawnTrail() self:stepTrails() + if self.entranceScx > 0 then + -- TitleScreenEntrance polls no buttons and moves the gem by 2 a frame + -- (engine/menus/intro_menu.asm:1078-1107; engine/movie/title.asm:340-362). + self.entranceScx = math.max(0, self.entranceScx - self.entranceStep) + if self.gemY < self.gemRestY then + self.gemY = math.min(self.gemRestY, self.gemY + self.gemStep) + end + if self.entranceScx == 0 then + self:startMusic() + -- TitleScreenTimer only starts once the entrance scene hands over + -- (engine/menus/intro_menu.asm:1110-1136). + self.timeoutStart = self.frameCounter + end + return + end + + -- TitleScreenTimer / TitleScreenMain's run-down back into the attract + -- loop (engine/menus/intro_menu.asm:1125-1236). + if self.timeoutFrames and self.onTimeout + and self.frameCounter - (self.timeoutStart or 0) >= self.timeoutFrames then + self.onTimeout() + return + end + local input = self.game.input if input and (input:wasPressed("a") or input:wasPressed("start")) then if self.onContinue then self.onContinue() end @@ -242,10 +339,71 @@ function TitleState:drawCloudSpan(x0, x1) end end +-- TitleScreenEntrance's interlace: even lines slide in from the left, odd +-- from the right, converging as hSCX walks to 0 +-- (engine/menus/intro_menu.asm:1084-1103). +function TitleState:drawEntranceScreen(screen) + local G = love.graphics + local scx = self.entranceScx + if scx <= 0 then + G.draw(screen, 0, 0) + return + end + local w, h = screen:getDimensions() + local lines = math.min(self.entranceLines, h) + self.entranceQuad = self.entranceQuad or G.newQuad(0, 0, w, 1, w, h) + for line = 0, lines - 1 do + self.entranceQuad:setViewport(0, line, w, 1, w, h) + G.draw(screen, self.entranceQuad, line % 2 == 0 and -scx or scx, line) + end + -- hWY holds the copyright window off screen until the entrance lands + -- (engine/movie/title.asm:198-199; engine/menus/intro_menu.asm:1121-1122). + local bottom = (self.entranceHideBelow or h) - lines + if bottom > 0 then + self.entranceQuad:setViewport(0, lines, w, bottom, w, h) + G.draw(screen, self.entranceQuad, 0, lines) + end +end + function TitleState:drawContent() local G = love.graphics local screen, _, trail, hoohFrames = self:art() G.setColor(1, 1, 1, 1) + + local gem = self:gray() and (self.gemGray or self.gemColor) or self.gemColor + local suicuneFrames = nil + if #self.suicuneColor > 0 then + suicuneFrames = (self:gray() and #self.suicuneGray > 0) + and self.suicuneGray or self.suicuneColor + end + if gem or suicuneFrames then + -- Crystal's layering: the gem is OAM_PRIO so every BG colour 1-3 pixel + -- beats it; Suicune is BG; the window copyright covers Suicune's last + -- row (engine/movie/title.asm:81-85,334; engine/menus/intro_menu.asm:1121-1122). + local fill = self:gray() and SKY_GRAY or self.sky + G.setColor(fill[1], fill[2], fill[3], 1) + G.rectangle("fill", 0, 0, 160, 144) + G.setColor(1, 1, 1, 1) + if gem then G.draw(gem, self.gemX, self.gemY) end + if suicuneFrames then + local frame = suicuneFrames[self.suicuneFrame] or suicuneFrames[1] + if frame then G.draw(frame, self.suicuneX, self.suicuneY) end + end + if self.entranceScx <= 0 then + -- The pal-7 window line covers the BG once hWY lands at $88 + -- (engine/movie/title.asm:40-43; engine/menus/intro_menu.asm:1121-1122). + local bandTop = self.entranceHideBelow or 136 + local band = self.bandColor + G.setColor(band[1], band[2], band[3], 1) + G.rectangle("fill", 0, bandTop, 160, 144 - bandTop) + G.setColor(1, 1, 1, 1) + end + if screen then + self:drawEntranceScreen(screen) + end + return + end + if screen then -- title_screen.png already carries the cart's © GAME FREAK line on row 17. G.draw(screen, 0, 0) diff --git a/src/ui/gen2/TrainerCard.lua b/src/ui/gen2/TrainerCard.lua index 4b993c52..859fc424 100644 --- a/src/ui/gen2/TrainerCard.lua +++ b/src/ui/gen2/TrainerCard.lua @@ -39,6 +39,7 @@ local Chrome = require("src.ui.gen2.Chrome") local GbcPalette = require("src.render.GbcPalette") +local Gen2Save = require("src.core.gen2.Save") local TileSheet = require("src.ui.gen2.TileSheet") local TrainerCard = {} @@ -68,6 +69,19 @@ local KANTO_BADGES = { "EARTH", } +-- The two slots _CGB_TrainerCard swaps by gender: CHRIS and FALKNER/KrisPalette. +-- ../pokecrystal/engine/gfx/cgb_layouts.asm:619-624, data/trainers/palettes.asm:9-12 +local PLAYER_PALETTE, BORDER_PALETTE = 1, 2 + +-- Kris's attrmap: the border takes CHRIS's palette, the portrait takes hers, +-- the top-right corner follows the border, and Clair's face borrows hers +-- (../pokecrystal/engine/gfx/cgb_layouts.asm:649-666, :698-712). +local FEMALE_ZONES = { + { 14, 1, 5, 7, BORDER_PALETTE }, + { 18, 1, 1, 1, PLAYER_PALETTE }, + { 14, 14, 4, 2, BORDER_PALETTE }, +} + -- TrainerCard_JohtoBadgesOAM lists the badges in wJohtoBadges bit order, -- which is not the order they are drawn in: Mineral comes before Storm. local BADGE_OAM_ORDER = { @@ -92,10 +106,13 @@ function TrainerCard.new(game, opts) local gfx = (opts.menuGfx or data.gen2MenuGfx or {}).trainerCard self.gfx = gfx + self.female = Gen2Save.isFemale(self.save) and gfx ~= nil + and gfx.cardFemale ~= nil if gfx then -- One palette lookup per cell, flattened from the FillBoxCGB zones the -- way PackGfx does it. Anything outside a zone is palette 1. self.zone = {} + self.zoneDefault = BORDER_PALETTE for _, z in ipairs(gfx.paletteZones or {}) do for y = z[2], z[2] + z[4] - 1 do for x = z[1], z[1] + z[3] - 1 do @@ -103,11 +120,22 @@ function TrainerCard.new(game, opts) end end end + if self.female then + self.zoneDefault = PLAYER_PALETTE + for _, z in ipairs(FEMALE_ZONES) do + for y = z[2], z[2] + z[4] - 1 do + for x = z[1], z[1] + z[3] - 1 do + self.zone[y * SCREEN_W + x] = z[5] + end + end + end + end local function paletteFor(_, tx, ty) return self:colorsAt(tx, ty) end self.card = TileSheet.new({ - path = gfx.card, wide = gfx.cardTilesWide or 16, firstTile = 0, + path = (self.female and gfx.cardFemale) or gfx.card, + wide = gfx.cardTilesWide or 16, firstTile = 0, paletteFor = paletteFor, }) self.status = TileSheet.new({ @@ -152,7 +180,8 @@ function TrainerCard:pair(colors) end function TrainerCard:colorsAt(tx, ty) - local index = (self.zone and self.zone[ty * SCREEN_W + tx]) or 2 + local index = (self.zone and self.zone[ty * SCREEN_W + tx]) + or self.zoneDefault or BORDER_PALETTE return self:palette(index) end diff --git a/src/ui/gen2/UnownPrinter.lua b/src/ui/gen2/UnownPrinter.lua index 473a6061..332b4ab2 100644 --- a/src/ui/gen2/UnownPrinter.lua +++ b/src/ui/gen2/UnownPrinter.lua @@ -9,7 +9,7 @@ -- is drawn and driven entirely on the cartridge, and only the A press -- (`farcall PrintUnownStamp`, engine/printer/printer.asm) walks the screen -- out the serial port to a Game Boy Printer. There is no printer here, the --- same reason PrintDiploma stays stubbed in Specials.lua, so A lands on the +-- same reason PrintDiploma's own print goes nowhere, so A lands on the -- same arm a cartridge with nothing plugged into its link port takes: the -- stamp does not print and the screen stays up. Everything else is the -- cart's. diff --git a/src/ui/kit/Theme.lua b/src/ui/kit/Theme.lua index d786b85c..66a3fa30 100644 --- a/src/ui/kit/Theme.lua +++ b/src/ui/kit/Theme.lua @@ -65,6 +65,7 @@ local PAL = { railGold = { 255, 203, 5 }, -- Yellow cartridge (bright) railAmber = { 218, 145, 32 }, -- Gold cartridge (deeper metal) railSilver = { 190, 198, 210 }, -- Silver cartridge (cool light metal) + railCrystal = { 168, 120, 236 }, -- Crystal cartridge (translucent violet) } -- Semantic aliases kept so ported call sites read the same as before. PAL.cardBorder = PAL.line @@ -322,11 +323,13 @@ function Theme.meter(x, y, w, h, pct, c) end -- The 4px version rail across the top of both windows: the only brand --- colour on screen (Red / Blue / Yellow / Gold / Silver cartridge colours). +-- colour on screen (Red / Blue / Yellow / Gold / Silver / Crystal cartridge +-- colours). function Theme.versionRail(x, y, w, h) if not G then return end local bars = { PAL.railRed, PAL.railBlue, PAL.railGold, PAL.railAmber, PAL.railSilver, + PAL.railCrystal, } local seg = w / #bars for i, c in ipairs(bars) do diff --git a/src/world/gen2/FieldMoves.lua b/src/world/gen2/FieldMoves.lua index a9db2afc..66f8d57c 100644 --- a/src/world/gen2/FieldMoves.lua +++ b/src/world/gen2/FieldMoves.lua @@ -36,6 +36,7 @@ -- `action` names the World method that carries it out; everything else in the -- table is that action's argument. +local GameVersion = require("src.core.GameVersion") local Permissions = require("src.world.gen2.Permissions") local Runtime = require("src.mods.Runtime") local Strings = require("src.core.Strings") @@ -152,14 +153,41 @@ FieldMoves.KANTO_BADGES = { -- World:setEngineFlag / World:engineFlag route badge ids here so there is one -- store again, the same way ENGINE_BUG_CONTEST_TIMER is routed to -- save.bugContest rather than kept as a second copy. -FieldMoves.BADGE_FLAG = {} -for index, name in ipairs(FieldMoves.JOHTO_BADGES) do - FieldMoves.BADGE_FLAG[25 + index] = { store = "badges", name = name } -end -for index, name in ipairs(FieldMoves.KANTO_BADGES) do - FieldMoves.BADGE_FLAG[33 + index] = { store = "kantoBadges", name = name } +-- Crystal declares 162 engine flags to Gold's 93 and the badge block sits one +-- higher (constants/engine_flags.asm:39 vs pokegold's :38), so the ids come +-- from the cache's engineFlagOrder when it has one. +-- Crystal only; pokegold constants/engine_flags.asm:4-111 has no such row. +FieldMoves.FEMALE_FLAG_NAME = "ENGINE_PLAYER_IS_FEMALE" + +function FieldMoves.bindEngineFlags(order) + local byName = {} + if type(order) == "table" then + -- pairs, not ipairs: a const_skip leaves a hole and ipairs would stop + -- there, silently dropping every badge past it. + for index, name in pairs(order) do + if type(index) == "number" and type(name) == "string" then + byName[name] = index - 1 + end + end + end + local flags = {} + local function place(names, store, goldBase) + for index, name in ipairs(names) do + local id = byName["ENGINE_" .. name .. "BADGE"] or (goldBase + index) + flags[id] = { store = store, name = name } + end + end + place(FieldMoves.JOHTO_BADGES, "badges", 25) + place(FieldMoves.KANTO_BADGES, "kantoBadges", 33) + FieldMoves.BADGE_FLAG = flags + -- The flag IS wPlayerGender's bit 0, so World routes it to the gender byte + -- (data/events/engine_flags.asm:131, constants/engine_flags.asm:121). + FieldMoves.FEMALE_FLAG = byName[FieldMoves.FEMALE_FLAG_NAME] + return flags end +FieldMoves.bindEngineFlags(nil) + function FieldMoves.hasBadge(save, badge) if not badge then return true end local owned = save and save.player and save.player.badges @@ -357,6 +385,39 @@ FieldMoves.STATE_SPRITE = { surf_pika = "SPRITE_SURFING_PIKACHU", } +-- data/sprites/player_sprites.asm:8-13 KrisStateSprites, the other half of the +-- table GetPlayerSprite picks between (engine/overworld/overworld.asm:55-64). +FieldMoves.STATE_SPRITE_FEMALE = { + normal = "SPRITE_KRIS", + bike = "SPRITE_KRIS_BIKE", + surf = "SPRITE_SURF", + surf_pika = "SPRITE_SURFING_PIKACHU", +} + +-- wPlayerGender's PLAYERGENDER_FEMALE_F, as the save spells it +-- (constants/ram_constants.asm:176-177). +function FieldMoves.isFemale(gender) + return gender == "female" +end + +-- GetPlayerSprite's table pick and row walk +-- (engine/overworld/overworld.asm:57-64, :67-75). +function FieldMoves.stateSprite(state, gender) + local table_ = FieldMoves.isFemale(gender) + and FieldMoves.STATE_SPRITE_FEMALE or FieldMoves.STATE_SPRITE + return table_[state] or table_[FieldMoves.PLAYER_NORMAL] +end + +function FieldMoves.playerSprite(gender) + return FieldMoves.stateSprite(FieldMoves.PLAYER_NORMAL, gender) +end + +-- Whether the cache carries Kris at all; Gold and Silver have no +-- KrisStateSprites to extract (pokegold data/sprites/player_sprites.asm:1-6). +function FieldMoves.hasGenderChoice(sprites) + return (sprites and sprites[FieldMoves.STATE_SPRITE_FEMALE.normal]) ~= nil +end + function FieldMoves.isBiking(state) return state == FieldMoves.PLAYER_BIKE end @@ -536,10 +597,14 @@ end -- FlashFunction.CheckUseFlash: badge, then wTimeOfDayPalset == DARKNESS_PALSET -- -- so FLASH is refused in a lit cave and on a route alike, and the refusal -- is FieldMoveFailed's generic "Can't use that here." +-- +-- ../pokecrystal/engine/events/overworld.asm:284-287 puts SpecialAerodactylChamber +-- between the two, and its carry is a second way into `.useflash`. function FieldMoves.flashFromMenu(ctx) local refused = badgeGate(ctx, "FLASH") if refused then return refused end - if not ctx.dark then + local chamber = ctx.openAerodactylWall and ctx.openAerodactylWall() + if not ctx.dark and not chamber then return { ok = false, text = FieldMoves.TEXT.CANT_USE_HERE } end return { ok = true, action = "flash", text = FieldMoves.TEXT.BLINDING_FLASH } @@ -562,6 +627,11 @@ function FieldMoves.surfFromMenu(ctx) or FieldMoves.directionBlocked(ctx.playerColl, ctx.facing) then return { ok = false, text = FieldMoves.TEXT.CANT_SURF } end + -- Crystal's added `farcall CheckFacingObject`, which pokegold's :339 tags + -- BUG (../pokecrystal/engine/events/overworld.asm:364-365). + if ctx.facingObject and GameVersion.fixes().surfOntoNpc then + return { ok = false, text = FieldMoves.TEXT.CANT_SURF } + end return { ok = true, action = "surf", state = FieldMoves.surfType(ctx.mon), diff --git a/src/world/gen2/UnownWords.lua b/src/world/gen2/UnownWords.lua new file mode 100644 index 00000000..852679eb --- /dev/null +++ b/src/world/gen2/UnownWords.lua @@ -0,0 +1,225 @@ +-- ../pokecrystal/engine/events/unown_walls.asm:102 DisplayUnownWords, and the +-- Unown alphabet it writes out of ../pokecrystal/constants/charmap.asm:424; +-- :1 HoOhChamber, :13 OmanyteChamber, :54 SpecialAerodactylChamber and :81 +-- SpecialKabutoChamber, the four routines that open the chambers' walls. + +local Assets = require("src.render.Assets") +local Font = require("src.render.Font") +local GbcPalette = require("src.render.GbcPalette") +local Palettes = require("src.world.gen2.Palettes") +local Sound = require("src.core.Sound") + +local UnownWords = {} +UnownWords.__index = UnownWords +UnownWords.isOpaque = false + +-- engine/tilesets/map_palettes.asm:40, ../pokecrystal/constants/tileset_constants.asm:55 +UnownWords.BANK1 = 0x80 +UnownWords.BROWN = 6 + +-- ../pokecrystal/engine/events/unown_walls.asm:225 .YChar, :237 .ZChar, :249 .DashChar +local FIXED = { + [0x60] = { 0x5b, 0x5c, 0x4d, 0x5d }, + [0x62] = { 0x4e, 0x4f, 0x5e, 0x5f }, + [0x64] = { 0x02, 0x03, 0x03, 0x02 }, +} + +function UnownWords.square(char) + local fixed = FIXED[char] + if fixed then return fixed[1], fixed[2], fixed[3], fixed[4] end + local base = UnownWords.BANK1 + char + return base, base + 1, base + 0x10, base + 0x11 +end + +-- ../pokecrystal/engine/events/unown_walls.asm:122-127 +function UnownWords.origin(wall) + return (wall.x1 or 0) + 1, (wall.y1 or 0) + 2 +end + +-- ../pokecrystal/engine/events/unown_walls.asm:119 MenuBox, home/menu.asm:131 GetMenuBoxDims +function UnownWords.boxRect(wall) + local x1, y1 = wall.x1 or 0, wall.y1 or 0 + return x1, y1, (wall.x2 or x1) - x1 + 1, (wall.y2 or y1) - y1 + 1 +end + +-- ../pokecrystal/engine/events/unown_walls.asm:182 _DisplayUnownWords_CopyWord +function UnownWords.layout(wall) + local tx, ty = UnownWords.origin(wall) + local out = {} + for index, char in ipairs(wall.chars or {}) do + local tl, tr, bl, br = UnownWords.square(char) + out[index] = { + tx = tx + (index - 1) * 2, ty = ty, + tl = tl, tr = tr, bl = bl, br = br, + } + end + return out +end + +-- ../pokecrystal/constants/event_flags.asm:486-489, the four Crystal-only +-- EVENT_WALL_OPENED_IN_*_CHAMBER bits. +UnownWords.WALL_OPENED = { + HO_OH = 806, + KABUTO = 807, + OMANYTE = 808, + AERODACTYL = 809, +} + +-- ../pokecrystal/engine/events/unown_walls.asm:60, :87 -- the +-- GetMapAttributesPointer compare the two non-special routines are gated on. +UnownWords.CHAMBER_MAPS = { + HO_OH = "RUINS_OF_ALPH_HO_OH_CHAMBER", + KABUTO = "RUINS_OF_ALPH_KABUTO_CHAMBER", + OMANYTE = "RUINS_OF_ALPH_OMANYTE_CHAMBER", + AERODACTYL = "RUINS_OF_ALPH_AERODACTYL_CHAMBER", +} + +-- ../pokecrystal/engine/events/unown_walls.asm:4, :22 +UnownWords.HO_OH = "HO_OH" +UnownWords.WATER_STONE = "WATER_STONE" + +-- ../pokecrystal/engine/events/unown_walls.asm:16 EventFlagAction CHECK_FLAG +function UnownWords.wallOpened(events, chamber) + local flag = UnownWords.WALL_OPENED[chamber] + if not (events and flag) then return false end + return events:get(flag) and true or false +end + +-- ../pokecrystal/engine/events/unown_walls.asm:8 EventFlagAction SET_FLAG +function UnownWords.openWall(events, chamber) + local flag = UnownWords.WALL_OPENED[chamber] + if not (events and flag) then return false end + if events:get(flag) then return false end + events:set(flag, true) + return true +end + +-- ../pokecrystal/engine/events/unown_walls.asm:2-5: wPartySpecies[0], which +-- holds EGG rather than the hatchling's species while a slot is an egg. +function UnownWords.leadIsHoOh(party) + local lead = party and party[1] + if not lead or lead.isEgg then return false end + return lead.species == UnownWords.HO_OH +end + +-- ../pokecrystal/engine/events/unown_walls.asm:28-43: wPartyCount down to 1, +-- MON_ITEM on each, so the LAST slot holding one is the one it stops at. +function UnownWords.waterStoneSlot(party) + party = party or {} + for slot = #party, 1, -1 do + local mon = party[slot] + if mon and mon.item == UnownWords.WATER_STONE then return slot end + end + return nil +end + +-- ../pokecrystal/engine/events/unown_walls.asm:54, whose carry FlashFunction +-- jumps on at ../pokecrystal/engine/events/overworld.asm:285. +function UnownWords.aerodactylChamber(events, mapId) + if mapId ~= UnownWords.CHAMBER_MAPS.AERODACTYL then return false end + UnownWords.openWall(events, "AERODACTYL") + return true +end + +-- ../pokecrystal/engine/events/unown_walls.asm:81, off the escape rope arm of +-- EscapeRopeOrDig (../pokecrystal/engine/events/overworld.asm:809). +function UnownWords.kabutoChamber(events, mapId) + if mapId ~= UnownWords.CHAMBER_MAPS.KABUTO then return false end + UnownWords.openWall(events, "KABUTO") + return true +end + +-- ../pokecrystal/constants/script_constants.asm:319 UNOWNWORDS_* +function UnownWords.wallFor(data, scriptVar) + local walls = data and data.gen2EventTables and data.gen2EventTables.unownWalls + if not walls then return nil end + return walls[(scriptVar or 0) + 1] +end + +-- opts: wall (an events.unownWalls row), world, onClose() +function UnownWords.new(game, opts) + opts = opts or {} + local self = setmetatable({}, UnownWords) + self.game = game + self.wall = opts.wall + self.world = opts.world + self.onClose = opts.onClose + self.done = false + self.squares = self.wall and UnownWords.layout(self.wall) or {} + return self +end + +-- ../pokecrystal/engine/events/unown_walls.asm:155 _DisplayUnownWords_FillAttr +function UnownWords:tileset() + local world = self.world + local map = world and world.map + local def = map and map.def + local tileset = def and world.tilesets and world.tilesets[def.tileset] + if not tileset or not tileset.image then return nil end + if self.atlas == nil then + local ok, image = pcall(Assets.image, tileset.image) + self.atlas = ok and image or false + if self.atlas then self.atlas:setFilter("nearest", "nearest") end + local set = world.palettes + and Palettes.bgSet(world.palettes, def, world.daytime or "DAY") + self.colors = set and set[UnownWords.BROWN] or nil + end + if not self.atlas then return nil end + return tileset, self.atlas +end + +-- ../pokecrystal/engine/events/unown_walls.asm:147 PlayClickSFX, :148 CloseWindow +function UnownWords:finish() + if self.done then return end + self.done = true + local game = self.game + if game and game.data then Sound.play(game.data, "SFX_READ_TEXT_2") end + if game and game.stack then game.stack:pop() end + if self.onClose then self.onClose() end +end + +function UnownWords:update(_dt) + if self.done then return end + local input = self.game and self.game.input + if not input then return end + if input:wasPressed("a") or input:wasPressed("b") then self:finish() end +end + +function UnownWords:draw() + local wall = self.wall + if not wall then return end + local bx, by, bw, bh = UnownWords.boxRect(wall) + Font.drawBox(bx, by, bw, bh) + local tileset, atlas = self:tileset() + if not tileset then return end + local perRow = tileset.tilesPerRow or 16 + local aw, ah = atlas:getDimensions() + local quads = {} + local function quadFor(tile) + local q = quads[tile] + if not q then + q = love.graphics.newQuad((tile % perRow) * 8, + math.floor(tile / perRow) * 8, 8, 8, aw, ah) + quads[tile] = q + end + return q + end + local function body() + love.graphics.setColor(1, 1, 1, 1) + for _, square in ipairs(self.squares) do + local x, y = square.tx * 8, square.ty * 8 + love.graphics.draw(atlas, quadFor(square.tl), x, y) + love.graphics.draw(atlas, quadFor(square.tr), x + 8, y) + love.graphics.draw(atlas, quadFor(square.bl), x, y + 8) + love.graphics.draw(atlas, quadFor(square.br), x + 8, y + 8) + end + end + if self.colors and GbcPalette.available() then + GbcPalette.with(self.colors, body) + else + body() + end + love.graphics.setColor(0, 0, 0, 1) +end + +return UnownWords diff --git a/src/world/gen2/World.lua b/src/world/gen2/World.lua index ef84997a..df18d937 100644 --- a/src/world/gen2/World.lua +++ b/src/world/gen2/World.lua @@ -41,6 +41,7 @@ local HiddenItems = require("src.world.gen2.HiddenItems") local Mail = require("src.core.gen2.Mail") local Map = require("src.world.gen2.Map") local Palettes = require("src.world.gen2.Palettes") +local UnownWords = require("src.world.gen2.UnownWords") local Mon = require("src.battle.gen2.Mon") local Movement = require("src.script.gen2.Movement") local Music = require("src.core.Music") @@ -116,6 +117,14 @@ local VAR = { XCOORD = 0x12, YCOORD = 0x13, SPECIALPHONECALL = 0x14, + -- ../pokecrystal/constants/script_constants.asm:69-74, the six rows Gold's + -- table stops short of; ../pokecrystal/engine/overworld/variables.asm:62-67. + BT_WIN_STREAK = 0x15, + KURT_APRICORNS = 0x16, + CALLERID = 0x17, + BLUECARDBALANCE = 0x18, + BUENASPASSWORD = 0x19, + KENJI_BREAK = 0x1a, } -- constants/ram_constants.asm:293 wPlayerState. PLAYER_SKATE (2) has no row: @@ -374,6 +383,13 @@ local function itemByIndex(items, index) return nil end +-- One WRAM byte, the width every VAR_* store is (`ld a, [de]` / `ld [de], a`). +local function byteOf(value) + local n = math.floor(tonumber(value) or 0) + if n < 0 then n = 0 end + return n % 256 +end + -- CountSetBits over a { key = true } flag table: VAR.DEXCAUGHT, VAR.DEXSEEN -- and VAR.BADGES are all "how many of these are set" reads off one. local function countFlags(flags) @@ -810,6 +826,7 @@ function World:load() self.text = self:dataTable("gen2Text", "data/generated/text.lua") or {} self.constants = self:dataTable("gen2Constants", "data/generated/constants.lua") or {} + FieldMoves.bindEngineFlags(self.constants.engineFlagOrder) -- The side tables a script command NAMES rather than carries: the phone -- book, the in-game trades, the elevator's floor labels and the decoration -- descriptions. A cache built before the extractor reached them has no @@ -1256,7 +1273,7 @@ function World:load() end, -- ---- encounters -------------------------------------------------------- - setSwarm = function(group, mapNum) self:setSwarm(group, mapNum) end, + setSwarm = function(group, mapNum, kind) self:setSwarm(group, mapNum, kind) end, rollWild = function() return self:rollWild() end, -- The WRAM bytes the ENGINE owns rather than the script: nil means "not -- mine", and the VM falls back to its own sparse store. @@ -1573,9 +1590,78 @@ function World:readVar(varId) if varId == VAR.SPECIALPHONECALL then return self:specialCall() end + if varId >= VAR.BT_WIN_STREAK and varId <= VAR.KENJI_BREAK then + return self:crystalVar(varId) + end return 0 end +-- ../pokecrystal/engine/overworld/variables.asm:62-67, the six .VarActionTable +-- rows Crystal appends past VAR_SPECIALPHONECALL. +function World:crystalVar(varId) + -- ../pokecrystal/ram/wram.asm:3286 wCurCaller, which this port parks on the + -- VM (src/script/gen2/CallAsm.lua:190). + if varId == VAR.CALLERID then + return (self.vm and self.vm.curPhoneCaller) or 0 + end + local save = self.game and self.game.save + if not save then return 0 end + -- ../pokecrystal/ram/wram.asm:1703 wNrOfBeatenBattleTowerTrainers. + if varId == VAR.BT_WIN_STREAK then + return byteOf(Gen2Save.battleTowerState(save).streak) + end + -- ../pokecrystal/engine/events/kurt.asm:24,45 wKurtApricornQuantity. + if varId == VAR.KURT_APRICORNS then + return byteOf(save.kurtApricornQuantity) + end + local crystal = Gen2Save.crystalState(save) + if varId == VAR.BLUECARDBALANCE then + return byteOf(crystal.buenaPassword.balance) + end + if varId == VAR.BUENASPASSWORD then + return byteOf(crystal.buenaPassword.word) + end + -- ../pokecrystal/engine/overworld/time.asm:136 SampleKenjiBreakCountdown. + if varId == VAR.KENJI_BREAK then + return byteOf(crystal.kenjiBreak) + end + return 0 +end + +-- The three of them Script_writevar can reach: RETVAR_ADDR_DE rows write the +-- variable itself, RETVAR_STRBUF2 rows write the scratch buffer and are lost +-- (../pokecrystal/engine/overworld/variables.asm:21-25). +function World:setCrystalVar(varId, value) + value = byteOf(value) + if varId == VAR.CALLERID then + if self.vm then self.vm.curPhoneCaller = value end + return + end + local save = self.game and self.game.save + if not save then return end + local buena = Gen2Save.crystalState(save).buenaPassword + if varId == VAR.BLUECARDBALANCE then + buena.balance = value + elseif varId == VAR.BUENASPASSWORD then + buena.word = value + end +end + +-- ../pokecrystal/engine/events/kurt.asm:19-45 SelectApricornForKurt, whose +-- byte is what `verbosegiveitemvar , VAR_KURT_APRICORNS` hands over. +function World:setKurtApricornQuantity(count) + local save = self.game and self.game.save + if not save then return end + save.kurtApricornQuantity = byteOf(count) +end + +-- ../pokecrystal/engine/overworld/time.asm:136-142, the 3..6 day roll. +function World:setKenjiBreak(days) + local save = self.game and self.game.save + if not save then return end + Gen2Save.crystalState(save).kenjiBreak = byteOf(days) +end + -- Script_checkver: 0 for Gold, 1 for Silver (constants/misc_constants.asm -- GS_VERSION). function World:gsVersion() @@ -1622,6 +1708,11 @@ function World:engineFlag(flag) local owned = player and player[badge.store] return type(owned) == "table" and owned[badge.name] == true end + -- Same one-store rule for ENGINE_PLAYER_IS_FEMALE, which IS wPlayerGender + -- (../pokecrystal/data/events/engine_flags.asm:131); Gold's FEMALE_FLAG is nil. + if flag == FieldMoves.FEMALE_FLAG then + return Gen2Save.isFemale(save) + end -- Same one-store rule for the day care. data/events/engine_flags.asm:18-20 -- maps the three ids onto DAYCAREMAN_HAS_EGG_F / DAYCAREMAN_HAS_MON_F / -- DAYCARELADY_HAS_MON_F, i.e. they ARE the bits DayCare_InitBreeding, @@ -1661,6 +1752,13 @@ function World:setEngineFlag(flag, value) save.player[badge.store][badge.name] = value and true or nil return end + -- InitGender is the only writer on the cart, so this exists only to keep a + -- stray setflag out of save.engineFlags (../pokecrystal/engine/menus/init_gender.asm:23-42). + if flag == FieldMoves.FEMALE_FLAG and save then + save.player = save.player or {} + save.player.gender = value and "female" or "male" + return + end -- The write half of the day-care aliases. DayCareManScript_Outside's -- `clearflag ENGINE.DAY_CARE_MAN_HAS_EGG` (maps/Route34.asm) is the ONLY cart -- script that writes any of the three, and it is idempotent because @@ -1697,6 +1795,9 @@ function World:writeVar(varId, value) local state = PLAYER_STATE_BY_ID[value or 0] if state then self:applyPlayerState(state) end end + if varId >= VAR.BT_WIN_STREAK and varId <= VAR.KENJI_BREAK then + self:setCrystalVar(varId, value) + end end function World:battleType() @@ -1854,6 +1955,16 @@ end -- (maps/Route36.asm:58, and again at :70 on the DidntCatchSudowoodo arm) hands -- the same slot to the Route 37 twins. So the pooled objects that read -- through the slot have to go with it. +-- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1564-1575 writes +-- the sprite byte into wMapObjects, the LIVE copy, so the map def is untouched. +function World:setObjectSprite(objectId, spriteName) + local npc = self:objectEntity(objectId) + local spriteDef = spriteName and self.sprites and self.sprites[spriteName] + if not (npc and spriteDef) then return false end + if npc:setSpriteDef(spriteDef) then self:applySpritePalette(npc) end + return true +end + function World:setVariableSprite(slot, spriteIndex) if slot == nil then return end self.variableSprites[slot] = spriteIndex @@ -2318,12 +2429,10 @@ end -- the map pair and DAILYFLAGS1_SWARM are set by the one command. A port that -- stored only the map would leave the Dunsparce call live forever, because -- CheckSwarmFlag answers off the flag and clears the pair itself. -function World:setSwarm(group, mapNum) +function World:setSwarm(group, mapNum, kind) local save = self.game and self.game.save if not save then return end - save.dailyFlags = save.dailyFlags or {} - save.dailyFlags.swarm = true - save.swarmMap = self:mapIdByGroupMap(group, mapNum) + Roamers.Swarm.set(save, self:mapIdByGroupMap(group, mapNum), kind) end -- Script_loadwildmon's other half: roll the CURRENT map's own table the way a @@ -3472,7 +3581,7 @@ function World:specialHooks() takeItem = function(index, qty) return self:takeItem(index, qty) end, engineFlag = function(flag) return self:engineFlag(flag) end, setEngineFlag = function(flag, v) self:setEngineFlag(flag, v) end, - setSwarm = function(group, mapNum) self:setSwarm(group, mapNum) end, + setSwarm = function(group, mapNum, kind) self:setSwarm(group, mapNum, kind) end, dayCare = function(side, onDone) self:dayCare(side, onDone) end, givePokeMail = function(mail) return self:givePokeMail(mail) end, checkPokeMail = function(mail, onDone) self:checkPokeMail(mail, onDone) end, @@ -3504,6 +3613,14 @@ function World:specialHooks() magnetTrain = function(toGoldenrod, onDone) self:magnetTrain(toGoldenrod, onDone) end, + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:220-223 + startTowerBattle = function(trainer, onDone) + return self:startBattle({ trainer = trainer, battleTower = true }, onDone) + end, + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:1552-1575 + setObjectSprite = function(objectId, spriteName) + return self:setObjectSprite(objectId, spriteName) + end, pushScreen = function(id, opts) return self:pushScreen(id, opts) end, monName = function(index) local id, def = speciesByIndex( @@ -3537,9 +3654,36 @@ function World:specialHooks() self:openScriptMenu(header, "vertical", onChoose) end, rareWildMon = function() return self:rareWildMon() end, + -- ../pokecrystal/engine/menus/save.asm:181 AskOverwriteSaveFile and :266 + -- _SaveGameData, the two halves of Link_SaveGame (:63). + saveFileState = function() return self:saveFileState() end, + writeSave = function() return self:writeSave() end, + setKurtApricornQuantity = function(n) self:setKurtApricornQuantity(n) end, + setKenjiBreak = function(days) self:setKenjiBreak(days) end, } end +-- AskOverwriteSaveFile's two reads: wSaveFileExists, and +-- CompareLoadedAndSavedPlayerID (../pokecrystal/engine/menus/save.asm:224), +-- which is what picks AlreadyASaveFileText over AnotherSaveFileText. +function World:saveFileState() + local save = self.game and self.game.save + local version = save and save.version + if not Gen2Save.exists(version) then return false, false end + local stored = Gen2Save.load(version) + local mine = save and save.player and save.player.id + local theirs = stored and stored.player and stored.player.id + return true, (mine ~= nil and mine == theirs) +end + +-- _SaveGameData, through the writer the SAVE menu is handed +-- (src/core/Game2.lua:435) so the save.write veto holds here too. +function World:writeSave() + local game = self.game + if not (game and game.writeSave) then return false end + return game:writeSave() ~= false +end + -- RandomUnseenWildMon's lookup half. The routine picks one of the THREE -- RAREST grass slots on the map (`and %11 / jr z` rerolls 0, so it is slots 5, -- 6 or 7 of the seven) and drops it if that species is also one of the FOUR @@ -4441,6 +4585,9 @@ function World:useEscapeRope(itemId) local items = self.game and self.game.data and self.game.data.items local def = items and items[itemId or "ESCAPE_ROPE"] self:takeItem(def and def.index, 1) + -- ../pokecrystal/engine/events/overworld.asm:809, between .escaperope and + -- QueueScript. + UnownWords.kabutoChamber(self.events, self.map and self.map.id) self.queuedFieldMove = { ok = true, action = "escaperope", destMap = destMapId, destWarp = destWarp, @@ -5186,6 +5333,9 @@ function World:fieldContext(mon) facingX = fx, facingY = fy, facingColl = map:cellCollision(fx, fy), playerColl = map:cellCollision(p.cellX, p.cellY), + -- Crystal's SurfFunction.TrySurf is the only field move that asks + -- (../pokecrystal/engine/events/overworld.asm:364). + facingObject = self:facingObject(), upColl = map:cellCollision(p.cellX, p.cellY - 1), tileset = map.def and map.def.tileset, facingBlock = blockId, @@ -5199,6 +5349,11 @@ function World:fieldContext(mon) -- FlashFunction tests wTimeOfDayPalset, not the map header, so a -- PALETTE_DARK map that FLASH has already lit refuses a second FLASH. dark = Palettes.isDarkness(map.def, self:hour(), self.flashUsed), + -- ../pokecrystal/engine/events/overworld.asm:285, called by FLASH only and + -- only after the badge gate, because it SETS the wall-opened flag. + openAerodactylWall = function() + return UnownWords.aerodactylChamber(self.events, map.id) + end, } end @@ -5328,12 +5483,26 @@ function World:refreshMapImages() return true end +-- wPlayerGender, the byte GetPlayerSprite and AddMapObject both branch on +-- (engine/overworld/overworld.asm:61-64, engine/overworld/player_object.asm:32-39). +function World:playerGender() + local save = self.game and self.game.save + return save and save.player and save.player.gender or nil +end + +-- The Chris/Kris sheet the player wears with no state on it +-- (data/sprites/player_sprites.asm:2, :9). +function World:playerSpriteName() + return FieldMoves.playerSprite(self:playerGender()) or PLAYER_SPRITE +end + -- UpdatePlayerSprite (data/sprites/player_sprites.asm ChrisStateSprites): the -- player's sprite is a pure function of wPlayerState, which is what makes -- getting on and off a Lapras a one-byte change rather than an animation. function World:applyPlayerState(state) self.playerState = state or FieldMoves.PLAYER_NORMAL - local name = FieldMoves.STATE_SPRITE[self.playerState] or PLAYER_SPRITE + local name = FieldMoves.stateSprite(self.playerState, self:playerGender()) + or PLAYER_SPRITE local def = self.sprites and self.sprites[name] if def and self.player then self.player:setSprite(def) @@ -5884,6 +6053,9 @@ function World:startBattle(opts, onDone) -- wBattleType, when the script armed one: the FORCESHINY / TRAP -- no-escape rules live in Battle:tryRun and the force-switch handler. battleType = opts.battleType, + -- wInBattleTowerBattle (../pokecrystal/engine/events/battle_tower/ + -- battle_tower.asm:220-223), which turns DoBadgeTypeBoosts off. + battleTower = opts.battleTower, }) self:playBattleMusic(opts) local function pushBattle() @@ -7397,26 +7569,43 @@ function World:interact() return self:interactBody() end +-- CheckFacingObject (engine/overworld/npc_movement.asm:229-248): "Double the +-- distance for counter tiles." A Pokecenter nurse and a Mart clerk stand +-- BEHIND a COLL_COUNTER tile, so the cell the player faces is the counter +-- itself and the object is one further on. Without this the press finds an +-- empty wall and nothing happens -- which is to say no nurse and no clerk in +-- the game could be talked to at all. +-- +-- Only the OBJECT lookup is doubled, exactly as the cart does it: bg events +-- and the tile-collision events still read the tile actually faced. +function World:facingObjectCell() + local p = self.player + if not p then return nil end + local d = Map.DELTA[p.facing] or Map.DELTA.down + local fx, fy = p.cellX + d[1], p.cellY + d[2] + if self.map and Permissions.isCounter(self.map:cellCollision(fx, fy)) then + return p.cellX + d[1] * 2, p.cellY + d[2] * 2 + end + return fx, fy +end + +-- The carry CheckFacingObject answers with: IsNPCAtCoord, and then only when +-- that object's OBJECT_WALKING reads STANDING (npc_movement.asm:250-266). +function World:facingObject() + local ox, oy = self:facingObjectCell() + if not ox then return nil end + local npc = self:npcAt(ox, oy) + if npc and npc.moving then return nil end + return npc +end + function World:interactBody() if self:busy() or not self.player or not self.vm then return false end local p = self.player if p.moving then return false end local d = Map.DELTA[p.facing] local fx, fy = p.cellX + d[1], p.cellY + d[2] - -- CheckFacingObject (engine/overworld/npc_movement.asm:229): "Double the - -- distance for counter tiles." A Pokecenter nurse and a Mart clerk stand - -- BEHIND a COLL_COUNTER tile, so the cell the player faces is the counter - -- itself and the object is one further on. Without this the press finds an - -- empty wall and nothing happens -- which is to say no nurse and no clerk in - -- the game could be talked to at all. - -- - -- Only the OBJECT lookup is doubled, exactly as the cart does it: bg events - -- and the tile-collision events below still read the tile actually faced. - local ox, oy = fx, fy - if self.map and Permissions.isCounter(self.map:cellCollision(fx, fy)) then - ox, oy = p.cellX + d[1] * 2, p.cellY + d[2] * 2 - end - local npc = self:npcAt(ox, oy) + local npc = self:npcAt(self:facingObjectCell()) -- TryObjectEvent writes hLastTalked for EVERY A-press dispatch; scripts -- then use LAST_TALKED (`disappear`, `applymovementlasttalked`) without any -- setlasttalked of their own. The port only wrote it from the explicit @@ -8510,13 +8699,13 @@ function World:setMap(mapId, cx, cy, facing, opts) -- GetWarpDestCoords / EnterMapConnection / EnterMapSpawnPoint write wXCoord -- and wYCoord BEFORE HandleNewMap (data/maps/setup_scripts.asm:79-106). local face = facing or (self.player and self.player.facing) or "down" - local chris = self.sprites and self.sprites[PLAYER_SPRITE] + local playerDef = self.sprites and self.sprites[self:playerSpriteName()] if self.player then self.player.cellX, self.player.cellY = cx, cy self.player.px, self.player.py = cx * 16, cy * 16 self.player.facing = face - if chris and not self.player.sprite then - self.player:setSprite(chris) + if playerDef and not self.player.sprite then + self.player:setSprite(playerDef) end if not opts.seamless then self.player.moving = false @@ -8524,7 +8713,7 @@ function World:setMap(mapId, cx, cy, facing, opts) self.player.targetX, self.player.targetY = nil, nil end else - self.player = Player.new(cx, cy, face, chris) + self.player = Player.new(cx, cy, face, playerDef) end -- LoadMapObjects rebuilds OBJECT_FLAGS2 from scratch, so IN_GRASS is decided -- by the cell the player arrives on (engine/overworld/map_objects.asm:247). diff --git a/tests/crystal_import_test.lua b/tests/crystal_import_test.lua new file mode 100644 index 00000000..915d732b --- /dev/null +++ b/tests/crystal_import_test.lua @@ -0,0 +1,165 @@ +-- Crystal manifest shape and the specials surface the extractor pins to it. +-- ROM-free: reads tools/rom_manifest_crystal.json out of the source tree. +-- luajit tests/crystal_import_test.lua +-- Also dofile'd by tests/run_tests.lua. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("crystal import") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Json = require("src.link.Json") +local GameVersion = require("src.core.GameVersion") + +local function manifest(path) + local file = assert(io.open(path, "r")) + local data = assert(Json.decode(file:read("*a"))) + file:close() + return data +end + +local function size(tbl) + local n = 0 + for _ in pairs(tbl or {}) do n = n + 1 end + return n +end + +local crystal = manifest("tools/rom_manifest_crystal.json") +local gold = manifest("tools/rom_manifest_gold.json") + +-- ------- 1. the manifest the launcher row points at + +eq(GameVersion.VERSIONS.crystal.manifest, "tools/rom_manifest_crystal.json", + "the crystal row names this manifest") +eq(crystal.romSha1, GameVersion.VERSIONS.crystal.sha1, + "and the manifest carries the same sha1") +eq(crystal.generation, 2, "generation 2") +eq(crystal.format, gold.format, "same manifest format as Gold") + +-- ------- 2. content counts + +eq(size(crystal.maps), 388, "388 maps") +eq(size(crystal.tilesets), 36, "36 tilesets") +eq(size(crystal.pokemonAssets), 251, "251 pokemon asset rows") +eq(size(crystal.constants), 50, "50 constants keys") +eq(type(crystal.constants.engineFlagOrder), "table", + "the 50th is engineFlagOrder, the key Gold has no counterpart for") +check(size(crystal.symbols) > 2000, + ("symbols table is populated (%d)"):format(size(crystal.symbols))) +check(size(crystal.charmap) > 200, + ("charmap is populated (%d)"):format(size(crystal.charmap))) +check(#(crystal.fontCharmap or {}) > 200, + ("fontCharmap is populated (%d)"):format(#(crystal.fontCharmap or {}))) + +-- pokecrystal/constants/map_constants.asm:504, pokegold:484 +eq(size(gold.maps), 368, "Gold names 368") +local added, removed = 0, 0 +for name in pairs(crystal.maps) do + if not gold.maps[name] then added = added + 1 end +end +for name in pairs(gold.maps) do + if not crystal.maps[name] then removed = removed + 1 end +end +eq(added, 21, "Crystal adds 21 maps") +eq(removed, 1, "and drops one") +-- pokegold/constants/map_constants.asm:152 +eq(crystal.maps.ECRUTEAK_TIN_TOWER_BACK_ENTRANCE, nil, + "the one Gold map Crystal drops is ECRUTEAK_TIN_TOWER_BACK_ENTRANCE") +check(crystal.maps.BATTLE_TOWER_1F ~= nil, "and BATTLE_TOWER_1F is new") + +-- ------- 3. every map row is addressable + +local badMap +for name, row in pairs(crystal.maps) do + if type(row) ~= "table" then badMap = name; break end +end +eq(badMap, nil, "every map row is a table") + +-- ------- 4. the text labels resolve, as they must for the Dialogue stage + +local labels = (crystal.text or {}).labels or {} +check(#labels > 800, ("crystal names %d text labels"):format(#labels)) +local unresolved = {} +for _, label in ipairs(labels) do + if not crystal.symbols[label] then unresolved[#unresolved + 1] = label end +end +eq(#unresolved, 0, + ("every crystal text label resolves to a symbol (%s)") + :format(table.concat(unresolved, ", "):sub(1, 60))) + +-- ------- 5. specials: constants.specialOrder against the handler table + +local Specials = require("src.script.gen2.Specials") + +local order = crystal.constants.specialOrder +check(type(order) == "table", "constants.specialOrder is a list") +eq(#order, 169, "Crystal's SpecialsPointers has 169 rows") + +local missing = {} +for index, name in ipairs(order) do + if not Specials.ALL[name] then + missing[#missing + 1] = ("%d (%s)"):format(index - 1, name) + end +end +eq(#missing, 0, + ("every crystal special has a handler (%s)") + :format(table.concat(missing, ", "):sub(1, 80))) + +local goldOrder = gold.constants.specialOrder +local goldMissing = {} +for index, name in ipairs(goldOrder or {}) do + if not Specials.ALL[name] then + goldMissing[#goldMissing + 1] = ("%d (%s)"):format(index - 1, name) + end +end +eq(#goldMissing, 0, + ("every gold special has a handler too (%s)") + :format(table.concat(goldMissing, ", "):sub(1, 80))) + +local sameOrder = #order == #(goldOrder or {}) +if sameOrder then + for index, name in ipairs(order) do + if goldOrder[index] ~= name then sameOrder = false; break end + end +end +check(not sameOrder, "the Crystal and Gold special orders are not the same") + +-- ------- 6. handler bookkeeping + +local overlap = {} +for name in pairs(Specials.STUBS) do + if Specials.HANDLERS[name] then overlap[#overlap + 1] = name end +end +eq(#overlap, 0, + ("HANDLERS and STUBS are disjoint (%s)"):format(table.concat(overlap, ", "))) + +local unexplained = {} +for name in pairs(Specials.STUBS) do + local reason = (Specials.STUB_REASONS or {})[name] + if type(reason) ~= "string" or reason == "" then + unexplained[#unexplained + 1] = name + end +end +eq(#unexplained, 0, + ("every stub records a reason (%s)") + :format(table.concat(unexplained, ", "):sub(1, 80))) + +-- ------- 7. the Crystal-only assets the completeness gate pins + +local importerSource = assert(io.open("src/import/RomImporter.lua", "r")) +local importerText = importerSource:read("*a") +importerSource:close() +for _, path in ipairs({ + "assets/generated/title/crystal_logo.png", + "assets/generated/title/crystal_wordmark.png", + "assets/generated/title/crystal_suicune.png", + "assets/generated/splash/ditto.png", + "assets/generated/intro/chris.png", + "assets/generated/intro/kris.png", +}) do + check(importerText:find(path, 1, true) ~= nil, + "RomImporter still requires " .. path) +end + +S.finish() diff --git a/tests/crystal_world_test.lua b/tests/crystal_world_test.lua new file mode 100644 index 00000000..d86d2226 --- /dev/null +++ b/tests/crystal_world_test.lua @@ -0,0 +1,158 @@ +-- Crystal world data: the roamer roster and swarm pairs that differ from +-- Gold, then the facts only a real Crystal cache can answer. +-- Self-contained: `luajit tests/crystal_world_test.lua`; also dofile'd by +-- tests/run_tests.lua. The cache half SKIPs when no crystal cache is present. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("crystal world") +local check, eq = S.check, S.eq + +local Permissions = require("src.world.gen2.Permissions") +local Roamers = require("src.core.gen2.Roamers") +local Swarm = Roamers.Swarm + +-- ---------------------------------------------------------------- ROM-free + +check(Permissions.isWalkable(0x00), "COLL_FLOOR walkable") +check(not Permissions.isWalkable(0x07), "COLL_WALL blocked") +-- pokecrystal/constants/collision_constants.asm:19 +check(Permissions.isGrass(0x18), "COLL_TALL_GRASS is grass") +check(Permissions.isWater(0x29), "COLL_WATER is water") +check(Permissions.isWarpCollision(0x71), "COLL_DOOR is a warp") +check(Permissions.isLedge(0xa0), "COLL_HOP_DOWN is a ledge") +eq(Permissions.of(0xff), Permissions.WALL, "a missing coll reads as wall") + +local bare = {} +Roamers.init(bare) +eq(#bare.roamers, 3, "no cache -> the three-beast Gold roster") +check(Roamers.SPECIES ~= nil and #Roamers.SPECIES == 3, + "Roamers.SPECIES survives as the ROM-free fallback") + +-- pokecrystal/constants/script_constants.asm:256-257 +local pair = {} +Swarm.set(pair, "DARK_CAVE_VIOLET_ENTRANCE", 0) +Swarm.set(pair, "ROUTE_35", 1) +eq(pair.swarmMaps.DUNSPARCE, "DARK_CAVE_VIOLET_ENTRANCE", "SWARM_DUNSPARCE key") +eq(pair.swarmMaps.YANMA, "ROUTE_35", "SWARM_YANMA key, independently") +eq(Swarm.onMap(pair, "ROUTE_35"), "YANMA", "the Yanma map answers YANMA") +eq(Swarm.mapId(pair, "YANMA"), "ROUTE_35", "mapId takes a kind") +eq(Swarm.mapId(pair), "DARK_CAVE_VIOLET_ENTRANCE", "and defaults to Gold's key") +Swarm.timeEvents(pair, 100) +check(Swarm.timeEvents(pair, 101), "the next day ends the swarm") +eq(Swarm.onMap(pair, "ROUTE_35"), nil, "and both pairs are stranded") + +local legacy = { swarmMap = "ROUTE_35", dailyFlags = { swarm = true } } +eq(Swarm.mapId(legacy), "ROUTE_35", "an old scalar save answers mapId") +eq(Swarm.onMap(legacy, "ROUTE_35"), "DUNSPARCE", "normalized onto the Gold key") +eq(Swarm.onMap(legacy, "ROUTE_36"), nil, "another map is not the swarm map") +check(Swarm.entry(legacy, { swarmGrass = { ROUTE_35 = { "row" } }, grass = {} }, + "ROUTE_35", "grass") ~= nil, "and its swarm table still resolves") + +-- ------------------------------------------------------------ cache-gated + +local cache = os.getenv("CRYSTAL_CACHE") +if not cache then + local home = os.getenv("HOME") or "" + cache = home .. "/Library/Application Support/LOVE/crystal-dev/crystal" +end + +local mapsPath = cache .. "/data/generated/maps.lua" +local mapsFile = io.open(mapsPath, "r") +if not mapsFile then + check(true, "crystal cache absent : SKIP") + S.finish() + return +end +mapsFile:close() + +local function loadLua(rel) + local chunk = loadfile(cache .. "/" .. rel) + if not chunk then return nil end + local ok, value = pcall(chunk) + return ok and value or nil +end + +local maps = loadLua("data/generated/maps.lua") +local encounters = loadLua("data/generated/encounters.lua") +local tilesets = loadLua("data/generated/tilesets.lua") +local constants = loadLua("data/generated/constants.lua") + +check(maps ~= nil, "maps.lua loads") +check(encounters ~= nil, "encounters.lua loads") +check(tilesets ~= nil, "tilesets.lua loads") +check(constants ~= nil, "constants.lua loads") + +-- ---- 1. the maps Phase 1 has to reach + +local count = 0 +for _ in pairs(maps or {}) do count = count + 1 end +eq(count, 388, "the cache carries 388 maps") +for _, id in ipairs({ + "NEW_BARK_TOWN", "PLAYERS_HOUSE_1F", "PLAYERS_HOUSE_2F", "ELMS_LAB", + "ROUTE_29", "CHERRYGROVE_CITY", "ROUTE_30", "ROUTE_31", "VIOLET_CITY", + "SPROUT_TOWER_1F", "VIOLET_GYM", +}) do + check(maps[id] ~= nil, "the New Bark to Violet route has " .. id) +end +check(maps.BATTLE_TOWER_1F ~= nil, "and the Crystal-only Battle Tower") +-- pokegold/constants/map_constants.asm:152 +eq(maps.ECRUTEAK_TIN_TOWER_BACK_ENTRANCE, nil, + "the one map Crystal drops is absent") + +-- ---- 2. roamers (CT-4) + +check(type(encounters.roamMons) == "table", + "the cache emits encounters.roamMons") +eq(#encounters.roamMons, 2, "Crystal seeds two beasts, not three") +eq(encounters.roamMons[1].species, "RAIKOU", "slot 1 is Raikou") +eq(encounters.roamMons[1].map, "ROUTE_42", "on Route 42") +eq(encounters.roamMons[2].species, "ENTEI", "slot 2 is Entei") +eq(encounters.roamMons[2].map, "ROUTE_37", "on Route 37") +eq(encounters.roamMons[1].level, 40, "both start at level 40") +eq(encounters.roamMons[2].level, 40, "both start at level 40") + +local save = {} +Roamers.init(save, { encounters = encounters }) +eq(#save.roamers, 2, "Roamers.init over the cache builds two slots") +eq(save.roamers[1].species, "RAIKOU", "slot 1 Raikou") +eq(save.roamers[2].species, "ENTEI", "slot 2 Entei") +eq(save.roamers[3], nil, "and no Suicune slot") +eq(save.roamers[1].hp, 0, "hp is zeroed so stats regenerate on contact") + +local data = {} +Roamers.init(data, { data = { gen2Encounters = encounters } }) +eq(#data.roamers, 2, "the opts.data path resolves the same roster") + +eq(Roamers.checkEncounter(save, "ROUTE_38", false, function() return 3 end), nil, + "the Suicune slot roll finds nothing on a Crystal save") +local hit = Roamers.checkEncounter(save, "ROUTE_42", false, function() return 1 end) +check(hit and hit.species == "RAIKOU", "the Raikou roll still hits") + +-- ---- 3. the swarm tables the kind byte indexes + +check(encounters.swarmGrass ~= nil, "the cache carries swarmGrass") +check(encounters.swarmGrass.DARK_CAVE_VIOLET_ENTRANCE ~= nil, + "with the Dunsparce table") +check(encounters.swarmGrass.ROUTE_35 ~= nil, "and the Yanma table") + +-- ---- 4. the tileset palette-map bank +-- pokecrystal.sym 13:40e5 TilesetJohtoPalMap (pokegold.sym 02:40c7) +local johto = (tilesets or {}).TILESET_JOHTO +check(johto ~= nil, "TILESET_JOHTO is in the cache") +eq(johto and johto.palMap and johto.palMap.bank, 0x13, + "TilesetJohtoPalMap is read out of bank $13") +eq(johto and johto.palMap and johto.palMap.address, 0x40e5, + "at $40e5") +local kanto = (tilesets or {}).TILESET_KANTO +eq(kanto and kanto.palMap and kanto.palMap.bank, 0x13, + "TilesetKantoPalMap is bank $13 too") +eq(kanto and kanto.palMap and kanto.palMap.address, 0x4075, "at $4075") +check(johto and johto.tilePalettes and #johto.tilePalettes > 0, + "and the map decoded to a per-tile palette list") + +-- ---- 5. the special table the cache pins + +eq(#(constants.specialOrder or {}), 169, + "the cache's specialOrder has Crystal's 169 rows") + +S.finish() diff --git a/tests/drivers/crystal_battle_tower_shots.lua b/tests/drivers/crystal_battle_tower_shots.lua new file mode 100644 index 00000000..1db2af83 --- /dev/null +++ b/tests/drivers/crystal_battle_tower_shots.lua @@ -0,0 +1,173 @@ +-- The Battle Tower lobby, driven in a real game. +-- +-- POKEPORT_IDENTITY=lead-card POKEPORT_GAME=crystal POKEPORT_VERSION=crystal \ +-- POKEPORT_SHOT_DIR=/tmp/tower \ +-- POKEPORT_DRIVER=tests/drivers/crystal_battle_tower_shots.lua love . +-- +-- Three sections, all on maps/BattleTower1F.asm's own extracted script: +-- A an illegal party, so _CheckForBattleTowerRules prints its refusals +-- B a legal party through Menu_ChallengeExplanationCancel and the room menu +-- C the walk to the elevator the chosen room starts +-- +-- Section B overrides the TryQuickSave stub for the length of the run: +-- src/script/gen2/Specials.lua:2516 answers 0, and BattleTower1F.asm:84-85 +-- backs out of the whole challenge on that, so the desk cannot be walked +-- past without it. +local U = require("tests.drivers.util") + +local BattleTower = require("src.core.gen2.BattleTower") +local BattleTowerMenu = require("src.ui.gen2.BattleTowerMenu") +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") +local ScriptMenu = require("src.ui.gen2.ScriptMenu") +local Vm = require("src.script.gen2.Vm") + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-tower" + local fails, shots = 0, 0 + + local function say(line) print("[driver] " .. line) end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + local function shot(name) + shots = shots + 1 + U.shot(game, ("%s/%02d-%s.png"):format(out, shots, name)) + end + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + local function top() return game.stack:top() end + local function isMenu() return getmetatable(top()) == ScriptMenu end + local function isRoomMenu() return getmetatable(top()) == BattleTowerMenu end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + say("version=" .. GameVersion.get() .. " engine=" .. GameVersion.engine()) + + local function party(spec) + local list = {} + for _, row in ipairs(spec) do + local m = Mon.new(game.data, row[1], row[2]) + m.item = row[3] + list[#list + 1] = m + end + game.save.party = list + end + + local function enterLobby() + while top() do tap("b", 2) end + assert(world:setMap("BATTLE_TOWER_1F", 7, 7, "up"), "no BATTLE_TOWER_1F") + U.wait(40) + end + + -- maps/BattleTower1F.asm:55-73: A through the welcome, NO to the + -- explanation offer, and the menu is the next command. + local function talkToMenu(limit) + for _ = 1, limit or 200 do + if isMenu() then return true end + if world.choicebox then tap("b", 4) else tap("a", 4) end + end + return false + end + + say("--- A: an illegal party at the desk") + party({ { "TYPHLOSION", 20 } }) + enterLobby() + shot("lobby") + ok(talkToMenu(), "the receptionist reaches Menu_ChallengeExplanationCancel") + shot("challenge-menu") + ok(isMenu() and #top().items == 3, "three rows: Challenge/Explanation/Cancel") + tap("a", 6) + + local pages = {} + for _ = 1, 40 do + local body = world.lastText + if type(body) == "string" and body ~= "" and pages[#pages] ~= body then + pages[#pages + 1] = body + shot("rules-" .. #pages) + end + if not world:busy() and top() == nil then break end + tap("a", 4) + end + local joined = table.concat(pages, " | ") + say("pages: " .. joined) + ok(joined:find("You're not ready", 1, true) ~= nil, + "_ExcuseMeYoureNotReadyText printed") + ok(joined:find("Only three", 1, true) ~= nil, + "_OnlyThreeMonMayBeEnteredText printed") + ok(joined:find("Please return when", 1, true) ~= nil, + "_BattleTowerReturnWhenReadyText printed") + + say("--- B: a legal party, the room menu, the walk out") + local savedQuickSave = Vm.SPECIALS.TryQuickSave + Vm.SPECIALS.TryQuickSave = function(vm) vm.scriptVar = 1 end + + party({ { "TYPHLOSION", 20 }, { "FERALIGATR", 20, "BERRY" }, + { "MEGANIUM", 20, "GOLD_BERRY" } }) + enterLobby() + ok(talkToMenu(), "the desk reaches the menu again") + tap("a", 6) + + local sawSavePrompt = false + for _ = 1, 120 do + if isRoomMenu() then break end + if world.choicebox then + sawSavePrompt = true + shot("save-prompt") + tap("a", 6) + else + tap("a", 4) + end + end + ok(sawSavePrompt, "Text_SaveBeforeEnteringBattleRoom asked first") + ok(isRoomMenu(), "special BattleTowerRoomMenu pushed Gen2BattleTowerMenu") + shot("room-menu") + + if isRoomMenu() then + local screen = top() + ok(#screen.rows == BattleTower.PRE_HOF_LEVEL_GROUPS, + "no Hall of Fame, so four rooms are offered") + -- L:10 with an L20 party is the refusal at mobile_46.asm:3915-3917. + tap("a", 6) + ok(screen.phase == "message", "picking L:10 prints the level refusal") + shot("tops-this-level") + for _ = 1, 150 do + if screen.phase == "pick" then break end + U.wait(1) + end + ok(screen.phase == "pick", "and the menu comes back after the hold") + tap("up", 6) + shot("room-menu-l20") + tap("a", 6) + end + + for _ = 1, 240 do + if not world:busy() and top() == nil then break end + tap("a", 4) + end + local tower = BattleTower.state(game.save) + ok(tower.levelGroup ~= nil, "the level group survived the menu") + say("levelGroup=" .. tostring(game.world.vm and game.world.vm.btLevelGroup) + .. " reward=" .. tostring(tower.reward) + .. " challenge=" .. tostring(tower.challenge) + .. " map=" .. tostring(world.map and world.map.id)) + ok(tower.reward ~= nil, + "BATTLETOWERACTION_CHOOSEREWARD banked a prize on the way out") + shot("after-desk") + + U.wait(180) + shot("elevator-or-hallway") + say("map after the walk: " .. tostring(world.map and world.map.id)) + + Vm.SPECIALS.TryQuickSave = savedQuickSave + + say(fails == 0 and "PASS" or (fails .. " FAILURES")) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/crystal_boot_smoke.lua b/tests/drivers/crystal_boot_smoke.lua new file mode 100644 index 00000000..2d8d8fe3 --- /dev/null +++ b/tests/drivers/crystal_boot_smoke.lua @@ -0,0 +1,249 @@ +-- Smoke: the whole Crystal boot chain, with no driver shortcut. +-- +-- POKEPORT_GAME=crystal POKEPORT_BOOT_CINEMA=1 \ +-- POKEPORT_SHOT_DIR=

\ +-- POKEPORT_DRIVER=tests/drivers/crystal_boot_smoke.lua love . +-- +-- copyright -> GameFreak -> Crystal intro -> title -> intro menu -> NEW GAME +-- -> clock -> Oak speech -> name pick -> naming screen -> the bedroom -> +-- start menu -> outdoors -> a wild battle. Every step is asserted by the +-- class of the state on the stack, so a broken hand-off names the screen it +-- stalled on instead of just hanging. +local U = require("tests.drivers.util") + +local CopyrightSplash = require("src.ui.gen2.CopyrightSplash") +local CrystalIntro = require("src.ui.gen2.CrystalIntro") +local GameFreakPresents = require("src.ui.gen2.GameFreakPresents") +local GenderSelect = require("src.ui.gen2.GenderSelect") +local InitClock = require("src.ui.gen2.InitClock") +local MainMenu = require("src.ui.gen2.MainMenu") +local NamePick = require("src.ui.gen2.NamePick") +local NamingScreen = require("src.ui.gen2.NamingScreen") +local OakSpeech = require("src.ui.gen2.OakSpeech") +local OptionsMenu = require("src.ui.gen2.OptionsMenu") +local StartMenu = require("src.ui.gen2.StartMenu") +local TitleState = require("src.ui.gen2.TitleState") + +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-boot" + local log = io.open(os.getenv("POKEPORT_BOOT_LOG") + or (out .. "/boot.log"), "w") + + local function say(line) + print("[driver] " .. line) + if log then log:write(line .. "\n"); log:flush() end + end + + local function bail(reason) + say("FAIL " .. reason) + if log then log:close() end + love.event.quit(1) + error(reason, 0) + end + + local function top() + return game.stack:top() + end + + local function isA(class) + local state = top() + return state ~= nil and getmetatable(state) == class + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function waitFor(label, predicate, frames) + for _ = 1, frames or 900 do + if predicate() then return end + U.wait(1) + end + bail(("stalled waiting for %s (top is %s)"):format(label, tostring(top()))) + end + + local function pick(menu, value) + for i, item in ipairs(menu.list.items) do + if item.value == value then menu.list.index = i end + end + end + + if GameVersion.get() ~= "crystal" then + bail("booted " .. tostring(GameVersion.get()) .. ", not crystal") + end + if GameVersion.engine() ~= "crystal" then + bail("engine lineage is " .. tostring(GameVersion.engine())) + end + say("version=" .. GameVersion.get() .. " engine=" .. GameVersion.engine()) + + U.wait(10) + if not isA(CopyrightSplash) then + bail("boot did not start at the copyright splash (top " + .. tostring(top()) .. ")") + end + say("OK copyright") + U.shot(game, out .. "/01-copyright.png") + + waitFor("GameFreak presents", function() return isA(GameFreakPresents) end) + U.wait(90) + say("OK gamefreak") + U.shot(game, out .. "/02-gamefreak.png") + + -- ../pokecrystal/engine/movie/intro.asm:1 + waitFor("the Crystal intro", function() return isA(CrystalIntro) end) + U.wait(240) + say("OK crystal intro") + U.shot(game, out .. "/03-intro.png") + U.wait(240) + U.shot(game, out .. "/03b-intro.png") + tap("start") + + waitFor("the title screen", function() return isA(TitleState) end) + U.wait(90) + say("OK title") + U.shot(game, out .. "/04-title.png") + for _ = 1, 3 do tap("start", 3) end + + waitFor("the intro menu", function() return isA(MainMenu) end) + say("OK main menu") + U.shot(game, out .. "/05-mainmenu.png") + + local menu = top() + pick(menu, "option") + tap("a") + waitFor("the options screen", function() return isA(OptionsMenu) end) + U.shot(game, out .. "/06-options.png") + tap("b") + waitFor("the intro menu again", function() return isA(MainMenu) end) + + menu = top() + pick(menu, "new") + U.shot(game, out .. "/07-newgame.png") + tap("a") + + -- ../pokecrystal/engine/menus/init_gender.asm:23 InitGender, which + -- PlayerProfileSetup runs first (engine/menus/intro_menu.asm:80-84). + waitFor("the gender screen", function() return isA(GenderSelect) end, 300) + say("OK gender select") + U.shot(game, out .. "/07b-gender.png") + tap("a") + + -- ../pokecrystal/engine/menus/intro_menu.asm:628 + waitFor("the clock screen", function() return isA(InitClock) end, 300) + say("OK init clock") + U.shot(game, out .. "/08-initclock.png") + for _ = 1, 60 do + if isA(OakSpeech) then break end + tap("a", 2) + end + waitFor("the Oak speech", function() return isA(OakSpeech) end, 300) + local oak = top() + say("OK oak speech, demo mon = " .. tostring(oak.demoSpecies)) + if oak.demoSpecies ~= "WOOPER" then + bail("Oak's demo mon is " .. tostring(oak.demoSpecies) + .. ", Crystal's is WOOPER") + end + U.wait(60) + U.shot(game, out .. "/09-oak.png") + + local shotDemo = false + for _ = 1, 400 do + if isA(NamePick) then break end + if not shotDemo and isA(OakSpeech) and top().pic == top().marillPic then + U.wait(45) + U.shot(game, out .. "/10-wooper.png") + shotDemo = true + end + tap("a", 2) + end + if not isA(NamePick) then + bail("Oak speech never reached the name picker (top " + .. tostring(top()) .. ")") + end + say("OK name pick" .. (shotDemo and " (demo pic captured)" or "")) + -- ../pokecrystal/engine/menus/intro_menu.asm:738 NamePlayer + waitFor("the name menu to slide in", + function() return top().slide == nil end, 240) + U.shot(game, out .. "/11-namepick.png") + + local picker = top() + picker.cursor = 1 + tap("a") + waitFor("the naming screen", function() return isA(NamingScreen) end) + local naming = top() + tap("a") + tap("right") + tap("a") + if naming.text ~= "AB" then + bail("typed name is " .. tostring(naming.text) .. ", expected AB") + end + say("OK naming screen") + U.shot(game, out .. "/12-naming.png") + naming.row = naming:bottomRow() + naming.col = 6 + tap("a") + + for _ = 1, 600 do + if game.phase == "play" and game.world and game.world.map then break end + tap("a", 2) + end + if not (game.phase == "play" and game.world and game.world.map) then + bail("never reached the overworld (top is " .. tostring(top()) .. ")") + end + if game.save.player.name ~= "AB" then + bail("player name is " .. tostring(game.save.player.name)) + end + if game.world.map.id ~= "PLAYERS_HOUSE_2F" then + bail("new game started on " .. tostring(game.world.map.id) + .. ", expected the bedroom") + end + say("OK overworld, map = " .. game.world.map.id + .. ", name = " .. tostring(game.save.player.name)) + U.wait(20) + U.shot(game, out .. "/13-bedroom.png") + + tap("start") + waitFor("the start menu", function() return isA(StartMenu) end) + say("OK start menu") + U.shot(game, out .. "/14-startmenu.png") + tap("b") + waitFor("the overworld again", function() return top() == nil end) + + if not game.world:setMap("NEW_BARK_TOWN", 13, 6, "down") then + bail("could not load NEW_BARK_TOWN") + end + U.wait(30) + if game.world.map.id ~= "NEW_BARK_TOWN" then + bail("setMap landed on " .. tostring(game.world.map.id)) + end + local tileset = game.world.map.tileset or {} + say("OK outdoors, tileset = " .. tostring(tileset.id) + .. ", tilePalettes = " .. tostring(#(tileset.tilePalettes or {}))) + U.shot(game, out .. "/15-newbark.png") + + local player = Mon.new(game.data, "CYNDAQUIL", 12) + if not (player and #player.moves > 0) then + bail("could not build a CYNDAQUIL from the Crystal pokemon.lua") + end + local wild = Mon.new(game.data, "WOOPER", 5) + if not wild then bail("could not build a wild WOOPER") end + game.save.party = { player } + if not game.world:startBattle({ wild = wild }) then + bail("startBattle failed") + end + U.wait(240) + say("OK battle, " .. player.species .. " L" .. player.level + .. " vs " .. wild.species .. " L" .. wild.level) + U.shot(game, out .. "/16-battle.png") + + say("PASS crystal boot chain in " .. out) + if log then log:close() end + love.event.quit(0) +end diff --git a/tests/drivers/crystal_f2_save_and_vars.lua b/tests/drivers/crystal_f2_save_and_vars.lua new file mode 100644 index 00000000..bb3e0113 --- /dev/null +++ b/tests/drivers/crystal_f2_save_and_vars.lua @@ -0,0 +1,227 @@ +-- TryQuickSave and the Crystal script VARs, in a real Crystal game. +-- +-- POKEPORT_IDENTITY=f2-crystal POKEPORT_GAME=crystal POKEPORT_VERSION=crystal \ +-- POKEPORT_SHOT_DIR=/tmp/f2 \ +-- POKEPORT_DRIVER=tests/drivers/crystal_f2_save_and_vars.lua love . +-- +-- A ../pokecrystal/maps/BattleTower1F.asm:80-86 with NO monkeypatch: the +-- desk's own `writetext / yesorno`, then `special TryQuickSave` -- the +-- overwrite prompt, the SAVING pages and a real file on disk -- and the +-- room menu it can only reach on a TRUE. +-- B ../pokecrystal/maps/RadioTower2F.asm:135-146: the correct password's +-- `readvar / addval 1 / writevar VAR_BLUECARDBALANCE`, through the real +-- World, over a save and a reload, and then BuenaPrize spending it. +local U = require("tests.drivers.util") + +local BattleTowerMenu = require("src.ui.gen2.BattleTowerMenu") +local BuenaPassword = require("src.ui.gen2.BuenaPassword") +local Mon = require("src.battle.gen2.Mon") +local Save = require("src.core.gen2.Save") +local ScriptMenu = require("src.ui.gen2.ScriptMenu") +local Specials = require("src.script.gen2.Specials") + +local VAR_BLUECARDBALANCE = 0x18 +local VAR_BUENASPASSWORD = 0x19 + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-f2" + local fails, shots = 0, 0 + + local function say(line) + print("[driver] " .. line) + io.stdout:flush() + end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + local function shot(name) + shots = shots + 1 + U.shot(game, ("%s/%02d-%s.png"):format(out, shots, name)) + end + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + local function top() return game.stack:top() end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + local save = game.save + + ok(Specials.STUB_REASONS.TryQuickSave == nil, + "TryQuickSave is a handler, not a stub") + ok(Specials.STUB_REASONS.SampleKenjiBreakCountdown == nil, + "SampleKenjiBreakCountdown is a handler too") + + --------------------------------------------------------------- section B + say("--- B: Buena's Blue Card, over a save and a reload") + + ok(world:setMap("RADIO_TOWER_2F", 5, 5, "down") == true, "on RADIO_TOWER_2F") + U.wait(30) + + local crystal = Save.crystalState(save) + crystal.buenaPassword.balance = 0 + crystal.buenaPassword.word = 0x00 + crystal.buenaPassword.day = nil + + -- The three rows the correct-answer arm runs, straight off the extracted + -- opcode table, so the round trip is World:readVar -> Vm -> World:writeVar. + local function awardPoint() + local started = world.vm:start({ + { op = "readvar", var = VAR_BLUECARDBALANCE }, + { op = "addval", args = { 1 } }, + { op = "writevar", var = VAR_BLUECARDBALANCE }, + }) + ok(started == true, "the award rows started (vm idle)") + for _ = 1, 120 do + if not world.vm:running() then break end + U.wait(1) + end + end + for _ = 1, 3 do awardPoint() end + say("blue card balance: " .. tostring(world:readVar(VAR_BLUECARDBALANCE))) + ok(world:readVar(VAR_BLUECARDBALANCE) == 3, + "three correct passwords are three points") + ok(crystal.buenaPassword.balance == 3, "and the points are in save.crystal") + + -- The password itself is a RETVAR_ADDR_DE row too; BuenasPassword parks the + -- day's roll there through the same writevar path. + world:writeVar(VAR_BUENASPASSWORD, 0x24) + ok(world:readVar(VAR_BUENASPASSWORD) == 0x24, "wBuenasPassword reads back") + + -- The map load that used to eat it: scriptVars is rebuilt empty at + -- World.lua:579. + ok(world:setMap("RADIO_TOWER_1F", 5, 5, "down") == true, "walked downstairs") + U.wait(20) + ok(world:readVar(VAR_BLUECARDBALANCE) == 3, "a map load does not eat it") + + ok(game:writeSave() ~= false, "saved with the balance on it") + local reloaded = Save.load(save.version) + local reloadedBalance = reloaded and reloaded.crystal + and reloaded.crystal.buenaPassword + and reloaded.crystal.buenaPassword.balance + say("reloaded blue card balance: " .. tostring(reloadedBalance)) + ok(reloadedBalance == 3, "and it survives a save and a reload") + ok(reloaded and reloaded.crystal.buenaPassword.word == 0x24, + "so does the password") + + -- BuenaPrize, which could never dispense anything on a balance of 0. + -- data/items/buena_prizes.asm's first row is ULTRA_BALL at 2 points. + save.inventory = save.inventory or {} + save.inventory.ULTRA_BALL = nil + local prizeIndex + for index, name in ipairs(world.vm.specialOrder or {}) do + if name == "BuenaPrize" then prizeIndex = index - 1 break end + end + ok(prizeIndex ~= nil, "BuenaPrize is in constants.specialOrder") + world.vm:start({ { op = "special", id = prizeIndex } }) + local sawPrizeMenu = false + for _ = 1, 300 do + if not world.vm:running() and top() == nil then break end + if getmetatable(top()) == BuenaPassword then + if not sawPrizeMenu then + sawPrizeMenu = true + say("prize menu balance shown: " .. tostring(top().balance)) + shot("prize-menu") + tap("a", 6) -- ULTRA BALL + else + tap("b", 6) -- second pass: leave the shop + end + else + tap("a", 4) + end + end + ok(sawPrizeMenu, "BuenaPrize opened its list") + say("ULTRA_BALL x" .. tostring(save.inventory.ULTRA_BALL) + .. " balance=" .. tostring(world:readVar(VAR_BLUECARDBALANCE))) + ok((save.inventory.ULTRA_BALL or 0) >= 1, "the prize was handed over") + ok(world:readVar(VAR_BLUECARDBALANCE) == 1, "and two points were spent") + shot("after-prize") + + --------------------------------------------------------------- section A + say("--- A: the Battle Tower desk, with the real TryQuickSave") + + -- A file has to already exist for AskOverwriteSaveFile to have anything to + -- ask about (`ld a, [wSaveFileExists] / and a / jr z, .erase`). + ok(game:writeSave() ~= false, "a first save is on disk") + ok(Save.exists(save.version), "Save.exists agrees") + + save.party = {} + for _, row in ipairs({ { "TYPHLOSION", 20 }, { "FERALIGATR", 20 }, + { "MEGANIUM", 20 } }) do + local mon = Mon.new(game.data, row[1], row[2]) + save.party[#save.party + 1] = mon + end + + for _ = 1, 40 do + if top() == nil then break end + tap("b", 2) + end + ok(world:setMap("BATTLE_TOWER_1F", 7, 7, "up") == true, "on BATTLE_TOWER_1F") + U.wait(40) + shot("tower-lobby") + + local function isMenu() return getmetatable(top()) == ScriptMenu end + local function isRoomMenu() return getmetatable(top()) == BattleTowerMenu end + + local reached = false + for _ = 1, 200 do + if isMenu() then reached = true break end + if world.choicebox then tap("b", 4) else tap("a", 4) end + end + ok(reached, "the receptionist reaches Menu_ChallengeExplanationCancel") + tap("a", 6) -- CHALLENGE + + -- Two yes/no prompts now, not one: Text_SaveBeforeEnteringBattleRoom and + -- then AskOverwriteSaveFile's own, which the stub never asked. + local prompts, pages = 0, {} + for _ = 1, 240 do + if isRoomMenu() then break end + if world.choicebox then + prompts = prompts + 1 + shot("prompt-" .. prompts) + say("prompt " .. prompts .. ": " .. tostring(world.lastText)) + tap("a", 6) + else + local body = world.lastText + if type(body) == "string" and body ~= "" and pages[#pages] ~= body then + pages[#pages + 1] = body + end + tap("a", 4) + end + end + say("pages: " .. table.concat(pages, " | ")) + ok(prompts >= 2, + "AskOverwriteSaveFile asked its own question (" .. prompts .. " prompts)") + local joined = table.concat(pages, " | ") + ok(joined:find("SAVING", 1, true) ~= nil, "the SAVING page was shown") + ok(joined:find("saved", 1, true) ~= nil, "and SavedTheGameText") + ok(isRoomMenu(), "TryQuickSave answered TRUE and the room menu opened") + shot("room-menu") + + local onDisk = Save.load(save.version) + ok(onDisk ~= nil, "the challenge's own save reached disk") + ok(onDisk and onDisk.position and onDisk.position.map == "BATTLE_TOWER_1F", + "and it was written from the lobby: " + .. tostring(onDisk and onDisk.position and onDisk.position.map)) + + -- The room menu's own header is STATICMENU_DISABLE_B, so the way out of the + -- desk is forward: pick a room and let the walk to the elevator finish. + for _ = 1, 400 do + if not world:busy() and top() == nil then break end + tap("a", 4) + end + say("map after the desk: " .. tostring(world.map and world.map.id)) + for _ = 1, 40 do + if top() == nil then break end + game.stack:pop() + end + + say(fails == 0 and "PASS" or (fails .. " FAILURES")) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/crystal_gender_flag_shots.lua b/tests/drivers/crystal_gender_flag_shots.lua new file mode 100644 index 00000000..a548283c --- /dev/null +++ b/tests/drivers/crystal_gender_flag_shots.lua @@ -0,0 +1,260 @@ +-- U2 verification: ENGINE_PLAYER_IS_FEMALE end to end, plus the four gendered +-- pictures and the Crystal surf refusal. Not a suite; a shot harness. +-- +-- POKEPORT_GAME=crystal POKEPORT_BOOT_CINEMA=1 POKEPORT_GENDER=girl \ +-- POKEPORT_SHOT_DIR= \ +-- POKEPORT_DRIVER=tests/drivers/crystal_gender_flag_shots.lua love . +local U = require("tests.drivers.util") + +local BattleState = require("src.ui.gen2.BattleState") +local FieldMoves = require("src.world.gen2.FieldMoves") +local GameVersion = require("src.core.GameVersion") +local GenderSelect = require("src.ui.gen2.GenderSelect") +local HallOfFame = require("src.ui.gen2.HallOfFame") +local MainMenu = require("src.ui.gen2.MainMenu") +local Mon = require("src.battle.gen2.Mon") +local NamePick = require("src.ui.gen2.NamePick") +local NamingScreen = require("src.ui.gen2.NamingScreen") +local OakSpeech = require("src.ui.gen2.OakSpeech") +local Screens = require("src.ui.Screens") + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/u2-gender" + local want = (os.getenv("POKEPORT_GENDER") or "girl"):lower() + local log = io.open(out .. "/driver.log", "w") + + local function say(line) + print("[u2] " .. line) + if log then log:write(line .. "\n"); log:flush() end + end + + local function done(code) + if log then log:close() end + love.event.quit(code) + if code ~= 0 then error("driver failed", 0) end + coroutine.yield() + end + + local function bail(reason) + say("FAIL " .. reason) + done(1) + end + + local function top() return game.stack:top() end + local function isA(class) + local s = top() + return s ~= nil and getmetatable(s) == class + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function waitFor(label, predicate, frames) + for _ = 1, frames or 900 do + if predicate() then return true end + U.wait(1) + end + bail(("stalled waiting for %s (top is %s)"):format(label, tostring(top()))) + end + + say("version=" .. GameVersion.get() .. " engine=" .. GameVersion.engine()) + say("fixes.surfOntoNpc=" .. tostring(GameVersion.fixes().surfOntoNpc)) + + ------------------------------------------------------------------ new game + U.wait(10) + for _ = 1, 1200 do + if isA(MainMenu) then break end + tap("start", 2) + end + waitFor("the main menu", function() return isA(MainMenu) end, 600) + local menu = top() + for i, item in ipairs(menu.list.items) do + if item.value == "new" then menu.list.index = i end + end + tap("a") + + local gendered = false + for _ = 1, 400 do + if isA(GenderSelect) then gendered = true break end + if isA(OakSpeech) or isA(NamePick) then break end + U.wait(1) + end + if GameVersion.engine() == "crystal" then + if not gendered then bail("Crystal never offered InitGender") end + local pick = top() + pick.cursor = (want == "girl") and 2 or 1 + U.shot(game, out .. "/00-gender.png") + say("OK gender screen, choosing " .. want) + tap("a") + else + if gendered then bail("Gold offered a gender prompt; it has none") end + say("OK no gender prompt on " .. GameVersion.get()) + end + + for _ = 1, 900 do + if game.phase == "play" and game.world and game.world.map then break end + if isA(NamingScreen) then + local naming = top() + naming.row = naming:bottomRow() + naming.col = 6 + end + tap("a", 2) + end + if not (game.phase == "play" and game.world and game.world.map) then + bail("never reached the overworld (top is " .. tostring(top()) .. ")") + end + local world = game.world + local save = game.save + say("OK overworld, name=" .. tostring(save.player.name) + .. " gender=" .. tostring(save.player.gender) + .. " sprite=" .. tostring(world:playerSpriteName())) + + ------------------------------------------------------ the engine flag itself + local id = FieldMoves.FEMALE_FLAG + say("FieldMoves.FEMALE_FLAG=" .. tostring(id)) + if GameVersion.engine() == "crystal" then + if id ~= 99 then bail("female flag id is " .. tostring(id) .. ", want 99") end + local reads = world:engineFlag(id) + say("world:engineFlag(" .. id .. ")=" .. tostring(reads)) + if reads ~= (want == "girl") then + bail("checkflag ENGINE_PLAYER_IS_FEMALE read " .. tostring(reads)) + end + elseif id ~= nil then + bail("Gold bound a female flag id: " .. tostring(id)) + end + + ------------------------------------------------------------- the three sites + local sites = { + { "COPYCATS_HOUSE_2F", 3, 4, "up", "01-copycat" }, + { "ROUTE_37", 5, 9, "up", "02-route37" }, + { "POKECENTER_2F", 5, 5, "up", "03-pokecenter2f" }, + } + for _, site in ipairs(sites) do + local mapId, x, y, facing, name = site[1], site[2], site[3], site[4], site[5] + if world.maps and world.maps[mapId] then + world:setMap(mapId, x, y, facing) + U.wait(40) + U.shot(game, out .. "/" .. name .. ".png") + local names = {} + for _, npc in ipairs(world.npcs or {}) do + names[#names + 1] = tostring(npc.def and npc.def.sprite) + end + say(name .. " map=" .. tostring(world.map.id) + .. " objects=" .. table.concat(names, ",")) + else + say("SKIP " .. mapId .. ": not in this cache") + end + end + + ------------------------------------------------------------------- the pack + world:setMap("NEW_BARK_TOWN", 13, 6, "down") + U.wait(20) + save.inventory = save.inventory or {} + save.inventory.POTION = 3 + Screens.push(game, "Gen2PackMenu", { save = save, world = {}, + onClose = function() game.stack:pop() end }) + U.wait(20) + U.shot(game, out .. "/04-pack.png") + local packGfx = top() and top().gfx + local pals = packGfx and packGfx.gfx and packGfx.gfx.palettes + local menuGfx = game.data.gen2MenuGfx or {} + local femalePals = menuGfx.pack and menuGfx.pack.palettesFemale + say("pack palettes are the female set: " + .. tostring(pals ~= nil and pals == femalePals)) + tap("b") + U.wait(10) + while top() do game.stack:pop() end + + ------------------------------------------------------------ battle back pic + local hud = menuGfx.battleHud or {} + say("battleHud.playerBack=" .. tostring(hud.playerBack) + .. " playerBackFemale=" .. tostring(hud.playerBackFemale)) + save.party = { Mon.new(game.data, "CYNDAQUIL", 12) } + world:startBattle({ wild = Mon.new(game.data, "WOOPER", 5) }) + local battle + for _ = 1, 600 do + if getmetatable(top()) == BattleState then battle = top() break end + U.wait(1) + end + if not battle then bail("startBattle never reached the battle screen") end + -- showPlayerTrainer is only true until SendOutPlayerMon; hold it so the + -- back pic is what the shot catches. + for _ = 1, 90 do + battle.showPlayerTrainer = true + U.wait(1) + end + battle.showPlayerTrainer = true + U.shot(game, out .. "/05-battle-backpic.png") + say("battle backpic path=" .. tostring(battle.playerBackPath)) + while top() do game.stack:pop() end + U.wait(10) + + ------------------------------------------------------------- trainer card + Screens.push(game, "Gen2TrainerCard", { onClose = function() + game.stack:pop() end }) + U.wait(30) + U.shot(game, out .. "/06-trainercard.png") + say("trainer card female arm=" .. tostring(top() and top().female)) + tap("b") + U.wait(10) + while top() do game.stack:pop() end + + ------------------------------------------------------------- hall of fame + save.hallOfFame = nil + Screens.push(game, "Gen2HallOfFame", { + save = save, mode = "induct", text = world.text, + entry = { winCount = 1, mons = { { species = "CYNDAQUIL", level = 12, + nickname = "CYNDAQUIL", otId = 1234, gender = "male" } } }, + onDone = function() game.stack:pop() end }) + U.wait(20) + local hof = top() + if getmetatable(hof) ~= HallOfFame then + bail("Gen2HallOfFame did not push (top is " .. tostring(hof) .. ")") + end + -- The ceremony walks its own phases; freeze it so the two player cards can + -- be posed and shot. + hof.update = function() end + hof.scx, hof.scy = 0, 0 + hof.phase = "player" + U.shot(game, out .. "/07-hof-trainerpic.png") + hof.phase = "playerBack" + U.shot(game, out .. "/08-hof-backpic.png") + say("hof backpic=" .. tostring(hof.playerBackPath) + .. " trainerPic=" .. tostring(hof.trainerPicPath)) + while top() do game.stack:pop() end + U.wait(10) + + ------------------------------------------------------------- surf onto NPC + -- + -- SurfFunction.TrySurf with a facing object: Crystal refuses, Gold does not + -- (../pokecrystal/engine/events/overworld.asm:364). + local ctx = { + save = { player = { badges = { FOG = true } } }, + mon = { species = "LAPRAS" }, + facing = "down", + facingColl = 0x29, + playerColl = 0x00, + playerState = FieldMoves.PLAYER_NORMAL, + facingObject = { id = "an NPC standing on the water" }, + } + local refused = FieldMoves.surfFromMenu(ctx) + say("surf onto an NPC: ok=" .. tostring(refused.ok) + .. " text=" .. tostring(refused.text)) + local shouldRefuse = GameVersion.fixes().surfOntoNpc == true + if (refused.ok ~= true) ~= shouldRefuse then + bail("surf-onto-NPC answered ok=" .. tostring(refused.ok) + .. " but fixes().surfOntoNpc=" .. tostring(shouldRefuse)) + end + ctx.facingObject = nil + if not FieldMoves.surfFromMenu(ctx).ok then + bail("open water refused SURF") + end + + say("PASS " .. GameVersion.get() .. " / " .. want .. " in " .. out) + done(0) +end diff --git a/tests/drivers/crystal_gender_shots.lua b/tests/drivers/crystal_gender_shots.lua new file mode 100644 index 00000000..41db7f19 --- /dev/null +++ b/tests/drivers/crystal_gender_shots.lua @@ -0,0 +1,234 @@ +-- Crystal's InitGender screen, end to end, and the six things that follow from +-- the answer. POKEPORT_GENDER picks the arm: "girl", "boy" or "none" (Gold, +-- which must never see the screen at all). +-- +-- POKEPORT_IDENTITY= POKEPORT_GAME=crystal POKEPORT_BOOT_CINEMA=1 \ +-- POKEPORT_GENDER=girl POKEPORT_SHOT_DIR= \ +-- POKEPORT_DRIVER=tests/drivers/crystal_gender_shots.lua love . +local U = require("tests.drivers.util") + +local GenderSelect = require("src.ui.gen2.GenderSelect") +local InitClock = require("src.ui.gen2.InitClock") +local MainMenu = require("src.ui.gen2.MainMenu") +local NamePick = require("src.ui.gen2.NamePick") +local NamingScreen = require("src.ui.gen2.NamingScreen") +local OakSpeech = require("src.ui.gen2.OakSpeech") +local TrainerCard = require("src.ui.gen2.TrainerCard") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local GameVersion = require("src.core.GameVersion") +local Screens = require("src.ui.Screens") + +return function(game) + local want = os.getenv("POKEPORT_GENDER") or "girl" + local out = os.getenv("POKEPORT_SHOT_DIR") or ("/tmp/crystal-gender-" .. want) + local log = io.open(out .. "/driver.log", "w") + + local function say(line) + print("[driver] " .. line) + if log then log:write(line .. "\n"); log:flush() end + end + + local function bail(reason) + say("FAIL " .. reason) + if log then log:close() end + love.event.quit(1) + error(reason, 0) + end + + local function top() return game.stack:top() end + local function isA(class) + local state = top() + return state ~= nil and getmetatable(state) == class + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function waitFor(label, predicate, frames) + for _ = 1, frames or 900 do + if predicate() then return end + U.wait(1) + end + bail(("stalled waiting for %s (top is %s)"):format(label, tostring(top()))) + end + + local function eq(got, wanted, label) + if got ~= wanted then + bail(("%s: got %s, want %s"):format(label, tostring(got), + tostring(wanted))) + end + say("OK " .. label .. " = " .. tostring(got)) + end + + say("version=" .. tostring(GameVersion.get()) + .. " engine=" .. tostring(GameVersion.engine()) + .. " gender=" .. want) + + -- Straight to the intro menu; the boot chain itself is crystal_boot_smoke's. + for _ = 1, 900 do + if isA(MainMenu) then break end + tap("start", 2) + end + if not isA(MainMenu) then + for _ = 1, 400 do + if isA(MainMenu) then break end + tap("a", 2) + end + end + waitFor("the intro menu", function() return isA(MainMenu) end) + local menu = top() + for i, item in ipairs(menu.list.items) do + if item.value == "new" then menu.list.index = i end + end + tap("a") + + if want == "none" then + -- Gold and Silver: PlayerProfileSetup has no InitGender to farcall. + waitFor("the clock screen", function() return isA(InitClock) end, 400) + if isA(GenderSelect) then bail("Gold put up the gender screen") end + say("OK no gender screen; NEW GAME went straight to the clock") + for _ = 1, 200 do + if isA(OakSpeech) then break end + tap("a", 2) + end + waitFor("the Oak speech", function() return isA(OakSpeech) end, 400) + local speech = top() + for _, step in ipairs(speech.steps or {}) do + if step.kind == "gender" then bail("Gold's speech grew a gender beat") end + end + eq(speech.steps and speech.steps[1] and speech.steps[1].id, "init_clock", + "the first beat") + U.wait(40) + U.shot(game, out .. "/01-oak.png") + eq(game.save.player.gender, "male", "save.player.gender") + say("PASS gold has no gender prompt") + if log then log:close() end + love.event.quit(0) + return + end + + waitFor("the gender screen", function() return isA(GenderSelect) end, 600) + local gender = top() + U.wait(20) + say("OK gender screen, cursor = " .. tostring(gender.cursor)) + U.shot(game, out .. "/01-genderselect.png") + if want == "girl" then + tap("down") + U.wait(10) + U.shot(game, out .. "/02-genderselect-girl.png") + else + U.shot(game, out .. "/02-genderselect-boy.png") + end + tap("a") + + waitFor("the clock screen", function() return isA(InitClock) end, 400) + eq(game.save.player.gender, want == "girl" and "female" or "male", + "wPlayerGender after the answer") + eq(game.save.player.name, want == "girl" and "KRIS" or "CHRIS", + "NamePlayer's InitName default") + + for _ = 1, 200 do + if isA(OakSpeech) then break end + tap("a", 2) + end + waitFor("the Oak speech", function() return isA(OakSpeech) end, 400) + local speech = top() + eq(speech.steps[1].id, "gender_select", "the beat the speech opened on") + + local shotPic = false + for _ = 1, 500 do + if isA(NamePick) then break end + if not shotPic and isA(OakSpeech) then + local at = top().steps and top().steps[top().step] + if at and at.id == "ask_player_name" then + U.wait(45) + local wanted = (want == "girl") and top().playerPicFemale + or top().playerPic + if top().pic ~= wanted then + bail("DrawIntroPlayerPic put up the wrong pic") + end + U.shot(game, out .. "/03-intropic.png") + shotPic = true + end + end + tap("a", 2) + end + waitFor("the name picker", function() return isA(NamePick) end, 200) + waitFor("the name menu to slide in", + function() return top().slide == nil end, 240) + local picker = top() + eq(picker.items[2], want == "girl" and "KRIS" or "CHRIS", "preset row 1") + eq(picker.items[3], want == "girl" and "AMANDA" or "MAT", "preset row 2") + U.shot(game, out .. "/04-namepick.png") + + picker.cursor = 1 + tap("a") + waitFor("the naming screen", function() return isA(NamingScreen) end) + local naming = top() + eq(naming.gender, want == "girl" and "female" or "male", + "the keyboard's header icon gender") + U.wait(20) + U.shot(game, out .. "/05-naming.png") + naming.row = naming:bottomRow() + naming.col = 6 + tap("a") + + for _ = 1, 700 do + if game.phase == "play" and game.world and game.world.map then break end + tap("a", 2) + end + if not (game.phase == "play" and game.world and game.world.map) then + bail("never reached the overworld (top is " .. tostring(top()) .. ")") + end + eq(game.world.map.id, "PLAYERS_HOUSE_2F", "the bedroom") + eq(game.save.player.name, want == "girl" and "KRIS" or "CHRIS", + "the name that reached the save") + local sprite = game.world.player and game.world.player.spriteDef + eq(sprite and sprite.id, FieldMoves.playerSprite(game.save.player.gender), + "the overworld sheet") + U.wait(20) + U.shot(game, out .. "/06-bedroom.png") + + -- Walk a step so the sheet is seen mid-stride rather than only standing. + U.hold(game, "down", 20) + U.wait(20) + U.shot(game, out .. "/07-bedroom-walk.png") + + -- The card, opened directly: the START-menu route is Gen2StartMenu's and is + -- already covered by crystal_boot_smoke. + game.save.player.badges = { ZEPHYR = true, HIVE = true } + local card = Screens.push(game, "Gen2TrainerCard", + { save = game.save, onClose = function() end }) + if getmetatable(card) ~= TrainerCard then bail("the card did not open") end + eq(card.female, want == "girl", "GetCardPic picked KrisCardPic") + U.wait(30) + U.shot(game, out .. "/08-trainercard.png") + tap("right") + U.wait(20) + U.shot(game, out .. "/09-trainercard-badges.png") + game.stack:pop() + + local gear = Screens.push(game, "Gen2Pokegear", { save = game.save }) + U.wait(30) + local pals = gear.pals and gear:pals() + local femalePals = gear.gfx and gear.gfx.palettesFemale + if want == "girl" and femalePals and pals ~= femalePals then + bail("the gear kept MalePokegearPals for Kris") + end + if want == "boy" and femalePals and pals == femalePals then + bail("the gear took FemalePokegearPals for Chris") + end + say("OK pokegear palettes = " .. (pals == femalePals and "female" or "male")) + U.shot(game, out .. "/10-pokegear.png") + game.stack:pop() + + say("PASS crystal gender run (" .. want .. ") in " .. out) + if log then log:close() end + love.event.quit(0) +end diff --git a/tests/drivers/crystal_intro_shots.lua b/tests/drivers/crystal_intro_shots.lua new file mode 100644 index 00000000..fcc5d096 --- /dev/null +++ b/tests/drivers/crystal_intro_shots.lua @@ -0,0 +1,117 @@ +local U = require("tests.drivers.util") +local CrystalIntro = require("src.ui.gen2.CrystalIntro") +local TitleState = require("src.ui.gen2.TitleState") + +local INTERVAL = 20 +local LIMIT = 4000 + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-intro" + local interval = tonumber(os.getenv("POKEPORT_SHOT_INTERVAL") or "") + or INTERVAL + + U.wait(30) + local assets = game.data and game.data.gen2Intro + if not (assets and assets.acts) then + U.log("SKIP no crystal intro acts in this cache -- re-import crystal") + return + end + + local finished = false + local intro = CrystalIntro.new(game, { + onDone = function() finished = true end, + }) + game.stack:clear() + game.stack:push(intro) + + local shots, scene = 0, 0 + while not finished and intro.frames < LIMIT do + U.wait(interval) + if intro.scene ~= scene then + scene = intro.scene + U.log(("scene %d at frame %d (scx=%02x scy=%02x)") + :format(scene, intro.frames, intro.scx % 256, intro.scy % 256)) + end + if not finished then + U.shot(game, ("%s/intro-%04d-scene%02d.png") + :format(out, intro.frames, intro.scene)) + shots = shots + 1 + end + end + assert(finished, + "the movie never reached IntroScene28 (frame " .. intro.frames .. ")") + U.log(("movie done: %d shots over %d frames"):format(shots, intro.frames)) + + local skipped = false + local intro2 = CrystalIntro.new(game, { + onDone = function() skipped = true end, + }) + game.stack:clear() + game.stack:push(intro2) + U.wait(45) + U.tap(game, "b") + U.wait(3) + assert(skipped and intro2.skipped, "a button did not skip the intro") + U.log("skip via B verified at frame " .. intro2.frames) + + game:showTitle() + U.wait(1) + local title = game.stack:top() + assert(getmetatable(title) == TitleState, + "showTitle left " .. tostring(title) .. " on the stack") + assert(#title.suicuneColor == 4, + "title.lua has no 4-frame Suicune set -- stale cache?") + assert(title.entrance, "title.lua has no entrance block -- stale cache?") + assert(title.suicuneX == 48 and title.suicuneY == 96, + ("Suicune is at (%s, %s), expected (48, 96)") + :format(tostring(title.suicuneX), tostring(title.suicuneY))) + + for i = 1, 4 do + U.shot(game, ("%s/title-entrance-%d.png"):format(out, i)) + U.wait(4) + end + for _ = 1, 90 do + if title.entranceScx == 0 then break end + U.wait(1) + end + assert(title.entranceScx == 0, "the entrance never landed") + assert(title.gemY == title.gemRestY, + ("gem y %s did not land at %s with the entrance") + :format(tostring(title.gemY), tostring(title.gemRestY))) + U.wait(2) + for i = 1, 5 do + U.shot(game, ("%s/title-suicune-%d.png"):format(out, i)) + U.wait(6) + end + + if love.window and love.window.setMode then + for _, shape in ipairs({ { 1280, 720 }, { 1920, 500 }, { 480, 800 } }) do + love.window.setMode(shape[1], shape[2], { resizable = true }) + U.wait(3) + U.shot(game, ("%s/title-wide-%dx%d.png"):format(out, shape[1], shape[2])) + end + love.window.setMode(1280, 720, { resizable = true }) + end + + local intro3 = CrystalIntro.new(game, {}) + game.stack:clear() + game.stack:push(intro3) + local function runTo(target, extra) + for _ = 1, LIMIT do + if intro3.scene >= target then break end + U.wait(5) + end + assert(intro3.scene >= target, + "widescreen pass never reached scene " .. target) + U.wait(extra) + end + runTo(4, 40) + U.shot(game, out .. "/intro-wide-scene04.png") + runTo(10, 60) + U.shot(game, out .. "/intro-wide-scene10.png") + runTo(18, 20) + U.shot(game, out .. "/intro-wide-scene18.png") + intro3:skip() + + U.log(("PASS crystal intro + title shots in %s"):format(out)) +end diff --git a/tests/drivers/crystal_story_shots.lua b/tests/drivers/crystal_story_shots.lua new file mode 100644 index 00000000..f7515610 --- /dev/null +++ b/tests/drivers/crystal_story_shots.lua @@ -0,0 +1,278 @@ +-- The Crystal story specials, driven in a real game. +-- +-- POKEPORT_IDENTITY=unitb-crystal POKEPORT_GAME=crystal \ +-- POKEPORT_VERSION=crystal POKEPORT_SHOT_DIR=/tmp/unitb \ +-- POKEPORT_DRIVER=tests/drivers/crystal_story_shots.lua love . +-- +-- Four sections, each entered by putting the player on the real map and +-- letting the extracted script run: +-- A TIN_TOWER_1F the Suicune confrontation, and whether it flees +-- B ILEX_FOREST the GS Ball shrine, Celebi, and CheckCaughtCelebi +-- C DRAGON_SHRINE GiveDratini's Extremespeed moveset +-- D DAY_CARE GiveOddEgg +local U = require("tests.drivers.util") + +local BattleState = require("src.ui.gen2.BattleState") +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") +local NamingScreen = require("src.ui.gen2.NamingScreen") +local Roamers = require("src.core.gen2.Roamers") +local Save = require("src.core.gen2.Save") + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-story" + local fails = 0 + + local function say(line) print("[driver] " .. line) end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function top() return game.stack:top() end + local function battleState() + local st = top() + if st ~= nil and getmetatable(st) == BattleState then return st end + return nil + end + local function inBattle() + local st = battleState() + return st and st.battle or nil + end + + local function waitFor(pred, frames) + for _ = 1, frames or 1200 do + if pred() then return true end + U.wait(1) + end + return false + end + + local world + + -- Mash A until the script is finished and the stack is bare again. The + -- naming screen gets B: `givepoke` ends in Specials.askNickname + -- (src/script/gen2/Specials.lua:382) and mashing A there types letters + -- forever instead of leaving. + -- The naming screen has no B exit: crystal_boot_smoke.lua leaves it by + -- putting the cursor on the bottom row's confirm cell. Confirming a blank + -- name is the cart's own "no nickname" (home/string.asm:6 _InitString). + local function mash() + local st = top() + if getmetatable(st) == NamingScreen then + st.row, st.col = st:bottomRow(), 6 + end + tap("a", 2) + end + + local function settle(frames) + for _ = 1, frames or 3000 do + if not world:busy() and top() == nil then return true end + mash() + end + local meta, name = getmetatable(top()), "?" + for id, mod in pairs(package.loaded) do + if mod == meta then name = id end + end + say((" stuck on %s (phase=%s) busy=%s"):format(name, + tostring(top() and top().phase), tostring(world:busy()))) + return false + end + + -- Stand one cell below the object carrying `scriptKey`, facing it. + local function standBelow(mapId, scriptKey) + world:setMap(mapId, 1, 1, "down") + U.wait(10) + local tx, ty + for _, npc in ipairs(world.npcs or {}) do + if npc.def and npc.def.scriptKey == scriptKey then + tx, ty = npc.cellX, npc.cellY + end + end + if not tx then return false end + world:setMap(mapId, tx, ty + 1, "up") + U.wait(30) + return world.player.cellX == tx and world.player.cellY == ty + 1 + end + + local function moveIds(mon) + local list = {} + for _, move in ipairs((mon and mon.moves) or {}) do + list[#list + 1] = move.id + end + return table.concat(list, ",") + end + + U.wait(60) + world = game.world + assert(world and world.map, "crystal world did not boot") + say("version=" .. GameVersion.get() .. " engine=" .. GameVersion.engine()) + + local save = game.save + save.player = save.player or {} + save.player.name = save.player.name or "CHRIS" + save.player.id = save.player.id or 30000 + save.inventory = save.inventory or {} + save.party = { Mon.new(game.data, "TYPHLOSION", 50) } + + -- ---- A TIN_TOWER_1F ---------------------------------------------------- + -- ../pokecrystal/maps/TinTower1F.asm:84 TinTower1FSuicuneBattleScript, run + -- from the SCENE_TINTOWER1F_SUICUNE_BATTLE scene script at :22. + say("A Tin Tower") + say(" crystal AlwaysFleeMons SUICUNE = " + .. tostring(Roamers.alwaysFleeMons("crystal").SUICUNE) + .. ", gold = " .. tostring(Roamers.alwaysFleeMons("gold").SUICUNE)) + world.mapScenes.TIN_TOWER_1F = 0 + world:setMap("TIN_TOWER_1F", 9, 14, "up") + U.wait(20) + U.shot(game, out .. "/a1-tintower-enter.png") + + ok(waitFor(function() return world:busy() end, 600), + "the scene script started on map entry") + U.wait(120) + U.shot(game, out .. "/a2-beasts.png") + ok(waitFor(function() return inBattle() ~= nil end, 3000), + "the Tin Tower scene reached a battle") + local battle = inBattle() + if battle then + U.wait(90) + U.shot(game, out .. "/a3-suicune-battle.png") + ok(battle.enemy and battle.enemy.species == "SUICUNE", + "the wild mon is SUICUNE (got " .. + tostring(battle.enemy and battle.enemy.species) .. ")") + ok((battle.enemy and battle.enemy.level) == 40, "at level 40") + -- ../pokecrystal/engine/battle/core.asm:759 TryEnemyFlee: with Suicune off + -- AlwaysFleeMons it has to survive the two random gates as well. + local fled = 0 + for _ = 1, 500 do + if battle:tryEnemyFlee() then fled = fled + 1 end + end + ok(fled == 0, "Suicune never flees in 500 rolls (fled " .. fled .. ")") + ok(battle.outcome == nil, "and the battle is still live") + battle.outcome = "run" + local st = battleState() + if st then st:finishBattle() end + end + ok(settle(2000), "the Tin Tower script ran to its end") + + -- ---- B ILEX_FOREST ----------------------------------------------------- + -- ../pokecrystal/maps/IlexForest.asm:429 IlexForestShrineScript, a BGEVENT_UP + -- at (8,22). EVENT_FOREST_IS_RESTLESS and the GS Ball are the two gates; on + -- a retail cart neither can be reached, so both are set here the way the + -- Virtual Console wrapper sets sGSBallFlag + -- (../pokecrystal/engine/menus/save.asm:168). + say("B Ilex Forest shrine") + save.party = { Mon.new(game.data, "TYPHLOSION", 50) } + Save.crystalState(save).gsBall = "have" + save.inventory.GS_BALL = 1 + save.inventory.MASTER_BALL = 5 + world:setMap("ILEX_FOREST", 8, 23, "up") + U.wait(40) + world.events:set(192, true) + U.shot(game, out .. "/b1-shrine.png") + + tap("a", 30) + U.shot(game, out .. "/b2-shrine-prompt.png") + -- The prompt is the script's own yesorno; A takes YES. + ok(waitFor(function() + if inBattle() then return true end + tap("a", 3) + return false + end, 400), "the shrine script reached a battle") + local celebi = inBattle() + if celebi then + U.wait(90) + U.shot(game, out .. "/b3-celebi.png") + ok(celebi.enemy and celebi.enemy.species == "CELEBI", + "the wild mon is CELEBI (got " .. + tostring(celebi.enemy and celebi.enemy.species) .. ")") + ok(celebi.battleType == 11, + "the battle carries BATTLETYPE_CELEBI (got " + .. tostring(celebi.battleType) .. ")") + -- Catch it with a MASTER BALL so CheckCaughtCelebi has something to read. + local thrown = false + for _ = 1, 900 do + local st = battleState() + if not st then break end + if not thrown and st.phase == "menu" then + st:useItem("MASTER_BALL") + thrown = true + U.wait(60) + U.shot(game, out .. "/b4-masterball.png") + end + mash() + end + end + ok(settle(2000), "the shrine script ran to its end") + U.shot(game, out .. "/b5-after-celebi.png") + local caught = false + for _, mon in ipairs(save.party) do + if mon.species == "CELEBI" then caught = true end + end + ok(caught, "Celebi is in the party") + ok(Save.crystalState(save).celebiCaught == true, + "CheckCaughtCelebi recorded the catch") + ok((save.inventory.GS_BALL or 0) == 0, "the GS Ball was taken") + + -- ---- C DRAGON_SHRINE --------------------------------------------------- + -- ../pokecrystal/maps/DragonShrine.asm:192 DragonShrineElder1Script, whose + -- .GiveDratini arm (:208) is `givepoke DRATINI, 15 / checkevent + -- EVENT_ANSWERED_DRAGON_MASTER_QUIZ_WRONG / special GiveDratini`. + say("C Dragon Shrine") + save.party = { Mon.new(game.data, "TYPHLOSION", 50) } + -- ../pokecrystal/maps/DragonShrine.asm:10 SCENE_DRAGONSHRINE_NOOP; scene 0 is + -- the Dragon Master quiz cutscene, which is not what this section measures. + world.mapScenes.DRAGON_SHRINE = 1 + ok(standBelow("DRAGON_SHRINE", "63:51a5"), "found the shrine elder") + U.shot(game, out .. "/c1-shrine.png") + tap("a", 30) + U.shot(game, out .. "/c2-elder.png") + ok(settle(2000), "the elder's script ran to its end") + U.shot(game, out .. "/c3-dratini.png") + local dratini + for _, mon in ipairs(save.party) do + if mon.species == "DRATINI" then dratini = mon end + end + ok(dratini ~= nil, "the elder handed over a DRATINI") + if dratini then + say(" moves = " .. moveIds(dratini)) + ok(moveIds(dratini) == "WRAP,THUNDER_WAVE,TWISTER,EXTREMESPEED", + "with .Moveset0, Extremespeed and all") + ok(dratini.moves[4].pp == 5, "Extremespeed arrives with 5 PP") + end + + -- ---- D DAY_CARE -------------------------------------------------------- + -- ../pokecrystal/maps/DayCare.asm:23 DayCareManScript_Inside, whose + -- `special GiveOddEgg` is at :33. + say("D Day Care") + save.party = { Mon.new(game.data, "TYPHLOSION", 50) } + save.inventory.EGG_TICKET = 1 + ok(standBelow("DAY_CARE", "18:6f8f"), "found the Day-Care Man") + U.shot(game, out .. "/d1-daycare.png") + tap("a", 30) + U.shot(game, out .. "/d2-gramps.png") + ok(settle(2000), "the Day-Care Man's script ran to its end") + U.shot(game, out .. "/d3-oddegg.png") + local egg = save.party[2] + ok(egg ~= nil and egg.isEgg == true, "an EGG joined the party") + if egg then + say((" %s ot=%s otId=%s eggSteps=%s moves=%s"):format( + tostring(egg.species), tostring(egg.ot), tostring(egg.otId), + tostring(egg.eggSteps), moveIds(egg))) + ok(egg.ot == "ODD", "with OT ODD") + ok(egg.eggSteps == 20, "and 20 hatch cycles") + end + ok((save.inventory.EGG_TICKET or 0) == 0, "the EGG TICKET was tossed") + + say(fails == 0 and ("PASS crystal story in " .. out) + or ("FAIL " .. fails .. " checks, shots in " .. out)) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/crystal_tower_battle_f1.lua b/tests/drivers/crystal_tower_battle_f1.lua new file mode 100644 index 00000000..c35cf272 --- /dev/null +++ b/tests/drivers/crystal_tower_battle_f1.lua @@ -0,0 +1,277 @@ +-- maps/BattleTowerBattleRoom.asm's own loop, driven in a real game: the +-- opponent draw, the walk-in, the battle, and the counter the room script +-- reads back. +-- +-- POKEPORT_IDENTITY=f1-tower POKEPORT_GAME=crystal POKEPORT_VERSION=crystal \ +-- POKEPORT_SHOT_DIR=/tmp/tower-battle \ +-- POKEPORT_DRIVER=tests/drivers/crystal_tower_battle_f1.lua love . +-- +-- src/world/gen2/World.lua has no startTowerBattle / setObjectSprite hook and +-- World:startBattle does not forward `battleTower` into Battle.new, so the +-- three seams are shimmed here for the length of the run. The bodies are +-- exactly what belongs in World:specialHooks and World:startBattle. +local U = require("tests.drivers.util") + +local Battle = require("src.battle.gen2.Battle") +local BattleTower = require("src.core.gen2.BattleTower") +local Mon = require("src.battle.gen2.Mon") +local World = require("src.world.gen2.World") + +-- The world exists before a POKEPORT_DRIVER chunk loads (main.lua:426-438), +-- so the seams go on the live instance. +local function shimWorldSeams(world) + local towerBattle = false + local baseNew = Battle.new + Battle.new = function(opts) + if towerBattle then opts.battleTower = true end + return baseNew(opts) + end + + local baseStartBattle = World.startBattle + world.startBattle = function(self, opts, onDone) + towerBattle = (opts and opts.battleTower) and true or false + local started = baseStartBattle(self, opts, onDone) + towerBattle = false + return started + end + + local hooks = world.vm.specials + hooks.startTowerBattle = function(trainer, onDone) + return world:startBattle({ trainer = trainer, battleTower = true }, onDone) + end + hooks.setObjectSprite = function(objectId, spriteName) + local index = (objectId or 0) - 1 + local def = world.map and world.map.def + local obj = def and def.objects and def.objects[index] + local sheet = world.sprites and world.sprites[spriteName] + if not (obj and sheet) then return false end + obj.sprite = spriteName + local npc = world:objectEntity(objectId) + if npc and npc:setSpriteDef(sheet) then world:applySpritePalette(npc) end + world:rebuildPeople({ seamless = true }) + return true + end +end + +-- ---- the run -------------------------------------------------------------- + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-tower-battle" + local fails, shots = 0, 0 + + local function say(line) print("[driver] " .. line) end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + local function shot(name) + shots = shots + 1 + U.shot(game, ("%s/%02d-%s.png"):format(out, shots, name)) + end + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + + shimWorldSeams(world) + ok(type(world.vm.specials.startTowerBattle) == "function", + "the shimmed startTowerBattle hook reached the VM") + ok(type(world.vm.specials.setObjectSprite) == "function", + "and so did setObjectSprite") + + local roster = BattleTower.roster(game.data) + ok(roster ~= nil, "trainers.lua carries the Battle Tower roster") + if roster then + say(("roster: %d trainers, %d groups of %d, sample ceiling %d") + :format(#roster.trainers, roster.levelGroups, roster.uniqueMon, + roster.sampleTrainers)) + end + + -- Three legal mons over the L10 room, each with ONE strong move so a blind + -- A-press run cannot pick a status move for a hundred turns. + local party = {} + for _, row in ipairs({ { "TYPHLOSION", 60, "FLAMETHROWER" }, + { "FERALIGATR", 60, "SURF", "BERRY" }, + { "MEGANIUM", 60, "BODY_SLAM", "GOLD_BERRY" } }) do + local def = game.data.moves[row[3]] + local mon = Mon.new(game.data, row[1], row[2], { + moves = { { id = row[3], pp = def.pp, maxPp = def.pp } }, + }) + mon.item = row[4] + party[#party + 1] = mon + end + game.save.party = party + + -- The desk's own SAVELEVELGROUP write, so the room the script walks into is + -- the L10 one (battle_tower.asm:1129-1141). + local tower = BattleTower.state(game.save) + tower.levelGroup = 1 + tower.streak = 0 + tower.trainers = {} + tower.challenge = BattleTower.NO_CHALLENGE + + while game.stack:top() do game.stack:pop() end + assert(world:setMap("BATTLE_TOWER_BATTLE_ROOM", 3, 7, "up"), + "no BATTLE_TOWER_BATTLE_ROOM in the cache") + U.wait(30) + shot("room-entered") + + -- The scene script walks the player in, draws the opponent and starts the + -- battle; nothing here presses anything until a text box wants it. + local sawOpponent, sawBattle = false, false + for _ = 1, 900 do + local vm = world.vm + if vm and vm.btOpponent and not sawOpponent then + sawOpponent = true + say(("opponent: %s %s (row %d), sprite %s, group %d") + :format(tostring(vm.btOpponent.classId), tostring(vm.btOpponent.name), + vm.btOpponent.index, tostring(vm.btOpponent.sprite), + vm.btOpponent.group)) + for slot, mon in ipairs(vm.btOpponent.rows) do + say((" mon %d: %s L%d %s"):format(slot, mon.species, mon.level, + tostring(mon.item))) + end + U.wait(20) + shot("opponent-walked-in") + end + if world.battleActive then + sawBattle = true + break + end + if world.textbox or world.choicebox then tap("a", 4) else U.wait(2) end + end + ok(sawOpponent, "special LoadOpponentTrainerAndPokemonWithOTSprite drew one") + ok(sawBattle, "special BattleTowerBattle pushed the battle screen") + + local screen, battle = nil, nil + if sawBattle then + U.wait(90) + shot("battle-open") + screen = game.stack:top() + battle = screen and screen.battle + ok(battle ~= nil, "the battle screen owns a Battle") + if battle then + ok(battle.inBattleTowerBattle == true, + "wInBattleTowerBattle is set, so DoBadgeTypeBoosts is off") + say("enemy trainer: " .. tostring(battle.trainer and battle.trainer.name)) + say("enemy lead: " .. tostring(battle.enemy and battle.enemy.species) + .. " L" .. tostring(battle.enemy and battle.enemy.level)) + ok(battle.trainer ~= nil and #battle.trainer.party == 3, + "with a three-mon Tower party") + end + end + + -- One press per look at the phase: FIGHT off the 2x2 menu, then the hardest + -- move with PP left. + local function hardestMove(mon) + local best, bestPower = 1, -1 + for index, move in ipairs((mon and mon.moves) or {}) do + local def = game.data.moves and game.data.moves[move.id] + local power = (def and def.power) or 0 + if (move.pp or 0) > 0 and power > bestPower then + best, bestPower = index, power + end + end + return best + end + + -- PP topped up between turns: an unattended run otherwise Struggles itself + -- to death long before the third opponent mon is down. + local function refill(mon) + for _, move in ipairs((mon and mon.moves) or {}) do + move.pp = move.maxPp or move.pp + end + end + + local menus = 0 + for _ = 1, 900 do + if not world.battleActive or (battle and battle.over) then break end + local phase = screen and screen.phase + if phase == "menu" then + menus = menus + 1 + if menus == 1 then shot("battle-menu") end + refill(battle and battle.player) + screen.menuIndex = 1 + tap("a", 4) + elseif phase == "moves" then + screen.menuIndex = hardestMove(battle and battle.player) + tap("a", 4) + elseif phase == "submenu" then + -- A forced switch cannot be cancelled, so walk off the fainted lead. + tap("down", 3) + tap("a", 4) + else + tap("a", 3) + end + end + if battle then + say("battle over=" .. tostring(battle.over) + .. " outcome=" .. tostring(battle.outcome) + .. " phase=" .. tostring(screen and screen.phase)) + ok(battle.over, "the battle resolved") + ok(battle.outcome == "win", "and the L60 party won it") + shot("battle-end") + end + for _ = 1, 200 do + if not world.battleActive then break end + tap("a", 3) + end + ok(not world.battleActive, "the battle screen came down") + U.wait(30) + shot("after-battle") + + local vm = world.vm + local state = BattleTower.state(game.save) + say(("streak=%d challenge=%d scriptVar=%s wNrOfBeaten=%s strbuf=%q") + :format(state.streak, state.challenge, tostring(vm and vm.scriptVar), + tostring(vm and vm.mem and vm.mem[BattleTower.WRAM_NR_BEATEN]), + tostring(vm and vm.stringBuffer))) + ok(state.streak >= 1, "ReadBTTrainerParty stepped the streak counter") + ok(state.challenge == BattleTower.CHALLENGE_IN_PROGRESS, + "and armed sBattleTowerChallengeState") + ok(#(state.trainers or {}) >= 1, "sBTTrainers recorded who was fought") + ok(state.prevTeams and #state.prevTeams.prev == 3, + "and sBTMonPrevTrainer recorded the team") + + -- The receptionist's heal, the "next up, opponent no. N" prompt and the + -- second draw all follow on their own. + local pages, secondDraw = {}, nil + for _ = 1, 400 do + local body = world.lastText + if type(body) == "string" and body ~= "" and pages[#pages] ~= body then + pages[#pages + 1] = body + if #pages <= 6 then shot("page-" .. #pages) end + end + if world.battleActive then + secondDraw = world.vm and world.vm.btOpponent + break + end + if world.choicebox then tap("a", 4) else tap("a", 3) end + end + say("pages: " .. table.concat(pages, " | ")) + local joined = table.concat(pages, " | ") + ok(joined:find("healed to full health", 1, true) ~= nil + or joined:find("Next up", 1, true) ~= nil, + "the room script carried on past the battle") + ok(joined:find("Next up, opponent\nno.2", 1, true) ~= nil + or joined:find("no.2", 1, true) ~= nil, + "and wStringBuffer3 named the SECOND opponent") + + if world.battleActive then + U.wait(60) + shot("second-battle") + ok(true, "the loop came back round for opponent two") + say("second opponent: " .. tostring(secondDraw and secondDraw.name)) + end + + say(("streak after round two: %d"):format(BattleTower.state(game.save).streak)) + say(fails == 0 and "PASS" or (fails .. " FAILURES")) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/crystal_unown_chambers.lua b/tests/drivers/crystal_unown_chambers.lua new file mode 100644 index 00000000..79a61a29 --- /dev/null +++ b/tests/drivers/crystal_unown_chambers.lua @@ -0,0 +1,182 @@ +-- The four Ruins of Alph secret chambers, opened in a real game. +-- +-- POKEPORT_IDENTITY=f3-crystal POKEPORT_GAME=crystal \ +-- POKEPORT_VERSION=crystal POKEPORT_SHOT_DIR=/tmp/f3 \ +-- POKEPORT_DRIVER=tests/drivers/crystal_unown_chambers.lua love . + +local U = require("tests.drivers.util") + +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") +local UnownWords = require("src.world.gen2.UnownWords") + +-- ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:25 closed, :42 open; +-- ../pokecrystal/engine/overworld/scripting.asm:2147 halves them to block 2,0. +local WALL_BLOCK = 3 +local WALL_SHUT, WALL_OPEN = 0x2e, 0x30 + +local CHAMBERS = { + { + key = "OMANYTE", word = "WATER", + -- ../pokecrystal/engine/events/unown_walls.asm:25 CheckItem, :38 MON_ITEM + shut = function(game) + game.save.inventory = { FIRE_STONE = 1 } + game.save.party = { Mon.new(game.data, "TYPHLOSION", 40, + { item = "FIRE_STONE" }) } + end, + arm = function(game) + game.save.inventory = {} + game.save.party = { + Mon.new(game.data, "TYPHLOSION", 40), + Mon.new(game.data, "LANTURN", 30, { item = "WATER_STONE" }), + } + end, + armed = "a WATER STONE held by the last party mon", + }, + { + key = "HO_OH", word = "HO-OH", + -- ../pokecrystal/engine/events/unown_walls.asm:2 wPartySpecies[0]. + shut = function(game) + game.save.inventory = {} + game.save.party = { + Mon.new(game.data, "TYPHLOSION", 40), + Mon.new(game.data, "HO_OH", 70), + } + end, + arm = function(game) + game.save.party = { + Mon.new(game.data, "HO_OH", 70), + Mon.new(game.data, "TYPHLOSION", 40), + } + end, + armed = "HO-OH moved into the FIRST party slot", + }, + { + key = "KABUTO", word = "ESCAPE", + shut = function(game) + game.save.inventory = { ESCAPE_ROPE = 1 } + game.save.party = { Mon.new(game.data, "TYPHLOSION", 40) } + end, + -- ../pokecrystal/engine/events/overworld.asm:809 farcall + -- SpecialKabutoChamber, off EscapeRopeOrDig's rope arm. + arm = function(_, world) + UnownWords.kabutoChamber(world.events, world.map and world.map.id) + end, + armed = "SpecialKabutoChamber, as the escape rope calls it", + }, + { + key = "AERODACTYL", word = "LIGHT", + shut = function(game) + game.save.inventory = {} + game.save.party = { Mon.new(game.data, "TYPHLOSION", 40) } + end, + -- ../pokecrystal/engine/events/overworld.asm:285 farcall + -- SpecialAerodactylChamber, inside FlashFunction.CheckUseFlash. + arm = function(_, world) + UnownWords.aerodactylChamber(world.events, world.map and world.map.id) + end, + armed = "SpecialAerodactylChamber, as FLASH calls it", + }, +} + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-unown-chambers" + local fails = 0 + + local function say(line) print("[driver] " .. line) end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function wordScreen() + local state = game.stack:top() + return (state and getmetatable(state) == UnownWords) and state or nil + end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + say("version=" .. GameVersion.get() .. " engine=" .. GameVersion.engine()) + + game.save.player = game.save.player or {} + game.save.player.name = game.save.player.name or "CHRIS" + game.save.player.id = game.save.player.id or 30000 + + local function enter(mapId) + world:setMap("RUINS_OF_ALPH_OUTSIDE", 8, 15, "down") + U.wait(20) + world.mapScenes[mapId] = 0 + world:setMap(mapId, 3, 1, "up") + for _ = 1, 400 do + U.wait(2) + if not world:busy() and not world.pendingSceneScript then break end + end + U.wait(30) + end + + local function blockNow() + local blocks = world.map and world.map.def and world.map.def.blocks + return blocks and blocks[WALL_BLOCK] + end + + for index, chamber in ipairs(CHAMBERS) do + local mapId = UnownWords.CHAMBER_MAPS[chamber.key] + local flag = UnownWords.WALL_OPENED[chamber.key] + say(("%d %s (flag %d)"):format(index, mapId, flag)) + world.events:set(flag, false) + + chamber.shut(game, world) + enter(mapId) + ok(world.map and world.map.id == mapId, " stood in the chamber") + ok(not world.events:get(flag), " the wall flag is still clear") + ok(blockNow() == WALL_SHUT, + (" and the hidden-doors callback drew the closed wall (%s)") + :format(tostring(blockNow()))) + U.shot(game, ("%s/%d-%s-shut.png"):format(out, index, + chamber.key:lower())) + + chamber.arm(game, world) + say(" armed: " .. chamber.armed) + world.mapScenes[mapId] = 0 + enter(mapId) + ok(world.events:get(flag), " the wall flag is set now") + ok(blockNow() == WALL_OPEN, + (" and the wall-open script rewrote the block (%s)") + :format(tostring(blockNow()))) + U.shot(game, ("%s/%d-%s-open.png"):format(out, index, + chamber.key:lower())) + + -- ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:82 + -- RuinsOfAlphOmanyteChamberWallPatternLeft + local screen + for _ = 1, 200 do + screen = wordScreen() + if screen then break end + tap("a", 2) + end + ok(screen ~= nil, " the wall pattern reached DisplayUnownWords") + if screen then + U.wait(20) + ok(screen.wall and screen.wall.word == chamber.word, + (" showing %s (got %s)"):format(chamber.word, + tostring(screen.wall and screen.wall.word))) + U.shot(game, ("%s/%d-%s-word.png"):format(out, index, + chamber.key:lower())) + tap("a", 10) + U.wait(20) + end + end + + say(fails == 0 and "ALL OK" or (fails .. " FAILURES")) + U.wait(10) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/crystal_unown_words_shots.lua b/tests/drivers/crystal_unown_words_shots.lua new file mode 100644 index 00000000..7fdf47f5 --- /dev/null +++ b/tests/drivers/crystal_unown_words_shots.lua @@ -0,0 +1,104 @@ +-- The Ruins of Alph wall words and word rooms, driven in a real game. +-- +-- POKEPORT_IDENTITY=unit-e-unown POKEPORT_GAME=crystal \ +-- POKEPORT_VERSION=crystal POKEPORT_SHOT_DIR=/tmp/unit-e \ +-- POKEPORT_DRIVER=tests/drivers/crystal_unown_words_shots.lua love . + + +local U = require("tests.drivers.util") + +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") +local UnownWords = require("src.world.gen2.UnownWords") + +-- maps/RuinsOfAlphKabutoChamber.asm:272 `bg_event 4, 0, BGEVENT_UP` +local CHAMBERS = { + { map = "RUINS_OF_ALPH_KABUTO_CHAMBER", word = "ESCAPE" }, + { map = "RUINS_OF_ALPH_AERODACTYL_CHAMBER", word = "LIGHT" }, + { map = "RUINS_OF_ALPH_OMANYTE_CHAMBER", word = "WATER" }, + { map = "RUINS_OF_ALPH_HO_OH_CHAMBER", word = "HO-OH" }, +} + +local WORD_ROOMS = { + { map = "RUINS_OF_ALPH_KABUTO_WORD_ROOM", x = 9, y = 6 }, + { map = "RUINS_OF_ALPH_AERODACTYL_WORD_ROOM", x = 9, y = 6 }, + { map = "RUINS_OF_ALPH_OMANYTE_WORD_ROOM", x = 9, y = 6 }, + { map = "RUINS_OF_ALPH_HO_OH_WORD_ROOM", x = 9, y = 6 }, +} + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-unown-words" + local fails = 0 + + local function say(line) print("[driver] " .. line) end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function top() return game.stack:top() end + local function wordScreen() + local state = top() + return (state and getmetatable(state) == UnownWords) and state or nil + end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + say("version=" .. GameVersion.get() .. " engine=" .. GameVersion.engine()) + + local save = game.save + save.player = save.player or {} + save.player.name = save.player.name or "CHRIS" + save.player.id = save.player.id or 30000 + save.party = { Mon.new(game.data, "TYPHLOSION", 40) } + + for index, chamber in ipairs(CHAMBERS) do + say("A" .. index .. " " .. chamber.map) + world:setMap(chamber.map, 4, 1, "up") + U.wait(30) + U.shot(game, ("%s/a%d-%s-chamber.png"):format( + out, index, chamber.word:lower())) + local screen + for _ = 1, 300 do + screen = wordScreen() + if screen then break end + if not world:busy() then tap("a", 2) else tap("a", 2) end + end + ok(screen ~= nil, chamber.map .. " reached DisplayUnownWords") + if screen then + U.wait(20) + ok(screen.wall and screen.wall.word == chamber.word, + (" showing %s (got %s)"):format(chamber.word, + tostring(screen.wall and screen.wall.word))) + ok(#screen.squares == #chamber.word, + (" %d letter squares"):format(#screen.squares)) + U.shot(game, ("%s/a%d-%s-word.png"):format( + out, index, chamber.word:lower())) + tap("a", 10) + ok(wordScreen() == nil, " A closes the box") + U.wait(20) + end + end + + for index, room in ipairs(WORD_ROOMS) do + say("B" .. index .. " " .. room.map) + world:setMap(room.map, room.x, room.y, "up") + U.wait(40) + ok(world.map and world.map.id == room.map, " stood in " .. room.map) + U.shot(game, ("%s/b%d-%s.png"):format(out, index, + room.map:lower():gsub("ruins_of_alph_", ""))) + end + + say(fails == 0 and "ALL OK" or (fails .. " FAILURES")) + U.wait(10) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/gate_chamber_fieldmoves.lua b/tests/drivers/gate_chamber_fieldmoves.lua new file mode 100644 index 00000000..800f9653 --- /dev/null +++ b/tests/drivers/gate_chamber_fieldmoves.lua @@ -0,0 +1,119 @@ +-- The two chamber walls the FIELD MOVES open, driven through the production +-- call sites rather than by calling the routines directly. +-- +-- ../pokecrystal/engine/events/overworld.asm:280-291 FlashFunction.CheckUseFlash +-- (badge FIRST, then SpecialAerodactylChamber) and :808-813 EscapeRopeOrDig's +-- `.escaperope` arm. +-- +-- POKEPORT_GAME=crystal POKEPORT_VERSION=crystal \ +-- POKEPORT_DRIVER=tests/drivers/gate_chamber_fieldmoves.lua love . +local U = require("tests.drivers.util") + +local Mon = require("src.battle.gen2.Mon") +local UnownWords = require("src.world.gen2.UnownWords") + +return function(game) + local fails = 0 + local function say(line) print("[driver] " .. line); io.stdout:flush() end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + local function clearText() + for _ = 1, 200 do + if not world:busy() then return true end + tap("a", 3) + end + return false + end + + local function enter(mapId) + while game.stack:top() do game.stack:pop() end + assert(world:setMap(mapId, 3, 7, "up"), "no " .. mapId .. " in this cache") + for _ = 1, 240 do + if not world:busy() then break end + U.wait(2) + end + U.wait(10) + end + + -- ---- the escape rope, in the Kabuto chamber ------------------------------ + say("--- KABUTO, through World:useEscapeRope()") + enter(UnownWords.CHAMBER_MAPS.KABUTO) + ok(not UnownWords.wallOpened(world.events, "KABUTO"), + "the Kabuto wall flag starts clear") + game.save.inventory = { ESCAPE_ROPE = 1 } + -- wDigWarpNumber / wBackupMapGroup: the cave's own entrance, which + -- ../pokecrystal/engine/events/overworld.asm:795-798 copies into wNextWarp. + world.backupWarp = { map = "RUINS_OF_ALPH_OUTSIDE", warp = 1 } + clearText() + local rope = world:useEscapeRope("ESCAPE_ROPE") + say("escape rope result: " .. tostring(rope)) + ok(rope == "escape_rope", "the rope was used") + ok(UnownWords.wallOpened(world.events, "KABUTO"), + "and SpecialKabutoChamber set the wall flag") + + -- The rope must not open a wall anywhere else. + world.queuedFieldMove = nil + enter("RUINS_OF_ALPH_OUTSIDE") + clearText() + local before = UnownWords.wallOpened(world.events, "OMANYTE") + game.save.inventory = { ESCAPE_ROPE = 1 } + world:useEscapeRope("ESCAPE_ROPE") + ok(UnownWords.wallOpened(world.events, "OMANYTE") == before, + "a rope used outside a chamber opens nothing") + + -- ---- FLASH, in the Aerodactyl chamber ------------------------------------ + say("--- AERODACTYL, through World:useFieldMove(\"FLASH\")") + enter(UnownWords.CHAMBER_MAPS.AERODACTYL) + ok(world.map.id == UnownWords.CHAMBER_MAPS.AERODACTYL, "in the chamber") + ok(not UnownWords.wallOpened(world.events, "AERODACTYL"), + "the wall flag starts clear") + + local flash = game.data.moves.FLASH + game.save.party = { Mon.new(game.data, "TYPHLOSION", 40, + { moves = { { id = "FLASH", pp = flash.pp, maxPp = flash.pp } } }) } + + -- :281-283, the ZEPHYRBADGE gate that runs BEFORE the special. + game.save.player = game.save.player or {} + game.save.player.badges = {} + local refused = world:useFieldMove("FLASH", game.save.party[1]) + ok(refused and refused.ok ~= true, "no ZEPHYRBADGE: FLASH is refused") + ok(refused and refused.badge == "ZEPHYR", "on the badge, not on the map") + ok(not UnownWords.wallOpened(world.events, "AERODACTYL"), + "and the badgeless press did NOT open the wall") + + -- The refusal opened a text box; the world is busy until it is dismissed. + clearText() + game.save.player.badges = { ZEPHYR = true } + local used = world:useFieldMove("FLASH", game.save.party[1]) + say("flash result: ok=" .. tostring(used and used.ok) + .. " action=" .. tostring(used and used.action)) + ok(used and used.ok == true, + "with the badge FLASH is allowed in a chamber that is not a dark cave") + ok(UnownWords.wallOpened(world.events, "AERODACTYL"), + "and SpecialAerodactylChamber set the wall flag") + + enter(UnownWords.CHAMBER_MAPS.AERODACTYL) + U.wait(40) + local _, block = world:blockIndexAt(3, 5) + say("aerodactyl block under the wall: " .. tostring(block)) + U.shot(game, (os.getenv("POKEPORT_SHOT_DIR") or "/tmp") + .. "/01-aerodactyl-flash-open.png") + + say(fails == 0 and "PASS" or (fails .. " FAILURES")) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/gate_gold_untouched.lua b/tests/drivers/gate_gold_untouched.lua new file mode 100644 index 00000000..e373334d --- /dev/null +++ b/tests/drivers/gate_gold_untouched.lua @@ -0,0 +1,80 @@ +-- Gate check: the Crystal wave left Gold alone. No Battle Tower, no Buena's +-- Blue Card, no Ruins of Alph secret chambers, and the three beasts roam. +-- +-- POKEPORT_GAME=gold POKEPORT_VERSION=gold \ +-- POKEPORT_DRIVER=tests/drivers/gate_gold_untouched.lua love . +local U = require("tests.drivers.util") + +local Battle = require("src.battle.gen2.Battle") +local Roamers = require("src.core.gen2.Roamers") + +return function(game) + local fails = 0 + local function say(line) print("[driver] " .. line); io.stdout:flush() end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + + U.wait(60) + local world = game.world + assert(world and world.map, "gold world did not boot") + say("version=" .. tostring(game.version) .. " map=" .. tostring(world.map.id)) + + local order = {} + for _, name in ipairs((world.constants or {}).specialOrder or {}) do + order[name] = true + end + ok(next(order) ~= nil, "the Gold cache names its specials") + for _, name in ipairs({ "BattleTowerBattle", "BattleTowerAction", + "BattleTowerRoomMenu", "LoadOpponentTrainerAndPokemonWithOTSprite", + "BuenasPassword", "BuenaPrize", "AskRememberPassword", + "OmanyteChamber", "HoOhChamber", "CelebiShrineEvent", + "SampleKenjiBreakCountdown", "MoveTutor", "PokeSeer" }) do + ok(not order[name], "Gold has no " .. name .. " special") + end + + ok(world.maps.BATTLE_TOWER_1F == nil, "no BATTLE_TOWER_1F map") + ok(world.maps.BATTLE_TOWER_BATTLE_ROOM == nil, "no tower battle room") + ok((world.trainers or {}).battleTower == nil, + "trainers.lua carries no battleTower roster") + ok((world.eventTables or {}).unownWalls == nil, + "events.lua carries no unownWalls table") + + -- ../pokecrystal/constants/event_flags.asm:486-489 are Crystal-only. + for _, flag in ipairs({ 806, 807, 808, 809 }) do + ok(not world.events:get(flag), "wall-opened flag " .. flag .. " is clear") + end + + -- ../pokecrystal/constants/script_constants.asm:69-74, Crystal-only VARs. + for _, id in ipairs({ 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a }) do + ok(world:readVar(id) == 0, + ("VAR $%02x reads 0 on Gold"):format(id)) + end + + -- data/wild/roammon_maps.asm: RAIKOU, ENTEI and SUICUNE, all three. + local roster = Roamers.roster(world.encounters) + say("roamer roster: " .. #roster .. " rows") + for _, row in ipairs(roster) do + say((" %s L%s start=%s"):format(tostring(row.species), + tostring(row.level), tostring(row.map))) + end + ok(#roster == 3, "three beasts in the roster") + local list = Roamers.init(game.save, { encounters = world.encounters, force = true }) + local live = 0 + for _, slot in ipairs(list or {}) do + if Roamers.active(slot) then live = live + 1 end + end + ok(live == 3, "all three are active after InitRoamMons") + + -- pokegold/engine/battle/core.asm:3476-3479: TRAP and FORCESHINY only. + ok(Battle.noEscapeBattleType({ battleType = 9 }) == true, "TRAP: no escape") + ok(Battle.noEscapeBattleType({ battleType = 7 }) == true, + "FORCESHINY: no escape") + ok(Battle.noEscapeBattleType({ battleType = 10 }) == false, + "FORCEITEM: Lugia and Ho-Oh can still be run from on Gold") + ok(Battle.noEscapeBattleType({ battleType = 8 }) == false, "TREE: escapable") + + say(fails == 0 and "PASS" or (fails .. " FAILURES")) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/drivers/gate_tower_noshim.lua b/tests/drivers/gate_tower_noshim.lua new file mode 100644 index 00000000..15994fe3 --- /dev/null +++ b/tests/drivers/gate_tower_noshim.lua @@ -0,0 +1,236 @@ +-- maps/BattleTowerBattleRoom.asm's own loop, driven in a real game: the +-- opponent draw, the walk-in, the battle, and the counter the room script +-- reads back. +-- +-- Nothing is shimmed: the startTowerBattle / setObjectSprite hooks and the +-- battleTower field all come from World itself. +-- +-- POKEPORT_GAME=crystal POKEPORT_VERSION=crystal \ +-- POKEPORT_SHOT_DIR=/tmp/tower-battle \ +-- POKEPORT_DRIVER=tests/drivers/gate_tower_noshim.lua love . +local U = require("tests.drivers.util") + +local BattleTower = require("src.core.gen2.BattleTower") +local Mon = require("src.battle.gen2.Mon") + +-- ---- the run -------------------------------------------------------------- + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-tower-battle" + local fails, shots = 0, 0 + + local function say(line) print("[driver] " .. line) end + local function ok(cond, line) + if not cond then fails = fails + 1 end + say((cond and "OK " or "FAIL ") .. line) + end + local function shot(name) + shots = shots + 1 + U.shot(game, ("%s/%02d-%s.png"):format(out, shots, name)) + end + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 4) + end + + U.wait(60) + local world = game.world + assert(world and world.map, "crystal world did not boot") + + ok(type(world.vm.specials.startTowerBattle) == "function", + "World:specialHooks supplies startTowerBattle, unshimmed") + ok(type(world.vm.specials.setObjectSprite) == "function", + "World:specialHooks supplies setObjectSprite, unshimmed") + + local roster = BattleTower.roster(game.data) + ok(roster ~= nil, "trainers.lua carries the Battle Tower roster") + if roster then + say(("roster: %d trainers, %d groups of %d, sample ceiling %d") + :format(#roster.trainers, roster.levelGroups, roster.uniqueMon, + roster.sampleTrainers)) + end + + -- Three legal mons over the L10 room, each with ONE strong move so a blind + -- A-press run cannot pick a status move for a hundred turns. + local party = {} + for _, row in ipairs({ { "TYPHLOSION", 60, "FLAMETHROWER" }, + { "FERALIGATR", 60, "SURF", "BERRY" }, + { "MEGANIUM", 60, "BODY_SLAM", "GOLD_BERRY" } }) do + local def = game.data.moves[row[3]] + local mon = Mon.new(game.data, row[1], row[2], { + moves = { { id = row[3], pp = def.pp, maxPp = def.pp } }, + }) + mon.item = row[4] + party[#party + 1] = mon + end + game.save.party = party + + -- The desk's own SAVELEVELGROUP write, so the room the script walks into is + -- the L10 one (battle_tower.asm:1129-1141). + local tower = BattleTower.state(game.save) + tower.levelGroup = 1 + tower.streak = 0 + tower.trainers = {} + tower.challenge = BattleTower.NO_CHALLENGE + + while game.stack:top() do game.stack:pop() end + assert(world:setMap("BATTLE_TOWER_BATTLE_ROOM", 3, 7, "up"), + "no BATTLE_TOWER_BATTLE_ROOM in the cache") + U.wait(30) + shot("room-entered") + + -- The scene script walks the player in, draws the opponent and starts the + -- battle; nothing here presses anything until a text box wants it. + local sawOpponent, sawBattle = false, false + for _ = 1, 900 do + local vm = world.vm + if vm and vm.btOpponent and not sawOpponent then + sawOpponent = true + say(("opponent: %s %s (row %d), sprite %s, group %d") + :format(tostring(vm.btOpponent.classId), tostring(vm.btOpponent.name), + vm.btOpponent.index, tostring(vm.btOpponent.sprite), + vm.btOpponent.group)) + for slot, mon in ipairs(vm.btOpponent.rows) do + say((" mon %d: %s L%d %s"):format(slot, mon.species, mon.level, + tostring(mon.item))) + end + U.wait(20) + shot("opponent-walked-in") + end + if world.battleActive then + sawBattle = true + break + end + if world.textbox or world.choicebox then tap("a", 4) else U.wait(2) end + end + ok(sawOpponent, "special LoadOpponentTrainerAndPokemonWithOTSprite drew one") + ok(sawBattle, "special BattleTowerBattle pushed the battle screen") + + local screen, battle = nil, nil + if sawBattle then + U.wait(90) + shot("battle-open") + screen = game.stack:top() + battle = screen and screen.battle + ok(battle ~= nil, "the battle screen owns a Battle") + if battle then + ok(battle.inBattleTowerBattle == true, + "wInBattleTowerBattle is set, so DoBadgeTypeBoosts is off") + say("enemy trainer: " .. tostring(battle.trainer and battle.trainer.name)) + say("enemy lead: " .. tostring(battle.enemy and battle.enemy.species) + .. " L" .. tostring(battle.enemy and battle.enemy.level)) + ok(battle.trainer ~= nil and #battle.trainer.party == 3, + "with a three-mon Tower party") + end + end + + -- One press per look at the phase: FIGHT off the 2x2 menu, then the hardest + -- move with PP left. + local function hardestMove(mon) + local best, bestPower = 1, -1 + for index, move in ipairs((mon and mon.moves) or {}) do + local def = game.data.moves and game.data.moves[move.id] + local power = (def and def.power) or 0 + if (move.pp or 0) > 0 and power > bestPower then + best, bestPower = index, power + end + end + return best + end + + -- PP topped up between turns: an unattended run otherwise Struggles itself + -- to death long before the third opponent mon is down. + local function refill(mon) + for _, move in ipairs((mon and mon.moves) or {}) do + move.pp = move.maxPp or move.pp + end + end + + local menus = 0 + for _ = 1, 900 do + if not world.battleActive or (battle and battle.over) then break end + local phase = screen and screen.phase + if phase == "menu" then + menus = menus + 1 + if menus == 1 then shot("battle-menu") end + refill(battle and battle.player) + screen.menuIndex = 1 + tap("a", 4) + elseif phase == "moves" then + screen.menuIndex = hardestMove(battle and battle.player) + tap("a", 4) + elseif phase == "submenu" then + -- A forced switch cannot be cancelled, so walk off the fainted lead. + tap("down", 3) + tap("a", 4) + else + tap("a", 3) + end + end + if battle then + say("battle over=" .. tostring(battle.over) + .. " outcome=" .. tostring(battle.outcome) + .. " phase=" .. tostring(screen and screen.phase)) + ok(battle.over, "the battle resolved") + ok(battle.outcome == "win", "and the L60 party won it") + shot("battle-end") + end + for _ = 1, 200 do + if not world.battleActive then break end + tap("a", 3) + end + ok(not world.battleActive, "the battle screen came down") + U.wait(30) + shot("after-battle") + + local vm = world.vm + local state = BattleTower.state(game.save) + say(("streak=%d challenge=%d scriptVar=%s wNrOfBeaten=%s strbuf=%q") + :format(state.streak, state.challenge, tostring(vm and vm.scriptVar), + tostring(vm and vm.mem and vm.mem[BattleTower.WRAM_NR_BEATEN]), + tostring(vm and vm.stringBuffer))) + ok(state.streak >= 1, "ReadBTTrainerParty stepped the streak counter") + ok(state.challenge == BattleTower.CHALLENGE_IN_PROGRESS, + "and armed sBattleTowerChallengeState") + ok(#(state.trainers or {}) >= 1, "sBTTrainers recorded who was fought") + ok(state.prevTeams and #state.prevTeams.prev == 3, + "and sBTMonPrevTrainer recorded the team") + + -- The receptionist's heal, the "next up, opponent no. N" prompt and the + -- second draw all follow on their own. + local pages, secondDraw = {}, nil + for _ = 1, 400 do + local body = world.lastText + if type(body) == "string" and body ~= "" and pages[#pages] ~= body then + pages[#pages + 1] = body + if #pages <= 6 then shot("page-" .. #pages) end + end + if world.battleActive then + secondDraw = world.vm and world.vm.btOpponent + break + end + if world.choicebox then tap("a", 4) else tap("a", 3) end + end + say("pages: " .. table.concat(pages, " | ")) + local joined = table.concat(pages, " | ") + ok(joined:find("healed to full health", 1, true) ~= nil + or joined:find("Next up", 1, true) ~= nil, + "the room script carried on past the battle") + ok(joined:find("Next up, opponent\nno.2", 1, true) ~= nil + or joined:find("no.2", 1, true) ~= nil, + "and wStringBuffer3 named the SECOND opponent") + + if world.battleActive then + U.wait(60) + shot("second-battle") + ok(true, "the loop came back round for opponent two") + say("second opponent: " .. tostring(secondDraw and secondDraw.name)) + end + + say(("streak after round two: %d"):format(BattleTower.state(game.save).streak)) + say(fails == 0 and "PASS" or (fails .. " FAILURES")) + love.event.quit(fails == 0 and 0 or 1) +end diff --git a/tests/engine/android_shortcuts_payload_test.lua b/tests/engine/android_shortcuts_payload_test.lua index 9af54c09..d7ea27d5 100644 --- a/tests/engine/android_shortcuts_payload_test.lua +++ b/tests/engine/android_shortcuts_payload_test.lua @@ -41,7 +41,7 @@ end -- Mock isReady RomImporter.isReady = function(v) return v == "red" or v == "gold" or v == "blue" or v == "yellow" - or v == "silver" + or v == "silver" or v == "crystal" end local ok = RomImporter.syncAndroidShortcuts("gold") @@ -57,6 +57,14 @@ RomImporter.syncAndroidShortcuts("silver") check(#capturedShortcuts == 4, "a fifth ready game does not widen the payload") check(capturedShortcuts[1] == "silver", "activeVersion 'silver' is placed first") +capturedShortcuts = nil +RomImporter.syncAndroidShortcuts("crystal") +check(#capturedShortcuts == 4, "nor does a sixth") +check(capturedShortcuts[1] == "crystal", "activeVersion 'crystal' is placed first") +check(capturedShortcuts[2] == "red" and capturedShortcuts[3] == "blue" + and capturedShortcuts[4] == "yellow", + "and the rest still follow GameVersion.ORDER until the cap") + -- Test with subset of ready games (e.g. only Red and Gold) RomImporter.isReady = function(v) return v == "red" or v == "gold" diff --git a/tests/engine/crystal_version_test.lua b/tests/engine/crystal_version_test.lua new file mode 100644 index 00000000..bac6160a --- /dev/null +++ b/tests/engine/crystal_version_test.lua @@ -0,0 +1,218 @@ +-- Crystal registration: VERSIONS row, engine lineage, ORDER slot, sha1 +-- routing, the importer's required-file override and the script dialect. +-- luajit tests/engine/crystal_version_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path +if not _G.love then _G.love = require("tests.love_stub") end + +local S = require("tests.harness").suite("crystal version registration") +local check = S.check +local eq = S.eq + +local GameVersion = require("src.core.GameVersion") +local Opcodes = require("src.script.gen2.Opcodes") + +-- ------- 1. the VERSIONS row + +local row = GameVersion.VERSIONS.crystal +check(row ~= nil, "GameVersion.VERSIONS carries a crystal row") +eq(row.id, "crystal", "row id") +eq(row.label, "Crystal", "row label") +eq(row.displayName, "Pokemon Crystal", "row display name") +eq(row.sha1, "f4cd194bdee0d04ca4eac29e09b8e4e9d818c133", "retail Crystal sha1") +eq(row.manifest, "tools/rom_manifest_crystal.json", "row manifest path") +eq(row.cachePrefix, "crystal/", "cache prefix") +eq(row.saveSuffix, "_crystal", "save suffix") +eq(GameVersion.cachePrefix("crystal"), "crystal/", "cachePrefix() agrees") +eq(GameVersion.saveSuffix("crystal"), "_crystal", "saveSuffix() agrees") + +local prefixes, suffixes = {}, {} +for _, id in ipairs(GameVersion.ORDER) do + local info = GameVersion.info(id) + eq(prefixes[info.cachePrefix], nil, id .. " cache prefix is unique") + eq(suffixes[info.saveSuffix], nil, id .. " save suffix is unique") + prefixes[info.cachePrefix] = id + suffixes[info.saveSuffix] = id +end + +-- ------- 2. generation and engine lineage + +eq(GameVersion.generation("crystal"), 2, "Crystal is Gen 2") +eq(GameVersion.engine("crystal"), "crystal", "Crystal's engine lineage") +eq(GameVersion.engine("gold"), "gs", "Gold is the gs lineage") +eq(GameVersion.engine("silver"), "gs", "and so is Silver") +eq(GameVersion.engine("red"), "gen1", "Red is gen1") +eq(GameVersion.engine("blue"), "gen1", "Blue is gen1") +eq(GameVersion.engine("yellow"), "gen1", "Yellow is gen1") + +local LINEAGES = { gen1 = true, gs = true, crystal = true } +for _, id in ipairs(GameVersion.ORDER) do + check(LINEAGES[GameVersion.engine(id)] == true, + id .. " reports a known engine lineage") +end + +eq(GameVersion.generation("gold"), 2, "Gold is Gen 2") +eq(GameVersion.generation("silver"), 2, "Silver is Gen 2") +eq(GameVersion.generation("red"), 1, "Red is Gen 1") + +-- ------- 3. launcher ORDER + +local index +for i, id in ipairs(GameVersion.ORDER) do + if id == "crystal" then index = i end +end +eq(index, 6, "crystal is ORDER slot 6") +eq(#GameVersion.ORDER, 6, "ORDER is six games") +eq(GameVersion.ORDER[4], "gold", "gold keeps slot 4") +eq(GameVersion.ORDER[5], "silver", "silver keeps slot 5") + +-- ------- 4. sha1 routing + +eq(GameVersion.forSha1("f4cd194bdee0d04ca4eac29e09b8e4e9d818c133"), "crystal", + "the retail Crystal sha1 resolves to crystal") +eq(GameVersion.forSha1("d8b8a3600a465308c9953dfa04f0081c05bdcb94"), "gold", + "Gold's sha1 still resolves to gold") +eq(GameVersion.forSha1("deadbeef"), nil, "an unknown ROM resolves to nothing") + +-- ------- 5. set / get round trip + +local savedCurrent = GameVersion.get() +eq(GameVersion.set("crystal"), "crystal", "set('crystal') is accepted") +eq(GameVersion.get(), "crystal", "and becomes current") +eq(GameVersion.engine(), "crystal", "engine() with no argument reads current") +check(not GameVersion.isGold(), "isGold() stays false on Crystal") +GameVersion.set(savedCurrent) + +-- ------- 6. the importer's required-file list + +local RomImporter = require("src.import.RomImporter") + +love.filesystem = love.filesystem or {} +local savedGetInfo = love.filesystem.getInfo +local savedGetReal = love.filesystem.getRealDirectory +local savedGetSource = love.filesystem.getSource + +local function probe(version) + local seen, order = {}, {} + love.filesystem.getInfo = function(name) + if not seen[name] then + seen[name] = true + order[#order + 1] = name + end + return { type = "file" } + end + love.filesystem.getRealDirectory = function() return "/nowhere" end + love.filesystem.getSource = function() return "/elsewhere" end + RomImporter.isReady(version) + return seen, order +end + +local crystalSeen, crystalOrder = probe("crystal") +local redSeen = probe("red") + +love.filesystem.getInfo = savedGetInfo +love.filesystem.getRealDirectory = savedGetReal +love.filesystem.getSource = savedGetSource + +check(#crystalOrder > 20, + ("the crystal list is substantial (%d entries probed)"):format(#crystalOrder)) +for _, path in ipairs({ + "crystal/data/generated/encounters.lua", + "crystal/data/generated/landmarks.lua", + "crystal/data/generated/title.lua", + "crystal/data/generated/intro.lua", + "crystal/assets/generated/title/crystal_logo.png", + "crystal/assets/generated/title/crystal_wordmark.png", + "crystal/assets/generated/title/crystal_suicune.png", + "crystal/assets/generated/splash/ditto.png", + "crystal/assets/generated/intro/chris.png", + "crystal/assets/generated/intro/kris.png", + "crystal/assets/generated/battle/front/wooper.png", +}) do + check(crystalSeen[path] == true, "crystal requires " .. path) +end + +for _, path in ipairs({ + "crystal/assets/generated/battle/anims/move_anim_0.png", + "crystal/assets/generated/battle/anims/move_anim_1.png", + "crystal/data/generated/battle_anims.lua", + "crystal/assets/generated/trade/game_boy.png", +}) do + eq(crystalSeen[path], nil, "crystal does not wait on " .. path) +end + +check(redSeen["assets/generated/battle/anims/move_anim_0.png"] == true, + "red still requires the Gen 1 battle anim sheet") +eq(redSeen["assets/generated/title/crystal_logo.png"], nil, + "and none of Crystal's title art") + +-- ------- 7. script dialect + +local crystalTable = Opcodes.forEdition("crystal") +local goldTable = Opcodes.forEdition("gold") +check(crystalTable ~= goldTable, + "forEdition('crystal') is not the Gold table") +eq(Opcodes.forEdition("silver"), goldTable, "Silver shares Gold's table") +eq(goldTable, Opcodes, "and Gold's table is the module itself") +eq(Opcodes.forEdition(nil), Opcodes, "an absent edition falls back to Gold") + +-- pokecrystal/macros/scripts/events.asm:541 +eq(crystalTable[0x52] and crystalTable[0x52].name, "farjumptext", + "Crystal $52 is farjumptext") +eq(goldTable[0x52] and goldTable[0x52].name, "jumptext", + "Gold $52 is jumptext") +eq(crystalTable[0x53] and crystalTable[0x53].name, "jumptext", + "and Crystal's jumptext moved to $53") + +local function count(tbl) + local n = 0 + for key in pairs(tbl) do if type(key) == "number" then n = n + 1 end end + return n +end +eq(count(crystalTable), 170, "Crystal names 170 commands") +eq(count(goldTable), 162, "Gold names 162") + +local diverged +for byte = 0x00, 0x51 do + local a = crystalTable[byte] and crystalTable[byte].name + local b = goldTable[byte] and goldTable[byte].name + if a ~= b then diverged = byte; break end +end +eq(diverged, nil, "$00-$51 are the same commands in both dialects") + +check(Opcodes.TERMINATORS.farjumptext == true, + "farjumptext is a terminator") + +-- ------- 8. the launcher reaches the crystal tab + +local visited = {} +local fake = setmetatable({ tab = GameVersion.ORDER[1] }, RomImporter) +fake._switchTab = function(self, id) + self.tab = id + visited[#visited + 1] = id +end + +for _ = 1, 12 do fake:_cycleTab(1) end +local sawCrystal, sawMods, sawBug = false, false, false +for _, id in ipairs(visited) do + if id == "crystal" then sawCrystal = true end + if id == "mods" then sawMods = true end + if id == "bug" then sawBug = true end +end +check(sawCrystal, "cycling the launcher tabs reaches crystal") +check(sawMods and sawBug, "and still reaches the mods and bug tabs") + +local seen, cycle = {}, 0 +fake.tab = "crystal" +repeat + seen[fake.tab] = true + fake:_cycleTab(1) + cycle = cycle + 1 +until fake.tab == "crystal" or cycle > 40 +eq(cycle, #GameVersion.ORDER + 4, + "the ring is the six games plus mods/find/skins/bug") + +fake.tab = "crystal" +fake:_cycleTab(-1) +eq(fake.tab, "silver", "and stepping back off crystal lands on silver") + +S.finish() diff --git a/tests/engine/gate_gen2_mod_api.lua b/tests/engine/gate_gen2_mod_api.lua index 01558e97..ad632b2c 100644 --- a/tests/engine/gate_gen2_mod_api.lua +++ b/tests/engine/gate_gen2_mod_api.lua @@ -24,6 +24,7 @@ T.eq(GameVersion.generation("blue"), 1, "Blue is Gen 1") T.eq(GameVersion.generation("yellow"), 1, "Yellow is Gen 1") T.eq(GameVersion.generation("gold"), 2, "Gold is Gen 2") T.eq(GameVersion.generation("silver"), 2, "Silver is Gen 2") +T.eq(GameVersion.generation("crystal"), 2, "Crystal is Gen 2") -- ------- 2. manifest: gen2compat is opt-in and defaults off diff --git a/tests/engine/gen2_script_opcodes_test.lua b/tests/engine/gen2_script_opcodes_test.lua new file mode 100644 index 00000000..566d8c2e --- /dev/null +++ b/tests/engine/gen2_script_opcodes_test.lua @@ -0,0 +1,292 @@ +-- Gen 2 script bytecode dialects: Gold/Silver vs Crystal. +-- +-- Crystal inserts farjumptext at $52 and pushes every later opcode up by one +-- (pokecrystal/macros/scripts/events.asm:541). Decoding a Crystal script with +-- the Gold table is silent: a Crystal $53 `jumptext` (2 operand bytes) reads as +-- Gold's `waitbutton` (0), the pointer walk desynchronises, and the extractor +-- emits plausible garbage rather than an error. So the expected tables below +-- are transcribed from the two macro files by hand and pinned here. +-- luajit tests/engine/gen2_script_opcodes_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +local check = T.check +local eq = T.eq + +local Opcodes = require("src.script.gen2.Opcodes") + +-- pokegold/macros/scripts/events.asm:1-1015, in const order from $00. +-- Sizes are the macro body minus its own `db _command`: db 1, dw 2, +-- dba 3, bigdt 3, map_id 2 (pokegold/macros/scripts/maps.asm:1-6). +-- `givepoke` is the one variable-length row: the macro emits 8 bytes when the +-- trainer argument is non-zero (events.asm:352-365) and the table declares the +-- 4-byte base, which src/import/RomExtractorGen2.lua re-measures per call site. +local GOLD_EXPECTED = { + "scall 2", "farscall 3", "memcall 2", "sjump 2", "farsjump 3", + "memjump 2", "ifequal 3", "ifnotequal 3", "iffalse 2", "iftrue 2", + "ifgreater 3", "ifless 3", "jumpstd 2", "callstd 2", "callasm 3", + "special 2", "memcallasm 2", "checkmapscene 2", "setmapscene 3", + "checkscene 0", "setscene 1", "setval 1", "addval 1", "random 1", + "checkver 0", "readmem 2", "writemem 2", "loadmem 3", "readvar 1", + "writevar 1", "loadvar 2", "giveitem 2", "takeitem 2", "checkitem 1", + "givemoney 4", "takemoney 4", "checkmoney 4", "givecoins 2", + "takecoins 2", "checkcoins 2", "addcellnum 1", "delcellnum 1", + "checkcellnum 1", "checktime 1", "checkpoke 1", "givepoke 4", + "giveegg 2", "givepokemail 2", "checkpokemail 2", "checkevent 2", + "clearevent 2", "setevent 2", "checkflag 2", "clearflag 2", "setflag 2", + "wildon 0", "wildoff 0", "xycompare 2", "warpmod 3", "blackoutmod 2", + "warp 4", "getmoney 2", "getcoins 1", "getnum 1", "getmonname 2", + "getitemname 2", "getcurlandmarkname 1", "gettrainername 3", + "getstring 3", "itemnotify 0", "pocketisfull 0", "opentext 0", + "reanchormap 1", "closetext 0", "writeunusedbyte 1", "farwritetext 3", + "writetext 2", "repeattext 2", "yesorno 0", "loadmenu 2", + "closewindow 0", "jumptextfaceplayer 2", "jumptext 2", "waitbutton 0", + "promptbutton 0", "pokepic 1", "closepokepic 0", "_2dmenu 0", + "verticalmenu 0", "loadpikachudata 0", "randomwildmon 0", + "loadtemptrainer 0", "loadwildmon 2", "loadtrainer 2", "startbattle 0", + "reloadmapafterbattle 0", "catchtutorial 1", "trainertext 1", + "trainerflagaction 1", "winlosstext 4", "scripttalkafter 0", + "endifjustbattled 0", "checkjustbattled 0", "setlasttalked 1", + "applymovement 3", "applymovementlasttalked 2", "faceplayer 0", + "faceobject 2", "variablesprite 2", "disappear 1", "appear 1", + "follow 2", "stopfollow 0", "moveobject 3", "writeobjectxy 1", + "loademote 1", "showemote 3", "turnobject 2", "follownotexact 2", + "earthquake 1", "changemapblocks 3", "changeblock 3", "reloadmap 0", + "refreshmap 0", "writecmdqueue 2", "delcmdqueue 1", "playmusic 2", + "encountermusic 0", "musicfadeout 3", "playmapmusic 0", + "dontrestartmapmusic 0", "cry 2", "playsound 2", "waitsfx 0", + "warpsound 0", "specialsound 0", "autoinput 3", "newloadmap 1", + "pause 1", "deactivatefacing 1", "sdefer 2", "warpcheck 0", + "stopandsjump 2", "endcallback 0", "end 0", "reloadend 1", "endall 0", + "pokemart 3", "elevator 2", "trade 1", "askforphonenumber 1", + "phonecall 2", "hangup 0", "describedecoration 1", "fruittree 1", + "specialphonecall 2", "checkphonecall 0", "verbosegiveitem 2", "swarm 2", + "halloffame 0", "credits 0", "warpfacing 5", +} + +-- pokecrystal/macros/scripts/events.asm:1-1068, same transcription rules. +-- Cross-checked row for row against ScriptCommandTable +-- (pokecrystal/engine/overworld/scripting.asm:64-237), which is the table the +-- hardware actually indexes and therefore the authority over the macro file. +local CRYSTAL_EXPECTED = { + "scall 2", "farscall 3", "memcall 2", "sjump 2", "farsjump 3", + "memjump 2", "ifequal 3", "ifnotequal 3", "iffalse 2", "iftrue 2", + "ifgreater 3", "ifless 3", "jumpstd 2", "callstd 2", "callasm 3", + "special 2", "memcallasm 2", "checkmapscene 2", "setmapscene 3", + "checkscene 0", "setscene 1", "setval 1", "addval 1", "random 1", + "checkver 0", "readmem 2", "writemem 2", "loadmem 3", "readvar 1", + "writevar 1", "loadvar 2", "giveitem 2", "takeitem 2", "checkitem 1", + "givemoney 4", "takemoney 4", "checkmoney 4", "givecoins 2", + "takecoins 2", "checkcoins 2", "addcellnum 1", "delcellnum 1", + "checkcellnum 1", "checktime 1", "checkpoke 1", "givepoke 4", + "giveegg 2", "givepokemail 2", "checkpokemail 2", "checkevent 2", + "clearevent 2", "setevent 2", "checkflag 2", "clearflag 2", "setflag 2", + "wildon 0", "wildoff 0", "xycompare 2", "warpmod 3", "blackoutmod 2", + "warp 4", "getmoney 2", "getcoins 1", "getnum 1", "getmonname 2", + "getitemname 2", "getcurlandmarkname 1", "gettrainername 3", + "getstring 3", "itemnotify 0", "pocketisfull 0", "opentext 0", + "reanchormap 1", "closetext 0", "writeunusedbyte 1", "farwritetext 3", + "writetext 2", "repeattext 2", "yesorno 0", "loadmenu 2", + "closewindow 0", "jumptextfaceplayer 2", "farjumptext 3", "jumptext 2", + "waitbutton 0", "promptbutton 0", "pokepic 1", "closepokepic 0", + "_2dmenu 0", "verticalmenu 0", "loadpikachudata 0", "randomwildmon 0", + "loadtemptrainer 0", "loadwildmon 2", "loadtrainer 2", "startbattle 0", + "reloadmapafterbattle 0", "catchtutorial 1", "trainertext 1", + "trainerflagaction 1", "winlosstext 4", "scripttalkafter 0", + "endifjustbattled 0", "checkjustbattled 0", "setlasttalked 1", + "applymovement 3", "applymovementlasttalked 2", "faceplayer 0", + "faceobject 2", "variablesprite 2", "disappear 1", "appear 1", + "follow 2", "stopfollow 0", "moveobject 3", "writeobjectxy 1", + "loademote 1", "showemote 3", "turnobject 2", "follownotexact 2", + "earthquake 1", "changemapblocks 3", "changeblock 3", "reloadmap 0", + "refreshmap 0", "writecmdqueue 2", "delcmdqueue 1", "playmusic 2", + "encountermusic 0", "musicfadeout 3", "playmapmusic 0", + "dontrestartmapmusic 0", "cry 2", "playsound 2", "waitsfx 0", + "warpsound 0", "specialsound 0", "autoinput 3", "newloadmap 1", + "pause 1", "deactivatefacing 1", "sdefer 2", "warpcheck 0", + "stopandsjump 2", "endcallback 0", "end 0", "reloadend 1", "endall 0", + "pokemart 3", "elevator 2", "trade 1", "askforphonenumber 1", + "phonecall 2", "hangup 0", "describedecoration 1", "fruittree 1", + "specialphonecall 2", "checkphonecall 0", "verbosegiveitem 2", + "verbosegiveitemvar 2", "swarm 3", "halloffame 0", "credits 0", + "warpfacing 5", "battletowertext 1", "getlandmarkname 2", + "gettrainerclassname 2", "getname 3", "wait 1", "checksave 0", +} + +local gold = Opcodes.forEdition("gold") +local crystal = Opcodes.forEdition("crystal") + +-- CT-1: gold and silver share one dialect, and Opcodes[byte] keeps answering. +check(Opcodes.forEdition("silver") == gold, "silver resolves to the Gold table") +check(gold == Opcodes, "the Gold table is the module itself (Opcodes[byte])") +check(crystal ~= gold, "crystal resolves to a different table") +check(Opcodes.forEdition(nil) == gold, "an unknown edition falls back to Gold") +eq(Opcodes[0x52] and Opcodes[0x52].name, "jumptext", + "Opcodes[0x52] is unchanged for existing callers") + +local function auditTable(label, tbl, expected) + local holes, wrong = {}, {} + for i, want in ipairs(expected) do + local byte = i - 1 + local name, size = want:match("^(%S+) (%d+)$") + local row = tbl[byte] + if not row then + holes[#holes + 1] = ("$%02x"):format(byte) + elseif row.name ~= name or row.size ~= tonumber(size) then + wrong[#wrong + 1] = ("$%02x %s/%d wanted %s/%s") + :format(byte, tostring(row.name), row.size or -1, name, size) + end + end + eq(#holes, 0, label .. " has no missing opcode (" .. table.concat(holes, " ") + .. ")") + eq(#wrong, 0, label .. " matches events.asm (" .. table.concat(wrong, "; ") + .. ")") + local extra = {} + for byte = 0x00, 0xff do + if tbl[byte] and byte >= #expected then + extra[#extra + 1] = ("$%02x %s"):format(byte, tbl[byte].name) + end + end + eq(#extra, 0, label .. " declares nothing past the last command (" + .. table.concat(extra, " ") .. ")") +end + +auditTable("gold", gold, GOLD_EXPECTED) +auditTable("crystal", crystal, CRYSTAL_EXPECTED) + +-- (a) $00-$51 is byte-identical between the dialects. +local drift = {} +for byte = 0x00, 0x51 do + local g, c = gold[byte], crystal[byte] + if not (g and c and g.name == c.name and g.size == c.size) then + drift[#drift + 1] = ("$%02x"):format(byte) + end +end +eq(#drift, 0, "$00-$51 is identical in both dialects (" + .. table.concat(drift, " ") .. ")") + +-- and the two dialects agree on NOTHING from $52 up, because the whole tail is +-- shifted by one. farjumptext is the wedge. +eq(crystal[0x52].name, "farjumptext", "$52 is farjumptext on Crystal") +eq(crystal[0x52].size, 3, "farjumptext carries a dba, so 3 operand bytes") +eq(crystal[0x53].name, "jumptext", "Gold's $52 jumptext moved to $53") +eq(crystal[0xa0].size, 3, + "Crystal swarm gained a leading flag byte (events.asm:1003-1008)") +eq(gold[0x9e].size, 2, "Gold swarm is still a bare map_id") + +-- (c) NUM_EVENT_COMMANDS, both as the declared constant and as the row count. +local function rowCount(tbl) + local n = 0 + for byte = 0x00, 0xff do if tbl[byte] then n = n + 1 end end + return n +end +eq(Opcodes.NUM_EVENT_COMMANDS, 162, + "pokegold events.asm:1015 NUM_EVENT_COMMANDS = $a2") +eq(crystal.NUM_EVENT_COMMANDS, 170, + "pokecrystal events.asm:1068 NUM_EVENT_COMMANDS = $aa") +eq(rowCount(gold), Opcodes.NUM_EVENT_COMMANDS, + "the Gold table is dense up to NUM_EVENT_COMMANDS") +eq(rowCount(crystal), crystal.NUM_EVENT_COMMANDS, + "the Crystal table is dense up to NUM_EVENT_COMMANDS") + +-- (d) farjumptext ends the walk the same way jumptext does. +check(Opcodes.TERMINATORS.farjumptext, + "farjumptext is a TERMINATOR (jp ScriptJump, scripting.asm:318-327)") +check(Opcodes.TERMINATORS.jumptext, "jumptext still is") +check(crystal.TERMINATORS == Opcodes.TERMINATORS, + "the Crystal table answers TERMINATORS too") +eq(crystal.key, Opcodes.key, "and key(), so a resolved table is self-sufficient") + +-- (e) MOD_COMMAND is reachable only by name: no byte in EITHER dialect decodes +-- to it, so ROM data can never be mistaken for a mod verb. +local collide = {} +for byte = 0x00, 0xff do + if gold[byte] and gold[byte].name == Opcodes.MOD_COMMAND then + collide[#collide + 1] = ("gold $%02x"):format(byte) + end + if crystal[byte] and crystal[byte].name == Opcodes.MOD_COMMAND then + collide[#collide + 1] = ("crystal $%02x"):format(byte) + end +end +eq(#collide, 0, "MOD_COMMAND has no byte in either dialect (" + .. table.concat(collide, " ") .. ")") +check(type(Opcodes.MOD_COMMAND) == "string" and Opcodes.MOD_COMMAND ~= "", + "MOD_COMMAND is a name, not a byte") + +-- The Vm side of the dialect: every Crystal-only verb has a branch, and the +-- shifted `swarm` reads its flag rather than its map group. +love = require("tests.love_stub") +local Vm = require("src.script.gen2.Vm") +local Events = require("src.world.gen2.Events") + +do + local seen, swarmArgs = {}, nil + local events = Events.new() + local vm = Vm.new({ + generation = 2, + ["s:crystal"] = { + -- pokecrystal/macros/scripts/events.asm:1003-1008: flag, then map_id. + { op = "swarm", args = { 1, 24, 3 } }, + { op = "checksave" }, + { op = "wait", args = { 2 } }, + { op = "getlandmarkname", args = { 5, 3 } }, + { op = "gettrainerclassname", args = { 9, 3 } }, + { op = "getname", args = { 1, 152, 3 } }, + { op = "verbosegiveitemvar", args = { 20, 7 } }, + { op = "farjumptext", text = "t:far" }, + { op = "setevent", event = 1 }, + }, + }, { ["t:far"] = "Far text." }, events, { + setSwarm = function(group, mapNum, kind) + swarmArgs = { group, mapNum, kind } + end, + checkSave = function() return true end, + getLandmarkName = function(id) seen.landmark = id return "RUINS" end, + getTrainerClassName = function(id) seen.class = id return "SAGE" end, + getMonName = function(id) seen.mon = id return "CHIKORITA" end, + readVar = function(id) seen.var = id return 4 end, + giveItem = function(item, qty) seen.give = { item, qty } return true end, + getItemName = function() return "REPEL" end, + showText = function(body, onDone) seen.text = body onDone() end, + }) + + check(vm:start("s:crystal"), "a Crystal-shaped script starts") + for _ = 1, 40 do vm:update() end + check(not vm:running(), "and runs to completion") + + eq(swarmArgs and swarmArgs[1], 24, "swarm reads the map group from args[2]") + eq(swarmArgs and swarmArgs[2], 3, "and the map number from args[3]") + eq(swarmArgs and swarmArgs[3], 1, "and passes SWARM_YANMA through as the kind") + eq(seen.landmark, 5, "getlandmarkname passes its landmark id to the hook") + eq(seen.class, 9, "gettrainerclassname passes the trainer group") + eq(seen.mon, 152, "getname with MON_NAME routes to the mon-name hook") + eq(seen.var, 7, "verbosegiveitemvar reads the quantity out of a var") + eq(seen.give and seen.give[1], 20, "and gives the item the first byte names") + eq(seen.give and seen.give[2], 4, "at the quantity the var held") + eq(seen.text, "Far text.", "farjumptext prints its text") + eq(next(vm.unknownOps or {}), nil, + "no Crystal verb in the script fell through to the unknown ledger") + -- Script_farjumptext ends on `jp ScriptJump`, so the setevent after it never + -- runs -- the same reading Opcodes.TERMINATORS encodes for the extractor. + check(not events:get(1), + "farjumptext ended the script before the setevent below it") + events:set(1, true) + check(events:get(1), "and the event really is observable when it is set") +end + +do + -- Script_wait is SIX frames per unit (scripting.asm:2336-2347), not + -- Script_pause's two. + local vm = Vm.new({ generation = 2, + ["s:wait"] = { { op = "wait", args = { 3 } }, { op = "end" } }, + }, {}, nil, {}) + check(vm:start("s:wait"), "a lone `wait` starts") + local frames = 0 + while vm:running() and frames < 100 do + vm:update() + frames = frames + 1 + end + eq(frames, 18, "`wait 3` holds the script for 3 * 6 frames") +end + +T.finish() diff --git a/tests/engine/launcher_gold_touch_rows.lua b/tests/engine/launcher_gold_touch_rows.lua index a09f6b27..de78bc71 100644 --- a/tests/engine/launcher_gold_touch_rows.lua +++ b/tests/engine/launcher_gold_touch_rows.lua @@ -39,7 +39,7 @@ end local edited = 0 local hooks = { editTouchControls = function() edited = edited + 1 end } -for _, version in ipairs({ "gold", "silver" }) do +for _, version in ipairs({ "gold", "silver", "crystal" }) do local model = LauncherSettings.open(hooks, version) check(has(model, "TOUCH PAD"), version .. " gear offers TOUCH PAD") check(has(model, "VIBRATION"), version .. " and VIBRATION") @@ -82,6 +82,7 @@ for _, version in ipairs({ "gold", "silver" }) do version .. " leaving the flat Gen 1 key alone") eq(model.opts.silver, nil, version .. " and inventing no second Gen 2 block beside it") + eq(model.opts.crystal, nil, version .. " nor a third") local buzz = findRow(model, "VIBRATION") local buzzBefore = buzz.value() @@ -114,6 +115,8 @@ eq(has(LauncherSettings.open(nil, "gold"), "TOUCH CONTROLS"), false, "no hook, no editor row on Gold") eq(has(LauncherSettings.open(nil, "silver"), "TOUCH CONTROLS"), false, "nor on Silver") +eq(has(LauncherSettings.open(nil, "crystal"), "TOUCH CONTROLS"), false, + "nor on Crystal") eq(has(LauncherSettings.open(nil, "red"), "TOUCH CONTROLS"), false, "nor on Red") -- The Edit row hands the screen to the host, and the host has to know WHICH diff --git a/tests/engine/launcher_skins_tab.lua b/tests/engine/launcher_skins_tab.lua index 3d410283..76a078bf 100644 --- a/tests/engine/launcher_skins_tab.lua +++ b/tests/engine/launcher_skins_tab.lua @@ -90,11 +90,23 @@ check(imp:find('if self.tab == "skins" then', 1, true) ~= nil, check(imp:find("_installSkinZip", 1, true) ~= nil, "skin zip installer exists") check(imp:find("_installMod", 1, true) ~= nil, "and a zip elsewhere still installs a mod") -local cycle = imp:match("local order = %{(.-)%}") -check(cycle and cycle:find('"skins"', 1, true) ~= nil, +local RomImporter = require("src.import.RomImporter") +local GameVersion = require("src.core.GameVersion") +local cycled, probe = {}, nil +probe = setmetatable({ tab = GameVersion.ORDER[1] }, { __index = RomImporter }) +probe._switchTab = function(self, id) self.tab = id; cycled[#cycled + 1] = id end +for _ = 1, #GameVersion.ORDER + 3 do RomImporter._cycleTab(probe, 1) end +local reached = " " .. table.concat(cycled, " ") .. " " +check(reached:find(" skins ", 1, true) ~= nil, "shoulder-button tab cycling reaches the skins tab") -check(cycle and cycle:find('"bug"', 1, true) ~= nil, +check(reached:find(" bug ", 1, true) ~= nil, "shoulder-button tab cycling reaches the bug tab") +for _, id in ipairs(GameVersion.ORDER) do + if id ~= GameVersion.ORDER[1] then + check(reached:find(" " .. id .. " ", 1, true) ~= nil, + "shoulder-button tab cycling reaches " .. id) + end +end local switch = imp:match("function RomImporter:_switchTab%(id%)(.-)\nend") check(switch and switch:find("_ensureSkins(true)", 1, true) ~= nil, "switching to the tab re-reads the skin list") diff --git a/tests/engine/mod_targets_tests.lua b/tests/engine/mod_targets_tests.lua index 87f8fc93..a04c9069 100644 --- a/tests/engine/mod_targets_tests.lua +++ b/tests/engine/mod_targets_tests.lua @@ -27,18 +27,25 @@ end -- ------- tokens expand off GameVersion, never a literal list +-- "nonesuch" is the deliberate never-a-game token for every unknown-version +-- case below. A real version id was used here twice ("gold", then "crystal") +-- and both had to be swapped the day that game shipped; this one never will. +local NO_SUCH_GAME = "nonesuch" + do eq(table.concat(ModTargets.expand("red"), ","), "red", "a version id names exactly that game") eq(table.concat(ModTargets.expand("GEN1"), ","), "red,blue,yellow", "gen1 is every Gen 1 game, case-insensitive") - eq(table.concat(ModTargets.expand("gen2"), ","), "gold,silver", + eq(table.concat(ModTargets.expand("gen2"), ","), "gold,silver,crystal", "gen2 is every Gen 2 game") eq(table.concat(ModTargets.expand("silver"), ","), "silver", "and each of them names itself") + eq(table.concat(ModTargets.expand("crystal"), ","), "crystal", + "Crystal included, the day its VERSIONS row landed") eq(table.concat(ModTargets.expand("all"), ","), table.concat(GameVersion.ORDER, ","), "all is the launcher order itself") - eq(ModTargets.expand("crystal"), nil, "a game this engine has no cache for") + eq(ModTargets.expand(NO_SUCH_GAME), nil, "a game this engine has no cache for") eq(ModTargets.expand("gen9"), nil, "a generation with no games is unknown") eq(ModTargets.expand(7), nil, "a non-string token is not a game") end @@ -48,9 +55,9 @@ do eq(table.concat(versions, ","), "red,gold", "normalize dedupes and sorts into GameVersion.ORDER") eq(#unknown, 0, "known tokens leave nothing unreported") - local _, bad = ModTargets.normalize({ "crystal", "gen1" }) + local _, bad = ModTargets.normalize({ NO_SUCH_GAME, "gen1" }) eq(#bad, 1, "an unknown token comes back for the caller to report") - eq(bad[1], "crystal", "by name") + eq(bad[1], NO_SUCH_GAME, "by name") end -- ------- the legacy reading: gen2compat only ever ADDS Gen 2 @@ -58,7 +65,7 @@ end do eq(list(mf({})), "red,blue,yellow", "a manifest with no games key is Gen 1, which is what it was tested as") - eq(list(mf({ gen2compat = true })), "red,blue,yellow,gold,silver", + eq(list(mf({ gen2compat = true })), "red,blue,yellow,gold,silver,crystal", "gen2compat keeps Gen 1 and adds Gen 2") eq(mf({}).gen2compat, false, "and the derived flag agrees") eq(mf({ gen2compat = true }).gen2compat, true, "both ways") @@ -69,23 +76,23 @@ end do local gen2 = mf({ games = { "gen2" } }) - eq(list(gen2), "gold,silver", "games can name Gen 2 alone") + eq(list(gen2), "gold,silver,crystal", "games can name Gen 2 alone") eq(gen2.gen2compat, true, "which IS the gen2compat claim the gate reads") local both = mf({ games = { "gen1", "gen2" } }) - eq(list(both), "red,blue,yellow,gold,silver", "or both generations") + eq(list(both), "red,blue,yellow,gold,silver,crystal", "or both generations") local one = mf({ games = { "blue" } }) eq(list(one), "blue", "or one single game") eq(one.gen2compat, false, "a Gen 1 game is not a Gen 2 claim") - eq(list(mf({ games = { "red" }, gen2compat = true })), "red,gold,silver", + eq(list(mf({ games = { "red" }, gen2compat = true })), "red,gold,silver,crystal", "an old gen2compat beside a new games list still adds its game") end do -- vocabulary: api 1 warns and keeps loading, api 2 refuses, exactly like -- every other manifest vocabulary (Manifest.violation) - local lenient = mf({ games = { "crystal", "red" } }) + local lenient = mf({ games = { NO_SUCH_GAME, "red" } }) eq(list(lenient), "red", "api 1 drops the unknown game and keeps the rest") - check(not pcall(mf, { api = 2, games = { "crystal" } }), + check(not pcall(mf, { api = 2, games = { NO_SUCH_GAME } }), "api 2 refuses a game it does not have") check(not pcall(mf, { games = "gen1" }), "games must be an array, not a bare string") @@ -226,12 +233,13 @@ do local bad = ModProfile.decode(require("src.core.SaveSerializer").encode({ format = "g1rmodlist", formatVersion = 1, profile = { name = "P", enabledByVersion = { - gold = { a = true }, silver = { a = true }, crystal = { a = true }, + gold = { a = true }, silver = { a = true }, + [NO_SUCH_GAME] = { a = true }, red = "nope" } }, })) eq(bad.enabledByVersion.gold.a, true, "a shared file's known game is kept") eq(bad.enabledByVersion.silver.a, true, "every one of them, not just the first") - eq(bad.enabledByVersion.crystal, nil, "an unknown game is dropped on read") + eq(bad.enabledByVersion[NO_SUCH_GAME], nil, "an unknown game is dropped on read") eq(bad.enabledByVersion.red, nil, "and so is a bucket that is not a table") end diff --git a/tests/engine/rom_importer_nx_saves_inbox_test.lua b/tests/engine/rom_importer_nx_saves_inbox_test.lua index 5a22437e..4884c8fe 100644 --- a/tests/engine/rom_importer_nx_saves_inbox_test.lua +++ b/tests/engine/rom_importer_nx_saves_inbox_test.lua @@ -57,9 +57,10 @@ end package.loaded["src.core.Platform"] = nil package.loaded["src.import.RomImporter"] = nil RomImporter = require("src.import.RomImporter") +local GameVersion = require("src.core.GameVersion") local function clearSavesInbox() - for _, ver in ipairs({ "red", "blue", "yellow", "gold", "silver" }) do + for _, ver in ipairs(GameVersion.ORDER) do local dir = "imports/saves/" .. ver for _, name in ipairs(love.filesystem.getDirectoryItems(dir) or {}) do love.filesystem.remove(dir .. "/" .. name) diff --git a/tests/engine/uwp_baseroms_test.lua b/tests/engine/uwp_baseroms_test.lua index abe735a3..0d74eab7 100644 --- a/tests/engine/uwp_baseroms_test.lua +++ b/tests/engine/uwp_baseroms_test.lua @@ -82,7 +82,7 @@ local function importer(ready) end local allReady = importer({ red = true, blue = true, yellow = true, gold = true, - silver = true }) + silver = true, crystal = true }) allReady:_queueBaseRomScan() eq(allReady.baseRomScan.state, "done", "ready launcher skips discovery") eq(listings, 0, "ready launcher does not enumerate baseroms") @@ -125,7 +125,7 @@ missing:choose("red") eq(picks, 1, "the next import attempt falls back to the native picker") local rescanned = importer({ red = true, blue = true, yellow = true, gold = true, - silver = true }) + silver = true, crystal = true }) rescanned.baseRoms.red = { path = "baseroms/z-red.gb", name = "z-red.gb" } rescanned:reimport("red") check(rescanned.baseRoms.red == nil, "re-import clears the detected ROM") diff --git a/tests/gen2_badges_test.lua b/tests/gen2_badges_test.lua index a782e7d5..9a138c58 100644 --- a/tests/gen2_badges_test.lua +++ b/tests/gen2_badges_test.lua @@ -37,6 +37,31 @@ eq(FieldMoves.BADGE_FLAG[26].store, "badges", "Johto badges go to player.badges" eq(FieldMoves.BADGE_FLAG[34].store, "kantoBadges", "ENGINE_BOULDERBADGE goes to player.kantoBadges") +-- pokecrystal/constants/engine_flags.asm:39 declares 162 flags to pokegold's +-- 93, moving the whole badge block up one. +do + local order = {} + for i = 1, 43 do order[i] = "ENGINE_UNRELATED" .. i end + order[10] = nil -- a const_skip hole must not truncate the map + for index, name in ipairs(FieldMoves.JOHTO_BADGES) do + order[27 + index] = "ENGINE_" .. name .. "BADGE" + end + for index, name in ipairs(FieldMoves.KANTO_BADGES) do + order[35 + index] = "ENGINE_" .. name .. "BADGE" + end + FieldMoves.bindEngineFlags(order) + eq(FieldMoves.BADGE_FLAG[27].name, "ZEPHYR", "crystal ZEPHYRBADGE is 27") + eq(FieldMoves.BADGE_FLAG[28].name, "HIVE", "crystal HIVEBADGE is 28") + eq(FieldMoves.BADGE_FLAG[34].name, "RISING", "crystal RISINGBADGE is 34") + eq(FieldMoves.BADGE_FLAG[35].name, "BOULDER", "crystal BOULDERBADGE is 35") + eq(FieldMoves.BADGE_FLAG[35].store, "kantoBadges", + "a renumbered Kanto badge still lands in kantoBadges") + eq(FieldMoves.BADGE_FLAG[26], nil, "Gold's ZEPHYR slot is vacated") + + FieldMoves.bindEngineFlags(nil) + eq(FieldMoves.BADGE_FLAG[26].name, "ZEPHYR", "no map falls back to Gold") +end + -- --------------------------------------------------------------------------- -- The round trip: what a gym script writes is what a field move reads. -- --------------------------------------------------------------------------- diff --git a/tests/gen2_battle_tower_battle_test.lua b/tests/gen2_battle_tower_battle_test.lua new file mode 100644 index 00000000..55b73b60 --- /dev/null +++ b/tests/gen2_battle_tower_battle_test.lua @@ -0,0 +1,603 @@ +-- The Battle Tower BATTLE: the roster tables, the opponent draw and the two +-- specials maps/BattleTowerBattleRoom.asm's loop is built out of. +-- +-- luajit tests/gen2_battle_tower_battle_test.lua +-- +-- ROM-free. The extractor half runs against a synthetic cartridge whose +-- tables are laid out byte for byte the way data/battle_tower/ assembles +-- them, and the rest against a fixture roster taken from +-- ../pokecrystal/data/battle_tower/parties.asm group 1. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 battle tower battle") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local BattleTower = require("src.core.gen2.BattleTower") +local Mon = require("src.battle.gen2.Mon") +local RomExtractorGen2 = require("src.import.RomExtractorGen2") +local Save = require("src.core.gen2.Save") +local Specials = require("src.script.gen2.Specials") + +-- ---------------------------------------------------------------- fixtures + +-- ../pokecrystal/data/pokemon/base_stats/*.asm, the five species group 1 of +-- BattleTowerMons opens with. +local POKEMON = { + JOLTEON = { name = "JOLTEON", index = 135, types = { "ELECTRIC" }, + growthRate = "MEDIUM_FAST", levelMoves = {}, + baseStats = { hp = 65, attack = 65, defense = 60, speed = 130, + specialAttack = 110, specialDefense = 95 } }, + ESPEON = { name = "ESPEON", index = 196, types = { "PSYCHIC_TYPE" }, + growthRate = "MEDIUM_FAST", levelMoves = {}, + baseStats = { hp = 65, attack = 65, defense = 60, speed = 110, + specialAttack = 130, specialDefense = 95 } }, + UMBREON = { name = "UMBREON", index = 197, types = { "DARK" }, + growthRate = "MEDIUM_FAST", levelMoves = {}, + baseStats = { hp = 95, attack = 65, defense = 110, speed = 65, + specialAttack = 60, specialDefense = 130 } }, + WOBBUFFET = { name = "WOBBUFFET", index = 202, types = { "PSYCHIC_TYPE" }, + growthRate = "MEDIUM_FAST", levelMoves = {}, + baseStats = { hp = 190, attack = 33, defense = 58, speed = 33, + specialAttack = 33, specialDefense = 58 } }, + KANGASKHAN = { name = "KANGASKHAN", index = 115, types = { "NORMAL" }, + growthRate = "MEDIUM_FAST", levelMoves = {}, + baseStats = { hp = 105, attack = 95, defense = 80, speed = 90, + specialAttack = 40, specialDefense = 80 } }, +} + +local MOVES = { + THUNDERBOLT = { pp = 15 }, HYPER_BEAM = { pp = 5 }, SHADOW_BALL = { pp = 15 }, + ROAR = { pp = 20 }, MUD_SLAP = { pp = 10 }, PSYCHIC_M = { pp = 10 }, + PSYCH_UP = { pp = 10 }, TOXIC = { pp = 10 }, IRON_TAIL = { pp = 15 }, + COUNTER = { pp = 20 }, MIRROR_COAT = { pp = 20 }, SAFEGUARD = { pp = 25 }, + DESTINY_BOND = { pp = 5 }, REVERSAL = { pp = 15 }, EARTHQUAKE = { pp = 10 }, + ATTRACT = { pp = 15 }, +} + +-- ../pokecrystal/data/battle_tower/parties.asm:4-140, transcribed field for +-- field: the DVs, the stat exp words, the PP bytes and the stats the cart +-- copies straight into wOTPartyMon. +local function row(species, item, moves, pp, dvs, statExp, stats) + return { + species = species, item = item, moves = moves, pp = pp, + level = 10, happiness = 100, experience = 1000, otId = 0, + dvs = { attack = dvs[1], defense = dvs[2], speed = dvs[3], + special = dvs[4] }, + statExp = { hp = statExp[1], attack = statExp[2], defense = statExp[3], + speed = statExp[4], special = statExp[5] }, + hp = stats[1], maxHp = stats[1], + stats = { hp = stats[1], attack = stats[2], defense = stats[3], + speed = stats[4], specialAttack = stats[5], specialDefense = stats[6] }, + } +end + +local GROUP1 = { + row("JOLTEON", "MIRACLEBERRY", + { "THUNDERBOLT", "HYPER_BEAM", "SHADOW_BALL", "ROAR" }, { 15, 5, 15, 20 }, + { 13, 13, 11, 13 }, { 50000, 40000, 40000, 35000, 40000 }, + { 41, 25, 24, 37, 34, 31 }), + row("ESPEON", "LEFTOVERS", + { "MUD_SLAP", "PSYCHIC_M", "PSYCH_UP", "TOXIC" }, { 10, 10, 10, 10 }, + { 14, 13, 15, 11 }, { 40000, 50000, 35000, 40000, 40000 }, + { 39, 26, 24, 35, 38, 31 }), + row("UMBREON", "GOLD_BERRY", + { "SHADOW_BALL", "IRON_TAIL", "PSYCH_UP", "TOXIC" }, { 15, 15, 10, 10 }, + { 13, 11, 14, 15 }, { 40000, 40000, 45000, 50000, 40000 }, + { 46, 25, 34, 26, 25, 39 }), + row("WOBBUFFET", "FOCUS_BAND", + { "COUNTER", "MIRROR_COAT", "SAFEGUARD", "DESTINY_BOND" }, + { 20, 20, 25, 5 }, { 7, 15, 13, 7 }, + { 50000, 50000, 50000, 50000, 50000 }, { 66, 18, 25, 19, 18, 23 }), + -- MIRACLEBERRY again, which is the item collision the draw refuses. + row("KANGASKHAN", "MIRACLEBERRY", + { "REVERSAL", "HYPER_BEAM", "EARTHQUAKE", "ATTRACT" }, { 15, 5, 10, 15 }, + { 14, 15, 12, 15 }, { 40000, 30000, 40000, 30000, 30000 }, + { 47, 31, 29, 29, 20, 28 }), +} + +-- ../pokecrystal/data/battle_tower/classes.asm:11-17 +local ROSTER = { + partyLength = 3, + levelGroups = 2, + uniqueMon = #GROUP1, + uniqueTrainers = 4, + sampleTrainers = 4, + trainers = { + { index = 0, name = "HANSON", class = 37, classId = "FISHER" }, + { index = 1, name = "SAWYER", class = 30, classId = "POKEMANIAC" }, + { index = 2, name = "MASUDA", class = 43, classId = "GUITARIST" }, + { index = 3, name = "NICKEL", class = 20, classId = "SCIENTIST" }, + }, + groups = { GROUP1, GROUP1 }, + classSprites = { + FISHER = "SPRITE_FISHER", POKEMANIAC = "SPRITE_SUPER_NERD", + GUITARIST = "SPRITE_ROCKER", SCIENTIST = "SPRITE_SCIENTIST", + }, +} + +local DATA = { + pokemon = POKEMON, + moves = MOVES, + trainers = { + battleTower = ROSTER, + classes = { + FISHER = { index = 37, name = "FISHER", baseMoney = 40, + attributes = { 0, 0, 40, 1, 0, 0, 0 }, items = {} }, + POKEMANIAC = { index = 30, name = "POKEMANIAC", baseMoney = 60, + attributes = { 0, 0, 60, 1, 0, 0, 0 }, items = {} }, + GUITARIST = { index = 43, name = "GUITARIST", baseMoney = 36, + attributes = { 0, 0, 36, 1, 0, 0, 0 }, items = {} }, + SCIENTIST = { index = 20, name = "SCIENTIST", baseMoney = 44, + attributes = { 0, 0, 44, 1, 0, 0, 0 }, items = {} }, + }, + }, +} + +local function crystalSave(levelGroup) + local save = Save.normalize({ version = "crystal", generation = 2 }) + save.battleTower.levelGroup = levelGroup or 1 + save.party = {} + return save +end + +-- A roll that walks a canned list, so every draw below is pinned. Same +-- 1..n convention Specials.random uses. +local function rolls(list) + local at = 0 + return function(n) + at = at + 1 + local value = list[at] or 1 + if value > n then value = ((value - 1) % n) + 1 end + return value + end +end + +local function fakeVm(save, hooks) + local vm = { + scriptVar = 0, + mem = {}, + stringBuffer = "", + specials = hooks or {}, + } + vm.specials.save = vm.specials.save or function() return save end + vm.specials.data = vm.specials.data or function() return DATA end + vm.specials.party = vm.specials.party or function() return save.party end + function vm:setStringBuffer(value) self.stringBuffer = value or "" end + function vm:showRaw() end + return vm +end + +-- =========================================== the extractor's roster decode +-- +-- A synthetic cartridge: BattleTowerTrainers, BattleTowerMons and +-- BTTrainerClassSprites laid out exactly as data/battle_tower/classes.asm, +-- parties.asm and data/trainers/sprites.asm assemble, plus the two +-- `maskbits N / cp N / jr nc` pairs load_trainer.asm samples with. +do + local NAME_LENGTH, MON_NAME_LENGTH = 11, 11 + local NICKNAMED = 48 + MON_NAME_LENGTH + local TRAINERS_AT, MONS_AT = 0x4100, 0x4100 + 3 * NAME_LENGTH + local SPRITES_AT, TR_SAMPLE_AT, MON_SAMPLE_AT = 0x5000, 0x5100, 0x5200 + local bytes = {} + local function put(offset, list) + for index, value in ipairs(list) do bytes[offset + index] = value end + end + local function name(text, width) + local out = {} + for index = 1, width do + out[index] = (index <= #text) and text:byte(index) or 0x50 + end + return out + end + -- charmap rows for the letters the three names use. + local charmap, letters = {}, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + for index = 1, #letters do + charmap[tostring(0x80 + index - 1)] = letters:sub(index, index) + end + local function encode(text, width) + local out = {} + for index = 1, width do + if index <= #text then + out[index] = 0x80 + (text:byte(index) - 65) + else + out[index] = 0x50 + end + end + return out + end + -- Three rows, the third exactly NAME_LENGTH - 1 long so the unterminated + -- name the `dname` macro leaves (classes.asm:16 ZABOROWSKI) is covered. + local rows = { { "ABLE", 1 }, { "BAKER", 2 }, { "CDEFGHIJKL", 3 } } + for index, entry in ipairs(rows) do + local at = TRAINERS_AT + (index - 1) * NAME_LENGTH + put(at, encode(entry[1], NAME_LENGTH - 1)) + bytes[at + NAME_LENGTH] = entry[2] + end + -- One level group of two mons. Only the fields the reader names are set; + -- everything else stays 0, which is what ByteFill leaves. + local function monBytes(species, item, moves, pp, dv1, dv2, level, stats) + local raw = {} + for index = 1, NICKNAMED do raw[index] = 0 end + raw[1] = species + raw[2] = item + for slot = 1, 4 do raw[2 + slot] = moves[slot] or 0 end + raw[9], raw[10], raw[11] = 0, 0x03, 0xe8 + raw[12], raw[13] = 0xc3, 0x50 + raw[22], raw[23] = dv1, dv2 + for slot = 1, 4 do raw[23 + slot] = pp[slot] or 0 end + raw[28] = 100 + raw[32] = level + raw[35], raw[36] = 0, stats[1] + raw[37], raw[38] = 0, stats[1] + raw[39], raw[40] = 0, stats[2] + raw[41], raw[42] = 0, stats[3] + raw[43], raw[44] = 0, stats[4] + raw[45], raw[46] = 0, stats[5] + raw[47], raw[48] = 0, stats[6] + return raw + end + put(MONS_AT, monBytes(135, 109, { 85, 63, 247, 46 }, { 15, 5, 15, 20 }, + 0xdd, 0xbd, 10, { 41, 25, 24, 37, 34, 31 })) + put(MONS_AT + NICKNAMED, monBytes(196, 78, { 189, 94, 0, 0 }, { 10, 10, 0, 0 }, + 0xed, 0xfb, 10, { 39, 26, 24, 35, 38, 31 })) + put(SPRITES_AT, { 7, 9, 11 }) + -- `and $03 / cp 3 / jr nc, .resample` and `and $01 / cp 2 / jr nc`. + put(TR_SAMPLE_AT, { 0xcd, 0x8c, 0x2f, 0xf0, 0xe1, 0x80, 0x47, + 0xe6, 0x03, 0xfe, 0x03, 0x30, 0xf3 }) + put(MON_SAMPLE_AT, { 0xcd, 0x8c, 0x2f, 0xf0, 0xe1, 0x80, 0x47, + 0xe6, 0x01, 0xfe, 0x02, 0x30, 0xf3 }) + + local rom = {} + for index = 1, 0x8000 do rom[index] = string.char(bytes[index] or 0) end + local manifest = { + romSha1 = "", + charmap = charmap, + constants = { + trainerClassOrder = { "TRAINER_NONE", "FALKNER", "WHITNEY", "BUGSY", + "MYSTICALMAN" }, + spriteOrder = { "SPRITE_A", "SPRITE_B", "SPRITE_C", "SPRITE_D", + "SPRITE_E", "SPRITE_F", "SPRITE_G", "SPRITE_H", "SPRITE_I", + "SPRITE_J", "SPRITE_K" }, + moveOrder = {}, itemOrder = {}, speciesOrder = {}, + }, + symbols = { + BattleTowerTrainers = { 1, TRAINERS_AT }, + BattleTowerMons = { 1, MONS_AT }, + BTTrainerClassSprites = { 1, SPRITES_AT }, + ["LoadOpponentTrainerAndPokemon.resample"] = { 1, TR_SAMPLE_AT }, + ["LoadRandomBattleTowerMon.resample"] = { 1, MON_SAMPLE_AT }, + }, + } + manifest.constants.speciesOrder[135] = "JOLTEON" + manifest.constants.speciesOrder[196] = "ESPEON" + manifest.constants.itemOrder[109] = "MIRACLEBERRY" + manifest.constants.itemOrder[78] = "LEFTOVERS" + manifest.constants.moveOrder[85] = "THUNDERBOLT" + manifest.constants.moveOrder[63] = "HYPER_BEAM" + manifest.constants.moveOrder[247] = "SHADOW_BALL" + manifest.constants.moveOrder[46] = "ROAR" + manifest.constants.moveOrder[189] = "MUD_SLAP" + manifest.constants.moveOrder[94] = "PSYCHIC_M" + + local ex = RomExtractorGen2.new(table.concat(rom), manifest, nil) + local read = ex:readBattleTowerRoster(manifest.constants, charmap) + check(read ~= nil, "the roster reads out of the cartridge") + eq(read.uniqueTrainers, 3, "the trainer count is the gap to BattleTowerMons") + eq(read.uniqueMon, 2, "NUM_UNIQUE_MON comes off the mon resample loop") + eq(read.sampleTrainers, 3, + "and the trainer ceiling off its own, which Crystal 1.0 gets wrong") + eq(read.trainers[1].name, "ABLE", "a terminated name stops at '@'") + eq(read.trainers[3].name, "CDEFGHIJKL", + "and a full-width one runs to NAME_LENGTH - 1 with no terminator") + eq(read.trainers[2].classId, "WHITNEY", "the class byte resolves to a name") + eq(read.classSprites.FALKNER, "SPRITE_G", "class 1 takes the first sprite") + eq(read.classSprites.BUGSY, "SPRITE_K", "class 3 the third") + eq(read.classSprites.MYSTICALMAN, nil, + "and MYSTICALMAN is off the end of BTTrainerClassSprites") + eq(#read.groups, 10, "ten level groups are always read") + local first = read.groups[1][1] + eq(first.species, "JOLTEON", "group 1 mon 1 species") + eq(first.item, "MIRACLEBERRY", "its held item") + eq(first.level, 10, "its level") + eq(first.happiness, 100, "its happiness") + eq(first.experience, 1000, "its three exp bytes, big-endian") + eq(first.statExp.hp, 50000, "its HP stat exp word") + eq(first.dvs.attack, 13, "attack DV out of the high nibble") + eq(first.dvs.defense, 13, "defense DV out of the low nibble") + eq(first.dvs.speed, 11, "speed DV") + eq(first.dvs.special, 13, "special DV") + eq(#first.moves, 4, "four moves") + eq(first.moves[3], "SHADOW_BALL", "move three") + eq(first.pp[2], 5, "and its PP byte") + eq(first.maxHp, 41, "the stored max HP") + eq(first.stats.speed, 37, "and the stored Speed") + local second = read.groups[1][2] + eq(#second.moves, 2, "a row with two NO_MOVE slots keeps two moves") + eq(#second.pp, 2, "and two PP bytes") +end + +-- =========================== Mon.stats agrees with the cart's stored stats +-- +-- ../pokecrystal/engine/pokemon/move_mon.asm CalcMonStats is what produced the +-- bytes in parties.asm, so the port's own formula has to land on them. +do + for _, mon in ipairs(GROUP1) do + local dvs = { attack = mon.dvs.attack, defense = mon.dvs.defense, + speed = mon.dvs.speed, special = mon.dvs.special } + local stats = Mon.stats(POKEMON[mon.species].baseStats, dvs, mon.level, + mon.statExp) + eq(stats.hp, mon.stats.hp, mon.species .. " HP matches the ROM") + eq(stats.attack, mon.stats.attack, mon.species .. " Attack matches") + eq(stats.defense, mon.stats.defense, mon.species .. " Defense matches") + eq(stats.speed, mon.stats.speed, mon.species .. " Speed matches") + eq(stats.specialAttack, mon.stats.specialAttack, + mon.species .. " Sp.Atk matches") + eq(stats.specialDefense, mon.stats.specialDefense, + mon.species .. " Sp.Def matches") + end +end + +-- ================================================ roster lookup and gating +do + eq(BattleTower.roster(DATA), ROSTER, "the roster comes off trainers.lua") + eq(BattleTower.roster({ trainers = {} }), nil, + "a Gold cache has no battleTower block") + eq(BattleTower.roster({ trainers = { battleTower = { trainers = {} } } }), nil, + "and half a block is not one either") + + local save = crystalSave(0) + eq(BattleTower.opponentGroup(save, ROSTER), 1, + "a level group of 0 cannot index before the table") + save.battleTower.levelGroup = 9 + eq(BattleTower.opponentGroup(save, ROSTER), 2, + "nor past the last group the roster carries") + save.battleTower.levelGroup = 2 + eq(BattleTower.opponentGroup(save, ROSTER), 2, "a real group is kept") +end + +-- ============================================== the trainer draw and sBTTrainers +do + local save = crystalSave() + local trainer = BattleTower.chooseTrainer(save, ROSTER, rolls({ 2 })) + eq(trainer.name, "SAWYER", "the second row is drawn") + eq(save.battleTower.trainers[1], 1, + "and recorded in sBTTrainers[sNrOfBeatenBattleTowerTrainers]") + + -- ../pokecrystal/engine/events/battle_tower/load_trainer.asm:44-51: the + -- streak list is what the reroll refuses. + save.battleTower.streak = 1 + local again = BattleTower.chooseTrainer(save, ROSTER, rolls({ 2 })) + check(again.name ~= "SAWYER", "a trainer already in the streak is refused") + eq(save.battleTower.trainers[2], again.index, + "and the new one lands in the next slot") + + -- :29-37, Crystal 1.0's ceiling: with sampleTrainers 2 only the first two + -- rows can ever come out, however the roll lands. + local capped = { partyLength = 3, levelGroups = 1, uniqueMon = #GROUP1, + uniqueTrainers = 4, sampleTrainers = 2, trainers = ROSTER.trainers, + groups = { GROUP1 }, classSprites = ROSTER.classSprites } + local seen = {} + for roll = 1, 8 do + local fresh = crystalSave() + seen[BattleTower.chooseTrainer(fresh, capped, rolls({ roll })).index] = true + end + eq(seen[2], nil, "row 2 is past the 1.0 ceiling and never drawn") + eq(seen[3], nil, "nor row 3") + check(seen[0] and seen[1], "the first two rows both are") +end + +-- ================================================== the three-mon team draw +do + local save = crystalSave() + local team = BattleTower.chooseTeam(save, ROSTER, 1, rolls({ 1, 1, 1 })) + eq(#team, 3, "three mons come out") + eq(team[1].species, "JOLTEON", "the first roll takes the first row") + -- :131-136, the species and item collisions: JOLTEON is out, and so is + -- KANGASKHAN, which holds JOLTEON's MIRACLEBERRY. + eq(team[2].species, "ESPEON", + "the second roll skips the species already picked") + eq(team[3].species, "UMBREON", "and so does the third") + local held = {} + for _, mon in ipairs(team) do + eq(held[mon.item], nil, mon.species .. " brings an unheld item") + held[mon.item] = true + end + + -- :149-166 and :195-206: the last two teams' species are refused too. + eq(save.battleTower.prevTeams.prev[1], "JOLTEON", + "the drawn team becomes sBTMonPrevTrainer") + eq(#save.battleTower.prevTeams.prevPrev, 0, + "with nothing displaced into sBTMonPrevPrevTrainer yet") + local second = BattleTower.chooseTeam(save, ROSTER, 1, rolls({ 1, 1, 1 })) + eq(second[1].species, "WOBBUFFET", "the next team skips the previous one") + eq(second[2].species, "KANGASKHAN", "and keeps skipping it") + eq(save.battleTower.prevTeams.prevPrev[1], "JOLTEON", + "and the old team shifts down to sBTMonPrevPrevTrainer") + + -- Five rows cannot field three fresh species twice running, which is + -- exactly where the cart's `jr z, .FindARandomBattleTowerMon` would spin + -- forever: the port takes the unfiltered draw instead and still hands back + -- a full team. Twenty-one rows never reach it. + eq(#second, 3, "an exhausted pool still fields three rather than hanging") + eq(second[3].species, "JOLTEON", "the third falls back to a plain roll") +end + +-- ============================================== the party the battle fights +do + local party = BattleTower.battleParty(DATA, { GROUP1[1], GROUP1[3] }) + eq(#party, 2, "one battle mon per roster row") + local jolteon = party[1] + eq(jolteon.species, "JOLTEON", "species") + eq(jolteon.name, "JOLTEON", "and the species name, not the ROM nickname") + eq(jolteon.nickname, nil, "which is why no nickname is carried") + eq(jolteon.level, 10, "level") + eq(jolteon.item, "MIRACLEBERRY", "held item") + eq(jolteon.happiness, 100, "happiness") + eq(jolteon.maxHp, 41, "max HP off the stored bytes") + eq(jolteon.hp, 41, "at full") + eq(jolteon.stats.speed, 37, "stored Speed") + eq(jolteon.stats.specialDefense, 31, "stored Sp.Def") + eq(jolteon.dvs.attack, 13, "the row's own DVs, not a roll") + eq(#jolteon.moves, 4, "four moves") + eq(jolteon.moves[2].id, "HYPER_BEAM", "move two") + eq(jolteon.moves[2].pp, 5, "with the row's PP") + eq(jolteon.moves[2].maxPp, 5, "and the move's own maximum") + eq(party[2].species, "UMBREON", "and the second row follows") + -- Mon.new mutates the dvs table it is handed, so a second build has to see + -- the roster row untouched. + local again = BattleTower.battleParty(DATA, { GROUP1[1] }) + eq(again[1].stats.attack, 25, "a second build reads the same row") + eq(GROUP1[1].dvs.hp, nil, "and leaves the roster row alone") +end + +-- ============================== LoadOpponentTrainerAndPokemonWithOTSprite +do + local painted = {} + local save = crystalSave() + local vm = fakeVm(save, { + setObjectSprite = function(object, sprite) + painted[#painted + 1] = { object = object, sprite = sprite } + end, + }) + vm.scriptVar = 2 + Specials.random = rolls({ 1, 1, 1, 1 }) + Specials.ALL.LoadOpponentTrainerAndPokemonWithOTSprite(vm) + eq(vm.scriptVar, 2, "wScriptVar still names the object, unwritten") + check(vm.btOpponent ~= nil, "the opponent is drawn onto the VM") + eq(vm.btOpponent.name, "HANSON", "the trainer's own name") + eq(vm.btOpponent.classId, "FISHER", "its class") + eq(#vm.btOpponent.rows, 3, "with three mons") + eq(#painted, 1, "the map object is repainted once") + eq(painted[1].object, 2, "the object wScriptVar named") + eq(painted[1].sprite, "SPRITE_FISHER", + "with BTTrainerClassSprites[class - 1]") + eq(save.battleTower.streak, 0, "the draw does not step the streak") + + -- A save is all it needs; a world with no sprite hook still draws. + local bare = crystalSave() + local plain = fakeVm(bare, {}) + Specials.random = rolls({ 1, 1, 1, 1 }) + Specials.ALL.LoadOpponentTrainerAndPokemonWithOTSprite(plain) + check(plain.btOpponent ~= nil, "and the draw survives a missing hook") + + -- A cache with no roster leaves nothing behind rather than half an opponent. + local goldVm = fakeVm(crystalSave(), { data = function() return {} end }) + Specials.ALL.LoadOpponentTrainerAndPokemonWithOTSprite(goldVm) + eq(goldVm.btOpponent, nil, "a cache with no roster draws nobody") +end + +-- ============================================================ BattleTowerBattle +local function towerBattle(save, outcome, extra) + local log = { heals = 0, started = nil } + local hooks = { + healParty = function() log.heals = log.heals + 1 end, + startTowerBattle = function(spec, done) + log.started = spec + log.healsAtStart = log.heals + done(outcome) + return true + end, + } + for key, value in pairs(extra or {}) do hooks[key] = value end + local vm = fakeVm(save, hooks) + Specials.random = rolls({ 1, 1, 1, 1 }) + Specials.ALL.LoadOpponentTrainerAndPokemonWithOTSprite(vm) + Specials.ALL.BattleTowerBattle(vm) + return vm, log +end + +do + local save = crystalSave() + local vm, log = towerBattle(save, "win") + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:236-237 + eq(vm.scriptVar, 0, "a win leaves wBattleResult 0 in wScriptVar") + eq(log.heals, 2, ":228 and :235, HealParty on both sides of the battle") + eq(log.healsAtStart, 1, "the first one before the send-out") + check(log.started ~= nil, "the battle was started") + eq(log.started.name, "FISHER HANSON", "named class-then-trainer") + eq(log.started.trainerName, "HANSON", "with the bare name kept") + eq(log.started.classId, "FISHER", "and the class key the pic reads") + eq(log.started.class, 37, "and its constant") + eq(log.started.baseMoney, 40, "the class's own payout multiplier") + eq(#log.started.party, 3, "three mons walk in") + eq(log.started.party[1].species, "JOLTEON", "the drawn team, built") + eq(log.started.party[1].maxHp, 41, "with the roster's stats") + + -- :549-570 CopyBTTrainer, which is what steps the counter. + eq(save.battleTower.streak, 1, "the streak steps once") + eq(save.battleTower.challenge, BattleTower.CHALLENGE_IN_PROGRESS, + "and the challenge is now in progress") + -- :240-250, the byte maps/BattleTowerBattleRoom.asm:38 reads back. + eq(vm.mem[BattleTower.WRAM_NR_BEATEN], 1, + "wNrOfBeatenBattleTowerTrainers holds the new count") + eq(vm.stringBuffer, "2", "and wStringBuffer3 the NEXT opponent's number") + eq(vm.btBattleEnded, 1, "wBattleTowerBattleEnded ends the loop") + eq(vm.btOpponent, nil, "and the drawn opponent is spent") +end + +do + local save = crystalSave() + save.battleTower.streak = 6 + local vm = towerBattle(save, "win") + eq(save.battleTower.streak, 7, "the seventh win reaches BATTLETOWER_STREAK_LENGTH") + eq(vm.mem[BattleTower.WRAM_NR_BEATEN], 7, + "which is what the room script's `ifequal 7` reads") +end + +do + local save = crystalSave() + local vm, log = towerBattle(save, "lose") + eq(vm.scriptVar, 1, "a loss leaves wBattleResult 1") + eq(log.heals, 2, "and still heals on both sides") + eq(vm.mem[BattleTower.WRAM_NR_BEATEN], nil, + ":238-239 skips the counter copy when the battle was lost") + eq(vm.stringBuffer, "", "and prints no next-opponent number") + eq(save.battleTower.streak, 1, + "the counter still stepped, because ReadBTTrainerParty ran") +end + +do + -- No hook at all: the challenge has to END rather than loop on an opponent + -- that never appears. + local save = crystalSave() + local vm = fakeVm(save, {}) + Specials.random = rolls({ 1, 1, 1, 1 }) + Specials.ALL.BattleTowerBattle(vm) + eq(vm.scriptVar, 1, "an unwired world reports a loss") + eq(vm.btBattleEnded, 1, "and ends the tower loop") + + local goldVm = fakeVm(crystalSave(), { data = function() return {} end }) + Specials.ALL.BattleTowerBattle(goldVm) + eq(goldVm.scriptVar, 1, "so does a cache with no roster") +end + +do + -- The special draws its own opponent when the room script never loaded one. + local save = crystalSave() + local log + local vm = fakeVm(save, { + healParty = function() end, + startTowerBattle = function(spec, done) log = spec; done("win"); return true end, + }) + Specials.random = rolls({ 1, 1, 1, 1 }) + Specials.ALL.BattleTowerBattle(vm) + check(log ~= nil and #log.party == 3, + "BattleTowerBattle alone still fields an opponent") +end + +-- ============================================ InitBattleTowerChallengeRAM +do + local save = crystalSave() + local vm = fakeVm(save, { pushScreen = function() return false end }) + vm.mem[BattleTower.WRAM_NR_BEATEN] = 4 + Specials.ALL.BattleTowerRoomMenu(vm) + eq(vm.mem[BattleTower.WRAM_NR_BEATEN], 0, + ":193 zeroes wNrOfBeatenBattleTowerTrainers with the rest") + eq(vm.btBattleEnded, 0, "and wBattleTowerBattleEnded with it") +end + +Specials.random = math.random + +S.finish() diff --git a/tests/gen2_battle_tower_test.lua b/tests/gen2_battle_tower_test.lua new file mode 100644 index 00000000..a4c7685c --- /dev/null +++ b/tests/gen2_battle_tower_test.lua @@ -0,0 +1,629 @@ +-- The Battle Tower: engine/events/battle_tower/battle_tower.asm, +-- engine/events/battle_tower/rules.asm and the room menu at +-- mobile/mobile_46.asm:137. +-- +-- luajit tests/gen2_battle_tower_test.lua +-- +-- ROM-free. The lobby rules, the challenge-state machine, the level/uber +-- room gates, the reward roll and the wInBattleTowerBattle badge guard, all +-- against fixtures. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 battle tower") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Battle = require("src.battle.gen2.Battle") +local BattleTower = require("src.core.gen2.BattleTower") +local BattleTowerMenu = require("src.ui.gen2.BattleTowerMenu") +local Mon = require("src.battle.gen2.Mon") +local Save = require("src.core.gen2.Save") +local Screens = require("src.ui.Screens") +local Specials = require("src.script.gen2.Specials") + +local A = BattleTower.ACTIONS + +-- ---------------------------------------------------------------- fixtures + +local ITEM_ORDER = {} +do + -- ../pokecrystal/constants/item_constants.asm: only the span the reward roll + -- walks has to be at its real index, so the filler carries the rest. + for i = 1, 250 do ITEM_ORDER[i] = "FILLER_" .. i end + ITEM_ORDER[18] = "POTION" + ITEM_ORDER[26] = "HP_UP" + ITEM_ORDER[27] = "PROTEIN" + ITEM_ORDER[28] = "IRON" + ITEM_ORDER[29] = "CARBOS" + ITEM_ORDER[30] = "LUCKY_PUNCH" + ITEM_ORDER[31] = "CALCIUM" +end + +local DATA = { + gen2Constants = { itemOrder = ITEM_ORDER }, + items = { + POTION = { index = 18, pocket = "ITEM" }, + HP_UP = { index = 26, pocket = "ITEM" }, + CALCIUM = { index = 31, pocket = "ITEM" }, + }, +} + +local function mon(species, level, item, isEgg) + return { species = species, level = level, item = item, isEgg = isEgg } +end + +local function crystalSave() + local save = { version = "crystal", player = { id = 7, badges = {} }, + party = {}, inventory = {} } + return save +end + +-- The hooks World:specialHooks hands a handler, stubbed. +local function fakeVm(opts) + opts = opts or {} + local vm = { + scriptVar = opts.scriptVar or 0, + specials = opts.hooks or {}, + pages = {}, + stringBuffer = "", + } + function vm:setStringBuffer(value) self.stringBuffer = value or "" end + function vm:showRaw(body) + body = tostring(body) + if self.stringBuffer ~= "" then + body = body:gsub("{STRBUF}", self.stringBuffer) + end + self.pages[#self.pages + 1] = body + end + return vm +end + +local function towerVm(save, extra) + local hooks = { + save = function() return save end, + data = function() return DATA end, + party = function() return save.party end, + itemIndex = function(id) + for index, name in ipairs(ITEM_ORDER) do + if name == id then return index end + end + return 0 + end, + } + for key, value in pairs(extra or {}) do hooks[key] = value end + return fakeVm({ hooks = hooks }) +end + +local function action(vm, id) + vm.scriptVar = id + Specials.ALL.BattleTowerAction(vm) + return vm.scriptVar +end + +-- ============================================== the seam and the ownership +do + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:181-259 and + -- :1534-1576 joined the list once the roster reached trainers.lua; their own + -- behaviour is tests/gen2_battle_tower_battle_test.lua. + for _, name in ipairs({ "BattleTowerAction", "CheckForBattleTowerRules", + "Menu_ChallengeExplanationCancel", "BattleTowerRoomMenu", + "BattleTowerBattle", "LoadOpponentTrainerAndPokemonWithOTSprite" }) do + eq(Specials.HANDLER_SOURCE[name], "specials/battle_tower.lua", + name .. " is owned by specials/battle_tower.lua") + check(type(Specials.ALL[name]) == "function", + name .. " resolves to a function") + eq(Specials.STUBS[name], nil, name .. " is no longer a stub") + end + + for _, name in ipairs({ "BattleTowerMobileError" }) do + check(type(Specials.STUB_REASONS[name]) == "string", + name .. " is still a deliberate stub, with its reason") + end + + local found = false + for _, id in ipairs(Screens.GEN2_IDS) do + if id == "Gen2BattleTowerMenu" then found = true end + end + check(found, "Gen2BattleTowerMenu joined Screens.GEN2_IDS") +end + +-- ================================================= _CheckForBattleTowerRules +do + local legal = { mon("PIKACHU", 40, "BERRY"), mon("GEODUDE", 40, "GOLD_BERRY"), + mon("HORSEA", 40) } + local lines, failed = BattleTower.checkRules(legal) + eq(#lines, 0, "a legal three-mon party prints nothing") + eq(failed, false, "and _CheckForBattleTowerRules returns no carry") + + -- Two itemless mons do not collide: `ld a, [hl] / and a / jr z, .next` + -- drops a zero value before the inner scan ever runs. + local bare = { mon("PIKACHU", 40), mon("GEODUDE", 40), mon("HORSEA", 40) } + eq(#(BattleTower.checkRules(bare)), 0, + "three mons holding nothing is legal") + + lines = BattleTower.checkRules({ mon("PIKACHU", 40), mon("GEODUDE", 40) }) + eq(table.concat(lines, "|"), + "_ExcuseMeYoureNotReadyText|_OnlyThreeMonMayBeEnteredText|" + .. "_BattleTowerReturnWhenReadyText", + "two mons: the header, the count line and the tail") + + lines = BattleTower.checkRules({ mon("PIKACHU", 40), mon("PIKACHU", 40), + mon("HORSEA", 40) }) + eq(lines[2], "_TheMonMustAllBeDifferentKindsText", + "a duplicate species is the second check") + + lines = BattleTower.checkRules({ mon("PIKACHU", 40, "BERRY"), + mon("GEODUDE", 40, "BERRY"), mon("HORSEA", 40) }) + eq(lines[2], "_TheMonMustNotHoldTheSameItemsText", + "a duplicate held item is the third") + + lines = BattleTower.checkRules({ mon("PIKACHU", 40), mon("GEODUDE", 40), + mon("ODD_EGG", 5, nil, true) }) + eq(lines[2], "_YouCantTakeAnEggText", "an egg is the fourth") + + -- An egg is skipped by BOTH uniqueness walks (CheckPartyValueIsUnique's + -- `.isegg` guards each side), so it only trips its own check. + lines = BattleTower.checkRules({ mon("PIKACHU", 40, "BERRY"), + mon("PIKACHU", 40, "BERRY", true), mon("HORSEA", 40) }) + eq(table.concat(lines, "|"), + "_ExcuseMeYoureNotReadyText|_YouCantTakeAnEggText|" + .. "_BattleTowerReturnWhenReadyText", + "an egg duplicating a species and an item still only fails the egg rule") + + -- Every check runs; BattleTower_ExecuteJumptable does not stop at the first. + lines = BattleTower.checkRules({ mon("PIKACHU", 40, "BERRY"), + mon("PIKACHU", 40, "BERRY"), mon("HORSEA", 40, "BERRY"), + mon("ODD_EGG", 5, nil, true) }) + eq(table.concat(lines, "|"), + "_ExcuseMeYoureNotReadyText|_OnlyThreeMonMayBeEnteredText|" + .. "_TheMonMustAllBeDifferentKindsText|" + .. "_TheMonMustNotHoldTheSameItemsText|_YouCantTakeAnEggText|" + .. "_BattleTowerReturnWhenReadyText", + "four failures print the header, all four lines and the tail, in order") +end + +-- ---- the special itself +do + local save = crystalSave() + save.party = { mon("PIKACHU", 40), mon("GEODUDE", 40), mon("HORSEA", 40) } + local vm = towerVm(save) + Specials.ALL.CheckForBattleTowerRules(vm) + eq(vm.scriptVar, 0, "a legal party answers FALSE, the `ifnotequal FALSE` arm") + eq(#vm.pages, 0, "and prints nothing") + + save.party = { mon("PIKACHU", 40) } + vm = towerVm(save) + Specials.ALL.CheckForBattleTowerRules(vm) + eq(vm.scriptVar, 1, "a broken party answers TRUE") + eq(#vm.pages, 3, "and prints header, refusal and tail") + eq(vm.stringBuffer, "3", "wStringBuffer2 holds the '3' the lines splice in") +end + +-- ============================================== the rooms and their gates +do + local save = crystalSave() + eq(#BattleTower.levelGroupRows(save), 4, + "before the Hall of Fame only L10-L40 are offered") + save.hallOfFame = { count = 1, teams = {} } + eq(#BattleTower.levelGroupRows(save), 10, + "and all ten once STATUSFLAGS_HALL_OF_FAME_F is set") + + -- maps/BattleTowerHallway.asm:40-47, the room the receptionist walks to. + eq(BattleTower.roomOf(1), 0, "L10 is the 10/20 room") + eq(BattleTower.roomOf(2), 0, "L20 shares it") + eq(BattleTower.roomOf(3), 1, "L30 is the 30/40 room") + eq(BattleTower.roomOf(4), 1, "L40 shares it") + eq(BattleTower.roomOf(9), 4, "L90 is the 90/100 room") + eq(BattleTower.roomOf(10), 4, "L100 shares it") + + local party = { mon("PIKACHU", 30), mon("GEODUDE", 30), mon("HORSEA", 30) } + eq(BattleTower.levelCheck(party, 3), false, "L30 mons fit the L30 room") + eq(BattleTower.levelCheck(party, 2), true, "and top the L20 room") + party[1].level = 31 + eq(BattleTower.levelCheck(party, 3), true, "one mon over is enough") + + local ubers = { mon("LUGIA", 40), mon("GEODUDE", 40), mon("HORSEA", 40) } + eq(BattleTower.ubersCheck(ubers, 4), "LUGIA", + "an uber is refused below the L70 rooms") + eq(BattleTower.ubersCheck(ubers, 7), nil, + "and allowed from the L70 room up") + ubers[1] = mon("MEWTWO", 70) + eq(BattleTower.ubersCheck(ubers, 6), nil, + "an uber already at L70 is past the `cp 70 / jr c` gate") + eq(BattleTower.ubersCheck({ mon("DRAGONITE", 40) }, 4), nil, + "and DRAGONITE is not on the list") +end + +-- ==================================================== the reward (:906-976) +do + -- The `maskbits` roll is over eight values folded into six, so HP_UP and + -- PROTEIN come up twice as often; LUCKY_PUNCH is rerolled. + local seen = {} + for roll = 1, 8 do + local n = 0 + local item = BattleTower.rollReward(ITEM_ORDER, function(mask) + n = n + 1 + -- Specials.random answers 1..mask, and the handler folds it with % mask. + return (n == 1) and roll or 1 + end) + seen[roll % 8] = item + end + eq(seen[1], "PROTEIN", "roll 1 is PROTEIN") + eq(seen[2], "IRON", "roll 2 is IRON") + eq(seen[3], "CARBOS", "roll 3 is CARBOS") + eq(seen[5], "CALCIUM", "roll 5 is CALCIUM") + eq(seen[0], "HP_UP", "roll 0 is HP_UP") + eq(seen[6], "HP_UP", "roll 6 folds back onto HP_UP") + eq(seen[7], "PROTEIN", "roll 7 folds back onto PROTEIN") + check(seen[4] ~= "LUCKY_PUNCH", "roll 4 lands on LUCKY_PUNCH and rerolls") + + eq(BattleTower.rewardFits(19, 20, nil), true, + "a pocket with a free slot takes the five") + eq(BattleTower.rewardFits(20, 20, nil), false, + "a full pocket holding none of the reward cannot") + eq(BattleTower.rewardFits(20, 20, 94), true, + "a full pocket already holding 94 can stack five more") + eq(BattleTower.rewardFits(20, 20, 95), false, + "95 is where MAX_ITEM_STACK - 5 + 1 stops it") +end + +-- ================================== BattleTowerAction, every jumptable row +do + local save = crystalSave() + local vm = towerVm(save) + -- ../pokecrystal/engine/events/battle_tower/battle_tower.asm:855-887 + local unhandled = {} + for id = 0, BattleTower.NUM_ACTIONS - 1 do + vm.scriptVar = id + local before = vm.scriptVar + local ok = pcall(Specials.ALL.BattleTowerAction, vm) + if not ok then unhandled[#unhandled + 1] = id end + if ok and vm.scriptVar == before and before ~= 0 then + -- a row that answers nothing must be one of the documented no-writes + local writesNothing = (id == A.SET_EXPLANATION_READ) + or (id == A.SAVE_AND_QUIT) or (id == A.CHALLENGECANCELED) + or (id == A.ACTION_06) or (id == A.SAVELEVELGROUP) + or (id == A.LOADLEVELGROUP) or (id == A.ACTION_0A) + or (id == A.ACTION_0C) or (id == A.ACTION_11) or (id == A.ACTION_12) + or (id == A.ACTION_15) or (id == A.ACTION_16) or (id == A.RESETDATA) + or (id == A.ACTION_1C) or (id == A.ACTION_1D) + or (id == A.CHOOSEREWARD) or (id == A.SAVEOPTIONS) + if not writesNothing then unhandled[#unhandled + 1] = id end + end + end + eq(table.concat(unhandled, ","), "", + "all 32 BattleTowerAction rows run, and only the cart's silent ones " + .. "leave wScriptVar alone") +end + +-- ---- the challenge state machine (:992-1022, :935-949) +do + local save = crystalSave() + local vm = towerVm(save) + eq(action(vm, A.GET_CHALLENGE_STATE), BattleTower.NO_CHALLENGE, + "a fresh save is BATTLETOWER_NO_CHALLENGE") + action(vm, A.SAVE_AND_QUIT) + eq(action(vm, A.GET_CHALLENGE_STATE), BattleTower.SAVED_AND_LEFT, + "the quicksave arm parks on BATTLETOWER_SAVED_AND_LEFT") + action(vm, A.ACTION_1C) + eq(action(vm, A.GET_CHALLENGE_STATE), BattleTower.WON_CHALLENGE, + "beating the seventh trainer is BATTLETOWER_WON_CHALLENGE") + action(vm, A.ACTION_1D) + eq(action(vm, A.GET_CHALLENGE_STATE), BattleTower.RECEIVED_REWARD, + "and taking the prize is BATTLETOWER_RECEIVED_REWARD") + action(vm, A.CHALLENGECANCELED) + eq(action(vm, A.GET_CHALLENGE_STATE), BattleTower.NO_CHALLENGE, + "cancelling clears it") +end + +-- ---- sBattleTowerSaveFileFlags (:978-1008, :1471-1492) +do + local save = crystalSave() + local tower = BattleTower.state(save) + eq(tower.saveFileFlags, 0, "a fresh save has no tower flags") + BattleTower.setSaveFileFlag(save, BattleTower.SAVEFILE_EXPLANATION) + eq(BattleTower.saveFileFlag(save, BattleTower.SAVEFILE_EXPLANATION), 2, + "`and 2` answers the masked byte, not a boolean") + eq(BattleTower.saveFileFlag(save, BattleTower.SAVEFILE_REGISTERED), 0, + "and bit 0 is untouched") + BattleTower.setSaveFileFlag(save, BattleTower.SAVEFILE_EXPLANATION) + eq(tower.saveFileFlags, 2, "`or 2` twice is still 2") + BattleTower.setSaveFileFlag(save, BattleTower.SAVEFILE_REGISTERED) + eq(tower.saveFileFlags, 3, "both bits live in the one byte") + + -- :979-982 -- with no save file on disk the routine returns FALSE without + -- ever reading the flags. + local vm = towerVm(save) + eq(action(vm, A.CHECK_EXPLANATION_READ), 0, + "no save file means the explanation check answers FALSE") + eq(action(vm, A.CHECKSAVEFILEISYOURS), 0, + "and so does the save-file check itself") +end + +-- ---- the level group (:1129-1155) and the GS Ball (:1179-1185) +do + local save = crystalSave() + local vm = towerVm(save) + vm.btLevelGroup = 7 + action(vm, A.SAVELEVELGROUP) + eq(BattleTower.state(save).levelGroup, 7, + "SAVELEVELGROUP banks wBTChoiceOfLvlGroup in SRAM") + vm.btLevelGroup = nil + action(vm, A.LOADLEVELGROUP) + eq(vm.btLevelGroup, 7, "and LOADLEVELGROUP brings it back for the hallway") + + eq(action(vm, A.GSBALL), 0, "no GS Ball, no scene") + Save.crystalState(save).gsBall = "have" + eq(action(vm, A.GSBALL), BattleTower.GS_BALL_AVAILABLE, + "sGSBallFlag reads back as GS_BALL_AVAILABLE ($b)") + Save.crystalState(save).gsBall = "given" + eq(action(vm, A.GSBALL), BattleTower.GS_BALL_AVAILABLE, + "and stays set once the ball has been handed over") +end + +-- ---- RESETDATA and the prize (:890-933, :955-976) +do + local save = crystalSave() + local tower = BattleTower.state(save) + tower.streak = 5 + tower.trainers = { 3, 9 } + local vm = towerVm(save) + action(vm, A.RESETDATA) + eq(tower.streak, 0, "RESETDATA clears sNrOfBeatenBattleTowerTrainers") + eq(next(tower.trainers), nil, "and the seven sBTTrainers slots") + + local rewards = {} + for _ = 1, 200 do + action(vm, A.CHOOSEREWARD) + rewards[tower.reward] = true + end + eq(rewards.POTION, nil, + "CHOOSEREWARD never falls back on POTION: it reads gen2Constants.itemOrder") + eq(rewards[BattleTower.SKIPPED_REWARD], nil, "and never rolls LUCKY_PUNCH") + for name in pairs(rewards) do + check(name == "HP_UP" or name == "PROTEIN" or name == "IRON" + or name == "CARBOS" or name == "CALCIUM", + name .. " is inside BATTLETOWER_MIN_REWARD..MAX_REWARD") + end + eq(rewards.HP_UP, true, "and the whole span comes up (HP_UP)") + eq(rewards.CALCIUM, true, "through CALCIUM") + + tower.reward = "CALCIUM" + eq(action(vm, A.GIVEREWARD), 31, "GIVEREWARD answers the item id") + -- A full ITEM pocket that does not already hold the reward: the desk hands + -- over a POTION, which is the script's `ifequal POTION` arm. + for i = 1, 20 do save.inventory["FILLER_" .. i] = 1 end + eq(action(vm, A.GIVEREWARD), 18, + "a stuffed pack turns the prize into POTION") +end + +-- ---- Menu_ChallengeExplanationCancel (mobile/mobile_5f.asm:425-468) +do + local save = crystalSave() + for row = 1, 3 do + local vm = towerVm(save, { + scriptMenu = function(_header, done) done(row) end, + }) + vm.scriptVar = 1 + Specials.ALL.Menu_ChallengeExplanationCancel(vm) + eq(vm.scriptVar, row, "row " .. row .. " comes back as wScriptVar") + end + local vm = towerVm(save, { + scriptMenu = function(_header, done) done(0) end, + }) + vm.scriptVar = 1 + Specials.ALL.Menu_ChallengeExplanationCancel(vm) + eq(vm.scriptVar, 4, "a B press is the `.Exit` arm's 4") + + vm = towerVm(save) + vm.scriptVar = 1 + Specials.ALL.Menu_ChallengeExplanationCancel(vm) + eq(vm.scriptVar, 4, "and so is a run with no menu to open") +end + +-- ---- BattleTowerRoomMenu (battle_tower.asm:1-5) +do + local save = crystalSave() + save.hallOfFame = { count = 1, teams = {} } + local pushed + local vm = towerVm(save, { + pushScreen = function(id, opts) + pushed = id + opts.onDone(6) + return true + end, + }) + Specials.ALL.BattleTowerRoomMenu(vm) + eq(pushed, "Gen2BattleTowerMenu", "the desk opens the room menu screen") + eq(vm.scriptVar, 0, "a chosen room answers 0, the script's `ifnotequal $0`") + eq(vm.btLevelGroup, 6, "and wBTChoiceOfLvlGroup holds the L60 room") + + vm = towerVm(save, { + pushScreen = function(_id, opts) + opts.onDone(nil) + return true + end, + }) + Specials.ALL.BattleTowerRoomMenu(vm) + eq(vm.scriptVar, 0x0a, "cancelling answers $a, the desk's loop-back arm") + + vm = towerVm(save) + Specials.ALL.BattleTowerRoomMenu(vm) + eq(vm.scriptVar, 0x0a, "and so does a run with no screen to push") +end + +-- ============================================ the room menu screen itself +do + eq(BattleTowerMenu.levelLabel(1), " L:10 ", "Strings_L10ToL100 row 1") + eq(BattleTowerMenu.levelLabel(10), " L:100", "and row 10, six tiles wide") + + local pressed = {} + local game = { input = { wasPressed = function(_, name) + return pressed[name] == true + end } } + local function press(name) pressed = { [name] = true } end + + local save = crystalSave() + save.hallOfFame = { count = 1, teams = {} } + local result, calls = nil, 0 + local screen = BattleTowerMenu.new(game, { + save = save, + party = { mon("PIKACHU", 20), mon("GEODUDE", 20), mon("HORSEA", 20) }, + onDone = function(value) result = value; calls = calls + 1 end, + }) + eq(screen.cursor, 1, "the spinner opens on L:10") + eq(screen:rowCount(), 11, "ten rooms plus CANCEL") + + press("up"); screen:update() + eq(screen.cursor, 2, "UP walks the level up") + press("down"); screen:update() + press("down"); screen:update() + eq(screen.cursor, 11, "DOWN off the top rolls over to CANCEL") + press("up"); screen:update() + eq(screen.cursor, 1, "and UP off CANCEL rolls back to L:10") + + -- A party at L20 tops the L10 room (mobile/mobile_46.asm:3915-3917). + press("a"); screen:update() + eq(screen.phase, "message", "picking L:10 with L20 mons prints a refusal") + eq(calls, 0, "and does not answer the script") + for _ = 1, 0x80 do pressed = {}; screen:update() end + eq(screen.phase, "pick", "the $80-frame hold puts the menu back") + eq(screen.cursor, 1, "at jumptable index 0, cursor reset") + + press("up"); screen:update() + press("a"); screen:update() + eq(result, 2, "L:20 is accepted and hands back the level group") + eq(calls, 1, "exactly once") +end + +do + -- The uber gate, and the CANCEL path's yes/no. + local pressed = {} + local game = { input = { wasPressed = function(_, name) + return pressed[name] == true + end } } + local function press(name) pressed = { [name] = true } end + + local save = crystalSave() + local result, answered = nil, false + local screen = BattleTowerMenu.new(game, { + save = save, + party = { mon("LUGIA", 40), mon("GEODUDE", 40), mon("HORSEA", 40) }, + monName = function(id) return id end, + onDone = function(value) result = value; answered = true end, + }) + eq(screen:rowCount(), 5, "no Hall of Fame, so four rooms plus CANCEL") + for _ = 1, 3 do press("up"); screen:update() end + eq(screen.cursor, 4, "on L:40") + press("a"); screen:update() + eq(screen.phase, "message", "an uber under L70 is refused below the L70 room") + check(screen.message:find("LUGIA", 1, true) ~= nil, + "and the refusal names it, the way text_ram wcd49 does") + + for _ = 1, 0x80 do pressed = {}; screen:update() end + eq(screen.cursor, 1, "the refusal restarts the menu at L:10") + for _ = 1, 4 do press("up"); screen:update() end + eq(screen.cursor, 5, "CANCEL is the last row") + press("a"); screen:update() + eq(screen.phase, "quit", "CANCEL opens the yes/no") + eq(screen.yes, true, "on YES") + press("down"); screen:update() + press("a"); screen:update() + eq(screen.phase, "pick", "NO puts the level spinner back") + eq(answered, false, "and answers nothing yet") + press("b"); screen:update() + eq(screen.phase, "quit", "B on the spinner is the same cancel prompt") + press("a"); screen:update() + eq(answered, true, "YES ends the menu") + eq(result, nil, "with no level group, which the handler turns into $a") +end + +-- ================================ wInBattleTowerBattle and the badge boosts +do + local GROWTH = { GROWTH_MEDIUM_FAST = { numerator = 1, denominator = 1, + squared = 0, linear = 0, constant = 0 } } + local BATTLE_DATA = { + pokemon = { + growthRates = GROWTH, + MACHOP = { id = "MACHOP", index = 66, name = "MACHOP", + baseStats = { hp = 70, attack = 80, defense = 50, speed = 35, + specialAttack = 35, specialDefense = 35 }, + types = { "NORMAL", "NORMAL" }, catchRate = 180, baseExp = 75, + growthRate = "GROWTH_MEDIUM_FAST", genderRatio = 63, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {} }, + PIDGEY = { id = "PIDGEY", index = 16, name = "PIDGEY", + baseStats = { hp = 40, attack = 45, defense = 40, speed = 56, + specialAttack = 35, specialDefense = 35 }, + types = { "NORMAL", "FLYING" }, catchRate = 255, baseExp = 55, + growthRate = "GROWTH_MEDIUM_FAST", genderRatio = 127, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {} }, + }, + moves = {}, type_chart = { types = {}, matchups = {} }, items = {}, + } + local perfect = { attack = 15, defense = 15, speed = 15, special = 15 } + perfect.hp = Mon.hpDV(perfect) + + local BADGES = { ZEPHYR = true, HIVE = true, PLAIN = true, FOG = true, + MINERAL = true, STORM = true, GLACIER = true, RISING = true } + + local function newBattle(tower) + local player = Mon.new(BATTLE_DATA, "MACHOP", 40, { dvs = perfect }) + local wild = Mon.new(BATTLE_DATA, "PIDGEY", 40, { dvs = perfect }) + return Battle.new({ data = BATTLE_DATA, party = { player }, wild = wild, + save = { player = { id = 7, badges = BADGES, kantoBadges = {} } }, + battleTower = tower, + random = function(n) return (n or 1) > 1 and 1 or 0 end }), player + end + + local outside, player = newBattle(false) + eq(outside.inBattleTowerBattle, false, "an ordinary battle is not a Tower one") + eq(outside:battleStat(player, "attack"), + Battle.boostStat(player.stats.attack), + "outside the Tower ZEPHYRBADGE still boosts Attack") + eq(outside:battleStat(player, "speed"), + Battle.boostStat(player.stats.speed), "and PLAINBADGE Speed") + eq(outside:badgeTypeBoost(player, "FLYING"), true, + "and DoBadgeTypeBoosts still fires") + + local inside, towerPlayer = newBattle(true) + eq(inside.inBattleTowerBattle, true, "the Tower battle sets it") + eq(inside:battleStat(towerPlayer, "attack"), towerPlayer.stats.attack, + "BadgeStatBoosts' second early return drops the Attack boost") + eq(inside:battleStat(towerPlayer, "defense"), towerPlayer.stats.defense, + "and Defense") + eq(inside:battleStat(towerPlayer, "speed"), towerPlayer.stats.speed, + "and Speed") + eq(inside:battleStat(towerPlayer, "specialAttack"), + towerPlayer.stats.specialAttack, "and Special Attack") + eq(inside:battleStat(towerPlayer, "specialDefense"), + towerPlayer.stats.specialDefense, + "and GLACIERBADGE's buggy Special Defense re-check with it") + eq(inside:badgeTypeBoost(towerPlayer, "FLYING"), false, + "DoBadgeTypeBoosts takes the same guard (engine/battle/misc.asm:152)") + + -- The obedience ladder shares Battle:hasBadge and the cart does NOT guard + -- it (engine/battle/effect_commands.asm:671-696 reads wJohtoBadges raw). + eq(inside:obedienceLevel(), outside:obedienceLevel(), + "obedience reads the badges either way") + eq(inside:hasBadge("badges", "ZEPHYR"), true, + "and Battle:hasBadge itself is untouched") +end + +-- ================================================ Gold and Silver are clean +do + for _, version in ipairs({ "gold", "silver" }) do + local save = Save.normalize({ version = version, generation = 2 }) + eq(save.version, version, version .. " keeps its own version") + eq(save.battleTower, nil, version .. " grows no battleTower block") + eq(save.crystal, nil, "nor a crystal one") + end + local crystal = Save.normalize({ version = "crystal", generation = 2 }) + eq(crystal.version, "crystal", "and the Crystal file stays Crystal") + check(type(crystal.battleTower) == "table", + "which does carry sBattleTowerChallengeState") + eq(crystal.battleTower.challenge, BattleTower.NO_CHALLENGE, + "starting at BATTLETOWER_NO_CHALLENGE") +end + +S.finish() diff --git a/tests/gen2_battletype_escape_test.lua b/tests/gen2_battletype_escape_test.lua new file mode 100644 index 00000000..be24cc6c --- /dev/null +++ b/tests/gen2_battletype_escape_test.lua @@ -0,0 +1,55 @@ +-- TryToRunAwayFromBattle's battle-type ladder, which nothing covered: +-- ../pokecrystal/engine/battle/core.asm:3687-3694 refuses TRAP, CELEBI, +-- FORCESHINY and SUICUNE, pokegold/engine/battle/core.asm:3476-3479 only the +-- first and third, and the values themselves come from +-- ../pokecrystal/constants/battle_constants.asm:91-103. +-- luajit tests/gen2_battletype_escape_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 battletype escape") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Battle = require("src.battle.gen2.Battle") + +-- ../pokecrystal/constants/battle_constants.asm:91-103, `const_def` from 0. +local NORMAL, CANLOSE, DEBUG, TUTORIAL = 0, 1, 2, 3 +local FISH, ROAMING, CONTEST, FORCESHINY = 4, 5, 6, 7 +local TREE, TRAP, FORCEITEM, CELEBI, SUICUNE = 8, 9, 10, 11, 12 + +eq(Battle.BATTLETYPE_CANLOSE, CANLOSE, "BATTLETYPE_CANLOSE is 1") +eq(Battle.BATTLETYPE_FORCESHINY, FORCESHINY, "BATTLETYPE_FORCESHINY is 7") +eq(Battle.BATTLETYPE_TRAP, TRAP, "BATTLETYPE_TRAP is 9") +eq(Battle.BATTLETYPE_CELEBI, CELEBI, "BATTLETYPE_CELEBI is 11, after FORCEITEM") +eq(Battle.BATTLETYPE_SUICUNE, SUICUNE, "BATTLETYPE_SUICUNE is 12") + +local function refuses(value) + return Battle.noEscapeBattleType({ battleType = value }) == true +end + +for _, row in ipairs({ + { NORMAL, false, "NORMAL" }, + { CANLOSE, false, "CANLOSE" }, + { DEBUG, false, "DEBUG" }, + { TUTORIAL, false, "TUTORIAL" }, + { FISH, false, "FISH" }, + { ROAMING, false, "ROAMING" }, + { CONTEST, false, "CONTEST" }, + { FORCESHINY, true, "FORCESHINY" }, + { TREE, false, "TREE" }, + { TRAP, true, "TRAP" }, + -- ../pokecrystal/maps/TinTower1F.asm:120 and pokegold's Lugia and Ho-Oh both + -- arm FORCEITEM, which the ladder does not name: it is escapable. + { FORCEITEM, false, "FORCEITEM" }, + { CELEBI, true, "CELEBI" }, + { SUICUNE, true, "SUICUNE" }, +}) do + local value, want, name = row[1], row[2], row[3] + eq(refuses(value), want, + ("%s (%d) %s escape"):format(name, value, want and "refuses" or "allows")) +end + +check(refuses(nil) == false, "an unarmed battle escapes") + +S.finish() diff --git a/tests/gen2_chamber_fieldmoves_test.lua b/tests/gen2_chamber_fieldmoves_test.lua new file mode 100644 index 00000000..5a906da1 --- /dev/null +++ b/tests/gen2_chamber_fieldmoves_test.lua @@ -0,0 +1,71 @@ +-- The two Ruins of Alph walls the FIELD MOVES open, at their production seams: +-- ../pokecrystal/engine/events/overworld.asm:280-291 FlashFunction.CheckUseFlash +-- (ZEPHYRBADGE first, SpecialAerodactylChamber second, the darkness test last) +-- and :808-813 EscapeRopeOrDig's `.escaperope` arm. +-- luajit tests/gen2_chamber_fieldmoves_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 chamber field moves") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Events = require("src.world.gen2.Events") +local FieldMoves = require("src.world.gen2.FieldMoves") +local UnownWords = require("src.world.gen2.UnownWords") + +local function ctxFor(mapId, badges, dark) + local events = Events.new() + return { + events = events, + save = { player = { badges = badges } }, + dark = dark or false, + openAerodactylWall = function() + return UnownWords.aerodactylChamber(events, mapId) + end, + }, events +end + +local AERO = UnownWords.CHAMBER_MAPS.AERODACTYL + +-- :281-283, the badge gate ahead of the special. +local ctx, events = ctxFor(AERO, {}, false) +local refused = FieldMoves.fromMenu("FLASH", ctx) +eq(refused.ok, false, "no ZEPHYRBADGE: FLASH is refused in the chamber") +eq(refused.badge, "ZEPHYR", "and it is the badge that refused it") +check(not UnownWords.wallOpened(events, "AERODACTYL"), + "a badgeless press must not reach SpecialAerodactylChamber") + +-- :284-287, the special's carry is a second way into `.useflash`. +ctx, events = ctxFor(AERO, { ZEPHYR = true }, false) +local used = FieldMoves.fromMenu("FLASH", ctx) +eq(used.ok, true, "with the badge FLASH runs in a chamber that is not dark") +eq(used.action, "flash", "and it queues the flash") +check(UnownWords.wallOpened(events, "AERODACTYL"), + "and the wall-opened flag is set") + +-- :288-290, any other lit map still refuses. +ctx, events = ctxFor("RUINS_OF_ALPH_OUTSIDE", { ZEPHYR = true }, false) +eq(FieldMoves.fromMenu("FLASH", ctx).ok, false, "a lit route still refuses") +check(not UnownWords.wallOpened(events, "AERODACTYL"), + "and opens nothing") + +-- A dark cave is the ordinary arm, with no chamber anywhere near it. +ctx = ctxFor("SLOWPOKE_WELL_B1F", { ZEPHYR = true }, true) +eq(FieldMoves.fromMenu("FLASH", ctx).ok, true, "a dark cave is still lit") + +-- A cache with no chamber hook at all (Gold) must behave exactly as before. +eq(FieldMoves.fromMenu("FLASH", { + save = { player = { badges = { ZEPHYR = true } } }, dark = false }).ok, false, + "with no openAerodactylWall on the ctx, a lit map refuses") + +-- ../pokecrystal/engine/events/unown_walls.asm:81, the escape rope's own arm. +local ropeEvents = Events.new() +eq(UnownWords.kabutoChamber(ropeEvents, "RUINS_OF_ALPH_OUTSIDE"), false, + "the rope opens nothing outside a chamber") +check(not UnownWords.wallOpened(ropeEvents, "KABUTO"), "flag still clear") +eq(UnownWords.kabutoChamber(ropeEvents, UnownWords.CHAMBER_MAPS.KABUTO), true, + "and opens the Kabuto wall inside it") +check(UnownWords.wallOpened(ropeEvents, "KABUTO"), "flag set") + +S.finish() diff --git a/tests/gen2_crystal_anim_test.lua b/tests/gen2_crystal_anim_test.lua new file mode 100644 index 00000000..0aca583c --- /dev/null +++ b/tests/gen2_crystal_anim_test.lua @@ -0,0 +1,139 @@ +-- Crystal's animated front pics: the bitmask decode and the frame sequencer. +-- luajit tests/gen2_crystal_anim_test.lua +-- +-- ROM-free. The fixtures are the shapes the extractor writes into +-- data/generated/pokemon.lua, with the numbers taken from BULBASAUR's own +-- bitmask/frames data so a failure names the bytes it disagrees with. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal anim") +local check, eq = S.check, S.eq + +local MonAnim = require("src.render.MonAnim") + +-- ---- bitmask decode ------------------------------------------------------- + +-- ../pokecrystal/gfx/pokemon/bulbasaur/bitmask.asm bitmask 0 and frame 1: +-- %01100000 %10101101 %00000001 %00000000, then $19..$20. The tool emits the +-- byte low bit first, so the eight set bits are tile positions 5, 6, 8, 10, +-- 11, 13, 15 and 16 in the pic's own column-major order. +local BULBASAUR = { + tiles = 5, + bitmasks = { + { 0x60, 0xad, 0x01, 0x00 }, + { 0x20, 0xad, 0x01, 0x00 }, + }, + frames = { + { bitmask = 1, tiles = { 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 } }, + { bitmask = 2, tiles = { 0x21, 0x1b, 0x22, 0x1d, 0x1e, 0x23, 0x24 } }, + }, + play = { { 1, 10 }, { 2, 10 }, { 0, 5 } }, + idle = { { 2, 5 }, { 0, 5 } }, +} + +local base = MonAnim.tileMap(BULBASAUR, 0) +eq(base and #base, 25, "the base picture is 5x5 tiles") +eq(base and base[1], 0, "position 0 is tile 0") +eq(base and base[25], 24, "position 24 is tile 24") + +local first = MonAnim.tileMap(BULBASAUR, 1) +eq(first and #first, 25, "frame 1 is still 5x5 tiles") +local REPLACED = { [6] = 0x19, [7] = 0x1a, [9] = 0x1b, [11] = 0x1c, + [12] = 0x1d, [14] = 0x1e, [16] = 0x1f, [17] = 0x20 } +local wrong = nil +for slot = 1, 25 do + local want = REPLACED[slot] or (slot - 1) + if first[slot] ~= want then wrong = wrong or slot end +end +eq(wrong, nil, "frame 1 replaces exactly the eight bitmask-0 positions") + +-- Bitmask 1 drops bit 6 and keeps bit 5, so frame 2 leaves position 6 alone. +local second = MonAnim.tileMap(BULBASAUR, 2) +eq(second and second[6], 0x21, "frame 2 replaces position 5") +eq(second and second[7], 6, "and leaves position 6 at its base tile") +eq(second and #BULBASAUR.frames[2].tiles, 7, + "seven set bits, seven replacement tiles") + +eq(MonAnim.tileMap({ frames = {}, bitmasks = {} }, 0), nil, + "no pic size means no tile map") +eq(MonAnim.tileMap(BULBASAUR, 9), nil, "and a frame that does not exist is nil") + +-- ---- durations ------------------------------------------------------------ + +-- PokeAnim_GetDuration: a * (1 + [wPokeAnimSpeed] / 16). +eq(MonAnim.duration(10, 0), 10, "speed 0 leaves a duration alone") +eq(MonAnim.duration(10, 4), 12, "ANIM_MON_SLOW's speed 4 stretches 10 to 12") +eq(MonAnim.duration(5, 4), 6, "and 5 to 6") +eq(MonAnim.duration(200, 4), 250, "the arithmetic stays inside a byte") + +-- ---- the sequencer -------------------------------------------------------- + +-- setrepeat 2 / frame 1, 3 / frame 2, 2 / dorepeat 1 -- the shape most of +-- Crystal's entrance animations have (../pokecrystal/gfx/pokemon/abra/anim.asm). +local LOOPED = { + tiles = 5, bitmasks = BULBASAUR.bitmasks, frames = BULBASAUR.frames, + play = { { MonAnim.SETREPEAT, 2 }, { 1, 3 }, { 2, 2 }, { MonAnim.DOREPEAT, 1 } }, + idle = { { 2, 2 } }, +} + +local function timeline(data, scene, ticks) + local anim = MonAnim.new(data, scene) + local out = {} + for _ = 1, ticks do + anim:update() + out[#out + 1] = anim:currentFrame() + end + return out, anim +end + +local frames, anim = timeline(LOOPED, "battle", 14) +eq(table.concat(frames, ","), "0,1,1,1,2,2,1,1,1,2,2,2,0,0", + "the looped script plays twice and lands back on the base picture") +check(anim:finished(), "and the scene is over after PokeAnim_Finish") + +-- Setup costs a frame of its own before the script starts, so the first +-- animation frame is on tick 2, not tick 1. +eq(frames[1], 0, "PokeAnim_Setup shows the base picture for its own frame") + +-- ANIM_MON_SLOW's speed 4 stretches every duration: 8 becomes 10. +local ONESHOT = { + tiles = 5, bitmasks = BULBASAUR.bitmasks, frames = BULBASAUR.frames, + play = { { 1, 8 } }, idle = { { 2, 2 } }, +} +eq(table.concat(timeline(ONESHOT, "battle", 11), ","), + "0,1,1,1,1,1,1,1,1,0,0", "speed 0 holds frame 1 for eight frames") +eq(table.concat(timeline(ONESHOT, "battleSlow", 13), ","), + "0,1,1,1,1,1,1,1,1,1,1,0,0", "speed 4 holds it for ten") + +-- ANIM_MON_MENU: the entrance animation, an 18-frame pause, then the idle. +local menu = MonAnim.new(ONESHOT, "menu") +local seen = {} +for tick = 1, 31 do + menu:update() + seen[tick] = menu:currentFrame() +end +eq(seen[10], 0, "the entrance script ends on the base picture") +local resume +for tick = 11, 31 do + if seen[tick] ~= 0 then resume = tick break end +end +eq(resume, 11 + MonAnim.SCENE_WAIT + 1, + "eighteen wait frames, then PokeAnim_Idle's own frame, then the idle script") +eq(resume and seen[resume], 2, "and the idle script's first frame comes up") +check(not menu:finished(), "the menu scene is longer than the battle one") + +local ran = 0 +for tick = 1, 60 do + menu:update() + if menu:finished() then ran = tick break end +end +check(ran > 0, "but it does end") + +-- ---- gating --------------------------------------------------------------- + +eq(MonAnim.new(nil, "battle"), nil, "no data means no sequencer") +eq(MonAnim.new({ tiles = 5, play = {} }, "battle"), nil, + "and an empty script means no sequencer, which is every Gold species") +eq(MonAnim.new(LOOPED, "nosuchscene"), nil, "an unknown scene is nil too") + +S.finish() diff --git a/tests/gen2_crystal_caught_data_test.lua b/tests/gen2_crystal_caught_data_test.lua new file mode 100644 index 00000000..064dc710 --- /dev/null +++ b/tests/gen2_crystal_caught_data_test.lua @@ -0,0 +1,314 @@ +-- Crystal MON_CAUGHTDATA: the two packed bytes, who stamps them, and the two +-- readers that key off them (the level-up happiness pick and the fields that +-- have to survive an evolution and a Day-Care round trip). +-- luajit tests/gen2_crystal_caught_data_test.lua +-- +-- Gold has no such word in its party struct, so every assertion below comes in +-- a Crystal half and a Gold half: Gold must come out with the three fields +-- still nil. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal caught data") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") +local Catching = require("src.battle.gen2.Catching") +local Evolution = require("src.core.gen2.Evolution") +local Breeding = require("src.core.gen2.Breeding") +local Happiness = require("src.core.gen2.Happiness") +local Save = require("src.core.gen2.Save") + +local priorVersion = GameVersion.get() + +-- ---- fixtures ------------------------------------------------------------- + +-- GROWTH_MEDIUM_FAST is plain n^3 (data/growth_rates.asm). +local GROWTH = { + GROWTH_MEDIUM_FAST = { numerator = 1, denominator = 1, squared = 0, + linear = 0, constant = 0 }, +} + +local function species(id, index, evolutions) + return { + id = id, index = index, name = id, + baseStats = { hp = 45, attack = 49, defense = 49, speed = 45, + specialAttack = 65, specialDefense = 65 }, + types = { "NORMAL", "NORMAL" }, + growthRate = "GROWTH_MEDIUM_FAST", + genderRatio = 127, + eggGroups = { "EGG_GROUND", "EGG_GROUND" }, + eggSteps = 20, + evolutions = evolutions or {}, + levelMoves = { { level = 1, move = "TACKLE" } }, + } +end + +local DATA = { + moves = { TACKLE = { id = "TACKLE", pp = 35 } }, + pokemon = { + growthRates = GROWTH, + CATERPIE = species("CATERPIE", 10, + { { method = "EVOLVE_LEVEL", level = 7, into = "METAPOD" } }), + METAPOD = species("METAPOD", 11), + }, + -- data/generated/landmarks.lua's shape, two rows deep enough for the + -- National Park override to resolve by name. + gen2Landmarks = { + landmarks = { + LANDMARK_NATIONAL_PARK = { id = "LANDMARK_NATIONAL_PARK", index = 19 }, + LANDMARK_NEW_BARK_TOWN = { id = "LANDMARK_NEW_BARK_TOWN", index = 1 }, + }, + }, +} + +local function newMon(level, opts) + return Mon.new(DATA, "CATERPIE", level or 5, opts) +end + +-- ---- the constants -------------------------------------------------------- + +eq(Mon.CAUGHT_TIME_MASK, 0xc0, "CAUGHT_TIME_MASK") +eq(Mon.CAUGHT_LEVEL_MASK, 0x3f, "CAUGHT_LEVEL_MASK") +eq(Mon.CAUGHT_GENDER_MASK, 0x80, "CAUGHT_GENDER_MASK") +eq(Mon.CAUGHT_LOCATION_MASK, 0x7f, "CAUGHT_LOCATION_MASK") +eq(Mon.CAUGHT_EGG_LEVEL, 1, "CAUGHT_EGG_LEVEL") +eq(Mon.LANDMARK_EVENT, 0x7f, "LANDMARK_EVENT") +eq(Mon.LANDMARK_GIFT, 0x7e, "LANDMARK_GIFT") + +-- ---- the two bytes -------------------------------------------------------- + +-- `ld a, [wTimeOfDay] / inc a / rrca / rrca`: MORN 0 stores as 1, and 0 is +-- left free to mean unknown. +eq(Mon.caughtTimeOf(0), 1, "MORN stamps 1") +eq(Mon.caughtTimeOf(1), 2, "DAY stamps 2") +eq(Mon.caughtTimeOf(2), 3, "NITE stamps 3") +eq(Mon.caughtTimeOf("MORN"), 1, "the name reads the same as the id") +eq(Mon.caughtTimeOf(nil), 0, "and nothing at all is unknown") +eq(Mon.caughtTimeOf("BRUNCH"), 0, "as is a time of day that is not one") + +local stamped = Mon.setCaughtData({ level = 12 }, + { timeOfDay = 2, landmark = 1, playerGender = "male" }) +eq(stamped.caughtTime, 3, "NITE") +eq(stamped.caughtLevel, 12, "the level the catch happened at") +eq(stamped.caughtLocation, 1, "GetWorldMapLocation's landmark") +eq(stamped.caughtByGender, "boy", "and wPlayerGender bit 0 clear") + +local byte0, byte1 = Mon.packCaughtData(stamped) +eq(byte0, 3 * 0x40 + 12, "byte 0 is ((tod + 1) << 6) | level") +eq(byte1, 1, "byte 1 is (female << 7) | landmark") + +local female = Mon.setCaughtData({}, + { timeOfDay = 0, level = 7, landmark = 19, playerGender = "female" }) +eq(female.caughtByGender, "girl", "PLAYERGENDER_FEMALE_F reads as girl") +byte0, byte1 = Mon.packCaughtData(female) +eq(byte0, 0x40 + 7, "MORN and level 7") +eq(byte1, 0x80 + 19, "the gender bit rides byte 1, not byte 0") + +-- CAUGHT_LEVEL_MASK is six bits, so the packed level of a high-level catch +-- wraps exactly as `or b` leaves it on the cart. +byte0 = Mon.packCaughtData(Mon.setCaughtData({}, + { timeOfDay = 1, level = 70, landmark = 1 })) +eq(byte0 % 0x40, 70 % 0x40, "level 70 packs into six bits") + +local round = Mon.unpackCaughtData(Mon.packCaughtData(female)) +eq(round.caughtTime, 1, "unpack recovers the time") +eq(round.caughtLevel, 7, "the level") +eq(round.caughtLocation, 19, "the location") +eq(round.caughtByGender, "girl", "and the gender bit") + +local blank = Mon.unpackCaughtData(0, 0) +eq(blank.caughtTime, 0, "an all-zero word is an unknown time") +eq(blank.caughtLevel, 0, "an unknown level") +eq(blank.caughtLocation, 0, "and an unknown location") + +-- SetGiftMonCaughtData folds CAUGHT_BY_* through `rrc b`, which is why +-- CAUGHT_BY_BOY lands on LANDMARK_EVENT instead of on a gender bit. +local gift = Mon.setGiftCaughtData({}, "girl") +eq(gift.caughtTime, 0, "a gift mon has no caught time") +eq(gift.caughtLevel, 0, "and no caught level") +eq(gift.caughtLocation, Mon.LANDMARK_GIFT, "LANDMARK_GIFT") +eq(gift.caughtByGender, "girl", "with the gender bit set") +eq(Mon.setGiftCaughtData({}, "boy").caughtLocation, Mon.LANDMARK_EVENT, + "CAUGHT_BY_BOY rotates into bit 0 and makes it LANDMARK_EVENT") +eq(Mon.setGiftCaughtData({}, "unknown").caughtLocation, Mon.LANDMARK_GIFT, + "CAUGHT_BY_UNKNOWN leaves LANDMARK_GIFT alone") + +-- ---- who stamps ----------------------------------------------------------- + +GameVersion.set("gold") +check(not Mon.hasCaughtData(), "Gold's struct has no MON_CAUGHTDATA") +local goldMon = newMon(5) +eq(goldMon.caughtLevel, 5, "Gold still gets the caught level it always had") +eq(goldMon.caughtTime, nil, "but no caught time") +eq(goldMon.caughtLocation, nil, "no caught location") +eq(goldMon.caughtByGender, nil, "and no OT gender") +Catching.stampCaughtData(goldMon, + { data = DATA, timeOfDay = 1, map = { id = "ROUTE_29", landmark = 1 } }) +eq(goldMon.caughtTime, nil, "and SetCaughtData is a no-op on Gold") + +GameVersion.set("crystal") +check(Mon.hasCaughtData(), "the crystal lineage carries it") + +local caught = newMon(4) +Catching.stampCaughtData(caught, { + data = DATA, timeOfDay = 1, playerGender = "female", + map = { id = "ROUTE_29", landmark = 1 }, +}) +eq(caught.caughtTime, 2, "a Crystal catch stamps the time") +eq(caught.caughtLevel, 4, "the level") +eq(caught.caughtLocation, 1, "the map's landmark") +eq(caught.caughtByGender, "girl", "and the player's gender") + +-- The Pokecenter 2F substitution: wBackupMapGroup / wBackupMapNumber, so the +-- cable-club floor never lands on LANDMARK_SPECIAL. +eq(Catching.caughtLandmark({ + map = { id = "POKECENTER_2F", landmark = 0 }, + backupMap = { id = "VIOLET_CITY", landmark = 6 }, +}), 6, "POKECENTER_2F reads the map it was entered from") +eq(Catching.caughtLandmark({ map = { id = "POKECENTER_2F", landmark = 0 } }), 0, + "with no backup map recorded it stays unknown") +eq(Catching.caughtLandmark({ map = { id = "ROUTE_29", landmark = 1 } }), 1, + "every other map is a plain GetWorldMapLocation") +eq(Catching.caughtLandmark({}), 0, "and no map at all is unknown") + +-- BugContest_SetCaughtContestMon overwrites the location afterwards, keeping +-- the gender bit. +eq(Catching.caughtLandmark({ data = DATA, bugContest = true, + map = { id = "NATIONAL_PARK_BUG_CONTEST", landmark = 0 } }), 19, + "the Bug Contest catch is LANDMARK_NATIONAL_PARK") +eq(Catching.caughtLandmark({ bugContest = true }), + Catching.LANDMARK_NATIONAL_PARK, + "and the same index without a landmarks table to look it up in") + +local contest = Catching.stampCaughtData(newMon(6), { + data = DATA, bugContest = true, timeOfDay = 1, playerGender = "female", + map = { id = "NATIONAL_PARK_BUG_CONTEST", landmark = 0 }, +}) +eq(contest.caughtLocation, 19, "the contest mon is stamped National Park") +eq(contest.caughtByGender, "girl", "and keeps CAUGHT_GENDER_MASK") + +-- ---- survival across an evolution ----------------------------------------- + +check(Evolution.MON_FIELDS.caughtTime, "MON_FIELDS names caughtTime") +check(Evolution.MON_FIELDS.caughtLocation, "and caughtLocation") +check(Evolution.MON_FIELDS.caughtByGender, "and caughtByGender") + +local evolved = Evolution.apply(DATA, caught, + { method = "EVOLVE_LEVEL", level = 7, into = "METAPOD" }) +eq(evolved.species, "METAPOD", "it evolved") +eq(evolved.caughtTime, 2, "the caught time survived") +eq(evolved.caughtLevel, 4, "the caught level survived") +eq(evolved.caughtLocation, 1, "the caught location survived") +eq(evolved.caughtByGender, "girl", "and so did the OT gender") + +-- ---- survival across the Day-Care, and the egg marker --------------------- + +local function newSave(party) + local save = { version = "crystal", party = party or {}, + player = { name = "CHRIS", id = 1, gender = "female", money = 5000 }, + pokedex = { seen = {}, caught = {} } } + return save +end + +local deposited = newMon(5) +Catching.stampCaughtData(deposited, { + data = DATA, timeOfDay = 2, playerGender = "female", + map = { id = "ROUTE_34", landmark = 3 }, +}) +local save = newSave({}) +local dc = Breeding.dayCare(save) +dc.man.mon = deposited +dc.man.level = 5 +local ok, withdrawn = Breeding.withdraw(DATA, save, "man") +check(ok ~= false, "the mon came back out of the Day-Care") +withdrawn = save.party[1] +eq(withdrawn.caughtTime, 3, "RetrieveBreedmon carried the caught time") +eq(withdrawn.caughtLevel, 5, "the caught level") +eq(withdrawn.caughtLocation, 3, "the caught location") +eq(withdrawn.caughtByGender, "girl", "and the OT gender") + +local egg = newMon(5) +egg.isEgg = true +egg.eggSteps = 0 +egg.level = 5 +save = newSave({ egg }) +local hatched = Breeding.hatch(DATA, save, 1, nil, + { timeOfDay = 0, landmark = 3 }) +check(hatched ~= nil, "the egg hatched") +eq(hatched.caughtLevel, Mon.CAUGHT_EGG_LEVEL, + "SetEggMonCaughtData stamps CAUGHT_EGG_LEVEL, not the hatch level") +eq(hatched.caughtTime, 1, "with the hatch site's time of day") +eq(hatched.caughtLocation, 3, "and its landmark") +eq(hatched.caughtByGender, "girl", "off save.player.gender") +eq(Mon.packCaughtData(hatched) % 0x40, Mon.CAUGHT_EGG_LEVEL, + "so byte 0's level field reads 1") + +GameVersion.set("gold") +local goldEgg = newMon(5) +goldEgg.isEgg = true +goldEgg.eggSteps = 0 +local goldSave = newSave({ goldEgg }) +goldSave.version = "gold" +goldSave.player.gender = nil +local goldHatch = Breeding.hatch(DATA, goldSave, 1) +eq(goldHatch.caughtLevel, 5, "a Gold hatchling keeps the egg's own level") +eq(goldHatch.caughtTime, nil, "and grows no caught-data keys") +eq(goldHatch.caughtLocation, nil, "none of them") +eq(goldHatch.caughtByGender, nil, "at all") +GameVersion.set("crystal") + +-- ---- HAPPINESS_GAINLEVELATHOME -------------------------------------------- + +eq(Happiness.EVENT.GAINLEVELATHOME, 19, "the enum's 19th row") +eq(Happiness.NUM_EVENTS, 19, "and Crystal's table is one longer than Gold's") +eq(#Happiness.CHANGES, 19, "every row is present") +eq(Happiness.delta("GAINLEVELATHOME", 0), 10, "+10 under 100") +eq(Happiness.delta("GAINLEVELATHOME", 100), 6, "+6 under 200") +eq(Happiness.delta("GAINLEVELATHOME", 200), 4, "+4 above it") +check(Happiness.delta("GAINLEVELATHOME", 0) > Happiness.delta("GAINLEVEL", 0), + "and it is worth more than a plain level") + +local home = { happiness = 70, caughtLocation = 3 } +eq(Happiness.levelUpEvent(home, 3), "GAINLEVELATHOME", + "levelling where it was caught") +eq(Happiness.levelUpEvent(home, 4), "GAINLEVEL", "and anywhere else") +eq(Happiness.levelUpEvent({ caughtLocation = 3 }, nil), "GAINLEVEL", + "an unknown current landmark cannot match") +eq(Happiness.levelUpEvent({}, 0), "GAINLEVEL", + "and a mon with no caught data at all never reads ATHOME") +eq(Happiness.levelUpEvent({ caughtLocation = 0 }, 0), "GAINLEVELATHOME", + "though a Crystal mon stamped LANDMARK_SPECIAL does, as the cart's cp does") +-- CAUGHT_LOCATION_MASK: the comparison is against the low seven bits, so the +-- gender bit riding the same byte cannot break the match. +eq(Happiness.levelUpEvent({ caughtLocation = 0x80 + 3 }, 3), "GAINLEVELATHOME", + "the gender bit is masked out of the comparison") + +eq(Happiness.levelUp(home, 3), 80, "levelUp applies the +10") +eq(Happiness.levelUp(home, 9), 85, "and the +5 away from home") + +-- ---- the save layer ------------------------------------------------------- + +eq(Save.defaultPlayerName("gold"), "GOLD", "PlayerNameArray's first row") +eq(Save.defaultPlayerName("silver"), "SILVER", "on Silver") +eq(Save.defaultPlayerName("crystal"), "CHRIS", "and MalePlayerNameArray's") + +local normalized = Save.normalize({ version = "crystal", player = {} }) +eq(normalized.player.gender, "male", "normalize defaults wPlayerGender to 0") +eq(Save.normalize({ version = "crystal", + player = { gender = "female" } }).player.gender, "female", + "and leaves a recorded gender alone") + +-- A Gold save that never catches anything grows no new keys. +GameVersion.set("gold") +local goldParty = { newMon(5) } +local goldFile = Save.normalize({ version = "gold", party = goldParty }) +eq(goldFile.party[1].caughtTime, nil, "no caughtTime on a Gold record") +eq(goldFile.party[1].caughtLocation, nil, "no caughtLocation") +eq(goldFile.party[1].caughtByGender, nil, "no caughtByGender") + +GameVersion.set(priorVersion) + +S.finish() diff --git a/tests/gen2_crystal_extras_test.lua b/tests/gen2_crystal_extras_test.lua new file mode 100644 index 00000000..23fe2ae9 --- /dev/null +++ b/tests/gen2_crystal_extras_test.lua @@ -0,0 +1,559 @@ +-- ../pokecrystal/engine/events/move_tutor.asm:1, engine/events/buena.asm:1 +-- and :64, engine/events/poke_seer.asm:18, mobile/mobile_12_2.asm:191. +-- ROM-free: +-- luajit tests/gen2_crystal_extras_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +-- The same love stub tests/gen2_menus_test.lua installs; nothing here draws. +love = love or {} +love.graphics = love.graphics or { + getColor = function() return 1, 1, 1, 1 end, + setColor = function() end, + rectangle = function() end, + print = function() end, + printf = function() end, + draw = function() end, + newQuad = function() return {} end, + newImage = function() return nil end, + getShader = function() return nil end, + setShader = function() end, + newShader = function() error("no shaders in this harness") end, + getDimensions = function() return 160, 144 end, + push = function() end, pop = function() end, + translate = function() end, scale = function() end, + circle = function() end, clear = function() end, +} +love.math = love.math or { random = function(a, b) return b and a or 1 end } +love.image = love.image or {} +love.filesystem = love.filesystem or { + load = function() return nil end, + getInfo = function() return nil end, + read = function() return nil end, +} +love.timer = love.timer or { getTime = function() return 0 end } + +local S = require("tests.harness").suite("gen2 crystal extras") +local check, eq = S.check, S.eq + +require("src.core.Logger").warn = function() end + +local Events = require("src.world.gen2.Events") +local Mon = require("src.battle.gen2.Mon") +local MoveTutorScreen = require("src.ui.gen2.MoveTutor") +local Save = require("src.core.gen2.Save") +local Specials = require("src.script.gen2.Specials") +local Vm = require("src.script.gen2.Vm") + +local H = Specials.HANDLERS + +-- --------------------------------------------------------------- fixtures + +-- The cache tables the handlers read, plus the landmark registry +-- GetLandmarkName walks (../pokecrystal/engine/overworld/landmarks.asm:16). +local DATA = { + pokemon = { + tutorMoves = { "FLAMETHROWER", "THUNDERBOLT", "ICE_BEAM" }, + TYPHLOSION = { index = 157, name = "TYPHLOSION", + tmhm = { "CUT", "STRENGTH" }, tutorMoves = { "FLAMETHROWER" } }, + GEODUDE = { index = 74, name = "GEODUDE", + tmhm = { "STRENGTH" }, tutorMoves = { "FLAMETHROWER" } }, + LAPRAS = { index = 131, name = "LAPRAS", tmhm = { "SURF" } }, + CYNDAQUIL = { index = 155, name = "CYNDAQUIL" }, + TOTODILE = { index = 158, name = "TOTODILE" }, + CHIKORITA = { index = 152, name = "CHIKORITA" }, + PIKACHU = { index = 25, name = "PIKACHU" }, + RATTATA = { index = 19, name = "RATTATA" }, + HOOTHOOT = { index = 163, name = "HOOTHOOT" }, + SPINARAK = { index = 165, name = "SPINARAK" }, + DROWZEE = { index = 96, name = "DROWZEE" }, + }, + items = { + ULTRA_BALL = { index = 2, name = "ULTRA BALL" }, + FULL_RESTORE = { index = 16, name = "FULL RESTORE" }, + NUGGET = { index = 92, name = "NUGGET" }, + RARE_CANDY = { index = 50, name = "RARE CANDY" }, + PROTEIN = { index = 33, name = "PROTEIN" }, + IRON = { index = 34, name = "IRON" }, + CARBOS = { index = 35, name = "CARBOS" }, + CALCIUM = { index = 37, name = "CALCIUM" }, + HP_UP = { index = 32, name = "HP UP" }, + POTION = { index = 17, name = "POTION" }, + ANTIDOTE = { index = 18, name = "ANTIDOTE" }, + PARLYZ_HEAL = { index = 21, name = "PARLYZ HEAL" }, + FRESH_WATER = { index = 39, name = "FRESH WATER" }, + SODA_POP = { index = 40, name = "SODA POP" }, + LEMONADE = { index = 41, name = "LEMONADE" }, + POKE_BALL = { index = 5, name = "POKé BALL" }, + GREAT_BALL = { index = 1, name = "GREAT BALL" }, + X_ATTACK = { index = 68, name = "X ATTACK" }, + X_DEFEND = { index = 69, name = "X DEFEND" }, + X_SPEED = { index = 67, name = "X SPEED" }, + }, + moves = { + FLAMETHROWER = { name = "FLAMETHROWER" }, + THUNDERBOLT = { name = "THUNDERBOLT" }, + ICE_BEAM = { name = "ICE BEAM" }, + TACKLE = { name = "TACKLE" }, + GROWL = { name = "GROWL" }, + MUD_SLAP = { name = "MUD-SLAP" }, + }, + gen2Landmarks = { + order = {}, + landmarks = { + NEW_BARK_TOWN = { index = 1, name = "NEW BARK\nTOWN" }, + ROUTE_29 = { index = 2, name = "ROUTE 29" }, + }, + }, +} + +local function newSave() + local save = { + version = "crystal", + player = { name = "KRIS", id = 0x1234, money = 0 }, + party = {}, + inventory = {}, + bagOrder = {}, + } + Save.crystalState(save) + return save +end + +-- World:specialHooks, stubbed; every screen answers through its own onDone. +local function newHooks(save, opts) + opts = opts or {} + local vars = opts.vars or {} + local log = { pushed = {}, sfx = {} } + local hooks = { + log = log, + vars = vars, + save = function() return save end, + data = function() return DATA end, + party = function() return save.party end, + itemIndex = function(id) + local def = DATA.items[id] + return def and def.index + end, + hasItem = function(index) return opts.held and opts.held[index] == true end, + playSfxNamed = function(name) log.sfx[#log.sfx + 1] = name end, + selectPartyMon = function(prompt, done) + log.selectPrompt = prompt + done(opts.pickIndex, opts.pickIndex and save.party[opts.pickIndex]) + end, + pushScreen = function(id, screenOpts) + log.pushed[#log.pushed + 1] = { id = id, opts = screenOpts } + if opts.noScreens then return false end + local answer = opts.answers and opts.answers[#log.pushed] + if screenOpts.onDone then screenOpts.onDone(answer) end + return true + end, + } + return hooks +end + +-- The var pair is Vm.readVarFn / Vm.writeVarFn, not a `specials` hook: +-- engine/overworld/variables.asm's rows belong to `readvar` / `writevar`. +local function newVm(hooks, scriptVar) + local vars = hooks.vars + local vm = Vm.new({}, {}, Events.new(), { + specials = hooks, + readVar = function(id) return vars[id] or 0 end, + writeVar = function(id, value) vars[id] = value end, + }) + vm.showTextFn = function() end + vm.scriptVar = scriptVar or 0 + return vm +end + +-- Run one handler out, collecting its pages and feeding its YES/NO answers. +local function run(vm, handler, answers) + answers = answers or {} + local pages, asked = {}, 0 + local co = coroutine.create(function() handler(vm) end) + vm.co = co + local send + while true do + local ok, req = coroutine.resume(co, send) + if not ok then error(req, 0) end + if coroutine.status(co) == "dead" then break end + send = nil + if type(req) == "table" and req.kind == "text" then + pages[#pages + 1] = req.text + elseif type(req) == "table" and req.kind == "yesorno" then + asked = asked + 1 + send = answers[asked] + else + pages.parked = req + break + end + end + return pages +end + +-- ============================================================ the move tutor + +-- .GetMoveTutorMove (engine/events/move_tutor.asm:36-52); anything that is +-- not MOVETUTOR_FLAMETHROWER or _THUNDERBOLT falls through to MT03. +do + local function tutorMoveFor(value, answer) + local save = newSave() + local hooks = newHooks(save, { answers = { answer } }) + local vm = newVm(hooks, value) + run(vm, H.MoveTutor) + local pushed = hooks.log.pushed[1] + return pushed and pushed.opts.move, vm.scriptVar + end + eq(select(1, tutorMoveFor(1, true)), "FLAMETHROWER", "MOVETUTOR_FLAMETHROWER is MT01") + eq(select(1, tutorMoveFor(2, true)), "THUNDERBOLT", "MOVETUTOR_THUNDERBOLT is MT02") + eq(select(1, tutorMoveFor(3, true)), "ICE_BEAM", "MOVETUTOR_ICE_BEAM is MT03") + eq(select(1, tutorMoveFor(0, true)), "ICE_BEAM", + "and anything else falls through to MT03, as the `cp` ladder does") + + local _, learned = tutorMoveFor(1, true) + eq(learned, 0, "a taught move leaves wScriptVar FALSE, which is .TeachMove") + local _, cancelled = tutorMoveFor(1, false) + eq(cancelled, 255, "and a cancel leaves -1, which is .Incompatible") +end + +-- engine/events/move_tutor.asm:29 .cancel, ahead of the script's +-- takecoins 4000 (maps/GoldenrodCity.asm:124). +do + local save = newSave() + local hooks = newHooks(save, { noScreens = true }) + local vm = newVm(hooks, 2) + run(vm, H.MoveTutor) + eq(vm.scriptVar, 255, "no screen is the -1 cancel, not a free lesson") +end + +-- `add_mt` gives the three tutor moves TMHM flags 58-60 +-- (constants/item_constants.asm:295-307), so CanLearnTMHMMove sees them. +do + local view = MoveTutorScreen.speciesView(DATA.pokemon) + check(MoveTutorScreen.canLearn(view.TYPHLOSION, "FLAMETHROWER"), + "TYPHLOSION can be taught FLAMETHROWER") + check(MoveTutorScreen.canLearn(view.TYPHLOSION, "CUT"), + "and its ordinary TM list still answers") + check(not MoveTutorScreen.canLearn(view.LAPRAS, "FLAMETHROWER"), + "LAPRAS cannot") + local merged = view.TYPHLOSION.tmhm + eq(#merged, 3, "the view's tmhm list carries the tutor row too") + eq(merged[3], "FLAMETHROWER", "appended after the TM/HM rows") + check(view.TYPHLOSION == view.TYPHLOSION, "and the view is memoised") + eq(view.MISSINGNO, nil, "a species the cache does not carry stays nil") + eq(#DATA.pokemon.TYPHLOSION.tmhm, 2, "the cache's own record is not touched") +end + +-- ================================================================== Buena + +-- engine/events/buena_menu.asm:1-9: carry (NO or B) is 0, YES is 1. +do + local save = newSave() + local vm = newVm(newHooks(save)) + run(vm, H.AskRememberPassword, { true }) + eq(vm.scriptVar, 1, "YES is 1, which the script reads as `iffalse` not taken") + local vm2 = newVm(newHooks(save)) + run(vm2, H.AskRememberPassword, { false }) + eq(vm2.scriptVar, 0, "and NO is 0, .ForgotPassword") +end + +-- engine/events/buena.asm:19-23: only wBuenasPassword's low nybble is right. +do + local save = newSave() + -- BuenasPassword4's two rejection rolls, pinned + -- (engine/pokegear/radio.asm:1470-1487). + local rolls = { 1, 2 } + local taken = 0 + local realRandom = Specials.random + Specials.random = function() taken = taken + 1 return rolls[taken] end + + local hooks = newHooks(save, { answers = { 1 } }) + local vm = newVm(hooks) + run(vm, H.BuenasPassword) + Specials.random = realRandom + + local pushed = hooks.log.pushed[1] + eq(pushed.id, "Gen2BuenaPassword", "the show opens its own menu") + eq(pushed.opts.mode, "password", "in password mode") + eq(pushed.opts.width, 10, "the box is as wide as the category's points byte") + eq(table.concat(pushed.opts.words, ","), "CYNDAQUIL,TOTODILE,CHIKORITA", + ".PlacePasswordChoices resolves BUENA_MON rows through GetPokemonName") + eq(vm.scriptVar, 1, "picking the low nybble's row is the right answer") + eq(save.crystal.buenaPassword.word, 0x01, + "and the roll is packed group-high, word-low into wBuenasPassword") + eq(hooks.vars[0x19], 0x01, "VAR_BUENASPASSWORD sees the same byte") + + -- DAILYFLAGS2_BUENAS_PASSWORD_F holds the roll for the day + -- (engine/pokegear/radio.asm:1467). + local hooks2 = newHooks(save, { answers = { 0 } }) + local vm2 = newVm(hooks2) + run(vm2, H.BuenasPassword) + eq(vm2.scriptVar, 0, "row 0 is a wrong guess") + eq(save.crystal.buenaPassword.word, 0x01, "and the day's password is unchanged") + eq(table.concat(hooks2.log.pushed[1].opts.words, ","), + "CYNDAQUIL,TOTODILE,CHIKORITA", "so the menu offers the same three words") +end + +-- GetBuenasPassword's four BUENA_* arms (engine/pokegear/radio.asm:1534), +-- and the points byte as the menu width (engine/events/buena.asm:9-12). +do + local save = newSave() + local realRandom = Specials.random + local function pin(group, word) + local rolls, taken = { group + 1, word + 1 }, 0 + Specials.random = function() taken = taken + 1 return rolls[taken] end + save.crystal.buenaPassword.word = nil + save.crystal.buenaPassword.day = nil + local hooks = newHooks(save, { answers = { word } }) + local vm = newVm(hooks) + run(vm, H.BuenasPassword) + return hooks.log.pushed[1].opts, vm.scriptVar + end + local balls = pin(3, 2) + eq(table.concat(balls.words, ","), "POKé BALL,GREAT BALL,ULTRA BALL", + "BUENA_ITEM rows resolve through GetItemName") + eq(balls.width, 12, "and .Balls is worth 12 points") + local towns = pin(6, 0) + eq(table.concat(towns.words, ","), "NEW BARK TOWN,CHERRYGROVE CITY,AZALEA TOWN", + "BUENA_STRING rows are the literals themselves") + eq(towns.width, 16, "the widest category is 16 wide") + local moves = pin(8, 1) + eq(table.concat(moves.words, ","), "TACKLE,GROWL,MUD-SLAP", + "BUENA_MOVE rows resolve through GetMoveName") + local types = pin(7, 0) + eq(types.width, 6, ".Types is the narrowest box at 6") + local _, right = pin(10, 2) + eq(right, 1, "the eleventh category exists and its third row can be picked") + Specials.random = realRandom +end + +-- engine/events/buena.asm:25 .wrong is what a menu-less run has to take. +do + local save = newSave() + local vm = newVm(newHooks(save, { noScreens = true })) + run(vm, H.BuenasPassword) + eq(vm.scriptVar, 0, "no menu means no correct answer") +end + +-- ------------------------------------------------------------ the prizes + +-- data/items/buena_prizes.asm, and the cost / ReceiveItem / subtract order +-- (engine/events/buena.asm:95-119). +do + local save = newSave() + local hooks = newHooks(save, { vars = { [0x18] = 5 }, answers = { 1 } }) + local vm = newVm(hooks) + local pages = run(vm, H.BuenaPrize, { true }) + + local pushed = hooks.log.pushed[1] + eq(pushed.opts.mode, "prize", "the counter opens the prize list") + eq(#pushed.opts.prizes, 9, "NUM_BUENA_PRIZES rows") + eq(pushed.opts.prizes[1].name, "ULTRA BALL", "the first prize") + eq(pushed.opts.prizes[1].cost, 2, "costs 2 points") + eq(pushed.opts.prizes[9].name, "HP UP", "the last prize") + eq(pushed.opts.prizes[9].cost, 5, "costs 5") + eq(pushed.opts.balance, 5, "and the Points box shows wBlueCardBalance") + + eq(save.inventory.ULTRA_BALL, 1, "one ULTRA BALL leaves the counter") + eq(hooks.vars[0x18], 3, "and the two points come off the card") + eq(hooks.log.sfx[1], "Sfx_Transaction", "SFX_TRANSACTION rings the sale") + eq(pages[#pages], "Oh. Please come\nback again!", + ".done prints _BuenaComeAgainText after the loop") +end + +-- engine/events/buena.asm:93 `jr c, .loop`: nothing is spent. +do + local save = newSave() + local hooks = newHooks(save, { vars = { [0x18] = 9 }, answers = { 1, 0 } }) + local vm = newVm(hooks) + run(vm, H.BuenaPrize, { false }) + eq(save.inventory.ULTRA_BALL, nil, "a refused confirmation buys nothing") + eq(hooks.vars[0x18], 9, "and spends no points") + eq(#hooks.log.pushed, 2, "the list reopens once before the B press ends it") +end + +-- .InsufficientBalance and .BagFull (engine/events/buena.asm:121-127). +do + local save = newSave() + local hooks = newHooks(save, { vars = { [0x18] = 1 }, answers = { 1, 0 } }) + local vm = newVm(hooks) + local pages = run(vm, H.BuenaPrize, { true }) + eq(save.inventory.ULTRA_BALL, nil, "one point cannot buy a two point ball") + eq(hooks.vars[0x18], 1, "the balance is untouched") + check(pages[3] == "You don't have\nenough points.", + "_BuenaNotEnoughPointsText is the refusal") + + -- ReceiveItem's own refusal: a stack already at 99. + local full = newSave() + full.inventory.ULTRA_BALL = 99 + local fullHooks = newHooks(full, { vars = { [0x18] = 9 }, answers = { 1, 0 } }) + local fullVm = newVm(fullHooks) + local fullPages = run(fullVm, H.BuenaPrize, { true }) + eq(full.inventory.ULTRA_BALL, 99, "a full stack takes no more") + eq(fullHooks.vars[0x18], 9, "a full bag spends nothing either") + check(fullPages[3] == "You have no room\nfor it.", + "_BuenaNoRoomText is that refusal") +end + +-- ================================================================ the Seer + +local function seerMon(fields) + local mon = { + species = "GEODUDE", nickname = "ROCKY", level = 30, + otId = 0x1234, otName = "KRIS", moves = {}, + } + for key, value in pairs(fields or {}) do mon[key] = value end + return mon +end + +local function runSeer(mon, cancel) + local save = newSave() + save.party = { mon } + local hooks = newHooks(save, { pickIndex = (not cancel) and 1 or nil }) + local vm = newVm(hooks) + return run(vm, H.PokeSeer), hooks +end + +-- engine/events/poke_seer.asm:38 .cancel, SeerDoNothingText. +do + local pages = runSeer(seerMon(), true) + eq(#pages, 2, "the intro and then the refusal") + eq(pages[2], "Fufufu! I saw that\nyou'd do nothing!", "_SeerDoNothingText") +end + +-- engine/events/poke_seer.asm:28-29 `cp EGG / jr z, .egg`. +do + local pages = runSeer(seerMon({ isEgg = true })) + eq(pages[2], "Hey!\fThat's an EGG!\fYou can't say that\nyou've met it yet…", + "_SeerEggText") +end + +-- ReadCaughtData's `.error` (engine/events/poke_seer.asm:104-105, :133). +do + local pages = runSeer(seerMon()) + check(pages[2]:find("Whaaaat", 1, true) ~= nil, + "a mon with no caught data at all gets _SeerCantTellAThingText") +end + +-- SeerAction0 (engine/events/poke_seer.asm:64-70), then SeerAdvice. +do + local mon = seerMon({ caughtTime = 1, caughtLevel = 10, + caughtLocation = 1, caughtByGender = "boy" }) + local pages = runSeer(mon) + eq(pages[2], "Hm… I see you met\nROCKY here:\vNEW BARK TOWN!", + "_SeerNameLocationText, with the town map's line break spent as a space") + eq(pages[3], "The time was\nMorning!\fIts level was 10!\fAm I good or what?", + "_SeerTimeLevelText") + check(pages[4]:find("more confident", 1, true) ~= nil, + "a 20 level gain is SeerMoreConfidentText, the 29 row") +end + +-- SeerAction1, and engine/events/poke_seer.asm:110-119 where the OT id's +-- second `cp` is commented out, so only the HIGH byte decides. +do + local traded = seerMon({ otId = 0x9999, otName = "SILVER", + caughtTime = 3, caughtLevel = 5, caughtLocation = 2 }) + local pages = runSeer(traded) + eq(pages[2], "Hm… ROCKY\ncame from SILVER\vin a trade?\fROUTE 29\n" + .. "was where SILVER\vmet ROCKY!", "_SeerTradeText") + eq(pages[3], "The time was\nNight!\fIts level was 5!\fAm I good or what?", + "the same time/level page follows") + + local sameHigh = seerMon({ otId = 0x12ff, caughtTime = 2, caughtLevel = 5, + caughtLocation = 2 }) + local samePages = runSeer(sameHigh) + check(samePages[2]:find("I see you met", 1, true) ~= nil, + "an OT id that differs only in its LOW byte reads as met, bug and all") +end + +-- GetCaughtLocation's two sentinels (engine/events/poke_seer.asm:239-249). +do + local event = seerMon({ caughtLevel = 20, caughtLocation = Mon.LANDMARK_EVENT }) + local pages = runSeer(event) + check(pages[2]:find("What!? Incredible!", 1, true) ~= nil, + "LANDMARK_EVENT is SEERACTION_LEVEL_ONLY, _SeerNoLocationText") + check(pages[2]:find("was at level 20", 1, true) ~= nil, + "which still prints the level") + check(pages[3] ~= nil, "and still gives the advice page") + + local gift = seerMon({ caughtLevel = 5, caughtLocation = Mon.LANDMARK_GIFT }) + local giftPages = runSeer(gift) + check(giftPages[2]:find("Whaaaat", 1, true) ~= nil, + "LANDMARK_GIFT is SEERACTION_CANT_TELL_2, the same refusal") + eq(#giftPages, 2, "and there is no advice behind it") +end + +-- GetCaughtLevel (engine/events/poke_seer.asm:148-179) and GetCaughtTime's +-- .none arm (:198-201). +do + local unknown = seerMon({ caughtLevel = 0, caughtLocation = 1, caughtTime = 0 }) + -- byte1 is set, so ReadCaughtData's `or [hl]` misses its `.error` arm + -- (engine/events/poke_seer.asm:105). + local pages = runSeer(unknown) + eq(pages[3], "The time was\nUnknown!\fIts level was ???!\fAm I good or what?", + "no time and no level print Unknown and ???") + + local hatched = seerMon({ caughtLevel = 1, caughtLocation = 1, caughtTime = 2, + level = 6 }) + local hatchedPages = runSeer(hatched) + check(hatchedPages[3]:find("level was 5", 1, true) ~= nil, + "CAUGHT_EGG_LEVEL prints EGG_LEVEL, not 1") +end + +-- SeerAdviceTexts (engine/events/poke_seer.asm:357-364), walked in order; +-- `sub c` is one byte, so the 255 row catches an underflow. +do + local function adviceFor(level, caught) + local mon = seerMon({ level = level, caughtLevel = caught, + caughtLocation = 1, caughtTime = 2 }) + return runSeer(mon)[4] + end + check(adviceFor(12, 10):find("little more care", 1, true) ~= nil, + "a 2 level gain is the 9 row") + check(adviceFor(35, 10):find("more confident", 1, true) ~= nil, + "25 is the 29 row") + check(adviceFor(50, 10):find("much strength", 1, true) ~= nil, + "40 is the 59 row") + check(adviceFor(70, 10):find("grown mighty", 1, true) ~= nil, + "60 is the 89 row") + check(adviceFor(95, 5):find("I'm impressed", 1, true) ~= nil, + "90 is the 100 row") + check(adviceFor(5, 10):find("little more care", 1, true) ~= nil, + "and `sub c` underflowing lands on the 255 row, which repeats the first") +end + +-- ================================================ UnusedFindItemInPCOrBag + +-- mobile/mobile_12_2.asm:194 wNumPCItems, then :201 wNumItems. +do + local save = newSave() + save.pcItems = { RARE_CANDY = 1 } + local vm = newVm(newHooks(save), 50) + run(vm, H.UnusedFindItemInPCOrBag) + eq(vm.scriptVar, 1, "an item in the PC answers TRUE") + + local vm2 = newVm(newHooks(save, { held = { [92] = true } }), 92) + run(vm2, H.UnusedFindItemInPCOrBag) + eq(vm2.scriptVar, 1, "an item in the pack answers TRUE too") + + local vm3 = newVm(newHooks(save), 92) + run(vm3, H.UnusedFindItemInPCOrBag) + eq(vm3.scriptVar, 0, "and neither is FALSE") +end + +-- ==================================================== the seam these ride + +do + for _, name in ipairs({ "MoveTutor", "BuenasPassword", "BuenaPrize", + "AskRememberPassword", "PokeSeer", "UnusedFindItemInPCOrBag" }) do + eq(Specials.HANDLER_SOURCE[name], "specials/crystal_extras.lua", + name .. " is owned by this module") + eq(Specials.STUBS[name], nil, name .. " is no longer a stub") + check(Specials.SUPERSEDED_STUBS[name] ~= nil, + "and its old stub reason was retired") + end + local ids = {} + for _, id in ipairs(require("src.ui.Screens").GEN2_IDS) do ids[id] = true end + check(ids.Gen2MoveTutor, "Gen2MoveTutor is a registered screen id") + check(ids.Gen2BuenaPassword, "Gen2BuenaPassword is one too") +end + +S.finish() diff --git a/tests/gen2_crystal_gender_flag_test.lua b/tests/gen2_crystal_gender_flag_test.lua new file mode 100644 index 00000000..60ae6a12 --- /dev/null +++ b/tests/gen2_crystal_gender_flag_test.lua @@ -0,0 +1,144 @@ +-- ENGINE_PLAYER_IS_FEMALE, the Crystal engine flag `checkflag` asks at 14 map +-- sites, and the Crystal-only Surf refusal that shares the wiring. +-- luajit tests/gen2_crystal_gender_flag_test.lua +-- +-- Both come in a Crystal half and a Gold half: Gold declares no such flag and +-- keeps its documented "you can Surf on top of NPCs" bug (CT-10). +-- The cache half SKIPs when no crystal cache is present. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal gender flag") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local GameVersion = require("src.core.GameVersion") +local Save = require("src.core.gen2.Save") +local World = require("src.world.gen2.World") + +local priorVersion = GameVersion.get() + +-- ------------------------------------------------- the flag id, by name + +-- constants/engine_flags.asm's const block, with the badge rows at the ids a +-- real crystal cache reports and a hole where parse_const_block met a +-- const_skip. ENGINE_PLAYER_IS_FEMALE is row 100, so flag id 99. +local CRYSTAL_ORDER = {} +CRYSTAL_ORDER[27] = "ENGINE_ZEPHYRBADGE" +CRYSTAL_ORDER[28] = "ENGINE_HIVEBADGE" +CRYSTAL_ORDER[29] = "ENGINE_PLAINBADGE" +CRYSTAL_ORDER[30] = "ENGINE_FOGBADGE" +CRYSTAL_ORDER[31] = "ENGINE_MINERALBADGE" +CRYSTAL_ORDER[32] = "ENGINE_STORMBADGE" +CRYSTAL_ORDER[33] = "ENGINE_GLACIERBADGE" +CRYSTAL_ORDER[34] = "ENGINE_RISINGBADGE" +CRYSTAL_ORDER[35] = "ENGINE_BOULDERBADGE" +CRYSTAL_ORDER[42] = "ENGINE_EARTHBADGE" +-- the hole: nothing at 43..99, which is where ipairs would stop +CRYSTAL_ORDER[100] = "ENGINE_PLAYER_IS_FEMALE" + +FieldMoves.bindEngineFlags(CRYSTAL_ORDER) +eq(FieldMoves.FEMALE_FLAG, 99, "ENGINE_PLAYER_IS_FEMALE is flag 99 by NAME") +eq(FieldMoves.BADGE_FLAG[26].name, "ZEPHYR", + "and the badge block walks past the const_skip hole") +eq(FieldMoves.BADGE_FLAG[41].name, "EARTH", "including the last Kanto row") + +FieldMoves.bindEngineFlags(nil) +eq(FieldMoves.FEMALE_FLAG, nil, "Gold declares no such flag at all") +eq(FieldMoves.BADGE_FLAG[26].name, "ZEPHYR", "and keeps its own badge ids") + +-- ------------------------------------------------- the flag, through World + +local function flagWorld(version, gender, order) + local game = { + data = {}, + save = { + version = version, + player = { name = "CHRIS", id = 1, gender = gender, badges = {} }, + engineFlags = {}, + }, + } + FieldMoves.bindEngineFlags(order) + local world = World.new(game) + world.constants = {} + return world, game +end + +do + local world, game = flagWorld("crystal", "female", CRYSTAL_ORDER) + check(world:engineFlag(99), "Kris answers checkflag ENGINE_PLAYER_IS_FEMALE") + check(not (game.save.engineFlags or {})[99], + "and it is NOT a second copy in save.engineFlags") + game.save.player.gender = "male" + check(not world:engineFlag(99), "Chris answers the same flag false") + -- the write half exists only so a stray setflag cannot open a second store + world:setEngineFlag(99, true) + eq(game.save.player.gender, "female", "setflag writes the gender byte") + check(not (game.save.engineFlags or {})[99], "still one store") + world:setEngineFlag(99, false) + eq(game.save.player.gender, "male", "and clearflag writes it back") +end + +do + local world, game = flagWorld("gold", "male", nil) + check(not world:engineFlag(99), "Gold's flag 99 is an ordinary flag") + world:setEngineFlag(99, true) + check(world:engineFlag(99), "which reads back out of save.engineFlags") + check((game.save.engineFlags or {})[99] == true, "where Gold keeps it") + eq(game.save.player.gender, "male", "and the gender byte is untouched") +end + +-- ------------------------------------------------- Save.isFemale, the seam + +check(Save.isFemale({ player = { gender = "female" } }), "isFemale reads Kris") +check(not Save.isFemale({ player = { gender = "male" } }), "and not Chris") +check(not Save.isFemale({ player = {} }), "a genderless save is Chris") +check(not Save.isFemale(nil), "and so is no save at all") + +-- ------------------------------------------------- Surf onto an NPC (CT-10) + +local WATER = 0x29 -- pokecrystal constants/collision_constants.asm + +local function surfCtx(facingObject) + return { + save = { player = { badges = { FOG = true } } }, + mon = { species = "LAPRAS" }, + facing = "down", + facingColl = WATER, + playerColl = 0x00, + playerState = FieldMoves.PLAYER_NORMAL, + facingObject = facingObject, + } +end + +GameVersion.set("crystal") +check(FieldMoves.surfFromMenu(surfCtx(nil)).ok, + "Crystal surfs onto open water") +check(not FieldMoves.surfFromMenu(surfCtx({ id = "npc" })).ok, + "and refuses onto a facing object (CheckFacingObject)") +eq(FieldMoves.surfFromMenu(surfCtx({ id = "npc" })).text, + FieldMoves.TEXT.CANT_SURF, "with .cannotsurf's own line") + +GameVersion.set("gold") +check(FieldMoves.surfFromMenu(surfCtx(nil)).ok, "Gold surfs onto open water") +check(FieldMoves.surfFromMenu(surfCtx({ id = "npc" })).ok, + "and KEEPS the cart's bug: Surf right on top of the NPC") + +GameVersion.set("silver") +check(FieldMoves.surfFromMenu(surfCtx({ id = "npc" })).ok, + "Silver keeps it too") + +-- TrySurfOW is byte-identical in both trees, so the OW path never gained the +-- check (pokecrystal engine/events/overworld.asm:484-514 vs pokegold :469-499). +GameVersion.set("crystal") +do + local ctx = surfCtx({ id = "npc" }) + ctx.party = { { species = "LAPRAS", moves = { { id = "SURF" } } } } + check(FieldMoves.trySurfOW(ctx).ok, + "the A-press path is unchanged by the menu fix, even on Crystal") +end + +GameVersion.set(priorVersion) +FieldMoves.bindEngineFlags(nil) +S.finish() diff --git a/tests/gen2_crystal_gender_test.lua b/tests/gen2_crystal_gender_test.lua new file mode 100644 index 00000000..868322cd --- /dev/null +++ b/tests/gen2_crystal_gender_test.lua @@ -0,0 +1,334 @@ +-- Crystal's player gender: the InitGender screen, the byte it writes, and the +-- eight places that read it back. +-- luajit tests/gen2_crystal_gender_test.lua +-- +-- Gold and Silver have no Kris to extract, so every assertion comes in a +-- Crystal half and a Gold half: Gold must still boot straight into Oak with no +-- gender beat in the speech and Chris on the field. +-- The cache half SKIPs when no crystal cache is present. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal gender") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local GameVersion = require("src.core.GameVersion") +local GenderSelect = require("src.ui.gen2.GenderSelect") +local NamePick = require("src.ui.gen2.NamePick") +local NamingScreen = require("src.ui.gen2.NamingScreen") +local OakSpeech = require("src.ui.gen2.OakSpeech") +local Pokegear = require("src.ui.gen2.Pokegear") +local Save = require("src.core.gen2.Save") +local Screens = require("src.ui.Screens") +local TrainerCard = require("src.ui.gen2.TrainerCard") + +local priorVersion = GameVersion.get() + +-- ------------------------------------------------- the two sprite tables + +-- data/sprites/player_sprites.asm +eq(FieldMoves.stateSprite("normal", "male"), "SPRITE_CHRIS", "Chris on foot") +eq(FieldMoves.stateSprite("bike", "male"), "SPRITE_CHRIS_BIKE", "Chris biking") +eq(FieldMoves.stateSprite("normal", "female"), "SPRITE_KRIS", "Kris on foot") +eq(FieldMoves.stateSprite("bike", "female"), "SPRITE_KRIS_BIKE", "Kris biking") +eq(FieldMoves.stateSprite("surf", "female"), "SPRITE_SURF", + "both share the Lapras") +eq(FieldMoves.stateSprite("surf_pika", "female"), "SPRITE_SURFING_PIKACHU", + "and the surfing PIKACHU") +eq(FieldMoves.stateSprite("normal", nil), "SPRITE_CHRIS", + "no recorded gender is PLAYERGENDER_MALE") +eq(FieldMoves.stateSprite("skate", "female"), "SPRITE_KRIS", + "a state with no row falls back to PLAYER_NORMAL's") +eq(FieldMoves.playerSprite("female"), "SPRITE_KRIS", "playerSprite is the same") +check(FieldMoves.isFemale("female"), "female reads as PLAYERGENDER_FEMALE_F") +check(not FieldMoves.isFemale("male"), "male does not") +check(not FieldMoves.isFemale(nil), "and neither does an absent byte") + +check(FieldMoves.hasGenderChoice({ SPRITE_KRIS = {} }), + "a cache with SPRITE_KRIS offers the choice") +check(not FieldMoves.hasGenderChoice({ SPRITE_CHRIS = {} }), + "a Gold cache does not") +check(not FieldMoves.hasGenderChoice(nil), "and neither does no cache at all") + +-- ------------------------------------------------- the save field (CT-5) + +eq(Save.defaultPlayerName("crystal", "male"), "CHRIS", "MalePlayerNameArray[0]") +eq(Save.defaultPlayerName("crystal", "female"), "KRIS", + "FemalePlayerNameArray[0]") +eq(Save.defaultPlayerName("gold", "female"), "GOLD", + "Gold has no female array to fall into") +eq(Save.defaultPlayerName("silver", "female"), "SILVER", "nor does Silver") +eq(Save.defaultPlayerName("crystal"), "CHRIS", "and no gender is Chris") + +check(Save.isFemale({ player = { gender = "female" } }), "isFemale on a save") +check(not Save.isFemale({ player = { gender = "male" } }), "and not on Chris") +check(not Save.isFemale({}), "nor on a save with no player block") + +GameVersion.set("crystal") +local kris = Save.newGame({ gender = "female" }) +eq(kris.player.gender, "female", "newGame records the answer") +eq(kris.player.name, "KRIS", "and lays down .Kris as the default name") +local chris = Save.newGame({}) +eq(chris.player.gender, "male", "InitCrystalData zeroes the byte") +eq(chris.player.name, "CHRIS", "so a fresh save is Chris") +eq(Save.newGame({ gender = "female", playerName = "ZZ" }).player.name, "ZZ", + "an explicit name still wins") + +local normalized = Save.normalize({ version = "crystal", + player = { gender = "female" } }) +eq(normalized.player.name, "KRIS", "normalize fills the gendered default") +eq(Save.normalize({ version = "crystal", player = {} }).player.name, "CHRIS", + "and the male one with no byte") + +-- ------------------------------------------------- the name presets + +GameVersion.set("crystal") +eq(NamePick.presetsFor("male")[1], "CHRIS", "ChrisNameMenuHeader row 1") +eq(NamePick.presetsFor("male")[4], "JON", "and row 4") +eq(NamePick.presetsFor("female")[1], "KRIS", "KrisNameMenuHeader row 1") +eq(NamePick.presetsFor("female")[4], "JODI", "and row 4") +eq(NamePick.presetsFor()[1], "CHRIS", "no gender is the male header") +GameVersion.set("gold") +eq(NamePick.presetsFor("female")[1], "GOLD", + "Gold keeps PlayerNameArray whatever is asked for") +GameVersion.set("silver") +eq(NamePick.presetsFor("female")[1], "SILVER", "and so does Silver") +GameVersion.set("crystal") + +eq(NamingScreen.playerSprite("female"), "SPRITE_KRIS", + "GetPlayerIcon's female sheet") +eq(NamingScreen.playerSprite("male"), "SPRITE_CHRIS", "and its male one") + +-- ------------------------------------------------- the screen itself + +check(Screens.GEN2_IDS ~= nil, "the registry lists the Gen 2 screens") +local registered = {} +for _, id in ipairs(Screens.GEN2_IDS) do registered[id] = true end +check(registered.Gen2GenderSelect, "Gen2GenderSelect has an id") +eq(Screens.get({ data = {} }, "Gen2GenderSelect"), GenderSelect, + "and resolves to the builtin") + +eq(GenderSelect.OPTIONS[1].label, "Boy", ".MenuData item 1") +eq(GenderSelect.OPTIONS[1].gender, "male", "writes wPlayerGender 0") +eq(GenderSelect.OPTIONS[2].label, "Girl", ".MenuData item 2") +eq(GenderSelect.OPTIONS[2].gender, "female", "writes wPlayerGender 1") + +-- A joypad that answers one press then goes quiet, the way the harness fakes +-- input for every other screen suite here. +local function fakeInput(button) + local pressed = button + return { + wasPressed = function(_, name) + if pressed and name == pressed then + pressed = nil + return true + end + return false + end, + } +end + +local function screenGame(save, button) + return { save = save, data = {}, input = fakeInput(button) } +end + +local save = Save.newGame({}) +local answered +local game = screenGame(save, "a") +local screen = GenderSelect.new(game, { onDone = function(g) answered = g end }) +eq(screen.cursor, 1, "`db 1 ; default option` opens on Boy") +screen:update(0) +eq(save.player.gender, "male", "A on Boy writes PLAYERGENDER_MALE") +eq(answered, nil, "and the DelayFrames 10 has not run out yet") +for _ = 1, 10 do screen:update(0) end +eq(answered, "male", "onDone fires once the ten frames are gone") + +save = Save.newGame({}) +game = screenGame(save, "down") +screen = GenderSelect.new(game, { onDone = function() end }) +screen:update(0) +eq(screen.cursor, 2, "down walks to Girl") +game.input = fakeInput("down") +screen:update(0) +eq(screen.cursor, 1, "STATICMENU_WRAP wraps at the bottom") +game.input = fakeInput("up") +screen:update(0) +eq(screen.cursor, 2, "and at the top") +game.input = fakeInput("b") +screen:update(0) +eq(save.player.gender, "male", "STATICMENU_DISABLE_B: B answers nothing") +game.input = fakeInput("a") +screen:update(0) +eq(save.player.gender, "female", "A on Girl writes PLAYERGENDER_FEMALE") + +check(type(screen.text) == "string" and screen.text:find("boy"), + "the prompt is _AreYouABoyOrAreYouAGirlText") + +-- ------------------------------------------------- the beat in Oak's speech + +local function speechFor(sprites) + return { game = { data = { gen2Sprites = sprites } } } +end + +local crystalSteps = OakSpeech.defaultSteps(speechFor({ SPRITE_KRIS = {} })) +eq(crystalSteps[1].id, "gender_select", + "PlayerProfileSetup's InitGender runs before OakSpeech") +eq(crystalSteps[1].kind, "gender", "as its own step kind") +eq(crystalSteps[2].id, "init_clock", "and the clock follows it") + +local goldSteps = OakSpeech.defaultSteps(speechFor({ SPRITE_CHRIS = {} })) +eq(goldSteps[1].id, "init_clock", "Gold opens on the clock, as it always did") +for _, step in ipairs(goldSteps) do + check(step.kind ~= "gender", "and never grows a gender beat") +end +eq(OakSpeech.defaultSteps()[1].id, "init_clock", + "a bare call (no speech) is the Gold list") +eq(#goldSteps + 1, #crystalSteps, "the Crystal list is the Gold list plus one") + +-- ------------------------------------------------- the trainer card + +local CARD_GFX = { + card = "card.png", cardFemale = "card_f.png", cardTilesWide = 16, + leaderClasses = { "FALKNER" }, + -- the male attrmap the extractor writes: portrait on $0, corner on $1 + paletteZones = { { 14, 1, 5, 7, 1 }, { 18, 1, 1, 1, 2 } }, +} + +local function cardFor(gender) + return TrainerCard.new({ data = {} }, { + save = { player = { gender = gender, badges = {}, kantoBadges = {} } }, + menuGfx = { trainerCard = CARD_GFX }, + palettes = { trainers = { PLAYER = { { 1, 1, 1 }, { 2, 2, 2 } }, + FALKNER = { { 3, 3, 3 }, { 4, 4, 4 } } } }, + }) +end + +local male = cardFor("male") +check(not male.female, "Chris keeps ChrisCardPic") +eq(male.zoneDefault, 2, "and the border wears Falkner's row") +eq(male.zone[1 * 20 + 14], 1, "with the portrait on the player's") + +local female = cardFor("female") +check(female.female, "Kris takes KrisCardPic") +eq(female.zoneDefault, 1, "the border swaps to Chris's row") +eq(female.zone[1 * 20 + 14], 2, "the portrait to Falkner's, which is Kris's") +eq(female.zone[1 * 20 + 18], 1, "the top-right corner follows the border") +eq(female.zone[14 * 20 + 14], 2, "and Clair borrows Kris's palette") +eq(female.zone[14 * 20 + 10], nil, "Pryce's box is untouched") + +local noFemaleArt = TrainerCard.new({ data = {} }, { + save = { player = { gender = "female" } }, + menuGfx = { trainerCard = { card = "card.png", paletteZones = {} } }, +}) +check(not noFemaleArt.female, + "a Gold cache with no cardFemale draws the card it has") + +-- ------------------------------------------------- the Pokegear + +local GEAR_GFX = { + tiles = "gear.png", + palettes = { { { 1, 1, 1 } } }, + palettesFemale = { { { 9, 9, 9 } } }, +} + +local function gearFor(gender) + return Pokegear.new({ data = {} }, { + save = { player = { gender = gender }, pokegearFlags = {} }, + menuGfx = { pokegear = GEAR_GFX }, + }) +end + +eq(gearFor("male"):pals(), GEAR_GFX.palettes, "MalePokegearPals for Chris") +eq(gearFor("female"):pals(), GEAR_GFX.palettesFemale, + "FemalePokegearPals for Kris") +local noFemalePals = Pokegear.new({ data = {} }, { + save = { player = { gender = "female" }, pokegearFlags = {} }, + menuGfx = { pokegear = { tiles = "gear.png", palettes = GEAR_GFX.palettes } }, +}) +eq(noFemalePals:pals(), GEAR_GFX.palettes, + "a Gold cache has one set and uses it") + +-- ------------------------------------------------- the magnet train + +local MagnetTrainRide = require("src.ui.gen2.MagnetTrainRide") +local SPRITES = { SPRITE_CHRIS = { image = "chris.png" }, + SPRITE_KRIS = { image = "kris.png" } } +eq(MagnetTrainRide.playerSpriteDef({ data = { gen2Sprites = SPRITES }, + gender = "female" }), SPRITES.SPRITE_KRIS, "Kris rides MAGNET_TRAIN_BLUE") +eq(MagnetTrainRide.playerSpriteDef({ data = { gen2Sprites = SPRITES }, + gender = "male" }), SPRITES.SPRITE_CHRIS, "Chris rides MAGNET_TRAIN_RED") +eq(MagnetTrainRide.playerSpriteDef({ + data = { gen2Sprites = { SPRITE_CHRIS = SPRITES.SPRITE_CHRIS } }, + gender = "female" }), SPRITES.SPRITE_CHRIS, + "a Gold cache has only the one sheet") + +-- ------------------------------------------------------------ cache-gated + +local cache = os.getenv("CRYSTAL_CACHE") +if not cache then + local home = os.getenv("HOME") or "" + cache = home .. "/Library/Application Support/LOVE/crystal-dev/crystal" +end + +local function loadLua(rel) + local chunk = loadfile(cache .. "/" .. rel) + if not chunk then return nil end + local ok, value = pcall(chunk) + return ok and value or nil +end + +local function exists(rel) + local f = io.open(cache .. "/" .. rel, "rb") + if not f then return false end + f:close() + return true +end + +local sprites = loadLua("data/generated/sprites.lua") +if not sprites then + check(true, "crystal cache absent : SKIP") + GameVersion.set(priorVersion) + S.finish() + return +end + +check(sprites.SPRITE_KRIS ~= nil, "the cache carries SPRITE_KRIS") +check(sprites.SPRITE_KRIS_BIKE ~= nil, "and SPRITE_KRIS_BIKE") +eq(sprites.SPRITE_KRIS.palette, "PAL_OW_BLUE", "Kris is PAL_NPC_BLUE") +eq(sprites.SPRITE_CHRIS.palette, "PAL_OW_RED", "Chris is PAL_NPC_RED") +check(FieldMoves.hasGenderChoice(sprites), + "so a real Crystal cache offers the choice") + +for _, rel in ipairs({ + "assets/generated/intro/chris.png", + "assets/generated/intro/kris.png", + "assets/generated/trainer_card/card.png", + "assets/generated/trainer_card/card_f.png", + "assets/generated/sprites/kris.png", + "assets/generated/sprites/kris_bike.png", +}) do + check(exists(rel), "the cache carries " .. rel) +end + +local menuGfx = loadLua("data/generated/menu_gfx.lua") or {} +check(menuGfx.trainerCard and menuGfx.trainerCard.cardFemale ~= nil, + "menu_gfx.trainerCard.cardFemale is extracted") +check(menuGfx.pokegear and menuGfx.pokegear.palettesFemale ~= nil, + "menu_gfx.pokegear.palettesFemale is extracted") +check(menuGfx.pack and menuGfx.pack.palettesFemale ~= nil, + "menu_gfx.pack.palettesFemale is extracted") + +local palettes = loadLua("data/generated/palettes.lua") or {} +check(palettes.trainers and palettes.trainers.PLAYER ~= nil, + "PlayerPalette is row 0") +check(palettes.trainers and palettes.trainers.FALKNER ~= nil, + "and KrisPalette is Falkner's") + +local romText = loadLua("data/generated/rom_text.lua") or {} +check(romText._AreYouABoyOrAreYouAGirlText ~= nil, + "the prompt is in the extracted text") + +GameVersion.set(priorVersion) +S.finish() diff --git a/tests/gen2_crystal_mobile_gfx_test.lua b/tests/gen2_crystal_mobile_gfx_test.lua new file mode 100644 index 00000000..f4cf94d3 --- /dev/null +++ b/tests/gen2_crystal_mobile_gfx_test.lua @@ -0,0 +1,463 @@ +-- Crystal's Kris battle/Hall-of-Fame art and the Mobile System GB sheets. +-- luajit tests/gen2_crystal_mobile_gfx_test.lua +-- +-- Two imports that had no consumer at the time they landed, so nothing else +-- would notice them rotting: Kris's backpic and KRIS trainer-class pic (wave A +-- shipped the female protagonist but battles and the Hall of Fame still drew +-- Chris), and the whole gfx/mobile + gfx/mystery_gift set, imported ahead of +-- the phase that uses it so Crystal never has to re-import for it. +-- +-- What is held down: the stage exists and run() calls it, it is gated on the +-- crystal edition so Gold and Silver emit nothing, every label it reads is in +-- the generated Crystal manifest at the address pokecrystal.sym gives, and the +-- blobs it wrote are ../pokecrystal/gfx/mobile byte for byte. +-- +-- ROM-free. The decomp half SKIPs with no ../pokecrystal beside the repo, the +-- cache half with no Crystal cache. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal mobile gfx") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local function readFile(path) + local f = io.open(path, "rb") + if not f then return nil end + local body = f:read("*a") + f:close() + return body +end + +-- ------------------------------------------------------- the stage itself + +local extractorSource = assert(readFile("src/import/RomExtractorGen2.lua")) +local RomExtractorGen2 = require("src.import.RomExtractorGen2") + +check(type(RomExtractorGen2.extractMobileGfx) == "function", + "RomExtractorGen2:extractMobileGfx exists") +check(extractorSource:find("results.mobileGfx = self:extractMobileGfx()", + 1, true) ~= nil, "and RomExtractorGen2:run calls it") +check(extractorSource:find( + 'if self.edition ~= "crystal" then return nil end', 1, true) ~= nil, + "gated on the edition, so Gold and Silver write no mobile art") +-- The two suites that pin the progress bar read this same literal; a new +-- stage must not move it (tests/gen2_diploma_test.lua:45). +check(extractorSource:find("local STAGE_COUNT = 27", 1, true) ~= nil, + "and it did not disturb STAGE_COUNT") + +-- ------------------------------------------------------------ the symbols + +-- ../pokecrystal-symbols/pokecrystal.sym, international v1.0. Every one of +-- these resolves in that build: the Japanese-only part of Mobile System GB is +-- the text and the menu entries that reach it, not the art. +local SYMBOLS = { + AsciiFontGFX = { 0x5c, 0x5db1 }, + PichuAnimatedMobileGFX = { 0x5c, 0x4d16 }, + ElectroBallMobileGFX = { 0x5c, 0x55a4 }, + PichuBorderMobileGFX = { 0x5c, 0x5848 }, + Stadium2N64GFX = { 0x5c, 0x6f1f }, + Stadium2N64Tilemap = { 0x5c, 0x73af }, + Stadium2N64Attrmap = { 0x5c, 0x7517 }, + PasswordTopTilemap = { 0x5c, 0x6491 }, + PasswordBottomTilemap = { 0x5c, 0x651d }, + PasswordShiftTilemap = { 0x5c, 0x65f9 }, + ChooseMobileCenterTilemap = { 0x5c, 0x6685 }, + MobilePasswordAttrmap = { 0x5c, 0x67ed }, + ChooseMobileCenterAttrmap = { 0x5c, 0x6955 }, + MobilePasswordPalettes = { 0x5c, 0x5d71 }, + MobileCardGFX = { 0x5e, 0x59ef }, + ChrisSilhouetteGFX = { 0x5e, 0x5bef }, + KrisSilhouetteGFX = { 0x5e, 0x5e1f }, + MobileCard2GFX = { 0x5e, 0x604f }, + CardLargeSpriteAndFolderGFX = { 0x5e, 0x61bf }, + CardSpriteGFX = { 0x5e, 0x664f }, + DialpadTilemap = { 0x5e, 0x6cd5 }, + DialpadAttrmap = { 0x5e, 0x6e3d }, + DialpadGFX = { 0x5e, 0x6fa5 }, + DialpadCursorGFX = { 0x5e, 0x7465 }, + MobileCardListGFX = { 0x5e, 0x74b9 }, + HaveWantGFX = { 0x5f, 0x4083 }, + MobileSelectGFX = { 0x5f, 0x4983 }, + HaveWantMap = { 0x5f, 0x4b83 }, + PokemonNewsGFX = { 0x5f, 0x66fe }, + PokemonNewsTileAttrmap = { 0x5f, 0x6b8e }, + PokemonNewsPalettes = { 0x5f, 0x6ff6 }, + ["MobileSystemSplashScreen_InitGFX.Tiles"] = { 0x5b, 0x4173 }, + ["MobileSystemSplashScreen_InitGFX.Tilemap"] = { 0x5b, 0x4633 }, + ["MobileSystemSplashScreen_InitGFX.Attrmap"] = { 0x5b, 0x479b }, + MobileSplashScreenPalettes = { 0x5b, 0x4903 }, + MobileAdapterCheckGFX = { 0x5b, 0x4ca3 }, + MobileTradeSpritesGFX = { 0x42, 0x4d27 }, + MobileTradeGFX = { 0x42, 0x4da7 }, + MobileTradeTilemapLZ = { 0x42, 0x4fe7 }, + MobileTradeAttrmapLZ = { 0x42, 0x50a7 }, + MobileCable1GFX = { 0x42, 0x51c7 }, + MobileCable2GFX = { 0x42, 0x52c7 }, + UnusedMobilePulsePalettes = { 0x42, 0x50f7 }, + MobileTradeBGPalettes = { 0x42, 0x5107 }, + MobileTradeOB1Palettes = { 0x42, 0x5147 }, + MobileTradeOB2Palettes = { 0x42, 0x5187 }, + MobileAdapterPalettes = { 0x42, 0x53c7 }, + MobileTradeLightsGFX = { 0x40, 0x72a2 }, + MobileTradeLightsPalettes = { 0x40, 0x72e2 }, + PichuBorderMobileOBPalettes = { 0x45, 0x730e }, + PichuBorderMobileBGPalettes = { 0x45, 0x734e }, + PichuBorderMobileTilemapAttrmap = { 0x45, 0x7356 }, + MobileDialingGFX = { 0x45, 0x601a }, + MobileUpArrowGFX = { 0x12, 0x48c3 }, + MobileDownArrowGFX = { 0x12, 0x48cb }, + EZChatCursorGFX = { 0x22, 0x540b }, + MobileDialingFrameGFX = { 0x41, 0x6514 }, + SelectStartGFX = { 0x47, 0x567e }, + MobileMenuGFX = { 0x12, 0x5c0c }, + MobilePhoneTilesGFX = { 0x3e, 0x5234 }, + MysteryGiftGFX = { 0x41, 0x5258 }, + CardTradeGFX = { 0x41, 0x5930 }, + CardTradeSpriteGFX = { 0x41, 0x5d30 }, +} + +-- Kris's own two pics. KrisBackpic needs no delta row: embedded_symbols in +-- make_gold_manifest.py adds every unqualified *Backpic label on sight. +local KRIS_SYMBOLS = { + KrisBackpic = { 0x22, 0x4ed6 }, + KrisPic = { 0x22, 0x4bb9 }, + ChrisPic = { 0x22, 0x48a9 }, +} + +do + local deltas = assert(readFile("tools/crystal_symbol_deltas.py")) + for label in pairs(SYMBOLS) do + check(deltas:find('"' .. label .. '"', 1, true) ~= nil, + label .. " is in crystal_symbol_deltas.MOBILE_SYMBOLS") + end +end + +local Json = require("src.link.Json") +local function manifestSymbols(path) + local body = readFile(path) + if not body then return nil end + return (Json.decode(body) or {}).symbols or {} +end + +do + local symbols = manifestSymbols("tools/rom_manifest_crystal.json") + if not symbols then + check(true, "no tools/rom_manifest_crystal.json (SKIP)") + else + local wrong = {} + for label, at in pairs(SYMBOLS) do + local got = symbols[label] + if not got or got[1] ~= at[1] or got[2] ~= at[2] then + wrong[#wrong + 1] = label + end + end + check(#wrong == 0, #wrong == 0 + and "the Crystal manifest carries all 63 mobile symbols where " + .. "pokecrystal.sym puts them" + or ("mobile symbols missing or misplaced: " .. table.concat(wrong, ", "))) + for label, at in pairs(KRIS_SYMBOLS) do + local got = symbols[label] + if not got then + check(false, "the Crystal manifest carries " .. label) + else + eq(got[1], at[1], label .. " is in the bank pokecrystal.sym says") + eq(got[2], at[2], label .. " is at the address it says") + end + end + end +end + +do + -- Gold has no mobile banks; a delta that leaked into the shared set would + -- break the Gold import rather than show up here as a missing sheet. + local symbols = manifestSymbols("tools/rom_manifest_gold.json") + if not symbols then + check(true, "no tools/rom_manifest_gold.json (SKIP)") + else + local leaked = {} + for label in pairs(SYMBOLS) do + if symbols[label] then leaked[#leaked + 1] = label end + end + check(#leaked == 0, #leaked == 0 + and "and the Gold manifest carries none of them" + or ("mobile symbols leaked into Gold: " .. table.concat(leaked, ", "))) + check(symbols.KrisBackpic == nil, "nor Gold's non-existent KrisBackpic") + end +end + +-- --------------------------------------------------------------- the cache + +local cache = os.getenv("CRYSTAL_CACHE") +if not cache then + local home = os.getenv("HOME") or "" + cache = home .. "/Library/Application Support/LOVE/crystal-dev/crystal" +end + +local function loadCache(rel) + local chunk = loadfile(cache .. "/data/generated/" .. rel .. ".lua") + if not chunk then return nil end + local ok, value = pcall(chunk) + return ok and value or nil +end + +-- PNG IHDR: width and height are big-endian at bytes 17 and 21. +local function pngSize(relative) + local png = readFile(cache .. "/" .. relative) + if not png then return nil end + local function be32(s, i) + local a, b, c, d = s:byte(i, i + 3) + return ((a * 256 + b) * 256 + c) * 256 + d + end + return be32(png, 17), be32(png, 21) +end + +-- ../pokecrystal/gfx/player/kris_back.png is 48x48 and kris.png 56x56, the +-- same six and seven tiles square Chris uses. +local BACK_PIC_PX = 48 +local TRAINER_PIC_PX = 56 + +-- Kris's art and the mobile sheets ride one import, so mobile_gfx.lua doubles +-- as the marker for both: a cache built before this unit has neither, and the +-- whole cache half stands down rather than failing on an old sandbox. +local mobile = loadCache("mobile_gfx") +local menuGfx = mobile and loadCache("menu_gfx") or nil +if not menuGfx then + check(true, "no Crystal cache with mobile_gfx.lua at " .. cache + .. " : re-import for gfx/mobile (SKIP)") +else + local hud = menuGfx.battleHud or {} + eq(hud.playerBackFemale, "assets/generated/battle/player_back_female.png", + "menu_gfx points battles and the Hall of Fame at Kris's backpic") + local w, h = pngSize("assets/generated/battle/player_back_female.png") + eq(w, BACK_PIC_PX, "GetKrisBackpic's pic is 48px wide") + eq(h, BACK_PIC_PX, "and 48 tall, not the 7*7 tiles of VRAM it asks for") + check(hud.playerBack ~= hud.playerBackFemale, + "and it is not the same file Chris gets") + + local pics = hud.trainerPics or {} + eq(pics.KRIS, "assets/generated/battle/trainers/kris.png", + "HOF_LoadTrainerFrontpic's KRIS class has a pic of its own") + eq(pics.CHRIS, "assets/generated/battle/trainers/chris.png", + "as does CHRIS, which TrainerPicPointers has no row for") + for _, key in ipairs({ "kris", "chris" }) do + local pw, ph = pngSize("assets/generated/battle/trainers/" .. key .. ".png") + eq(pw, TRAINER_PIC_PX, key .. ".png is 56px wide") + eq(ph, TRAINER_PIC_PX, "and 56 tall, like every other trainer pic") + end +end + +local oakSpeech = mobile and loadCache("oak_speech") or nil +if not oakSpeech then + check(true, "no oak_speech.lua beside a mobile_gfx.lua cache (SKIP)") +else + eq(oakSpeech.playerPicFemale, "assets/generated/intro/kris.png", + "and DrawIntroPlayerPic's female arm is named in oak_speech.lua") +end + +-- Sheets whose tile count fills the pret PNG's grid exactly once padded, so +-- the cache PNG must come out at the source PNG's own size. The three left +-- out (mobile_splash, electro_ball, phone_tiles) are built with +-- --remove-duplicates / --remove-whitespace, so the ROM holds fewer tiles than +-- the PNG does and only the tilemap puts them back (../pokecrystal/Makefile: +-- 343,344,348). +local SHEETS = { + { "asciiFont", "mobile/ascii_font.png", 110, 16, "gfx/mobile/ascii_font.png" }, + { "card", "mobile/card.png", 32, 16, "gfx/mobile/card.png" }, + { "card2", "mobile/card_2.png", 23, 12, "gfx/mobile/card_2.png" }, + { "cardLargeSprite", "mobile/card_large_sprite.png", 8, 4, + "gfx/mobile/card_large_sprite.png" }, + { "cardFolder", "mobile/card_folder.png", 65, 6, + "gfx/mobile/card_folder.png" }, + { "cardList", "mobile/card_list.png", 24, 12, "gfx/mobile/card_list.png" }, + { "cardSprite", "mobile/card_sprite.png", 4, 2, "gfx/mobile/card_sprite.png" }, + { "chrisSilhouette", "mobile/chris_silhouette.png", 35, 5, + "gfx/mobile/chris_silhouette.png" }, + { "krisSilhouette", "mobile/kris_silhouette.png", 35, 5, + "gfx/mobile/kris_silhouette.png" }, + { "dialing", "mobile/dialing.png", 20, 2, "gfx/mobile/dialing.png" }, + { "dialingFrame", "mobile/dialing_frame.png", 8, 2, + "gfx/mobile/dialing_frame.png" }, + { "dialpad", "mobile/dialpad.png", 76, 16, "gfx/mobile/dialpad.png" }, + { "dialpadCursor", "mobile/dialpad_cursor.png", 5, 2, + "gfx/mobile/dialpad_cursor.png" }, + { "ezChatCursor", "mobile/ez_chat_cursor.png", 2, 1, + "gfx/mobile/ez_chat_cursor.png" }, + { "haveWant", "mobile/havewant.png", 144, 16, "gfx/mobile/havewant.png" }, + { "select", "mobile/select.png", 32, 4, "gfx/mobile/select.png" }, + { "selectStart", "mobile/select_start.png", 6, 3, + "gfx/mobile/select_start.png" }, + { "cable1", "mobile/mobile_cable_1.png", 16, 4, + "gfx/mobile/mobile_cable_1.png" }, + { "cable2", "mobile/mobile_cable_2.png", 16, 4, + "gfx/mobile/mobile_cable_2.png" }, + { "menu", "mobile/mobile_menu.png", 13, 13, "gfx/mobile/mobile_menu.png" }, + { "adapterCheck", "mobile/mobile_splash_check.png", 48, 16, + "gfx/mobile/mobile_splash_check.png" }, + { "tradeLights", "mobile/mobile_trade_lights.png", 4, 2, + "gfx/mobile/mobile_trade_lights.png" }, + { "pichuBorder", "mobile/pichu_border.png", 24, 4, + "gfx/mobile/pichu_border.png" }, + { "pokemonNews", "mobile/pokemon_news.png", 72, 8, + "gfx/mobile/pokemon_news.png" }, + { "stadium2N64", "mobile/stadium2_n64.png", 73, 11, + "gfx/mobile/stadium2_n64.png" }, + { "pichuAnimated", "mobile/pichu_animated.png", 193, 16, + "gfx/mobile/pichu_animated.png" }, + { "trade", "mobile/mobile_trade.png", 128, 8, "gfx/mobile/mobile_trade.png" }, + { "tradeSprites", "mobile/mobile_trade_sprites.png", 16, 4, + "gfx/mobile/mobile_trade_sprites.png" }, + { "upArrow", "mobile/up_arrow.png", 1, 1, "gfx/mobile/up_arrow.png" }, + { "downArrow", "mobile/down_arrow.png", 1, 1, "gfx/mobile/down_arrow.png" }, + { "mysteryGift", "mobile/mystery_gift/mystery_gift.png", 67, 16, + "gfx/mystery_gift/mystery_gift.png" }, + { "cardTrade", "mobile/mystery_gift/card_trade.png", 64, 16, + "gfx/mystery_gift/card_trade.png" }, + { "cardTradeSprite", "mobile/mystery_gift/card_sprite.png", 8, 4, + "gfx/mystery_gift/card_sprite.png" }, +} + +-- The three the dedupe passes shrink: only the declared tile count is checked. +local DEDUPED = { + { "splash", "mobile/mobile_splash.png", 76, 14 }, + { "electroBall", "mobile/electro_ball.png", 83, 16 }, + { "phoneTiles", "mobile/phone_tiles.png", 17, 2 }, +} + +-- key, cache file, byte length, ../pokecrystal source it must equal. +local MAPS = { + { "passwordTop", "password_top", 140, "gfx/mobile/password_top.tilemap" }, + { "passwordBottom", "password_bottom", 220, + "gfx/mobile/password_bottom.tilemap" }, + { "passwordShift", "password_shift", 140, + "gfx/mobile/password_shift.tilemap" }, + { "passwordAttrmap", "password_attrmap", 360, + "gfx/mobile/password.attrmap" }, + { "centerTilemap", "mobile_center_tilemap", 360, + "gfx/mobile/mobile_center.tilemap" }, + { "centerAttrmap", "mobile_center_attrmap", 360, + "gfx/mobile/mobile_center.attrmap" }, + { "stadium2N64Tilemap", "stadium2_n64_tilemap", 360, + "gfx/mobile/stadium2_n64.tilemap" }, + { "stadium2N64Attrmap", "stadium2_n64_attrmap", 360, + "gfx/mobile/stadium2_n64.attrmap" }, + { "dialpadTilemap", "dialpad_tilemap", 360, "gfx/mobile/dialpad.tilemap" }, + { "dialpadAttrmap", "dialpad_attrmap", 360, "gfx/mobile/dialpad.attrmap" }, + { "haveWantMap", "havewant_map", 1136, "gfx/mobile/havewant_map.bin" }, + { "newsAttrmap", "pokemon_news_attrmap", 1128, + "gfx/mobile/pokemon_news.bin" }, + { "splashTilemap", "mobile_splash_tilemap", 360, + "gfx/mobile/mobile_splash.tilemap" }, + { "splashAttrmap", "mobile_splash_attrmap", 360, + "gfx/mobile/mobile_splash.attrmap" }, + { "pichuBorderTilemap", "pichu_border_tilemap", 384, + "gfx/mobile/pichu_border.tilemap" }, + { "pichuBorderAttrmap", "pichu_border_attrmap", 384, + "gfx/mobile/pichu_border.attrmap" }, + { "tradeTilemap", "mobile_trade_tilemap", 1024, + "gfx/mobile/mobile_trade.tilemap" }, + { "tradeAttrmap", "mobile_trade_attrmap", 1024, + "gfx/mobile/mobile_trade.attrmap" }, +} + +local PALETTE_COLORS = { + splash = 32, password = 32, pokemonNews = 32, pichuBorderOB = 32, + pichuBorderBG = 4, tradeBG = 32, tradeOB1 = 32, tradeOB2 = 32, + tradeLights = 16, adapters = 8, unusedPulses = 8, +} + +local pokecrystal = "../pokecrystal" +local havePret = readFile(pokecrystal .. "/gfx/mobile/ascii_font.2bpp") ~= nil + +if not mobile then + check(true, "no mobile_gfx.lua in the Crystal cache (SKIP)") +else + eq(mobile.generation, 2, "mobile_gfx.lua is a Gen 2 table") + local sheets = mobile.sheets or {} + local maps = mobile.maps or {} + local palettes = mobile.palettes or {} + + local function checkSheet(row, pretPng) + local key, rel, tiles, wide = row[1], row[2], row[3], row[4] + local entry = sheets[key] + if type(entry) ~= "table" then + check(false, "mobile_gfx carries the " .. key .. " sheet") + return + end + eq(entry.tiles, tiles, key .. " is the tile count the ROM block holds") + eq(entry.tilesWide, wide, "and is written " .. wide .. " tiles across") + eq(entry.path, "assets/generated/" .. rel, "at the path it advertises") + local w, h = pngSize("assets/generated/" .. rel) + eq(w, wide * 8, key .. ".png is " .. (wide * 8) .. "px wide") + eq(h, math.ceil(tiles / wide) * 8, "and tall enough for every tile") + if pretPng and havePret then + local png = readFile(pokecrystal .. "/" .. pretPng) + if png then + local function be32(s, i) + local a, b, c, d = s:byte(i, i + 3) + return ((a * 256 + b) * 256 + c) * 256 + d + end + eq(w, be32(png, 17), "which is " .. pretPng .. "'s own width") + eq(h, be32(png, 21), "and its own height") + end + end + end + + for _, row in ipairs(SHEETS) do checkSheet(row, row[5]) end + for _, row in ipairs(DEDUPED) do checkSheet(row, nil) end + + for _, row in ipairs(MAPS) do + local key, file, bytes, source = row[1], row[2], row[3], row[4] + local entry = maps[key] + local rel = "assets/generated/mobile/" .. file .. ".bin" + if type(entry) ~= "table" then + check(false, "mobile_gfx carries the " .. key .. " map") + else + eq(entry.bytes, bytes, key .. " is " .. bytes .. " bytes") + eq(entry.path, rel, "at the path it advertises") + local blob = readFile(cache .. "/" .. rel) + if not blob then + check(false, rel .. " was written") + else + eq(#blob, bytes, "and the file on disk is that long") + local want = havePret and readFile(pokecrystal .. "/" .. source) or nil + if not want then + check(true, "no ../pokecrystal: " .. source .. " not diffed (SKIP)") + else + check(blob == want:sub(1, bytes), + "it is ../pokecrystal/" .. source .. " byte for byte") + end + end + end + end + + for key, colors in pairs(PALETTE_COLORS) do + local pal = palettes[key] + if type(pal) ~= "table" then + check(false, "mobile_gfx carries the " .. key .. " palette block") + else + eq(#pal, colors, key .. " is " .. colors .. " RGB words") + eq(#(pal[1] or {}), 3, "each one decoded to an r,g,b triple") + end + end +end + +-- A Gold cache must have gone nowhere near any of this. +local goldCache = os.getenv("GOLD_CACHE") +if not goldCache then + local home = os.getenv("HOME") or "" + goldCache = home .. "/Library/Application Support/LOVE/gold-dev/gold" +end +if not loadfile(goldCache .. "/data/generated/menu_gfx.lua") then + check(true, "no Gold cache at " .. goldCache .. " (SKIP)") +else + check(loadfile(goldCache .. "/data/generated/mobile_gfx.lua") == nil, + "a Gold cache has no mobile_gfx.lua") + local chunk = loadfile(goldCache .. "/data/generated/menu_gfx.lua") + local ok, gold = pcall(chunk) + local hud = (ok and gold or {}).battleHud or {} + check(hud.playerBackFemale == nil, "and no Kris backpic") + check((hud.trainerPics or {}).KRIS == nil, "and no KRIS trainer pic") +end + +S.finish() diff --git a/tests/gen2_crystal_story_test.lua b/tests/gen2_crystal_story_test.lua new file mode 100644 index 00000000..0ac3267e --- /dev/null +++ b/tests/gen2_crystal_story_test.lua @@ -0,0 +1,555 @@ +-- The Crystal story specials -- BeastsCheck, GiveDratini, GiveOddEgg and the +-- Ilex Forest shrine pair -- plus the roamer roster difference that makes the +-- Tin Tower Suicune catchable. +-- Self-contained: `luajit tests/gen2_crystal_story_test.lua`; also dofile'd by +-- tests/run_tests.lua. The cache half SKIPs when no crystal cache is present. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal story") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local GameVersion = require("src.core.GameVersion") +local Mon = require("src.battle.gen2.Mon") +local Roamers = require("src.core.gen2.Roamers") +local Save = require("src.core.gen2.Save") +local Specials = require("src.script.gen2.Specials") + +local H = Specials.HANDLERS +local priorVersion = GameVersion.get() +local priorRandom = Specials.random + +-- ---- fixtures ------------------------------------------------------------- + +-- pokecrystal/data/pokemon/base_stats/*.asm, the seven Odd Egg species plus +-- the Dragon Shrine's Dratini. +local BASE = { + PICHU = { 20, 40, 15, 60, 35, 35, "GROWTH_MEDIUM_FAST" }, + CLEFFA = { 50, 25, 28, 15, 45, 55, "GROWTH_FAST" }, + IGGLYBUFF = { 90, 30, 15, 15, 40, 20, "GROWTH_FAST" }, + SMOOCHUM = { 45, 30, 15, 65, 85, 65, "GROWTH_MEDIUM_FAST" }, + MAGBY = { 45, 75, 37, 83, 70, 55, "GROWTH_MEDIUM_FAST" }, + ELEKID = { 45, 63, 37, 95, 65, 55, "GROWTH_MEDIUM_FAST" }, + TYROGUE = { 35, 35, 35, 35, 35, 35, "GROWTH_MEDIUM_FAST" }, + DRATINI = { 41, 64, 45, 50, 50, 50, "GROWTH_SLOW" }, + RAIKOU = { 90, 85, 75, 115, 115, 100, "GROWTH_SLOW" }, + ENTEI = { 115, 115, 85, 100, 90, 75, "GROWTH_SLOW" }, + SUICUNE = { 100, 75, 115, 85, 90, 115, "GROWTH_SLOW" }, +} + +-- pokecrystal/data/moves/moves.asm, the PP byte of every move these two +-- routines hand out. +local MOVE_PP = { + THUNDERSHOCK = 30, CHARM = 20, DIZZY_PUNCH = 10, POUND = 35, SING = 15, + LICK = 30, EMBER = 25, QUICK_ATTACK = 30, LEER = 30, TACKLE = 35, + WRAP = 20, THUNDER_WAVE = 20, TWISTER = 20, EXTREMESPEED = 5, +} + +-- pokecrystal/data/growth_rates.asm MEDIUM_FAST, FAST and SLOW. +local GROWTH = { + GROWTH_MEDIUM_FAST = { numerator = 1, denominator = 1, squared = 0, + linear = 0, constant = 0 }, + GROWTH_FAST = { numerator = 4, denominator = 5, squared = 0, linear = 0, + constant = 0 }, + GROWTH_SLOW = { numerator = 5, denominator = 4, squared = 0, linear = 0, + constant = 0 }, +} + +local INDEX = { PICHU = 172, CLEFFA = 173, IGGLYBUFF = 174, SMOOCHUM = 238, + MAGBY = 240, ELEKID = 239, TYROGUE = 236, DRATINI = 147, RAIKOU = 243, + ENTEI = 244, SUICUNE = 245 } + +local DATA = { pokemon = { growthRates = GROWTH }, moves = {} } +for id, row in pairs(BASE) do + DATA.pokemon[id] = { + id = id, index = INDEX[id], name = id, + baseStats = { hp = row[1], attack = row[2], defense = row[3], + speed = row[4], specialAttack = row[5], specialDefense = row[6] }, + types = { "NORMAL", "NORMAL" }, + growthRate = row[7], + genderRatio = 127, + eggGroups = { "EGG_GROUND", "EGG_GROUND" }, + eggSteps = 20, + evolutions = {}, + levelMoves = { { level = 1, move = "TACKLE" } }, + } +end +for id, pp in pairs(MOVE_PP) do DATA.moves[id] = { id = id, pp = pp } end + +local ITEM_INDEX = { EGG_TICKET = 129, GS_BALL = 115 } + +-- The World hook table a handler sees, with only the rows these five need. +local function makeVm(opts) + opts = opts or {} + local record = opts.save + local tossed = {} + local vars = opts.vars or {} + local vm = { + scriptVar = opts.scriptVar or 0, + battleOutcome = opts.battleOutcome, + tossed = tossed, + vars = vars, + readVarFn = function(id) return vars[id] or 0 end, + writeVarFn = function(id, value) vars[id] = value end, + specials = { + save = function() return record end, + data = function() return DATA end, + party = function() return (record and record.party) or {} end, + monIndex = function(species) + local def = DATA.pokemon[species] + return def and def.index or nil + end, + monName = function(index) + for id, def in pairs(DATA.pokemon) do + if def.index == index then return def.name end + end + return nil + end, + itemIndex = function(id) return ITEM_INDEX[id] end, + takeItem = function(index, qty) + tossed[#tossed + 1] = { index = index, qty = qty } + return true + end, + }, + } + return vm +end + +local function newSave() + return { version = "crystal", player = { name = "CHRIS", id = 30000 }, + party = {}, boxes = {} } +end + +-- ---- BeastsCheck ---------------------------------------------------------- +-- pokecrystal/engine/pokemon/search_owned.asm:1 + +do + local record = newSave() + local function beast(species, opts) + opts = opts or {} + return { species = species, level = 40, + ot = opts.ot or "CHRIS", otId = opts.otId or 30000 } + end + + local vm = makeVm({ save = record }) + H.BeastsCheck(vm) + eq(vm.scriptVar, 0, "BeastsCheck is FALSE with an empty party") + + record.party = { beast("RAIKOU"), beast("ENTEI") } + H.BeastsCheck(vm) + eq(vm.scriptVar, 0, "two of three is still FALSE") + + -- CheckOwnMonAnywhere walks the PC after the party (:80 onward). + record.boxes = { box1 = { beast("SUICUNE") } } + H.BeastsCheck(vm) + eq(vm.scriptVar, 1, "the third one counts from a PC box") + + record.boxes.box1[1].otId = 9999 + H.BeastsCheck(vm) + eq(vm.scriptVar, 0, "a traded beast fails the trainer-ID check") + + record.boxes.box1[1].otId = 30000 + record.boxes.box1[1].ot = "ETHAN" + H.BeastsCheck(vm) + eq(vm.scriptVar, 0, "and a traded beast fails the OT-name check") + + record.boxes.box1[1].ot = "CHRIS" + H.BeastsCheck(vm) + eq(vm.scriptVar, 1, "all three owned answers TRUE") + eq(vm.scriptVar, 1, "and re-running it is stable") +end + +-- ---- GiveDratini ---------------------------------------------------------- +-- pokecrystal/engine/events/dratini.asm:1 + +local function dratini(nickname) + local mon = Mon.new(DATA, "DRATINI", 15, {}) + mon.nickname = nickname + mon.moves = { + { id = "WRAP", pp = 20, maxPp = 20 }, + { id = "LEER", pp = 30, maxPp = 30 }, + { id = "THUNDER_WAVE", pp = 20, maxPp = 20 }, + { id = "TWISTER", pp = 20, maxPp = 20 }, + } + return mon +end + +local function moveIds(mon) + local out = {} + for _, move in ipairs(mon.moves or {}) do out[#out + 1] = move.id end + return table.concat(out, ",") +end + +do + local record = newSave() + record.party = { { species = "CHIKORITA" }, dratini("FIRST"), + dratini("LAST") } + local vm = makeVm({ save = record, scriptVar = 0 }) + H.GiveDratini(vm) + eq(moveIds(record.party[3]), "WRAP,THUNDER_WAVE,TWISTER,EXTREMESPEED", + "scriptVar 0 gives .Moveset0, Extremespeed and all") + eq(moveIds(record.party[2]), "WRAP,LEER,THUNDER_WAVE,TWISTER", + "and only the LAST Dratini in the party is touched") + eq(record.party[3].moves[4].pp, 5, + "the new move's PP comes out of the move table") + eq(record.party[3].moves[4].maxPp, 5, "and so does its max PP") + + local plain = newSave() + plain.party = { dratini("ONLY") } + local vm2 = makeVm({ save = plain, scriptVar = 1 }) + H.GiveDratini(vm2) + eq(moveIds(plain.party[1]), "WRAP,LEER,THUNDER_WAVE,TWISTER", + "scriptVar 1 gives .Moveset1, the plain level 15 set") + + local untouched = newSave() + untouched.party = { dratini("ONLY") } + local vm3 = makeVm({ save = untouched, scriptVar = 2 }) + H.GiveDratini(vm3) + eq(moveIds(untouched.party[1]), "WRAP,LEER,THUNDER_WAVE,TWISTER", + "`cp $2 / ret nc` leaves the party alone") + + local none = newSave() + none.party = { { species = "CHIKORITA", moves = {} } } + local vm4 = makeVm({ save = none, scriptVar = 0 }) + H.GiveDratini(vm4) + eq(#none.party[1].moves, 0, "a party with no Dratini is left alone") +end + +-- ---- GiveOddEgg ----------------------------------------------------------- +-- pokecrystal/engine/events/odd_egg.asm:1 + +-- pokecrystal/data/events/odd_eggs.asm:14-33 run through the macro at :5: +-- cumulative percent * $ffff / 100. +local ODD_EGG_PROBABILITIES = { 5242, 5898, 16383, 18349, 28835, 30801, 39976, + 41287, 47840, 49151, 57015, 58326, 64879, 65535 } + +-- pokecrystal/data/events/odd_eggs.asm:37 OddEggs, row by row. +local ODD_EGG_ROWS = { + { "PICHU", 2048, { 0, 0, 0, 0 }, { "THUNDERSHOCK", "CHARM", "DIZZY_PUNCH" }, + { 17, 9, 6, 11, 8, 8 } }, + { "PICHU", 256, { 2, 10, 10, 10 }, { "THUNDERSHOCK", "CHARM", "DIZZY_PUNCH" }, + { 17, 9, 7, 12, 9, 9 } }, + { "CLEFFA", 4096, { 0, 0, 0, 0 }, { "POUND", "CHARM", "DIZZY_PUNCH" }, + { 20, 7, 7, 6, 9, 10 } }, + { "CLEFFA", 768, { 2, 10, 10, 10 }, { "POUND", "CHARM", "DIZZY_PUNCH" }, + { 20, 7, 8, 7, 10, 11 } }, + { "IGGLYBUFF", 4096, { 0, 0, 0, 0 }, { "SING", "CHARM", "DIZZY_PUNCH" }, + { 24, 8, 6, 6, 9, 7 } }, + { "IGGLYBUFF", 768, { 2, 10, 10, 10 }, { "SING", "CHARM", "DIZZY_PUNCH" }, + { 24, 8, 7, 7, 10, 8 } }, + { "SMOOCHUM", 3584, { 0, 0, 0, 0 }, { "POUND", "LICK", "DIZZY_PUNCH" }, + { 19, 8, 6, 11, 13, 11 } }, + { "SMOOCHUM", 512, { 2, 10, 10, 10 }, { "POUND", "LICK", "DIZZY_PUNCH" }, + { 19, 8, 7, 12, 14, 12 } }, + { "MAGBY", 2560, { 0, 0, 0, 0 }, { "EMBER", "DIZZY_PUNCH" }, + { 19, 12, 8, 13, 12, 10 } }, + { "MAGBY", 512, { 2, 10, 10, 10 }, { "EMBER", "DIZZY_PUNCH" }, + { 19, 12, 9, 14, 13, 11 } }, + { "ELEKID", 3072, { 0, 0, 0, 0 }, { "QUICK_ATTACK", "LEER", "DIZZY_PUNCH" }, + { 19, 11, 8, 14, 11, 10 } }, + { "ELEKID", 512, { 2, 10, 10, 10 }, { "QUICK_ATTACK", "LEER", "DIZZY_PUNCH" }, + { 19, 11, 9, 15, 12, 11 } }, + { "TYROGUE", 2560, { 0, 0, 0, 0 }, { "TACKLE", "DIZZY_PUNCH" }, + { 18, 8, 8, 8, 8, 8 } }, + { "TYROGUE", 256, { 2, 10, 10, 10 }, { "TACKLE", "DIZZY_PUNCH" }, + { 18, 8, 9, 9, 9, 9 } }, +} + +-- Specials.random(n) is 1..n, so `roll` is the Random WORD the routine reads. +local function pinRoll(roll) + Specials.random = function(n) + if n == 0x10000 then return roll + 1 end + return priorRandom(n) + end +end + +do + local wrong = {} + for index, row in ipairs(ODD_EGG_ROWS) do + local record = newSave() + -- The lowest roll that lands in this bucket: one past the previous + -- cumulative probability. + local roll = (index == 1) and 0 or (ODD_EGG_PROBABILITIES[index - 1] + 1) + pinRoll(roll) + local vm = makeVm({ save = record }) + H.GiveOddEgg(vm) + local egg = record.party[1] + local label = "row " .. index .. " (" .. row[1] .. ")" + if not egg then + wrong[#wrong + 1] = label .. ": no egg" + else + if egg.species ~= row[1] then + wrong[#wrong + 1] = label .. ": species " .. tostring(egg.species) + end + if egg.otId ~= row[2] then + wrong[#wrong + 1] = label .. ": otId " .. tostring(egg.otId) + end + local dvs = egg.dvs or {} + if dvs.attack ~= row[3][1] or dvs.defense ~= row[3][2] + or dvs.speed ~= row[3][3] or dvs.special ~= row[3][4] then + wrong[#wrong + 1] = label .. ": DVs" + end + if moveIds(egg) ~= table.concat(row[4], ",") then + wrong[#wrong + 1] = label .. ": moves " .. moveIds(egg) + end + for slot, id in ipairs(row[4]) do + if egg.moves[slot].pp ~= MOVE_PP[id] then + wrong[#wrong + 1] = label .. ": pp " .. id + end + end + local stats = egg.stats or {} + local want = row[5] + if stats.hp ~= want[1] or stats.attack ~= want[2] + or stats.defense ~= want[3] or stats.speed ~= want[4] + or stats.specialAttack ~= want[5] + or stats.specialDefense ~= want[6] then + wrong[#wrong + 1] = label .. ": stats" + end + -- The struct's stat words are the Gen 2 formula's own output; if these + -- two ever disagree the transcription above is wrong, not the formula. + local computed = Mon.stats(DATA.pokemon[row[1]].baseStats, egg.dvs, 5, {}) + if computed.hp ~= want[1] or computed.attack ~= want[2] + or computed.defense ~= want[3] or computed.speed ~= want[4] + or computed.specialAttack ~= want[5] + or computed.specialDefense ~= want[6] then + wrong[#wrong + 1] = label .. ": Mon.stats disagrees with the table" + end + end + end + eq(table.concat(wrong, " | "), "", + "all 14 OddEggs rows come out byte for byte") + + -- The bucket boundary is inclusive: `cp e / jr z, .done`. + pinRoll(ODD_EGG_PROBABILITIES[1]) + local edge = newSave() + H.GiveOddEgg(makeVm({ save = edge })) + eq(edge.party[1].otId, 2048, "a roll EQUAL to the probability stays in row 1") + pinRoll(ODD_EGG_PROBABILITIES[1] + 1) + local over = newSave() + H.GiveOddEgg(makeVm({ save = over })) + eq(over.party[1].otId, 256, "and one past it falls into row 2") + + -- The last entry is $ffff, which is the loop's own break: every roll above + -- the 99% mark lands there. + pinRoll(0xffff) + local last = newSave() + H.GiveOddEgg(makeVm({ save = last })) + eq(last.party[1].species, "TYROGUE", "the $ffff row takes the top of the range") + eq(last.party[1].otId, 256, "and it is the shiny Tyrogue") +end + +do + pinRoll(0) + local record = newSave() + local vm = makeVm({ save = record }) + H.GiveOddEgg(vm) + local egg = record.party[1] + eq(egg.isEgg, true, "the Odd Egg arrives as an EGG") + eq(egg.nickname, "EGG", "wOddEggName is its nickname") + eq(egg.ot, "ODD", "and wTempOddEggNickname is its OT name") + eq(egg.otName, "ODD", "on both OT fields") + eq(egg.otId, 2048, "the OT ID is the struct's, not the player's") + eq(egg.eggSteps, 20, "20 step cycles to hatch") + eq(egg.hp, 0, "an egg is carried at zero HP") + eq(egg.level, 5, "at level 5") + eq(egg.experience, 125, + "and with the struct's 125 exp, not the curve's own value") + eq(#vm.tossed, 1, "the EGG TICKET is tossed") + eq(vm.tossed[1].index, 129, "by its item index") + eq(vm.tossed[1].qty, 1, "one of them") + + -- CLEFFA is GROWTH_FAST, so 125 is more than level 5 costs: the copied + -- struct really does overshoot the curve. + pinRoll(ODD_EGG_PROBABILITIES[2] + 1) + local cleffa = newSave() + H.GiveOddEgg(makeVm({ save = cleffa })) + eq(cleffa.party[1].species, "CLEFFA", "the Cleffa bucket") + eq(cleffa.party[1].experience, 125, "carries 125 exp too") + eq(Mon.experienceForLevel(GROWTH.GROWTH_FAST, 5), 100, + "even though its own curve wants 100") + + -- The second row of every pair is the classic shiny DV set. + pinRoll(ODD_EGG_PROBABILITIES[1] + 1) + local shiny = newSave() + H.GiveOddEgg(makeVm({ save = shiny })) + eq(shiny.party[1].shiny, true, "the 2/10/10/10 rows are shiny") + + -- pokecrystal/maps/DayCare.asm:31-32 is the party-full guard, so a full + -- party must not grow a seventh slot here. + local full = newSave() + for i = 1, 6 do full.party[i] = { species = "CHIKORITA" } end + local vmFull = makeVm({ save = full }) + H.GiveOddEgg(vmFull) + eq(#full.party, 6, "a full party gets no Odd Egg") + eq(#vmFull.tossed, 0, "and keeps its EGG TICKET") +end + +Specials.random = priorRandom + +-- ---- the Ilex Forest shrine ----------------------------------------------- +-- pokecrystal/engine/events/celebi.asm:9 and :301 + +do + local record = newSave() + local vm = makeVm({ save = record }) + H.CelebiShrineEvent(vm) + eq(vm.vars[0x03], 11, + "CelebiShrineEvent leaves BATTLETYPE_CELEBI in VAR_BATTLETYPE") + eq(vm.celebiArmed, true, "and arms the result bit for the battle to come") + + vm.battleOutcome = "caught" + H.CheckCaughtCelebi(vm) + eq(vm.scriptVar, 1, "catching it in that battle answers TRUE") + eq(Save.crystalState(record).celebiCaught, true, "and is recorded") + eq(vm.celebiArmed, nil, "the arming is one battle long") + + local ran = newSave() + local vm2 = makeVm({ save = ran, battleOutcome = "run" }) + H.CelebiShrineEvent(vm2) + H.CheckCaughtCelebi(vm2) + eq(vm2.scriptVar, 0, "running from it answers FALSE") + eq(Save.crystalState(ran).celebiCaught, false, "and records nothing") + + local won = newSave() + local vm3 = makeVm({ save = won, battleOutcome = "win" }) + H.CelebiShrineEvent(vm3) + H.CheckCaughtCelebi(vm3) + eq(vm3.scriptVar, 0, "and knocking it out answers FALSE") + + -- pokecrystal/engine/items/item_effects.asm:542 gates the bit on the battle + -- type, so an ordinary catch never sets it. + local other = newSave() + local vm4 = makeVm({ save = other, battleOutcome = "caught" }) + H.CheckCaughtCelebi(vm4) + eq(vm4.scriptVar, 0, "a catch in a NORMAL battle does not count") + eq(Save.crystalState(other).celebiCaught, false, "and records nothing") +end + +-- ---- the beasts that roam ------------------------------------------------- +-- pokegold/data/wild/flee_mons.asm:34 against pokecrystal's:34 + +do + GameVersion.set("gold") + eq(Roamers.ALWAYS_FLEE.RAIKOU, true, "Gold: Raikou always flees") + eq(Roamers.ALWAYS_FLEE.ENTEI, true, "Gold: Entei always flees") + eq(Roamers.ALWAYS_FLEE.SUICUNE, true, "Gold: Suicune always flees") + + GameVersion.set("silver") + eq(Roamers.ALWAYS_FLEE.SUICUNE, true, "Silver rides the same list") + + GameVersion.set("crystal") + eq(Roamers.ALWAYS_FLEE.RAIKOU, true, "Crystal keeps Raikou on the list") + eq(Roamers.ALWAYS_FLEE.ENTEI, true, "and Entei") + eq(Roamers.ALWAYS_FLEE.SUICUNE, nil, + "but drops Suicune, so the Tin Tower battle can be fought") + eq(Roamers.ALWAYS_FLEE.PIDGEY, nil, "a mon on no list still never flees") + + eq(Roamers.alwaysFleeMons("gold").SUICUNE, true, + "the accessor answers per version id") + eq(Roamers.alwaysFleeMons("crystal").SUICUNE, nil, "independently of the boot") + GameVersion.set(priorVersion) +end + +-- Crystal seeds two roam structs, so the third slot the encounter roll can +-- pick is always empty -- pokecrystal/engine/overworld/wildmons.asm:493. +do + local twoRow = { roamMons = { + { species = "RAIKOU", level = 40, map = "ROUTE_42" }, + { species = "ENTEI", level = 40, map = "ROUTE_37" }, + } } + local record = { version = "crystal" } + Roamers.init(record, { encounters = twoRow }) + eq(#record.roamers, 2, "a Crystal cache seeds two roamers") + eq(record.roamers[1].species, "RAIKOU", "Raikou in slot 1") + eq(record.roamers[2].species, "ENTEI", "Entei in slot 2") + eq(record.roamers[3], nil, "and nothing in Suicune's old slot") + + -- CheckEncounterRoamMon's `and %11 / jr z / dec a` picks slot 1, 2 or 3. + local hits = { 0, 0, 0 } + for value = 0, 99 do + local hit = Roamers.checkEncounter(record, "ROUTE_42", false, + function() return value end) + if hit then hits[hit.index] = hits[hit.index] + 1 end + end + check(hits[1] > 0, "slot 1 is still reachable on its own route") + eq(hits[3], 0, "slot 3 never produces an encounter on Crystal") +end + +-- ------------------------------------------------------------ cache-gated + +local cache = os.getenv("CRYSTAL_CACHE") +if not cache then + local home = os.getenv("HOME") or "" + for _, dir in ipairs({ "crystal-dev", "lead-card" }) do + local candidate = home .. "/Library/Application Support/LOVE/" .. dir + .. "/crystal" + local probe = io.open(candidate .. "/data/generated/constants.lua", "r") + if probe then + probe:close() + cache = candidate + break + end + end +end + +local constantsFile = cache and io.open(cache .. "/data/generated/constants.lua", + "r") +if not constantsFile then + check(true, "crystal cache absent : SKIP") + S.finish() + return +end +constantsFile:close() + +local function loadLua(rel) + local chunk = loadfile(cache .. "/" .. rel) + if not chunk then return nil end + local ok, value = pcall(chunk) + return ok and value or nil +end + +local constants = loadLua("data/generated/constants.lua") +local scripts = loadLua("data/generated/scripts.lua") +local encounters = loadLua("data/generated/encounters.lua") +check(constants ~= nil and scripts ~= nil, "the crystal cache loads") + +-- Every handler above has to be a name the cache's own SpecialsPointers row +-- resolves to, and one an extracted script really calls. +local order = constants.specialOrder or {} +local calls = {} +for _, list in pairs(scripts) do + if type(list) == "table" then + for _, row in ipairs(list) do + if type(row) == "table" and row.op == "special" then + local name = order[(row.id or 0) + 1] + if name then calls[name] = (calls[name] or 0) + 1 end + end + end + end +end + +for _, name in ipairs({ "BeastsCheck", "GiveDratini", "GiveOddEgg", + "CelebiShrineEvent", "CheckCaughtCelebi" }) do + check(Specials.HANDLERS[name] ~= nil, name .. " is a handler, not a stub") + check((calls[name] or 0) > 0, + name .. " is called by an extracted Crystal script") +end + +-- pokecrystal/mobile/mobile_46.asm:6793: TradeCornerHoldMon lives in the +-- Mobile System GB bank and no map script reaches it. +eq(calls.TradeCornerHoldMon, nil, + "TradeCornerHoldMon is never called from a script") +check(Specials.STUBS.TradeCornerHoldMon ~= nil, + "so it stays a documented stub") + +eq(#(encounters and encounters.roamMons or {}), 2, + "the Crystal cache carries two roamMons rows") +local roamNames = {} +for _, row in ipairs((encounters and encounters.roamMons) or {}) do + roamNames[#roamNames + 1] = row.species +end +eq(table.concat(roamNames, ","), "RAIKOU,ENTEI", + "Raikou and Entei, with Suicune off the roam list") + +S.finish() diff --git a/tests/gen2_crystal_townmap_test.lua b/tests/gen2_crystal_townmap_test.lua new file mode 100644 index 00000000..d1e9b812 --- /dev/null +++ b/tests/gen2_crystal_townmap_test.lua @@ -0,0 +1,421 @@ +-- The wall map, the printed diploma and the memory game: the three specials +-- both Gen 2 carts carry that had no port half (engine/events/specials.asm:100 +-- OverworldTownMap, :448 PrintDiploma, :207 UnusedMemoryGame). +-- +-- OverworldTownMap has two callers. TownMapScript +-- (engine/events/std_scripts.asm:145) is registered but no map jumpstd's it on +-- either cart; DecorationDesc_TownMapPoster +-- (engine/overworld/decorations.asm:1005) is the live one, and InitDecorations +-- (engine/overworld/decorations.asm:1, run from +-- engine/menus/intro_menu.asm:133) hangs DECO_TOWN_MAP on the bedroom wall at +-- new game, so a silent no-op here is a dead end in the room the player starts +-- in. +-- luajit tests/gen2_crystal_townmap_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 crystal town map") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") +require("src.core.Logger").warn = function() end + +local Events = require("src.world.gen2.Events") +local Pokegear = require("src.ui.gen2.Pokegear") +local Specials = require("src.script.gen2.Specials") +local Vm = require("src.script.gen2.Vm") + +local H = Specials.HANDLERS + +local function fakeInput() + local pressed = {} + return { + press = function(_self, button) pressed[button] = true end, + wasPressed = function(_self, button) + if pressed[button] then + pressed[button] = nil + return true + end + return false + end, + } +end + +-- landmarks.lua's shape. ../pokecrystal/constants/landmark_constants.asm:34 +-- inserts LANDMARK_BATTLE_TOWER, so every index from ROUTE_40 up is one higher +-- than pokegold/constants/landmark_constants.asm gives it; both index spaces +-- are built here because the two limit registers are read out of this table. +local function landmarkTable(rows) + local out = { landmarks = {}, order = {} } + for id, index in pairs(rows) do + out.landmarks[id] = { + id = id, index = index, + name = id:gsub("^LANDMARK_", ""):gsub("_", " "), x = 8, y = 8, + } + out.order[index + 1] = id + end + return out +end + +local GOLD_LANDMARKS = landmarkTable({ + LANDMARK_NEW_BARK_TOWN = 0x01, + LANDMARK_ROUTE_29 = 0x02, + LANDMARK_SILVER_CAVE = 0x2d, + LANDMARK_PALLET_TOWN = 0x2e, + LANDMARK_VICTORY_ROAD = 0x57, + LANDMARK_ROUTE_28 = 0x5d, + LANDMARK_FAST_SHIP = 0x5e, +}) + +local CRYSTAL_LANDMARKS = landmarkTable({ + LANDMARK_NEW_BARK_TOWN = 0x01, + LANDMARK_ROUTE_29 = 0x02, + LANDMARK_BATTLE_TOWER = 0x1d, + LANDMARK_SILVER_CAVE = 0x2e, + LANDMARK_PALLET_TOWN = 0x2f, + LANDMARK_VICTORY_ROAD = 0x58, + LANDMARK_ROUTE_28 = 0x5e, + LANDMARK_FAST_SHIP = 0x5f, +}) + +local function townMapScreen(opts) + opts = opts or {} + local input = fakeInput() + local save = opts.save or {} + local popped = 0 + local game = { + input = input, + save = save, + stack = { pop = function() popped = popped + 1 end }, + } + local closed = 0 + local screen = Pokegear.new(game, { + save = save, + landmarks = opts.landmarks or CRYSTAL_LANDMARKS, + currentLandmark = opts.currentLandmark or "LANDMARK_NEW_BARK_TOWN", + townMap = true, + onClose = function() closed = closed + 1 end, + }) + return screen, input, + function() return closed end, function() return popped end +end + +-- ================================================= 1. the screen's own mode +-- +-- _TownMap (engine/pokegear/pokegear.asm:1709) reuses PokegearMap for the art +-- and nothing else off the card: no strip, no ENGINE_MAP_CARD test. +do + local screen = townMapScreen() + eq(#screen.cards, 1, "the poster is one screen, not the card strip") + eq(screen.mode, "card", "and it opens straight onto the map") + eq(screen:card().id, "map", "on the MAP card's own art") + eq(screen.fly, nil, "and it is not the fly picker") +end + +-- The card gate is _FlyMap's absence, not the gear's: a player who has never +-- met the Guide Gent still reads the poster in their bedroom. +do + local screen = townMapScreen({ save = { engineFlags = {} } }) + eq(#screen.cards, 1, "no ENGINE_MAP_CARD is needed to open it") +end + +-- ================================================= 2. the joypad +-- +-- `.loop` (engine/pokegear/pokegear.asm:1783): PAD_B returns, PAD_UP and +-- PAD_DOWN walk wTownMapCursorLandmark, and nothing else is read at all. +do + local screen, input, closed, popped = townMapScreen() + local first = CRYSTAL_LANDMARKS.landmarks.LANDMARK_NEW_BARK_TOWN.index + local last = CRYSTAL_LANDMARKS.landmarks.LANDMARK_SILVER_CAVE.index + eq(screen:mapCursorIndex(), first, "the cursor starts on the player's own") + + input:press("up") + screen:update(0) + eq(screen:mapCursorIndex(), first + 1, "UP steps to the next landmark") + input:press("down") + screen:update(0) + eq(screen:mapCursorIndex(), first, "DOWN steps back") + + -- `cp e / jr nz, .wrap_around_down`: only the first landmark wraps. + input:press("down") + screen:update(0) + eq(screen:mapCursorIndex(), last, "and wraps off the first onto the last") + -- `cp d / jr c, .wrap_around_up`. + input:press("up") + screen:update(0) + eq(screen:mapCursorIndex(), first, "and off the last back onto the first") + + -- Left, right and A are never read by _TownMap's loop. + local held = screen:mapCursorIndex() + for _, button in ipairs({ "left", "right", "a", "start", "select" }) do + input:press(button) + screen:update(0) + end + eq(screen:mapCursorIndex(), held, "no other button moves the cursor") + eq(closed(), 0, "and none of them leaves the map") + + input:press("b") + screen:update(0) + eq(closed(), 1, "B returns from the map") + eq(popped(), 1, "and the screen the special pushed comes back off the stack") + + -- The pop already happened; a second B must not take the overworld with it. + input:press("b") + screen:update(0) + eq(popped(), 1, "a second B pops nothing") +end + +-- ================================================= 3. the limit registers +-- +-- `ld d, KANTO_LANDMARK - 1 / ld e, 1` for Johto and +-- TownMap_GetKantoLandmarkLimits (engine/pokegear/pokegear.asm:714) for Kanto. +-- Both are LANDMARK indices, and Crystal's are not Gold's. +do + local crystal = townMapScreen({ landmarks = CRYSTAL_LANDMARKS }) + local last, first = crystal:cursorLimits() + eq(first, 0x01, "Johto's e is NEW BARK TOWN either way round") + eq(last, 0x2e, "and its d is Crystal's own SILVER CAVE, not Gold's $2d") + + local gold = townMapScreen({ landmarks = GOLD_LANDMARKS }) + local goldLast = gold:cursorLimits() + eq(goldLast, 0x2d, "a Gold landmark table still answers $2d") + + -- A dataset with no landmark records at all keeps the pokegold numbers. + local bare = townMapScreen({ landmarks = { landmarks = {}, order = {} } }) + local bareLast, bareFirst = bare:cursorLimits() + eq(bareLast, 0x2d, "and so does a dataset with no records") + eq(bareFirst, 0x01, "with NEW BARK TOWN still the floor") +end + +-- `cp KANTO_LANDMARK` is the region test, and KANTO_LANDMARK is PALLET_TOWN's +-- own index: $2e on Gold, $2f on Crystal. The byte $2e therefore reads as +-- Kanto on one cart and Johto (SILVER CAVE) on the other. +do + local silver = townMapScreen({ + landmarks = CRYSTAL_LANDMARKS, currentLandmark = "LANDMARK_SILVER_CAVE", + }) + eq(silver:region(), "johto", "Crystal's $2e is SILVER CAVE, so Johto") + local pallet = townMapScreen({ + landmarks = CRYSTAL_LANDMARKS, currentLandmark = "LANDMARK_PALLET_TOWN", + }) + eq(pallet:region(), "kanto", "and its $2f is PALLET TOWN, so Kanto") + local goldPallet = townMapScreen({ + landmarks = GOLD_LANDMARKS, currentLandmark = "LANDMARK_PALLET_TOWN", + }) + eq(goldPallet:region(), "kanto", "Gold's PALLET TOWN is Kanto at $2e") + -- LANDMARK_FAST_SHIP sits past every Kanto landmark and is still Johto. + local ship = townMapScreen({ + landmarks = CRYSTAL_LANDMARKS, currentLandmark = "LANDMARK_FAST_SHIP", + }) + eq(ship:region(), "johto", "and the S.S. Aqua stays Johto at $5f") +end + +-- Kanto's pair, with and without the Hall of Fame on the record. +do + local before = townMapScreen({ + landmarks = CRYSTAL_LANDMARKS, currentLandmark = "LANDMARK_PALLET_TOWN", + save = { flags = {} }, + }) + local lastB, firstB = before:cursorLimits() + eq(firstB, 0x58, "before the Hall of Fame Kanto starts at VICTORY ROAD") + eq(lastB, 0x5e, "and ends at ROUTE 28") + local after = townMapScreen({ + landmarks = CRYSTAL_LANDMARKS, currentLandmark = "LANDMARK_PALLET_TOWN", + save = { flags = { HALL_OF_FAME = true } }, + }) + local _, firstA = after:cursorLimits() + eq(firstA, 0x2f, "and afterwards the whole region opens at PALLET TOWN") +end + +-- ================================================= 4. the tilemap frame +-- +-- _TownMap.InitTilemap (engine/pokegear/pokegear.asm:1843): the rule turns down +-- at (7,0) and runs back out along row 2, which is what boxes the name plate +-- into the top right corner with no card strip above it. +do + local screen = townMapScreen() + local laid = {} + screen.tile = function(_self, id, tx, ty) + laid[tx .. "," .. ty] = id + end + screen:drawTownMapRule() + + eq(laid["0,0"], 0x06, "$06 caps the rule at (0,0)") + local run = true + for x = 1, 6 do run = run and laid[x .. ",0"] == 0x07 end + check(run, "$07 runs (1,0) to (6,0), the `ld bc, 6` ByteFill") + eq(laid["7,0"], 0x17, "$17 turns it down at (7,0)") + eq(laid["7,1"], 0x16, "$16 carries it through (7,1)") + eq(laid["7,2"], 0x26, "$26 turns it back out at (7,2)") + local tail = true + for x = 8, 18 do tail = tail and laid[x .. ",2"] == 0x07 end + check(tail, "$07 runs (8,2) to (18,2), the NAME_LENGTH ByteFill") + eq(laid["19,2"], 0x17, "$17 caps it at (19,2)") + eq(laid["8,1"], nil, "and nothing is laid inside the name plate") + + -- The MAP card's own rule is the other shape: a full-width bar under the + -- two-row card strip. The poster must not draw that. + local card = Pokegear.new({ input = fakeInput(), save = {} }, { + save = { pokegearFlags = { map = true } }, + landmarks = CRYSTAL_LANDMARKS, + currentLandmark = "LANDMARK_NEW_BARK_TOWN", + }) + eq(card.townMap, nil, "the POKeGEAR card is not in town-map mode") + check(#card.cards > 1, "and it keeps its card strip") +end + +-- Drawing with no town-map art at all: a crash check on the unstyled fallback. +do + local screen = townMapScreen() + check(not screen:styled(), "this harness has no gear sheet") + check(pcall(function() screen:draw() end), "the poster still draws") +end + +-- ================================================= 5. the specials +-- +-- World:specialHooks, stubbed down to what these two reach for. +local function newHooks(opts) + opts = opts or {} + local log = { pushed = {}, diploma = 0 } + local hooks = { + log = log, + save = function() return opts.save or {} end, + data = function() return {} end, + party = function() return {} end, + } + if not opts.noScreens then + hooks.pushScreen = function(id, screenOpts) + log.pushed[#log.pushed + 1] = { id = id, opts = screenOpts } + if opts.pushFails then return false end + log.pending = screenOpts.onClose + if not opts.hold and screenOpts.onClose then screenOpts.onClose() end + return true + end + hooks.showDiploma = function(onDone) + log.diploma = log.diploma + 1 + log.pending = onDone + if not opts.hold and onDone then onDone() end + end + end + return hooks +end + +local function newVm(hooks, scriptVar) + local vm = Vm.new({}, {}, Events.new(), { specials = hooks }) + vm.showTextFn = function() end + vm.scriptVar = scriptVar or 0 + return vm +end + +-- Run a handler to its first park (or to the end), the way the VM runs it. +local function run(vm, handler) + local co = coroutine.create(function() handler(vm) end) + vm.co = co + local ok, req = coroutine.resume(co) + if not ok then error(req, 0) end + return co, req +end + +-- ---- OverworldTownMap ------------------------------------------------------ + +check(H.OverworldTownMap ~= nil, "OverworldTownMap has a handler") +eq(Specials.STUBS.OverworldTownMap, nil, "and is no longer a stub") +check(Specials.SUPERSEDED_STUBS.OverworldTownMap ~= nil, + "its old reason moved to the superseded ledger") + +do + local hooks = newHooks() + local vm = newVm(hooks, 7) + local co = run(vm, H.OverworldTownMap) + eq(coroutine.status(co), "dead", "an answering screen runs it straight out") + eq(#hooks.log.pushed, 1, "one screen is pushed") + eq(hooks.log.pushed[1].id, "Gen2Pokegear", "which is the POKeGEAR's own map") + eq(hooks.log.pushed[1].opts.townMap, true, "in _TownMap's chrome-free mode") + -- FadeToMenu / farcall _TownMap / ExitAllMenus writes no wScriptVar, and the + -- callers' next op is a bare `closetext`. + eq(vm.scriptVar, 7, "and wScriptVar is left exactly as `special` found it") +end + +-- The block is real: the coroutine parks until the screen answers. +do + local hooks = newHooks({ hold = true }) + local vm = newVm(hooks, 0) + local co = run(vm, H.OverworldTownMap) + eq(coroutine.status(co), "suspended", "the script waits on the map") + hooks.log.pending() + eq(coroutine.status(co), "dead", "and only B off the map resumes it") +end + +-- A run with no screen to push (a headless probe) must still not fall through +-- into the next command with a stale wScriptVar. +do + local hooks = newHooks({ pushFails = true }) + local vm = newVm(hooks, 3) + local co = run(vm, H.OverworldTownMap) + eq(coroutine.status(co), "dead", "a refused push does not hang the script") + eq(vm.scriptVar, 3, "and still leaves wScriptVar alone") +end +do + local hooks = newHooks({ noScreens = true }) + local vm = newVm(hooks, 3) + local co = run(vm, H.OverworldTownMap) + eq(coroutine.status(co), "dead", "and neither does no pushScreen hook") + eq(vm.scriptVar, 3, "with wScriptVar untouched") +end + +-- ---- PrintDiploma ---------------------------------------------------------- + +check(H.PrintDiploma ~= nil, "PrintDiploma has a handler") +eq(Specials.STUBS.PrintDiploma, nil, "and is no longer a stub") +check(Specials.SUPERSEDED_STUBS.PrintDiploma ~= nil, + "its printer reason moved to the superseded ledger") + +do + local hooks = newHooks() + local vm = newVm(hooks, 5) + local co = run(vm, H.PrintDiploma) + eq(coroutine.status(co), "dead", "the page runs out") + eq(hooks.log.diploma, 1, "PlaceDiplomaOnScreen is the routine's first act") + eq(vm.scriptVar, 5, "and _PrintDiploma writes no wScriptVar either") +end + +do + local hooks = newHooks({ hold = true }) + local vm = newVm(hooks, 0) + local co = run(vm, H.PrintDiploma) + eq(coroutine.status(co), "suspended", "the script waits on the page") + hooks.log.pending() + eq(coroutine.status(co), "dead", "and the dismissal resumes it") +end + +do + local hooks = newHooks({ noScreens = true }) + local vm = newVm(hooks, 4) + local co = run(vm, H.PrintDiploma) + eq(coroutine.status(co), "dead", "no diploma hook is not a hang") + eq(vm.scriptVar, 4, "and wScriptVar survives") +end + +-- ---- UnusedMemoryGame ------------------------------------------------------ +-- +-- DELIBERATELY UNREACHABLE, and not a Crystal gap: `add_special +-- UnusedMemoryGame ; unused` is the row in BOTH carts +-- (pokegold data/events/special_pointers.asm:63, +-- ../pokecrystal/data/events/special_pointers.asm:58) and no script bytecode +-- in either ROM points at it. _MemoryGame (engine/games/memory_game.asm) is a +-- 590-line Game Corner screen with its own board, cursor sprite anim and coin +-- payout, so porting it would be a whole new screen reachable by nobody. +-- UnusedDummySpecial next to it is a bare `ret` and IS ported, because that +-- costs one line; this one is not, and stays a stub with its reason recorded. +check(Specials.STUBS.UnusedMemoryGame ~= nil, + "UnusedMemoryGame stays a stub: no cart script reaches it") +check(type(Specials.STUB_REASONS.UnusedMemoryGame) == "string", + "and it still says why") +-- engine/events/specials.asm:207 is CheckCoinsAndCoinCase then +-- StartGameCornerGame, neither of which writes wScriptVar. +do + local vm = newVm(newHooks(), 9) + Specials.STUBS.UnusedMemoryGame(vm) + eq(vm.scriptVar, 9, "and leaves wScriptVar alone, as the routine does") +end + +S.finish() diff --git a/tests/gen2_crystal_vars_test.lua b/tests/gen2_crystal_vars_test.lua new file mode 100644 index 00000000..9944a0b5 --- /dev/null +++ b/tests/gen2_crystal_vars_test.lua @@ -0,0 +1,401 @@ +-- The six .VarActionTable rows Crystal appends past VAR_SPECIALPHONECALL, and +-- TryQuickSave -- the save Link_SaveGame runs behind the Battle Tower desk. +-- ROM-free: +-- luajit tests/gen2_crystal_vars_test.lua +-- +-- ../pokecrystal/constants/script_constants.asm:69-74, +-- ../pokecrystal/engine/overworld/variables.asm:62-67, +-- engine/link/link.asm:2356 and engine/menus/save.asm:63. +-- +-- The point of the World half is that these reads and writes land in the SAVE. +-- World.scriptVars is rebuilt empty on every map load (src/world/gen2/World.lua +-- :579), so a var parked there is a var Buena's Blue Card loses the moment the +-- player walks out of the Radio Tower. +package.path = "./?.lua;./?/init.lua;" .. package.path + +love = love or {} +love.graphics = love.graphics or { + getColor = function() return 1, 1, 1, 1 end, + setColor = function() end, + rectangle = function() end, + print = function() end, + printf = function() end, + draw = function() end, + newQuad = function() return {} end, + newImage = function() return nil end, + getShader = function() return nil end, + setShader = function() end, + newShader = function() error("no shaders in this harness") end, + getDimensions = function() return 160, 144 end, + push = function() end, pop = function() end, + translate = function() end, scale = function() end, + circle = function() end, clear = function() end, +} +love.math = love.math or { random = function(a, b) return b and a or 1 end } +love.image = love.image or {} +love.filesystem = love.filesystem or { + load = function() return nil end, + getInfo = function() return nil end, + read = function() return nil end, +} +love.timer = love.timer or { getTime = function() return 0 end } + +local S = require("tests.harness").suite("gen2 crystal vars") +local check, eq = S.check, S.eq + +require("src.core.Logger").warn = function() end + +local Apricorns = require("src.core.gen2.Apricorns") +local Events = require("src.world.gen2.Events") +local Save = require("src.core.gen2.Save") +local SaveSerializer = require("src.core.SaveSerializer") +local Specials = require("src.script.gen2.Specials") +local Vm = require("src.script.gen2.Vm") +local World = require("src.world.gen2.World") + +local H = Specials.HANDLERS + +-- ../pokecrystal/constants/script_constants.asm:69-74. +local VAR_BT_WIN_STREAK = 0x15 +local VAR_KURT_APRICORNS = 0x16 +local VAR_CALLERID = 0x17 +local VAR_BLUECARDBALANCE = 0x18 +local VAR_BUENASPASSWORD = 0x19 +local VAR_KENJI_BREAK = 0x1a + +-- ---------------------------------------------------------------- fixtures + +local DATA = { + audio = {}, + items = { + LEVEL_BALL = { index = 5, name = "LEVEL BALL" }, + RED_APRICORN = { index = 78, name = "RED APRICORN" }, + BLU_APRICORN = { index = 79, name = "BLU APRICORN" }, + }, + pokemon = {}, + moves = {}, +} + +local function newSave() + local save = { + version = "crystal", + player = { name = "KRIS", id = 0x1234, money = 0 }, + party = {}, + inventory = {}, + bagOrder = {}, + boxes = {}, + } + Save.crystalState(save) + Save.battleTowerState(save) + return save +end + +local function newWorld(save) + local game = { data = DATA, save = save, stack = nil } + local world = World.new(game) + world.vm = { curPhoneCaller = 0 } + return world, game +end + +-- ============================================ the ids, against the cart's own +do + local save = newSave() + local world = newWorld(save) + -- .VarActionTable is walked by index, so a row in the wrong slot reads a + -- different variable. Pin the six by writing a distinct value into each + -- store and reading it back through the id the script byte carries. + Save.battleTowerState(save).streak = 4 + save.kurtApricornQuantity = 3 + world.vm.curPhoneCaller = 11 + Save.crystalState(save).buenaPassword.balance = 17 + Save.crystalState(save).buenaPassword.word = 0x52 + Save.crystalState(save).kenjiBreak = 5 + + eq(world:readVar(VAR_BT_WIN_STREAK), 4, "$15 is wNrOfBeatenBattleTowerTrainers") + eq(world:readVar(VAR_KURT_APRICORNS), 3, "$16 is wKurtApricornQuantity") + eq(world:readVar(VAR_CALLERID), 11, "$17 is wCurCaller") + eq(world:readVar(VAR_BLUECARDBALANCE), 17, "$18 is wBlueCardBalance") + eq(world:readVar(VAR_BUENASPASSWORD), 0x52, "$19 is wBuenasPassword") + eq(world:readVar(VAR_KENJI_BREAK), 5, "$1a is wKenjiBreakTimer") + -- NUM_VARS' own guard: nothing above the table answers with a neighbour. + eq(world:readVar(0x1b), 0, "$1b is past the table and reads 0") +end + +-- ================================================= the three writable rows +-- +-- ../pokecrystal/engine/overworld/variables.asm:21-25: only a RETVAR_ADDR_DE +-- row hands `Script_writevar` the variable's own address. The other three +-- rows write wStringBuffer2, which nothing reads back. +do + local save = newSave() + local world = newWorld(save) + + world:writeVar(VAR_BLUECARDBALANCE, 6) + eq(Save.crystalState(save).buenaPassword.balance, 6, + "writevar VAR_BLUECARDBALANCE lands in the save") + eq(world:readVar(VAR_BLUECARDBALANCE), 6, "and reads straight back") + + world:writeVar(VAR_BUENASPASSWORD, 0x31) + eq(Save.crystalState(save).buenaPassword.word, 0x31, + "writevar VAR_BUENASPASSWORD lands in the save") + + world:writeVar(VAR_CALLERID, 9) + eq(world.vm.curPhoneCaller, 9, "loadvar VAR_CALLERID parks wCurCaller") + eq(world:readVar(VAR_CALLERID), 9, "and the callee scripts read it back") + + Save.battleTowerState(save).streak = 2 + world:writeVar(VAR_BT_WIN_STREAK, 99) + eq(Save.battleTowerState(save).streak, 2, + "a RETVAR_STRBUF2 row is not writable") + eq(world:readVar(VAR_BT_WIN_STREAK), 2, "so the streak is unchanged") + + -- One byte wide, `ld [de], a`. + world:writeVar(VAR_BLUECARDBALANCE, 300) + eq(world:readVar(VAR_BLUECARDBALANCE), 300 % 256, "the store is one byte") +end + +-- =========================================== they survive a save and a reload +-- +-- The whole bug: scriptVars is rebuilt empty at World.lua:579 and never +-- serialized, so a balance parked there is gone by the next map. +do + local save = newSave() + local world = newWorld(save) + world:writeVar(VAR_BLUECARDBALANCE, 12) + world:writeVar(VAR_BUENASPASSWORD, 0x24) + + eq(world.scriptVars[VAR_BLUECARDBALANCE], 12, + "the scratch mirror still holds it in this session") + world.scriptVars = {} + eq(world:readVar(VAR_BLUECARDBALANCE), 12, + "and a map load that clears the mirror does not lose it") + + local reloaded = SaveSerializer.decode(SaveSerializer.encode(save)) + Save.normalize(reloaded) + local second = newWorld(reloaded) + eq(second:readVar(VAR_BLUECARDBALANCE), 12, "a reload still has the balance") + eq(second:readVar(VAR_BUENASPASSWORD), 0x24, "and the day's password") +end + +-- ============================ ../pokecrystal/maps/RadioTower2F.asm:144-146 +-- +-- readvar VAR_BLUECARDBALANCE / addval 1 / writevar VAR_BLUECARDBALANCE +-- +-- run through the VM against a real World, which is the round trip the gate +-- caught reading `blue card balance: 0`. +do + local save = newSave() + local world = newWorld(save) + local vm = Vm.new({}, {}, Events.new(), { + readVar = function(id) return world:readVar(id) end, + writeVar = function(id, value) world:writeVar(id, value) end, + }) + local function awardPoint() + vm:start({ + { op = "readvar", var = VAR_BLUECARDBALANCE }, + { op = "addval", args = { 1 } }, + { op = "writevar", var = VAR_BLUECARDBALANCE }, + }) + local guard = 0 + while vm:running() and guard < 64 do + vm:update() + guard = guard + 1 + end + check(not vm:running(), "the three rows ran to the end") + end + awardPoint() + eq(world:readVar(VAR_BLUECARDBALANCE), 1, "a correct password is worth 1") + awardPoint() + awardPoint() + eq(Save.crystalState(save).buenaPassword.balance, 3, + "three shows is three points, in the save") +end + +-- ======================================= Kurt's quantity, the other dead var +-- +-- ../pokecrystal/maps/KurtsHouse.asm:197 is +-- `verbosegiveitemvar LEVEL_BALL, VAR_KURT_APRICORNS`, so a var that reads 0 +-- hands over nothing at all. +do + local save = newSave() + save.inventory = { RED_APRICORN = 1 } + local world = newWorld(save) + local quantities = {} + local hooks = { + save = function() return save end, + data = function() return DATA end, + itemName = function(id) return (DATA.items[id] or {}).name or id end, + itemIndex = function(id) return (DATA.items[id] or {}).index end, + setKurtApricornQuantity = function(n) + quantities[#quantities + 1] = n + world:setKurtApricornQuantity(n) + end, + scriptMenu = function(_header, onChoose) onChoose(1) end, + } + local vm = Vm.new({}, {}, Events.new(), { specials = hooks }) + vm.showTextFn = function() end + vm.co = coroutine.create(function() H.SelectApricornForKurt(vm) end) + local ok, err = coroutine.resume(vm.co) + check(ok, "SelectApricornForKurt ran: " .. tostring(err)) + eq(quantities[1], 0, "kurt.asm:24 clears the byte on the way in") + eq(quantities[2], 1, "and kurt.asm:45 records the apricorn it tossed") + eq(world:readVar(VAR_KURT_APRICORNS), 1, + "so verbosegiveitemvar hands over one ball, not none") + eq(save.inventory.RED_APRICORN, nil, "the apricorn left the pack") + -- .GaveKurtApricorns' own setevent, which the map script runs, not this + -- handler: the count must not be conditioned on it. + check(Apricorns.pending(save) == nil, "the event is still the script's to set") + + -- The cancel arm leaves the byte at zero, which is the `xor a` at :24. + local cancelled = {} + hooks.setKurtApricornQuantity = function(n) cancelled[#cancelled + 1] = n end + hooks.scriptMenu = function(header, onChoose) onChoose(#header.items) end + local vm2 = Vm.new({}, {}, Events.new(), { specials = hooks }) + vm2.showTextFn = function() end + vm2.co = coroutine.create(function() H.SelectApricornForKurt(vm2) end) + coroutine.resume(vm2.co) + eq(#cancelled, 1, "a cancel writes the byte once") + eq(cancelled[1], 0, "and leaves it at zero") +end + +-- ========================== SampleKenjiBreakCountdown, the KENJI_BREAK writer +-- +-- ../pokecrystal/engine/overworld/time.asm:136: `Random / and %11 / add 3`. +do + eq(Specials.STUB_REASONS.SampleKenjiBreakCountdown, nil, + "SampleKenjiBreakCountdown is no longer a stub") + local save = newSave() + local world = newWorld(save) + local hooks = { setKenjiBreak = function(days) world:setKenjiBreak(days) end } + local vm = Vm.new({}, {}, Events.new(), { specials = hooks }) + local seen = {} + local priorRandom = Specials.random + for roll = 1, 4 do + Specials.random = function() return roll end + H.SampleKenjiBreakCountdown(vm) + seen[#seen + 1] = world:readVar(VAR_KENJI_BREAK) + end + Specials.random = priorRandom + eq(table.concat(seen, ","), "3,4,5,6", "three to six days, inclusive") + eq(Save.crystalState(save).kenjiBreak, 6, "and the countdown is in the save") +end + +-- ================================================================ TryQuickSave +-- +-- engine/link/link.asm:2356 -> engine/menus/save.asm:63 Link_SaveGame. +-- ../pokecrystal/maps/BattleTower1F.asm:84-85 is `special TryQuickSave / +-- iffalse Script_Menu_ChallengeExplanationCancel`, so a FALSE here is a challenge that +-- never starts. +do + eq(Specials.STUB_REASONS.TryQuickSave, nil, "TryQuickSave is no longer a stub") + eq(Specials.HANDLER_SOURCE.TryQuickSave, "Specials.lua", + "and Specials.lua owns the handler") +end + +local function runQuickSave(opts) + local save = newSave() + local log = { writes = 0, sfx = {} } + local hooks = { + save = function() return save end, + data = function() return DATA end, + saveFileState = function() return opts.exists, opts.sameId end, + writeSave = function() + log.writes = log.writes + 1 + return opts.writeOk ~= false + end, + playSfxNamed = function(name) log.sfx[#log.sfx + 1] = name end, + } + local vm = Vm.new({}, {}, Events.new(), { specials = hooks }) + vm.showTextFn = function() end + local pages, holds, asked = {}, {}, 0 + local co = coroutine.create(function() H.TryQuickSave(vm) end) + vm.co = co + local send + while true do + local ok, req = coroutine.resume(co, send) + if not ok then error(req, 0) end + if coroutine.status(co) == "dead" then break end + send = nil + if type(req) == "table" and req.kind == "text" then + pages[#pages + 1] = req.text + holds[#holds + 1] = req.hold or 0 + elseif type(req) == "table" and req.kind == "yesorno" then + asked = asked + 1 + send = opts.answers and opts.answers[asked] + else + error("TryQuickSave parked on " .. tostring(req and req.kind), 0) + end + end + log.pages, log.holds, log.asked = pages, holds, asked + log.scriptVar = vm.scriptVar + return log +end + +-- .yoursavefile: an existing file with this player's ID. +do + local log = runQuickSave({ exists = true, sameId = true, answers = { true } }) + eq(log.asked, 1, "AskOverwriteSaveFile asks once") + check(log.pages[1]:find("already a", 1, true) ~= nil, + "AlreadyASaveFileText is the question: " .. tostring(log.pages[1])) + eq(log.writes, 1, "_SaveGameData ran") + eq(log.scriptVar, 1, "and wScriptVar is TRUE") + check(log.pages[2]:find("SAVING", 1, true) ~= nil, "SAVING page printed") + eq(log.holds[2], 16 + 32, "held for save.asm:247 + :251") + check(log.pages[3]:find("KRIS saved", 1, true) ~= nil, + "SavedTheGameText names the player: " .. tostring(log.pages[3])) + eq(log.holds[3], 30 + 30, "held for save.asm:269 + link.asm:2367") + eq(log.sfx[1], "Sfx_Save", "SFX_SAVE rang") +end + +-- .refused: `jr nz, .refused / scf`, which TryQuickSave turns into FALSE. +do + local log = runQuickSave({ exists = true, sameId = true, answers = { false } }) + eq(log.asked, 1, "the question was asked") + eq(log.writes, 0, "NO writes nothing") + eq(log.scriptVar, 0, "and wScriptVar is FALSE") + eq(#log.pages, 1, "no SAVING page follows a refusal") +end + +-- The other ID: AnotherSaveFileText, and .erase rather than .ok. +do + local log = runQuickSave({ exists = true, sameId = false, answers = { true } }) + check(log.pages[1]:find("another", 1, true) ~= nil, + "AnotherSaveFileText: " .. tostring(log.pages[1])) + eq(log.writes, 1, "and it still saves") + eq(log.scriptVar, 1, "TRUE") +end + +-- `ld a, [wSaveFileExists] / and a / jr z, .erase`: no file, no question. +do + local log = runQuickSave({ exists = false, sameId = false }) + eq(log.asked, 0, "a first save is not asked to overwrite anything") + eq(log.writes, 1, "it just writes") + eq(log.scriptVar, 1, "TRUE") +end + +-- The one refusal the cart has no equivalent for: a mod vetoing save.write. +do + local log = runQuickSave({ exists = false, writeOk = false }) + eq(log.writes, 1, "the write was attempted") + eq(log.scriptVar, 0, "a refused write is the same FALSE as a refused prompt") +end + +-- ====================================== the World half of the two save hooks +do + local save = newSave() + local world, game = newWorld(save) + local wrote = 0 + game.writeSave = function() wrote = wrote + 1 return true end + check(world:writeSave() == true, "World:writeSave goes through Game2:writeSave") + eq(wrote, 1, "exactly once") + game.writeSave = function() return false end + check(world:writeSave() == false, "and a vetoed write reports false") + game.writeSave = nil + check(world:writeSave() == false, "with no game there is nothing to write") + + local hooks = world:specialHooks() + check(type(hooks.writeSave) == "function", "the writeSave hook is threaded") + check(type(hooks.saveFileState) == "function", "so is saveFileState") +end + +S.finish() diff --git a/tests/gen2_font_ui_test.lua b/tests/gen2_font_ui_test.lua index af499a5d..7e51e150 100644 --- a/tests/gen2_font_ui_test.lua +++ b/tests/gen2_font_ui_test.lua @@ -158,10 +158,17 @@ else if path:find("font%.png$") then images[path].getDimensions = function() return 128, 64 end end + -- One row per frame style, all eight (pokegold/gfx/font.asm:10). + if path:find("frames%.png$") then + images[path].getDimensions = function() return 48, 64 end + end return images[path] end Font.load({ font = fontDef }) require("src.render.Assets").image = realImage + -- currentFrame is a Font module-local that outlives a suite, and this file + -- is also dofile'd into tests/run_tests.lua after screens that cycle it. + Font.setFrame(1) -- Which sheet a code lands on, by the image drawCode reaches for. local drawn @@ -186,11 +193,18 @@ else "the swap runs to the last of the 25 tiles it loads") -- `jr LoadFrame` at the end of _LoadFontsBattleExtra: $79-$7e are the -- textbox frame on a battle-sheet screen too, so a box drawn there is the - -- same box as everywhere else. - for code, name in pairs({ [0x79] = "tl", [0x7a] = "h", [0x7b] = "tr", - [0x7c] = "v", [0x7d] = "bl", [0x7e] = "br" }) do - eq(sheetOf(code), "font_extra.png", - ("LoadFrame keeps the %s border glyph off the battle sheet"):format(name)) + -- same box as everywhere else. LoadFrame reads the `Frames` label, not + -- FontExtra (pokegold/engine/gfx/load_font.asm:29-39). + -- A cache built before the extractor split Frames out has no imageFrames + -- row, and its $79-$7e fall back to the extra sheet's baked-in frame 1. + if not fontDef.imageFrames then + check(true, "cache predates the frames sheet (SKIP the border routing)") + else + for code, name in pairs({ [0x79] = "tl", [0x7a] = "h", [0x7b] = "tr", + [0x7c] = "v", [0x7d] = "bl", [0x7e] = "br" }) do + eq(sheetOf(code), "frames.png", + ("LoadFrame keeps the %s border glyph off the battle sheet"):format(name)) + end end Font.useBattleExtra(false) love.graphics.draw = realDraw @@ -369,11 +383,16 @@ stopRecording() local dexLine = findPrint("№.") check(dexLine ~= nil, "the roster line places the No ligature") -check(dexLine and dexLine.battleExtra == true, - "with the battle sheet in the $60 slot, where that glyph lives") local idLine = findPrint("№/") -check(idLine ~= nil and idLine.battleExtra == true, - "and so does the trainer id line") +-- Which sheet a glyph resolves against needs the cache's real font rows. +if not fontDef then + check(true, "no Gold cache (SKIP the battle-sheet routing)") +else + check(dexLine and dexLine.battleExtra == true, + "with the battle sheet in the $60 slot, where that glyph lives") + check(idLine ~= nil and idLine.battleExtra == true, + "and so does the trainer id line") +end eq(Font.battleExtraActive(), false, "the sheet the caller had is put back when the screen is done") @@ -392,10 +411,14 @@ photo:draw() stopRecording() local photoDex = findPrint("№.") -check(photoDex ~= nil and photoDex.battleExtra == true, - "the photo card's No ligature resolves against the battle sheet") local photoId = findPrint("№") -check(photoId ~= nil and photoId.battleExtra == true, "and its does too") +if not fontDef then + check(true, "no Gold cache (SKIP the photo card's battle-sheet routing)") +else + check(photoDex ~= nil and photoDex.battleExtra == true, + "the photo card's No ligature resolves against the battle sheet") + check(photoId ~= nil and photoId.battleExtra == true, "and its does too") +end eq(Font.battleExtraActive(), false, "and the card puts the sheet back") S.finish() diff --git a/tests/gen2_menus_test.lua b/tests/gen2_menus_test.lua index 6b175588..8c0934b2 100644 --- a/tests/gen2_menus_test.lua +++ b/tests/gen2_menus_test.lua @@ -357,8 +357,9 @@ local options = OptionsMenu.new(optionsGame, { options = Save.defaultOptions(), }) -- The cart's seven rows, then the port's: CONTROLS, audio, speed, display, --- video mode, the mobile-gated touch three (buildRows), MAX FPS and CANCEL. -check("twenty-three rows", #OptionsMenu.ROWS, 23) +-- video mode, screen position, the mobile-gated touch three (buildRows), +-- MAX FPS and CANCEL. +check("twenty-four rows", #OptionsMenu.ROWS, 24) check("the cart's rows come first", OptionsMenu.ROWS[7].key, "frame") check("then the rebind screen", OptionsMenu.ROWS[8].id, "controls") check("then the port's audio group", OptionsMenu.ROWS[9].key, "musicVol") @@ -965,7 +966,9 @@ check("and TILT follows VOID FILL", OptionsMenu.ROWS[zoomIndex + 2].label, "TILT") check("VIDEO MODE follows GBC FX", OptionsMenu.ROWS[gbcfxIndex + 1].label, "VIDEO MODE") -check("and TOUCH PAD follows it", OptionsMenu.ROWS[gbcfxIndex + 2].label, +check("and SCREEN POS follows it", OptionsMenu.ROWS[gbcfxIndex + 2].label, + "SCREEN POS") +check("and TOUCH PAD follows that", OptionsMenu.ROWS[gbcfxIndex + 3].label, "TOUCH PAD") local videoRow = select(2, rowNamed("VIDEO MODE")) diff --git a/tests/gen2_reflect_overflow_test.lua b/tests/gen2_reflect_overflow_test.lua new file mode 100644 index 00000000..12fed752 --- /dev/null +++ b/tests/gen2_reflect_overflow_test.lua @@ -0,0 +1,183 @@ +-- TruncateHL_BC (../pokegold/engine/battle/effect_commands.asm:2625, +-- ../pokecrystal/engine/battle/effect_commands.asm:2614). +-- +-- luajit tests/gen2_reflect_overflow_test.lua +-- +-- ROM-free. The cart hands BattleCommand_DamageCalc one-byte stats, so a +-- 16-bit attack/defence pair is shifted right twice -- both together, so the +-- ratio survives -- and the low byte taken. Gold runs that pass exactly once +-- and keeps whatever the low byte then holds, so Reflect or Light Screen on a +-- 512+ defence pushes the doubled value to 1024 and the truncated byte wraps +-- to 0; DamageCalc's minimum-defence check turns that into 1 and the hit caps. +-- Crystal repeats the pass until both stats fit, which is the fix CT-10 names +-- reflectOverflow. Crystal kept the old arithmetic under LINK_COLOSSEUM; the +-- Gen 2 battle engine here has no link mode, so only the single-player halves +-- are pinned. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 reflect overflow") +local check, eq = S.check, S.eq + +local GameVersion = require("src.core.GameVersion") +local Damage = require("src.battle.gen2.Damage") + +local restore = GameVersion.get() + +-- One NORMAL physical hit with no type table, no STAB and the damage roll +-- pinned at 100%, so the only moving part is the truncated defence. +local function hit(version, defense, screen) + GameVersion.set(version) + return (Damage.calc({ + level = 50, power = 100, moveType = "NORMAL", + attacker = { attack = 200 }, + defender = { defense = defense }, + screen = screen, variation = 100, + })) +end + +local function truncate(version, attack, defense) + GameVersion.set(version) + return Damage.truncateStats(attack, defense, + GameVersion.fixes().reflectOverflow == true) +end + +-- --------------------------------------------------------- the gate itself + +do + eq(GameVersion.fixes("gold").reflectOverflow, nil, + "Gold keeps the cart's single truncation pass") + eq(GameVersion.fixes("silver").reflectOverflow, nil, + "Silver keeps it too") + eq(GameVersion.fixes("crystal").reflectOverflow, true, + "Crystal is the version that loops") +end + +-- ------------------------------------------------- below the truncate line + +do + -- Both stats already fit in a byte, so TruncateHL_BC returns at once and + -- every ordinary battle is untouched by either arm. + local a, d = truncate("gold", 200, 100) + eq(a, 200, "an 8-bit attack passes through") + eq(d, 100, "an 8-bit defence passes through") + eq(hit("gold", 100, false), 90, "Gold, defence 100, no screen") + eq(hit("crystal", 100, false), 90, "Crystal agrees") + eq(hit("gold", 100, true), 46, "Gold, defence 100 doubled to 200") + eq(hit("crystal", 100, true), 46, "Crystal agrees") +end + +-- ----------------------------------------- one pass, which both games share + +do + -- 511 doubled is 1022; one >>2 gives 255, which fits, so Crystal's loop + -- never runs a second time and the two versions still agree. This is the + -- largest defence Reflect can double without the wrap. + local ga, gd = truncate("gold", 200, 511 * 2) + local ca, cd = truncate("crystal", 200, 511 * 2) + eq(gd, 255, "1022 >> 2 is 255, the last value that fits") + eq(ga, 50, "the attack is shifted with it, 200 >> 2") + eq(cd, 255, "Crystal's loop exits on the same pass") + eq(ca, 50, "and leaves the attack alone as well") + eq(hit("gold", 511, true), 10, "Gold, defence 511 doubled") + eq(hit("crystal", 511, true), 10, "Crystal, defence 511 doubled") +end + +do + -- A big defence with no screen cannot reach 1024 on its own (stats cap at + -- 999), so the gate must not move any unscreened hit. + for _, defense in ipairs({ 256, 400, 512, 700, 999 }) do + eq(hit("gold", defense, false), hit("crystal", defense, false), + ("defence %d without a screen is version-independent"):format(defense)) + end + eq(hit("gold", 999, false), 10, "defence 999 unscreened, both versions") +end + +-- ------------------------------------------------------------- the wrap + +do + -- 512 doubled is exactly 1024. Gold: 1024 >> 2 = 256, low byte 0, and + -- DamageCalc's `ld c, 1` turns that into a defence of 1. Crystal: a second + -- pass takes 256 -> 64 and the attack 50 -> 12. + local ga, gd = truncate("gold", 200, 1024) + eq(gd, 0, "Gold truncates 1024 to a defence byte of 0") + eq(ga, 50, "Gold's attack byte after the single pass") + local ca, cd = truncate("crystal", 200, 1024) + eq(cd, 64, "Crystal shifts again, 256 >> 2") + eq(ca, 12, "and the attack with it, 50 >> 2") + + -- 22 * 100 * 50 / 1 / 50 = 2200, capped to 997 + 2. + eq(hit("gold", 512, true), 999, "Gold's Reflect caps the hit at 999") + -- 22 * 100 * 12 / 64 / 50 = 8, + 2. + eq(hit("crystal", 512, true), 10, "Crystal's Reflect keeps the hit at 10") + check(hit("gold", 512, false) == 19, + "and the same defence unscreened is 19 on both") + check(hit("gold", 512, true) > hit("gold", 512, false), + "Gold's Reflect makes the defender take MORE damage") + check(hit("crystal", 512, true) < hit("crystal", 512, false), + "Crystal's Reflect halves it, as it should") +end + +do + -- The worst case the cart can build: a 999 defence doubled to 1998. + -- Gold: 1998 >> 2 = 499, low byte 243. Crystal: 499 >> 2 = 124, attack 12. + local ga, gd = truncate("gold", 200, 999 * 2) + eq(gd, 243, "Gold wraps 499 to 243") + eq(ga, 50, "Gold's attack byte") + local ca, cd = truncate("crystal", 200, 999 * 2) + eq(cd, 124, "Crystal shifts 499 to 124") + eq(ca, 12, "and the attack to 12") + eq(hit("gold", 999, true), 11, "Gold: Reflect on a 999 defence deals 11") + eq(hit("crystal", 999, true), 6, "Crystal: the same hit deals 6") + eq(hit("gold", 999, false), 10, "unscreened it is 10, so the screen HURTS") +end + +-- ------------------------------------------------ the minimum-1 arms + +do + -- `ld a, c / or b / jr nz / inc c` and its hl twin: a stat that shifts down + -- to zero is forced back to 1 before the next pass, on both versions. + local ga, gd = truncate("gold", 3, 2000) + eq(ga, 1, "Gold: an attack of 3 shifts to 0 and is forced to 1") + eq(gd, 244, "Gold: 2000 >> 2 = 500, low byte 244") + local ca, cd = truncate("crystal", 3, 2000) + eq(ca, 1, "Crystal: the forced 1 shifts to 0 and is forced again") + eq(cd, 125, "Crystal: 500 >> 2 = 125") +end + +-- ------------------------------------------------------------- the override + +do + -- The gate is readable per call, which is where a LINK_COLOSSEUM carve-out + -- would hang if the Gen 2 engine ever grows one. + GameVersion.set("crystal") + local bugged = Damage.calc({ + level = 50, power = 100, moveType = "NORMAL", + attacker = { attack = 200 }, defender = { defense = 512 }, + screen = true, variation = 100, reflectOverflowFixed = false, + }) + eq(bugged, 999, "Crystal forced onto the bugged arm matches Gold") + GameVersion.set("gold") + local fixed = Damage.calc({ + level = 50, power = 100, moveType = "NORMAL", + attacker = { attack = 200 }, defender = { defense = 512 }, + screen = true, variation = 100, reflectOverflowFixed = true, + }) + eq(fixed, 10, "Gold forced onto the fixed arm matches Crystal") +end + +-- ------------------------------------------------------- the 999 stat cap + +do + -- ApplyStatLevelMultiplier caps at MAX_STAT_VALUE before anything doubles + -- it (../pokecrystal/engine/battle/core.asm:6739), which is what bounds the + -- doubled defence at 1998 rather than letting +6 stages run past it. + eq(Damage.applyStage(999, 6), 999, "a +6 stage cannot pass 999") + eq(Damage.applyStage(250, 6), 999, "250 x4 is 1000, capped to 999") + eq(Damage.applyStage(249, 6), 996, "249 x4 stays below the cap") + eq(Damage.applyStage(1, -6), 1, "and a stat never reaches 0") +end + +GameVersion.set(restore) + +S.finish() diff --git a/tests/gen2_rom_text_test.lua b/tests/gen2_rom_text_test.lua index 8ffefcc5..73cf6d7a 100644 --- a/tests/gen2_rom_text_test.lua +++ b/tests/gen2_rom_text_test.lua @@ -33,7 +33,7 @@ end -- A label the list names but the symbol table cannot place would fail the -- import at the Dialogue stage rather than at generation time, so the pairing -- is asserted here instead. -for _, edition in ipairs({ "gold", "silver" }) do +for _, edition in ipairs({ "gold", "silver", "crystal" }) do local data = manifest("tools/rom_manifest_" .. edition .. ".json") local labels = (data.text or {}).labels or {} check((data.text or {}).labels ~= nil, @@ -64,7 +64,7 @@ for _, edition in ipairs({ "gold", "silver" }) do end end --- Both editions describe the same strings; only the addresses move. +-- Gold and Silver describe the same strings; only the addresses move. do local gold = (manifest("tools/rom_manifest_gold.json").text or {}).labels or {} local silver = @@ -75,6 +75,20 @@ do if silver[index] ~= label then mismatch = label; break end end eq(mismatch, nil, "and the same labels in the same order") + + local crystal = + (manifest("tools/rom_manifest_crystal.json").text or {}).labels or {} + check(#crystal > #gold, + ("Crystal names more labels than Gold (%d vs %d)"):format(#crystal, #gold)) + local named = {} + for _, label in ipairs(gold) do named[label] = true end + local extra = 0 + for _, label in ipairs(crystal) do + if not named[label] then extra = extra + 1 end + end + check(extra > 0, + ("and %d of them are Crystal-only, so it is not a Gold alias") + :format(extra)) end -- ---- the slots RomText fills ---------------------------------------------- diff --git a/tests/gen2_save_test.lua b/tests/gen2_save_test.lua index 6493b63f..a2a3d5d4 100644 --- a/tests/gen2_save_test.lua +++ b/tests/gen2_save_test.lua @@ -117,16 +117,34 @@ check("a Gen 2 version already on the table is kept", Save.normalize({ version = "silver", player = {} }).version, "silver") check("and a Gen 1 one is replaced by the running edition", Save.normalize({ version = "red", player = {} }).version, "gold") +check("and Crystal is a Gen 2 version, so it keeps its own", + Save.normalize({ version = "crystal", player = {} }).version, "crystal") +-- "nonesuch" is the deliberate never-a-game token: "gold" stood here until +-- Gold shipped, "crystal" until Crystal did. This one never becomes a game. check("as is a version this engine does not have", - Save.normalize({ version = "crystal", player = {} }).version, "gold") + Save.normalize({ version = "nonesuch", player = {} }).version, "gold") check("party exists", type(sparse.party), "table") check("inventory exists", type(sparse.inventory), "table") check("pokedex seen exists", type(sparse.pokedex.seen), "table") check("phone book exists", type(sparse.phoneContacts), "table") check("play time exists", type(sparse.playTime), "table") check("name defaulted", sparse.player.name, "GOLD") +-- wPlayerGender is zeroed by _ResetWRAM and Gold never writes it, so a +-- normalized save has to come back with the field present rather than nil. +check("gender defaulted", sparse.player.gender, "male") +check("and a recorded gender is kept", + Save.normalize({ player = { gender = "female" } }).player.gender, "female") check("normalize rejects a non-table", Save.normalize("nope"), nil) +-- The blank-name fallback is table driven so Crystal can be a row rather than +-- a third arm of a two-way test (data/player_names.asm). +check("Gold's PlayerNameArray row", Save.defaultPlayerName("gold"), "GOLD") +check("Silver's", Save.defaultPlayerName("silver"), "SILVER") +check("Crystal's MalePlayerNameArray row", + Save.defaultPlayerName("crystal"), "CHRIS") +check("and an unknown edition falls back to Gold's", + Save.defaultPlayerName("nonesuch"), "GOLD") + -- Money and coins are clamped to their caps, and a negative is floored at 0. local rich = Save.normalize({ player = { money = 9999999, coins = 99999 } }) check("money capped", rich.player.money, Save.MAX_MONEY) diff --git a/tests/gen2_unown_chambers_test.lua b/tests/gen2_unown_chambers_test.lua new file mode 100644 index 00000000..609c99db --- /dev/null +++ b/tests/gen2_unown_chambers_test.lua @@ -0,0 +1,233 @@ +-- The four Ruins of Alph secret chambers: +-- ../pokecrystal/engine/events/unown_walls.asm:1 HoOhChamber, :13 +-- OmanyteChamber, :54 SpecialAerodactylChamber, :81 SpecialKabutoChamber. +-- CRYSTAL_CACHE="..." luajit tests/gen2_unown_chambers_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 unown chambers") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Events = require("src.world.gen2.Events") +local Specials = require("src.script.gen2.Specials") +local UnownWords = require("src.world.gen2.UnownWords") + +local function loadTable(path) + local chunk = loadfile(path) + return chunk and chunk() or nil +end + +local function fakeVm(opts) + opts = opts or {} + local pack = opts.pack or {} + return { + scriptVar = 0, + events = opts.events or Events.new(), + specials = { + party = function() return opts.party or {} end, + itemIndex = function(id) return id == "WATER_STONE" and 24 or nil end, + hasItem = function(index) return pack[index] == true end, + }, + } +end + +local WALLS = { + { "HO_OH", 806 }, { "KABUTO", 807 }, + { "OMANYTE", 808 }, { "AERODACTYL", 809 }, +} + +-- ../pokecrystal/constants/event_flags.asm:486-489 +do + for _, row in ipairs(WALLS) do + eq(UnownWords.WALL_OPENED[row[1]], row[2], + "EVENT_WALL_OPENED_IN_" .. row[1] .. "_CHAMBER is flag " .. row[2]) + end + local events = Events.new() + check(not UnownWords.wallOpened(events, "OMANYTE"), "a fresh save has no wall open") + check(UnownWords.openWall(events, "OMANYTE"), "the first SET_FLAG reports the change") + check(UnownWords.wallOpened(events, "OMANYTE"), "and CHECK_FLAG reads it back") + check(not UnownWords.openWall(events, "OMANYTE"), "a second one is a no-op") + check(not UnownWords.wallOpened(events, "KABUTO"), + "and it did not open any of the other three") + check(not UnownWords.openWall(nil, "OMANYTE"), "no bitfield, no write") + check(not UnownWords.openWall(Events.new(), "BETA"), + "and a chamber the cart does not have has no flag to set") +end + +-- ../pokecrystal/engine/events/unown_walls.asm:2-5 HoOhChamber +do + check(UnownWords.leadIsHoOh({ { species = "HO_OH" } }), + "Ho-Oh in the first slot is what the routine asks for") + check(not UnownWords.leadIsHoOh({ { species = "LUGIA" }, { species = "HO_OH" } }), + "Ho-Oh in the second slot is not: it reads wPartySpecies[0] only") + check(not UnownWords.leadIsHoOh({ { species = "HO_OH", isEgg = true } }), + "an egg holds EGG in wPartySpecies, not the hatchling's species") + check(not UnownWords.leadIsHoOh({}), "and an empty party is not Ho-Oh") + + local vm = fakeVm({ party = { { species = "HO_OH" } } }) + Specials.ALL.HoOhChamber(vm) + check(UnownWords.wallOpened(vm.events, "HO_OH"), "the handler opens the wall") + eq(vm.scriptVar, 0, "and leaves wScriptVar alone: the scene's own checkevent reads the flag") + + vm = fakeVm({ party = { { species = "SUICUNE" } } }) + Specials.ALL.HoOhChamber(vm) + check(not UnownWords.wallOpened(vm.events, "HO_OH"), + "any other lead leaves it shut") + + vm = fakeVm({ party = { { species = "HO_OH" } } }) + Specials.ALL.HoOhChamber(vm) + check(not UnownWords.wallOpened(vm.events, "OMANYTE"), + "and it never touches the Omanyte bit") +end + +-- ../pokecrystal/engine/events/unown_walls.asm:28-43 OmanyteChamber +do + eq(UnownWords.waterStoneSlot({ { item = "WATER_STONE" } }), 1, + "one held Water Stone is found") + eq(UnownWords.waterStoneSlot( + { { item = "WATER_STONE" }, {}, { item = "WATER_STONE" } }), 3, + "and with two, the backwards walk stops at the LAST slot") + check(UnownWords.waterStoneSlot({ { item = "FIRE_STONE" }, {} }) == nil, + "no stone, no slot") + check(UnownWords.waterStoneSlot(nil) == nil, "and no party is no slot") + + local vm = fakeVm({ pack = { [24] = true } }) + Specials.ALL.OmanyteChamber(vm) + check(UnownWords.wallOpened(vm.events, "OMANYTE"), + "CheckItem on the pack alone opens it") + + vm = fakeVm({ party = { {}, { item = "WATER_STONE" } } }) + Specials.ALL.OmanyteChamber(vm) + check(UnownWords.wallOpened(vm.events, "OMANYTE"), + "so does a Water Stone held by a party mon") + + vm = fakeVm({ party = { { item = "FIRE_STONE" } } }) + Specials.ALL.OmanyteChamber(vm) + check(not UnownWords.wallOpened(vm.events, "OMANYTE"), + "neither in the pack nor held leaves it shut") + + vm = fakeVm({}) + Specials.ALL.OmanyteChamber(vm) + check(not UnownWords.wallOpened(vm.events, "OMANYTE"), + "and an empty party with an empty pack does nothing") + + -- ../pokecrystal/engine/events/unown_walls.asm:14-20 + local seen = 0 + vm = fakeVm({}) + vm.specials.party = function() seen = seen + 1 return {} end + UnownWords.openWall(vm.events, "OMANYTE") + Specials.ALL.OmanyteChamber(vm) + eq(seen, 0, "an already-open wall returns before the party is walked") +end + +-- ../pokecrystal/engine/events/unown_walls.asm:54, :81, both reached from a +-- field move rather than from a `special`. +do + local events = Events.new() + check(not UnownWords.aerodactylChamber(events, "RUINS_OF_ALPH_KABUTO_CHAMBER"), + "Flash in the wrong chamber returns no carry") + check(not UnownWords.wallOpened(events, "AERODACTYL"), "and opens nothing") + check(not UnownWords.aerodactylChamber(events, "DARK_CAVE_VIOLET_ENTRANCE"), + "nor does Flash in an ordinary dark cave") + check(UnownWords.aerodactylChamber(events, "RUINS_OF_ALPH_AERODACTYL_CHAMBER"), + "in its own chamber it returns the carry FlashFunction jumps on") + check(UnownWords.wallOpened(events, "AERODACTYL"), "and sets the bit") + + events = Events.new() + check(not UnownWords.kabutoChamber(events, "RUINS_OF_ALPH_OMANYTE_CHAMBER"), + "an escape rope elsewhere does nothing") + check(not UnownWords.wallOpened(events, "KABUTO"), "and leaves the bit clear") + check(UnownWords.kabutoChamber(events, "RUINS_OF_ALPH_KABUTO_CHAMBER"), + "in the Kabuto chamber it fires") + check(UnownWords.wallOpened(events, "KABUTO"), "and sets its own bit") + check(not UnownWords.wallOpened(events, "AERODACTYL"), + "with the Aerodactyl bit untouched") +end + +-- data/events/special_pointers.asm:148 OmanyteChamber, :157 HoOhChamber +do + for _, name in ipairs({ "OmanyteChamber", "HoOhChamber" }) do + check(type(Specials.ALL[name]) == "function", name .. " is a handler") + check(Specials.STUBS[name] == nil, name .. " is no longer a stub") + eq(Specials.HANDLER_SOURCE[name], "specials/crystal_story.lua", + "owned by this unit's module") + check(Specials.SUPERSEDED_STUBS[name] ~= nil, + "and its stub reason moved to SUPERSEDED_STUBS") + end +end + +local cache = os.getenv("CRYSTAL_CACHE") +if not cache then + cache = (os.getenv("HOME") or "") + .. "/Library/Application Support/LOVE/crystal-dev/crystal" +end + +local maps = loadTable(cache .. "/data/generated/maps.lua") +local scripts = loadTable(cache .. "/data/generated/scripts.lua") +local consts = loadTable(cache .. "/data/generated/constants.lua") + +-- ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:22-24, the +-- MAPCALLBACK_TILES callback that re-derives the flag numbers from the cart. +local specialId = {} +for id, name in pairs((consts or {}).specialOrder or {}) do + specialId[name] = id - 1 +end + +if not (maps and scripts and consts) then + check(true, "no cache: the chamber scripts are not walked (SKIP)") +elseif not specialId.OmanyteChamber then + -- data/events/special_pointers.asm:124 `; Crystal only` + check(true, "cache is not a Crystal one (SKIP)") +else + -- ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:10 and + -- RuinsOfAlphHoOhChamber.asm:10; the other two chambers have no `special`. + local EXPECTED = { + HO_OH = "HoOhChamber", + OMANYTE = "OmanyteChamber", + KABUTO = false, + AERODACTYL = false, + } + for chamber, wantSpecial in pairs(EXPECTED) do + local mapId = UnownWords.CHAMBER_MAPS[chamber] + local def = maps[mapId] + if not def then + check(false, mapId .. " is in the cache") + else + local callback = (def.callbacks or {})[1] + local rows = callback and scripts[callback.scriptKey] + local first = rows and rows[1] + eq(callback and callback.callback, "MAPCALLBACK_TILES", + mapId .. " has its hidden-doors callback") + eq(first and first.op, "checkevent", "which opens on a checkevent") + eq(first and first.event, UnownWords.WALL_OPENED[chamber], + "of the very flag " .. chamber .. "'s routine writes") + + local scene + for _, entry in pairs(def.sceneScripts or {}) do + if (entry.sceneId or 0) == 0 then scene = entry end + end + local sceneRows = scene and scripts[scene.scriptKey] or {} + local got + for _, row in ipairs(sceneRows) do + if row.op == "special" then got = row.id end + end + if wantSpecial then + eq(got, specialId[wantSpecial], + mapId .. "'s check-wall scene runs " .. wantSpecial) + else + check(got == nil, + mapId .. "'s check-wall scene runs no special: its trigger is a field move") + end + -- ../pokecrystal/maps/RuinsOfAlphOmanyteChamber.asm:11 + local read + for _, row in ipairs(sceneRows) do + if row.op == "checkevent" then read = row.event end + end + eq(read, UnownWords.WALL_OPENED[chamber], + "and it reads the same flag straight afterwards") + end + end +end + +S.finish() diff --git a/tests/gen2_unown_printer_test.lua b/tests/gen2_unown_printer_test.lua index a6e50fe2..f55d36ae 100644 --- a/tests/gen2_unown_printer_test.lua +++ b/tests/gen2_unown_printer_test.lua @@ -285,8 +285,9 @@ end check(Specials.HANDLERS.UnownPrinter ~= nil, "UnownPrinter has a handler: the viewer half needs no printer") eq(Specials.STUBS.UnownPrinter, nil, "and is not also stubbed") -check(Specials.STUBS.PrintDiploma ~= nil, - "PrintDiploma, which is nothing but a print, still is") +check(Specials.HANDLERS.PrintDiploma ~= nil, + "PrintDiploma took the same route: the diploma page is drawn on the " + .. "cartridge and only the send wanted a printer") -- The hook a Specials handler reaches for lives in World:specialHooks, NOT in -- the table handed to Vm.new -- a hook registered in the wrong one is diff --git a/tests/gen2_unown_words_test.lua b/tests/gen2_unown_words_test.lua new file mode 100644 index 00000000..c58f4ae7 --- /dev/null +++ b/tests/gen2_unown_words_test.lua @@ -0,0 +1,310 @@ +-- The Ruins of Alph wall words: engine/events/unown_walls.asm:102 +-- DisplayUnownWords and data/events/unown_walls.asm:7 UnownWalls. +-- CRYSTAL_CACHE="..." luajit tests/gen2_unown_words_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 unown words") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Json = require("src.link.Json") +local UnownWords = require("src.world.gen2.UnownWords") + +local function readFile(path, mode) + local f = io.open(path, mode or "rb") + if not f then return nil end + local body = f:read("*a") + f:close() + return body +end + +local function pngSize(body) + local function be32(s, i) + local a, b, c, d = s:byte(i, i + 3) + return ((a * 256 + b) * 256 + c) * 256 + d + end + return be32(body, 17), be32(body, 21) +end + +local function loadTable(path) + local chunk = loadfile(path) + return chunk and chunk() or nil +end + +-- engine/events/unown_walls.asm:201 .ConvertChar +do + local tl, tr, bl, br = UnownWords.square(0x00) -- 'A' + eq(tl, 0x80, "A's top-left is bank 1 tile $00") + eq(tr, 0x81, "top-right is the next tile") + eq(bl, 0x90, "bottom-left is a 16-tile row down") + eq(br, 0x91, "and bottom-right beside it") + eq((UnownWords.square(0x0e)), 0x8e, "H is bank 1 tile $0e") + eq((UnownWords.square(0x20)), 0xa0, "I steps a whole row: bank 1 tile $20") + eq((UnownWords.square(0x4e)), 0xce, "X is the last computed letter") + local y1, y2, y3, y4 = UnownWords.square(0x60) + eq(y1 * 0x1000000 + y2 * 0x10000 + y3 * 0x100 + y4, + 0x5b5c4d5d, "Y is .YChar's four bank 0 tiles") + local z1, z2, z3, z4 = UnownWords.square(0x62) + eq(z1 * 0x1000000 + z2 * 0x10000 + z3 * 0x100 + z4, + 0x4e4f5e5f, "Z is .ZChar's") + local d1, d2, d3, d4 = UnownWords.square(0x64) + eq(d1 * 0x1000000 + d2 * 0x10000 + d3 * 0x100 + d4, + 0x02030302, "and the dash is .DashChar's") +end + +-- data/events/unown_walls.asm:15 MenuHeaders_UnownWalls, the n = 6 row. +do + local escape = { x1 = 3, y1 = 4, x2 = 16, y2 = 9, + chars = { 0x08, 0x44, 0x04, 0x00, 0x2e, 0x08 } } + local bx, by, bw, bh = UnownWords.boxRect(escape) + eq(bx, 3, "the box starts at column 3") + eq(by, 4, "row 4") + eq(bw, 14, "and spans the coordinate pair inclusive: 14 columns") + eq(bh, 6, "by 6 rows") + local ox, oy = UnownWords.origin(escape) + eq(ox, 4, "the first square is one column inside the frame") + eq(oy, 6, "and two rows down") + local squares = UnownWords.layout(escape) + eq(#squares, 6, "ESCAPE is six squares") + eq(squares[1].tx, 4, "the E starts at column 4") + eq(squares[2].tx, 6, "and every letter is two tiles wide") + eq(squares[6].tx, 14, "so the last one ends on the frame's inner edge") + eq(squares[1].ty, 6, "all of them on the same row") + eq(squares[4].tl, 0x80, "the A in ESCAPE is bank 1 tile $00") +end + +-- constants/charmap.asm:424 the `unown` charmap. +do + local body = readFile("tools/rom_manifest_crystal.json", "r") + if not body then + check(true, "no tools/rom_manifest_crystal.json (SKIP)") + else + local manifest = Json.decode(body) + local map = manifest.unownCharmap + if not map then + check(false, "the Crystal manifest carries unownCharmap") + else + eq(map["0"], "A", "$00 is A") + eq(map["2"], "B", "$02 is B, two tiles along") + eq(map["14"], "H", "$0e is H, the last of the first row") + eq(map["32"], "I", "$20 is I: the row step is $10 every eight letters") + eq(map["78"], "X", "$4e is X") + eq(map["96"], "Y", "$60 is Y") + eq(map["98"], "Z", "$62 is Z") + eq(map["100"], "-", "$64 is the dash") + eq(map["255"], "@", "and $ff terminates a word") + local count = 0 + for _ in pairs(map) do count = count + 1 end + eq(count, 28, "27 printable characters plus the terminator") + end + -- constants/charmap.asm:5 -- $00 is in the main charmap. + local main = manifest.charmap or {} + check(main["0"] ~= "A", "the main charmap did not absorb the Unown rows") + eq(manifest.symbols.UnownWalls[1], 0x22, + "UnownWalls is in the bank pokecrystal.sym says") + eq(manifest.symbols.UnownWalls[2], 0x6ebc, "and at its address") + eq(manifest.symbols.MenuHeaders_UnownWalls[2], 0x6ed5, + "with the menu headers immediately after it") + end +end + +do + for _, edition in ipairs({ "gold", "silver" }) do + local body = readFile("tools/rom_manifest_" .. edition .. ".json", "r") + if not body then + check(true, "no " .. edition .. " manifest (SKIP)") + else + local manifest = Json.decode(body) + check(manifest.unownCharmap == nil, + edition .. " has no Unown charmap: the block is Crystal only") + check(manifest.symbols.UnownWalls == nil, + edition .. " has no UnownWalls either") + end + end +end + +-- constants/charmap.asm:423,433 the two `pushc` blocks the main parser skips. +do + local source = readFile("tools/make_gold_manifest.py", "r") + if not source then + check(true, "no tools/make_gold_manifest.py (SKIP)") + else + check(source:find('if re.match(r"(pushc|newcharmap)\\b", stripped):', + 1, true) ~= nil, "the main charmap parser still stops at newcharmap") + end + local crystal = readFile("tools/make_crystal_manifest.py", "r") + if not crystal then + check(true, "no tools/make_crystal_manifest.py (SKIP)") + else + check(crystal:find('data["unownCharmap"] = unown_charmap(', 1, true) ~= nil, + "and the Unown one is generated beside it, under its own key") + check(crystal:find("PRINTABLE_UNOWN", 1, true) == nil, + "with the letter set read out of charmap.asm, not copied here") + end +end + +-- home/map.asm:1357-1370 LoadTilesetGFX's two CopyBytes. +do + local source = assert(readFile("src/import/RomExtractorGen2.lua", "r")) + check(source:find("local function crystalTilesetSheet(pixels)", 1, true) + ~= nil, "the Crystal sheet lays both VRAM banks out at their tile ids") + check(source:find("if twoBank then pixels = crystalTilesetSheet(pixels) end", + 1, true) ~= nil, "and extractTilesets uses it") + check(source:find("local CRYSTAL_PAL_MAP_BYTES = 112", 1, true) ~= nil, + "the PalMap read covers the bank 1 rows too") + check(source:find("out.unownWalls = walls", 1, true) ~= nil, + "and readEventTables emits the wall words") +end + +-- gfx/tilesets/ruins_of_alph.png, whose bottom half is the Unown alphabet. +do + local png = readFile( + "../pokecrystal/gfx/tilesets/ruins_of_alph.png") + if not png then + check(true, "no ../pokecrystal: the tileset's shape is not pinned (SKIP)") + else + local w, h = pngSize(png) + eq(w, 128, "pret's ruins_of_alph.png is 16 tiles across") + eq(h, 96, "and 12 down: $60 tiles per VRAM bank, two banks") + end +end + +local cache = os.getenv("CRYSTAL_CACHE") +if not cache then + cache = (os.getenv("HOME") or "") + .. "/Library/Application Support/LOVE/crystal-dev/crystal" +end + +local events = loadTable(cache .. "/data/generated/events.lua") +local tilesets = loadTable(cache .. "/data/generated/tilesets.lua") + +-- data/events/unown_walls.asm:2-5 +local EXPECTED = { + { word = "ESCAPE", x1 = 3, y1 = 4, x2 = 16, y2 = 9 }, + { word = "LIGHT", x1 = 4, y1 = 4, x2 = 15, y2 = 9 }, + { word = "WATER", x1 = 4, y1 = 4, x2 = 15, y2 = 9 }, + { word = "HO-OH", x1 = 4, y1 = 4, x2 = 15, y2 = 9 }, +} + +if not events then + check(true, "no Crystal cache: the wall words are not read (SKIP)") +elseif not events.unownWalls then + check(true, "cache predates the wall words: re-import Crystal (SKIP)") +else + local walls = events.unownWalls + eq(#walls, 4, "NUM_UNOWN_WALLS rows came out") + for index, want in ipairs(EXPECTED) do + local got = walls[index] or {} + eq(got.word, want.word, want.word .. " decoded through the Unown charmap") + eq(got.id, index - 1, "at the UNOWNWORDS_* value the setval uses") + eq(#(got.chars or {}), #want.word, "with one character byte per letter") + eq(got.x1, want.x1, want.word .. "'s box left edge") + eq(got.y1, want.y1, "top edge") + eq(got.x2, want.x2, "right edge") + eq(got.y2, want.y2, "bottom edge") + -- data/events/unown_walls.asm:20 MENU_BACKUP_TILES + eq(got.flags, 0x40, "and MENU_BACKUP_TILES set") + -- data/events/unown_walls.asm:21 `menu_coords 9 - n, 4, 10 + n, 9` + local _, _, bw = UnownWords.boxRect(got) + eq(bw - 2, #want.word * 2, "the frame is 2 columns per letter wide") + end + -- engine/events/unown_walls.asm:249 .DashChar + local dash = UnownWords.layout(walls[4])[3] + eq(dash.tl, 0x02, "HO-OH's dash comes out of .DashChar, not the alphabet") +end + +if not tilesets then + check(true, "no Crystal cache: the tileset sheet is not read (SKIP)") +else + local roa = tilesets.TILESET_RUINS_OF_ALPH + if not roa then + check(false, "the Ruins of Alph tileset is in the cache") + elseif roa.imageHeight ~= 128 then + check(true, "cache predates the two-bank sheet: re-import Crystal (SKIP)") + else + eq(roa.imageWidth, 128, "the sheet is 16 tiles across") + eq(roa.imageHeight, 128, "and 16 down: 256 tile ids, both VRAM banks") + eq(roa.tilesPerRow, 16, "so a tile id indexes it directly") + eq(#roa.tilePalettes, 224, "the PalMap covers every id the blocks use") + local png = readFile(cache .. "/assets/generated/tilesets/ruins_of_alph.png") + if not png then + check(false, "the sheet PNG is actually in the cache") + else + local w, h = pngSize(png) + eq(w, 128, "the written PNG is 128 wide") + eq(h, 128, "and 128 tall") + end + -- constants/tileset_constants.asm:34-38, the five Crystal-only tilesets. + for _, name in ipairs({ "TILESET_KABUTO_WORD_ROOM", + "TILESET_OMANYTE_WORD_ROOM", "TILESET_AERODACTYL_WORD_ROOM", + "TILESET_HO_OH_WORD_ROOM", "TILESET_BETA_WORD_ROOM" }) do + local set = tilesets[name] + if not set then + check(false, name .. " extracted") + else + eq(set.imageHeight, 128, name .. " is a two-bank sheet") + -- engine/tilesets/map_palettes.asm:40 -- bit 7 is the VRAM bank. + local high = 0 + for _, block in ipairs(set.blocks) do + for _, tile in ipairs(block) do + if tile >= 0x80 and tile < 0xe0 then high = high + 1 end + end + end + check(high > 0, name .. " really does draw out of bank 1") + end + end + end +end + +-- data/events/special_pointers.asm:151 add_special DisplayUnownWords +do + local Specials = require("src.script.gen2.Specials") + check(type(Specials.ALL.DisplayUnownWords) == "function", + "DisplayUnownWords is a handler and not a stub") + eq(Specials.HANDLER_SOURCE.DisplayUnownWords, + "specials/unown_words.lua", "owned by this unit's module") +end + +do + local maps = loadTable(cache .. "/data/generated/maps.lua") + local scripts = loadTable(cache .. "/data/generated/scripts.lua") + local consts = loadTable(cache .. "/data/generated/constants.lua") + if not (maps and scripts and consts and events and events.unownWalls) then + check(true, "no Crystal cache: the chambers are not walked (SKIP)") + else + local index + for id, name in pairs(consts.specialOrder or {}) do + if name == "DisplayUnownWords" then index = id - 1 end + end + check(index ~= nil, "the cache's specialOrder names DisplayUnownWords") + local chambers = { + RUINS_OF_ALPH_KABUTO_CHAMBER = 0, + RUINS_OF_ALPH_AERODACTYL_CHAMBER = 1, + RUINS_OF_ALPH_OMANYTE_CHAMBER = 2, + RUINS_OF_ALPH_HO_OH_CHAMBER = 3, + } + for mapId, want in pairs(chambers) do + local def = maps[mapId] + local walls = 0 + for _, bg in ipairs((def or {}).bgEvents or {}) do + local rows = bg.scriptKey and scripts[bg.scriptKey] + local pending + for _, row in ipairs(rows or {}) do + if row.op == "setval" then + pending = row.value or (row.args and row.args[1]) + elseif row.op == "special" and row.id == index then + walls = walls + 1 + eq(pending, want, mapId .. " asks for its own word") + check(UnownWords.wallFor( + { gen2EventTables = events }, pending) ~= nil, + "and that value indexes a real wall row") + end + end + end + eq(walls, 2, mapId .. " has both of its wall patterns") + end + end +end + +S.finish() diff --git a/tests/gen2_version_fixes_test.lua b/tests/gen2_version_fixes_test.lua new file mode 100644 index 00000000..6a5d5146 --- /dev/null +++ b/tests/gen2_version_fixes_test.lua @@ -0,0 +1,231 @@ +-- The faithfulness convention: Gold and Silver keep their original cart bugs +-- wherever the bug is not hardware-dependent, and Crystal gets the fixes +-- Crystal shipped. GameVersion.fixes(id) names the FIX, so an absent table +-- reads as "bugged like the cart". +-- luajit tests/gen2_version_fixes_test.lua +-- +-- Four of pokegold's seven documented bugs are engine behaviour this port can +-- express. This file pins the two that are reachable from Lua state: +-- +-- luckyNumberBoxes the Lucky Number Show's loop bound +-- halloffame the first-save PC corruption, which is NOT reachable +-- here and is pinned as such rather than emulated +-- +-- surfOntoNpc lives with the field-move unit and reflectOverflow with the +-- battle unit; only the flag names are asserted here. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 version fixes") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +require("src.core.Logger").warn = function() end + +local GameVersion = require("src.core.GameVersion") +local HallOfFame = require("src.core.gen2.HallOfFame") +local Save = require("src.core.gen2.Save") +local Specials = require("src.script.gen2.Specials") + +local priorVersion = GameVersion.get() + +-- ---- CT-10: the API shape ------------------------------------------------- + +eq(type(GameVersion.fixes), "function", "GameVersion.fixes is an accessor") +eq(type(GameVersion.fixes("crystal")), "table", "and it returns a table") + +for _, id in ipairs({ "red", "blue", "yellow", "gold", "silver" }) do + eq(next(GameVersion.fixes(id)), nil, id .. " fixes nothing") +end +eq(next(GameVersion.fixes("nonesuch")), nil, "an unknown id reads as {}") + +for _, name in ipairs({ "luckyNumberBoxes", "surfOntoNpc", "reflectOverflow" }) do + eq(GameVersion.fixes("crystal")[name], true, "crystal fixes " .. name) +end + +do + local count = 0 + for _ in pairs(GameVersion.fixes("crystal")) do count = count + 1 end + eq(count, 3, "and carries no fix name a consumer was not told about") +end + +GameVersion.set("gold") +eq(next(GameVersion.fixes()), nil, "the active version is the default subject") +GameVersion.set("crystal") +eq(GameVersion.fixes().luckyNumberBoxes, true, "which follows GameVersion.set") + +-- Gold's row must stay bug-shaped even if someone later hangs data off it. +GameVersion.set("gold") +check(GameVersion.info("gold").fixes == nil, "the gold row has no fixes table") +check(GameVersion.info("silver").fixes == nil, "nor does silver") + +-- ---- the Lucky Number Show, boxes 10-14 ----------------------------------- +-- +-- pokegold/engine/events/lucky_number.asm:100-102 bounds .BoxesLoop with +-- NUM_BOXES_JP (9, pokegold/constants/pokemon_data_constants.asm:123) where +-- pokecrystal/engine/events/lucky_number.asm:99 uses NUM_BOXES (14). The OPEN +-- box is walked out of sBox before that loop starts and the loop then skips +-- it, so the current box is searched on both carts whatever its number. + +local function boxSet(order) + local seen = {} + for _, index in ipairs(order) do seen[index] = true end + return seen +end + +GameVersion.set("gold") +do + local order = Specials.luckyNumberBoxOrder({ currentBox = 1 }) + eq(#order, 9, "Gold walks nine boxes") + eq(order[1], 1, "starting with the open one") + local seen = boxSet(order) + for index = 1, 9 do check(seen[index], "gold searches box " .. index) end + for index = 10, 14 do + check(not seen[index], "gold skips box " .. index .. " (the cart bug)") + end +end + +do + local order = Specials.luckyNumberBoxOrder({ currentBox = 12 }) + eq(order[1], 12, "the open box is searched first even at 12") + eq(#order, 10, "on top of the nine .BoxesLoop reaches") + check(boxSet(order)[12], "so box 12 is not skipped while it is open") +end + +GameVersion.set("crystal") +do + local order = Specials.luckyNumberBoxOrder({ currentBox = 1 }) + eq(#order, 14, "Crystal walks all fourteen") + local seen = boxSet(order) + for index = 1, 14 do check(seen[index], "crystal searches box " .. index) end +end + +do + local order = Specials.luckyNumberBoxOrder({}) + eq(order[1], 1, "a save with no currentBox opens box 1") + eq(#order, 14, "and still walks the full set") +end + +-- The handler itself, over the same fixture on both editions. The party mon +-- shares three trailing digits (second prize, wScriptVar 2); the mon in box 12 +-- is an exact match (first prize, wScriptVar 1), and the BEST match wins. +local function luckyVm(record) + return { + specials = { + save = function() return record end, + party = function() return record.party end, + monName = function(species) return species end, + }, + setStringBuffer = function(self, value) self.stringBuffer = value end, + } +end + +local function luckyFixture(boxIndex, currentBox) + local record = { + luckyNumber = 12345, + currentBox = currentBox or 1, + party = { { species = "CHIKORITA", otId = 99345 } }, + boxes = {}, + } + record.boxes[boxIndex] = { { species = "MAGIKARP", otId = 12345 } } + return record +end + +GameVersion.set("gold") +do + local vm = luckyVm(luckyFixture(3)) + Specials.HANDLERS.CheckForLuckyNumberWinners(vm) + eq(vm.scriptVar, 1, "Gold finds an exact match in box 3") + check(vm.luckyNumberInBox, "and reports it came from a box") +end + +do + local vm = luckyVm(luckyFixture(12)) + Specials.HANDLERS.CheckForLuckyNumberWinners(vm) + eq(vm.scriptVar, 2, "Gold never sees the same mon in box 12") + check(not vm.luckyNumberInBox, "so the party's partial match wins instead") +end + +do + local vm = luckyVm(luckyFixture(12, 12)) + Specials.HANDLERS.CheckForLuckyNumberWinners(vm) + eq(vm.scriptVar, 1, "unless box 12 is the box the PC has open") +end + +GameVersion.set("crystal") +do + local vm = luckyVm(luckyFixture(12)) + Specials.HANDLERS.CheckForLuckyNumberWinners(vm) + eq(vm.scriptVar, 1, "Crystal finds box 12 without opening it") + check(vm.luckyNumberInBox, "and reports it came from a box") +end + +do + local vm = luckyVm(luckyFixture(14)) + Specials.HANDLERS.CheckForLuckyNumberWinners(vm) + eq(vm.scriptVar, 1, "and box 14, the last one") +end + +-- ---- the Hall of Fame, first-save PC corruption --------------------------- +-- +-- pokegold/engine/events/halloffame.asm:17 is the bug marker; Crystal farcalls +-- HallOfFame_InitSaveIfNeeded there (pokecrystal/engine/menus/save.asm:470-475) +-- to run ErasePreviousSave over uninitialised SRAM. This port has no SRAM, so +-- the induction is pinned as harmless here rather than emulated. + +GameVersion.set("gold") +do + local save = Save.newGame({ name = "GOLD", gender = "male" }) + save.boxes[7] = { { species = "SUDOWOODO", level = 20, otId = 111 } } + save.boxNames[7] = "TREES" + save.currentBox = 7 + eq(HallOfFame.count(save), 0, "a fresh save has never been inducted") + check(not HallOfFame.hasEntered(save), "and carries no status flag") + + local party = { { species = "TYPHLOSION", level = 55, otId = 222, + nickname = "TYPHLO" } } + local entry, wasEntered = HallOfFame.induct(save, party) + check(entry ~= nil, "induction on a never-saved file returns a row") + check(not wasEntered, "and reports the player was not already a champion") + eq(HallOfFame.count(save), 1, "the win counter reaches one") + eq(#save.boxes[7], 1, "box 7 still holds its mon") + eq(save.boxes[7][1].species, "SUDOWOODO", "unchanged") + eq(save.boxNames[7], "TREES", "its name survives too") + eq(save.currentBox, 7, "and the open box is still open") + for index = 1, Save.NUM_BOXES do + local box = save.boxes[index] + check(box == nil or type(box) == "table", + "box " .. index .. " is a table or absent, never garbage") + end +end + +-- ---- the Coin Case terminator --------------------------------------------- +-- +-- pokegold/data/text/common_3.asm:341 ends _CoinCaseCountText with `done` ($57) +-- where pokecrystal/data/text/common_3.asm:1308 uses `text_end`, and +-- pokegold/home/text.asm:590-593 stops only on TX_END. The port decodes the +-- stream once at import (decodeGen2Text breaks on $57), so the cache is the +-- evidence that nothing runs past the string. + +local cache = os.getenv("GOLD_CACHE") +if not cache then + local home = os.getenv("HOME") or "" + cache = home .. "/Library/Application Support/LOVE/gold-dev/gold" +end +local textPath = cache .. "/data/generated/rom_text.lua" +local tf = io.open(textPath, "r") +if not tf then + check(true, "rom_text.lua absent : no gold cache (SKIP cache facts)") +else + tf:close() + local romText = assert(loadfile(textPath))() + eq(romText._CoinCaseCountText, "Coins:\n{NUM}", + "the `done` terminator still ends the decoded string") + check(not tostring(romText._CoinCaseCountText or ""):find("Raise the PP"), + "and nothing from the next label runs into it") +end + +GameVersion.set(priorVersion) + +S.finish() diff --git a/tests/gen2_vm_test.lua b/tests/gen2_vm_test.lua index d0e3a6b3..b1b92761 100644 --- a/tests/gen2_vm_test.lua +++ b/tests/gen2_vm_test.lua @@ -2357,9 +2357,11 @@ check(Specials.STUBS.PhotoStudio == nil, "PhotoStudio is a HANDLER now: the conversation and the portrait card exist") check(Specials.HANDLERS.PhotoStudio ~= nil, "and it is the one that special dispatch resolves to") -check(Specials.STUBS.PrintDiploma ~= nil, - "PrintDiploma stays stubbed -- it is nothing but the print, with no screen " - .. "half of its own") +check(Specials.STUBS.PrintDiploma == nil + and Specials.HANDLERS.PrintDiploma ~= nil, + "PrintDiploma is a handler now: _PrintDiploma opens on the very page " + .. "`special Diploma` shows (engine/printer/printer.asm:382) and only the " + .. "two SendScreenToPrinter passes wanted a printer") check(Specials.STUBS.UnownPrinter == nil and Specials.HANDLERS.UnownPrinter ~= nil, "UnownPrinter is a handler for the same reason this one is: the stamp " diff --git a/tests/mod_ui_tests.lua b/tests/mod_ui_tests.lua index dc82fa8b..29a81a83 100644 --- a/tests/mod_ui_tests.lua +++ b/tests/mod_ui_tests.lua @@ -286,7 +286,7 @@ local WANT_IDS = { "textSpeed", "animations", "battleStyle", "battleLayout", "ruleset", "musicVol", "sfxVol", "musicFilter", "performance", "colors", "tilt", "gbcfx", "zoom", "voidFill", "videoMode", - "faithfulRes", "fpsCap", + "faithfulRes", "screenPos", "fpsCap", "speedOverworld", "speedBattle", "speedMenu", "mods", "controls", "dateFormat", "timeFormat" } local function orow(menu, id) diff --git a/tests/parity_hpcolor_og_palette.lua b/tests/parity_hpcolor_og_palette.lua index 7dc9d72a..faae668b 100644 --- a/tests/parity_hpcolor_og_palette.lua +++ b/tests/parity_hpcolor_og_palette.lua @@ -48,7 +48,8 @@ end local ZONE0 = { { "red", "gbc", { 255, 239, 255 }, { 247, 214, 123 }, { 74, 165, 90 }, { 25, 16, 16 } }, { "blue", "gbc", { 255, 239, 255 }, { 247, 214, 123 }, { 74, 165, 90 }, { 25, 16, 16 } }, - { "yellow", "gbc", { 255, 239, 255 }, { 247, 214, 123 }, { 74, 165, 90 }, { 25, 16, 16 } }, + -- pokeyellow/data/sgb/sgb_palettes.asm:35 PAL_GREENBAR + { "yellow", "gbc", { 255, 255, 247 }, { 255, 255, 156 }, { 0, 173, 0 }, { 49, 49, 49 } }, { "red", "ogred", { 255, 255, 255 }, { 255, 132, 132 }, { 148, 58, 58 }, { 0, 0, 0 } }, { "blue", "ogred", { 255, 255, 255 }, { 99, 165, 255 }, { 0, 0, 255 }, { 0, 0, 0 } }, { "yellow", "ogred", { 255, 255, 255 }, { 255, 255, 0 }, { 0, 255, 0 }, { 25, 25, 25 } }, @@ -218,8 +219,9 @@ local ANIM = { { "blue", "ogred", { 255, 132, 132 }, { 148, 58, 58 }, { 0, 0, 0 } }, { "red", "gbc", { 255, 239, 255 }, { 25, 16, 16 }, { 25, 16, 16 } }, { "blue", "gbc", { 255, 239, 255 }, { 25, 16, 16 }, { 25, 16, 16 } }, - { "yellow", "gbc", { 255, 239, 255 }, { 25, 16, 16 }, { 25, 16, 16 } }, - { "yellow", "ogred", { 255, 239, 255 }, { 25, 16, 16 }, { 25, 16, 16 } }, + -- pokeyellow/data/sgb/sgb_palettes.asm:35 PAL_GREENBAR + { "yellow", "gbc", { 255, 255, 247 }, { 49, 49, 49 }, { 49, 49, 49 } }, + { "yellow", "ogred", { 255, 255, 247 }, { 49, 49, 49 }, { 49, 49, 49 } }, } for _, c in ipairs(ANIM) do diff --git a/tests/parity_text_markers.lua b/tests/parity_text_markers.lua index c6cdbd0b..7edd5c92 100644 --- a/tests/parity_text_markers.lua +++ b/tests/parity_text_markers.lua @@ -73,14 +73,14 @@ end -- === #250: the CATERPIE / WEEDLE description === -- pokered/text/ViridianCity.asm declares this one without the leading --- underscore the extractor keys on, so it is not in data/generated/text.lua --- and the port carries a literal. That makes the literal load-bearing. +-- underscore, and the extractor now keys on both spellings, so the port's +-- literal has to keep agreeing with what the cart actually says. do - check(Data.text.ViridianCityYoungster2CaterpieAndWeedleDescriptionText == nil - and Data.text._ViridianCityYoungster2CaterpieAndWeedleDescriptionText == nil, - "the description really is absent from generated text (hence a literal)") - local desc = "CATERPIE has no\npoison, but\vWEEDLE does.\fWatch out for its\nPOISON STING!" + local extracted = Data.text.ViridianCityYoungster2CaterpieAndWeedleDescriptionText + or Data.text._ViridianCityYoungster2CaterpieAndWeedleDescriptionText + if extracted then eq(extracted, desc, "the literal still matches the cart") end + local pages = assertPlayable("caterpillar description", desc) eq(#pages, 2, "para breaks the description into two pages (#250)") eq(#pages[1], 3, "page 1 is text + line + cont") diff --git a/tests/rom_importer_last_version_test.lua b/tests/rom_importer_last_version_test.lua index c528be2f..7022ee7e 100644 --- a/tests/rom_importer_last_version_test.lua +++ b/tests/rom_importer_last_version_test.lua @@ -76,11 +76,12 @@ eq(ri4.tab, "blue", "an explicit --game tab beats the remembered version") LaunchOptions.pendingTab = nil -- module is a singleton: do not leak this -- A junk value in options.lua (hand-edited file, a build that knew other --- versions) must not select a tab that does not exist. "gold" used to be --- the stand-in for this (Gen 2's Gold/Silver support was still unwritten); --- now that Gold is a real version, "crystal" is the still-unknown one. +-- versions) must not select a tab that does not exist. Real version ids +-- stood here twice -- "gold", then "crystal" -- and each had to be swapped +-- out the day that game shipped, so this is "nonesuch": a deliberate +-- never-a-game token, not a version anyone is waiting on. local opts = SaveData.loadOptions() -opts.lastVersion = "crystal" +opts.lastVersion = "nonesuch" SaveData.saveOptions(opts) local ri5 = newImporter({ tab = "red", ready = { red = true, yellow = true } }) ri5:_applyLastVersionTab() diff --git a/tests/run_gen2.lua b/tests/run_gen2.lua new file mode 100644 index 00000000..f8a8966e --- /dev/null +++ b/tests/run_gen2.lua @@ -0,0 +1,50 @@ +-- T2 Gen 2 tier: tests/gen2_*.lua, tests/crystal_*.lua and the LZ3 decoder, one +-- process per suite. ROM-free, so it runs with no data/generated/ and no cache. +-- luajit tests/run_gen2.lua + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local FsIo = require("tests.fs_io") + +local PREFIXES = { "gen2_", "crystal_" } +local EXTRA = { "tests/rom_lz3_test.lua" } + +local function suites() + local files = {} + for _, name in ipairs(FsIo.listDir("tests")) do + if name:match("%.lua$") then + for _, prefix in ipairs(PREFIXES) do + if name:sub(1, #prefix) == prefix then + files[#files + 1] = "tests/" .. name + break + end + end + end + end + for _, path in ipairs(EXTRA) do + local handle = io.open(path, "r") + if handle then + handle:close() + files[#files + 1] = path + end + end + table.sort(files) + return files +end + +local lua = (arg and arg[-1]) or "luajit" +local failed, total = 0, 0 +for _, path in ipairs(suites()) do + total = total + 1 + local status = os.execute(("%s %s"):format(lua, path)) + if status == 0 or status == true then + print("ok " .. path) + else + failed = failed + 1 + print("FAIL " .. path) + end +end + +print(("\ngen2: %d/%d suites passed"):format(total - failed, total)) +print(("%s"):format(failed == 0 and "ALL TESTS PASSED" or failed .. " FAILURES")) +os.exit(failed == 0 and 0 or 1) diff --git a/tests/run_tests.lua b/tests/run_tests.lua index b2c10116..2b271766 100644 --- a/tests/run_tests.lua +++ b/tests/run_tests.lua @@ -1338,7 +1338,7 @@ do Game.save.pokedex.owned.EKANS = nil local cb = BattleState.newWild(Game, "EKANS", 5) cb:storeCaughtMon() - check(hasText(cb, "New POKéDEX data\nwill be added for\nEKANS!"), + check(hasText(cb, "New POKéDEX data\nwill be added for\vEKANS!"), "_ItemUseBallText06 on a first catch") check(Game.save.pokedex.owned.EKANS == true, "species registered as owned") eq(cb.result, "caught", "catch resolves the battle") @@ -1348,7 +1348,7 @@ do for _ = 1, 6 do table.insert(Game.save.party, Pokemon.new(Data, "RATTATA", 5)) end local cb2 = BattleState.newWild(Game, "EKANS", 5) cb2:storeCaughtMon() - check(hasText(cb2, "EKANS was\ntransferred to\nsomeone's PC!"), + check(hasText(cb2, "EKANS was\ntransferred to\vsomeone's PC!"), "_ItemUseBallText08 before meeting Bill") check(not hasText(cb2, "New POKéDEX data"), "no dex page for an already-owned species") @@ -1372,7 +1372,7 @@ do Game.save.flags.EVENT_MET_BILL = true local cb3 = BattleState.newWild(Game, "EKANS", 5) cb3:storeCaughtMon() - check(hasText(cb3, "EKANS was\ntransferred to\nBILL's PC!"), + check(hasText(cb3, "EKANS was\ntransferred to\vBILL's PC!"), "_ItemUseBallText07 after meeting Bill") Game.save.flags.EVENT_MET_BILL = nil @@ -3485,10 +3485,14 @@ runSuites({ "tests/rom_importer_cursor_test.lua" }) -- ---------------------------------------------- launcher last played tab (#835) runSuites({ "tests/rom_importer_last_version_test.lua" }) --- ---------------------------------------------- Gold (Gen 2) --- All ROM-free: each file carries its own fixtures shaped like the extractor's --- output, so they run without a Gold cache. -runSuites({ +-- ---------------------------------------------- Gold / Crystal (Gen 2) +-- All ROM-free: own fixtures, or a self-skip on a missing cache. Globbed on +-- the historical chain; tests/run_gen2.lua runs the same set, one per process. +local LEAKS_SAVE_SLOT_STATE = { + ["tests/gen2_save_export_test.lua"] = true, +} +runSuites(orderedGlob( + "tests/gen2_*.lua tests/crystal_*.lua tests/rom_lz3_test.lua", { "tests/rom_lz3_test.lua", "tests/gen2_world_test.lua", "tests/gen2_audio_test.lua", @@ -3599,10 +3603,8 @@ runSuites({ -- name resolution, and the .sav converter refusing a Gen 2 save table. "tests/gen2_sound_alias_test.lua", "tests/gen2_save_convert_cli_test.lua", - -- The wall radios (`special MapRadio`); the Pokegear-proper suites next to - -- it (gen2_pokegear_unlock_test, gen2_save_export_test) stay out of this - -- block because their headers ask for a GOLD_CACHE, which this tier cannot - -- assume. + -- The wall radios (`special MapRadio`). gen2_save_export_test cannot share a + -- process (LEAKS_SAVE_SLOT_STATE above); tests/run_gen2.lua runs it alone. "tests/gen2_map_radio_test.lua", -- The two seams where a battle meets everything else: what ends a round and -- a battle (and what a battle may not leave on the party), and BattlePack -- @@ -3613,7 +3615,13 @@ runSuites({ -- which failures suppress the attack animation, and the Rollout / -- EFFECT_RAMPAGE lock-ins. ROM-free like the rest of this block. "tests/gen2_battle_lockin_test.lua", -}) + -- Crystal rides the same glob: crystal_*.lua and the gen2_crystal_* files. + "tests/crystal_import_test.lua", + "tests/crystal_world_test.lua", + "tests/gen2_crystal_anim_test.lua", + "tests/gen2_crystal_caught_data_test.lua", + "tests/gen2_crystal_gender_test.lua", +}, LEAKS_SAVE_SLOT_STATE)) -- ---------------------------------------------- Android second ROM pick (#167) runSuites({ "tests/rom_importer_android_pick_test.lua" }) diff --git a/tests/save_editor_gen2_tests.lua b/tests/save_editor_gen2_tests.lua index b1877437..5383a8fd 100644 --- a/tests/save_editor_gen2_tests.lua +++ b/tests/save_editor_gen2_tests.lua @@ -1,4 +1,4 @@ --- Headless Gold save-editor rules. Run from repo root: +-- Headless Gen 2 save-editor rules. Run from repo root: -- luajit tests/save_editor_gen2_tests.lua package.path = package.path .. ";./?.lua;./?/init.lua;./tools/save-editor/?.lua" .. ";./tools/save-editor/panels/?.lua" @@ -90,6 +90,7 @@ do eq(Gen.of({ generation = 2 }), 2, "Gen.of generation field") eq(Gen.of({ version = "gold" }), 2, "Gen.of version gold") eq(Gen.of({ version = "silver" }), 2, "Gen.of version silver") + eq(Gen.of({ version = "crystal" }), 2, "Gen.of version crystal") eq(Gen.of(SaveData.newGame()), 1, "Gen.of gen1 newGame") eq(Gen.of(Save2.newGame()), 2, "Gen.of gold newGame") end @@ -116,7 +117,7 @@ do check(not Ops.speciesUsable(S1, "BROKEN"), "partial record is not usable") end -for _, version in ipairs({ "gold", "silver" }) do +for _, version in ipairs({ "gold", "silver", "crystal" }) do local S = newState(version) Ops.partyAdd(S) eq(#S.save.party, 1, "partyAdd on " .. version) @@ -424,5 +425,398 @@ do GameVersion.set("red") end +do + GameVersion.set("red") + local crystal = Gen.newGame("crystal") + eq(crystal.version, "crystal", "Gen.newGame('crystal') stamps crystal") + eq(crystal.generation, 2, "crystal stub is generation 2") + eq(crystal.player.name, "CHRIS", "crystal stub uses Crystal's preset name") + eq(Gen.newGame("silver").version, "silver", "Gen.newGame('silver') stamps silver") + eq(Gen.newGame("silver").player.name, "SILVER", "silver stub keeps SILVER") + eq(Gen.newGame("gold").player.name, "GOLD", "gold stub keeps GOLD") + eq(Gen.newGame("blue").version, "blue", "Gen.newGame('blue') stamps blue") + eq(Gen.newGame("yellow").version, "yellow", "Gen.newGame('yellow') stamps yellow") + eq(Gen.newGame(nil).version, "red", "no version falls back to the active game") + eq(Gen.newGame("nonsense").version, "red", "an unknown id is ignored") +end + +do + local crystal = Gen.newGame("crystal") + local gold = Gen.newGame("gold") + eq(Gen.versionOf(crystal), "crystal", "versionOf reads the save") + eq(Gen.engineOf(crystal), "crystal", "crystal saves are the crystal lineage") + eq(Gen.engineOf(gold), "gs", "gold saves are the gs lineage") + eq(Gen.engineOf(Gen.newGame("silver")), "gs", "silver saves are the gs lineage") + eq(Gen.editionLabel(crystal), "CRYSTAL", "edition label follows the save") + eq(Gen.editionLabel(gold), "GOLD", "gold still labels GOLD") + check(Gen.hasCaughtData(crystal), "crystal has caught data") + check(not Gen.hasCaughtData(gold), "gold has no caught data") + check(not Gen.hasCaughtData(SaveData.newGame()), "gen 1 has no caught data") + check(Gen.hasPlayerGender(crystal), "crystal has a player gender") + check(not Gen.hasPlayerGender(gold), "gold has no player gender") +end + +do + local Gen2Flags = require("Gen2Flags") + local gs = Gen2Flags.byName("gs") + local crys = Gen2Flags.byName("crystal") + eq(gs.EVENT_BEAT_FALKNER, crys.EVENT_BEAT_FALKNER, + "a shared event keeps one id in both lineages") + check(gs.EVENT_BEAT_FALKNER ~= nil, "the gs table is populated") + eq(gs.EVENT_GOT_RAINBOW_WING, 120, "Gold's EVENT_GOT_RAINBOW_WING") + eq(crys.EVENT_GOT_RAINBOW_WING, 822, "Crystal renumbers EVENT_GOT_RAINBOW_WING") + eq(gs.EVENT_TIN_TOWER_1F_SUICUNE, nil, "a Crystal-only event is absent on gs") + eq(crys.EVENT_TIN_TOWER_1F_SUICUNE, 1970, "and resolves on crystal") + eq(crys.EVENT_WADE_READY_FOR_REMATCH, nil, "a retired Gold event is absent on crystal") + check(gs.EVENT_WADE_READY_FOR_REMATCH ~= nil, "and still resolves on gs") + check(Gen2Flags.byName("crystal") == crys, "byName caches per lineage") + check(Gen2Flags.byName("gold") == gs, "an unknown lineage reads as gs") +end + +do + local crystalNames = Catalog.gen2EventList("crystal") + local goldNames = Catalog.goldEventList() + local function has(list, name) + for _, n in ipairs(list) do if n == name then return true end end + return false + end + check(has(crystalNames, "EVENT_TIN_TOWER_1F_SUICUNE"), + "the crystal event list names Crystal's own flags") + check(not has(crystalNames, "EVENT_WADE_READY_FOR_REMATCH"), + "the crystal event list drops Gold's retired flags") + check(has(goldNames, "EVENT_WADE_READY_FOR_REMATCH"), + "the gold event list keeps them") + check(has(goldNames, "EVENT_BEAT_FALKNER"), "gold event list still has Falkner") + check(#crystalNames > #goldNames, "Crystal has more event flags than Gold") +end + +do + local S = newState("crystal") + local name = "EVENT_TIN_TOWER_1F_SUICUNE" + Ops.setFlag(S, name, true) + check(Gen.getFlag(S.save, name), "a Crystal-only event reads back set") + eq(S.save.flags[name], nil, "and never lands as a string key") + check(next(S.save.events) ~= nil, "it wrote the numeric bitfield") + + local G = newState("gold") + Ops.setFlag(G, name, true) + eq(G.save.flags[name], true, "the same name on Gold has no id and stays named") + + local moved = newState("crystal") + Ops.setFlag(moved, "EVENT_GOT_RAINBOW_WING", true) + local Events2 = require("src.world.gen2.Events") + local ev = Events2.new() + ev:restore(moved.save.events) + check(ev:get(822), "EVENT_GOT_RAINBOW_WING sets Crystal's bit 822") + check(not ev:get(120), "not Gold's bit 120") +end + +do + local S = newState("crystal") + Ops.partyAdd(S) + local mon = S.save.party[1] + + check(Ops.setCaughtTime(S, mon, 2), "caught time set") + eq(mon.caughtTime, 2, "caught time DAY") + check(S.dirty, "caught time dirties the save") + check(not Ops.setCaughtTime(S, mon, 2), "re-setting the same time only says") + Ops.setCaughtTime(S, mon, 9) + eq(mon.caughtTime, 3, "caught time clamps to NITE") + Ops.setCaughtTime(S, mon, -1) + eq(mon.caughtTime, 0, "caught time clamps to unknown") + + Ops.setCaughtLevel(S, mon, 40) + eq(mon.caughtLevel, 40, "caught level 40") + Ops.setCaughtLevel(S, mon, 99) + eq(mon.caughtLevel, 63, "caught level clamps to CAUGHT_LEVEL_MASK") + + Ops.setCaughtLocation(S, mon, 12) + eq(mon.caughtLocation, 12, "caught location 12") + Ops.setCaughtLocation(S, mon, -1) + eq(mon.caughtLocation, 127, "stepping below 0 wraps to LANDMARK_EVENT") + Ops.setCaughtLocation(S, mon, 128) + eq(mon.caughtLocation, 0, "and stepping past the mask wraps back to unknown") + + Ops.setCaughtByGender(S, mon, "girl") + eq(mon.caughtByGender, "girl", "caught by girl") + Ops.setCaughtByGender(S, mon, "none") + eq(mon.caughtByGender, nil, "caught by clears to nil, the Gold-save value") + + local Mon = require("src.battle.gen2.Mon") + Ops.setCaughtTime(S, mon, 3) + Ops.setCaughtLevel(S, mon, 20) + Ops.setCaughtLocation(S, mon, 5) + Ops.setCaughtByGender(S, mon, "girl") + local byte0, byte1 = Mon.packCaughtData(mon) + eq(byte0, 3 * 0x40 + 20, "the editor's fields pack into byte 0") + eq(byte1, 0x80 + 5, "and into byte 1") +end + +do + local G = newState("gold") + Ops.partyAdd(G) + local mon = G.save.party[1] + G.dirty = false + check(not Ops.setCaughtTime(G, mon, 2), "Gold refuses caught time") + eq(mon.caughtTime, nil, "and writes nothing") + check(not Ops.setCaughtLevel(G, mon, 20), "Gold refuses caught level") + check(not Ops.setCaughtLocation(G, mon, 5), "Gold refuses caught location") + check(not Ops.setCaughtByGender(G, mon, "boy"), "Gold refuses caught gender") + check(not G.dirty, "a refused caught edit never dirties") +end + +do + local S = newState("crystal") + eq(Gen.playerGender(S.save), "male", "a new Crystal save starts male") + check(Ops.setPlayerGender(S, "female"), "player gender set") + eq(S.save.player.gender, "female", "written to save.player.gender") + check(not Ops.setPlayerGender(S, "female"), "re-setting the same gender only says") + Ops.setPlayerGender(S, "male") + eq(Gen.playerGender(S.save), "male", "and back") + + local G = newState("gold") + check(not Ops.setPlayerGender(G, "female"), "Gold refuses a gender change") + eq(G.save.player.gender, "male", "Gold's field is left alone") +end + +do + local landmarks = { + gen2Landmarks = { + landmarks = { + LANDMARK_AZALEA_TOWN = { id = "LANDMARK_AZALEA_TOWN", index = 12, + name = "AZALEA TOWN" }, + LANDMARK_BURNED_TOWER = { id = "LANDMARK_BURNED_TOWER", index = 24, + name = "BURNED\nTOWER" }, + }, + }, + } + eq(Gen.landmarkName(landmarks, 12), "AZALEA TOWN", "landmark by index") + eq(Gen.landmarkName(landmarks, 24), "BURNED TOWER", "two-line names flatten") + eq(Gen.landmarkName(landmarks, 0), "UNKNOWN", "0 reads as unknown") + eq(Gen.landmarkName(landmarks, 0x7e), "GIFT", "LANDMARK_GIFT") + eq(Gen.landmarkName(landmarks, 0x7f), "EVENT", "LANDMARK_EVENT") + eq(Gen.landmarkName(landmarks, 99), "#99", "an unmapped index shows its number") +end + +do + local Kit = require("Kit") + local MonEditor = require("MonEditor") + local ItemsPanel = require("Items") + + local function clipped(r) + local x1, y1, x2, y2 = r.x, r.y, r.x + r.w, r.y + r.h + if r.clip then + x1 = math.max(x1, r.clip.x); y1 = math.max(y1, r.clip.y) + x2 = math.min(x2, r.clip.x + r.clip.w); y2 = math.min(y2, r.clip.y + r.clip.h) + end + if x2 - x1 <= 1 or y2 - y1 <= 1 then return nil end + return x1, y1, x2, y2 + end + + local function overlap(a, b) + local ax1, ay1, ax2, ay2 = clipped(a) + if not ax1 then return false end + local bx1, by1, bx2, by2 = clipped(b) + if not bx1 then return false end + return math.min(ax2, bx2) - math.max(ax1, bx1) > 1 + and math.min(ay2, by2) - math.max(ay1, by1) > 1 + end + + local function auditFrame(label, W, H) + local controls = {} + for _, r in ipairs(Kit.audit or {}) do + if r.class == "control" then controls[#controls + 1] = r end + end + check(#controls > 0, label .. ": the frame dispatched controls at all") + local collisions, escapes = 0, 0 + for i = 1, #controls do + local a = controls[i] + local x1, y1, x2, y2 = clipped(a) + if x1 and (x1 < -0.5 or y1 < -0.5 or x2 > W + 0.5 or y2 > H + 0.5) then + escapes = escapes + 1 + print((" escape: %s (%.0f,%.0f %.0fx%.0f)") + :format(a.label, a.x, a.y, a.w, a.h)) + end + for j = i + 1, #controls do + if overlap(a, controls[j]) then + collisions = collisions + 1 + print((" overlap: '%s' vs '%s' at (%.0f,%.0f) / (%.0f,%.0f)") + :format(a.label, controls[j].label, a.x, a.y, + controls[j].x, controls[j].y)) + end + end + end + check(collisions == 0, label .. ": no two controls overlap") + check(escapes == 0, label .. ": every control stays inside the panel") + end + + local sizes = { { 420, 700 }, { 640, 768 }, { 1280, 720 } } + for _, version in ipairs({ "gold", "crystal" }) do + for _, size in ipairs(sizes) do + local W, H = size[1], size[2] + local S = newState(version) + Ops.partyAdd(S) + Ops.selectParty(S, 1) + Ops.addToBag(S, S.cat.items[1]) + Ops.addToPc(S, S.cat.items[2]) + Kit.layout(W, H) + for _, panel in ipairs({ { "inspector", MonEditor }, { "items", ItemsPanel } }) do + local label = ("%s %dx%d %s"):format(version, W, H, panel[1]) + Kit.beginFrame(-100, -100, false, 0) + Kit.audit = {} + local ok, err = pcall(panel[2].draw, S, Kit, 0, 0, W, H) + check(ok, label .. " draws: " .. tostring(err)) + if ok then + Kit.beginFrame(-100, -100, false, 0) + Kit.audit = {} + ok, err = pcall(panel[2].draw, S, Kit, 0, 0, W, H) + check(ok, label .. " redraws: " .. tostring(err)) + end + if ok then auditFrame(label, W, H) end + Kit.audit = nil + end + end + end + + local S = newState("crystal") + Ops.partyAdd(S) + Ops.selectParty(S, 1) + Kit.layout(1280, 720) + Kit.beginFrame(-100, -100, false, 0) + Kit.audit = {} + MonEditor.draw(S, Kit, 0, 0, 1280, 720) + local labels = {} + for _, r in ipairs(Kit.audit) do labels[r.label] = true end + Kit.audit = nil + check(labels.MORN and labels.NITE, "the Crystal inspector offers the caught times") + check(labels.BOY and labels.GIRL, "and the OT gender chips") + + local G = newState("gold") + Ops.partyAdd(G) + Ops.selectParty(G, 1) + Kit.beginFrame(-100, -100, false, 0) + Kit.audit = {} + MonEditor.draw(G, Kit, 0, 0, 1280, 720) + local goldLabels = {} + for _, r in ipairs(Kit.audit) do goldLabels[r.label] = true end + Kit.audit = nil + check(not goldLabels.MORN, "the Gold inspector has no caught row") + + local function itemsLabels(state) + Kit.beginFrame(-100, -100, false, 0) + Kit.audit = {} + ItemsPanel.draw(state, Kit, 0, 0, 1280, 720) + local seen = {} + for _, r in ipairs(Kit.audit) do seen[r.label] = true end + Kit.audit = nil + return seen + end + check(itemsLabels(S).GIRL, "the Crystal Items tab carries the TRAINER card") + check(not itemsLabels(G).GIRL, "the Gold Items tab does not") + + local function bottomOverflow(state) + local H = 380 + Kit.layout(640, H) + state.inspectorScroll = 100000 + for _ = 1, 2 do + Kit.beginFrame(-100, -100, false, 0) + Kit.audit = {} + MonEditor.draw(state, Kit, 0, 0, 640, H) + end + local lowest = 0 + for _, r in ipairs(Kit.audit) do + if r.class == "control" then lowest = math.max(lowest, r.y + r.h) end + end + Kit.audit = nil + return math.floor(lowest - H + 0.5) + end + local goldOver = bottomOverflow(G) + eq(bottomOverflow(S), goldOver, + "the caught rows are fully counted in the inspector's scroll height") + check(goldOver <= 4, ("the inspector reaches its last control (%d px short)") + :format(goldOver)) +end + +local function readable(path) + local fh = io.open(path, "r") + if not fh then return false end + fh:close() + return true +end + +do + local Gen2Flags = require("Gen2Flags") + local goldAsm = (os.getenv("POKEGOLD") or "../pokegold") + .. "/constants/event_flags.asm" + local crystalAsm = (os.getenv("POKECRYSTAL") or "../pokecrystal") + .. "/constants/event_flags.asm" + if readable(goldAsm) and readable(crystalAsm) and readable("tools/goldwalk/flags.lua") then + local Flags = dofile("tools/goldwalk/flags.lua") + local gold = Flags.parse(goldAsm) + local crys = Flags.parse(crystalAsm) + local addedBad, removedBad, missing = 0, 0, 0 + for name, id in pairs(crys) do + if gold[name] ~= id and Gen2Flags.CRYSTAL_ADDED[name] ~= id then + missing = missing + 1 + end + end + for name, id in pairs(Gen2Flags.CRYSTAL_ADDED) do + if crys[name] ~= id then addedBad = addedBad + 1 end + end + for name in pairs(Gen2Flags.CRYSTAL_REMOVED) do + if crys[name] ~= nil or gold[name] == nil then removedBad = removedBad + 1 end + end + eq(missing, 0, "every Crystal event Gold disagrees on is in CRYSTAL_ADDED") + eq(addedBad, 0, "every CRYSTAL_ADDED id matches pokecrystal") + eq(removedBad, 0, "every CRYSTAL_REMOVED name is Gold-only") + local byName = Gen2Flags.byName("crystal") + local wrong = 0 + for name, id in pairs(crys) do + if byName[name] ~= id then wrong = wrong + 1 end + end + eq(wrong, 0, "the resolved crystal table is pokecrystal's whole event list") + else + check(true, "pokegold / pokecrystal absent : flag delta cross-check SKIPPED") + end +end + +do + local Gen2Flags = require("Gen2Flags") + local cache = os.getenv("CRYSTAL_CACHE") + or ((os.getenv("HOME") or "") .. + "/Library/Application Support/LOVE/lead-crystal/crystal") + local initialPath = cache .. "/data/generated/initial_events.lua" + local stdScripts = (os.getenv("POKECRYSTAL") or "../pokecrystal") + .. "/engine/events/std_scripts.asm" + if readable(initialPath) and readable(stdScripts) then + local Flags = dofile("tools/goldwalk/flags.lua") + local romIds = assert(loadfile(initialPath))().flags + -- InitializeEventsScript sets EVENT_AZALEA_TOWN_KURT twice in a row + -- (../pokecrystal/engine/events/std_scripts.asm:575-576). + local names = {} + for _, n in ipairs(Flags.setEventsOf(stdScripts, "InitializeEventsScript")) do + if names[#names] ~= n then names[#names + 1] = n end + end + local byName = Gen2Flags.byName("crystal") + eq(#names, #romIds, "InitializeEventsScript sets as many flags as the cart") + local mismatches, lo, hi = 0, math.huge, -math.huge + for i, name in ipairs(names) do + local got = romIds[i] + if got then lo, hi = math.min(lo, got), math.max(hi, got) end + if byName[name] ~= got then + mismatches = mismatches + 1 + if mismatches <= 5 then + print((" #%d %s table=%s cart=%s") + :format(i, name, tostring(byName[name]), tostring(got))) + end + end + end + eq(mismatches, 0, + ("crystal names == cart ids across %d..%d"):format(lo, hi)) + else + check(true, "crystal cache absent : cart cross-check SKIPPED") + end +end + print(string.format("save editor gen2 tests: %d passed, %d failed", passed, failed)) if failed > 0 then os.exit(1) end diff --git a/tools/build_rom_data.py b/tools/build_rom_data.py index e76c17c2..31e06cca 100755 --- a/tools/build_rom_data.py +++ b/tools/build_rom_data.py @@ -34,6 +34,28 @@ DATASETS = ( "text", "field", "battle_anims", ) +# Sound is decoded by the Lua importer (src/import/RomExtractor.lua), not here, +# so --clean must step around it rather than delete what it cannot rebuild. +UNOWNED_DATA = ("audio.lua",) +UNOWNED_ASSETS = ("audio",) + + +def clean_generated(out_dir, assets_dir): + """Empty the generated dirs, keeping artifacts this tool never writes.""" + kept = [] + for path, spared in ((out_dir, UNOWNED_DATA), (assets_dir, UNOWNED_ASSETS)): + if not os.path.isdir(path): + continue + for name in os.listdir(path): + target = os.path.join(path, name) + if name in spared: + kept.append(target) + elif os.path.isdir(target): + shutil.rmtree(target) + else: + os.remove(target) + return kept + _TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) VERSION_MANIFESTS = { "red": os.path.join(_TOOLS_DIR, "rom_manifest.json"), @@ -2207,9 +2229,9 @@ def main(argv=None): out_dir = args.out or prefix + os.path.join("data", "generated") assets_dir = args.assets or prefix + os.path.join("assets", "generated") if args.clean: - for path in (out_dir, assets_dir): - if os.path.isdir(path): - shutil.rmtree(path) + kept = clean_generated(out_dir, assets_dir) + for path in kept: + print(f"kept {path} (not produced by this tool)") os.makedirs(out_dir, exist_ok=True) os.makedirs(assets_dir, exist_ok=True) datasets = tuple(args.only) if args.only else DATASETS diff --git a/tools/crystal_movie_symbols.py b/tools/crystal_movie_symbols.py new file mode 100644 index 00000000..82d8a12e --- /dev/null +++ b/tools/crystal_movie_symbols.py @@ -0,0 +1,72 @@ +"""Crystal intro-movie and title-screen symbols for the Crystal manifest. + +Gold's title/intro symbols do not exist in Crystal: CrystalIntro is a different +program with its own asset set (engine/movie/intro.asm:1678-1777) and the title +composes on the fly with no tilemap (engine/movie/title.asm:364-374). +""" + +# engine/movie/intro.asm:1678-1777 +INTRO_SYMBOLS = [ + "IntroSuicuneRunGFX", + "IntroPichuWooperGFX", + "IntroBackgroundGFX", + "IntroBackgroundTilemap", + "IntroBackgroundAttrmap", + "IntroBackgroundPalette", + "IntroUnownsGFX", + "IntroPulseGFX", + "IntroUnownATilemap", + "IntroUnownAAttrmap", + "IntroUnownHITilemap", + "IntroUnownHIAttrmap", + "IntroUnownsTilemap", + "IntroUnownsAttrmap", + "IntroUnownsPalette", + "IntroCrystalUnownsGFX", + "IntroCrystalUnownsTilemap", + "IntroCrystalUnownsAttrmap", + "IntroCrystalUnownsPalette", + "IntroSuicuneCloseGFX", + "IntroSuicuneCloseTilemap", + "IntroSuicuneCloseAttrmap", + "IntroSuicuneClosePalette", + "IntroSuicuneJumpGFX", + "IntroSuicuneBackGFX", + "IntroSuicuneJumpTilemap", + "IntroSuicuneJumpAttrmap", + "IntroSuicuneBackTilemap", + "IntroSuicuneBackAttrmap", + "IntroSuicunePalette", + "IntroUnownBackGFX", + "IntroGrass1GFX", + "IntroGrass2GFX", + "IntroGrass3GFX", + "IntroGrass4GFX", +] + +# Palette fades that live as local labels inside their scene routines. +# engine/movie/intro.asm:1189 (fade.pal), :1385-1388 (unown_1.pal / unown_2.pal) +INTRO_FADE_SYMBOLS = [ + "Intro_Scene24_ApplyPaletteFade.FadePals", + "Intro_Scene20_AppearUnown.pal1", + "Intro_Scene20_AppearUnown.pal2", + "Intro_FadeUnownWordPals.FastFadePalettes", + "Intro_FadeUnownWordPals.SlowFadePalettes", +] + +# engine/movie/title.asm:364-374 +TITLE_SYMBOLS = [ + "TitleSuicuneGFX", + "TitleLogoGFX", + "TitleCrystalGFX", + "TitleScreenPalettes", +] + +# engine/movie/splash.asm:344 -- replaces Gold's GameFreakLogoStarsGFX +SPLASH_SYMBOLS = [ + "GameFreakDittoGFX", + "GameFreakDittoPaletteFade", +] + +MOVIE_SYMBOLS = ( + INTRO_SYMBOLS + INTRO_FADE_SYMBOLS + TITLE_SYMBOLS + SPLASH_SYMBOLS) diff --git a/tools/crystal_symbol_deltas.py b/tools/crystal_symbol_deltas.py new file mode 100644 index 00000000..800da88d --- /dev/null +++ b/tools/crystal_symbol_deltas.py @@ -0,0 +1,147 @@ +"""REQUIRED_SYMBOLS delta between pokegold.sym and pokecrystal.sym. + +make_gold_manifest.REQUIRED_SYMBOLS names 340 symbols by hand. 25 of them do +not exist in pokecrystal.sym: Crystal renamed the credits mons, split the +trainer-card / Pokegear / pack-pals blocks by player gender, split the two +FontsExtra tiles apart, and replaced the whole Gold/Silver intro movie and +title screen. DROP_SYMBOLS lists those 25 and ADD_SYMBOLS the verified +replacements; the intro, title and splash names come from +crystal_movie_symbols.MOVIE_SYMBOLS (that file is the pinned CT-9 list and is +not edited here). MOBILE_SYMBOLS is the Mobile System GB art, which no Gold +or Silver ROM carries at all. + +Every name below was checked against ../pokecrystal-symbols/pokecrystal.sym. +""" + +from __future__ import annotations + +from crystal_movie_symbols import MOVIE_SYMBOLS + +# Gold-only names, grouped by what replaces them. +DROP_SYMBOLS = frozenset({ + # engine/movie/title.asm:364-373 -- no tilemap; DrawTitleGraphic composes. + "TitleScreenGFX1", "TitleScreenGFX2", "TitleScreenGFX3", + "TitleScreenGFX4", "TitleScreenTilemap", + # engine/movie/credits.asm:610-613 + "CreditsBellossomGFX", "CreditsTogepiGFX", + "CreditsElekidGFX", "CreditsSentretGFX", + # gfx/misc.asm:44 + "GameFreakLogoStarsGFX", + # engine/gfx/player_gfx.asm:114,117,120,203,206 + "ChrisPicAndTrainerCardGFX", + # engine/gfx/color.asm:1330,1333 + "PokegearPals", + # engine/gfx/cgb_layouts.asm:818,821 + "_CGB_PackPals.PackPals", + # gfx/font.asm:51,63 + "FontsExtra_SolidBlackAndUpArrowGFX", + # engine/movie/intro.asm:1 -- CrystalIntro is a different program. + "Intro_WaterGFX1", "Intro_WaterTilemap", "Intro_WaterMeta", + "Intro_WaterGFX2", + "Intro_GrassGFX1", "Intro_GrassTilemap", "Intro_GrassMeta", + "Intro_GrassGFX2", + "Intro_FireGFX1", "Intro_FireGFX2", "Intro_FireGFX3", +}) + +# Crystal replacements, minus the intro/title/splash ones MOVIE_SYMBOLS owns. +ADD_SYMBOLS = frozenset({ + # engine/movie/credits.asm:610-613 + "CreditsPichuGFX", "CreditsSmoochumGFX", + "CreditsDittoGFX", "CreditsIgglybuffGFX", + # engine/gfx/player_gfx.asm:114,117,120,203,206 + "ChrisCardPic", "KrisCardPic", "TrainerCardGFX", "ChrisPic", "KrisPic", + # engine/gfx/color.asm:1330,1333 + "MalePokegearPals", "FemalePokegearPals", + # engine/gfx/cgb_layouts.asm:818,821 + "_CGB_PackPals.ChrisPackPals", "_CGB_PackPals.KrisPackPals", + # gfx/font.asm:51,63 -- black is 1bpp at tile $60, up_arrow 2bpp at $61. + "FontsExtra_SolidBlackGFX", "FontsExtra2_UpArrowGFX", + # main.asm:425-448 -- the pic-animation pointer tables, absent from Gold. + "AnimationPointers", "AnimationIdlePointers", + "BitmasksPointers", "FramesPointers", + "UnownAnimationPointers", "UnownAnimationIdlePointers", + "UnownBitmasksPointers", "UnownFramesPointers", + # engine/tilesets/tileset_anims.asm -- the five Crystal-only anim steps. + "AnimateFountainTile", + "ForestTreeLeftAnimation", "ForestTreeRightAnimation", + "ForestTreeLeftAnimation2", "ForestTreeRightAnimation2", + # engine/overworld/wildmons.asm:493-524 -- Raikou and Entei only. + "InitRoamMons", + # data/events/unown_walls.asm:7,15 -- the four Ruins of Alph wall words + # and the menu box each one is drawn in. + "UnownWalls", "MenuHeaders_UnownWalls", + # data/battle_tower/classes.asm:6 and data/battle_tower/parties.asm:1 -- + # the Battle Tower roster, which no Gold or Silver ROM carries; the + # sprites table is engine/events/battle_tower/battle_tower.asm:1578 + # INCLUDE "data/trainers/sprites.asm". + "BattleTowerTrainers", "BattleTowerMons", "BTTrainerClassSprites", + # data/battle_tower/unknown.asm:1, copied into wBT_OTTrainerData whole. + "BattleTowerTrainerData", + # engine/events/battle_tower/load_trainer.asm:24,112 -- the two rejection + # loops whose `maskbits` / `cp` pair carries the sample ceiling. Crystal + # 1.0 and 1.1 differ only in the trainer one (:29-37), so it is read out + # of the cart rather than written down. + "LoadOpponentTrainerAndPokemon.resample", + "LoadRandomBattleTowerMon.resample", +}) + +# Mobile System GB art, all of it present in the international v1.0 object: +# mobile/*.asm assembles there, only the menus that reach it are Japan-only. +MOBILE_SYMBOLS = frozenset({ + # mobile/mobile_5c.asm:290,293,296,753,756-771,866,874,878 + "AsciiFontGFX", "PichuAnimatedMobileGFX", "ElectroBallMobileGFX", + "PichuBorderMobileGFX", "Stadium2N64GFX", "Stadium2N64Tilemap", + "Stadium2N64Attrmap", "PasswordTopTilemap", "PasswordBottomTilemap", + "PasswordShiftTilemap", "ChooseMobileCenterTilemap", + "MobilePasswordAttrmap", "ChooseMobileCenterAttrmap", + "MobilePasswordPalettes", + # mobile/mobile_5e.asm:2,5,8,11,14,18,925,928,931,934,941 + "MobileCardGFX", "ChrisSilhouetteGFX", "KrisSilhouetteGFX", + "MobileCard2GFX", "CardLargeSpriteAndFolderGFX", "CardSpriteGFX", + "DialpadTilemap", "DialpadAttrmap", "DialpadGFX", "DialpadCursorGFX", + "MobileCardListGFX", + # mobile/mobile_5f.asm:84,87,91,3528,3534,3537 + "HaveWantGFX", "MobileSelectGFX", "HaveWantMap", "PokemonNewsGFX", + "PokemonNewsTileAttrmap", "PokemonNewsPalettes", + # mobile/mobile_5b.asm:206,209,212,215,758 + "MobileSystemSplashScreen_InitGFX.Tiles", + "MobileSystemSplashScreen_InitGFX.Tilemap", + "MobileSystemSplashScreen_InitGFX.Attrmap", + "MobileSplashScreenPalettes", "MobileAdapterCheckGFX", + # mobile/mobile_42.asm:1733-1763 and mobile/mobile_40.asm:6921,6924 + "MobileTradeSpritesGFX", "MobileTradeGFX", "MobileTradeTilemapLZ", + "MobileTradeAttrmapLZ", "MobileCable1GFX", "MobileCable2GFX", + "UnusedMobilePulsePalettes", "MobileTradeBGPalettes", + "MobileTradeOB1Palettes", "MobileTradeOB2Palettes", + "MobileAdapterPalettes", "MobileTradeLightsGFX", + "MobileTradeLightsPalettes", + # mobile/mobile_45_2.asm:1362,1365,1368 and + # mobile/mobile_45_sprite_engine.asm:311 + "PichuBorderMobileOBPalettes", "PichuBorderMobileBGPalettes", + "PichuBorderMobileTilemapAttrmap", "MobileDialingGFX", + # mobile/mobile_12.asm:1007,1010, mobile/mobile_22.asm:518, + # mobile/mobile_41.asm:1115, mobile/fixed_words.asm:3231 + "MobileUpArrowGFX", "MobileDownArrowGFX", "EZChatCursorGFX", + "MobileDialingFrameGFX", "SelectStartGFX", + # engine/menus/main_menu.asm:24 and gfx/font.asm:58 + "MobileMenuGFX", "MobilePhoneTilesGFX", + # engine/link/mystery_gift.asm:1606,1920,1923 + "MysteryGiftGFX", "CardTradeGFX", "CardTradeSpriteGFX", +}) + + +def crystal_required(gold_required): + """Apply the delta to make_gold_manifest.REQUIRED_SYMBOLS.""" + gold = frozenset(gold_required) + stale = sorted(DROP_SYMBOLS - gold) + if stale: + raise SystemExit( + "crystal_symbol_deltas: DROP_SYMBOLS names that Gold no longer " + "requires: " + ", ".join(stale)) + extra = ADD_SYMBOLS | MOBILE_SYMBOLS | set(MOVIE_SYMBOLS) + collisions = sorted(extra & gold) + if collisions: + raise SystemExit( + "crystal_symbol_deltas: ADD names already in the Gold set: " + + ", ".join(collisions)) + return frozenset((gold - DROP_SYMBOLS) | extra) diff --git a/tools/make_crystal_manifest.py b/tools/make_crystal_manifest.py new file mode 100644 index 00000000..033686a6 --- /dev/null +++ b/tools/make_crystal_manifest.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +"""Generate tools/rom_manifest_crystal.json from pret/pokecrystal. + +Crystal is its own pret tree, but the manifest SHAPE is Gold's: same constant +blocks, same charmap parser, same symbol resolution. So this drives +make_gold_manifest.generate() over ../pokecrystal instead of forking it, the +way make_yellow_manifest.py drives make_rom_manifest's helpers over +pokeyellow. Three things are passed in: + + * defines -- the EMPTY set. ../pokecrystal/Makefile:129 builds the retail + international v1.0 object with no -D at all (:130-134 add + _CRYSTAL11 / _CRYSTAL_AU / _DEBUG / _CRYSTAL11_VC for the four + other targets). Leaving Gold's {"_GOLD"} in place would take + an `IF DEF(_GOLD)` arm that Crystal never assembles. + * required -- crystal_symbol_deltas.crystal_required(), the Gold symbol set + with the 25 Gold-only names swapped for their Crystal + replacements plus crystal_movie_symbols.MOVIE_SYMBOLS. + * sha1 -- the Crystal cart hash. + +`anim_labels` is on: Crystal has per-species pic-animation tables +(../pokecrystal/main.asm:425-448) and Gold has none. + +Crystal also declares two extra RGBDS charmaps that Gold has not got at all +(../pokecrystal/constants/charmap.asm:422-442): `unown`, used by the Ruins of +Alph wall words, and `ascii`, used only by the Mobile System GB code. Neither +is more rows of the main charmap -- the same byte means a different thing in +each -- so make_gold_manifest.charmap deliberately STOPS at the first +`newcharmap`, and that guard has to keep protecting the main table. The Unown +one is carried here instead, as its own top-level `unownCharmap` key: that is +where `charmap` and `fontCharmap` already live, so a consumer picks the map it +wants by name and no reader of the main table can see these bytes. The `ascii` +map is not emitted, because nothing outside the Mobile System reads it. + +Usage: python3 tools/make_crystal_manifest.py +Default paths: pokecrystal at ../pokecrystal (relative to the repo) or +/Users/bryanbassett/Documents/development/pokecrystal; symbols at +/Users/bryanbassett/Documents/development/pokecrystal-symbols/pokecrystal.sym. +""" + +from __future__ import annotations + +import argparse +import json +import os +import re +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +import make_gold_manifest as gold # noqa: E402 +from crystal_symbol_deltas import crystal_required # noqa: E402 +from rom_data import CANONICAL_CRYSTAL_SHA1 # noqa: E402 + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DEV = "/Users/bryanbassett/Documents/development" +DEFAULT_POKECRYSTAL_CANDIDATES = [ + os.path.join(os.path.dirname(REPO_ROOT), "pokecrystal"), + os.path.join(DEV, "pokecrystal"), +] +DEFAULT_SYMBOLS = os.path.join(DEV, "pokecrystal-symbols/pokecrystal.sym") +DEFAULT_OUT = os.path.join( + os.path.dirname(__file__), "rom_manifest_crystal.json") + +# ../pokecrystal/Makefile:129 +CRYSTAL_ASM_DEFINES = frozenset() + +CRYSTAL_REQUIRED_SYMBOLS = crystal_required(gold.REQUIRED_SYMBOLS) + + +def _rgbds_int(expr, i): + """Evaluate one `charmap` value expression for loop counter `i`. + + RGBDS `$xx` is hex and `/` is integer division; nothing else in the block + needs modelling. The whitelist is what keeps this from being eval() on + arbitrary asm. + """ + text = re.sub(r"\$([0-9a-fA-F]+)", lambda m: str(int(m.group(1), 16)), expr) + text = text.replace("/", "//") + if not re.fullmatch(r"[0-9i()+\-*/ ]+", text): + raise ValueError(f"unsupported charmap expression: {expr}") + return int(eval(text, {"__builtins__": {}}, {"i": i})) # noqa: S307 + + +def unown_charmap(pokecrystal, defines=None): + """The `unown` charmap: byte -> letter, same shape as gold.charmap. + + ../pokecrystal/constants/charmap.asm:422-431 is a `pushc` block that names + the map, DEFs a string of every printable character, and emits one + `charmap STRSLICE(...)` per character inside a `for`. So the parse has to + follow the loop rather than read literal rows -- but it still reads the + letter set and the tile arithmetic out of the asm, not out of a copy here. + """ + path = os.path.join(pokecrystal, "constants", "charmap.asm") + out, strings, inside, loop = {}, {}, False, None + for _, line in gold.read_asm(path, defines): + s = line.strip() + if re.match(r"newcharmap\s+unown\b", s): + inside = True + continue + if not inside: + continue + if re.match(r"(popc|newcharmap)\b", s): + break + m = re.match(r'DEF\s+(\w+)\s+EQUS\s+"(.*)"$', s) + if m: + strings[m.group(1)] = m.group(2) + continue + m = re.match(r"for\s+(\w+),\s*STRLEN\(#(\w+)\)\s*$", s) + if m: + loop = (m.group(1), strings[m.group(2)]) + continue + if re.match(r"endr\s*$", s): + loop = None + continue + m = re.match( + r"charmap\s+STRSLICE\(#(\w+),\s*\w+,\s*\w+\s*\+\s*1\),\s*(.+)$", s) + if m and loop: + for index, char in enumerate(strings[m.group(1)]): + out[str(_rgbds_int(m.group(2), index))] = char + continue + m = re.match(r'charmap\s+"(.*)",\s*(\$[0-9a-fA-F]+)$', s) + if m: + out[str(int(m.group(2)[1:], 16))] = m.group(1) + if not out: + raise SystemExit("charmap.asm has no `unown` charmap") + return out + + +def generate(pokecrystal, symbols_path): + data = gold.generate( + pokecrystal, symbols_path, + defines=CRYSTAL_ASM_DEFINES, + required=CRYSTAL_REQUIRED_SYMBOLS, + sha1=CANONICAL_CRYSTAL_SHA1, + anim_labels=True) + # Crystal renumbers the block: 162 flags to Gold's 93, so a consumer that + # hardcodes Gold's indices reads the wrong flag. + data["constants"]["engineFlagOrder"] = gold.parse_const_block( + os.path.join(pokecrystal, "constants", "engine_flags.asm"), + defines=CRYSTAL_ASM_DEFINES) + data["unownCharmap"] = unown_charmap(pokecrystal, CRYSTAL_ASM_DEFINES) + return data + + +def find_pokecrystal(): + for candidate in DEFAULT_POKECRYSTAL_CANDIDATES: + if os.path.isfile(os.path.join(candidate, "main.asm")): + return candidate + return DEFAULT_POKECRYSTAL_CANDIDATES[-1] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--pokecrystal", default=find_pokecrystal()) + parser.add_argument("--symbols", default=DEFAULT_SYMBOLS) + parser.add_argument("--out", default=DEFAULT_OUT) + args = parser.parse_args() + + pokecrystal = os.path.abspath(args.pokecrystal) + if not os.path.isfile(os.path.join(pokecrystal, "main.asm")): + raise SystemExit(f"{pokecrystal} is not a pokecrystal checkout") + data = generate(pokecrystal, os.path.abspath(args.symbols)) + with open(args.out, "w", encoding="utf-8", newline="\n") as f: + json.dump(data, f, ensure_ascii=False, indent=2, sort_keys=True) + f.write("\n") + print(f"wrote {args.out}") + + +if __name__ == "__main__": + main() diff --git a/tools/make_gold_manifest.py b/tools/make_gold_manifest.py index 074e7811..5f48fb3b 100644 --- a/tools/make_gold_manifest.py +++ b/tools/make_gold_manifest.py @@ -69,8 +69,14 @@ def strip_comment(line): return "".join(out).rstrip() -def read_asm(path): - """Read an asm file as (lineno, text), comments stripped, IF resolved.""" +def read_asm(path, defines=None): + """Read an asm file as (lineno, text), comments stripped, IF resolved. + + `defines` overrides ASM_DEFINES for another tree; pokecrystal's retail + v1.0 target passes no -D at all (../pokecrystal/Makefile:129). + """ + if defines is None: + defines = ASM_DEFINES lines = [] stack = [] # stack of [taking, condition_known] with open(path, encoding="utf-8") as f: @@ -79,7 +85,7 @@ def read_asm(path): s = line.strip() m = re.match(r"IF\s+(!)?DEF\((\w+)\)\s*$", s, re.IGNORECASE) if m: - defined = m.group(2) in ASM_DEFINES + defined = m.group(2) in defines taking = (not defined) if m.group(1) else defined stack.append([taking, True]) continue @@ -115,7 +121,7 @@ def parse_number(tok): return -val if neg else val -def parse_const_block(path, stop_at=None): +def parse_const_block(path, stop_at=None, defines=None): """Parse a linear const_def/const/const_skip block into an ordered list. Index i of the returned list is the constant's value (None for a gap); @@ -123,7 +129,7 @@ def parse_const_block(path, stop_at=None): """ names = [] value = None - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() if not s: continue @@ -153,7 +159,7 @@ def parse_const_block(path, stop_at=None): return names -def parse_const_block_at(path, first_const, stop_at=None): +def parse_const_block_at(path, first_const, stop_at=None, defines=None): """Parse the one const_def block whose first `const` is `first_const`. parse_const_block walks a file linearly and a second `const_def` in the @@ -166,7 +172,7 @@ def parse_const_block_at(path, first_const, stop_at=None): names = [] value = None started = False - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() if not s: continue @@ -201,7 +207,7 @@ def parse_const_block_at(path, first_const, stop_at=None): return names -def parse_prefixed_consts(path, prefixes, exact=()): +def parse_prefixed_consts(path, prefixes, exact=(), defines=None): """Ordered const names from a file, filtered by prefix (mixed blocks). map_data_constants.asm and friends stack several unrelated const_def @@ -210,7 +216,7 @@ def parse_prefixed_consts(path, prefixes, exact=()): even when they carry no shared prefix (TOWN, BALL, ...). """ out = [] - for _, line in read_asm(path): + for _, line in read_asm(path, defines): m = re.match(r"const\s+(\w+)", line.strip()) if not m: continue @@ -220,7 +226,7 @@ def parse_prefixed_consts(path, prefixes, exact=()): return out -def parse_sparse_consts(path, prefixes): +def parse_sparse_consts(path, prefixes, defines=None): """Ordered const names where index IS the const value (sparse blocks). parse_prefixed_consts packs a block densely, which is wrong for a block @@ -233,7 +239,7 @@ def parse_sparse_consts(path, prefixes): """ out = [] value = None - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() m = re.match(r"const_def(?:\s+(\d+))?\s*$", s) if m: @@ -259,7 +265,7 @@ def parse_sparse_consts(path, prefixes): return out -def extract_trainer_classes(pokegold): +def extract_trainer_classes(pokegold, defines=None): """Ordered trainer class names (constants/trainer_constants.asm). `trainerclass NAME` bumps its own counter and resets the const_def used @@ -271,7 +277,7 @@ def extract_trainer_classes(pokegold): classes = [] members = {} current = None - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() m = re.match(r"trainerclass\s+(\w+)", s) if m: @@ -287,7 +293,7 @@ def extract_trainer_classes(pokegold): return classes, members -def extract_items(pokegold): +def extract_items(pokegold, defines=None): """Ordered item ids, and how many of them ItemNames actually covers. parse_const_block cannot do this file: after NUM_ITEMS the TM and HM items @@ -304,7 +310,7 @@ def extract_items(pokegold): order = [] name_count = None in_macro = False - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() # The add_tm / add_hm macro bodies contain `const TM_\1` themselves; # counting those would insert a phantom "TM_" item before the real run. @@ -340,7 +346,7 @@ def extract_items(pokegold): return order[1:], name_count - 1 -def extract_specials(pokegold): +def extract_specials(pokegold, defines=None): """Ordered SpecialsPointers labels (data/events/special_pointers.asm). The `special` script command carries an index into this table, not a name, @@ -350,7 +356,7 @@ def extract_specials(pokegold): path = os.path.join(pokegold, "data/events/special_pointers.asm") names = [] in_macro = False - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() if re.match(r"MACRO\b", s): in_macro = True @@ -368,11 +374,11 @@ def extract_specials(pokegold): return names -def extract_std_scripts(pokegold): +def extract_std_scripts(pokegold, defines=None): """Ordered StdScripts labels (engine/events/std_scripts.asm).""" path = os.path.join(pokegold, "engine/events/std_scripts.asm") names = [] - for _, line in read_asm(path): + for _, line in read_asm(path, defines): m = re.match(r"add_stdscript\s+(\w+)", line.strip()) if m: names.append(m.group(1)) @@ -381,14 +387,14 @@ def extract_std_scripts(pokegold): return names -def extract_map_groups(pokegold): +def extract_map_groups(pokegold, defines=None): """Parse constants/map_constants.asm's newgroup/map_const/endgroup.""" path = os.path.join(pokegold, "constants/map_constants.asm") order = [] groups = {} group = 0 map_index = 0 - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() if re.match(r"newgroup\s+\w+", s): group += 1 @@ -411,12 +417,12 @@ def extract_map_groups(pokegold): return order, groups -def extract_types(pokegold): +def extract_types(pokegold, defines=None): """Type constants are physical IDs, a gap, then special IDs (Gen 1-style).""" path = os.path.join(pokegold, "constants/type_constants.asm") types = {} value = None - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() m = re.match(r"const_def(?:\s+(\$?\w+))?$", s) if m: @@ -435,12 +441,14 @@ def extract_types(pokegold): return types -def charmap(pokegold): +def charmap(pokegold, defines=None): """Byte -> text charmap, same shape as make_rom_manifest.charmap.""" expansions = { "": ".", "": "{LV}", "": "{ID}", + # ../pokecrystal/constants/charmap.asm:6 -- $14 is "" in English + "": "", # Compression bytes: the cart stores one byte and PlaceString expands # it into several glyphs. The font sheet only starts at $60, so these # three have no tile of their own and MUST be expanded here or the @@ -453,10 +461,15 @@ def charmap(pokegold): } out = {} path = os.path.join(pokegold, "constants/charmap.asm") - for _, line in read_asm(path): + for _, line in read_asm(path, defines): + stripped = line.strip() + # ../pokecrystal/constants/charmap.asm:423,433 -- the unown and ascii + # charmaps are separate RGBDS charmaps, not more rows of the main one. + if re.match(r"(pushc|newcharmap)\b", stripped): + break m = re.match( r'charmap\s+"((?:[^"\\]|\\.)*)",\s*(\$[0-9a-fA-F]+)', - line.strip()) + stripped) if not m: continue value = int(m.group(2)[1:], 16) @@ -478,22 +491,22 @@ def species_label(species_id): return "".join(part.capitalize() for part in parts) -def pokemon_names(pokegold): +def pokemon_names(pokegold, defines=None): """PokemonNames dname entries, in declared (dex) order.""" names = [] path = os.path.join(pokegold, "data/pokemon/names.asm") - for _, line in read_asm(path): + for _, line in read_asm(path, defines): m = re.match(r'dname\s+"([^"]*)"', line.strip()) if m: names.append(m.group(1)) return names -def music_order(pokegold): +def music_order(pokegold, defines=None): """Music_* labels in MUSIC_* id order from audio/music_pointers.asm.""" path = os.path.join(pokegold, "audio/music_pointers.asm") order = [] - for _, line in read_asm(path): + for _, line in read_asm(path, defines): m = re.match(r"dba\s+(Music_\w+)\s*$", line.strip()) if m: order.append(m.group(1)) @@ -502,11 +515,11 @@ def music_order(pokegold): return order -def sfx_order(pokegold): +def sfx_order(pokegold, defines=None): """Sfx_* labels in SFX_* id order from audio/sfx_pointers.asm.""" path = os.path.join(pokegold, "audio/sfx_pointers.asm") order = [] - for _, line in read_asm(path): + for _, line in read_asm(path, defines): m = re.match(r"dba\s+(Sfx_\w+)\s*$", line.strip()) if m: order.append(m.group(1)) @@ -515,7 +528,27 @@ def sfx_order(pokegold): return order -def pokemon_assets(pokegold, species_order, symbols): +# ../pokecrystal/main.asm:425-448 -- the four per-species pic-animation +# tables; field name in the manifest, symbol suffix in pokecrystal.sym. +ANIM_LABEL_SUFFIXES = ( + ("animLabel", "Animation"), + ("idleLabel", "AnimationIdle"), + ("bitmaskLabel", "Bitmasks"), + ("framesLabel", "Frames"), +) + + +def _anim_labels(base, symbols): + """{animLabel/idleLabel/bitmaskLabel/framesLabel: label or None}.""" + out = {} + for field, suffix in ANIM_LABEL_SUFFIXES: + label = base + suffix + out[field] = label if label in symbols.by_name else None + return out + + +def pokemon_assets(pokegold, species_order, symbols, defines=None, + anim_labels=False): """{species: {id, name, front, back, frontLabel, backLabel}}. Unown shares one pic per letter through UnownPicPointers (its @@ -523,11 +556,15 @@ def pokemon_assets(pokegold, species_order, symbols): per-species Frontpic/Backpic label, so its front/back/labels are left null; the extractor's own Unown handling (if any) goes through UnownPicPointers directly instead of this table. + + `anim_labels` adds the four pic-animation labels per species; off by + default because pokegold.sym carries none of them. """ - names = pokemon_names(pokegold) + names = pokemon_names(pokegold, defines) assets = {} for index, species in enumerate(species_order): name = names[index] if index < len(names) else species + base = species_label(species) if species == "UNOWN": # No per-species pic, but it does have a dex entry like anything # else, so the #DEX screen can still read it. @@ -537,8 +574,9 @@ def pokemon_assets(pokegold, species_order, symbols): "frontLabel": None, "backLabel": None, "dexLabel": "UnownPokedexEntry", } + if anim_labels: + assets[species].update(_anim_labels(base, symbols)) continue - base = species_label(species) front_label, back_label = base + "Frontpic", base + "Backpic" if front_label not in symbols.by_name or back_label not in symbols.by_name: raise ValueError( @@ -554,6 +592,8 @@ def pokemon_assets(pokegold, species_order, symbols): "frontLabel": front_label, "backLabel": back_label, "dexLabel": dex_label if dex_label in symbols.by_name else None, } + if anim_labels: + assets[species].update(_anim_labels(base, symbols)) return assets @@ -927,7 +967,7 @@ TEXT_SOURCES = ( ) -def text_labels(pokegold): +def text_labels(pokegold, defines=None): """Every text label in TEXT_SOURCES, in sorted order. Unlike Gen 1 there is no `dynamic` map beside this. pokered's decoder is @@ -939,7 +979,7 @@ def text_labels(pokegold): for name in TEXT_SOURCES: path = os.path.join(pokegold, "data/text", name) pending = None - for _, line in read_asm(path): + for _, line in read_asm(path, defines): stripped = line.strip() if not stripped: continue @@ -959,9 +999,11 @@ def text_labels(pokegold): def embedded_symbols(symbols, pokemon_labels, song_labels=(), - text_label_names=()): + text_label_names=(), required=None): """Resolve REQUIRED_SYMBOLS + pic labels + songs + text labels.""" - names = (set(REQUIRED_SYMBOLS) | set(pokemon_labels) + if required is None: + required = REQUIRED_SYMBOLS + names = (set(required) | set(pokemon_labels) | set(song_labels) | set(text_label_names)) for symbol_name in symbols.by_name: # Pokedex entries are split across four banks and the game derives the @@ -985,23 +1027,24 @@ def embedded_symbols(symbols, pokemon_labels, song_labels=(), } -def generate(pokegold, symbols_path): +def generate(pokegold, symbols_path, defines=None, required=None, + sha1=None, anim_labels=False): symbols = SymbolTable(symbols_path) species = parse_const_block( os.path.join(pokegold, "constants/pokemon_constants.asm"), - stop_at="NUM_POKEMON") + stop_at="NUM_POKEMON", defines=defines) species_order = [n or "UNUSED" for n in species[1:]] - map_order, map_groups = extract_map_groups(pokegold) + map_order, map_groups = extract_map_groups(pokegold, defines) tilesets = [n for n in parse_const_block( os.path.join(pokegold, "constants/tileset_constants.asm"), - stop_at="NUM_TILESETS") if n] + stop_at="NUM_TILESETS", defines=defines) if n] moves = parse_const_block( os.path.join(pokegold, "constants/move_constants.asm"), - stop_at="NUM_ATTACKS") + stop_at="NUM_ATTACKS", defines=defines) move_order = [n or "UNUSED" for n in moves[1:]] # sprite_constants.asm stacks the ids of two different tables. $01.. @@ -1019,26 +1062,29 @@ def generate(pokegold, symbols_path): # wVariableSprites, so naming them here would let World:resolveSprite hand # a slot id back as though it were something that could be drawn. sprite_path = os.path.join(pokegold, "constants/sprite_constants.asm") - sprites = parse_const_block(sprite_path, stop_at="NUM_POKEMON_SPRITES") + sprites = parse_const_block( + sprite_path, stop_at="NUM_POKEMON_SPRITES", defines=defines) sprite_order = [n or "UNUSED" for n in sprites[1:]] # The two DEFs the block itself ends its halves on. The $60..$7f hole # between them stays in sprite_order as UNUSED rows so the ids line up. num_overworld_sprites = len( - parse_const_block(sprite_path, stop_at="NUM_OVERWORLD_SPRITES")) - 1 + parse_const_block( + sprite_path, stop_at="NUM_OVERWORLD_SPRITES", + defines=defines)) - 1 sprite_pokemon = sprites.index("SPRITE_UNOWN") if len(sprites) - sprite_pokemon != 35: raise SystemExit( f"{sprite_path}: expected 35 SpriteMons ids, got " f"{len(sprites) - sprite_pokemon}") - types = extract_types(pokegold) + types = extract_types(pokegold, defines) # Environment (1-based), palette (0-based), fish-group (0-based) name # tables -- scraped by prefix so the mixed const_def blocks in # map_data_constants.asm cannot collide with each other. environments, palettes, fish_groups, spawns = [], [], [], [] path = os.path.join(pokegold, "constants/map_data_constants.asm") - for _, line in read_asm(path): + for _, line in read_asm(path, defines): s = line.strip() m = re.match(r"const\s+(\w+)", s) if not m: @@ -1060,7 +1106,8 @@ def generate(pokegold, symbols_path): # Moves' effect byte into one of these names so the battle engine can # switch on a readable id instead of a raw number. move_effects = parse_const_block( - os.path.join(pokegold, "constants/move_effect_constants.asm")) + os.path.join(pokegold, "constants/move_effect_constants.asm"), + defines=defines) move_effect_order = [n or "EFFECT_UNUSED" for n in move_effects] # Battle animations. constants/battle_anim_constants.asm stacks nine @@ -1070,55 +1117,66 @@ def generate(pokegold, symbols_path): # framesets, OAM sets, GFX sheets) plus the BG-effect and palette enums a # disassembled animation refers to by number. battle_anim = os.path.join(pokegold, "constants/battle_anim_constants.asm") - battle_anim_objects = parse_prefixed_consts(battle_anim, ("BATTLE_ANIM_OBJ_",)) - battle_anim_funcs = parse_prefixed_consts(battle_anim, ("BATTLE_ANIM_FUNC_",)) + battle_anim_objects = parse_prefixed_consts( + battle_anim, ("BATTLE_ANIM_OBJ_",), defines=defines) + battle_anim_funcs = parse_prefixed_consts( + battle_anim, ("BATTLE_ANIM_FUNC_",), defines=defines) battle_anim_framesets = parse_prefixed_consts( - battle_anim, ("BATTLE_ANIM_FRAMESET_",)) - battle_anim_oamsets = parse_prefixed_consts(battle_anim, ("BATTLE_ANIM_OAMSET_",)) + battle_anim, ("BATTLE_ANIM_FRAMESET_",), defines=defines) + battle_anim_oamsets = parse_prefixed_consts( + battle_anim, ("BATTLE_ANIM_OAMSET_",), defines=defines) # BATTLE_ANIM_GFX_* is the one block here that does not start at zero # (`const_def 1`, because AnimObjGFX row 0 is the empty AnimObj00GFX). # A placeholder in front keeps every list in this group indexable as # value + 1, so the extractor never has to remember which is which. battle_anim_gfx = ["BATTLE_ANIM_GFX_NONE"] + parse_prefixed_consts( - battle_anim, ("BATTLE_ANIM_GFX_",)) - battle_bg_effects = parse_prefixed_consts(battle_anim, ("BATTLE_BG_EFFECT_",)) + battle_anim, ("BATTLE_ANIM_GFX_",), defines=defines) + battle_bg_effects = parse_prefixed_consts( + battle_anim, ("BATTLE_BG_EFFECT_",), defines=defines) # Two separate blocks, each starting at zero: a BG palette 4 and an OBJ # palette 4 are different colours, so they cannot share one list. - battle_anim_bg_pals = parse_prefixed_consts(battle_anim, ("PAL_BATTLE_BG_",)) - battle_anim_ob_pals = parse_prefixed_consts(battle_anim, ("PAL_BATTLE_OB_",)) + battle_anim_bg_pals = parse_prefixed_consts( + battle_anim, ("PAL_BATTLE_BG_",), defines=defines) + battle_anim_ob_pals = parse_prefixed_consts( + battle_anim, ("PAL_BATTLE_OB_",), defines=defines) item_data = os.path.join(pokegold, "constants/item_data_constants.asm") # Pocket ids are 0-based (ITEM, KEY_ITEM, BALL, TM_HM); the ITEM_* / # ITEMMENU_* / HELD_* blocks share the file, hence the prefix scrape. pocket_order = parse_prefixed_consts( - item_data, (), exact=("ITEM", "KEY_ITEM", "BALL", "TM_HM")) - item_menu_order = parse_prefixed_consts(item_data, ("ITEMMENU_",)) + item_data, (), exact=("ITEM", "KEY_ITEM", "BALL", "TM_HM"), + defines=defines) + item_menu_order = parse_prefixed_consts( + item_data, ("ITEMMENU_",), defines=defines) # The HELD_* block is sparse (const_skip / const_next), so the index of # this list must BE the ItemAttributes effect byte or every held effect # past HELD_CLEANSE_TAG lands on the wrong item. - held_effect_order = parse_sparse_consts(item_data, ("HELD_",)) + held_effect_order = parse_sparse_consts( + item_data, ("HELD_",), defines=defines) mon_data = os.path.join(pokegold, "constants/pokemon_data_constants.asm") - growth_order = parse_prefixed_consts(mon_data, ("GROWTH_",)) - egg_group_order = parse_prefixed_consts(mon_data, ("EGG_",)) - evolve_order = parse_prefixed_consts(mon_data, ("EVOLVE_",)) + growth_order = parse_prefixed_consts(mon_data, ("GROWTH_",), defines=defines) + egg_group_order = parse_prefixed_consts(mon_data, ("EGG_",), defines=defines) + evolve_order = parse_prefixed_consts(mon_data, ("EVOLVE_",), defines=defines) # Map callbacks (constants/map_setup_constants.asm). That block is # `const_def 1`, so MAPCALLBACK_TILES is 1 and index 0 of this list is a # placeholder -- the same "value + 1" indexing BATTLE_ANIM_GFX_* uses. map_setup = os.path.join(pokegold, "constants/map_setup_constants.asm") map_callback_order = ["MAPCALLBACK_NONE"] + parse_prefixed_consts( - map_setup, ("MAPCALLBACK_",)) + map_setup, ("MAPCALLBACK_",), defines=defines) # constants/script_constants.asm stacks a dozen unrelated blocks, so each # of these is found by the name its own block opens with. script_consts = os.path.join(pokegold, "constants/script_constants.asm") cmd_queue_order = parse_const_block_at( - script_consts, "CMDQUEUE_NULL", stop_at="NUM_CMDQUEUE_TYPES") + script_consts, "CMDQUEUE_NULL", stop_at="NUM_CMDQUEUE_TYPES", + defines=defines) floor_order = parse_const_block_at( - script_consts, "FLOOR_B4F", stop_at="NUM_FLOORS") + script_consts, "FLOOR_B4F", stop_at="NUM_FLOORS", defines=defines) deco_desc_order = parse_const_block_at( - script_consts, "DECODESC_POSTER", stop_at="NUM_DECODESCS") + script_consts, "DECODESC_POSTER", stop_at="NUM_DECODESCS", + defines=defines) # The phone. PHONE_* doubles as the PhoneContacts row index and carries # four const_skip holes that are real rows (the wrong-number fillers), so @@ -1129,33 +1187,41 @@ def generate(pokegold, symbols_path): # every contact past a hole four rows down its own table. phone_contact_order = [ n or "PHONE_UNUSED" for n in parse_const_block_at( - phone_consts, "PHONE_00", stop_at="NUM_PHONE_CONTACTS")] + phone_consts, "PHONE_00", stop_at="NUM_PHONE_CONTACTS", + defines=defines)] special_call_order = parse_const_block_at( - phone_consts, "SPECIALCALL_NONE", stop_at="NUM_SPECIALCALLS") + phone_consts, "SPECIALCALL_NONE", stop_at="NUM_SPECIALCALLS", + defines=defines) npc_trade = os.path.join(pokegold, "constants/npc_trade_constants.asm") - trade_gender_order = parse_prefixed_consts(npc_trade, ("TRADE_GENDER_",)) - trade_dialog_order = parse_prefixed_consts(npc_trade, ("TRADE_DIALOGSET_",)) + trade_gender_order = parse_prefixed_consts( + npc_trade, ("TRADE_GENDER_",), defines=defines) + trade_dialog_order = parse_prefixed_consts( + npc_trade, ("TRADE_DIALOGSET_",), defines=defines) - trainer_classes, trainer_members = extract_trainer_classes(pokegold) + trainer_classes, trainer_members = extract_trainer_classes( + pokegold, defines) trainer_types = parse_prefixed_consts( os.path.join(pokegold, "constants/trainer_data_constants.asm"), - ("TRAINERTYPE_",)) + ("TRAINERTYPE_",), defines=defines) landmarks = parse_const_block( os.path.join(pokegold, "constants/landmark_constants.asm"), - stop_at="NUM_LANDMARKS") + stop_at="NUM_LANDMARKS", defines=defines) landmark_order = [n or "UNUSED" for n in landmarks] icons = parse_prefixed_consts( - os.path.join(pokegold, "constants/icon_constants.asm"), ("ICON_",)) + os.path.join(pokegold, "constants/icon_constants.asm"), ("ICON_",), + defines=defines) - tree_sets = parse_prefixed_consts(mon_data, ("TREEMON_SET_",)) + tree_sets = parse_prefixed_consts( + mon_data, ("TREEMON_SET_",), defines=defines) - std_scripts = extract_std_scripts(pokegold) - specials = extract_specials(pokegold) + std_scripts = extract_std_scripts(pokegold, defines) + specials = extract_specials(pokegold, defines) - assets = pokemon_assets(pokegold, species_order, symbols) + assets = pokemon_assets(pokegold, species_order, symbols, defines, + anim_labels=anim_labels) pokemon_labels = [] for asset in assets.values(): if asset["frontLabel"]: @@ -1163,19 +1229,19 @@ def generate(pokegold, symbols_path): if asset["backLabel"]: pokemon_labels.append(asset["backLabel"]) - songs = music_order(pokegold) - text_label_names = text_labels(pokegold) - sfx = sfx_order(pokegold) + songs = music_order(pokegold, defines) + text_label_names = text_labels(pokegold, defines) + sfx = sfx_order(pokegold, defines) # Index 0 is NO_ITEM, so the parsed list is already 1-based on item id. # ItemNames only has rows for the first `item_name_count` of them; the TM # and HM items past that are named from their TM number instead. - item_order, item_name_count = extract_items(pokegold) + item_order, item_name_count = extract_items(pokegold, defines) data = { "format": 3, "generation": 2, - "romSha1": CANONICAL_GOLD_SHA1, + "romSha1": sha1 or CANONICAL_GOLD_SHA1, "constants": { "source": "pret/pokegold constants/*.asm", "speciesOrder": species_order, @@ -1259,7 +1325,7 @@ def generate(pokegold, symbols_path): # Label -> decoded string is built at import time from these, the # same way Gen 1 builds data/generated/text.lua from its own list. "text": {"labels": text_label_names}, - "charmap": charmap(pokegold), + "charmap": charmap(pokegold, defines), "fontCharmap": font_extract.parse_charmap(pokegold), "pokemonAssets": assets, # Per-map metadata (group/map/width/height/name). RomExtractorGen2 @@ -1268,7 +1334,7 @@ def generate(pokegold, symbols_path): "tilesets": {name: {} for name in tilesets}, } data["symbols"] = embedded_symbols( - symbols, pokemon_labels, songs, text_label_names) + symbols, pokemon_labels, songs, text_label_names, required=required) return data diff --git a/tools/modkit.py b/tools/modkit.py index 6b934c61..bae76b15 100644 --- a/tools/modkit.py +++ b/tools/modkit.py @@ -741,7 +741,7 @@ def imported_data_dir(repo): return path if _generated_data_dir_ok(path) else None version = (os.environ.get("POKEPORT_VERSION") or "red").lower() - if version not in ("red", "blue", "yellow", "gold", "silver"): + if version not in ("red", "blue", "yellow", "gold", "silver", "crystal"): version = "red" candidates = [ @@ -2404,8 +2404,8 @@ UPVALUE_CALL = re.compile( UPVALUE_ARGS = re.compile( r"""^\s*([A-Za-z_]\w*)\s*\.\s*(\w+)\s*,\s*["'](\w+)["']""") VERSION_MATCH = re.compile( - r"""[=~]=\s*["'](red|blue|yellow|gold|silver)["']""" - r"""|["'](red|blue|yellow|gold|silver)["']\s*[=~]=""") + r"""[=~]=\s*["'](red|blue|yellow|gold|silver|crystal)["']""" + r"""|["'](red|blue|yellow|gold|silver|crystal)["']\s*[=~]=""") def _line_of(body, offset): diff --git a/tools/rom_data.py b/tools/rom_data.py index 2e9375d5..bfb3d084 100644 --- a/tools/rom_data.py +++ b/tools/rom_data.py @@ -14,6 +14,9 @@ CANONICAL_YELLOW_SHA1 = "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1" # Gold and Silver are Gen 2: 2 MiB carts, twice the size of the Gen 1 ROMs above. CANONICAL_GOLD_SHA1 = "d8b8a3600a465308c9953dfa04f0081c05bdcb94" CANONICAL_SILVER_SHA1 = "49b163f7e57702bc939d642a18f591de55d92dae" +# Crystal is the retail international v1.0 build (pret/pokecrystal's default +# `make` target), also 2 MiB. +CANONICAL_CRYSTAL_SHA1 = "f4cd194bdee0d04ca4eac29e09b8e4e9d818c133" ROM_BANK_SIZE = 0x4000 diff --git a/tools/rom_manifest_crystal.json b/tools/rom_manifest_crystal.json new file mode 100644 index 00000000..e1b7609d --- /dev/null +++ b/tools/rom_manifest_crystal.json @@ -0,0 +1,24663 @@ +{ + "charmap": { + "0": "", + "10": "ザ", + "100": "", + "101": "", + "102": "", + "103": "", + "104": "", + "105": "", + "106": "", + "107": "", + "108": "", + "109": "", + "11": "ジ", + "110": "ぃ", + "111": "ぅ", + "112": "", + "113": "", + "114": "“", + "115": "”", + "116": "·", + "117": "…", + "118": "ぁ", + "119": "ぇ", + "12": "ズ", + "120": "ぉ", + "121": "┌", + "122": "─", + "123": "┐", + "124": "│", + "125": "└", + "126": "┘", + "127": " ", + "128": "A", + "129": "B", + "13": "ゼ", + "130": "C", + "131": "D", + "132": "E", + "133": "F", + "134": "G", + "135": "H", + "136": "I", + "137": "J", + "138": "K", + "139": "L", + "14": "ゾ", + "140": "M", + "141": "N", + "142": "O", + "143": "P", + "144": "Q", + "145": "R", + "146": "S", + "147": "T", + "148": "U", + "149": "V", + "15": "ダ", + "150": "W", + "151": "X", + "152": "Y", + "153": "Z", + "154": "(", + "155": ")", + "156": ":", + "157": ";", + "158": "[", + "159": "]", + "16": "ヂ", + "160": "a", + "161": "b", + "162": "c", + "163": "d", + "164": "e", + "165": "f", + "166": "g", + "167": "h", + "168": "i", + "169": "j", + "17": "ヅ", + "170": "k", + "171": "l", + "172": "m", + "173": "n", + "174": "o", + "175": "p", + "176": "q", + "177": "r", + "178": "s", + "179": "t", + "18": "デ", + "180": "u", + "181": "v", + "182": "w", + "183": "x", + "184": "y", + "185": "z", + "186": "こ", + "187": "さ", + "188": "し", + "189": "す", + "19": "ド", + "190": "せ", + "191": "そ", + "192": "Ä", + "193": "Ö", + "194": "Ü", + "195": "ä", + "196": "ö", + "197": "ü", + "198": "に", + "199": "ぬ", + "20": "", + "200": "ね", + "201": "の", + "202": "は", + "203": "ひ", + "204": "ふ", + "205": "へ", + "206": "ほ", + "207": "ま", + "208": "'d", + "209": "'l", + "21": "", + "210": "'m", + "211": "'r", + "212": "'s", + "213": "'t", + "214": "'v", + "215": "ら", + "216": "り", + "217": "る", + "218": "れ", + "219": "ろ", + "22": "", + "220": "わ", + "221": "を", + "222": "ん", + "223": "←", + "224": "'", + "225": "", + "226": "", + "227": "-", + "228": "゚", + "229": "゙", + "230": "?", + "231": "!", + "232": ".", + "233": "&", + "234": "é", + "235": "→", + "236": "▷", + "237": "▶", + "238": "▼", + "239": "♂", + "24": "", + "240": "¥", + "241": "×", + "242": ".", + "243": "/", + "244": ",", + "245": "♀", + "246": "0", + "247": "1", + "248": "2", + "249": "3", + "25": "バ", + "250": "4", + "251": "5", + "252": "6", + "253": "7", + "254": "8", + "255": "9", + "26": "ビ", + "27": "ブ", + "28": "ボ", + "29": "", + "30": "", + "31": "", + "34": "", + "35": "", + "36": "", + "37": "", + "38": "が", + "39": "ぎ", + "40": "ぐ", + "41": "げ", + "42": "ご", + "43": "ざ", + "44": "じ", + "45": "ず", + "46": "ぜ", + "47": "ぞ", + "48": "だ", + "49": "ぢ", + "5": "ガ", + "50": "づ", + "51": "で", + "52": "ど", + "53": "", + "54": "", + "55": "", + "56": "", + "57": "", + "58": "ば", + "59": "び", + "6": "ギ", + "60": "ぶ", + "61": "べ", + "62": "ぼ", + "63": "", + "64": "パ", + "65": "ピ", + "66": "プ", + "67": "ポ", + "68": "ぱ", + "69": "ぴ", + "7": "グ", + "70": "ぷ", + "71": "ぺ", + "72": "ぽ", + "73": "", + "74": "", + "75": "<_CONT>", + "76": "", + "78": "", + "79": "", + "8": "ゲ", + "80": "@", + "81": "", + "82": "", + "83": "", + "84": "POKé", + "85": "", + "86": "<……>", + "87": "", + "88": "", + "89": "", + "9": "ゴ", + "90": "", + "91": "", + "92": "", + "93": "", + "94": "", + "95": "", + "96": "", + "97": "", + "98": "", + "99": "" + }, + "constants": { + "battleAnimBgPaletteOrder": [ + "PAL_BATTLE_BG_PLAYER", + "PAL_BATTLE_BG_ENEMY", + "PAL_BATTLE_BG_ENEMY_HP", + "PAL_BATTLE_BG_PLAYER_HP", + "PAL_BATTLE_BG_EXP", + "PAL_BATTLE_BG_5", + "PAL_BATTLE_BG_6", + "PAL_BATTLE_BG_TEXT" + ], + "battleAnimFramesetOrder": [ + "BATTLE_ANIM_FRAMESET_HIT_BIG", + "BATTLE_ANIM_FRAMESET_HIT", + "BATTLE_ANIM_FRAMESET_HIT_SMALL", + "BATTLE_ANIM_FRAMESET_PUNCH", + "BATTLE_ANIM_FRAMESET_KICK", + "BATTLE_ANIM_FRAMESET_PALM", + "BATTLE_ANIM_FRAMESET_FANG", + "BATTLE_ANIM_FRAMESET_PUNCH_SHAKE", + "BATTLE_ANIM_FRAMESET_BALL_POOF", + "BATTLE_ANIM_FRAMESET_POKE_BALL_1", + "BATTLE_ANIM_FRAMESET_POKE_BALL_2", + "BATTLE_ANIM_FRAMESET_POKE_BALL_3", + "BATTLE_ANIM_FRAMESET_POKE_BALL_4", + "BATTLE_ANIM_FRAMESET_POKE_BALL_5", + "BATTLE_ANIM_FRAMESET_DRAGON_RAGE", + "BATTLE_ANIM_FRAMESET_FLAMETHROWER", + "BATTLE_ANIM_FRAMESET_EMBER", + "BATTLE_ANIM_FRAMESET_BURNED", + "BATTLE_ANIM_FRAMESET_BLIZZARD", + "BATTLE_ANIM_FRAMESET_ICE", + "BATTLE_ANIM_FRAMESET_ICE_BEAM", + "BATTLE_ANIM_FRAMESET_POWDER_SNOW", + "BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1", + "BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2", + "BATTLE_ANIM_FRAMESET_EXPLOSION", + "BATTLE_ANIM_FRAMESET_BIG_ROCK", + "BATTLE_ANIM_FRAMESET_SMALL_ROCK", + "BATTLE_ANIM_FRAMESET_STRENGTH", + "BATTLE_ANIM_FRAMESET_SKULL_CROSSBONE", + "BATTLE_ANIM_FRAMESET_ACID", + "BATTLE_ANIM_FRAMESET_POISON_DROPLET_UNUSED", + "BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE", + "BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST", + "BATTLE_ANIM_FRAMESET_SMALL_BUBBLE", + "BATTLE_ANIM_FRAMESET_PULSING_BUBBLE", + "BATTLE_ANIM_FRAMESET_SURF", + "BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1", + "BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2", + "BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3", + "BATTLE_ANIM_FRAMESET_WATER_GUN_1", + "BATTLE_ANIM_FRAMESET_WATER_GUN_2", + "BATTLE_ANIM_FRAMESET_WATER_GUN_3", + "BATTLE_ANIM_FRAMESET_HYDRO_PUMP", + "BATTLE_ANIM_FRAMESET_POWDER", + "BATTLE_ANIM_FRAMESET_BEAM", + "BATTLE_ANIM_FRAMESET_BEAM_TIP", + "BATTLE_ANIM_FRAMESET_ICE_BUILDUP", + "BATTLE_ANIM_FRAMESET_FROZEN", + "BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE", + "BATTLE_ANIM_FRAMESET_THUNDER_CENTER", + "BATTLE_ANIM_FRAMESET_THUNDER_LEFT", + "BATTLE_ANIM_FRAMESET_THUNDER_RIGHT", + "BATTLE_ANIM_FRAMESET_THUNDER_WAVE_DISABLE", + "BATTLE_ANIM_FRAMESET_THUNDER_WAVE_EXTRA", + "BATTLE_ANIM_FRAMESET_THUNDERBOLT_SPARKS", + "BATTLE_ANIM_FRAMESET_THUNDERBOLT_CORE", + "BATTLE_ANIM_FRAMESET_THUNDERSHOCK_SPARKS", + "BATTLE_ANIM_FRAMESET_THUNDERSHOCK_CORE", + "BATTLE_ANIM_FRAMESET_CLAMP", + "BATTLE_ANIM_FRAMESET_CLAMP_FLIPPED", + "BATTLE_ANIM_FRAMESET_BITE_1", + "BATTLE_ANIM_FRAMESET_BITE_2", + "BATTLE_ANIM_FRAMESET_CUT_DOWN_LEFT", + "BATTLE_ANIM_FRAMESET_CUT_DOWN_RIGHT", + "BATTLE_ANIM_FRAMESET_CUT_UP_RIGHT", + "BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_LEFT", + "BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_RIGHT", + "BATTLE_ANIM_FRAMESET_CHARGE_ORB_1", + "BATTLE_ANIM_FRAMESET_ABSORB_CENTER", + "BATTLE_ANIM_FRAMESET_GUST", + "BATTLE_ANIM_FRAMESET_VINE_WHIP_1", + "BATTLE_ANIM_FRAMESET_VINE_WHIP_2", + "BATTLE_ANIM_FRAMESET_RAZOR_WIND_1", + "BATTLE_ANIM_FRAMESET_RAZOR_WIND_2", + "BATTLE_ANIM_FRAMESET_SONICBOOM_JP", + "BATTLE_ANIM_FRAMESET_WARP", + "BATTLE_ANIM_FRAMESET_CHARGE_ORB_2", + "BATTLE_ANIM_FRAMESET_EGG", + "BATTLE_ANIM_FRAMESET_EGG_WOBBLE", + "BATTLE_ANIM_FRAMESET_EGG_CRACKED_TOP", + "BATTLE_ANIM_FRAMESET_EGG_CRACKED_BOTTOM", + "BATTLE_ANIM_FRAMESET_FOCUS", + "BATTLE_ANIM_FRAMESET_BIND_1", + "BATTLE_ANIM_FRAMESET_BIND_2", + "BATTLE_ANIM_FRAMESET_BIND_3", + "BATTLE_ANIM_FRAMESET_BIND_4", + "BATTLE_ANIM_FRAMESET_LEECH_SEED_1", + "BATTLE_ANIM_FRAMESET_LEECH_SEED_2", + "BATTLE_ANIM_FRAMESET_LEECH_SEED_3", + "BATTLE_ANIM_FRAMESET_SOUND_1", + "BATTLE_ANIM_FRAMESET_SOUND_2", + "BATTLE_ANIM_FRAMESET_SOUND_3", + "BATTLE_ANIM_FRAMESET_WAVE", + "BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1", + "BATTLE_ANIM_FRAMESET_CONFUSE_RAY_2", + "BATTLE_ANIM_FRAMESET_LEER", + "BATTLE_ANIM_FRAMESET_REFLECT", + "BATTLE_ANIM_FRAMESET_CHICK_1", + "BATTLE_ANIM_FRAMESET_CHICK_2", + "BATTLE_ANIM_FRAMESET_AMNESIA_1", + "BATTLE_ANIM_FRAMESET_AMNESIA_2", + "BATTLE_ANIM_FRAMESET_AMNESIA_3", + "BATTLE_ANIM_FRAMESET_ASLEEP", + "BATTLE_ANIM_FRAMESET_DIG_SAND", + "BATTLE_ANIM_FRAMESET_DIG_PILE", + "BATTLE_ANIM_FRAMESET_SAND", + "BATTLE_ANIM_FRAMESET_STRING_SHOT_1", + "BATTLE_ANIM_FRAMESET_STRING_SHOT_2", + "BATTLE_ANIM_FRAMESET_STRING_SHOT_3", + "BATTLE_ANIM_FRAMESET_PARALYZED", + "BATTLE_ANIM_FRAMESET_PARALYZED_FLIPPED", + "BATTLE_ANIM_FRAMESET_HAZE", + "BATTLE_ANIM_FRAMESET_MIST", + "BATTLE_ANIM_FRAMESET_HORN", + "BATTLE_ANIM_FRAMESET_NEEDLE", + "BATTLE_ANIM_FRAMESET_FLOWER", + "BATTLE_ANIM_FRAMESET_BARRAGE_BALL", + "BATTLE_ANIM_FRAMESET_PAY_DAY", + "BATTLE_ANIM_FRAMESET_HEART", + "BATTLE_ANIM_FRAMESET_SPINNING_BONE", + "BATTLE_ANIM_FRAMESET_STAR", + "BATTLE_ANIM_FRAMESET_SPOON", + "BATTLE_ANIM_FRAMESET_SPARKLE", + "BATTLE_ANIM_FRAMESET_SKY_ATTACK", + "BATTLE_ANIM_FRAMESET_LICK", + "BATTLE_ANIM_FRAMESET_WITHDRAW_SHELL", + "BATTLE_ANIM_FRAMESET_SHRINKING_CHARGE_ORB", + "BATTLE_ANIM_FRAMESET_CONVERSION", + "BATTLE_ANIM_FRAMESET_SWORD", + "BATTLE_ANIM_FRAMESET_SPEED_LINE_1", + "BATTLE_ANIM_FRAMESET_SPEED_LINE_2", + "BATTLE_ANIM_FRAMESET_SPEED_LINE_3", + "BATTLE_ANIM_FRAMESET_SEISMIC_TOSS", + "BATTLE_ANIM_FRAMESET_SHARPEN", + "BATTLE_ANIM_FRAMESET_DEFENSE_CURL", + "BATTLE_ANIM_FRAMESET_METRONOME_HAND", + "BATTLE_ANIM_FRAMESET_AGILITY", + "BATTLE_ANIM_FRAMESET_COTTON", + "BATTLE_ANIM_FRAMESET_MILK_BOTTLE", + "BATTLE_ANIM_FRAMESET_SPIKE", + "BATTLE_ANIM_FRAMESET_ANGER_VEIN", + "BATTLE_ANIM_FRAMESET_HEAL_BELL", + "BATTLE_ANIM_FRAMESET_BATON_PASS", + "BATTLE_ANIM_FRAMESET_LOCK_ON_1", + "BATTLE_ANIM_FRAMESET_LOCK_ON_2", + "BATTLE_ANIM_FRAMESET_LOCK_ON_3", + "BATTLE_ANIM_FRAMESET_LOCK_ON_4", + "BATTLE_ANIM_FRAMESET_MIND_READER_1", + "BATTLE_ANIM_FRAMESET_MIND_READER_2", + "BATTLE_ANIM_FRAMESET_MIND_READER_3", + "BATTLE_ANIM_FRAMESET_MIND_READER_4", + "BATTLE_ANIM_FRAMESET_SAFEGUARD", + "BATTLE_ANIM_FRAMESET_MEGAPHONE_UNUSED", + "BATTLE_ANIM_FRAMESET_ITEM_BAG", + "BATTLE_ANIM_FRAMESET_SPIDER_WEB", + "BATTLE_ANIM_FRAMESET_UNUSED_CAKE", + "BATTLE_ANIM_FRAMESET_IMP", + "BATTLE_ANIM_FRAMESET_IMP_FLIPPED", + "BATTLE_ANIM_FRAMESET_CHERUB", + "BATTLE_ANIM_FRAMESET_PENCIL", + "BATTLE_ANIM_FRAMESET_ENCORE_HAND", + "BATTLE_ANIM_FRAMESET_ENCORE_HAND_FLIPPED", + "BATTLE_ANIM_FRAMESET_DESTINY_BOND", + "BATTLE_ANIM_FRAMESET_MORNING_SUN", + "BATTLE_ANIM_FRAMESET_GLIMMER", + "BATTLE_ANIM_FRAMESET_MOONLIGHT", + "BATTLE_ANIM_FRAMESET_CROSS_CHOP_1", + "BATTLE_ANIM_FRAMESET_CROSS_CHOP_2", + "BATTLE_ANIM_FRAMESET_ZAP_CANNON", + "BATTLE_ANIM_FRAMESET_CURSE_NAIL", + "BATTLE_ANIM_FRAMESET_FORESIGHT_SHINE", + "BATTLE_ANIM_FRAMESET_RAPID_SPIN", + "BATTLE_ANIM_FRAMESET_SWAGGER", + "BATTLE_ANIM_FRAMESET_MEAN_LOOK", + "BATTLE_ANIM_FRAMESET_UPSIDE_DOWN_PUNCH", + "BATTLE_ANIM_FRAMESET_GROWING_SPARKLE", + "BATTLE_ANIM_FRAMESET_RAIN", + "BATTLE_ANIM_FRAMESET_PSYCH_UP", + "BATTLE_ANIM_FRAMESET_SPIRAL_UNUSED", + "BATTLE_ANIM_FRAMESET_AEROBLAST", + "BATTLE_ANIM_FRAMESET_SANDSTORM", + "BATTLE_ANIM_FRAMESET_ENEMYFEET_1ROW", + "BATTLE_ANIM_FRAMESET_PLAYERHEAD_1ROW", + "BATTLE_ANIM_FRAMESET_ENEMYFEET_2ROW", + "BATTLE_ANIM_FRAMESET_PLAYERHEAD_2ROW" + ], + "battleAnimFuncOrder": [ + "BATTLE_ANIM_FUNC_NULL", + "BATTLE_ANIM_FUNC_USER_TO_TARGET", + "BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR", + "BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE", + "BATTLE_ANIM_FUNC_WAVE_TO_TARGET", + "BATTLE_ANIM_FUNC_THROW_TO_TARGET", + "BATTLE_ANIM_FUNC_THROW_TO_TARGET_DISAPPEAR", + "BATTLE_ANIM_FUNC_DROP", + "BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN", + "BATTLE_ANIM_FUNC_SHAKE", + "BATTLE_ANIM_FUNC_FIRE_BLAST", + "BATTLE_ANIM_FUNC_RAZOR_LEAF", + "BATTLE_ANIM_FUNC_BUBBLE", + "BATTLE_ANIM_FUNC_SURF", + "BATTLE_ANIM_FUNC_SING", + "BATTLE_ANIM_FUNC_WATER_GUN", + "BATTLE_ANIM_FUNC_EMBER", + "BATTLE_ANIM_FUNC_POWDER", + "BATTLE_ANIM_FUNC_POKEBALL", + "BATTLE_ANIM_FUNC_POKEBALL_BLOCKED", + "BATTLE_ANIM_FUNC_RECOVER", + "BATTLE_ANIM_FUNC_THUNDER_WAVE", + "BATTLE_ANIM_FUNC_CLAMP_ENCORE", + "BATTLE_ANIM_FUNC_BITE", + "BATTLE_ANIM_FUNC_SOLAR_BEAM", + "BATTLE_ANIM_FUNC_GUST", + "BATTLE_ANIM_FUNC_RAZOR_WIND", + "BATTLE_ANIM_FUNC_KICK", + "BATTLE_ANIM_FUNC_ABSORB", + "BATTLE_ANIM_FUNC_EGG", + "BATTLE_ANIM_FUNC_MOVE_UP", + "BATTLE_ANIM_FUNC_WRAP", + "BATTLE_ANIM_FUNC_LEECH_SEED", + "BATTLE_ANIM_FUNC_SOUND", + "BATTLE_ANIM_FUNC_CONFUSE_RAY", + "BATTLE_ANIM_FUNC_DIZZY", + "BATTLE_ANIM_FUNC_AMNESIA", + "BATTLE_ANIM_FUNC_FLOAT_UP", + "BATTLE_ANIM_FUNC_DIG", + "BATTLE_ANIM_FUNC_STRING", + "BATTLE_ANIM_FUNC_PARALYZED", + "BATTLE_ANIM_FUNC_SPIRAL_DESCENT", + "BATTLE_ANIM_FUNC_POISON_GAS", + "BATTLE_ANIM_FUNC_HORN", + "BATTLE_ANIM_FUNC_NEEDLE", + "BATTLE_ANIM_FUNC_PETAL_DANCE", + "BATTLE_ANIM_FUNC_THIEF_PAYDAY", + "BATTLE_ANIM_FUNC_ABSORB_CIRCLE", + "BATTLE_ANIM_FUNC_BONEMERANG", + "BATTLE_ANIM_FUNC_SHINY", + "BATTLE_ANIM_FUNC_SKY_ATTACK", + "BATTLE_ANIM_FUNC_GROWTH_SWORDS_DANCE", + "BATTLE_ANIM_FUNC_SMOKE_FLAME_WHEEL", + "BATTLE_ANIM_FUNC_PRESENT_SMOKESCREEN", + "BATTLE_ANIM_FUNC_STRENGTH_SEISMIC_TOSS", + "BATTLE_ANIM_FUNC_SPEED_LINE", + "BATTLE_ANIM_FUNC_SLUDGE", + "BATTLE_ANIM_FUNC_METRONOME_HAND", + "BATTLE_ANIM_FUNC_METRONOME_SPARKLE_SKETCH", + "BATTLE_ANIM_FUNC_AGILITY", + "BATTLE_ANIM_FUNC_SACRED_FIRE", + "BATTLE_ANIM_FUNC_SAFEGUARD_PROTECT", + "BATTLE_ANIM_FUNC_LOCK_ON_MIND_READER", + "BATTLE_ANIM_FUNC_SPIKES", + "BATTLE_ANIM_FUNC_HEAL_BELL_NOTES", + "BATTLE_ANIM_FUNC_BATON_PASS", + "BATTLE_ANIM_FUNC_CONVERSION", + "BATTLE_ANIM_FUNC_ENCORE_BELLY_DRUM", + "BATTLE_ANIM_FUNC_SWAGGER_MORNING_SUN", + "BATTLE_ANIM_FUNC_HIDDEN_POWER", + "BATTLE_ANIM_FUNC_CURSE", + "BATTLE_ANIM_FUNC_PERISH_SONG", + "BATTLE_ANIM_FUNC_RAPID_SPIN", + "BATTLE_ANIM_FUNC_BETA_PURSUIT", + "BATTLE_ANIM_FUNC_RAIN_SANDSTORM", + "BATTLE_ANIM_FUNC_BATTLE_ANIM_OBJ_B0", + "BATTLE_ANIM_FUNC_PSYCH_UP", + "BATTLE_ANIM_FUNC_ANCIENT_POWER", + "BATTLE_ANIM_FUNC_ROCK_SMASH", + "BATTLE_ANIM_FUNC_COTTON" + ], + "battleAnimGfxOrder": [ + "BATTLE_ANIM_GFX_NONE", + "BATTLE_ANIM_GFX_HIT", + "BATTLE_ANIM_GFX_CUT", + "BATTLE_ANIM_GFX_FIRE", + "BATTLE_ANIM_GFX_WATER", + "BATTLE_ANIM_GFX_LIGHTNING", + "BATTLE_ANIM_GFX_PLANT", + "BATTLE_ANIM_GFX_SMOKE", + "BATTLE_ANIM_GFX_EXPLOSION", + "BATTLE_ANIM_GFX_ROCKS", + "BATTLE_ANIM_GFX_ICE", + "BATTLE_ANIM_GFX_POKE_BALL", + "BATTLE_ANIM_GFX_POISON", + "BATTLE_ANIM_GFX_BUBBLE", + "BATTLE_ANIM_GFX_NOISE", + "BATTLE_ANIM_GFX_POWDER", + "BATTLE_ANIM_GFX_BEAM", + "BATTLE_ANIM_GFX_SPEED", + "BATTLE_ANIM_GFX_CHARGE", + "BATTLE_ANIM_GFX_WIND", + "BATTLE_ANIM_GFX_WHIP", + "BATTLE_ANIM_GFX_EGG", + "BATTLE_ANIM_GFX_ROPE", + "BATTLE_ANIM_GFX_PSYCHIC", + "BATTLE_ANIM_GFX_REFLECT", + "BATTLE_ANIM_GFX_STATUS", + "BATTLE_ANIM_GFX_SAND", + "BATTLE_ANIM_GFX_WEB", + "BATTLE_ANIM_GFX_HAZE", + "BATTLE_ANIM_GFX_HORN", + "BATTLE_ANIM_GFX_FLOWER", + "BATTLE_ANIM_GFX_MISC", + "BATTLE_ANIM_GFX_SKY_ATTACK", + "BATTLE_ANIM_GFX_GLOBE", + "BATTLE_ANIM_GFX_SHAPES", + "BATTLE_ANIM_GFX_OBJECTS", + "BATTLE_ANIM_GFX_SHINE", + "BATTLE_ANIM_GFX_ANGELS", + "BATTLE_ANIM_GFX_WAVE", + "BATTLE_ANIM_GFX_AEROBLAST", + "BATTLE_ANIM_GFX_PLAYERHEAD", + "BATTLE_ANIM_GFX_ENEMYFEET" + ], + "battleAnimOamsetOrder": [ + "BATTLE_ANIM_OAMSET_00", + "BATTLE_ANIM_OAMSET_01", + "BATTLE_ANIM_OAMSET_02", + "BATTLE_ANIM_OAMSET_03", + "BATTLE_ANIM_OAMSET_04", + "BATTLE_ANIM_OAMSET_05", + "BATTLE_ANIM_OAMSET_06", + "BATTLE_ANIM_OAMSET_07", + "BATTLE_ANIM_OAMSET_08", + "BATTLE_ANIM_OAMSET_09", + "BATTLE_ANIM_OAMSET_0A", + "BATTLE_ANIM_OAMSET_0B", + "BATTLE_ANIM_OAMSET_0C", + "BATTLE_ANIM_OAMSET_0D", + "BATTLE_ANIM_OAMSET_0E", + "BATTLE_ANIM_OAMSET_0F", + "BATTLE_ANIM_OAMSET_10", + "BATTLE_ANIM_OAMSET_11", + "BATTLE_ANIM_OAMSET_12", + "BATTLE_ANIM_OAMSET_13", + "BATTLE_ANIM_OAMSET_14", + "BATTLE_ANIM_OAMSET_15", + "BATTLE_ANIM_OAMSET_16", + "BATTLE_ANIM_OAMSET_17", + "BATTLE_ANIM_OAMSET_18", + "BATTLE_ANIM_OAMSET_19", + "BATTLE_ANIM_OAMSET_1A", + "BATTLE_ANIM_OAMSET_1B", + "BATTLE_ANIM_OAMSET_1C", + "BATTLE_ANIM_OAMSET_1D", + "BATTLE_ANIM_OAMSET_1E", + "BATTLE_ANIM_OAMSET_1F", + "BATTLE_ANIM_OAMSET_20", + "BATTLE_ANIM_OAMSET_21", + "BATTLE_ANIM_OAMSET_22", + "BATTLE_ANIM_OAMSET_23", + "BATTLE_ANIM_OAMSET_24", + "BATTLE_ANIM_OAMSET_25", + "BATTLE_ANIM_OAMSET_26", + "BATTLE_ANIM_OAMSET_27", + "BATTLE_ANIM_OAMSET_28", + "BATTLE_ANIM_OAMSET_29", + "BATTLE_ANIM_OAMSET_2A", + "BATTLE_ANIM_OAMSET_2B", + "BATTLE_ANIM_OAMSET_2C", + "BATTLE_ANIM_OAMSET_2D", + "BATTLE_ANIM_OAMSET_2E", + "BATTLE_ANIM_OAMSET_2F", + "BATTLE_ANIM_OAMSET_30", + "BATTLE_ANIM_OAMSET_31", + "BATTLE_ANIM_OAMSET_32", + "BATTLE_ANIM_OAMSET_33", + "BATTLE_ANIM_OAMSET_34", + "BATTLE_ANIM_OAMSET_35", + "BATTLE_ANIM_OAMSET_36", + "BATTLE_ANIM_OAMSET_37", + "BATTLE_ANIM_OAMSET_38", + "BATTLE_ANIM_OAMSET_39", + "BATTLE_ANIM_OAMSET_3A", + "BATTLE_ANIM_OAMSET_3B", + "BATTLE_ANIM_OAMSET_3C", + "BATTLE_ANIM_OAMSET_3D", + "BATTLE_ANIM_OAMSET_3E", + "BATTLE_ANIM_OAMSET_3F", + "BATTLE_ANIM_OAMSET_40", + "BATTLE_ANIM_OAMSET_41", + "BATTLE_ANIM_OAMSET_42", + "BATTLE_ANIM_OAMSET_43", + "BATTLE_ANIM_OAMSET_44", + "BATTLE_ANIM_OAMSET_45", + "BATTLE_ANIM_OAMSET_46", + "BATTLE_ANIM_OAMSET_47", + "BATTLE_ANIM_OAMSET_48", + "BATTLE_ANIM_OAMSET_49", + "BATTLE_ANIM_OAMSET_4A", + "BATTLE_ANIM_OAMSET_4B", + "BATTLE_ANIM_OAMSET_4C", + "BATTLE_ANIM_OAMSET_4D", + "BATTLE_ANIM_OAMSET_4E", + "BATTLE_ANIM_OAMSET_4F", + "BATTLE_ANIM_OAMSET_50", + "BATTLE_ANIM_OAMSET_51", + "BATTLE_ANIM_OAMSET_52", + "BATTLE_ANIM_OAMSET_53", + "BATTLE_ANIM_OAMSET_54", + "BATTLE_ANIM_OAMSET_55", + "BATTLE_ANIM_OAMSET_56", + "BATTLE_ANIM_OAMSET_57", + "BATTLE_ANIM_OAMSET_58", + "BATTLE_ANIM_OAMSET_59", + "BATTLE_ANIM_OAMSET_5A", + "BATTLE_ANIM_OAMSET_5B", + "BATTLE_ANIM_OAMSET_5C", + "BATTLE_ANIM_OAMSET_5D", + "BATTLE_ANIM_OAMSET_5E", + "BATTLE_ANIM_OAMSET_5F", + "BATTLE_ANIM_OAMSET_60", + "BATTLE_ANIM_OAMSET_61", + "BATTLE_ANIM_OAMSET_62", + "BATTLE_ANIM_OAMSET_63", + "BATTLE_ANIM_OAMSET_64", + "BATTLE_ANIM_OAMSET_65", + "BATTLE_ANIM_OAMSET_66", + "BATTLE_ANIM_OAMSET_67", + "BATTLE_ANIM_OAMSET_68", + "BATTLE_ANIM_OAMSET_69", + "BATTLE_ANIM_OAMSET_6A", + "BATTLE_ANIM_OAMSET_6B", + "BATTLE_ANIM_OAMSET_6C", + "BATTLE_ANIM_OAMSET_6D", + "BATTLE_ANIM_OAMSET_6E", + "BATTLE_ANIM_OAMSET_6F", + "BATTLE_ANIM_OAMSET_70", + "BATTLE_ANIM_OAMSET_71", + "BATTLE_ANIM_OAMSET_72", + "BATTLE_ANIM_OAMSET_73", + "BATTLE_ANIM_OAMSET_74", + "BATTLE_ANIM_OAMSET_75", + "BATTLE_ANIM_OAMSET_76", + "BATTLE_ANIM_OAMSET_77", + "BATTLE_ANIM_OAMSET_78", + "BATTLE_ANIM_OAMSET_79", + "BATTLE_ANIM_OAMSET_7A", + "BATTLE_ANIM_OAMSET_7B", + "BATTLE_ANIM_OAMSET_7C", + "BATTLE_ANIM_OAMSET_7D", + "BATTLE_ANIM_OAMSET_7E", + "BATTLE_ANIM_OAMSET_7F", + "BATTLE_ANIM_OAMSET_80", + "BATTLE_ANIM_OAMSET_81", + "BATTLE_ANIM_OAMSET_82", + "BATTLE_ANIM_OAMSET_83", + "BATTLE_ANIM_OAMSET_84", + "BATTLE_ANIM_OAMSET_85", + "BATTLE_ANIM_OAMSET_86", + "BATTLE_ANIM_OAMSET_87", + "BATTLE_ANIM_OAMSET_88", + "BATTLE_ANIM_OAMSET_89", + "BATTLE_ANIM_OAMSET_8A", + "BATTLE_ANIM_OAMSET_8B", + "BATTLE_ANIM_OAMSET_8C", + "BATTLE_ANIM_OAMSET_8D", + "BATTLE_ANIM_OAMSET_8E", + "BATTLE_ANIM_OAMSET_8F", + "BATTLE_ANIM_OAMSET_90", + "BATTLE_ANIM_OAMSET_91", + "BATTLE_ANIM_OAMSET_92", + "BATTLE_ANIM_OAMSET_93", + "BATTLE_ANIM_OAMSET_94", + "BATTLE_ANIM_OAMSET_95", + "BATTLE_ANIM_OAMSET_96", + "BATTLE_ANIM_OAMSET_97", + "BATTLE_ANIM_OAMSET_98", + "BATTLE_ANIM_OAMSET_99", + "BATTLE_ANIM_OAMSET_9A", + "BATTLE_ANIM_OAMSET_9B", + "BATTLE_ANIM_OAMSET_9C", + "BATTLE_ANIM_OAMSET_9D", + "BATTLE_ANIM_OAMSET_9E", + "BATTLE_ANIM_OAMSET_9F", + "BATTLE_ANIM_OAMSET_A0", + "BATTLE_ANIM_OAMSET_A1", + "BATTLE_ANIM_OAMSET_A2", + "BATTLE_ANIM_OAMSET_A3", + "BATTLE_ANIM_OAMSET_A4", + "BATTLE_ANIM_OAMSET_A5", + "BATTLE_ANIM_OAMSET_A6", + "BATTLE_ANIM_OAMSET_A7", + "BATTLE_ANIM_OAMSET_A8", + "BATTLE_ANIM_OAMSET_A9", + "BATTLE_ANIM_OAMSET_AA", + "BATTLE_ANIM_OAMSET_AB", + "BATTLE_ANIM_OAMSET_AC", + "BATTLE_ANIM_OAMSET_AD", + "BATTLE_ANIM_OAMSET_AE", + "BATTLE_ANIM_OAMSET_AF", + "BATTLE_ANIM_OAMSET_B0", + "BATTLE_ANIM_OAMSET_B1", + "BATTLE_ANIM_OAMSET_B2", + "BATTLE_ANIM_OAMSET_B3", + "BATTLE_ANIM_OAMSET_B4", + "BATTLE_ANIM_OAMSET_B5", + "BATTLE_ANIM_OAMSET_B6", + "BATTLE_ANIM_OAMSET_B7", + "BATTLE_ANIM_OAMSET_B8", + "BATTLE_ANIM_OAMSET_B9", + "BATTLE_ANIM_OAMSET_BA", + "BATTLE_ANIM_OAMSET_BB", + "BATTLE_ANIM_OAMSET_BC", + "BATTLE_ANIM_OAMSET_BD", + "BATTLE_ANIM_OAMSET_BE", + "BATTLE_ANIM_OAMSET_BF", + "BATTLE_ANIM_OAMSET_C0", + "BATTLE_ANIM_OAMSET_C1", + "BATTLE_ANIM_OAMSET_C2", + "BATTLE_ANIM_OAMSET_C3", + "BATTLE_ANIM_OAMSET_C4", + "BATTLE_ANIM_OAMSET_C5", + "BATTLE_ANIM_OAMSET_C6", + "BATTLE_ANIM_OAMSET_C7", + "BATTLE_ANIM_OAMSET_C8", + "BATTLE_ANIM_OAMSET_C9", + "BATTLE_ANIM_OAMSET_CA", + "BATTLE_ANIM_OAMSET_CB", + "BATTLE_ANIM_OAMSET_CC", + "BATTLE_ANIM_OAMSET_CD", + "BATTLE_ANIM_OAMSET_CE", + "BATTLE_ANIM_OAMSET_CF", + "BATTLE_ANIM_OAMSET_D0", + "BATTLE_ANIM_OAMSET_D1", + "BATTLE_ANIM_OAMSET_D2", + "BATTLE_ANIM_OAMSET_D3", + "BATTLE_ANIM_OAMSET_D4", + "BATTLE_ANIM_OAMSET_D5", + "BATTLE_ANIM_OAMSET_D6", + "BATTLE_ANIM_OAMSET_D7" + ], + "battleAnimObPaletteOrder": [ + "PAL_BATTLE_OB_ENEMY", + "PAL_BATTLE_OB_PLAYER", + "PAL_BATTLE_OB_GRAY", + "PAL_BATTLE_OB_YELLOW", + "PAL_BATTLE_OB_RED", + "PAL_BATTLE_OB_GREEN", + "PAL_BATTLE_OB_BLUE", + "PAL_BATTLE_OB_BROWN" + ], + "battleAnimObjectOrder": [ + "BATTLE_ANIM_OBJ_HIT_BIG_YFIX", + "BATTLE_ANIM_OBJ_HIT_YFIX", + "BATTLE_ANIM_OBJ_HIT_SMALL_YFIX", + "BATTLE_ANIM_OBJ_HIT_BIG", + "BATTLE_ANIM_OBJ_HIT", + "BATTLE_ANIM_OBJ_HIT_SMALL", + "BATTLE_ANIM_OBJ_PUNCH", + "BATTLE_ANIM_OBJ_KICK", + "BATTLE_ANIM_OBJ_PALM", + "BATTLE_ANIM_OBJ_FANG", + "BATTLE_ANIM_OBJ_PUNCH_SHAKE", + "BATTLE_ANIM_OBJ_EMBER", + "BATTLE_ANIM_OBJ_DRAGON_RAGE", + "BATTLE_ANIM_OBJ_FLAMETHROWER", + "BATTLE_ANIM_OBJ_FIRE_SPIN", + "BATTLE_ANIM_OBJ_FIRE_BLAST", + "BATTLE_ANIM_OBJ_BURNED", + "BATTLE_ANIM_OBJ_BLIZZARD", + "BATTLE_ANIM_OBJ_ICE", + "BATTLE_ANIM_OBJ_ICE_BEAM", + "BATTLE_ANIM_OBJ_RAZOR_LEAF", + "BATTLE_ANIM_OBJ_POKE_BALL", + "BATTLE_ANIM_OBJ_POKE_BALL_BLOCKED", + "BATTLE_ANIM_OBJ_EXPLOSION1", + "BATTLE_ANIM_OBJ_EXPLOSION2", + "BATTLE_ANIM_OBJ_ACID", + "BATTLE_ANIM_OBJ_SLUDGE", + "BATTLE_ANIM_OBJ_BETA_BALL_POOF", + "BATTLE_ANIM_OBJ_BALL_POOF", + "BATTLE_ANIM_OBJ_BIG_ROCK", + "BATTLE_ANIM_OBJ_SMALL_ROCK", + "BATTLE_ANIM_OBJ_STRENGTH", + "BATTLE_ANIM_OBJ_SEISMIC_TOSS", + "BATTLE_ANIM_OBJ_BUBBLE", + "BATTLE_ANIM_OBJ_SURF", + "BATTLE_ANIM_OBJ_SING", + "BATTLE_ANIM_OBJ_WATER_GUN", + "BATTLE_ANIM_OBJ_HYDRO_PUMP", + "BATTLE_ANIM_OBJ_POWDER", + "BATTLE_ANIM_OBJ_BEAM", + "BATTLE_ANIM_OBJ_BEAM_TIP", + "BATTLE_ANIM_OBJ_ICE_BUILDUP", + "BATTLE_ANIM_OBJ_FROZEN", + "BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE", + "BATTLE_ANIM_OBJ_RECOVER", + "BATTLE_ANIM_OBJ_THUNDER_CENTER", + "BATTLE_ANIM_OBJ_THUNDER_LEFT", + "BATTLE_ANIM_OBJ_THUNDER_RIGHT", + "BATTLE_ANIM_OBJ_THUNDER_WAVE", + "BATTLE_ANIM_OBJ_SPARKS_CIRCLE_BIG", + "BATTLE_ANIM_OBJ_THUNDERBOLT_BALL", + "BATTLE_ANIM_OBJ_SPARKS_CIRCLE", + "BATTLE_ANIM_OBJ_THUNDERSHOCK_BALL", + "BATTLE_ANIM_OBJ_CLAMP", + "BATTLE_ANIM_OBJ_BITE", + "BATTLE_ANIM_OBJ_CUT_DOWN_LEFT", + "BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT", + "BATTLE_ANIM_OBJ_CUT_UP_RIGHT", + "BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT", + "BATTLE_ANIM_OBJ_CUT_LONG_DOWN_RIGHT", + "BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE", + "BATTLE_ANIM_OBJ_ABSORB_CENTER", + "BATTLE_ANIM_OBJ_GUST", + "BATTLE_ANIM_OBJ_VINE_WHIP1", + "BATTLE_ANIM_OBJ_VINE_WHIP2", + "BATTLE_ANIM_OBJ_RAZOR_WIND1", + "BATTLE_ANIM_OBJ_RAZOR_WIND2", + "BATTLE_ANIM_OBJ_SONICBOOM_JP", + "BATTLE_ANIM_OBJ_WARP", + "BATTLE_ANIM_OBJ_ABSORB", + "BATTLE_ANIM_OBJ_EGG", + "BATTLE_ANIM_OBJ_FOCUS", + "BATTLE_ANIM_OBJ_BIND1", + "BATTLE_ANIM_OBJ_BIND2", + "BATTLE_ANIM_OBJ_LEECH_SEED", + "BATTLE_ANIM_OBJ_SOUND", + "BATTLE_ANIM_OBJ_WAVE", + "BATTLE_ANIM_OBJ_CONFUSE_RAY", + "BATTLE_ANIM_OBJ_LEER", + "BATTLE_ANIM_OBJ_LEER_TIP", + "BATTLE_ANIM_OBJ_SCREEN", + "BATTLE_ANIM_OBJ_HARDEN", + "BATTLE_ANIM_OBJ_CHICK", + "BATTLE_ANIM_OBJ_AMNESIA", + "BATTLE_ANIM_OBJ_ASLEEP", + "BATTLE_ANIM_OBJ_SKULL", + "BATTLE_ANIM_OBJ_DIG_SAND", + "BATTLE_ANIM_OBJ_DIG_PILE", + "BATTLE_ANIM_OBJ_SAND", + "BATTLE_ANIM_OBJ_PARALYZED", + "BATTLE_ANIM_OBJ_STRING_SHOT", + "BATTLE_ANIM_OBJ_HAZE", + "BATTLE_ANIM_OBJ_MIST", + "BATTLE_ANIM_OBJ_SMOG", + "BATTLE_ANIM_OBJ_POISON_GAS", + "BATTLE_ANIM_OBJ_HORN", + "BATTLE_ANIM_OBJ_NEEDLE", + "BATTLE_ANIM_OBJ_PETAL_DANCE", + "BATTLE_ANIM_OBJ_SLUDGE_BOMB", + "BATTLE_ANIM_OBJ_PAY_DAY", + "BATTLE_ANIM_OBJ_SONICBOOM_JP_UNUSED", + "BATTLE_ANIM_OBJ_MIMIC", + "BATTLE_ANIM_OBJ_ATTRACT", + "BATTLE_ANIM_OBJ_BONEMERANG", + "BATTLE_ANIM_OBJ_BONE_CLUB", + "BATTLE_ANIM_OBJ_BONE_RUSH", + "BATTLE_ANIM_OBJ_SWIFT", + "BATTLE_ANIM_OBJ_KINESIS", + "BATTLE_ANIM_OBJ_FLASH", + "BATTLE_ANIM_OBJ_SHINY", + "BATTLE_ANIM_OBJ_SKY_ATTACK", + "BATTLE_ANIM_OBJ_LICK", + "BATTLE_ANIM_OBJ_WITHDRAW", + "BATTLE_ANIM_OBJ_DRAIN", + "BATTLE_ANIM_OBJ_GROWTH", + "BATTLE_ANIM_OBJ_CONVERSION2", + "BATTLE_ANIM_OBJ_SMOKE", + "BATTLE_ANIM_OBJ_SMOKESCREEN", + "BATTLE_ANIM_OBJ_SWORDS_DANCE", + "BATTLE_ANIM_OBJ_SPEED_LINE", + "BATTLE_ANIM_OBJ_SHARPEN", + "BATTLE_ANIM_OBJ_DEFENSE_CURL", + "BATTLE_ANIM_OBJ_METRONOME_HAND", + "BATTLE_ANIM_OBJ_METRONOME_SPARKLE", + "BATTLE_ANIM_OBJ_DISABLE", + "BATTLE_ANIM_OBJ_AGILITY", + "BATTLE_ANIM_OBJ_HEART", + "BATTLE_ANIM_OBJ_FLAME_WHEEL", + "BATTLE_ANIM_OBJ_SACRED_FIRE", + "BATTLE_ANIM_OBJ_COTTON_SPORE", + "BATTLE_ANIM_OBJ_MILK_DRINK", + "BATTLE_ANIM_OBJ_ANGER", + "BATTLE_ANIM_OBJ_HEAL_BELL", + "BATTLE_ANIM_OBJ_HEAL_BELL_NOTE", + "BATTLE_ANIM_OBJ_BATON_PASS", + "BATTLE_ANIM_OBJ_LOCK_ON", + "BATTLE_ANIM_OBJ_MIND_READER", + "BATTLE_ANIM_OBJ_SAFEGUARD", + "BATTLE_ANIM_OBJ_PROTECT", + "BATTLE_ANIM_OBJ_THIEF", + "BATTLE_ANIM_OBJ_OCTAZOOKA", + "BATTLE_ANIM_OBJ_PRESENT", + "BATTLE_ANIM_OBJ_SPIKES", + "BATTLE_ANIM_OBJ_POWDER_SNOW", + "BATTLE_ANIM_OBJ_DRAGONBREATH", + "BATTLE_ANIM_OBJ_CONVERSION", + "BATTLE_ANIM_OBJ_SPIDER_WEB", + "BATTLE_ANIM_OBJ_CAKE_UNUSED", + "BATTLE_ANIM_OBJ_NIGHTMARE", + "BATTLE_ANIM_OBJ_IN_NIGHTMARE", + "BATTLE_ANIM_OBJ_LOVELY_KISS", + "BATTLE_ANIM_OBJ_SWEET_KISS", + "BATTLE_ANIM_OBJ_SKETCH", + "BATTLE_ANIM_OBJ_ENCORE_HAND", + "BATTLE_ANIM_OBJ_ENCORE_STAR", + "BATTLE_ANIM_OBJ_DESTINY_BOND", + "BATTLE_ANIM_OBJ_MORNING_SUN", + "BATTLE_ANIM_OBJ_GLIMMER", + "BATTLE_ANIM_OBJ_MOONLIGHT", + "BATTLE_ANIM_OBJ_HIDDEN_POWER", + "BATTLE_ANIM_OBJ_CROSS_CHOP1", + "BATTLE_ANIM_OBJ_CROSS_CHOP2", + "BATTLE_ANIM_OBJ_SANDSTORM", + "BATTLE_ANIM_OBJ_ZAP_CANNON", + "BATTLE_ANIM_OBJ_SPITE", + "BATTLE_ANIM_OBJ_CURSE", + "BATTLE_ANIM_OBJ_PERISH_SONG", + "BATTLE_ANIM_OBJ_FORESIGHT", + "BATTLE_ANIM_OBJ_RAPID_SPIN", + "BATTLE_ANIM_OBJ_SWAGGER", + "BATTLE_ANIM_OBJ_BELLY_DRUM_HAND", + "BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE", + "BATTLE_ANIM_OBJ_MEAN_LOOK", + "BATTLE_ANIM_OBJ_BETA_PURSUIT", + "BATTLE_ANIM_OBJ_SHOOTING_SPARKLE", + "BATTLE_ANIM_OBJ_RAIN", + "BATTLE_ANIM_OBJ_B0", + "BATTLE_ANIM_OBJ_PSYCH_UP", + "BATTLE_ANIM_OBJ_ANCIENTPOWER", + "BATTLE_ANIM_OBJ_AEROBLAST", + "BATTLE_ANIM_OBJ_SHADOW_BALL", + "BATTLE_ANIM_OBJ_ROCK_SMASH", + "BATTLE_ANIM_OBJ_FLOWER", + "BATTLE_ANIM_OBJ_COTTON", + "BATTLE_ANIM_OBJ_ENEMYFEET_1ROW", + "BATTLE_ANIM_OBJ_PLAYERHEAD_1ROW", + "BATTLE_ANIM_OBJ_ENEMYFEET_2ROW", + "BATTLE_ANIM_OBJ_PLAYERHEAD_2ROW" + ], + "battleBgEffectOrder": [ + "BATTLE_BG_EFFECT_END", + "BATTLE_BG_EFFECT_FLASH_INVERTED", + "BATTLE_BG_EFFECT_FLASH_WHITE", + "BATTLE_BG_EFFECT_WHITE_HUES", + "BATTLE_BG_EFFECT_BLACK_HUES", + "BATTLE_BG_EFFECT_ALTERNATE_HUES", + "BATTLE_BG_EFFECT_CYCLE_OBPALS_GRAY_AND_YELLOW", + "BATTLE_BG_EFFECT_CYCLE_MID_OBPALS_GRAY_AND_YELLOW", + "BATTLE_BG_EFFECT_CYCLE_BGPALS_INVERTED", + "BATTLE_BG_EFFECT_HIDE_MON", + "BATTLE_BG_EFFECT_SHOW_MON", + "BATTLE_BG_EFFECT_ENTER_MON", + "BATTLE_BG_EFFECT_RETURN_MON", + "BATTLE_BG_EFFECT_SURF", + "BATTLE_BG_EFFECT_WHIRLPOOL", + "BATTLE_BG_EFFECT_TELEPORT", + "BATTLE_BG_EFFECT_NIGHT_SHADE", + "BATTLE_BG_EFFECT_BATTLEROBJ_1ROW", + "BATTLE_BG_EFFECT_BATTLEROBJ_2ROW", + "BATTLE_BG_EFFECT_DOUBLE_TEAM", + "BATTLE_BG_EFFECT_ACID_ARMOR", + "BATTLE_BG_EFFECT_RAPID_FLASH", + "BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT", + "BATTLE_BG_EFFECT_FADE_MON_TO_BLACK", + "BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING", + "BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING", + "BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING", + "BATTLE_BG_EFFECT_FLASH_MON_REPEATING", + "BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING", + "BATTLE_BG_EFFECT_FADE_MON_TO_WHITE_WAIT_FADE_BACK", + "BATTLE_BG_EFFECT_FADE_MON_FROM_WHITE", + "BATTLE_BG_EFFECT_SHAKE_SCREEN_X", + "BATTLE_BG_EFFECT_SHAKE_SCREEN_Y", + "BATTLE_BG_EFFECT_WITHDRAW", + "BATTLE_BG_EFFECT_BOUNCE_DOWN", + "BATTLE_BG_EFFECT_DIG", + "BATTLE_BG_EFFECT_TACKLE", + "BATTLE_BG_EFFECT_BODY_SLAM", + "BATTLE_BG_EFFECT_WOBBLE_MON", + "BATTLE_BG_EFFECT_REMOVE_MON", + "BATTLE_BG_EFFECT_WAVE_DEFORM_MON", + "BATTLE_BG_EFFECT_PSYCHIC", + "BATTLE_BG_EFFECT_BETA_SEND_OUT_MON1", + "BATTLE_BG_EFFECT_BETA_SEND_OUT_MON2", + "BATTLE_BG_EFFECT_FLAIL", + "BATTLE_BG_EFFECT_BETA_PURSUIT", + "BATTLE_BG_EFFECT_ROLLOUT", + "BATTLE_BG_EFFECT_VITAL_THROW", + "BATTLE_BG_EFFECT_START_WATER", + "BATTLE_BG_EFFECT_WATER", + "BATTLE_BG_EFFECT_END_WATER", + "BATTLE_BG_EFFECT_VIBRATE_MON", + "BATTLE_BG_EFFECT_WOBBLE_PLAYER", + "BATTLE_BG_EFFECT_WOBBLE_SCREEN" + ], + "cmdQueueOrder": [ + "CMDQUEUE_NULL", + "CMDQUEUE_TYPE1", + "CMDQUEUE_STONETABLE", + "CMDQUEUE_TYPE3", + "CMDQUEUE_TYPE4" + ], + "decoDescOrder": [ + "DECODESC_POSTER", + "DECODESC_LEFT_DOLL", + "DECODESC_RIGHT_DOLL", + "DECODESC_BIG_DOLL", + "DECODESC_CONSOLE" + ], + "eggGroupOrder": [ + "EGG_MONSTER", + "EGG_WATER_1", + "EGG_BUG", + "EGG_FLYING", + "EGG_GROUND", + "EGG_FAIRY", + "EGG_PLANT", + "EGG_HUMANSHAPE", + "EGG_WATER_3", + "EGG_MINERAL", + "EGG_INDETERMINATE", + "EGG_WATER_2", + "EGG_DITTO", + "EGG_DRAGON", + "EGG_NONE" + ], + "engineFlagOrder": [ + "ENGINE_RADIO_CARD", + "ENGINE_MAP_CARD", + "ENGINE_PHONE_CARD", + "ENGINE_EXPN_CARD", + "ENGINE_POKEGEAR", + "ENGINE_DAY_CARE_MAN_HAS_EGG", + "ENGINE_DAY_CARE_MAN_HAS_MON", + "ENGINE_DAY_CARE_LADY_HAS_MON", + "ENGINE_MOM_SAVING_MONEY", + "ENGINE_MOM_ACTIVE", + "ENGINE_UNUSED_TWO_DAY_TIMER_ON", + "ENGINE_POKEDEX", + "ENGINE_UNOWN_DEX", + "ENGINE_CAUGHT_POKERUS", + "ENGINE_ROCKET_SIGNAL_ON_CH20", + "ENGINE_CREDITS_SKIP", + "ENGINE_MOBILE_SYSTEM", + "ENGINE_BUG_CONTEST_TIMER", + "ENGINE_SAFARI_ZONE", + "ENGINE_ROCKETS_IN_RADIO_TOWER", + "ENGINE_BIKE_SHOP_CALL_ENABLED", + "ENGINE_UNUSED_STATUSFLAGS2_5", + "ENGINE_REACHED_GOLDENROD", + "ENGINE_ROCKETS_IN_MAHOGANY", + "ENGINE_STRENGTH_ACTIVE", + "ENGINE_ALWAYS_ON_BIKE", + "ENGINE_DOWNHILL", + "ENGINE_ZEPHYRBADGE", + "ENGINE_HIVEBADGE", + "ENGINE_PLAINBADGE", + "ENGINE_FOGBADGE", + "ENGINE_MINERALBADGE", + "ENGINE_STORMBADGE", + "ENGINE_GLACIERBADGE", + "ENGINE_RISINGBADGE", + "ENGINE_BOULDERBADGE", + "ENGINE_CASCADEBADGE", + "ENGINE_THUNDERBADGE", + "ENGINE_RAINBOWBADGE", + "ENGINE_SOULBADGE", + "ENGINE_MARSHBADGE", + "ENGINE_VOLCANOBADGE", + "ENGINE_EARTHBADGE", + "ENGINE_UNLOCKED_UNOWNS_A_TO_K", + "ENGINE_UNLOCKED_UNOWNS_L_TO_R", + "ENGINE_UNLOCKED_UNOWNS_S_TO_W", + "ENGINE_UNLOCKED_UNOWNS_X_TO_Z", + "ENGINE_UNLOCKED_UNOWNS_UNUSED_4", + "ENGINE_UNLOCKED_UNOWNS_UNUSED_5", + "ENGINE_UNLOCKED_UNOWNS_UNUSED_6", + "ENGINE_UNLOCKED_UNOWNS_UNUSED_7", + "ENGINE_FLYPOINT_PLAYERS_HOUSE", + "ENGINE_FLYPOINT_DEBUG", + "ENGINE_FLYPOINT_PALLET", + "ENGINE_FLYPOINT_VIRIDIAN", + "ENGINE_FLYPOINT_PEWTER", + "ENGINE_FLYPOINT_CERULEAN", + "ENGINE_FLYPOINT_ROCK_TUNNEL", + "ENGINE_FLYPOINT_VERMILION", + "ENGINE_FLYPOINT_LAVENDER", + "ENGINE_FLYPOINT_SAFFRON", + "ENGINE_FLYPOINT_CELADON", + "ENGINE_FLYPOINT_FUCHSIA", + "ENGINE_FLYPOINT_CINNABAR", + "ENGINE_FLYPOINT_INDIGO_PLATEAU", + "ENGINE_FLYPOINT_NEW_BARK", + "ENGINE_FLYPOINT_CHERRYGROVE", + "ENGINE_FLYPOINT_VIOLET", + "ENGINE_FLYPOINT_AZALEA", + "ENGINE_FLYPOINT_CIANWOOD", + "ENGINE_FLYPOINT_GOLDENROD", + "ENGINE_FLYPOINT_OLIVINE", + "ENGINE_FLYPOINT_ECRUTEAK", + "ENGINE_FLYPOINT_MAHOGANY", + "ENGINE_FLYPOINT_LAKE_OF_RAGE", + "ENGINE_FLYPOINT_BLACKTHORN", + "ENGINE_FLYPOINT_SILVER_CAVE", + "ENGINE_FLYPOINT_UNUSED", + "ENGINE_LUCKY_NUMBER_SHOW", + "ENGINE_UNUSED_STATUSFLAGS2_3", + "ENGINE_KURT_MAKING_BALLS", + "ENGINE_DAILY_BUG_CONTEST", + "ENGINE_QWILFISH_SWARM", + "ENGINE_TIME_CAPSULE", + "ENGINE_ALL_FRUIT_TREES", + "ENGINE_GOT_SHUCKIE_TODAY", + "ENGINE_GOLDENROD_UNDERGROUND_MERCHANT_CLOSED", + "ENGINE_FOUGHT_IN_TRAINER_HALL_TODAY", + "ENGINE_MT_MOON_SQUARE_CLEFAIRY", + "ENGINE_UNION_CAVE_LAPRAS", + "ENGINE_GOLDENROD_UNDERGROUND_GOT_HAIRCUT", + "ENGINE_GOLDENROD_DEPT_STORE_TM27_RETURN", + "ENGINE_DAISYS_GROOMING", + "ENGINE_INDIGO_PLATEAU_RIVAL_FIGHT", + "ENGINE_DAILY_MOVE_TUTOR", + "ENGINE_BUENAS_PASSWORD", + "ENGINE_BUENAS_PASSWORD_2", + "ENGINE_GOLDENROD_DEPT_STORE_SALE_IS_ON", + "ENGINE_GAME_TIMER_MOBILE", + "ENGINE_PLAYER_IS_FEMALE", + "ENGINE_FOREST_IS_RESTLESS", + "ENGINE_JACK_READY_FOR_REMATCH", + "ENGINE_HUEY_READY_FOR_REMATCH", + "ENGINE_GAVEN_READY_FOR_REMATCH", + "ENGINE_BETH_READY_FOR_REMATCH", + "ENGINE_JOSE_READY_FOR_REMATCH", + "ENGINE_REENA_READY_FOR_REMATCH", + "ENGINE_JOEY_READY_FOR_REMATCH", + "ENGINE_WADE_READY_FOR_REMATCH", + "ENGINE_RALPH_READY_FOR_REMATCH", + "ENGINE_LIZ_READY_FOR_REMATCH", + "ENGINE_ANTHONY_READY_FOR_REMATCH", + "ENGINE_TODD_READY_FOR_REMATCH", + "ENGINE_GINA_READY_FOR_REMATCH", + "ENGINE_ARNIE_READY_FOR_REMATCH", + "ENGINE_ALAN_READY_FOR_REMATCH", + "ENGINE_DANA_READY_FOR_REMATCH", + "ENGINE_CHAD_READY_FOR_REMATCH", + "ENGINE_TULLY_READY_FOR_REMATCH", + "ENGINE_BRENT_READY_FOR_REMATCH", + "ENGINE_TIFFANY_READY_FOR_REMATCH", + "ENGINE_VANCE_READY_FOR_REMATCH", + "ENGINE_WILTON_READY_FOR_REMATCH", + "ENGINE_PARRY_READY_FOR_REMATCH", + "ENGINE_ERIN_READY_FOR_REMATCH", + "ENGINE_BEVERLY_HAS_NUGGET", + "ENGINE_JOSE_HAS_STAR_PIECE", + "ENGINE_WADE_HAS_ITEM", + "ENGINE_GINA_HAS_LEAF_STONE", + "ENGINE_ALAN_HAS_FIRE_STONE", + "ENGINE_DANA_HAS_THUNDERSTONE", + "ENGINE_DEREK_HAS_NUGGET", + "ENGINE_TULLY_HAS_WATER_STONE", + "ENGINE_TIFFANY_HAS_PINK_BOW", + "ENGINE_WILTON_HAS_ITEM", + "ENGINE_JACK_MONDAY_MORNING", + "ENGINE_HUEY_WEDNESDAY_NIGHT", + "ENGINE_GAVEN_THURSDAY_MORNING", + "ENGINE_BETH_FRIDAY_AFTERNOON", + "ENGINE_JOSE_SATURDAY_NIGHT", + "ENGINE_REENA_SUNDAY_MORNING", + "ENGINE_JOEY_MONDAY_AFTERNOON", + "ENGINE_WADE_TUESDAY_NIGHT", + "ENGINE_RALPH_WEDNESDAY_MORNING", + "ENGINE_LIZ_THURSDAY_AFTERNOON", + "ENGINE_ANTHONY_FRIDAY_NIGHT", + "ENGINE_TODD_SATURDAY_MORNING", + "ENGINE_GINA_SUNDAY_AFTERNOON", + "ENGINE_ARNIE_TUESDAY_MORNING", + "ENGINE_ALAN_WEDNESDAY_AFTERNOON", + "ENGINE_DANA_THURSDAY_NIGHT", + "ENGINE_CHAD_FRIDAY_MORNING", + "ENGINE_TULLY_SUNDAY_NIGHT", + "ENGINE_BRENT_MONDAY_MORNING", + "ENGINE_TIFFANY_TUESDAY_AFTERNOON", + "ENGINE_VANCE_WEDNESDAY_NIGHT", + "ENGINE_WILTON_THURSDAY_MORNING", + "ENGINE_PARRY_FRIDAY_AFTERNOON", + "ENGINE_ERIN_SATURDAY_NIGHT", + "ENGINE_KRIS_IN_CABLE_CLUB", + "ENGINE_DUNSPARCE_SWARM", + "ENGINE_YANMA_SWARM" + ], + "environmentOrder": [ + "TOWN", + "ROUTE", + "INDOOR", + "CAVE", + "ENVIRONMENT_5", + "GATE", + "DUNGEON" + ], + "evolveMethodOrder": [ + "EVOLVE_LEVEL", + "EVOLVE_ITEM", + "EVOLVE_TRADE", + "EVOLVE_HAPPINESS", + "EVOLVE_STAT" + ], + "fishGroupOrder": [ + "FISHGROUP_NONE", + "FISHGROUP_SHORE", + "FISHGROUP_OCEAN", + "FISHGROUP_LAKE", + "FISHGROUP_POND", + "FISHGROUP_DRATINI", + "FISHGROUP_QWILFISH_SWARM", + "FISHGROUP_REMORAID_SWARM", + "FISHGROUP_GYARADOS", + "FISHGROUP_DRATINI_2", + "FISHGROUP_WHIRL_ISLANDS", + "FISHGROUP_QWILFISH", + "FISHGROUP_REMORAID", + "FISHGROUP_QWILFISH_NO_SWARM" + ], + "floorOrder": [ + "FLOOR_B4F", + "FLOOR_B3F", + "FLOOR_B2F", + "FLOOR_B1F", + "FLOOR_1F", + "FLOOR_2F", + "FLOOR_3F", + "FLOOR_4F", + "FLOOR_5F", + "FLOOR_6F", + "FLOOR_7F", + "FLOOR_8F", + "FLOOR_9F", + "FLOOR_10F", + "FLOOR_11F", + "FLOOR_ROOF" + ], + "growthRateOrder": [ + "GROWTH_MEDIUM_FAST", + "GROWTH_SLIGHTLY_FAST", + "GROWTH_SLIGHTLY_SLOW", + "GROWTH_MEDIUM_SLOW", + "GROWTH_FAST", + "GROWTH_SLOW" + ], + "heldEffectOrder": [ + "HELD_NONE", + "HELD_BERRY", + "HELD_2", + "HELD_LEFTOVERS", + "HELD_UNUSED_4", + "HELD_5", + "HELD_RESTORE_PP", + "HELD_UNUSED_7", + "HELD_CLEANSE_TAG", + "HELD_UNUSED_9", + "HELD_HEAL_POISON", + "HELD_HEAL_FREEZE", + "HELD_HEAL_BURN", + "HELD_HEAL_SLEEP", + "HELD_HEAL_PARALYZE", + "HELD_HEAL_STATUS", + "HELD_HEAL_CONFUSION", + "HELD_UNUSED_17", + "HELD_UNUSED_18", + "HELD_UNUSED_19", + "HELD_PREVENT_POISON", + "HELD_PREVENT_BURN", + "HELD_PREVENT_FREEZE", + "HELD_PREVENT_SLEEP", + "HELD_PREVENT_PARALYZE", + "HELD_PREVENT_CONFUSE", + "HELD_UNUSED_26", + "HELD_UNUSED_27", + "HELD_UNUSED_28", + "HELD_UNUSED_29", + "HELD_30", + "HELD_ATTACK_UP", + "HELD_DEFENSE_UP", + "HELD_SPEED_UP", + "HELD_SP_ATTACK_UP", + "HELD_SP_DEFENSE_UP", + "HELD_ACCURACY_UP", + "HELD_EVASION_UP", + "HELD_38", + "HELD_UNUSED_39", + "HELD_UNUSED_40", + "HELD_UNUSED_41", + "HELD_METAL_POWDER", + "HELD_UNUSED_43", + "HELD_UNUSED_44", + "HELD_UNUSED_45", + "HELD_UNUSED_46", + "HELD_UNUSED_47", + "HELD_UNUSED_48", + "HELD_UNUSED_49", + "HELD_NORMAL_BOOST", + "HELD_FIGHTING_BOOST", + "HELD_FLYING_BOOST", + "HELD_POISON_BOOST", + "HELD_GROUND_BOOST", + "HELD_ROCK_BOOST", + "HELD_BUG_BOOST", + "HELD_GHOST_BOOST", + "HELD_FIRE_BOOST", + "HELD_WATER_BOOST", + "HELD_GRASS_BOOST", + "HELD_ELECTRIC_BOOST", + "HELD_PSYCHIC_BOOST", + "HELD_ICE_BOOST", + "HELD_DRAGON_BOOST", + "HELD_DARK_BOOST", + "HELD_STEEL_BOOST", + "HELD_UNUSED_67", + "HELD_UNUSED_68", + "HELD_UNUSED_69", + "HELD_CATCH_CHANCE", + "HELD_71", + "HELD_ESCAPE", + "HELD_CRITICAL_UP", + "HELD_QUICK_CLAW", + "HELD_FLINCH", + "HELD_AMULET_COIN", + "HELD_BRIGHTPOWDER", + "HELD_UNUSED_78", + "HELD_FOCUS_BAND" + ], + "iconOrder": [ + "ICON_NULL", + "ICON_POLIWAG", + "ICON_JIGGLYPUFF", + "ICON_DIGLETT", + "ICON_PIKACHU", + "ICON_STARYU", + "ICON_FISH", + "ICON_BIRD", + "ICON_MONSTER", + "ICON_CLEFAIRY", + "ICON_ODDISH", + "ICON_BUG", + "ICON_GHOST", + "ICON_LAPRAS", + "ICON_HUMANSHAPE", + "ICON_FOX", + "ICON_EQUINE", + "ICON_SHELL", + "ICON_BLOB", + "ICON_SERPENT", + "ICON_VOLTORB", + "ICON_SQUIRTLE", + "ICON_BULBASAUR", + "ICON_CHARMANDER", + "ICON_CATERPILLAR", + "ICON_UNOWN", + "ICON_GEODUDE", + "ICON_FIGHTER", + "ICON_EGG", + "ICON_JELLYFISH", + "ICON_MOTH", + "ICON_BAT", + "ICON_SNORLAX", + "ICON_HO_OH", + "ICON_LUGIA", + "ICON_GYARADOS", + "ICON_SLOWPOKE", + "ICON_SUDOWOODO", + "ICON_BIGMON" + ], + "itemMenuOrder": [ + "ITEMMENU_NOUSE", + "ITEMMENU_CURRENT", + "ITEMMENU_PARTY", + "ITEMMENU_CLOSE" + ], + "itemNameCount": 190, + "itemOrder": [ + "MASTER_BALL", + "ULTRA_BALL", + "BRIGHTPOWDER", + "GREAT_BALL", + "POKE_BALL", + "TOWN_MAP", + "BICYCLE", + "MOON_STONE", + "ANTIDOTE", + "BURN_HEAL", + "ICE_HEAL", + "AWAKENING", + "PARLYZ_HEAL", + "FULL_RESTORE", + "MAX_POTION", + "HYPER_POTION", + "SUPER_POTION", + "POTION", + "ESCAPE_ROPE", + "REPEL", + "MAX_ELIXER", + "FIRE_STONE", + "THUNDERSTONE", + "WATER_STONE", + "ITEM_19", + "HP_UP", + "PROTEIN", + "IRON", + "CARBOS", + "LUCKY_PUNCH", + "CALCIUM", + "RARE_CANDY", + "X_ACCURACY", + "LEAF_STONE", + "METAL_POWDER", + "NUGGET", + "POKE_DOLL", + "FULL_HEAL", + "REVIVE", + "MAX_REVIVE", + "GUARD_SPEC", + "SUPER_REPEL", + "MAX_REPEL", + "DIRE_HIT", + "ITEM_2D", + "FRESH_WATER", + "SODA_POP", + "LEMONADE", + "X_ATTACK", + "ITEM_32", + "X_DEFEND", + "X_SPEED", + "X_SPECIAL", + "COIN_CASE", + "ITEMFINDER", + "POKE_FLUTE", + "EXP_SHARE", + "OLD_ROD", + "GOOD_ROD", + "SILVER_LEAF", + "SUPER_ROD", + "PP_UP", + "ETHER", + "MAX_ETHER", + "ELIXER", + "RED_SCALE", + "SECRETPOTION", + "S_S_TICKET", + "MYSTERY_EGG", + "CLEAR_BELL", + "SILVER_WING", + "MOOMOO_MILK", + "QUICK_CLAW", + "PSNCUREBERRY", + "GOLD_LEAF", + "SOFT_SAND", + "SHARP_BEAK", + "PRZCUREBERRY", + "BURNT_BERRY", + "ICE_BERRY", + "POISON_BARB", + "KINGS_ROCK", + "BITTER_BERRY", + "MINT_BERRY", + "RED_APRICORN", + "TINYMUSHROOM", + "BIG_MUSHROOM", + "SILVERPOWDER", + "BLU_APRICORN", + "ITEM_5A", + "AMULET_COIN", + "YLW_APRICORN", + "GRN_APRICORN", + "CLEANSE_TAG", + "MYSTIC_WATER", + "TWISTEDSPOON", + "WHT_APRICORN", + "BLACKBELT_I", + "BLK_APRICORN", + "ITEM_64", + "PNK_APRICORN", + "BLACKGLASSES", + "SLOWPOKETAIL", + "PINK_BOW", + "STICK", + "SMOKE_BALL", + "NEVERMELTICE", + "MAGNET", + "MIRACLEBERRY", + "PEARL", + "BIG_PEARL", + "EVERSTONE", + "SPELL_TAG", + "RAGECANDYBAR", + "GS_BALL", + "BLUE_CARD", + "MIRACLE_SEED", + "THICK_CLUB", + "FOCUS_BAND", + "ITEM_78", + "ENERGYPOWDER", + "ENERGY_ROOT", + "HEAL_POWDER", + "REVIVAL_HERB", + "HARD_STONE", + "LUCKY_EGG", + "CARD_KEY", + "MACHINE_PART", + "EGG_TICKET", + "LOST_ITEM", + "STARDUST", + "STAR_PIECE", + "BASEMENT_KEY", + "PASS", + "ITEM_87", + "ITEM_88", + "ITEM_89", + "CHARCOAL", + "BERRY_JUICE", + "SCOPE_LENS", + "ITEM_8D", + "ITEM_8E", + "METAL_COAT", + "DRAGON_FANG", + "ITEM_91", + "LEFTOVERS", + "ITEM_93", + "ITEM_94", + "ITEM_95", + "MYSTERYBERRY", + "DRAGON_SCALE", + "BERSERK_GENE", + "ITEM_99", + "ITEM_9A", + "ITEM_9B", + "SACRED_ASH", + "HEAVY_BALL", + "FLOWER_MAIL", + "LEVEL_BALL", + "LURE_BALL", + "FAST_BALL", + "ITEM_A2", + "LIGHT_BALL", + "FRIEND_BALL", + "MOON_BALL", + "LOVE_BALL", + "NORMAL_BOX", + "GORGEOUS_BOX", + "SUN_STONE", + "POLKADOT_BOW", + "ITEM_AB", + "UP_GRADE", + "BERRY", + "GOLD_BERRY", + "SQUIRTBOTTLE", + "ITEM_B0", + "PARK_BALL", + "RAINBOW_WING", + "ITEM_B3", + "BRICK_PIECE", + "SURF_MAIL", + "LITEBLUEMAIL", + "PORTRAITMAIL", + "LOVELY_MAIL", + "EON_MAIL", + "MORPH_MAIL", + "BLUESKY_MAIL", + "MUSIC_MAIL", + "MIRAGE_MAIL", + "ITEM_BE", + "TM_DYNAMICPUNCH", + "TM_HEADBUTT", + "TM_CURSE", + "TM_ROLLOUT", + "ITEM_C3", + "TM_ROAR", + "TM_TOXIC", + "TM_ZAP_CANNON", + "TM_ROCK_SMASH", + "TM_PSYCH_UP", + "TM_HIDDEN_POWER", + "TM_SUNNY_DAY", + "TM_SWEET_SCENT", + "TM_SNORE", + "TM_BLIZZARD", + "TM_HYPER_BEAM", + "TM_ICY_WIND", + "TM_PROTECT", + "TM_RAIN_DANCE", + "TM_GIGA_DRAIN", + "TM_ENDURE", + "TM_FRUSTRATION", + "TM_SOLARBEAM", + "TM_IRON_TAIL", + "TM_DRAGONBREATH", + "TM_THUNDER", + "TM_EARTHQUAKE", + "TM_RETURN", + "TM_DIG", + "ITEM_DC", + "TM_PSYCHIC_M", + "TM_SHADOW_BALL", + "TM_MUD_SLAP", + "TM_DOUBLE_TEAM", + "TM_ICE_PUNCH", + "TM_SWAGGER", + "TM_SLEEP_TALK", + "TM_SLUDGE_BOMB", + "TM_SANDSTORM", + "TM_FIRE_BLAST", + "TM_SWIFT", + "TM_DEFENSE_CURL", + "TM_THUNDERPUNCH", + "TM_DREAM_EATER", + "TM_DETECT", + "TM_REST", + "TM_ATTRACT", + "TM_THIEF", + "TM_STEEL_WING", + "TM_FIRE_PUNCH", + "TM_FURY_CUTTER", + "TM_NIGHTMARE", + "HM_CUT", + "HM_FLY", + "HM_SURF", + "HM_STRENGTH", + "HM_FLASH", + "HM_WHIRLPOOL", + "HM_WATERFALL", + "ITEM_FA" + ], + "landmarkOrder": [ + "LANDMARK_SPECIAL", + "LANDMARK_NEW_BARK_TOWN", + "LANDMARK_ROUTE_29", + "LANDMARK_CHERRYGROVE_CITY", + "LANDMARK_ROUTE_30", + "LANDMARK_ROUTE_31", + "LANDMARK_VIOLET_CITY", + "LANDMARK_SPROUT_TOWER", + "LANDMARK_ROUTE_32", + "LANDMARK_RUINS_OF_ALPH", + "LANDMARK_UNION_CAVE", + "LANDMARK_ROUTE_33", + "LANDMARK_AZALEA_TOWN", + "LANDMARK_SLOWPOKE_WELL", + "LANDMARK_ILEX_FOREST", + "LANDMARK_ROUTE_34", + "LANDMARK_GOLDENROD_CITY", + "LANDMARK_RADIO_TOWER", + "LANDMARK_ROUTE_35", + "LANDMARK_NATIONAL_PARK", + "LANDMARK_ROUTE_36", + "LANDMARK_ROUTE_37", + "LANDMARK_ECRUTEAK_CITY", + "LANDMARK_TIN_TOWER", + "LANDMARK_BURNED_TOWER", + "LANDMARK_ROUTE_38", + "LANDMARK_ROUTE_39", + "LANDMARK_OLIVINE_CITY", + "LANDMARK_LIGHTHOUSE", + "LANDMARK_BATTLE_TOWER", + "LANDMARK_ROUTE_40", + "LANDMARK_WHIRL_ISLANDS", + "LANDMARK_ROUTE_41", + "LANDMARK_CIANWOOD_CITY", + "LANDMARK_ROUTE_42", + "LANDMARK_MT_MORTAR", + "LANDMARK_MAHOGANY_TOWN", + "LANDMARK_ROUTE_43", + "LANDMARK_LAKE_OF_RAGE", + "LANDMARK_ROUTE_44", + "LANDMARK_ICE_PATH", + "LANDMARK_BLACKTHORN_CITY", + "LANDMARK_DRAGONS_DEN", + "LANDMARK_ROUTE_45", + "LANDMARK_DARK_CAVE", + "LANDMARK_ROUTE_46", + "LANDMARK_SILVER_CAVE", + "LANDMARK_PALLET_TOWN", + "LANDMARK_ROUTE_1", + "LANDMARK_VIRIDIAN_CITY", + "LANDMARK_ROUTE_2", + "LANDMARK_PEWTER_CITY", + "LANDMARK_ROUTE_3", + "LANDMARK_MT_MOON", + "LANDMARK_ROUTE_4", + "LANDMARK_CERULEAN_CITY", + "LANDMARK_ROUTE_24", + "LANDMARK_ROUTE_25", + "LANDMARK_ROUTE_5", + "LANDMARK_UNDERGROUND_PATH", + "LANDMARK_ROUTE_6", + "LANDMARK_VERMILION_CITY", + "LANDMARK_DIGLETTS_CAVE", + "LANDMARK_ROUTE_7", + "LANDMARK_ROUTE_8", + "LANDMARK_ROUTE_9", + "LANDMARK_ROCK_TUNNEL", + "LANDMARK_ROUTE_10", + "LANDMARK_POWER_PLANT", + "LANDMARK_LAVENDER_TOWN", + "LANDMARK_LAV_RADIO_TOWER", + "LANDMARK_CELADON_CITY", + "LANDMARK_SAFFRON_CITY", + "LANDMARK_ROUTE_11", + "LANDMARK_ROUTE_12", + "LANDMARK_ROUTE_13", + "LANDMARK_ROUTE_14", + "LANDMARK_ROUTE_15", + "LANDMARK_ROUTE_16", + "LANDMARK_ROUTE_17", + "LANDMARK_ROUTE_18", + "LANDMARK_FUCHSIA_CITY", + "LANDMARK_ROUTE_19", + "LANDMARK_ROUTE_20", + "LANDMARK_SEAFOAM_ISLANDS", + "LANDMARK_CINNABAR_ISLAND", + "LANDMARK_ROUTE_21", + "LANDMARK_ROUTE_22", + "LANDMARK_VICTORY_ROAD", + "LANDMARK_ROUTE_23", + "LANDMARK_INDIGO_PLATEAU", + "LANDMARK_ROUTE_26", + "LANDMARK_ROUTE_27", + "LANDMARK_TOHJO_FALLS", + "LANDMARK_ROUTE_28", + "LANDMARK_FAST_SHIP" + ], + "mapCallbackOrder": [ + "MAPCALLBACK_NONE", + "MAPCALLBACK_TILES", + "MAPCALLBACK_OBJECTS", + "MAPCALLBACK_CMDQUEUE", + "MAPCALLBACK_SPRITES", + "MAPCALLBACK_NEWMAP" + ], + "mapGroups": [ + { + "group": 1, + "height": 4, + "map": 1, + "name": "OLIVINE_POKECENTER_1F", + "width": 5 + }, + { + "group": 1, + "height": 8, + "map": 2, + "name": "OLIVINE_GYM", + "width": 5 + }, + { + "group": 1, + "height": 4, + "map": 3, + "name": "OLIVINE_TIMS_HOUSE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 4, + "name": "OLIVINE_HOUSE_BETA", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 5, + "name": "OLIVINE_PUNISHMENT_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 6, + "name": "OLIVINE_GOOD_ROD_HOUSE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 7, + "name": "OLIVINE_CAFE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 8, + "name": "OLIVINE_MART", + "width": 6 + }, + { + "group": 1, + "height": 4, + "map": 9, + "name": "ROUTE_38_ECRUTEAK_GATE", + "width": 5 + }, + { + "group": 1, + "height": 4, + "map": 10, + "name": "ROUTE_39_BARN", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 11, + "name": "ROUTE_39_FARMHOUSE", + "width": 4 + }, + { + "group": 1, + "height": 9, + "map": 12, + "name": "ROUTE_38", + "width": 20 + }, + { + "group": 1, + "height": 18, + "map": 13, + "name": "ROUTE_39", + "width": 10 + }, + { + "group": 1, + "height": 18, + "map": 14, + "name": "OLIVINE_CITY", + "width": 20 + }, + { + "group": 2, + "height": 4, + "map": 1, + "name": "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 2, + "height": 9, + "map": 2, + "name": "MAHOGANY_GYM", + "width": 5 + }, + { + "group": 2, + "height": 4, + "map": 3, + "name": "MAHOGANY_POKECENTER_1F", + "width": 5 + }, + { + "group": 2, + "height": 4, + "map": 4, + "name": "ROUTE_42_ECRUTEAK_GATE", + "width": 5 + }, + { + "group": 2, + "height": 9, + "map": 5, + "name": "ROUTE_42", + "width": 30 + }, + { + "group": 2, + "height": 9, + "map": 6, + "name": "ROUTE_44", + "width": 30 + }, + { + "group": 2, + "height": 9, + "map": 7, + "name": "MAHOGANY_TOWN", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 1, + "name": "SPROUT_TOWER_1F", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 2, + "name": "SPROUT_TOWER_2F", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 3, + "name": "SPROUT_TOWER_3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 4, + "name": "TIN_TOWER_1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 5, + "name": "TIN_TOWER_2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 6, + "name": "TIN_TOWER_3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 7, + "name": "TIN_TOWER_4F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 8, + "name": "TIN_TOWER_5F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 9, + "name": "TIN_TOWER_6F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 10, + "name": "TIN_TOWER_7F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 11, + "name": "TIN_TOWER_8F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 12, + "name": "TIN_TOWER_9F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 13, + "name": "BURNED_TOWER_1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 14, + "name": "BURNED_TOWER_B1F", + "width": 10 + }, + { + "group": 3, + "height": 27, + "map": 15, + "name": "NATIONAL_PARK", + "width": 20 + }, + { + "group": 3, + "height": 27, + "map": 16, + "name": "NATIONAL_PARK_BUG_CONTEST", + "width": 20 + }, + { + "group": 3, + "height": 4, + "map": 17, + "name": "RADIO_TOWER_1F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 18, + "name": "RADIO_TOWER_2F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 19, + "name": "RADIO_TOWER_3F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 20, + "name": "RADIO_TOWER_4F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 21, + "name": "RADIO_TOWER_5F", + "width": 9 + }, + { + "group": 3, + "height": 18, + "map": 22, + "name": "RUINS_OF_ALPH_OUTSIDE", + "width": 10 + }, + { + "group": 3, + "height": 5, + "map": 23, + "name": "RUINS_OF_ALPH_HO_OH_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 24, + "name": "RUINS_OF_ALPH_KABUTO_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 25, + "name": "RUINS_OF_ALPH_OMANYTE_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 26, + "name": "RUINS_OF_ALPH_AERODACTYL_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 14, + "map": 27, + "name": "RUINS_OF_ALPH_INNER_CHAMBER", + "width": 10 + }, + { + "group": 3, + "height": 4, + "map": 28, + "name": "RUINS_OF_ALPH_RESEARCH_CENTER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 29, + "name": "RUINS_OF_ALPH_HO_OH_ITEM_ROOM", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 30, + "name": "RUINS_OF_ALPH_KABUTO_ITEM_ROOM", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 31, + "name": "RUINS_OF_ALPH_OMANYTE_ITEM_ROOM", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 32, + "name": "RUINS_OF_ALPH_AERODACTYL_ITEM_ROOM", + "width": 4 + }, + { + "group": 3, + "height": 12, + "map": 33, + "name": "RUINS_OF_ALPH_HO_OH_WORD_ROOM", + "width": 10 + }, + { + "group": 3, + "height": 7, + "map": 34, + "name": "RUINS_OF_ALPH_KABUTO_WORD_ROOM", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 35, + "name": "RUINS_OF_ALPH_OMANYTE_WORD_ROOM", + "width": 10 + }, + { + "group": 3, + "height": 7, + "map": 36, + "name": "RUINS_OF_ALPH_AERODACTYL_WORD_ROOM", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 37, + "name": "UNION_CAVE_1F", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 38, + "name": "UNION_CAVE_B1F", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 39, + "name": "UNION_CAVE_B2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 40, + "name": "SLOWPOKE_WELL_B1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 41, + "name": "SLOWPOKE_WELL_B2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 42, + "name": "OLIVINE_LIGHTHOUSE_1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 43, + "name": "OLIVINE_LIGHTHOUSE_2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 44, + "name": "OLIVINE_LIGHTHOUSE_3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 45, + "name": "OLIVINE_LIGHTHOUSE_4F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 46, + "name": "OLIVINE_LIGHTHOUSE_5F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 47, + "name": "OLIVINE_LIGHTHOUSE_6F", + "width": 10 + }, + { + "group": 3, + "height": 4, + "map": 48, + "name": "MAHOGANY_MART_1F", + "width": 4 + }, + { + "group": 3, + "height": 9, + "map": 49, + "name": "TEAM_ROCKET_BASE_B1F", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 50, + "name": "TEAM_ROCKET_BASE_B2F", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 51, + "name": "TEAM_ROCKET_BASE_B3F", + "width": 15 + }, + { + "group": 3, + "height": 27, + "map": 52, + "name": "ILEX_FOREST", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 53, + "name": "GOLDENROD_UNDERGROUND", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 54, + "name": "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 55, + "name": "GOLDENROD_DEPT_STORE_B1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 56, + "name": "GOLDENROD_UNDERGROUND_WAREHOUSE", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 57, + "name": "MOUNT_MORTAR_1F_OUTSIDE", + "width": 20 + }, + { + "group": 3, + "height": 27, + "map": 58, + "name": "MOUNT_MORTAR_1F_INSIDE", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 59, + "name": "MOUNT_MORTAR_2F_INSIDE", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 60, + "name": "MOUNT_MORTAR_B1F", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 61, + "name": "ICE_PATH_1F", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 62, + "name": "ICE_PATH_B1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 63, + "name": "ICE_PATH_B2F_MAHOGANY_SIDE", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 64, + "name": "ICE_PATH_B2F_BLACKTHORN_SIDE", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 65, + "name": "ICE_PATH_B3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 66, + "name": "WHIRL_ISLAND_NW", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 67, + "name": "WHIRL_ISLAND_NE", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 68, + "name": "WHIRL_ISLAND_SW", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 69, + "name": "WHIRL_ISLAND_CAVE", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 70, + "name": "WHIRL_ISLAND_SE", + "width": 5 + }, + { + "group": 3, + "height": 18, + "map": 71, + "name": "WHIRL_ISLAND_B1F", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 72, + "name": "WHIRL_ISLAND_B2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 73, + "name": "WHIRL_ISLAND_LUGIA_CHAMBER", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 74, + "name": "SILVER_CAVE_ROOM_1", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 75, + "name": "SILVER_CAVE_ROOM_2", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 76, + "name": "SILVER_CAVE_ROOM_3", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 77, + "name": "SILVER_CAVE_ITEM_ROOMS", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 78, + "name": "DARK_CAVE_VIOLET_ENTRANCE", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 79, + "name": "DARK_CAVE_BLACKTHORN_ENTRANCE", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 80, + "name": "DRAGONS_DEN_1F", + "width": 5 + }, + { + "group": 3, + "height": 18, + "map": 81, + "name": "DRAGONS_DEN_B1F", + "width": 20 + }, + { + "group": 3, + "height": 5, + "map": 82, + "name": "DRAGON_SHRINE", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 83, + "name": "TOHJO_FALLS", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 84, + "name": "DIGLETTS_CAVE", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 85, + "name": "MOUNT_MOON", + "width": 15 + }, + { + "group": 3, + "height": 14, + "map": 86, + "name": "UNDERGROUND_PATH", + "width": 3 + }, + { + "group": 3, + "height": 18, + "map": 87, + "name": "ROCK_TUNNEL_1F", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 88, + "name": "ROCK_TUNNEL_B1F", + "width": 15 + }, + { + "group": 3, + "height": 4, + "map": 89, + "name": "SAFARI_ZONE_FUCHSIA_GATE_BETA", + "width": 5 + }, + { + "group": 3, + "height": 18, + "map": 90, + "name": "SAFARI_ZONE_BETA", + "width": 10 + }, + { + "group": 3, + "height": 36, + "map": 91, + "name": "VICTORY_ROAD", + "width": 10 + }, + { + "group": 4, + "height": 9, + "map": 1, + "name": "ECRUTEAK_TIN_TOWER_ENTRANCE", + "width": 10 + }, + { + "group": 4, + "height": 4, + "map": 2, + "name": "WISE_TRIOS_ROOM", + "width": 4 + }, + { + "group": 4, + "height": 4, + "map": 3, + "name": "ECRUTEAK_POKECENTER_1F", + "width": 5 + }, + { + "group": 4, + "height": 4, + "map": 4, + "name": "ECRUTEAK_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 4, + "height": 7, + "map": 5, + "name": "DANCE_THEATER", + "width": 6 + }, + { + "group": 4, + "height": 4, + "map": 6, + "name": "ECRUTEAK_MART", + "width": 6 + }, + { + "group": 4, + "height": 9, + "map": 7, + "name": "ECRUTEAK_GYM", + "width": 5 + }, + { + "group": 4, + "height": 4, + "map": 8, + "name": "ECRUTEAK_ITEMFINDER_HOUSE", + "width": 4 + }, + { + "group": 4, + "height": 18, + "map": 9, + "name": "ECRUTEAK_CITY", + "width": 20 + }, + { + "group": 5, + "height": 9, + "map": 1, + "name": "BLACKTHORN_GYM_1F", + "width": 5 + }, + { + "group": 5, + "height": 9, + "map": 2, + "name": "BLACKTHORN_GYM_2F", + "width": 5 + }, + { + "group": 5, + "height": 4, + "map": 3, + "name": "BLACKTHORN_DRAGON_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 5, + "height": 4, + "map": 4, + "name": "BLACKTHORN_EMYS_HOUSE", + "width": 4 + }, + { + "group": 5, + "height": 4, + "map": 5, + "name": "BLACKTHORN_MART", + "width": 6 + }, + { + "group": 5, + "height": 4, + "map": 6, + "name": "BLACKTHORN_POKECENTER_1F", + "width": 5 + }, + { + "group": 5, + "height": 4, + "map": 7, + "name": "MOVE_DELETERS_HOUSE", + "width": 4 + }, + { + "group": 5, + "height": 45, + "map": 8, + "name": "ROUTE_45", + "width": 10 + }, + { + "group": 5, + "height": 18, + "map": 9, + "name": "ROUTE_46", + "width": 10 + }, + { + "group": 5, + "height": 18, + "map": 10, + "name": "BLACKTHORN_CITY", + "width": 20 + }, + { + "group": 6, + "height": 4, + "map": 1, + "name": "CINNABAR_POKECENTER_1F", + "width": 5 + }, + { + "group": 6, + "height": 4, + "map": 2, + "name": "CINNABAR_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 6, + "height": 4, + "map": 3, + "name": "ROUTE_19_FUCHSIA_GATE", + "width": 5 + }, + { + "group": 6, + "height": 4, + "map": 4, + "name": "SEAFOAM_GYM", + "width": 5 + }, + { + "group": 6, + "height": 18, + "map": 5, + "name": "ROUTE_19", + "width": 10 + }, + { + "group": 6, + "height": 9, + "map": 6, + "name": "ROUTE_20", + "width": 30 + }, + { + "group": 6, + "height": 18, + "map": 7, + "name": "ROUTE_21", + "width": 10 + }, + { + "group": 6, + "height": 9, + "map": 8, + "name": "CINNABAR_ISLAND", + "width": 10 + }, + { + "group": 7, + "height": 4, + "map": 1, + "name": "CERULEAN_GYM_BADGE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 7, + "height": 4, + "map": 2, + "name": "CERULEAN_POLICE_STATION", + "width": 4 + }, + { + "group": 7, + "height": 4, + "map": 3, + "name": "CERULEAN_TRADE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 7, + "height": 4, + "map": 4, + "name": "CERULEAN_POKECENTER_1F", + "width": 5 + }, + { + "group": 7, + "height": 4, + "map": 5, + "name": "CERULEAN_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 7, + "height": 8, + "map": 6, + "name": "CERULEAN_GYM", + "width": 5 + }, + { + "group": 7, + "height": 4, + "map": 7, + "name": "CERULEAN_MART", + "width": 6 + }, + { + "group": 7, + "height": 4, + "map": 8, + "name": "ROUTE_10_POKECENTER_1F", + "width": 5 + }, + { + "group": 7, + "height": 4, + "map": 9, + "name": "ROUTE_10_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 7, + "height": 9, + "map": 10, + "name": "POWER_PLANT", + "width": 10 + }, + { + "group": 7, + "height": 4, + "map": 11, + "name": "BILLS_HOUSE", + "width": 4 + }, + { + "group": 7, + "height": 9, + "map": 12, + "name": "ROUTE_4", + "width": 20 + }, + { + "group": 7, + "height": 9, + "map": 13, + "name": "ROUTE_9", + "width": 30 + }, + { + "group": 7, + "height": 9, + "map": 14, + "name": "ROUTE_10_NORTH", + "width": 10 + }, + { + "group": 7, + "height": 9, + "map": 15, + "name": "ROUTE_24", + "width": 10 + }, + { + "group": 7, + "height": 9, + "map": 16, + "name": "ROUTE_25", + "width": 30 + }, + { + "group": 7, + "height": 18, + "map": 17, + "name": "CERULEAN_CITY", + "width": 20 + }, + { + "group": 8, + "height": 4, + "map": 1, + "name": "AZALEA_POKECENTER_1F", + "width": 5 + }, + { + "group": 8, + "height": 4, + "map": 2, + "name": "CHARCOAL_KILN", + "width": 4 + }, + { + "group": 8, + "height": 4, + "map": 3, + "name": "AZALEA_MART", + "width": 6 + }, + { + "group": 8, + "height": 4, + "map": 4, + "name": "KURTS_HOUSE", + "width": 8 + }, + { + "group": 8, + "height": 8, + "map": 5, + "name": "AZALEA_GYM", + "width": 5 + }, + { + "group": 8, + "height": 9, + "map": 6, + "name": "ROUTE_33", + "width": 10 + }, + { + "group": 8, + "height": 9, + "map": 7, + "name": "AZALEA_TOWN", + "width": 20 + }, + { + "group": 9, + "height": 4, + "map": 1, + "name": "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE", + "width": 4 + }, + { + "group": 9, + "height": 4, + "map": 2, + "name": "LAKE_OF_RAGE_MAGIKARP_HOUSE", + "width": 4 + }, + { + "group": 9, + "height": 4, + "map": 3, + "name": "ROUTE_43_MAHOGANY_GATE", + "width": 5 + }, + { + "group": 9, + "height": 4, + "map": 4, + "name": "ROUTE_43_GATE", + "width": 5 + }, + { + "group": 9, + "height": 27, + "map": 5, + "name": "ROUTE_43", + "width": 10 + }, + { + "group": 9, + "height": 18, + "map": 6, + "name": "LAKE_OF_RAGE", + "width": 20 + }, + { + "group": 10, + "height": 45, + "map": 1, + "name": "ROUTE_32", + "width": 10 + }, + { + "group": 10, + "height": 18, + "map": 2, + "name": "ROUTE_35", + "width": 10 + }, + { + "group": 10, + "height": 9, + "map": 3, + "name": "ROUTE_36", + "width": 30 + }, + { + "group": 10, + "height": 9, + "map": 4, + "name": "ROUTE_37", + "width": 10 + }, + { + "group": 10, + "height": 18, + "map": 5, + "name": "VIOLET_CITY", + "width": 20 + }, + { + "group": 10, + "height": 4, + "map": 6, + "name": "VIOLET_MART", + "width": 6 + }, + { + "group": 10, + "height": 8, + "map": 7, + "name": "VIOLET_GYM", + "width": 5 + }, + { + "group": 10, + "height": 8, + "map": 8, + "name": "EARLS_POKEMON_ACADEMY", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 9, + "name": "VIOLET_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 10, + "name": "VIOLET_POKECENTER_1F", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 11, + "name": "VIOLET_KYLES_HOUSE", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 12, + "name": "ROUTE_32_RUINS_OF_ALPH_GATE", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 13, + "name": "ROUTE_32_POKECENTER_1F", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 14, + "name": "ROUTE_35_GOLDENROD_GATE", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 15, + "name": "ROUTE_35_NATIONAL_PARK_GATE", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 16, + "name": "ROUTE_36_RUINS_OF_ALPH_GATE", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 17, + "name": "ROUTE_36_NATIONAL_PARK_GATE", + "width": 5 + }, + { + "group": 11, + "height": 27, + "map": 1, + "name": "ROUTE_34", + "width": 10 + }, + { + "group": 11, + "height": 18, + "map": 2, + "name": "GOLDENROD_CITY", + "width": 20 + }, + { + "group": 11, + "height": 9, + "map": 3, + "name": "GOLDENROD_GYM", + "width": 10 + }, + { + "group": 11, + "height": 4, + "map": 4, + "name": "GOLDENROD_BIKE_SHOP", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 5, + "name": "GOLDENROD_HAPPINESS_RATER", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 6, + "name": "BILLS_FAMILYS_HOUSE", + "width": 4 + }, + { + "group": 11, + "height": 9, + "map": 7, + "name": "GOLDENROD_MAGNET_TRAIN_STATION", + "width": 10 + }, + { + "group": 11, + "height": 4, + "map": 8, + "name": "GOLDENROD_FLOWER_SHOP", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 9, + "name": "GOLDENROD_PP_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 10, + "name": "GOLDENROD_NAME_RATER", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 11, + "name": "GOLDENROD_DEPT_STORE_1F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 12, + "name": "GOLDENROD_DEPT_STORE_2F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 13, + "name": "GOLDENROD_DEPT_STORE_3F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 14, + "name": "GOLDENROD_DEPT_STORE_4F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 15, + "name": "GOLDENROD_DEPT_STORE_5F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 16, + "name": "GOLDENROD_DEPT_STORE_6F", + "width": 8 + }, + { + "group": 11, + "height": 2, + "map": 17, + "name": "GOLDENROD_DEPT_STORE_ELEVATOR", + "width": 2 + }, + { + "group": 11, + "height": 4, + "map": 18, + "name": "GOLDENROD_DEPT_STORE_ROOF", + "width": 8 + }, + { + "group": 11, + "height": 7, + "map": 19, + "name": "GOLDENROD_GAME_CORNER", + "width": 10 + }, + { + "group": 11, + "height": 4, + "map": 20, + "name": "GOLDENROD_POKECENTER_1F", + "width": 5 + }, + { + "group": 11, + "height": 16, + "map": 21, + "name": "POKECOM_CENTER_ADMIN_OFFICE_MOBILE", + "width": 16 + }, + { + "group": 11, + "height": 4, + "map": 22, + "name": "ILEX_FOREST_AZALEA_GATE", + "width": 5 + }, + { + "group": 11, + "height": 4, + "map": 23, + "name": "ROUTE_34_ILEX_FOREST_GATE", + "width": 5 + }, + { + "group": 11, + "height": 4, + "map": 24, + "name": "DAY_CARE", + "width": 5 + }, + { + "group": 12, + "height": 9, + "map": 1, + "name": "ROUTE_6", + "width": 10 + }, + { + "group": 12, + "height": 9, + "map": 2, + "name": "ROUTE_11", + "width": 20 + }, + { + "group": 12, + "height": 18, + "map": 3, + "name": "VERMILION_CITY", + "width": 20 + }, + { + "group": 12, + "height": 4, + "map": 4, + "name": "VERMILION_FISHING_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 12, + "height": 4, + "map": 5, + "name": "VERMILION_POKECENTER_1F", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 6, + "name": "VERMILION_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 12, + "height": 4, + "map": 7, + "name": "POKEMON_FAN_CLUB", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 8, + "name": "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 12, + "height": 4, + "map": 9, + "name": "VERMILION_MART", + "width": 6 + }, + { + "group": 12, + "height": 4, + "map": 10, + "name": "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 12, + "height": 9, + "map": 11, + "name": "VERMILION_GYM", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 12, + "name": "ROUTE_6_SAFFRON_GATE", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 13, + "name": "ROUTE_6_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + { + "group": 13, + "height": 18, + "map": 1, + "name": "ROUTE_1", + "width": 10 + }, + { + "group": 13, + "height": 9, + "map": 2, + "name": "PALLET_TOWN", + "width": 10 + }, + { + "group": 13, + "height": 4, + "map": 3, + "name": "REDS_HOUSE_1F", + "width": 4 + }, + { + "group": 13, + "height": 4, + "map": 4, + "name": "REDS_HOUSE_2F", + "width": 4 + }, + { + "group": 13, + "height": 4, + "map": 5, + "name": "BLUES_HOUSE", + "width": 4 + }, + { + "group": 13, + "height": 6, + "map": 6, + "name": "OAKS_LAB", + "width": 5 + }, + { + "group": 14, + "height": 9, + "map": 1, + "name": "ROUTE_3", + "width": 30 + }, + { + "group": 14, + "height": 18, + "map": 2, + "name": "PEWTER_CITY", + "width": 20 + }, + { + "group": 14, + "height": 4, + "map": 3, + "name": "PEWTER_NIDORAN_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 14, + "height": 7, + "map": 4, + "name": "PEWTER_GYM", + "width": 5 + }, + { + "group": 14, + "height": 4, + "map": 5, + "name": "PEWTER_MART", + "width": 6 + }, + { + "group": 14, + "height": 4, + "map": 6, + "name": "PEWTER_POKECENTER_1F", + "width": 5 + }, + { + "group": 14, + "height": 4, + "map": 7, + "name": "PEWTER_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 14, + "height": 4, + "map": 8, + "name": "PEWTER_SNOOZE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 15, + "height": 18, + "map": 1, + "name": "OLIVINE_PORT", + "width": 10 + }, + { + "group": 15, + "height": 18, + "map": 2, + "name": "VERMILION_PORT", + "width": 10 + }, + { + "group": 15, + "height": 9, + "map": 3, + "name": "FAST_SHIP_1F", + "width": 16 + }, + { + "group": 15, + "height": 16, + "map": 4, + "name": "FAST_SHIP_CABINS_NNW_NNE_NE", + "width": 4 + }, + { + "group": 15, + "height": 16, + "map": 5, + "name": "FAST_SHIP_CABINS_SW_SSW_NW", + "width": 4 + }, + { + "group": 15, + "height": 17, + "map": 6, + "name": "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN", + "width": 5 + }, + { + "group": 15, + "height": 8, + "map": 7, + "name": "FAST_SHIP_B1F", + "width": 16 + }, + { + "group": 15, + "height": 9, + "map": 8, + "name": "OLIVINE_PORT_PASSAGE", + "width": 10 + }, + { + "group": 15, + "height": 9, + "map": 9, + "name": "VERMILION_PORT_PASSAGE", + "width": 10 + }, + { + "group": 15, + "height": 9, + "map": 10, + "name": "MOUNT_MOON_SQUARE", + "width": 15 + }, + { + "group": 15, + "height": 4, + "map": 11, + "name": "MOUNT_MOON_GIFT_SHOP", + "width": 4 + }, + { + "group": 15, + "height": 9, + "map": 12, + "name": "TIN_TOWER_ROOF", + "width": 10 + }, + { + "group": 16, + "height": 9, + "map": 1, + "name": "ROUTE_23", + "width": 10 + }, + { + "group": 16, + "height": 7, + "map": 2, + "name": "INDIGO_PLATEAU_POKECENTER_1F", + "width": 9 + }, + { + "group": 16, + "height": 9, + "map": 3, + "name": "WILLS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 9, + "map": 4, + "name": "KOGAS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 9, + "map": 5, + "name": "BRUNOS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 9, + "map": 6, + "name": "KARENS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 12, + "map": 7, + "name": "LANCES_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 7, + "map": 8, + "name": "HALL_OF_FAME", + "width": 5 + }, + { + "group": 17, + "height": 9, + "map": 1, + "name": "ROUTE_13", + "width": 30 + }, + { + "group": 17, + "height": 18, + "map": 2, + "name": "ROUTE_14", + "width": 10 + }, + { + "group": 17, + "height": 9, + "map": 3, + "name": "ROUTE_15", + "width": 20 + }, + { + "group": 17, + "height": 9, + "map": 4, + "name": "ROUTE_18", + "width": 10 + }, + { + "group": 17, + "height": 18, + "map": 5, + "name": "FUCHSIA_CITY", + "width": 20 + }, + { + "group": 17, + "height": 4, + "map": 6, + "name": "FUCHSIA_MART", + "width": 6 + }, + { + "group": 17, + "height": 4, + "map": 7, + "name": "SAFARI_ZONE_MAIN_OFFICE", + "width": 4 + }, + { + "group": 17, + "height": 9, + "map": 8, + "name": "FUCHSIA_GYM", + "width": 5 + }, + { + "group": 17, + "height": 4, + "map": 9, + "name": "BILLS_OLDER_SISTERS_HOUSE", + "width": 4 + }, + { + "group": 17, + "height": 4, + "map": 10, + "name": "FUCHSIA_POKECENTER_1F", + "width": 5 + }, + { + "group": 17, + "height": 4, + "map": 11, + "name": "FUCHSIA_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 17, + "height": 4, + "map": 12, + "name": "SAFARI_ZONE_WARDENS_HOME", + "width": 5 + }, + { + "group": 17, + "height": 4, + "map": 13, + "name": "ROUTE_15_FUCHSIA_GATE", + "width": 5 + }, + { + "group": 18, + "height": 9, + "map": 1, + "name": "ROUTE_8", + "width": 20 + }, + { + "group": 18, + "height": 27, + "map": 2, + "name": "ROUTE_12", + "width": 10 + }, + { + "group": 18, + "height": 9, + "map": 3, + "name": "ROUTE_10_SOUTH", + "width": 10 + }, + { + "group": 18, + "height": 9, + "map": 4, + "name": "LAVENDER_TOWN", + "width": 10 + }, + { + "group": 18, + "height": 4, + "map": 5, + "name": "LAVENDER_POKECENTER_1F", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 6, + "name": "LAVENDER_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 18, + "height": 4, + "map": 7, + "name": "MR_FUJIS_HOUSE", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 8, + "name": "LAVENDER_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 18, + "height": 4, + "map": 9, + "name": "LAVENDER_NAME_RATER", + "width": 4 + }, + { + "group": 18, + "height": 4, + "map": 10, + "name": "LAVENDER_MART", + "width": 6 + }, + { + "group": 18, + "height": 4, + "map": 11, + "name": "SOUL_HOUSE", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 12, + "name": "LAV_RADIO_TOWER_1F", + "width": 10 + }, + { + "group": 18, + "height": 4, + "map": 13, + "name": "ROUTE_8_SAFFRON_GATE", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 14, + "name": "ROUTE_12_SUPER_ROD_HOUSE", + "width": 4 + }, + { + "group": 19, + "height": 9, + "map": 1, + "name": "ROUTE_28", + "width": 20 + }, + { + "group": 19, + "height": 18, + "map": 2, + "name": "SILVER_CAVE_OUTSIDE", + "width": 20 + }, + { + "group": 19, + "height": 4, + "map": 3, + "name": "SILVER_CAVE_POKECENTER_1F", + "width": 5 + }, + { + "group": 19, + "height": 4, + "map": 4, + "name": "ROUTE_28_STEEL_WING_HOUSE", + "width": 4 + }, + { + "group": 20, + "height": 4, + "map": 1, + "name": "POKECENTER_2F", + "width": 8 + }, + { + "group": 20, + "height": 4, + "map": 2, + "name": "TRADE_CENTER", + "width": 5 + }, + { + "group": 20, + "height": 4, + "map": 3, + "name": "COLOSSEUM", + "width": 5 + }, + { + "group": 20, + "height": 4, + "map": 4, + "name": "TIME_CAPSULE", + "width": 5 + }, + { + "group": 20, + "height": 4, + "map": 5, + "name": "MOBILE_TRADE_ROOM", + "width": 5 + }, + { + "group": 20, + "height": 4, + "map": 6, + "name": "MOBILE_BATTLE_ROOM", + "width": 5 + }, + { + "group": 21, + "height": 9, + "map": 1, + "name": "ROUTE_7", + "width": 10 + }, + { + "group": 21, + "height": 9, + "map": 2, + "name": "ROUTE_16", + "width": 10 + }, + { + "group": 21, + "height": 45, + "map": 3, + "name": "ROUTE_17", + "width": 10 + }, + { + "group": 21, + "height": 18, + "map": 4, + "name": "CELADON_CITY", + "width": 20 + }, + { + "group": 21, + "height": 4, + "map": 5, + "name": "CELADON_DEPT_STORE_1F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 6, + "name": "CELADON_DEPT_STORE_2F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 7, + "name": "CELADON_DEPT_STORE_3F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 8, + "name": "CELADON_DEPT_STORE_4F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 9, + "name": "CELADON_DEPT_STORE_5F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 10, + "name": "CELADON_DEPT_STORE_6F", + "width": 8 + }, + { + "group": 21, + "height": 2, + "map": 11, + "name": "CELADON_DEPT_STORE_ELEVATOR", + "width": 2 + }, + { + "group": 21, + "height": 5, + "map": 12, + "name": "CELADON_MANSION_1F", + "width": 4 + }, + { + "group": 21, + "height": 5, + "map": 13, + "name": "CELADON_MANSION_2F", + "width": 4 + }, + { + "group": 21, + "height": 5, + "map": 14, + "name": "CELADON_MANSION_3F", + "width": 4 + }, + { + "group": 21, + "height": 5, + "map": 15, + "name": "CELADON_MANSION_ROOF", + "width": 4 + }, + { + "group": 21, + "height": 4, + "map": 16, + "name": "CELADON_MANSION_ROOF_HOUSE", + "width": 4 + }, + { + "group": 21, + "height": 4, + "map": 17, + "name": "CELADON_POKECENTER_1F", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 18, + "name": "CELADON_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 21, + "height": 7, + "map": 19, + "name": "CELADON_GAME_CORNER", + "width": 10 + }, + { + "group": 21, + "height": 3, + "map": 20, + "name": "CELADON_GAME_CORNER_PRIZE_ROOM", + "width": 3 + }, + { + "group": 21, + "height": 9, + "map": 21, + "name": "CELADON_GYM", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 22, + "name": "CELADON_CAFE", + "width": 6 + }, + { + "group": 21, + "height": 4, + "map": 23, + "name": "ROUTE_16_FUCHSIA_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 21, + "height": 4, + "map": 24, + "name": "ROUTE_16_GATE", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 25, + "name": "ROUTE_7_SAFFRON_GATE", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 26, + "name": "ROUTE_17_ROUTE_18_GATE", + "width": 5 + }, + { + "group": 22, + "height": 18, + "map": 1, + "name": "ROUTE_40", + "width": 10 + }, + { + "group": 22, + "height": 27, + "map": 2, + "name": "ROUTE_41", + "width": 25 + }, + { + "group": 22, + "height": 27, + "map": 3, + "name": "CIANWOOD_CITY", + "width": 15 + }, + { + "group": 22, + "height": 4, + "map": 4, + "name": "MANIAS_HOUSE", + "width": 4 + }, + { + "group": 22, + "height": 9, + "map": 5, + "name": "CIANWOOD_GYM", + "width": 5 + }, + { + "group": 22, + "height": 4, + "map": 6, + "name": "CIANWOOD_POKECENTER_1F", + "width": 5 + }, + { + "group": 22, + "height": 4, + "map": 7, + "name": "CIANWOOD_PHARMACY", + "width": 4 + }, + { + "group": 22, + "height": 4, + "map": 8, + "name": "CIANWOOD_PHOTO_STUDIO", + "width": 4 + }, + { + "group": 22, + "height": 4, + "map": 9, + "name": "CIANWOOD_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 22, + "height": 4, + "map": 10, + "name": "POKE_SEERS_HOUSE", + "width": 4 + }, + { + "group": 22, + "height": 5, + "map": 11, + "name": "BATTLE_TOWER_1F", + "width": 8 + }, + { + "group": 22, + "height": 4, + "map": 12, + "name": "BATTLE_TOWER_BATTLE_ROOM", + "width": 4 + }, + { + "group": 22, + "height": 2, + "map": 13, + "name": "BATTLE_TOWER_ELEVATOR", + "width": 2 + }, + { + "group": 22, + "height": 2, + "map": 14, + "name": "BATTLE_TOWER_HALLWAY", + "width": 11 + }, + { + "group": 22, + "height": 4, + "map": 15, + "name": "ROUTE_40_BATTLE_TOWER_GATE", + "width": 5 + }, + { + "group": 22, + "height": 14, + "map": 16, + "name": "BATTLE_TOWER_OUTSIDE", + "width": 10 + }, + { + "group": 23, + "height": 27, + "map": 1, + "name": "ROUTE_2", + "width": 10 + }, + { + "group": 23, + "height": 9, + "map": 2, + "name": "ROUTE_22", + "width": 20 + }, + { + "group": 23, + "height": 18, + "map": 3, + "name": "VIRIDIAN_CITY", + "width": 20 + }, + { + "group": 23, + "height": 9, + "map": 4, + "name": "VIRIDIAN_GYM", + "width": 5 + }, + { + "group": 23, + "height": 4, + "map": 5, + "name": "VIRIDIAN_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 23, + "height": 7, + "map": 6, + "name": "TRAINER_HOUSE_1F", + "width": 5 + }, + { + "group": 23, + "height": 8, + "map": 7, + "name": "TRAINER_HOUSE_B1F", + "width": 5 + }, + { + "group": 23, + "height": 4, + "map": 8, + "name": "VIRIDIAN_MART", + "width": 6 + }, + { + "group": 23, + "height": 4, + "map": 9, + "name": "VIRIDIAN_POKECENTER_1F", + "width": 5 + }, + { + "group": 23, + "height": 4, + "map": 10, + "name": "VIRIDIAN_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 23, + "height": 4, + "map": 11, + "name": "ROUTE_2_NUGGET_HOUSE", + "width": 4 + }, + { + "group": 23, + "height": 4, + "map": 12, + "name": "ROUTE_2_GATE", + "width": 5 + }, + { + "group": 23, + "height": 9, + "map": 13, + "name": "VICTORY_ROAD_GATE", + "width": 10 + }, + { + "group": 24, + "height": 54, + "map": 1, + "name": "ROUTE_26", + "width": 10 + }, + { + "group": 24, + "height": 9, + "map": 2, + "name": "ROUTE_27", + "width": 40 + }, + { + "group": 24, + "height": 9, + "map": 3, + "name": "ROUTE_29", + "width": 30 + }, + { + "group": 24, + "height": 9, + "map": 4, + "name": "NEW_BARK_TOWN", + "width": 10 + }, + { + "group": 24, + "height": 6, + "map": 5, + "name": "ELMS_LAB", + "width": 5 + }, + { + "group": 24, + "height": 4, + "map": 6, + "name": "PLAYERS_HOUSE_1F", + "width": 5 + }, + { + "group": 24, + "height": 3, + "map": 7, + "name": "PLAYERS_HOUSE_2F", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 8, + "name": "PLAYERS_NEIGHBORS_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 9, + "name": "ELMS_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 10, + "name": "ROUTE_26_HEAL_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 11, + "name": "DAY_OF_WEEK_SIBLINGS_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 12, + "name": "ROUTE_27_SANDSTORM_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 13, + "name": "ROUTE_29_ROUTE_46_GATE", + "width": 5 + }, + { + "group": 25, + "height": 9, + "map": 1, + "name": "ROUTE_5", + "width": 10 + }, + { + "group": 25, + "height": 18, + "map": 2, + "name": "SAFFRON_CITY", + "width": 20 + }, + { + "group": 25, + "height": 6, + "map": 3, + "name": "FIGHTING_DOJO", + "width": 5 + }, + { + "group": 25, + "height": 9, + "map": 4, + "name": "SAFFRON_GYM", + "width": 10 + }, + { + "group": 25, + "height": 4, + "map": 5, + "name": "SAFFRON_MART", + "width": 6 + }, + { + "group": 25, + "height": 4, + "map": 6, + "name": "SAFFRON_POKECENTER_1F", + "width": 5 + }, + { + "group": 25, + "height": 4, + "map": 7, + "name": "SAFFRON_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 25, + "height": 4, + "map": 8, + "name": "MR_PSYCHICS_HOUSE", + "width": 4 + }, + { + "group": 25, + "height": 9, + "map": 9, + "name": "SAFFRON_MAGNET_TRAIN_STATION", + "width": 10 + }, + { + "group": 25, + "height": 4, + "map": 10, + "name": "SILPH_CO_1F", + "width": 8 + }, + { + "group": 25, + "height": 4, + "map": 11, + "name": "COPYCATS_HOUSE_1F", + "width": 4 + }, + { + "group": 25, + "height": 3, + "map": 12, + "name": "COPYCATS_HOUSE_2F", + "width": 5 + }, + { + "group": 25, + "height": 4, + "map": 13, + "name": "ROUTE_5_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + { + "group": 25, + "height": 4, + "map": 14, + "name": "ROUTE_5_SAFFRON_GATE", + "width": 5 + }, + { + "group": 25, + "height": 4, + "map": 15, + "name": "ROUTE_5_CLEANSE_TAG_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 27, + "map": 1, + "name": "ROUTE_30", + "width": 10 + }, + { + "group": 26, + "height": 9, + "map": 2, + "name": "ROUTE_31", + "width": 20 + }, + { + "group": 26, + "height": 9, + "map": 3, + "name": "CHERRYGROVE_CITY", + "width": 20 + }, + { + "group": 26, + "height": 4, + "map": 4, + "name": "CHERRYGROVE_MART", + "width": 6 + }, + { + "group": 26, + "height": 4, + "map": 5, + "name": "CHERRYGROVE_POKECENTER_1F", + "width": 5 + }, + { + "group": 26, + "height": 4, + "map": 6, + "name": "CHERRYGROVE_GYM_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 7, + "name": "GUIDE_GENTS_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 8, + "name": "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 9, + "name": "ROUTE_30_BERRY_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 10, + "name": "MR_POKEMONS_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 11, + "name": "ROUTE_31_VIOLET_GATE", + "width": 5 + } + ], + "mapOrder": [ + "OLIVINE_POKECENTER_1F", + "OLIVINE_GYM", + "OLIVINE_TIMS_HOUSE", + "OLIVINE_HOUSE_BETA", + "OLIVINE_PUNISHMENT_SPEECH_HOUSE", + "OLIVINE_GOOD_ROD_HOUSE", + "OLIVINE_CAFE", + "OLIVINE_MART", + "ROUTE_38_ECRUTEAK_GATE", + "ROUTE_39_BARN", + "ROUTE_39_FARMHOUSE", + "ROUTE_38", + "ROUTE_39", + "OLIVINE_CITY", + "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE", + "MAHOGANY_GYM", + "MAHOGANY_POKECENTER_1F", + "ROUTE_42_ECRUTEAK_GATE", + "ROUTE_42", + "ROUTE_44", + "MAHOGANY_TOWN", + "SPROUT_TOWER_1F", + "SPROUT_TOWER_2F", + "SPROUT_TOWER_3F", + "TIN_TOWER_1F", + "TIN_TOWER_2F", + "TIN_TOWER_3F", + "TIN_TOWER_4F", + "TIN_TOWER_5F", + "TIN_TOWER_6F", + "TIN_TOWER_7F", + "TIN_TOWER_8F", + "TIN_TOWER_9F", + "BURNED_TOWER_1F", + "BURNED_TOWER_B1F", + "NATIONAL_PARK", + "NATIONAL_PARK_BUG_CONTEST", + "RADIO_TOWER_1F", + "RADIO_TOWER_2F", + "RADIO_TOWER_3F", + "RADIO_TOWER_4F", + "RADIO_TOWER_5F", + "RUINS_OF_ALPH_OUTSIDE", + "RUINS_OF_ALPH_HO_OH_CHAMBER", + "RUINS_OF_ALPH_KABUTO_CHAMBER", + "RUINS_OF_ALPH_OMANYTE_CHAMBER", + "RUINS_OF_ALPH_AERODACTYL_CHAMBER", + "RUINS_OF_ALPH_INNER_CHAMBER", + "RUINS_OF_ALPH_RESEARCH_CENTER", + "RUINS_OF_ALPH_HO_OH_ITEM_ROOM", + "RUINS_OF_ALPH_KABUTO_ITEM_ROOM", + "RUINS_OF_ALPH_OMANYTE_ITEM_ROOM", + "RUINS_OF_ALPH_AERODACTYL_ITEM_ROOM", + "RUINS_OF_ALPH_HO_OH_WORD_ROOM", + "RUINS_OF_ALPH_KABUTO_WORD_ROOM", + "RUINS_OF_ALPH_OMANYTE_WORD_ROOM", + "RUINS_OF_ALPH_AERODACTYL_WORD_ROOM", + "UNION_CAVE_1F", + "UNION_CAVE_B1F", + "UNION_CAVE_B2F", + "SLOWPOKE_WELL_B1F", + "SLOWPOKE_WELL_B2F", + "OLIVINE_LIGHTHOUSE_1F", + "OLIVINE_LIGHTHOUSE_2F", + "OLIVINE_LIGHTHOUSE_3F", + "OLIVINE_LIGHTHOUSE_4F", + "OLIVINE_LIGHTHOUSE_5F", + "OLIVINE_LIGHTHOUSE_6F", + "MAHOGANY_MART_1F", + "TEAM_ROCKET_BASE_B1F", + "TEAM_ROCKET_BASE_B2F", + "TEAM_ROCKET_BASE_B3F", + "ILEX_FOREST", + "GOLDENROD_UNDERGROUND", + "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES", + "GOLDENROD_DEPT_STORE_B1F", + "GOLDENROD_UNDERGROUND_WAREHOUSE", + "MOUNT_MORTAR_1F_OUTSIDE", + "MOUNT_MORTAR_1F_INSIDE", + "MOUNT_MORTAR_2F_INSIDE", + "MOUNT_MORTAR_B1F", + "ICE_PATH_1F", + "ICE_PATH_B1F", + "ICE_PATH_B2F_MAHOGANY_SIDE", + "ICE_PATH_B2F_BLACKTHORN_SIDE", + "ICE_PATH_B3F", + "WHIRL_ISLAND_NW", + "WHIRL_ISLAND_NE", + "WHIRL_ISLAND_SW", + "WHIRL_ISLAND_CAVE", + "WHIRL_ISLAND_SE", + "WHIRL_ISLAND_B1F", + "WHIRL_ISLAND_B2F", + "WHIRL_ISLAND_LUGIA_CHAMBER", + "SILVER_CAVE_ROOM_1", + "SILVER_CAVE_ROOM_2", + "SILVER_CAVE_ROOM_3", + "SILVER_CAVE_ITEM_ROOMS", + "DARK_CAVE_VIOLET_ENTRANCE", + "DARK_CAVE_BLACKTHORN_ENTRANCE", + "DRAGONS_DEN_1F", + "DRAGONS_DEN_B1F", + "DRAGON_SHRINE", + "TOHJO_FALLS", + "DIGLETTS_CAVE", + "MOUNT_MOON", + "UNDERGROUND_PATH", + "ROCK_TUNNEL_1F", + "ROCK_TUNNEL_B1F", + "SAFARI_ZONE_FUCHSIA_GATE_BETA", + "SAFARI_ZONE_BETA", + "VICTORY_ROAD", + "ECRUTEAK_TIN_TOWER_ENTRANCE", + "WISE_TRIOS_ROOM", + "ECRUTEAK_POKECENTER_1F", + "ECRUTEAK_LUGIA_SPEECH_HOUSE", + "DANCE_THEATER", + "ECRUTEAK_MART", + "ECRUTEAK_GYM", + "ECRUTEAK_ITEMFINDER_HOUSE", + "ECRUTEAK_CITY", + "BLACKTHORN_GYM_1F", + "BLACKTHORN_GYM_2F", + "BLACKTHORN_DRAGON_SPEECH_HOUSE", + "BLACKTHORN_EMYS_HOUSE", + "BLACKTHORN_MART", + "BLACKTHORN_POKECENTER_1F", + "MOVE_DELETERS_HOUSE", + "ROUTE_45", + "ROUTE_46", + "BLACKTHORN_CITY", + "CINNABAR_POKECENTER_1F", + "CINNABAR_POKECENTER_2F_BETA", + "ROUTE_19_FUCHSIA_GATE", + "SEAFOAM_GYM", + "ROUTE_19", + "ROUTE_20", + "ROUTE_21", + "CINNABAR_ISLAND", + "CERULEAN_GYM_BADGE_SPEECH_HOUSE", + "CERULEAN_POLICE_STATION", + "CERULEAN_TRADE_SPEECH_HOUSE", + "CERULEAN_POKECENTER_1F", + "CERULEAN_POKECENTER_2F_BETA", + "CERULEAN_GYM", + "CERULEAN_MART", + "ROUTE_10_POKECENTER_1F", + "ROUTE_10_POKECENTER_2F_BETA", + "POWER_PLANT", + "BILLS_HOUSE", + "ROUTE_4", + "ROUTE_9", + "ROUTE_10_NORTH", + "ROUTE_24", + "ROUTE_25", + "CERULEAN_CITY", + "AZALEA_POKECENTER_1F", + "CHARCOAL_KILN", + "AZALEA_MART", + "KURTS_HOUSE", + "AZALEA_GYM", + "ROUTE_33", + "AZALEA_TOWN", + "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE", + "LAKE_OF_RAGE_MAGIKARP_HOUSE", + "ROUTE_43_MAHOGANY_GATE", + "ROUTE_43_GATE", + "ROUTE_43", + "LAKE_OF_RAGE", + "ROUTE_32", + "ROUTE_35", + "ROUTE_36", + "ROUTE_37", + "VIOLET_CITY", + "VIOLET_MART", + "VIOLET_GYM", + "EARLS_POKEMON_ACADEMY", + "VIOLET_NICKNAME_SPEECH_HOUSE", + "VIOLET_POKECENTER_1F", + "VIOLET_KYLES_HOUSE", + "ROUTE_32_RUINS_OF_ALPH_GATE", + "ROUTE_32_POKECENTER_1F", + "ROUTE_35_GOLDENROD_GATE", + "ROUTE_35_NATIONAL_PARK_GATE", + "ROUTE_36_RUINS_OF_ALPH_GATE", + "ROUTE_36_NATIONAL_PARK_GATE", + "ROUTE_34", + "GOLDENROD_CITY", + "GOLDENROD_GYM", + "GOLDENROD_BIKE_SHOP", + "GOLDENROD_HAPPINESS_RATER", + "BILLS_FAMILYS_HOUSE", + "GOLDENROD_MAGNET_TRAIN_STATION", + "GOLDENROD_FLOWER_SHOP", + "GOLDENROD_PP_SPEECH_HOUSE", + "GOLDENROD_NAME_RATER", + "GOLDENROD_DEPT_STORE_1F", + "GOLDENROD_DEPT_STORE_2F", + "GOLDENROD_DEPT_STORE_3F", + "GOLDENROD_DEPT_STORE_4F", + "GOLDENROD_DEPT_STORE_5F", + "GOLDENROD_DEPT_STORE_6F", + "GOLDENROD_DEPT_STORE_ELEVATOR", + "GOLDENROD_DEPT_STORE_ROOF", + "GOLDENROD_GAME_CORNER", + "GOLDENROD_POKECENTER_1F", + "POKECOM_CENTER_ADMIN_OFFICE_MOBILE", + "ILEX_FOREST_AZALEA_GATE", + "ROUTE_34_ILEX_FOREST_GATE", + "DAY_CARE", + "ROUTE_6", + "ROUTE_11", + "VERMILION_CITY", + "VERMILION_FISHING_SPEECH_HOUSE", + "VERMILION_POKECENTER_1F", + "VERMILION_POKECENTER_2F_BETA", + "POKEMON_FAN_CLUB", + "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE", + "VERMILION_MART", + "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE", + "VERMILION_GYM", + "ROUTE_6_SAFFRON_GATE", + "ROUTE_6_UNDERGROUND_PATH_ENTRANCE", + "ROUTE_1", + "PALLET_TOWN", + "REDS_HOUSE_1F", + "REDS_HOUSE_2F", + "BLUES_HOUSE", + "OAKS_LAB", + "ROUTE_3", + "PEWTER_CITY", + "PEWTER_NIDORAN_SPEECH_HOUSE", + "PEWTER_GYM", + "PEWTER_MART", + "PEWTER_POKECENTER_1F", + "PEWTER_POKECENTER_2F_BETA", + "PEWTER_SNOOZE_SPEECH_HOUSE", + "OLIVINE_PORT", + "VERMILION_PORT", + "FAST_SHIP_1F", + "FAST_SHIP_CABINS_NNW_NNE_NE", + "FAST_SHIP_CABINS_SW_SSW_NW", + "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN", + "FAST_SHIP_B1F", + "OLIVINE_PORT_PASSAGE", + "VERMILION_PORT_PASSAGE", + "MOUNT_MOON_SQUARE", + "MOUNT_MOON_GIFT_SHOP", + "TIN_TOWER_ROOF", + "ROUTE_23", + "INDIGO_PLATEAU_POKECENTER_1F", + "WILLS_ROOM", + "KOGAS_ROOM", + "BRUNOS_ROOM", + "KARENS_ROOM", + "LANCES_ROOM", + "HALL_OF_FAME", + "ROUTE_13", + "ROUTE_14", + "ROUTE_15", + "ROUTE_18", + "FUCHSIA_CITY", + "FUCHSIA_MART", + "SAFARI_ZONE_MAIN_OFFICE", + "FUCHSIA_GYM", + "BILLS_OLDER_SISTERS_HOUSE", + "FUCHSIA_POKECENTER_1F", + "FUCHSIA_POKECENTER_2F_BETA", + "SAFARI_ZONE_WARDENS_HOME", + "ROUTE_15_FUCHSIA_GATE", + "ROUTE_8", + "ROUTE_12", + "ROUTE_10_SOUTH", + "LAVENDER_TOWN", + "LAVENDER_POKECENTER_1F", + "LAVENDER_POKECENTER_2F_BETA", + "MR_FUJIS_HOUSE", + "LAVENDER_SPEECH_HOUSE", + "LAVENDER_NAME_RATER", + "LAVENDER_MART", + "SOUL_HOUSE", + "LAV_RADIO_TOWER_1F", + "ROUTE_8_SAFFRON_GATE", + "ROUTE_12_SUPER_ROD_HOUSE", + "ROUTE_28", + "SILVER_CAVE_OUTSIDE", + "SILVER_CAVE_POKECENTER_1F", + "ROUTE_28_STEEL_WING_HOUSE", + "POKECENTER_2F", + "TRADE_CENTER", + "COLOSSEUM", + "TIME_CAPSULE", + "MOBILE_TRADE_ROOM", + "MOBILE_BATTLE_ROOM", + "ROUTE_7", + "ROUTE_16", + "ROUTE_17", + "CELADON_CITY", + "CELADON_DEPT_STORE_1F", + "CELADON_DEPT_STORE_2F", + "CELADON_DEPT_STORE_3F", + "CELADON_DEPT_STORE_4F", + "CELADON_DEPT_STORE_5F", + "CELADON_DEPT_STORE_6F", + "CELADON_DEPT_STORE_ELEVATOR", + "CELADON_MANSION_1F", + "CELADON_MANSION_2F", + "CELADON_MANSION_3F", + "CELADON_MANSION_ROOF", + "CELADON_MANSION_ROOF_HOUSE", + "CELADON_POKECENTER_1F", + "CELADON_POKECENTER_2F_BETA", + "CELADON_GAME_CORNER", + "CELADON_GAME_CORNER_PRIZE_ROOM", + "CELADON_GYM", + "CELADON_CAFE", + "ROUTE_16_FUCHSIA_SPEECH_HOUSE", + "ROUTE_16_GATE", + "ROUTE_7_SAFFRON_GATE", + "ROUTE_17_ROUTE_18_GATE", + "ROUTE_40", + "ROUTE_41", + "CIANWOOD_CITY", + "MANIAS_HOUSE", + "CIANWOOD_GYM", + "CIANWOOD_POKECENTER_1F", + "CIANWOOD_PHARMACY", + "CIANWOOD_PHOTO_STUDIO", + "CIANWOOD_LUGIA_SPEECH_HOUSE", + "POKE_SEERS_HOUSE", + "BATTLE_TOWER_1F", + "BATTLE_TOWER_BATTLE_ROOM", + "BATTLE_TOWER_ELEVATOR", + "BATTLE_TOWER_HALLWAY", + "ROUTE_40_BATTLE_TOWER_GATE", + "BATTLE_TOWER_OUTSIDE", + "ROUTE_2", + "ROUTE_22", + "VIRIDIAN_CITY", + "VIRIDIAN_GYM", + "VIRIDIAN_NICKNAME_SPEECH_HOUSE", + "TRAINER_HOUSE_1F", + "TRAINER_HOUSE_B1F", + "VIRIDIAN_MART", + "VIRIDIAN_POKECENTER_1F", + "VIRIDIAN_POKECENTER_2F_BETA", + "ROUTE_2_NUGGET_HOUSE", + "ROUTE_2_GATE", + "VICTORY_ROAD_GATE", + "ROUTE_26", + "ROUTE_27", + "ROUTE_29", + "NEW_BARK_TOWN", + "ELMS_LAB", + "PLAYERS_HOUSE_1F", + "PLAYERS_HOUSE_2F", + "PLAYERS_NEIGHBORS_HOUSE", + "ELMS_HOUSE", + "ROUTE_26_HEAL_HOUSE", + "DAY_OF_WEEK_SIBLINGS_HOUSE", + "ROUTE_27_SANDSTORM_HOUSE", + "ROUTE_29_ROUTE_46_GATE", + "ROUTE_5", + "SAFFRON_CITY", + "FIGHTING_DOJO", + "SAFFRON_GYM", + "SAFFRON_MART", + "SAFFRON_POKECENTER_1F", + "SAFFRON_POKECENTER_2F_BETA", + "MR_PSYCHICS_HOUSE", + "SAFFRON_MAGNET_TRAIN_STATION", + "SILPH_CO_1F", + "COPYCATS_HOUSE_1F", + "COPYCATS_HOUSE_2F", + "ROUTE_5_UNDERGROUND_PATH_ENTRANCE", + "ROUTE_5_SAFFRON_GATE", + "ROUTE_5_CLEANSE_TAG_HOUSE", + "ROUTE_30", + "ROUTE_31", + "CHERRYGROVE_CITY", + "CHERRYGROVE_MART", + "CHERRYGROVE_POKECENTER_1F", + "CHERRYGROVE_GYM_SPEECH_HOUSE", + "GUIDE_GENTS_HOUSE", + "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE", + "ROUTE_30_BERRY_HOUSE", + "MR_POKEMONS_HOUSE", + "ROUTE_31_VIOLET_GATE" + ], + "moveEffectOrder": [ + "EFFECT_NORMAL_HIT", + "EFFECT_SLEEP", + "EFFECT_POISON_HIT", + "EFFECT_LEECH_HIT", + "EFFECT_BURN_HIT", + "EFFECT_FREEZE_HIT", + "EFFECT_PARALYZE_HIT", + "EFFECT_SELFDESTRUCT", + "EFFECT_DREAM_EATER", + "EFFECT_MIRROR_MOVE", + "EFFECT_ATTACK_UP", + "EFFECT_DEFENSE_UP", + "EFFECT_SPEED_UP", + "EFFECT_SP_ATK_UP", + "EFFECT_SP_DEF_UP", + "EFFECT_ACCURACY_UP", + "EFFECT_EVASION_UP", + "EFFECT_ALWAYS_HIT", + "EFFECT_ATTACK_DOWN", + "EFFECT_DEFENSE_DOWN", + "EFFECT_SPEED_DOWN", + "EFFECT_SP_ATK_DOWN", + "EFFECT_SP_DEF_DOWN", + "EFFECT_ACCURACY_DOWN", + "EFFECT_EVASION_DOWN", + "EFFECT_RESET_STATS", + "EFFECT_BIDE", + "EFFECT_RAMPAGE", + "EFFECT_FORCE_SWITCH", + "EFFECT_MULTI_HIT", + "EFFECT_CONVERSION", + "EFFECT_FLINCH_HIT", + "EFFECT_HEAL", + "EFFECT_TOXIC", + "EFFECT_PAY_DAY", + "EFFECT_LIGHT_SCREEN", + "EFFECT_TRI_ATTACK", + "EFFECT_UNUSED_25", + "EFFECT_OHKO", + "EFFECT_RAZOR_WIND", + "EFFECT_SUPER_FANG", + "EFFECT_STATIC_DAMAGE", + "EFFECT_TRAP_TARGET", + "EFFECT_UNUSED_2B", + "EFFECT_DOUBLE_HIT", + "EFFECT_JUMP_KICK", + "EFFECT_MIST", + "EFFECT_FOCUS_ENERGY", + "EFFECT_RECOIL_HIT", + "EFFECT_CONFUSE", + "EFFECT_ATTACK_UP_2", + "EFFECT_DEFENSE_UP_2", + "EFFECT_SPEED_UP_2", + "EFFECT_SP_ATK_UP_2", + "EFFECT_SP_DEF_UP_2", + "EFFECT_ACCURACY_UP_2", + "EFFECT_EVASION_UP_2", + "EFFECT_TRANSFORM", + "EFFECT_ATTACK_DOWN_2", + "EFFECT_DEFENSE_DOWN_2", + "EFFECT_SPEED_DOWN_2", + "EFFECT_SP_ATK_DOWN_2", + "EFFECT_SP_DEF_DOWN_2", + "EFFECT_ACCURACY_DOWN_2", + "EFFECT_EVASION_DOWN_2", + "EFFECT_REFLECT", + "EFFECT_POISON", + "EFFECT_PARALYZE", + "EFFECT_ATTACK_DOWN_HIT", + "EFFECT_DEFENSE_DOWN_HIT", + "EFFECT_SPEED_DOWN_HIT", + "EFFECT_SP_ATK_DOWN_HIT", + "EFFECT_SP_DEF_DOWN_HIT", + "EFFECT_ACCURACY_DOWN_HIT", + "EFFECT_EVASION_DOWN_HIT", + "EFFECT_SKY_ATTACK", + "EFFECT_CONFUSE_HIT", + "EFFECT_POISON_MULTI_HIT", + "EFFECT_UNUSED_4E", + "EFFECT_SUBSTITUTE", + "EFFECT_HYPER_BEAM", + "EFFECT_RAGE", + "EFFECT_MIMIC", + "EFFECT_METRONOME", + "EFFECT_LEECH_SEED", + "EFFECT_SPLASH", + "EFFECT_DISABLE", + "EFFECT_LEVEL_DAMAGE", + "EFFECT_PSYWAVE", + "EFFECT_COUNTER", + "EFFECT_ENCORE", + "EFFECT_PAIN_SPLIT", + "EFFECT_SNORE", + "EFFECT_CONVERSION2", + "EFFECT_LOCK_ON", + "EFFECT_SKETCH", + "EFFECT_DEFROST_OPPONENT", + "EFFECT_SLEEP_TALK", + "EFFECT_DESTINY_BOND", + "EFFECT_REVERSAL", + "EFFECT_SPITE", + "EFFECT_FALSE_SWIPE", + "EFFECT_HEAL_BELL", + "EFFECT_PRIORITY_HIT", + "EFFECT_TRIPLE_KICK", + "EFFECT_THIEF", + "EFFECT_MEAN_LOOK", + "EFFECT_NIGHTMARE", + "EFFECT_FLAME_WHEEL", + "EFFECT_CURSE", + "EFFECT_UNUSED_6E", + "EFFECT_PROTECT", + "EFFECT_SPIKES", + "EFFECT_FORESIGHT", + "EFFECT_PERISH_SONG", + "EFFECT_SANDSTORM", + "EFFECT_ENDURE", + "EFFECT_ROLLOUT", + "EFFECT_SWAGGER", + "EFFECT_FURY_CUTTER", + "EFFECT_ATTRACT", + "EFFECT_RETURN", + "EFFECT_PRESENT", + "EFFECT_FRUSTRATION", + "EFFECT_SAFEGUARD", + "EFFECT_SACRED_FIRE", + "EFFECT_MAGNITUDE", + "EFFECT_BATON_PASS", + "EFFECT_PURSUIT", + "EFFECT_RAPID_SPIN", + "EFFECT_UNUSED_82", + "EFFECT_UNUSED_83", + "EFFECT_MORNING_SUN", + "EFFECT_SYNTHESIS", + "EFFECT_MOONLIGHT", + "EFFECT_HIDDEN_POWER", + "EFFECT_RAIN_DANCE", + "EFFECT_SUNNY_DAY", + "EFFECT_DEFENSE_UP_HIT", + "EFFECT_ATTACK_UP_HIT", + "EFFECT_ALL_UP_HIT", + "EFFECT_FAKE_OUT", + "EFFECT_BELLY_DRUM", + "EFFECT_PSYCH_UP", + "EFFECT_MIRROR_COAT", + "EFFECT_SKULL_BASH", + "EFFECT_TWISTER", + "EFFECT_EARTHQUAKE", + "EFFECT_FUTURE_SIGHT", + "EFFECT_GUST", + "EFFECT_STOMP", + "EFFECT_SOLARBEAM", + "EFFECT_THUNDER", + "EFFECT_TELEPORT", + "EFFECT_BEAT_UP", + "EFFECT_FLY", + "EFFECT_DEFENSE_CURL" + ], + "moveOrder": [ + "POUND", + "KARATE_CHOP", + "DOUBLESLAP", + "COMET_PUNCH", + "MEGA_PUNCH", + "PAY_DAY", + "FIRE_PUNCH", + "ICE_PUNCH", + "THUNDERPUNCH", + "SCRATCH", + "VICEGRIP", + "GUILLOTINE", + "RAZOR_WIND", + "SWORDS_DANCE", + "CUT", + "GUST", + "WING_ATTACK", + "WHIRLWIND", + "FLY", + "BIND", + "SLAM", + "VINE_WHIP", + "STOMP", + "DOUBLE_KICK", + "MEGA_KICK", + "JUMP_KICK", + "ROLLING_KICK", + "SAND_ATTACK", + "HEADBUTT", + "HORN_ATTACK", + "FURY_ATTACK", + "HORN_DRILL", + "TACKLE", + "BODY_SLAM", + "WRAP", + "TAKE_DOWN", + "THRASH", + "DOUBLE_EDGE", + "TAIL_WHIP", + "POISON_STING", + "TWINEEDLE", + "PIN_MISSILE", + "LEER", + "BITE", + "GROWL", + "ROAR", + "SING", + "SUPERSONIC", + "SONICBOOM", + "DISABLE", + "ACID", + "EMBER", + "FLAMETHROWER", + "MIST", + "WATER_GUN", + "HYDRO_PUMP", + "SURF", + "ICE_BEAM", + "BLIZZARD", + "PSYBEAM", + "BUBBLEBEAM", + "AURORA_BEAM", + "HYPER_BEAM", + "PECK", + "DRILL_PECK", + "SUBMISSION", + "LOW_KICK", + "COUNTER", + "SEISMIC_TOSS", + "STRENGTH", + "ABSORB", + "MEGA_DRAIN", + "LEECH_SEED", + "GROWTH", + "RAZOR_LEAF", + "SOLARBEAM", + "POISONPOWDER", + "STUN_SPORE", + "SLEEP_POWDER", + "PETAL_DANCE", + "STRING_SHOT", + "DRAGON_RAGE", + "FIRE_SPIN", + "THUNDERSHOCK", + "THUNDERBOLT", + "THUNDER_WAVE", + "THUNDER", + "ROCK_THROW", + "EARTHQUAKE", + "FISSURE", + "DIG", + "TOXIC", + "CONFUSION", + "PSYCHIC_M", + "HYPNOSIS", + "MEDITATE", + "AGILITY", + "QUICK_ATTACK", + "RAGE", + "TELEPORT", + "NIGHT_SHADE", + "MIMIC", + "SCREECH", + "DOUBLE_TEAM", + "RECOVER", + "HARDEN", + "MINIMIZE", + "SMOKESCREEN", + "CONFUSE_RAY", + "WITHDRAW", + "DEFENSE_CURL", + "BARRIER", + "LIGHT_SCREEN", + "HAZE", + "REFLECT", + "FOCUS_ENERGY", + "BIDE", + "METRONOME", + "MIRROR_MOVE", + "SELFDESTRUCT", + "EGG_BOMB", + "LICK", + "SMOG", + "SLUDGE", + "BONE_CLUB", + "FIRE_BLAST", + "WATERFALL", + "CLAMP", + "SWIFT", + "SKULL_BASH", + "SPIKE_CANNON", + "CONSTRICT", + "AMNESIA", + "KINESIS", + "SOFTBOILED", + "HI_JUMP_KICK", + "GLARE", + "DREAM_EATER", + "POISON_GAS", + "BARRAGE", + "LEECH_LIFE", + "LOVELY_KISS", + "SKY_ATTACK", + "TRANSFORM", + "BUBBLE", + "DIZZY_PUNCH", + "SPORE", + "FLASH", + "PSYWAVE", + "SPLASH", + "ACID_ARMOR", + "CRABHAMMER", + "EXPLOSION", + "FURY_SWIPES", + "BONEMERANG", + "REST", + "ROCK_SLIDE", + "HYPER_FANG", + "SHARPEN", + "CONVERSION", + "TRI_ATTACK", + "SUPER_FANG", + "SLASH", + "SUBSTITUTE", + "STRUGGLE", + "SKETCH", + "TRIPLE_KICK", + "THIEF", + "SPIDER_WEB", + "MIND_READER", + "NIGHTMARE", + "FLAME_WHEEL", + "SNORE", + "CURSE", + "FLAIL", + "CONVERSION2", + "AEROBLAST", + "COTTON_SPORE", + "REVERSAL", + "SPITE", + "POWDER_SNOW", + "PROTECT", + "MACH_PUNCH", + "SCARY_FACE", + "FAINT_ATTACK", + "SWEET_KISS", + "BELLY_DRUM", + "SLUDGE_BOMB", + "MUD_SLAP", + "OCTAZOOKA", + "SPIKES", + "ZAP_CANNON", + "FORESIGHT", + "DESTINY_BOND", + "PERISH_SONG", + "ICY_WIND", + "DETECT", + "BONE_RUSH", + "LOCK_ON", + "OUTRAGE", + "SANDSTORM", + "GIGA_DRAIN", + "ENDURE", + "CHARM", + "ROLLOUT", + "FALSE_SWIPE", + "SWAGGER", + "MILK_DRINK", + "SPARK", + "FURY_CUTTER", + "STEEL_WING", + "MEAN_LOOK", + "ATTRACT", + "SLEEP_TALK", + "HEAL_BELL", + "RETURN", + "PRESENT", + "FRUSTRATION", + "SAFEGUARD", + "PAIN_SPLIT", + "SACRED_FIRE", + "MAGNITUDE", + "DYNAMICPUNCH", + "MEGAHORN", + "DRAGONBREATH", + "BATON_PASS", + "ENCORE", + "PURSUIT", + "RAPID_SPIN", + "SWEET_SCENT", + "IRON_TAIL", + "METAL_CLAW", + "VITAL_THROW", + "MORNING_SUN", + "SYNTHESIS", + "MOONLIGHT", + "HIDDEN_POWER", + "CROSS_CHOP", + "TWISTER", + "RAIN_DANCE", + "SUNNY_DAY", + "CRUNCH", + "MIRROR_COAT", + "PSYCH_UP", + "EXTREMESPEED", + "ANCIENTPOWER", + "SHADOW_BALL", + "FUTURE_SIGHT", + "ROCK_SMASH", + "WHIRLPOOL", + "BEAT_UP" + ], + "musicOrder": [ + "Music_Nothing", + "Music_TitleScreen", + "Music_Route1", + "Music_Route3", + "Music_Route12", + "Music_MagnetTrain", + "Music_KantoGymBattle", + "Music_KantoTrainerBattle", + "Music_KantoWildBattle", + "Music_PokemonCenter", + "Music_LookHiker", + "Music_LookLass", + "Music_LookOfficer", + "Music_HealPokemon", + "Music_LavenderTown", + "Music_Route2", + "Music_MtMoon", + "Music_ShowMeAround", + "Music_GameCorner", + "Music_Bicycle", + "Music_HallOfFame", + "Music_ViridianCity", + "Music_CeladonCity", + "Music_TrainerVictory", + "Music_WildPokemonVictory", + "Music_GymLeaderVictory", + "Music_MtMoonSquare", + "Music_Gym", + "Music_PalletTown", + "Music_ProfOaksPokemonTalk", + "Music_ProfOak", + "Music_LookRival", + "Music_AfterTheRivalFight", + "Music_Surf", + "Music_Evolution", + "Music_NationalPark", + "Music_Credits", + "Music_AzaleaTown", + "Music_CherrygroveCity", + "Music_LookKimonoGirl", + "Music_UnionCave", + "Music_JohtoWildBattle", + "Music_JohtoTrainerBattle", + "Music_Route30", + "Music_EcruteakCity", + "Music_VioletCity", + "Music_JohtoGymBattle", + "Music_ChampionBattle", + "Music_RivalBattle", + "Music_RocketBattle", + "Music_ElmsLab", + "Music_DarkCave", + "Music_Route29", + "Music_Route36", + "Music_SSAqua", + "Music_LookYoungster", + "Music_LookBeauty", + "Music_LookRocket", + "Music_LookPokemaniac", + "Music_LookSage", + "Music_NewBarkTown", + "Music_GoldenrodCity", + "Music_VermilionCity", + "Music_PokemonChannel", + "Music_PokeFluteChannel", + "Music_TinTower", + "Music_SproutTower", + "Music_BurnedTower", + "Music_Lighthouse", + "Music_LakeOfRage", + "Music_IndigoPlateau", + "Music_Route37", + "Music_RocketHideout", + "Music_DragonsDen", + "Music_JohtoWildBattleNight", + "Music_RuinsOfAlphRadio", + "Music_SuccessfulCapture", + "Music_Route26", + "Music_Mom", + "Music_VictoryRoad", + "Music_PokemonLullaby", + "Music_PokemonMarch", + "Music_GoldSilverOpening", + "Music_GoldSilverOpening2", + "Music_MainMenu", + "Music_RuinsOfAlphInterior", + "Music_RocketTheme", + "Music_DancingHall", + "Music_ContestResults", + "Music_BugCatchingContest", + "Music_LakeOfRageRocketRadio", + "Music_Printer", + "Music_PostCredits", + "Music_Clair", + "Music_MobileAdapterMenu", + "Music_MobileAdapter", + "Music_BuenasPassword", + "Music_LookMysticalMan", + "Music_CrystalOpening", + "Music_BattleTowerTheme", + "Music_SuicuneBattle", + "Music_BattleTowerLobby", + "Music_MobileCenter" + ], + "numOverworldSprites": 102, + "paletteOrder": [ + "PALETTE_AUTO", + "PALETTE_DAY", + "PALETTE_NITE", + "PALETTE_MORN", + "PALETTE_DARK" + ], + "phoneContactOrder": [ + "PHONE_00", + "PHONE_MOM", + "PHONE_OAK", + "PHONE_BILL", + "PHONE_ELM", + "PHONE_SCHOOLBOY_JACK", + "PHONE_POKEFAN_BEVERLY", + "PHONE_SAILOR_HUEY", + "PHONE_UNUSED", + "PHONE_UNUSED", + "PHONE_UNUSED", + "PHONE_COOLTRAINERM_GAVEN", + "PHONE_COOLTRAINERF_BETH", + "PHONE_BIRDKEEPER_JOSE", + "PHONE_COOLTRAINERF_REENA", + "PHONE_YOUNGSTER_JOEY", + "PHONE_BUG_CATCHER_WADE", + "PHONE_FISHER_RALPH", + "PHONE_PICNICKER_LIZ", + "PHONE_HIKER_ANTHONY", + "PHONE_CAMPER_TODD", + "PHONE_PICNICKER_GINA", + "PHONE_JUGGLER_IRWIN", + "PHONE_BUG_CATCHER_ARNIE", + "PHONE_SCHOOLBOY_ALAN", + "PHONE_UNUSED", + "PHONE_LASS_DANA", + "PHONE_SCHOOLBOY_CHAD", + "PHONE_POKEFANM_DEREK", + "PHONE_FISHER_TULLY", + "PHONE_POKEMANIAC_BRENT", + "PHONE_PICNICKER_TIFFANY", + "PHONE_BIRDKEEPER_VANCE", + "PHONE_FISHER_WILTON", + "PHONE_BLACKBELT_KENJI", + "PHONE_HIKER_PARRY", + "PHONE_PICNICKER_ERIN", + "PHONE_BUENA" + ], + "pocketOrder": [ + "ITEM", + "KEY_ITEM", + "BALL", + "TM_HM" + ], + "sfxOrder": [ + "Sfx_DexFanfare5079", + "Sfx_Item", + "Sfx_CaughtMon", + "Sfx_PokeballsPlacedOnTable", + "Sfx_Potion", + "Sfx_FullHeal", + "Sfx_Menu", + "Sfx_ReadText", + "Sfx_ReadText2", + "Sfx_DexFanfare2049", + "Sfx_DexFanfare80109", + "Sfx_Poison", + "Sfx_GotSafariBalls", + "Sfx_BootPc", + "Sfx_ShutDownPc", + "Sfx_ChoosePcOption", + "Sfx_EscapeRope", + "Sfx_PushButton", + "Sfx_SecondPartOfItemfinder", + "Sfx_WarpTo", + "Sfx_WarpFrom", + "Sfx_ChangeDexMode", + "Sfx_JumpOverLedge", + "Sfx_GrassRustle", + "Sfx_Fly", + "Sfx_Wrong", + "Sfx_Squeak", + "Sfx_Strength", + "Sfx_Boat", + "Sfx_WallOpen", + "Sfx_PlacePuzzlePieceDown", + "Sfx_EnterDoor", + "Sfx_SwitchPokemon", + "Sfx_Tally", + "Sfx_Transaction", + "Sfx_ExitBuilding", + "Sfx_Bump", + "Sfx_Save", + "Sfx_Pokeflute", + "Sfx_ElevatorEnd", + "Sfx_ThrowBall", + "Sfx_BallPoof", + "Sfx_Faint", + "Sfx_Run", + "Sfx_SlotMachineStart", + "Sfx_Fanfare", + "Sfx_Peck", + "Sfx_Kinesis", + "Sfx_Lick", + "Sfx_Pound", + "Sfx_MovePuzzlePiece", + "Sfx_CometPunch", + "Sfx_MegaPunch", + "Sfx_Scratch", + "Sfx_Vicegrip", + "Sfx_RazorWind", + "Sfx_Cut", + "Sfx_WingAttack", + "Sfx_Whirlwind", + "Sfx_Bind", + "Sfx_VineWhip", + "Sfx_DoubleKick", + "Sfx_MegaKick", + "Sfx_Headbutt", + "Sfx_HornAttack", + "Sfx_Tackle", + "Sfx_PoisonSting", + "Sfx_Powder", + "Sfx_Doubleslap", + "Sfx_Bite", + "Sfx_JumpKick", + "Sfx_Stomp", + "Sfx_TailWhip", + "Sfx_KarateChop", + "Sfx_Submission", + "Sfx_WaterGun", + "Sfx_SwordsDance", + "Sfx_Thunder", + "Sfx_Supersonic", + "Sfx_Leer", + "Sfx_Ember", + "Sfx_Bubblebeam", + "Sfx_HydroPump", + "Sfx_Surf", + "Sfx_Psybeam", + "Sfx_Charge", + "Sfx_Thundershock", + "Sfx_Psychic", + "Sfx_Screech", + "Sfx_BoneClub", + "Sfx_Sharpen", + "Sfx_EggBomb", + "Sfx_Sing", + "Sfx_HyperBeam", + "Sfx_Shine", + "Sfx_Unknown5F", + "Sfx_Unknown60", + "Sfx_Unknown61", + "Sfx_SwitchPockets", + "Sfx_Unknown63", + "Sfx_Burn", + "Sfx_TitleScreenEntrance", + "Sfx_Unknown66", + "Sfx_GetCoinFromSlots", + "Sfx_PayDay", + "Sfx_Metronome", + "Sfx_Call", + "Sfx_HangUp", + "Sfx_NoSignal", + "Sfx_Sandstorm", + "Sfx_Elevator", + "Sfx_Protect", + "Sfx_Sketch", + "Sfx_RainDance", + "Sfx_Aeroblast", + "Sfx_Spark", + "Sfx_Curse", + "Sfx_Rage", + "Sfx_Thief", + "Sfx_Thief2", + "Sfx_SpiderWeb", + "Sfx_MindReader", + "Sfx_Nightmare", + "Sfx_Snore", + "Sfx_SweetKiss", + "Sfx_SweetKiss2", + "Sfx_BellyDrum", + "Sfx_Toxic", + "Sfx_SludgeBomb", + "Sfx_Foresight", + "Sfx_Spite", + "Sfx_Outrage", + "Sfx_PerishSong", + "Sfx_GigaDrain", + "Sfx_Attract", + "Sfx_Kinesis2", + "Sfx_ZapCannon", + "Sfx_MeanLook", + "Sfx_HealBell", + "Sfx_Return", + "Sfx_ExpBar", + "Sfx_MilkDrink", + "Sfx_Present", + "Sfx_MorningSun", + "Sfx_LevelUp", + "Sfx_KeyItem", + "Sfx_Fanfare2", + "Sfx_RegisterPhoneNumber", + "Sfx_3rdPlace", + "Sfx_GetEgg", + "Sfx_GetEgg", + "Sfx_MoveDeleted", + "Sfx_2ndPlace", + "Sfx_1stPlace", + "Sfx_ChooseACard", + "Sfx_GetTm", + "Sfx_GetBadge", + "Sfx_QuitSlots", + "Sfx_EggCrack", + "Sfx_DexFanfareLessThan20", + "Sfx_DexFanfare140169", + "Sfx_DexFanfare170199", + "Sfx_DexFanfare200229", + "Sfx_DexFanfare230Plus", + "Sfx_Evolved", + "Sfx_MasterBall", + "Sfx_EggHatch", + "Sfx_GsIntroCharizardFireball", + "Sfx_GsIntroPokemonAppears", + "Sfx_Flash", + "Sfx_GameFreakLogoGs", + "Sfx_NotVeryEffective", + "Sfx_Damage", + "Sfx_SuperEffective", + "Sfx_BallBounce", + "Sfx_Moonlight", + "Sfx_Encore", + "Sfx_BeatUp", + "Sfx_BatonPass", + "Sfx_BallWobble", + "Sfx_SweetScent", + "Sfx_SweetScent2", + "Sfx_HitEndOfExpBar", + "Sfx_GiveTrademon", + "Sfx_GetTrademon", + "Sfx_TrainArrived", + "Sfx_StopSlot", + "Sfx_2Boops", + "Sfx_GlassTing", + "Sfx_GlassTing2", + "Sfx_IntroUnown1", + "Sfx_IntroUnown2", + "Sfx_IntroUnown3", + "Sfx_DittoPopUp", + "Sfx_DittoTransform", + "Sfx_IntroSuicune1", + "Sfx_IntroPichu", + "Sfx_IntroSuicune2", + "Sfx_IntroSuicune3", + "Sfx_DittoBounce", + "Sfx_IntroSuicune4", + "Sfx_GameFreakPresents", + "Sfx_Tingle", + "Sfx_IntroWhoosh", + "Sfx_TwoPcBeeps", + "Sfx_4NoteDitty", + "Sfx_Twinkle" + ], + "source": "pret/pokegold constants/*.asm", + "spawnOrder": [ + "SPAWN_HOME", + "SPAWN_DEBUG", + "SPAWN_PALLET", + "SPAWN_VIRIDIAN", + "SPAWN_PEWTER", + "SPAWN_CERULEAN", + "SPAWN_ROCK_TUNNEL", + "SPAWN_VERMILION", + "SPAWN_LAVENDER", + "SPAWN_SAFFRON", + "SPAWN_CELADON", + "SPAWN_FUCHSIA", + "SPAWN_CINNABAR", + "SPAWN_INDIGO", + "SPAWN_NEW_BARK", + "SPAWN_CHERRYGROVE", + "SPAWN_VIOLET", + "SPAWN_UNION_CAVE", + "SPAWN_AZALEA", + "SPAWN_CIANWOOD", + "SPAWN_GOLDENROD", + "SPAWN_OLIVINE", + "SPAWN_ECRUTEAK", + "SPAWN_MAHOGANY", + "SPAWN_LAKE_OF_RAGE", + "SPAWN_BLACKTHORN", + "SPAWN_MT_SILVER", + "SPAWN_FAST_SHIP" + ], + "specialCallOrder": [ + "SPECIALCALL_NONE", + "SPECIALCALL_POKERUS", + "SPECIALCALL_ROBBED", + "SPECIALCALL_ASSISTANT", + "SPECIALCALL_WEIRDBROADCAST", + "SPECIALCALL_SSTICKET", + "SPECIALCALL_BIKESHOP", + "SPECIALCALL_WORRIED", + "SPECIALCALL_MASTERBALL" + ], + "specialOrder": [ + "WarpToSpawnPoint", + "SetBitsForLinkTradeRequest", + "WaitForLinkedFriend", + "CheckLinkTimeout_Receptionist", + "TryQuickSave", + "CheckBothSelectedSameRoom", + "FailedLinkToPast", + "CloseLink", + "WaitForOtherPlayerToExit", + "SetBitsForBattleRequest", + "SetBitsForTimeCapsuleRequest", + "CheckTimeCapsuleCompatibility", + "EnterTimeCapsule", + "TradeCenter", + "Colosseum", + "TimeCapsule", + "CableClubCheckWhichChris", + "CheckMysteryGift", + "GetMysteryGiftItem", + "UnlockMysteryGift", + "BugContestJudging", + "CheckPartyFullAfterContest", + "ContestDropOffMons", + "ContestReturnMons", + "GiveParkBalls", + "CheckMagikarpLength", + "MagikarpHouseSign", + "HealParty", + "PokemonCenterPC", + "PlayersHousePC", + "DayCareMan", + "DayCareLady", + "DayCareManOutside", + "MoveDeletion", + "BankOfMom", + "MagnetTrain", + "NameRival", + "SetDayOfWeek", + "OverworldTownMap", + "UnownPrinter", + "MapRadio", + "UnownPuzzle", + "SlotMachine", + "CardFlip", + "UnusedMemoryGame", + "ClearBGPalettesBufferScreen", + "FadeOutToWhite", + "BattleTowerFade", + "FadeOutToBlack", + "FadeInFromWhite", + "FadeInFromBlack", + "ReloadSpritesNoPalettes", + "ClearBGPalettes", + "UpdateTimePals", + "ClearTilemap", + "UpdateSprites", + "UpdatePlayerSprite", + "GameCornerPrizeMonCheckDex", + "UnusedSetSeenMon", + "WaitSFX", + "PlayMapMusic", + "RestartMapMusic", + "HealMachineAnim", + "SurfStartStep", + "FindPartyMonAboveLevel", + "FindPartyMonAtLeastThatHappy", + "FindPartyMonThatSpecies", + "FindPartyMonThatSpeciesYourTrainerID", + "UnusedCheckUnusedTwoDayTimer", + "DayCareMon1", + "DayCareMon2", + "SelectRandomBugContestContestants", + "ActivateFishingSwarm", + "ToggleMaptileDecorations", + "ToggleDecorationsVisibility", + "GiveShuckle", + "ReturnShuckie", + "BillsGrandfather", + "CheckPokerus", + "DisplayCoinCaseBalance", + "DisplayMoneyAndCoinBalance", + "PlaceMoneyTopRight", + "CheckForLuckyNumberWinners", + "CheckLuckyNumberShowFlag", + "ResetLuckyNumberShowFlag", + "PrintTodaysLuckyNumber", + "SelectApricornForKurt", + "NameRater", + "DisplayLinkRecord", + "GetFirstPokemonHappiness", + "CheckFirstMonIsEgg", + "RandomUnseenWildMon", + "RandomPhoneWildMon", + "RandomPhoneMon", + "LoadUsedSpritesGFX", + "PlaySlowCry", + "SnorlaxAwake", + "OlderHaircutBrother", + "YoungerHaircutBrother", + "DaisysGrooming", + "PlayCurMonCry", + "ProfOaksPCBoot", + "GameboyCheck", + "TrainerHouse", + "PhotoStudio", + "InitRoamMons", + "FadeOutMusic", + "Diploma", + "PrintDiploma", + "Function11ac3e", + "TradeCornerHoldMon", + "Function11b5e8", + "Function11b7e5", + "Function11b879", + "Function11b920", + "Function11b93b", + "BattleTowerRoomMenu", + "Function1700ba", + "Function170114", + "BattleTowerBattle", + "Function1704e1", + "UnusedBattleTowerDummySpecial1", + "LoadOpponentTrainerAndPokemonWithOTSprite", + "Function11ba38", + "CheckForBattleTowerRules", + "GiveOddEgg", + "Reset", + "Function1011f1", + "Function101220", + "Function101225", + "Function101231", + "MoveTutor", + "OmanyteChamber", + "Function11c1ab", + "BattleTowerAction", + "DisplayUnownWords", + "Menu_ChallengeExplanationCancel", + "Function17d2b6", + "Function17d2ce", + "BattleTowerMobileError", + "AskMobileOrCable", + "HoOhChamber", + "Function102142", + "CelebiShrineEvent", + "CheckCaughtCelebi", + "PokeSeer", + "BuenasPassword", + "BuenaPrize", + "GiveDratini", + "SampleKenjiBreakCountdown", + "BeastsCheck", + "MonCheck", + "SetPlayerPalette", + "UnusedBattleTowerDummySpecial2", + "Mobile_SelectThreeMons", + "Function1037eb", + "Function10383c", + "StubbedTrainerRankings_Healings", + "RefreshSprites", + "Function1037c2", + "CheckMobileAdapterStatusSpecial", + "Function103780", + "Function10387b", + "AskRememberPassword", + "LoadMapPalettes", + "UnusedFindItemInPCOrBag", + "InitialSetDSTFlag", + "InitialClearDSTFlag", + "UnusedDummySpecial" + ], + "speciesOrder": [ + "BULBASAUR", + "IVYSAUR", + "VENUSAUR", + "CHARMANDER", + "CHARMELEON", + "CHARIZARD", + "SQUIRTLE", + "WARTORTLE", + "BLASTOISE", + "CATERPIE", + "METAPOD", + "BUTTERFREE", + "WEEDLE", + "KAKUNA", + "BEEDRILL", + "PIDGEY", + "PIDGEOTTO", + "PIDGEOT", + "RATTATA", + "RATICATE", + "SPEAROW", + "FEAROW", + "EKANS", + "ARBOK", + "PIKACHU", + "RAICHU", + "SANDSHREW", + "SANDSLASH", + "NIDORAN_F", + "NIDORINA", + "NIDOQUEEN", + "NIDORAN_M", + "NIDORINO", + "NIDOKING", + "CLEFAIRY", + "CLEFABLE", + "VULPIX", + "NINETALES", + "JIGGLYPUFF", + "WIGGLYTUFF", + "ZUBAT", + "GOLBAT", + "ODDISH", + "GLOOM", + "VILEPLUME", + "PARAS", + "PARASECT", + "VENONAT", + "VENOMOTH", + "DIGLETT", + "DUGTRIO", + "MEOWTH", + "PERSIAN", + "PSYDUCK", + "GOLDUCK", + "MANKEY", + "PRIMEAPE", + "GROWLITHE", + "ARCANINE", + "POLIWAG", + "POLIWHIRL", + "POLIWRATH", + "ABRA", + "KADABRA", + "ALAKAZAM", + "MACHOP", + "MACHOKE", + "MACHAMP", + "BELLSPROUT", + "WEEPINBELL", + "VICTREEBEL", + "TENTACOOL", + "TENTACRUEL", + "GEODUDE", + "GRAVELER", + "GOLEM", + "PONYTA", + "RAPIDASH", + "SLOWPOKE", + "SLOWBRO", + "MAGNEMITE", + "MAGNETON", + "FARFETCH_D", + "DODUO", + "DODRIO", + "SEEL", + "DEWGONG", + "GRIMER", + "MUK", + "SHELLDER", + "CLOYSTER", + "GASTLY", + "HAUNTER", + "GENGAR", + "ONIX", + "DROWZEE", + "HYPNO", + "KRABBY", + "KINGLER", + "VOLTORB", + "ELECTRODE", + "EXEGGCUTE", + "EXEGGUTOR", + "CUBONE", + "MAROWAK", + "HITMONLEE", + "HITMONCHAN", + "LICKITUNG", + "KOFFING", + "WEEZING", + "RHYHORN", + "RHYDON", + "CHANSEY", + "TANGELA", + "KANGASKHAN", + "HORSEA", + "SEADRA", + "GOLDEEN", + "SEAKING", + "STARYU", + "STARMIE", + "MR__MIME", + "SCYTHER", + "JYNX", + "ELECTABUZZ", + "MAGMAR", + "PINSIR", + "TAUROS", + "MAGIKARP", + "GYARADOS", + "LAPRAS", + "DITTO", + "EEVEE", + "VAPOREON", + "JOLTEON", + "FLAREON", + "PORYGON", + "OMANYTE", + "OMASTAR", + "KABUTO", + "KABUTOPS", + "AERODACTYL", + "SNORLAX", + "ARTICUNO", + "ZAPDOS", + "MOLTRES", + "DRATINI", + "DRAGONAIR", + "DRAGONITE", + "MEWTWO", + "MEW", + "CHIKORITA", + "BAYLEEF", + "MEGANIUM", + "CYNDAQUIL", + "QUILAVA", + "TYPHLOSION", + "TOTODILE", + "CROCONAW", + "FERALIGATR", + "SENTRET", + "FURRET", + "HOOTHOOT", + "NOCTOWL", + "LEDYBA", + "LEDIAN", + "SPINARAK", + "ARIADOS", + "CROBAT", + "CHINCHOU", + "LANTURN", + "PICHU", + "CLEFFA", + "IGGLYBUFF", + "TOGEPI", + "TOGETIC", + "NATU", + "XATU", + "MAREEP", + "FLAAFFY", + "AMPHAROS", + "BELLOSSOM", + "MARILL", + "AZUMARILL", + "SUDOWOODO", + "POLITOED", + "HOPPIP", + "SKIPLOOM", + "JUMPLUFF", + "AIPOM", + "SUNKERN", + "SUNFLORA", + "YANMA", + "WOOPER", + "QUAGSIRE", + "ESPEON", + "UMBREON", + "MURKROW", + "SLOWKING", + "MISDREAVUS", + "UNOWN", + "WOBBUFFET", + "GIRAFARIG", + "PINECO", + "FORRETRESS", + "DUNSPARCE", + "GLIGAR", + "STEELIX", + "SNUBBULL", + "GRANBULL", + "QWILFISH", + "SCIZOR", + "SHUCKLE", + "HERACROSS", + "SNEASEL", + "TEDDIURSA", + "URSARING", + "SLUGMA", + "MAGCARGO", + "SWINUB", + "PILOSWINE", + "CORSOLA", + "REMORAID", + "OCTILLERY", + "DELIBIRD", + "MANTINE", + "SKARMORY", + "HOUNDOUR", + "HOUNDOOM", + "KINGDRA", + "PHANPY", + "DONPHAN", + "PORYGON2", + "STANTLER", + "SMEARGLE", + "TYROGUE", + "HITMONTOP", + "SMOOCHUM", + "ELEKID", + "MAGBY", + "MILTANK", + "BLISSEY", + "RAIKOU", + "ENTEI", + "SUICUNE", + "LARVITAR", + "PUPITAR", + "TYRANITAR", + "LUGIA", + "HO_OH", + "CELEBI" + ], + "spriteOrder": [ + "SPRITE_CHRIS", + "SPRITE_CHRIS_BIKE", + "SPRITE_GAMEBOY_KID", + "SPRITE_RIVAL", + "SPRITE_OAK", + "SPRITE_RED", + "SPRITE_BLUE", + "SPRITE_BILL", + "SPRITE_ELDER", + "SPRITE_JANINE", + "SPRITE_KURT", + "SPRITE_MOM", + "SPRITE_BLAINE", + "SPRITE_REDS_MOM", + "SPRITE_DAISY", + "SPRITE_ELM", + "SPRITE_WILL", + "SPRITE_FALKNER", + "SPRITE_WHITNEY", + "SPRITE_BUGSY", + "SPRITE_MORTY", + "SPRITE_CHUCK", + "SPRITE_JASMINE", + "SPRITE_PRYCE", + "SPRITE_CLAIR", + "SPRITE_BROCK", + "SPRITE_KAREN", + "SPRITE_BRUNO", + "SPRITE_MISTY", + "SPRITE_LANCE", + "SPRITE_SURGE", + "SPRITE_ERIKA", + "SPRITE_KOGA", + "SPRITE_SABRINA", + "SPRITE_COOLTRAINER_M", + "SPRITE_COOLTRAINER_F", + "SPRITE_BUG_CATCHER", + "SPRITE_TWIN", + "SPRITE_YOUNGSTER", + "SPRITE_LASS", + "SPRITE_TEACHER", + "SPRITE_BEAUTY", + "SPRITE_SUPER_NERD", + "SPRITE_ROCKER", + "SPRITE_POKEFAN_M", + "SPRITE_POKEFAN_F", + "SPRITE_GRAMPS", + "SPRITE_GRANNY", + "SPRITE_SWIMMER_GUY", + "SPRITE_SWIMMER_GIRL", + "SPRITE_BIG_SNORLAX", + "SPRITE_SURFING_PIKACHU", + "SPRITE_ROCKET", + "SPRITE_ROCKET_GIRL", + "SPRITE_NURSE", + "SPRITE_LINK_RECEPTIONIST", + "SPRITE_CLERK", + "SPRITE_FISHER", + "SPRITE_FISHING_GURU", + "SPRITE_SCIENTIST", + "SPRITE_KIMONO_GIRL", + "SPRITE_SAGE", + "SPRITE_UNUSED_GUY", + "SPRITE_GENTLEMAN", + "SPRITE_BLACK_BELT", + "SPRITE_RECEPTIONIST", + "SPRITE_OFFICER", + "SPRITE_CAL", + "SPRITE_SLOWPOKE", + "SPRITE_CAPTAIN", + "SPRITE_BIG_LAPRAS", + "SPRITE_GYM_GUIDE", + "SPRITE_SAILOR", + "SPRITE_BIKER", + "SPRITE_PHARMACIST", + "SPRITE_MONSTER", + "SPRITE_FAIRY", + "SPRITE_BIRD", + "SPRITE_DRAGON", + "SPRITE_BIG_ONIX", + "SPRITE_N64", + "SPRITE_SUDOWOODO", + "SPRITE_SURF", + "SPRITE_POKE_BALL", + "SPRITE_POKEDEX", + "SPRITE_PAPER", + "SPRITE_VIRTUAL_BOY", + "SPRITE_OLD_LINK_RECEPTIONIST", + "SPRITE_ROCK", + "SPRITE_BOULDER", + "SPRITE_SNES", + "SPRITE_FAMICOM", + "SPRITE_FRUIT_TREE", + "SPRITE_GOLD_TROPHY", + "SPRITE_SILVER_TROPHY", + "SPRITE_KRIS", + "SPRITE_KRIS_BIKE", + "SPRITE_KURT_OUTSIDE", + "SPRITE_SUICUNE", + "SPRITE_ENTEI", + "SPRITE_RAIKOU", + "SPRITE_STANDING_YOUNGSTER", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "SPRITE_UNOWN", + "SPRITE_GEODUDE", + "SPRITE_GROWLITHE", + "SPRITE_WEEDLE", + "SPRITE_SHELLDER", + "SPRITE_ODDISH", + "SPRITE_GENGAR", + "SPRITE_ZUBAT", + "SPRITE_MAGIKARP", + "SPRITE_SQUIRTLE", + "SPRITE_TOGEPI", + "SPRITE_BUTTERFREE", + "SPRITE_DIGLETT", + "SPRITE_POLIWAG", + "SPRITE_PIKACHU", + "SPRITE_CLEFAIRY", + "SPRITE_CHARMANDER", + "SPRITE_JYNX", + "SPRITE_STARMIE", + "SPRITE_BULBASAUR", + "SPRITE_JIGGLYPUFF", + "SPRITE_GRIMER", + "SPRITE_EKANS", + "SPRITE_PARAS", + "SPRITE_TENTACOOL", + "SPRITE_TAUROS", + "SPRITE_MACHOP", + "SPRITE_VOLTORB", + "SPRITE_LAPRAS", + "SPRITE_RHYDON", + "SPRITE_MOLTRES", + "SPRITE_SNORLAX", + "SPRITE_GYARADOS", + "SPRITE_LUGIA", + "SPRITE_HO_OH" + ], + "spritePokemon": 128, + "stdScriptOrder": [ + "PokecenterNurseScript", + "DifficultBookshelfScript", + "PictureBookshelfScript", + "MagazineBookshelfScript", + "TeamRocketOathScript", + "IncenseBurnerScript", + "MerchandiseShelfScript", + "TownMapScript", + "WindowScript", + "TVScript", + "HomepageScript", + "Radio1Script", + "Radio2Script", + "TrashCanScript", + "StrengthBoulderScript", + "SmashRockScript", + "PokecenterSignScript", + "MartSignScript", + "GoldenrodRocketsScript", + "RadioTowerRocketsScript", + "ElevatorButtonScript", + "DayToTextScript", + "BugContestResultsWarpScript", + "BugContestResultsScript", + "InitializeEventsScript", + "AskNumber1MScript", + "AskNumber2MScript", + "RegisteredNumberMScript", + "NumberAcceptedMScript", + "NumberDeclinedMScript", + "PhoneFullMScript", + "RematchMScript", + "GiftMScript", + "PackFullMScript", + "RematchGiftMScript", + "AskNumber1FScript", + "AskNumber2FScript", + "RegisteredNumberFScript", + "NumberAcceptedFScript", + "NumberDeclinedFScript", + "PhoneFullFScript", + "RematchFScript", + "GiftFScript", + "PackFullFScript", + "RematchGiftFScript", + "GymStatue1Script", + "GymStatue2Script", + "ReceiveItemScript", + "ReceiveTogepiEggScript", + "PCScript", + "GameCornerCoinVendorScript", + "HappinessCheckScript" + ], + "tilesetOrder": [ + "TILESET_JOHTO", + "TILESET_JOHTO_MODERN", + "TILESET_KANTO", + "TILESET_BATTLE_TOWER_OUTSIDE", + "TILESET_HOUSE", + "TILESET_PLAYERS_HOUSE", + "TILESET_POKECENTER", + "TILESET_GATE", + "TILESET_PORT", + "TILESET_LAB", + "TILESET_FACILITY", + "TILESET_MART", + "TILESET_MANSION", + "TILESET_GAME_CORNER", + "TILESET_ELITE_FOUR_ROOM", + "TILESET_TRADITIONAL_HOUSE", + "TILESET_TRAIN_STATION", + "TILESET_CHAMPIONS_ROOM", + "TILESET_LIGHTHOUSE", + "TILESET_PLAYERS_ROOM", + "TILESET_POKECOM_CENTER", + "TILESET_BATTLE_TOWER_INSIDE", + "TILESET_TOWER", + "TILESET_CAVE", + "TILESET_PARK", + "TILESET_RUINS_OF_ALPH", + "TILESET_RADIO_TOWER", + "TILESET_UNDERGROUND", + "TILESET_ICE_PATH", + "TILESET_DARK_CAVE", + "TILESET_FOREST", + "TILESET_BETA_WORD_ROOM", + "TILESET_HO_OH_WORD_ROOM", + "TILESET_KABUTO_WORD_ROOM", + "TILESET_OMANYTE_WORD_ROOM", + "TILESET_AERODACTYL_WORD_ROOM" + ], + "tradeDialogOrder": [ + "TRADE_DIALOGSET_COLLECTOR", + "TRADE_DIALOGSET_HAPPY", + "TRADE_DIALOGSET_NEWBIE", + "TRADE_DIALOGSET_GIRL" + ], + "tradeGenderOrder": [ + "TRADE_GENDER_EITHER", + "TRADE_GENDER_MALE", + "TRADE_GENDER_FEMALE" + ], + "trainerClassMembers": { + "BEAUTY": [ + "VICTORIA", + "SAMANTHA", + "JULIE", + "JACLYN", + "BRENDA", + "CASSIE", + "CAROLINE", + "CARLENE", + "JESSICA", + "RACHAEL", + "ANGELICA", + "KENDRA", + "VERONICA", + "JULIA", + "THERESA", + "VALERIE", + "OLIVIA" + ], + "BIKER": [ + "BIKER_BENNY", + "KAZU", + "DWAYNE", + "HARRIS", + "ZEKE", + "CHARLES", + "RILEY", + "JOEL", + "GLENN" + ], + "BIRD_KEEPER": [ + "ROD", + "ABE", + "BRYAN", + "THEO", + "TOBY", + "DENIS", + "VANCE1", + "HANK", + "ROY", + "BORIS", + "BOB", + "JOSE1", + "PETER", + "JOSE2", + "PERRY", + "BRET", + "JOSE3", + "VANCE2", + "VANCE3" + ], + "BLACKBELT_T": [ + "KENJI1", + "YOSHI", + "KENJI2", + "LAO", + "NOB", + "KIYO", + "LUNG", + "KENJI3", + "WAI" + ], + "BLAINE": [ + "BLAINE1" + ], + "BLUE": [ + "BLUE1" + ], + "BOARDER": [ + "RONALD", + "BRAD", + "DOUGLAS" + ], + "BROCK": [ + "BROCK1" + ], + "BRUNO": [ + "BRUNO1" + ], + "BUGSY": [ + "BUGSY1" + ], + "BUG_CATCHER": [ + "DON", + "ROB", + "ED", + "WADE1", + "BUG_CATCHER_BENNY", + "AL", + "JOSH", + "ARNIE1", + "KEN", + "WADE2", + "WADE3", + "DOUG", + "ARNIE2", + "ARNIE3", + "WADE4", + "WADE5", + "ARNIE4", + "ARNIE5", + "WAYNE" + ], + "BURGLAR": [ + "DUNCAN", + "EDDIE", + "COREY" + ], + "CAL": [ + "CAL1", + "CAL2", + "CAL3" + ], + "CAMPER": [ + "ROLAND", + "TODD1", + "IVAN", + "ELLIOT", + "BARRY", + "LLOYD", + "DEAN", + "SID", + "HARVEY", + "DALE", + "TED", + "TODD2", + "TODD3", + "THOMAS", + "LEROY", + "DAVID", + "JOHN", + "JERRY", + "SPENCER", + "TODD4", + "TODD5", + "QUENTIN" + ], + "CHAMPION": [ + "LANCE" + ], + "CHUCK": [ + "CHUCK1" + ], + "CLAIR": [ + "CLAIR1" + ], + "COOLTRAINERF": [ + "GWEN", + "LOIS", + "FRAN", + "LOLA", + "KATE", + "IRENE", + "KELLY", + "JOYCE", + "BETH1", + "REENA1", + "MEGAN", + "BETH2", + "CAROL", + "QUINN", + "EMMA", + "CYBIL", + "JENN", + "BETH3", + "REENA2", + "REENA3", + "CARA" + ], + "COOLTRAINERM": [ + "NICK", + "AARON", + "PAUL", + "CODY", + "MIKE", + "GAVEN1", + "GAVEN2", + "RYAN", + "JAKE", + "GAVEN3", + "BLAKE", + "BRIAN", + "ERICK", + "ANDY", + "TYLER", + "SEAN", + "KEVIN", + "STEVE", + "ALLEN", + "DARIN" + ], + "ERIKA": [ + "ERIKA1" + ], + "EXECUTIVEF": [ + "EXECUTIVEF_1", + "EXECUTIVEF_2" + ], + "EXECUTIVEM": [ + "EXECUTIVEM_1", + "EXECUTIVEM_2", + "EXECUTIVEM_3", + "EXECUTIVEM_4" + ], + "FALKNER": [ + "FALKNER1" + ], + "FIREBREATHER": [ + "OTIS", + "DICK", + "NED", + "BURT", + "BILL", + "WALT", + "RAY", + "LYLE" + ], + "FISHER": [ + "JUSTIN", + "RALPH1", + "ARNOLD", + "KYLE", + "HENRY", + "MARVIN", + "TULLY1", + "ANDRE", + "RAYMOND", + "WILTON1", + "EDGAR", + "JONAH", + "MARTIN", + "STEPHEN", + "BARNEY", + "RALPH2", + "RALPH3", + "TULLY2", + "TULLY3", + "WILTON2", + "SCOTT", + "WILTON3", + "RALPH4", + "RALPH5", + "TULLY4" + ], + "GENTLEMAN": [ + "PRESTON", + "EDWARD", + "GREGORY", + "VIRGIL", + "ALFRED" + ], + "GRUNTF": [ + "GRUNTF_1", + "GRUNTF_2", + "GRUNTF_3", + "GRUNTF_4", + "GRUNTF_5" + ], + "GRUNTM": [ + "GRUNTM_1", + "GRUNTM_2", + "GRUNTM_3", + "GRUNTM_4", + "GRUNTM_5", + "GRUNTM_6", + "GRUNTM_7", + "GRUNTM_8", + "GRUNTM_9", + "GRUNTM_10", + "GRUNTM_11", + "GRUNTM_12", + "GRUNTM_13", + "GRUNTM_14", + "GRUNTM_15", + "GRUNTM_16", + "GRUNTM_17", + "GRUNTM_18", + "GRUNTM_19", + "GRUNTM_20", + "GRUNTM_21", + "GRUNTM_22", + "GRUNTM_23", + "GRUNTM_24", + "GRUNTM_25", + "GRUNTM_26", + "GRUNTM_27", + "GRUNTM_28", + "GRUNTM_29", + "GRUNTM_30", + "GRUNTM_31" + ], + "GUITARIST": [ + "CLYDE", + "VINCENT" + ], + "HIKER": [ + "ANTHONY1", + "RUSSELL", + "PHILLIP", + "LEONARD", + "ANTHONY2", + "BENJAMIN", + "ERIK", + "MICHAEL", + "PARRY1", + "TIMOTHY", + "BAILEY", + "ANTHONY3", + "TIM", + "NOLAND", + "SIDNEY", + "KENNY", + "JIM", + "DANIEL", + "PARRY2", + "PARRY3", + "ANTHONY4", + "ANTHONY5" + ], + "JANINE": [ + "JANINE1" + ], + "JASMINE": [ + "JASMINE1" + ], + "JUGGLER": [ + "IRWIN1", + "FRITZ", + "HORTON", + "IRWIN2", + "IRWIN3", + "IRWIN4" + ], + "KAREN": [ + "KAREN1" + ], + "KIMONO_GIRL": [ + "NAOKO_UNUSED", + "NAOKO", + "SAYO", + "ZUKI", + "KUNI", + "MIKI" + ], + "KOGA": [ + "KOGA1" + ], + "LASS": [ + "CARRIE", + "BRIDGET", + "ALICE", + "KRISE", + "CONNIE1", + "LINDA", + "LAURA", + "SHANNON", + "MICHELLE", + "DANA1", + "ELLEN", + "CONNIE2", + "CONNIE3", + "DANA2", + "DANA3", + "DANA4", + "DANA5" + ], + "LT_SURGE": [ + "LT_SURGE1" + ], + "MEDIUM": [ + "MARTHA", + "GRACE", + "BETHANY", + "MARGRET", + "ETHEL", + "REBECCA", + "DORIS" + ], + "MISTY": [ + "MISTY1" + ], + "MORTY": [ + "MORTY1" + ], + "MYSTICALMAN": [ + "EUSINE" + ], + "OFFICER": [ + "KEITH", + "DIRK" + ], + "PICNICKER": [ + "LIZ1", + "GINA1", + "BROOKE", + "KIM", + "CINDY", + "HOPE", + "SHARON", + "DEBRA", + "GINA2", + "ERIN1", + "LIZ2", + "LIZ3", + "HEIDI", + "EDNA", + "GINA3", + "TIFFANY1", + "TIFFANY2", + "ERIN2", + "TANYA", + "TIFFANY3", + "ERIN3", + "LIZ4", + "LIZ5", + "GINA4", + "GINA5", + "TIFFANY4" + ], + "POKEFANF": [ + "BEVERLY1", + "RUTH", + "BEVERLY2", + "BEVERLY3", + "GEORGIA", + "JAIME" + ], + "POKEFANM": [ + "WILLIAM", + "DEREK1", + "ROBERT", + "JOSHUA", + "CARTER", + "TREVOR", + "BRANDON", + "JEREMY", + "COLIN", + "DEREK2", + "DEREK3", + "ALEX", + "REX", + "ALLAN" + ], + "POKEMANIAC": [ + "LARRY", + "ANDREW", + "CALVIN", + "SHANE", + "BEN", + "BRENT1", + "RON", + "ETHAN", + "BRENT2", + "BRENT3", + "ISSAC", + "DONALD", + "ZACH", + "BRENT4", + "MILLER" + ], + "POKEMON_PROF": [], + "PRYCE": [ + "PRYCE1" + ], + "PSYCHIC_T": [ + "NATHAN", + "FRANKLIN", + "HERMAN", + "FIDEL", + "GREG", + "NORMAN", + "MARK", + "PHIL", + "RICHARD", + "GILBERT", + "JARED", + "RODNEY" + ], + "RED": [ + "RED1" + ], + "RIVAL1": [ + "RIVAL1_1_CHIKORITA", + "RIVAL1_1_CYNDAQUIL", + "RIVAL1_1_TOTODILE", + "RIVAL1_2_CHIKORITA", + "RIVAL1_2_CYNDAQUIL", + "RIVAL1_2_TOTODILE", + "RIVAL1_3_CHIKORITA", + "RIVAL1_3_CYNDAQUIL", + "RIVAL1_3_TOTODILE", + "RIVAL1_4_CHIKORITA", + "RIVAL1_4_CYNDAQUIL", + "RIVAL1_4_TOTODILE", + "RIVAL1_5_CHIKORITA", + "RIVAL1_5_CYNDAQUIL", + "RIVAL1_5_TOTODILE" + ], + "RIVAL2": [ + "RIVAL2_1_CHIKORITA", + "RIVAL2_1_CYNDAQUIL", + "RIVAL2_1_TOTODILE", + "RIVAL2_2_CHIKORITA", + "RIVAL2_2_CYNDAQUIL", + "RIVAL2_2_TOTODILE" + ], + "SABRINA": [ + "SABRINA1" + ], + "SAGE": [ + "CHOW", + "NICO", + "JIN", + "TROY", + "JEFFREY", + "PING", + "EDMOND", + "NEAL", + "LI", + "GAKU", + "MASA", + "KOJI" + ], + "SAILOR": [ + "EUGENE", + "HUEY1", + "TERRELL", + "KENT", + "ERNEST", + "JEFF", + "GARRETT", + "KENNETH", + "STANLY", + "HARRY", + "HUEY2", + "HUEY3", + "HUEY4" + ], + "SCHOOLBOY": [ + "JACK1", + "KIPP", + "ALAN1", + "JOHNNY", + "DANNY", + "TOMMY", + "DUDLEY", + "JOE", + "BILLY", + "CHAD1", + "NATE", + "RICKY", + "JACK2", + "JACK3", + "ALAN2", + "ALAN3", + "CHAD2", + "CHAD3", + "JACK4", + "JACK5", + "ALAN4", + "ALAN5", + "CHAD4", + "CHAD5" + ], + "SCIENTIST": [ + "ROSS", + "MITCH", + "JED", + "MARC", + "RICH" + ], + "SKIER": [ + "ROXANNE", + "CLARISSA" + ], + "SUPER_NERD": [ + "STAN", + "ERIC", + "GREGG", + "JAY", + "DAVE", + "SAM", + "TOM", + "PAT", + "SHAWN", + "TERU", + "RUSS", + "NORTON", + "HUGH", + "MARKUS" + ], + "SWIMMERF": [ + "ELAINE", + "PAULA", + "KAYLEE", + "SUSIE", + "DENISE", + "KARA", + "WENDY", + "LISA", + "JILL", + "MARY", + "KATIE", + "DAWN", + "TARA", + "NICOLE", + "LORI", + "JODY", + "NIKKI", + "DIANA", + "BRIANA" + ], + "SWIMMERM": [ + "HAROLD", + "SIMON", + "RANDALL", + "CHARLIE", + "GEORGE", + "BERKE", + "KIRK", + "MATHEW", + "HAL", + "PATON", + "DARYL", + "WALTER", + "TONY", + "JEROME", + "TUCKER", + "RICK", + "CAMERON", + "SETH", + "JAMES", + "LEWIS", + "PARKER" + ], + "TEACHER": [ + "COLETTE", + "HILLARY", + "SHIRLEY" + ], + "TRAINER_NONE": [], + "TWINS": [ + "AMYANDMAY1", + "ANNANDANNE1", + "ANNANDANNE2", + "AMYANDMAY2", + "JOANDZOE1", + "JOANDZOE2", + "MEGANDPEG1", + "MEGANDPEG2", + "LEAANDPIA1", + "LEAANDPIA2" + ], + "WHITNEY": [ + "WHITNEY1" + ], + "WILL": [ + "WILL1" + ], + "YOUNGSTER": [ + "JOEY1", + "MIKEY", + "ALBERT", + "GORDON", + "SAMUEL", + "IAN", + "JOEY2", + "JOEY3", + "WARREN", + "JIMMY", + "OWEN", + "JASON", + "JOEY4", + "JOEY5" + ] + }, + "trainerClassOrder": [ + "TRAINER_NONE", + "FALKNER", + "WHITNEY", + "BUGSY", + "MORTY", + "PRYCE", + "JASMINE", + "CHUCK", + "CLAIR", + "RIVAL1", + "POKEMON_PROF", + "WILL", + "CAL", + "BRUNO", + "KAREN", + "KOGA", + "CHAMPION", + "BROCK", + "MISTY", + "LT_SURGE", + "SCIENTIST", + "ERIKA", + "YOUNGSTER", + "SCHOOLBOY", + "BIRD_KEEPER", + "LASS", + "JANINE", + "COOLTRAINERM", + "COOLTRAINERF", + "BEAUTY", + "POKEMANIAC", + "GRUNTM", + "GENTLEMAN", + "SKIER", + "TEACHER", + "SABRINA", + "BUG_CATCHER", + "FISHER", + "SWIMMERM", + "SWIMMERF", + "SAILOR", + "SUPER_NERD", + "RIVAL2", + "GUITARIST", + "HIKER", + "BIKER", + "BLAINE", + "BURGLAR", + "FIREBREATHER", + "JUGGLER", + "BLACKBELT_T", + "EXECUTIVEM", + "PSYCHIC_T", + "PICNICKER", + "CAMPER", + "EXECUTIVEF", + "SAGE", + "MEDIUM", + "BOARDER", + "POKEFANM", + "KIMONO_GIRL", + "TWINS", + "POKEFANF", + "RED", + "BLUE", + "OFFICER", + "GRUNTF", + "MYSTICALMAN" + ], + "trainerTypeOrder": [ + "TRAINERTYPE_NORMAL", + "TRAINERTYPE_MOVES", + "TRAINERTYPE_ITEM", + "TRAINERTYPE_ITEM_MOVES" + ], + "treeMonSetOrder": [ + "TREEMON_SET_NONE", + "TREEMON_SET_CANYON", + "TREEMON_SET_TOWN", + "TREEMON_SET_ROUTE", + "TREEMON_SET_KANTO", + "TREEMON_SET_LAKE", + "TREEMON_SET_FOREST", + "TREEMON_SET_ROCK" + ], + "types": { + "BIRD": 6, + "BUG": 7, + "CURSE_TYPE": 19, + "DARK": 27, + "DRAGON": 26, + "ELECTRIC": 23, + "FIGHTING": 1, + "FIRE": 20, + "FLYING": 2, + "GHOST": 8, + "GRASS": 22, + "GROUND": 4, + "ICE": 25, + "NORMAL": 0, + "POISON": 3, + "PSYCHIC_TYPE": 24, + "ROCK": 5, + "STEEL": 9, + "WATER": 21 + } + }, + "fontCharmap": [ + { + "code": 96, + "seq": "" + }, + { + "code": 97, + "seq": "" + }, + { + "code": 98, + "seq": "" + }, + { + "code": 99, + "seq": "" + }, + { + "code": 100, + "seq": "" + }, + { + "code": 101, + "seq": "" + }, + { + "code": 102, + "seq": "" + }, + { + "code": 103, + "seq": "" + }, + { + "code": 104, + "seq": "" + }, + { + "code": 107, + "seq": "" + }, + { + "code": 108, + "seq": "" + }, + { + "code": 106, + "seq": "" + }, + { + "code": 105, + "seq": "" + }, + { + "code": 109, + "seq": "" + }, + { + "code": 242, + "seq": "" + }, + { + "code": 112, + "seq": "" + }, + { + "code": 115, + "seq": "" + }, + { + "code": 113, + "seq": "" + }, + { + "code": 110, + "seq": "" + }, + { + "code": 226, + "seq": "" + }, + { + "code": 225, + "seq": "" + }, + { + "code": 112, + "seq": "" + }, + { + "code": 208, + "seq": "'d" + }, + { + "code": 209, + "seq": "'l" + }, + { + "code": 210, + "seq": "'m" + }, + { + "code": 211, + "seq": "'r" + }, + { + "code": 212, + "seq": "'s" + }, + { + "code": 213, + "seq": "'t" + }, + { + "code": 214, + "seq": "'v" + }, + { + "code": 127, + "seq": " " + }, + { + "code": 231, + "seq": "!" + }, + { + "code": 115, + "seq": "\"" + }, + { + "code": 233, + "seq": "&" + }, + { + "code": 224, + "seq": "'" + }, + { + "code": 154, + "seq": "(" + }, + { + "code": 155, + "seq": ")" + }, + { + "code": 244, + "seq": "," + }, + { + "code": 227, + "seq": "-" + }, + { + "code": 232, + "seq": "." + }, + { + "code": 243, + "seq": "/" + }, + { + "code": 246, + "seq": "0" + }, + { + "code": 247, + "seq": "1" + }, + { + "code": 248, + "seq": "2" + }, + { + "code": 249, + "seq": "3" + }, + { + "code": 250, + "seq": "4" + }, + { + "code": 251, + "seq": "5" + }, + { + "code": 252, + "seq": "6" + }, + { + "code": 253, + "seq": "7" + }, + { + "code": 254, + "seq": "8" + }, + { + "code": 255, + "seq": "9" + }, + { + "code": 156, + "seq": ":" + }, + { + "code": 157, + "seq": ";" + }, + { + "code": 230, + "seq": "?" + }, + { + "code": 128, + "seq": "A" + }, + { + "code": 129, + "seq": "B" + }, + { + "code": 130, + "seq": "C" + }, + { + "code": 131, + "seq": "D" + }, + { + "code": 132, + "seq": "E" + }, + { + "code": 133, + "seq": "F" + }, + { + "code": 134, + "seq": "G" + }, + { + "code": 135, + "seq": "H" + }, + { + "code": 136, + "seq": "I" + }, + { + "code": 137, + "seq": "J" + }, + { + "code": 138, + "seq": "K" + }, + { + "code": 139, + "seq": "L" + }, + { + "code": 140, + "seq": "M" + }, + { + "code": 141, + "seq": "N" + }, + { + "code": 142, + "seq": "O" + }, + { + "code": 143, + "seq": "P" + }, + { + "code": 144, + "seq": "Q" + }, + { + "code": 145, + "seq": "R" + }, + { + "code": 146, + "seq": "S" + }, + { + "code": 147, + "seq": "T" + }, + { + "code": 148, + "seq": "U" + }, + { + "code": 149, + "seq": "V" + }, + { + "code": 150, + "seq": "W" + }, + { + "code": 151, + "seq": "X" + }, + { + "code": 152, + "seq": "Y" + }, + { + "code": 153, + "seq": "Z" + }, + { + "code": 158, + "seq": "[" + }, + { + "code": 159, + "seq": "]" + }, + { + "code": 160, + "seq": "a" + }, + { + "code": 161, + "seq": "b" + }, + { + "code": 162, + "seq": "c" + }, + { + "code": 163, + "seq": "d" + }, + { + "code": 164, + "seq": "e" + }, + { + "code": 165, + "seq": "f" + }, + { + "code": 166, + "seq": "g" + }, + { + "code": 167, + "seq": "h" + }, + { + "code": 168, + "seq": "i" + }, + { + "code": 169, + "seq": "j" + }, + { + "code": 170, + "seq": "k" + }, + { + "code": 171, + "seq": "l" + }, + { + "code": 172, + "seq": "m" + }, + { + "code": 173, + "seq": "n" + }, + { + "code": 174, + "seq": "o" + }, + { + "code": 175, + "seq": "p" + }, + { + "code": 176, + "seq": "q" + }, + { + "code": 177, + "seq": "r" + }, + { + "code": 178, + "seq": "s" + }, + { + "code": 179, + "seq": "t" + }, + { + "code": 180, + "seq": "u" + }, + { + "code": 181, + "seq": "v" + }, + { + "code": 182, + "seq": "w" + }, + { + "code": 183, + "seq": "x" + }, + { + "code": 184, + "seq": "y" + }, + { + "code": 185, + "seq": "z" + }, + { + "code": 240, + "seq": "¥" + }, + { + "code": 116, + "seq": "·" + }, + { + "code": 192, + "seq": "Ä" + }, + { + "code": 193, + "seq": "Ö" + }, + { + "code": 241, + "seq": "×" + }, + { + "code": 194, + "seq": "Ü" + }, + { + "code": 195, + "seq": "ä" + }, + { + "code": 234, + "seq": "é" + }, + { + "code": 196, + "seq": "ö" + }, + { + "code": 197, + "seq": "ü" + }, + { + "code": 114, + "seq": "“" + }, + { + "code": 115, + "seq": "”" + }, + { + "code": 117, + "seq": "…" + }, + { + "code": 110, + "seq": "′" + }, + { + "code": 111, + "seq": "″" + }, + { + "code": 116, + "seq": "№" + }, + { + "code": 223, + "seq": "←" + }, + { + "code": 235, + "seq": "→" + }, + { + "code": 117, + "seq": "⋯" + }, + { + "code": 122, + "seq": "─" + }, + { + "code": 124, + "seq": "│" + }, + { + "code": 121, + "seq": "┌" + }, + { + "code": 123, + "seq": "┐" + }, + { + "code": 125, + "seq": "└" + }, + { + "code": 126, + "seq": "┘" + }, + { + "code": 96, + "seq": "■" + }, + { + "code": 97, + "seq": "▲" + }, + { + "code": 237, + "seq": "▶" + }, + { + "code": 236, + "seq": "▷" + }, + { + "code": 238, + "seq": "▼" + }, + { + "code": 113, + "seq": "◀" + }, + { + "code": 98, + "seq": "☎" + }, + { + "code": 245, + "seq": "♀" + }, + { + "code": 239, + "seq": "♂" + }, + { + "code": 127, + "seq": " " + }, + { + "code": 232, + "seq": "。" + }, + { + "code": 112, + "seq": "「" + }, + { + "code": 113, + "seq": "」" + }, + { + "code": 114, + "seq": "『" + }, + { + "code": 115, + "seq": "』" + }, + { + "code": 118, + "seq": "ぁ" + }, + { + "code": 177, + "seq": "あ" + }, + { + "code": 110, + "seq": "ぃ" + }, + { + "code": 178, + "seq": "い" + }, + { + "code": 111, + "seq": "ぅ" + }, + { + "code": 179, + "seq": "う" + }, + { + "code": 119, + "seq": "ぇ" + }, + { + "code": 180, + "seq": "え" + }, + { + "code": 120, + "seq": "ぉ" + }, + { + "code": 181, + "seq": "お" + }, + { + "code": 182, + "seq": "か" + }, + { + "code": 183, + "seq": "き" + }, + { + "code": 184, + "seq": "く" + }, + { + "code": 185, + "seq": "け" + }, + { + "code": 186, + "seq": "こ" + }, + { + "code": 187, + "seq": "さ" + }, + { + "code": 188, + "seq": "し" + }, + { + "code": 189, + "seq": "す" + }, + { + "code": 190, + "seq": "せ" + }, + { + "code": 191, + "seq": "そ" + }, + { + "code": 192, + "seq": "た" + }, + { + "code": 193, + "seq": "ち" + }, + { + "code": 223, + "seq": "っ" + }, + { + "code": 194, + "seq": "つ" + }, + { + "code": 195, + "seq": "て" + }, + { + "code": 196, + "seq": "と" + }, + { + "code": 197, + "seq": "な" + }, + { + "code": 198, + "seq": "に" + }, + { + "code": 199, + "seq": "ぬ" + }, + { + "code": 200, + "seq": "ね" + }, + { + "code": 201, + "seq": "の" + }, + { + "code": 202, + "seq": "は" + }, + { + "code": 203, + "seq": "ひ" + }, + { + "code": 204, + "seq": "ふ" + }, + { + "code": 205, + "seq": "へ" + }, + { + "code": 206, + "seq": "ほ" + }, + { + "code": 207, + "seq": "ま" + }, + { + "code": 208, + "seq": "み" + }, + { + "code": 209, + "seq": "む" + }, + { + "code": 210, + "seq": "め" + }, + { + "code": 211, + "seq": "も" + }, + { + "code": 224, + "seq": "ゃ" + }, + { + "code": 212, + "seq": "や" + }, + { + "code": 225, + "seq": "ゅ" + }, + { + "code": 213, + "seq": "ゆ" + }, + { + "code": 226, + "seq": "ょ" + }, + { + "code": 214, + "seq": "よ" + }, + { + "code": 215, + "seq": "ら" + }, + { + "code": 216, + "seq": "り" + }, + { + "code": 217, + "seq": "る" + }, + { + "code": 218, + "seq": "れ" + }, + { + "code": 219, + "seq": "ろ" + }, + { + "code": 220, + "seq": "わ" + }, + { + "code": 221, + "seq": "を" + }, + { + "code": 222, + "seq": "ん" + }, + { + "code": 233, + "seq": "ァ" + }, + { + "code": 128, + "seq": "ア" + }, + { + "code": 176, + "seq": "ィ" + }, + { + "code": 129, + "seq": "イ" + }, + { + "code": 234, + "seq": "ゥ" + }, + { + "code": 130, + "seq": "ウ" + }, + { + "code": 235, + "seq": "ェ" + }, + { + "code": 131, + "seq": "エ" + }, + { + "code": 244, + "seq": "ォ" + }, + { + "code": 132, + "seq": "オ" + }, + { + "code": 133, + "seq": "カ" + }, + { + "code": 134, + "seq": "キ" + }, + { + "code": 135, + "seq": "ク" + }, + { + "code": 136, + "seq": "ケ" + }, + { + "code": 137, + "seq": "コ" + }, + { + "code": 138, + "seq": "サ" + }, + { + "code": 139, + "seq": "シ" + }, + { + "code": 140, + "seq": "ス" + }, + { + "code": 141, + "seq": "セ" + }, + { + "code": 142, + "seq": "ソ" + }, + { + "code": 143, + "seq": "タ" + }, + { + "code": 144, + "seq": "チ" + }, + { + "code": 172, + "seq": "ッ" + }, + { + "code": 145, + "seq": "ツ" + }, + { + "code": 146, + "seq": "テ" + }, + { + "code": 147, + "seq": "ト" + }, + { + "code": 148, + "seq": "ナ" + }, + { + "code": 149, + "seq": "ニ" + }, + { + "code": 150, + "seq": "ヌ" + }, + { + "code": 151, + "seq": "ネ" + }, + { + "code": 152, + "seq": "ノ" + }, + { + "code": 153, + "seq": "ハ" + }, + { + "code": 154, + "seq": "ヒ" + }, + { + "code": 155, + "seq": "フ" + }, + { + "code": 156, + "seq": "ホ" + }, + { + "code": 157, + "seq": "マ" + }, + { + "code": 158, + "seq": "ミ" + }, + { + "code": 159, + "seq": "ム" + }, + { + "code": 160, + "seq": "メ" + }, + { + "code": 161, + "seq": "モ" + }, + { + "code": 173, + "seq": "ャ" + }, + { + "code": 162, + "seq": "ヤ" + }, + { + "code": 174, + "seq": "ュ" + }, + { + "code": 163, + "seq": "ユ" + }, + { + "code": 175, + "seq": "ョ" + }, + { + "code": 164, + "seq": "ヨ" + }, + { + "code": 165, + "seq": "ラ" + }, + { + "code": 166, + "seq": "ル" + }, + { + "code": 167, + "seq": "レ" + }, + { + "code": 168, + "seq": "ロ" + }, + { + "code": 169, + "seq": "ワ" + }, + { + "code": 170, + "seq": "ヲ" + }, + { + "code": 171, + "seq": "ン" + }, + { + "code": 116, + "seq": "・" + }, + { + "code": 227, + "seq": "ー" + }, + { + "code": 240, + "seq": "円" + }, + { + "code": 231, + "seq": "!" + }, + { + "code": 242, + "seq": "." + }, + { + "code": 243, + "seq": "/" + }, + { + "code": 246, + "seq": "0" + }, + { + "code": 247, + "seq": "1" + }, + { + "code": 248, + "seq": "2" + }, + { + "code": 249, + "seq": "3" + }, + { + "code": 250, + "seq": "4" + }, + { + "code": 251, + "seq": "5" + }, + { + "code": 252, + "seq": "6" + }, + { + "code": 253, + "seq": "7" + }, + { + "code": 254, + "seq": "8" + }, + { + "code": 255, + "seq": "9" + }, + { + "code": 230, + "seq": "?" + }, + { + "code": 229, + "seq": "゙" + }, + { + "code": 228, + "seq": "゚" + } + ], + "format": 3, + "generation": 2, + "maps": { + "AZALEA_GYM": { + "group": 8, + "height": 8, + "map": 5, + "name": "AZALEA_GYM", + "width": 5 + }, + "AZALEA_MART": { + "group": 8, + "height": 4, + "map": 3, + "name": "AZALEA_MART", + "width": 6 + }, + "AZALEA_POKECENTER_1F": { + "group": 8, + "height": 4, + "map": 1, + "name": "AZALEA_POKECENTER_1F", + "width": 5 + }, + "AZALEA_TOWN": { + "group": 8, + "height": 9, + "map": 7, + "name": "AZALEA_TOWN", + "width": 20 + }, + "BATTLE_TOWER_1F": { + "group": 22, + "height": 5, + "map": 11, + "name": "BATTLE_TOWER_1F", + "width": 8 + }, + "BATTLE_TOWER_BATTLE_ROOM": { + "group": 22, + "height": 4, + "map": 12, + "name": "BATTLE_TOWER_BATTLE_ROOM", + "width": 4 + }, + "BATTLE_TOWER_ELEVATOR": { + "group": 22, + "height": 2, + "map": 13, + "name": "BATTLE_TOWER_ELEVATOR", + "width": 2 + }, + "BATTLE_TOWER_HALLWAY": { + "group": 22, + "height": 2, + "map": 14, + "name": "BATTLE_TOWER_HALLWAY", + "width": 11 + }, + "BATTLE_TOWER_OUTSIDE": { + "group": 22, + "height": 14, + "map": 16, + "name": "BATTLE_TOWER_OUTSIDE", + "width": 10 + }, + "BILLS_FAMILYS_HOUSE": { + "group": 11, + "height": 4, + "map": 6, + "name": "BILLS_FAMILYS_HOUSE", + "width": 4 + }, + "BILLS_HOUSE": { + "group": 7, + "height": 4, + "map": 11, + "name": "BILLS_HOUSE", + "width": 4 + }, + "BILLS_OLDER_SISTERS_HOUSE": { + "group": 17, + "height": 4, + "map": 9, + "name": "BILLS_OLDER_SISTERS_HOUSE", + "width": 4 + }, + "BLACKTHORN_CITY": { + "group": 5, + "height": 18, + "map": 10, + "name": "BLACKTHORN_CITY", + "width": 20 + }, + "BLACKTHORN_DRAGON_SPEECH_HOUSE": { + "group": 5, + "height": 4, + "map": 3, + "name": "BLACKTHORN_DRAGON_SPEECH_HOUSE", + "width": 4 + }, + "BLACKTHORN_EMYS_HOUSE": { + "group": 5, + "height": 4, + "map": 4, + "name": "BLACKTHORN_EMYS_HOUSE", + "width": 4 + }, + "BLACKTHORN_GYM_1F": { + "group": 5, + "height": 9, + "map": 1, + "name": "BLACKTHORN_GYM_1F", + "width": 5 + }, + "BLACKTHORN_GYM_2F": { + "group": 5, + "height": 9, + "map": 2, + "name": "BLACKTHORN_GYM_2F", + "width": 5 + }, + "BLACKTHORN_MART": { + "group": 5, + "height": 4, + "map": 5, + "name": "BLACKTHORN_MART", + "width": 6 + }, + "BLACKTHORN_POKECENTER_1F": { + "group": 5, + "height": 4, + "map": 6, + "name": "BLACKTHORN_POKECENTER_1F", + "width": 5 + }, + "BLUES_HOUSE": { + "group": 13, + "height": 4, + "map": 5, + "name": "BLUES_HOUSE", + "width": 4 + }, + "BRUNOS_ROOM": { + "group": 16, + "height": 9, + "map": 5, + "name": "BRUNOS_ROOM", + "width": 5 + }, + "BURNED_TOWER_1F": { + "group": 3, + "height": 9, + "map": 13, + "name": "BURNED_TOWER_1F", + "width": 10 + }, + "BURNED_TOWER_B1F": { + "group": 3, + "height": 9, + "map": 14, + "name": "BURNED_TOWER_B1F", + "width": 10 + }, + "CELADON_CAFE": { + "group": 21, + "height": 4, + "map": 22, + "name": "CELADON_CAFE", + "width": 6 + }, + "CELADON_CITY": { + "group": 21, + "height": 18, + "map": 4, + "name": "CELADON_CITY", + "width": 20 + }, + "CELADON_DEPT_STORE_1F": { + "group": 21, + "height": 4, + "map": 5, + "name": "CELADON_DEPT_STORE_1F", + "width": 8 + }, + "CELADON_DEPT_STORE_2F": { + "group": 21, + "height": 4, + "map": 6, + "name": "CELADON_DEPT_STORE_2F", + "width": 8 + }, + "CELADON_DEPT_STORE_3F": { + "group": 21, + "height": 4, + "map": 7, + "name": "CELADON_DEPT_STORE_3F", + "width": 8 + }, + "CELADON_DEPT_STORE_4F": { + "group": 21, + "height": 4, + "map": 8, + "name": "CELADON_DEPT_STORE_4F", + "width": 8 + }, + "CELADON_DEPT_STORE_5F": { + "group": 21, + "height": 4, + "map": 9, + "name": "CELADON_DEPT_STORE_5F", + "width": 8 + }, + "CELADON_DEPT_STORE_6F": { + "group": 21, + "height": 4, + "map": 10, + "name": "CELADON_DEPT_STORE_6F", + "width": 8 + }, + "CELADON_DEPT_STORE_ELEVATOR": { + "group": 21, + "height": 2, + "map": 11, + "name": "CELADON_DEPT_STORE_ELEVATOR", + "width": 2 + }, + "CELADON_GAME_CORNER": { + "group": 21, + "height": 7, + "map": 19, + "name": "CELADON_GAME_CORNER", + "width": 10 + }, + "CELADON_GAME_CORNER_PRIZE_ROOM": { + "group": 21, + "height": 3, + "map": 20, + "name": "CELADON_GAME_CORNER_PRIZE_ROOM", + "width": 3 + }, + "CELADON_GYM": { + "group": 21, + "height": 9, + "map": 21, + "name": "CELADON_GYM", + "width": 5 + }, + "CELADON_MANSION_1F": { + "group": 21, + "height": 5, + "map": 12, + "name": "CELADON_MANSION_1F", + "width": 4 + }, + "CELADON_MANSION_2F": { + "group": 21, + "height": 5, + "map": 13, + "name": "CELADON_MANSION_2F", + "width": 4 + }, + "CELADON_MANSION_3F": { + "group": 21, + "height": 5, + "map": 14, + "name": "CELADON_MANSION_3F", + "width": 4 + }, + "CELADON_MANSION_ROOF": { + "group": 21, + "height": 5, + "map": 15, + "name": "CELADON_MANSION_ROOF", + "width": 4 + }, + "CELADON_MANSION_ROOF_HOUSE": { + "group": 21, + "height": 4, + "map": 16, + "name": "CELADON_MANSION_ROOF_HOUSE", + "width": 4 + }, + "CELADON_POKECENTER_1F": { + "group": 21, + "height": 4, + "map": 17, + "name": "CELADON_POKECENTER_1F", + "width": 5 + }, + "CELADON_POKECENTER_2F_BETA": { + "group": 21, + "height": 4, + "map": 18, + "name": "CELADON_POKECENTER_2F_BETA", + "width": 8 + }, + "CERULEAN_CITY": { + "group": 7, + "height": 18, + "map": 17, + "name": "CERULEAN_CITY", + "width": 20 + }, + "CERULEAN_GYM": { + "group": 7, + "height": 8, + "map": 6, + "name": "CERULEAN_GYM", + "width": 5 + }, + "CERULEAN_GYM_BADGE_SPEECH_HOUSE": { + "group": 7, + "height": 4, + "map": 1, + "name": "CERULEAN_GYM_BADGE_SPEECH_HOUSE", + "width": 4 + }, + "CERULEAN_MART": { + "group": 7, + "height": 4, + "map": 7, + "name": "CERULEAN_MART", + "width": 6 + }, + "CERULEAN_POKECENTER_1F": { + "group": 7, + "height": 4, + "map": 4, + "name": "CERULEAN_POKECENTER_1F", + "width": 5 + }, + "CERULEAN_POKECENTER_2F_BETA": { + "group": 7, + "height": 4, + "map": 5, + "name": "CERULEAN_POKECENTER_2F_BETA", + "width": 8 + }, + "CERULEAN_POLICE_STATION": { + "group": 7, + "height": 4, + "map": 2, + "name": "CERULEAN_POLICE_STATION", + "width": 4 + }, + "CERULEAN_TRADE_SPEECH_HOUSE": { + "group": 7, + "height": 4, + "map": 3, + "name": "CERULEAN_TRADE_SPEECH_HOUSE", + "width": 4 + }, + "CHARCOAL_KILN": { + "group": 8, + "height": 4, + "map": 2, + "name": "CHARCOAL_KILN", + "width": 4 + }, + "CHERRYGROVE_CITY": { + "group": 26, + "height": 9, + "map": 3, + "name": "CHERRYGROVE_CITY", + "width": 20 + }, + "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE": { + "group": 26, + "height": 4, + "map": 8, + "name": "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE", + "width": 4 + }, + "CHERRYGROVE_GYM_SPEECH_HOUSE": { + "group": 26, + "height": 4, + "map": 6, + "name": "CHERRYGROVE_GYM_SPEECH_HOUSE", + "width": 4 + }, + "CHERRYGROVE_MART": { + "group": 26, + "height": 4, + "map": 4, + "name": "CHERRYGROVE_MART", + "width": 6 + }, + "CHERRYGROVE_POKECENTER_1F": { + "group": 26, + "height": 4, + "map": 5, + "name": "CHERRYGROVE_POKECENTER_1F", + "width": 5 + }, + "CIANWOOD_CITY": { + "group": 22, + "height": 27, + "map": 3, + "name": "CIANWOOD_CITY", + "width": 15 + }, + "CIANWOOD_GYM": { + "group": 22, + "height": 9, + "map": 5, + "name": "CIANWOOD_GYM", + "width": 5 + }, + "CIANWOOD_LUGIA_SPEECH_HOUSE": { + "group": 22, + "height": 4, + "map": 9, + "name": "CIANWOOD_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + "CIANWOOD_PHARMACY": { + "group": 22, + "height": 4, + "map": 7, + "name": "CIANWOOD_PHARMACY", + "width": 4 + }, + "CIANWOOD_PHOTO_STUDIO": { + "group": 22, + "height": 4, + "map": 8, + "name": "CIANWOOD_PHOTO_STUDIO", + "width": 4 + }, + "CIANWOOD_POKECENTER_1F": { + "group": 22, + "height": 4, + "map": 6, + "name": "CIANWOOD_POKECENTER_1F", + "width": 5 + }, + "CINNABAR_ISLAND": { + "group": 6, + "height": 9, + "map": 8, + "name": "CINNABAR_ISLAND", + "width": 10 + }, + "CINNABAR_POKECENTER_1F": { + "group": 6, + "height": 4, + "map": 1, + "name": "CINNABAR_POKECENTER_1F", + "width": 5 + }, + "CINNABAR_POKECENTER_2F_BETA": { + "group": 6, + "height": 4, + "map": 2, + "name": "CINNABAR_POKECENTER_2F_BETA", + "width": 8 + }, + "COLOSSEUM": { + "group": 20, + "height": 4, + "map": 3, + "name": "COLOSSEUM", + "width": 5 + }, + "COPYCATS_HOUSE_1F": { + "group": 25, + "height": 4, + "map": 11, + "name": "COPYCATS_HOUSE_1F", + "width": 4 + }, + "COPYCATS_HOUSE_2F": { + "group": 25, + "height": 3, + "map": 12, + "name": "COPYCATS_HOUSE_2F", + "width": 5 + }, + "DANCE_THEATER": { + "group": 4, + "height": 7, + "map": 5, + "name": "DANCE_THEATER", + "width": 6 + }, + "DARK_CAVE_BLACKTHORN_ENTRANCE": { + "group": 3, + "height": 18, + "map": 79, + "name": "DARK_CAVE_BLACKTHORN_ENTRANCE", + "width": 15 + }, + "DARK_CAVE_VIOLET_ENTRANCE": { + "group": 3, + "height": 18, + "map": 78, + "name": "DARK_CAVE_VIOLET_ENTRANCE", + "width": 20 + }, + "DAY_CARE": { + "group": 11, + "height": 4, + "map": 24, + "name": "DAY_CARE", + "width": 5 + }, + "DAY_OF_WEEK_SIBLINGS_HOUSE": { + "group": 24, + "height": 4, + "map": 11, + "name": "DAY_OF_WEEK_SIBLINGS_HOUSE", + "width": 4 + }, + "DIGLETTS_CAVE": { + "group": 3, + "height": 18, + "map": 84, + "name": "DIGLETTS_CAVE", + "width": 10 + }, + "DRAGONS_DEN_1F": { + "group": 3, + "height": 9, + "map": 80, + "name": "DRAGONS_DEN_1F", + "width": 5 + }, + "DRAGONS_DEN_B1F": { + "group": 3, + "height": 18, + "map": 81, + "name": "DRAGONS_DEN_B1F", + "width": 20 + }, + "DRAGON_SHRINE": { + "group": 3, + "height": 5, + "map": 82, + "name": "DRAGON_SHRINE", + "width": 5 + }, + "EARLS_POKEMON_ACADEMY": { + "group": 10, + "height": 8, + "map": 8, + "name": "EARLS_POKEMON_ACADEMY", + "width": 4 + }, + "ECRUTEAK_CITY": { + "group": 4, + "height": 18, + "map": 9, + "name": "ECRUTEAK_CITY", + "width": 20 + }, + "ECRUTEAK_GYM": { + "group": 4, + "height": 9, + "map": 7, + "name": "ECRUTEAK_GYM", + "width": 5 + }, + "ECRUTEAK_ITEMFINDER_HOUSE": { + "group": 4, + "height": 4, + "map": 8, + "name": "ECRUTEAK_ITEMFINDER_HOUSE", + "width": 4 + }, + "ECRUTEAK_LUGIA_SPEECH_HOUSE": { + "group": 4, + "height": 4, + "map": 4, + "name": "ECRUTEAK_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + "ECRUTEAK_MART": { + "group": 4, + "height": 4, + "map": 6, + "name": "ECRUTEAK_MART", + "width": 6 + }, + "ECRUTEAK_POKECENTER_1F": { + "group": 4, + "height": 4, + "map": 3, + "name": "ECRUTEAK_POKECENTER_1F", + "width": 5 + }, + "ECRUTEAK_TIN_TOWER_ENTRANCE": { + "group": 4, + "height": 9, + "map": 1, + "name": "ECRUTEAK_TIN_TOWER_ENTRANCE", + "width": 10 + }, + "ELMS_HOUSE": { + "group": 24, + "height": 4, + "map": 9, + "name": "ELMS_HOUSE", + "width": 4 + }, + "ELMS_LAB": { + "group": 24, + "height": 6, + "map": 5, + "name": "ELMS_LAB", + "width": 5 + }, + "FAST_SHIP_1F": { + "group": 15, + "height": 9, + "map": 3, + "name": "FAST_SHIP_1F", + "width": 16 + }, + "FAST_SHIP_B1F": { + "group": 15, + "height": 8, + "map": 7, + "name": "FAST_SHIP_B1F", + "width": 16 + }, + "FAST_SHIP_CABINS_NNW_NNE_NE": { + "group": 15, + "height": 16, + "map": 4, + "name": "FAST_SHIP_CABINS_NNW_NNE_NE", + "width": 4 + }, + "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN": { + "group": 15, + "height": 17, + "map": 6, + "name": "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN", + "width": 5 + }, + "FAST_SHIP_CABINS_SW_SSW_NW": { + "group": 15, + "height": 16, + "map": 5, + "name": "FAST_SHIP_CABINS_SW_SSW_NW", + "width": 4 + }, + "FIGHTING_DOJO": { + "group": 25, + "height": 6, + "map": 3, + "name": "FIGHTING_DOJO", + "width": 5 + }, + "FUCHSIA_CITY": { + "group": 17, + "height": 18, + "map": 5, + "name": "FUCHSIA_CITY", + "width": 20 + }, + "FUCHSIA_GYM": { + "group": 17, + "height": 9, + "map": 8, + "name": "FUCHSIA_GYM", + "width": 5 + }, + "FUCHSIA_MART": { + "group": 17, + "height": 4, + "map": 6, + "name": "FUCHSIA_MART", + "width": 6 + }, + "FUCHSIA_POKECENTER_1F": { + "group": 17, + "height": 4, + "map": 10, + "name": "FUCHSIA_POKECENTER_1F", + "width": 5 + }, + "FUCHSIA_POKECENTER_2F_BETA": { + "group": 17, + "height": 4, + "map": 11, + "name": "FUCHSIA_POKECENTER_2F_BETA", + "width": 8 + }, + "GOLDENROD_BIKE_SHOP": { + "group": 11, + "height": 4, + "map": 4, + "name": "GOLDENROD_BIKE_SHOP", + "width": 4 + }, + "GOLDENROD_CITY": { + "group": 11, + "height": 18, + "map": 2, + "name": "GOLDENROD_CITY", + "width": 20 + }, + "GOLDENROD_DEPT_STORE_1F": { + "group": 11, + "height": 4, + "map": 11, + "name": "GOLDENROD_DEPT_STORE_1F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_2F": { + "group": 11, + "height": 4, + "map": 12, + "name": "GOLDENROD_DEPT_STORE_2F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_3F": { + "group": 11, + "height": 4, + "map": 13, + "name": "GOLDENROD_DEPT_STORE_3F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_4F": { + "group": 11, + "height": 4, + "map": 14, + "name": "GOLDENROD_DEPT_STORE_4F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_5F": { + "group": 11, + "height": 4, + "map": 15, + "name": "GOLDENROD_DEPT_STORE_5F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_6F": { + "group": 11, + "height": 4, + "map": 16, + "name": "GOLDENROD_DEPT_STORE_6F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_B1F": { + "group": 3, + "height": 9, + "map": 55, + "name": "GOLDENROD_DEPT_STORE_B1F", + "width": 10 + }, + "GOLDENROD_DEPT_STORE_ELEVATOR": { + "group": 11, + "height": 2, + "map": 17, + "name": "GOLDENROD_DEPT_STORE_ELEVATOR", + "width": 2 + }, + "GOLDENROD_DEPT_STORE_ROOF": { + "group": 11, + "height": 4, + "map": 18, + "name": "GOLDENROD_DEPT_STORE_ROOF", + "width": 8 + }, + "GOLDENROD_FLOWER_SHOP": { + "group": 11, + "height": 4, + "map": 8, + "name": "GOLDENROD_FLOWER_SHOP", + "width": 4 + }, + "GOLDENROD_GAME_CORNER": { + "group": 11, + "height": 7, + "map": 19, + "name": "GOLDENROD_GAME_CORNER", + "width": 10 + }, + "GOLDENROD_GYM": { + "group": 11, + "height": 9, + "map": 3, + "name": "GOLDENROD_GYM", + "width": 10 + }, + "GOLDENROD_HAPPINESS_RATER": { + "group": 11, + "height": 4, + "map": 5, + "name": "GOLDENROD_HAPPINESS_RATER", + "width": 4 + }, + "GOLDENROD_MAGNET_TRAIN_STATION": { + "group": 11, + "height": 9, + "map": 7, + "name": "GOLDENROD_MAGNET_TRAIN_STATION", + "width": 10 + }, + "GOLDENROD_NAME_RATER": { + "group": 11, + "height": 4, + "map": 10, + "name": "GOLDENROD_NAME_RATER", + "width": 4 + }, + "GOLDENROD_POKECENTER_1F": { + "group": 11, + "height": 4, + "map": 20, + "name": "GOLDENROD_POKECENTER_1F", + "width": 5 + }, + "GOLDENROD_PP_SPEECH_HOUSE": { + "group": 11, + "height": 4, + "map": 9, + "name": "GOLDENROD_PP_SPEECH_HOUSE", + "width": 4 + }, + "GOLDENROD_UNDERGROUND": { + "group": 3, + "height": 18, + "map": 53, + "name": "GOLDENROD_UNDERGROUND", + "width": 15 + }, + "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES": { + "group": 3, + "height": 18, + "map": 54, + "name": "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES", + "width": 15 + }, + "GOLDENROD_UNDERGROUND_WAREHOUSE": { + "group": 3, + "height": 9, + "map": 56, + "name": "GOLDENROD_UNDERGROUND_WAREHOUSE", + "width": 10 + }, + "GUIDE_GENTS_HOUSE": { + "group": 26, + "height": 4, + "map": 7, + "name": "GUIDE_GENTS_HOUSE", + "width": 4 + }, + "HALL_OF_FAME": { + "group": 16, + "height": 7, + "map": 8, + "name": "HALL_OF_FAME", + "width": 5 + }, + "ICE_PATH_1F": { + "group": 3, + "height": 18, + "map": 61, + "name": "ICE_PATH_1F", + "width": 20 + }, + "ICE_PATH_B1F": { + "group": 3, + "height": 18, + "map": 62, + "name": "ICE_PATH_B1F", + "width": 10 + }, + "ICE_PATH_B2F_BLACKTHORN_SIDE": { + "group": 3, + "height": 9, + "map": 64, + "name": "ICE_PATH_B2F_BLACKTHORN_SIDE", + "width": 5 + }, + "ICE_PATH_B2F_MAHOGANY_SIDE": { + "group": 3, + "height": 9, + "map": 63, + "name": "ICE_PATH_B2F_MAHOGANY_SIDE", + "width": 10 + }, + "ICE_PATH_B3F": { + "group": 3, + "height": 9, + "map": 65, + "name": "ICE_PATH_B3F", + "width": 10 + }, + "ILEX_FOREST": { + "group": 3, + "height": 27, + "map": 52, + "name": "ILEX_FOREST", + "width": 15 + }, + "ILEX_FOREST_AZALEA_GATE": { + "group": 11, + "height": 4, + "map": 22, + "name": "ILEX_FOREST_AZALEA_GATE", + "width": 5 + }, + "INDIGO_PLATEAU_POKECENTER_1F": { + "group": 16, + "height": 7, + "map": 2, + "name": "INDIGO_PLATEAU_POKECENTER_1F", + "width": 9 + }, + "KARENS_ROOM": { + "group": 16, + "height": 9, + "map": 6, + "name": "KARENS_ROOM", + "width": 5 + }, + "KOGAS_ROOM": { + "group": 16, + "height": 9, + "map": 4, + "name": "KOGAS_ROOM", + "width": 5 + }, + "KURTS_HOUSE": { + "group": 8, + "height": 4, + "map": 4, + "name": "KURTS_HOUSE", + "width": 8 + }, + "LAKE_OF_RAGE": { + "group": 9, + "height": 18, + "map": 6, + "name": "LAKE_OF_RAGE", + "width": 20 + }, + "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE": { + "group": 9, + "height": 4, + "map": 1, + "name": "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE", + "width": 4 + }, + "LAKE_OF_RAGE_MAGIKARP_HOUSE": { + "group": 9, + "height": 4, + "map": 2, + "name": "LAKE_OF_RAGE_MAGIKARP_HOUSE", + "width": 4 + }, + "LANCES_ROOM": { + "group": 16, + "height": 12, + "map": 7, + "name": "LANCES_ROOM", + "width": 5 + }, + "LAVENDER_MART": { + "group": 18, + "height": 4, + "map": 10, + "name": "LAVENDER_MART", + "width": 6 + }, + "LAVENDER_NAME_RATER": { + "group": 18, + "height": 4, + "map": 9, + "name": "LAVENDER_NAME_RATER", + "width": 4 + }, + "LAVENDER_POKECENTER_1F": { + "group": 18, + "height": 4, + "map": 5, + "name": "LAVENDER_POKECENTER_1F", + "width": 5 + }, + "LAVENDER_POKECENTER_2F_BETA": { + "group": 18, + "height": 4, + "map": 6, + "name": "LAVENDER_POKECENTER_2F_BETA", + "width": 8 + }, + "LAVENDER_SPEECH_HOUSE": { + "group": 18, + "height": 4, + "map": 8, + "name": "LAVENDER_SPEECH_HOUSE", + "width": 4 + }, + "LAVENDER_TOWN": { + "group": 18, + "height": 9, + "map": 4, + "name": "LAVENDER_TOWN", + "width": 10 + }, + "LAV_RADIO_TOWER_1F": { + "group": 18, + "height": 4, + "map": 12, + "name": "LAV_RADIO_TOWER_1F", + "width": 10 + }, + "MAHOGANY_GYM": { + "group": 2, + "height": 9, + "map": 2, + "name": "MAHOGANY_GYM", + "width": 5 + }, + "MAHOGANY_MART_1F": { + "group": 3, + "height": 4, + "map": 48, + "name": "MAHOGANY_MART_1F", + "width": 4 + }, + "MAHOGANY_POKECENTER_1F": { + "group": 2, + "height": 4, + "map": 3, + "name": "MAHOGANY_POKECENTER_1F", + "width": 5 + }, + "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE": { + "group": 2, + "height": 4, + "map": 1, + "name": "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE", + "width": 4 + }, + "MAHOGANY_TOWN": { + "group": 2, + "height": 9, + "map": 7, + "name": "MAHOGANY_TOWN", + "width": 10 + }, + "MANIAS_HOUSE": { + "group": 22, + "height": 4, + "map": 4, + "name": "MANIAS_HOUSE", + "width": 4 + }, + "MOBILE_BATTLE_ROOM": { + "group": 20, + "height": 4, + "map": 6, + "name": "MOBILE_BATTLE_ROOM", + "width": 5 + }, + "MOBILE_TRADE_ROOM": { + "group": 20, + "height": 4, + "map": 5, + "name": "MOBILE_TRADE_ROOM", + "width": 5 + }, + "MOUNT_MOON": { + "group": 3, + "height": 9, + "map": 85, + "name": "MOUNT_MOON", + "width": 15 + }, + "MOUNT_MOON_GIFT_SHOP": { + "group": 15, + "height": 4, + "map": 11, + "name": "MOUNT_MOON_GIFT_SHOP", + "width": 4 + }, + "MOUNT_MOON_SQUARE": { + "group": 15, + "height": 9, + "map": 10, + "name": "MOUNT_MOON_SQUARE", + "width": 15 + }, + "MOUNT_MORTAR_1F_INSIDE": { + "group": 3, + "height": 27, + "map": 58, + "name": "MOUNT_MORTAR_1F_INSIDE", + "width": 20 + }, + "MOUNT_MORTAR_1F_OUTSIDE": { + "group": 3, + "height": 18, + "map": 57, + "name": "MOUNT_MORTAR_1F_OUTSIDE", + "width": 20 + }, + "MOUNT_MORTAR_2F_INSIDE": { + "group": 3, + "height": 18, + "map": 59, + "name": "MOUNT_MORTAR_2F_INSIDE", + "width": 20 + }, + "MOUNT_MORTAR_B1F": { + "group": 3, + "height": 18, + "map": 60, + "name": "MOUNT_MORTAR_B1F", + "width": 20 + }, + "MOVE_DELETERS_HOUSE": { + "group": 5, + "height": 4, + "map": 7, + "name": "MOVE_DELETERS_HOUSE", + "width": 4 + }, + "MR_FUJIS_HOUSE": { + "group": 18, + "height": 4, + "map": 7, + "name": "MR_FUJIS_HOUSE", + "width": 5 + }, + "MR_POKEMONS_HOUSE": { + "group": 26, + "height": 4, + "map": 10, + "name": "MR_POKEMONS_HOUSE", + "width": 4 + }, + "MR_PSYCHICS_HOUSE": { + "group": 25, + "height": 4, + "map": 8, + "name": "MR_PSYCHICS_HOUSE", + "width": 4 + }, + "NATIONAL_PARK": { + "group": 3, + "height": 27, + "map": 15, + "name": "NATIONAL_PARK", + "width": 20 + }, + "NATIONAL_PARK_BUG_CONTEST": { + "group": 3, + "height": 27, + "map": 16, + "name": "NATIONAL_PARK_BUG_CONTEST", + "width": 20 + }, + "NEW_BARK_TOWN": { + "group": 24, + "height": 9, + "map": 4, + "name": "NEW_BARK_TOWN", + "width": 10 + }, + "OAKS_LAB": { + "group": 13, + "height": 6, + "map": 6, + "name": "OAKS_LAB", + "width": 5 + }, + "OLIVINE_CAFE": { + "group": 1, + "height": 4, + "map": 7, + "name": "OLIVINE_CAFE", + "width": 4 + }, + "OLIVINE_CITY": { + "group": 1, + "height": 18, + "map": 14, + "name": "OLIVINE_CITY", + "width": 20 + }, + "OLIVINE_GOOD_ROD_HOUSE": { + "group": 1, + "height": 4, + "map": 6, + "name": "OLIVINE_GOOD_ROD_HOUSE", + "width": 4 + }, + "OLIVINE_GYM": { + "group": 1, + "height": 8, + "map": 2, + "name": "OLIVINE_GYM", + "width": 5 + }, + "OLIVINE_HOUSE_BETA": { + "group": 1, + "height": 4, + "map": 4, + "name": "OLIVINE_HOUSE_BETA", + "width": 4 + }, + "OLIVINE_LIGHTHOUSE_1F": { + "group": 3, + "height": 9, + "map": 42, + "name": "OLIVINE_LIGHTHOUSE_1F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_2F": { + "group": 3, + "height": 9, + "map": 43, + "name": "OLIVINE_LIGHTHOUSE_2F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_3F": { + "group": 3, + "height": 9, + "map": 44, + "name": "OLIVINE_LIGHTHOUSE_3F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_4F": { + "group": 3, + "height": 9, + "map": 45, + "name": "OLIVINE_LIGHTHOUSE_4F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_5F": { + "group": 3, + "height": 9, + "map": 46, + "name": "OLIVINE_LIGHTHOUSE_5F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_6F": { + "group": 3, + "height": 9, + "map": 47, + "name": "OLIVINE_LIGHTHOUSE_6F", + "width": 10 + }, + "OLIVINE_MART": { + "group": 1, + "height": 4, + "map": 8, + "name": "OLIVINE_MART", + "width": 6 + }, + "OLIVINE_POKECENTER_1F": { + "group": 1, + "height": 4, + "map": 1, + "name": "OLIVINE_POKECENTER_1F", + "width": 5 + }, + "OLIVINE_PORT": { + "group": 15, + "height": 18, + "map": 1, + "name": "OLIVINE_PORT", + "width": 10 + }, + "OLIVINE_PORT_PASSAGE": { + "group": 15, + "height": 9, + "map": 8, + "name": "OLIVINE_PORT_PASSAGE", + "width": 10 + }, + "OLIVINE_PUNISHMENT_SPEECH_HOUSE": { + "group": 1, + "height": 4, + "map": 5, + "name": "OLIVINE_PUNISHMENT_SPEECH_HOUSE", + "width": 4 + }, + "OLIVINE_TIMS_HOUSE": { + "group": 1, + "height": 4, + "map": 3, + "name": "OLIVINE_TIMS_HOUSE", + "width": 4 + }, + "PALLET_TOWN": { + "group": 13, + "height": 9, + "map": 2, + "name": "PALLET_TOWN", + "width": 10 + }, + "PEWTER_CITY": { + "group": 14, + "height": 18, + "map": 2, + "name": "PEWTER_CITY", + "width": 20 + }, + "PEWTER_GYM": { + "group": 14, + "height": 7, + "map": 4, + "name": "PEWTER_GYM", + "width": 5 + }, + "PEWTER_MART": { + "group": 14, + "height": 4, + "map": 5, + "name": "PEWTER_MART", + "width": 6 + }, + "PEWTER_NIDORAN_SPEECH_HOUSE": { + "group": 14, + "height": 4, + "map": 3, + "name": "PEWTER_NIDORAN_SPEECH_HOUSE", + "width": 4 + }, + "PEWTER_POKECENTER_1F": { + "group": 14, + "height": 4, + "map": 6, + "name": "PEWTER_POKECENTER_1F", + "width": 5 + }, + "PEWTER_POKECENTER_2F_BETA": { + "group": 14, + "height": 4, + "map": 7, + "name": "PEWTER_POKECENTER_2F_BETA", + "width": 8 + }, + "PEWTER_SNOOZE_SPEECH_HOUSE": { + "group": 14, + "height": 4, + "map": 8, + "name": "PEWTER_SNOOZE_SPEECH_HOUSE", + "width": 4 + }, + "PLAYERS_HOUSE_1F": { + "group": 24, + "height": 4, + "map": 6, + "name": "PLAYERS_HOUSE_1F", + "width": 5 + }, + "PLAYERS_HOUSE_2F": { + "group": 24, + "height": 3, + "map": 7, + "name": "PLAYERS_HOUSE_2F", + "width": 4 + }, + "PLAYERS_NEIGHBORS_HOUSE": { + "group": 24, + "height": 4, + "map": 8, + "name": "PLAYERS_NEIGHBORS_HOUSE", + "width": 4 + }, + "POKECENTER_2F": { + "group": 20, + "height": 4, + "map": 1, + "name": "POKECENTER_2F", + "width": 8 + }, + "POKECOM_CENTER_ADMIN_OFFICE_MOBILE": { + "group": 11, + "height": 16, + "map": 21, + "name": "POKECOM_CENTER_ADMIN_OFFICE_MOBILE", + "width": 16 + }, + "POKEMON_FAN_CLUB": { + "group": 12, + "height": 4, + "map": 7, + "name": "POKEMON_FAN_CLUB", + "width": 5 + }, + "POKE_SEERS_HOUSE": { + "group": 22, + "height": 4, + "map": 10, + "name": "POKE_SEERS_HOUSE", + "width": 4 + }, + "POWER_PLANT": { + "group": 7, + "height": 9, + "map": 10, + "name": "POWER_PLANT", + "width": 10 + }, + "RADIO_TOWER_1F": { + "group": 3, + "height": 4, + "map": 17, + "name": "RADIO_TOWER_1F", + "width": 9 + }, + "RADIO_TOWER_2F": { + "group": 3, + "height": 4, + "map": 18, + "name": "RADIO_TOWER_2F", + "width": 9 + }, + "RADIO_TOWER_3F": { + "group": 3, + "height": 4, + "map": 19, + "name": "RADIO_TOWER_3F", + "width": 9 + }, + "RADIO_TOWER_4F": { + "group": 3, + "height": 4, + "map": 20, + "name": "RADIO_TOWER_4F", + "width": 9 + }, + "RADIO_TOWER_5F": { + "group": 3, + "height": 4, + "map": 21, + "name": "RADIO_TOWER_5F", + "width": 9 + }, + "REDS_HOUSE_1F": { + "group": 13, + "height": 4, + "map": 3, + "name": "REDS_HOUSE_1F", + "width": 4 + }, + "REDS_HOUSE_2F": { + "group": 13, + "height": 4, + "map": 4, + "name": "REDS_HOUSE_2F", + "width": 4 + }, + "ROCK_TUNNEL_1F": { + "group": 3, + "height": 18, + "map": 87, + "name": "ROCK_TUNNEL_1F", + "width": 15 + }, + "ROCK_TUNNEL_B1F": { + "group": 3, + "height": 18, + "map": 88, + "name": "ROCK_TUNNEL_B1F", + "width": 15 + }, + "ROUTE_1": { + "group": 13, + "height": 18, + "map": 1, + "name": "ROUTE_1", + "width": 10 + }, + "ROUTE_10_NORTH": { + "group": 7, + "height": 9, + "map": 14, + "name": "ROUTE_10_NORTH", + "width": 10 + }, + "ROUTE_10_POKECENTER_1F": { + "group": 7, + "height": 4, + "map": 8, + "name": "ROUTE_10_POKECENTER_1F", + "width": 5 + }, + "ROUTE_10_POKECENTER_2F_BETA": { + "group": 7, + "height": 4, + "map": 9, + "name": "ROUTE_10_POKECENTER_2F_BETA", + "width": 8 + }, + "ROUTE_10_SOUTH": { + "group": 18, + "height": 9, + "map": 3, + "name": "ROUTE_10_SOUTH", + "width": 10 + }, + "ROUTE_11": { + "group": 12, + "height": 9, + "map": 2, + "name": "ROUTE_11", + "width": 20 + }, + "ROUTE_12": { + "group": 18, + "height": 27, + "map": 2, + "name": "ROUTE_12", + "width": 10 + }, + "ROUTE_12_SUPER_ROD_HOUSE": { + "group": 18, + "height": 4, + "map": 14, + "name": "ROUTE_12_SUPER_ROD_HOUSE", + "width": 4 + }, + "ROUTE_13": { + "group": 17, + "height": 9, + "map": 1, + "name": "ROUTE_13", + "width": 30 + }, + "ROUTE_14": { + "group": 17, + "height": 18, + "map": 2, + "name": "ROUTE_14", + "width": 10 + }, + "ROUTE_15": { + "group": 17, + "height": 9, + "map": 3, + "name": "ROUTE_15", + "width": 20 + }, + "ROUTE_15_FUCHSIA_GATE": { + "group": 17, + "height": 4, + "map": 13, + "name": "ROUTE_15_FUCHSIA_GATE", + "width": 5 + }, + "ROUTE_16": { + "group": 21, + "height": 9, + "map": 2, + "name": "ROUTE_16", + "width": 10 + }, + "ROUTE_16_FUCHSIA_SPEECH_HOUSE": { + "group": 21, + "height": 4, + "map": 23, + "name": "ROUTE_16_FUCHSIA_SPEECH_HOUSE", + "width": 4 + }, + "ROUTE_16_GATE": { + "group": 21, + "height": 4, + "map": 24, + "name": "ROUTE_16_GATE", + "width": 5 + }, + "ROUTE_17": { + "group": 21, + "height": 45, + "map": 3, + "name": "ROUTE_17", + "width": 10 + }, + "ROUTE_17_ROUTE_18_GATE": { + "group": 21, + "height": 4, + "map": 26, + "name": "ROUTE_17_ROUTE_18_GATE", + "width": 5 + }, + "ROUTE_18": { + "group": 17, + "height": 9, + "map": 4, + "name": "ROUTE_18", + "width": 10 + }, + "ROUTE_19": { + "group": 6, + "height": 18, + "map": 5, + "name": "ROUTE_19", + "width": 10 + }, + "ROUTE_19_FUCHSIA_GATE": { + "group": 6, + "height": 4, + "map": 3, + "name": "ROUTE_19_FUCHSIA_GATE", + "width": 5 + }, + "ROUTE_2": { + "group": 23, + "height": 27, + "map": 1, + "name": "ROUTE_2", + "width": 10 + }, + "ROUTE_20": { + "group": 6, + "height": 9, + "map": 6, + "name": "ROUTE_20", + "width": 30 + }, + "ROUTE_21": { + "group": 6, + "height": 18, + "map": 7, + "name": "ROUTE_21", + "width": 10 + }, + "ROUTE_22": { + "group": 23, + "height": 9, + "map": 2, + "name": "ROUTE_22", + "width": 20 + }, + "ROUTE_23": { + "group": 16, + "height": 9, + "map": 1, + "name": "ROUTE_23", + "width": 10 + }, + "ROUTE_24": { + "group": 7, + "height": 9, + "map": 15, + "name": "ROUTE_24", + "width": 10 + }, + "ROUTE_25": { + "group": 7, + "height": 9, + "map": 16, + "name": "ROUTE_25", + "width": 30 + }, + "ROUTE_26": { + "group": 24, + "height": 54, + "map": 1, + "name": "ROUTE_26", + "width": 10 + }, + "ROUTE_26_HEAL_HOUSE": { + "group": 24, + "height": 4, + "map": 10, + "name": "ROUTE_26_HEAL_HOUSE", + "width": 4 + }, + "ROUTE_27": { + "group": 24, + "height": 9, + "map": 2, + "name": "ROUTE_27", + "width": 40 + }, + "ROUTE_27_SANDSTORM_HOUSE": { + "group": 24, + "height": 4, + "map": 12, + "name": "ROUTE_27_SANDSTORM_HOUSE", + "width": 4 + }, + "ROUTE_28": { + "group": 19, + "height": 9, + "map": 1, + "name": "ROUTE_28", + "width": 20 + }, + "ROUTE_28_STEEL_WING_HOUSE": { + "group": 19, + "height": 4, + "map": 4, + "name": "ROUTE_28_STEEL_WING_HOUSE", + "width": 4 + }, + "ROUTE_29": { + "group": 24, + "height": 9, + "map": 3, + "name": "ROUTE_29", + "width": 30 + }, + "ROUTE_29_ROUTE_46_GATE": { + "group": 24, + "height": 4, + "map": 13, + "name": "ROUTE_29_ROUTE_46_GATE", + "width": 5 + }, + "ROUTE_2_GATE": { + "group": 23, + "height": 4, + "map": 12, + "name": "ROUTE_2_GATE", + "width": 5 + }, + "ROUTE_2_NUGGET_HOUSE": { + "group": 23, + "height": 4, + "map": 11, + "name": "ROUTE_2_NUGGET_HOUSE", + "width": 4 + }, + "ROUTE_3": { + "group": 14, + "height": 9, + "map": 1, + "name": "ROUTE_3", + "width": 30 + }, + "ROUTE_30": { + "group": 26, + "height": 27, + "map": 1, + "name": "ROUTE_30", + "width": 10 + }, + "ROUTE_30_BERRY_HOUSE": { + "group": 26, + "height": 4, + "map": 9, + "name": "ROUTE_30_BERRY_HOUSE", + "width": 4 + }, + "ROUTE_31": { + "group": 26, + "height": 9, + "map": 2, + "name": "ROUTE_31", + "width": 20 + }, + "ROUTE_31_VIOLET_GATE": { + "group": 26, + "height": 4, + "map": 11, + "name": "ROUTE_31_VIOLET_GATE", + "width": 5 + }, + "ROUTE_32": { + "group": 10, + "height": 45, + "map": 1, + "name": "ROUTE_32", + "width": 10 + }, + "ROUTE_32_POKECENTER_1F": { + "group": 10, + "height": 4, + "map": 13, + "name": "ROUTE_32_POKECENTER_1F", + "width": 5 + }, + "ROUTE_32_RUINS_OF_ALPH_GATE": { + "group": 10, + "height": 4, + "map": 12, + "name": "ROUTE_32_RUINS_OF_ALPH_GATE", + "width": 5 + }, + "ROUTE_33": { + "group": 8, + "height": 9, + "map": 6, + "name": "ROUTE_33", + "width": 10 + }, + "ROUTE_34": { + "group": 11, + "height": 27, + "map": 1, + "name": "ROUTE_34", + "width": 10 + }, + "ROUTE_34_ILEX_FOREST_GATE": { + "group": 11, + "height": 4, + "map": 23, + "name": "ROUTE_34_ILEX_FOREST_GATE", + "width": 5 + }, + "ROUTE_35": { + "group": 10, + "height": 18, + "map": 2, + "name": "ROUTE_35", + "width": 10 + }, + "ROUTE_35_GOLDENROD_GATE": { + "group": 10, + "height": 4, + "map": 14, + "name": "ROUTE_35_GOLDENROD_GATE", + "width": 5 + }, + "ROUTE_35_NATIONAL_PARK_GATE": { + "group": 10, + "height": 4, + "map": 15, + "name": "ROUTE_35_NATIONAL_PARK_GATE", + "width": 4 + }, + "ROUTE_36": { + "group": 10, + "height": 9, + "map": 3, + "name": "ROUTE_36", + "width": 30 + }, + "ROUTE_36_NATIONAL_PARK_GATE": { + "group": 10, + "height": 4, + "map": 17, + "name": "ROUTE_36_NATIONAL_PARK_GATE", + "width": 5 + }, + "ROUTE_36_RUINS_OF_ALPH_GATE": { + "group": 10, + "height": 4, + "map": 16, + "name": "ROUTE_36_RUINS_OF_ALPH_GATE", + "width": 5 + }, + "ROUTE_37": { + "group": 10, + "height": 9, + "map": 4, + "name": "ROUTE_37", + "width": 10 + }, + "ROUTE_38": { + "group": 1, + "height": 9, + "map": 12, + "name": "ROUTE_38", + "width": 20 + }, + "ROUTE_38_ECRUTEAK_GATE": { + "group": 1, + "height": 4, + "map": 9, + "name": "ROUTE_38_ECRUTEAK_GATE", + "width": 5 + }, + "ROUTE_39": { + "group": 1, + "height": 18, + "map": 13, + "name": "ROUTE_39", + "width": 10 + }, + "ROUTE_39_BARN": { + "group": 1, + "height": 4, + "map": 10, + "name": "ROUTE_39_BARN", + "width": 4 + }, + "ROUTE_39_FARMHOUSE": { + "group": 1, + "height": 4, + "map": 11, + "name": "ROUTE_39_FARMHOUSE", + "width": 4 + }, + "ROUTE_4": { + "group": 7, + "height": 9, + "map": 12, + "name": "ROUTE_4", + "width": 20 + }, + "ROUTE_40": { + "group": 22, + "height": 18, + "map": 1, + "name": "ROUTE_40", + "width": 10 + }, + "ROUTE_40_BATTLE_TOWER_GATE": { + "group": 22, + "height": 4, + "map": 15, + "name": "ROUTE_40_BATTLE_TOWER_GATE", + "width": 5 + }, + "ROUTE_41": { + "group": 22, + "height": 27, + "map": 2, + "name": "ROUTE_41", + "width": 25 + }, + "ROUTE_42": { + "group": 2, + "height": 9, + "map": 5, + "name": "ROUTE_42", + "width": 30 + }, + "ROUTE_42_ECRUTEAK_GATE": { + "group": 2, + "height": 4, + "map": 4, + "name": "ROUTE_42_ECRUTEAK_GATE", + "width": 5 + }, + "ROUTE_43": { + "group": 9, + "height": 27, + "map": 5, + "name": "ROUTE_43", + "width": 10 + }, + "ROUTE_43_GATE": { + "group": 9, + "height": 4, + "map": 4, + "name": "ROUTE_43_GATE", + "width": 5 + }, + "ROUTE_43_MAHOGANY_GATE": { + "group": 9, + "height": 4, + "map": 3, + "name": "ROUTE_43_MAHOGANY_GATE", + "width": 5 + }, + "ROUTE_44": { + "group": 2, + "height": 9, + "map": 6, + "name": "ROUTE_44", + "width": 30 + }, + "ROUTE_45": { + "group": 5, + "height": 45, + "map": 8, + "name": "ROUTE_45", + "width": 10 + }, + "ROUTE_46": { + "group": 5, + "height": 18, + "map": 9, + "name": "ROUTE_46", + "width": 10 + }, + "ROUTE_5": { + "group": 25, + "height": 9, + "map": 1, + "name": "ROUTE_5", + "width": 10 + }, + "ROUTE_5_CLEANSE_TAG_HOUSE": { + "group": 25, + "height": 4, + "map": 15, + "name": "ROUTE_5_CLEANSE_TAG_HOUSE", + "width": 4 + }, + "ROUTE_5_SAFFRON_GATE": { + "group": 25, + "height": 4, + "map": 14, + "name": "ROUTE_5_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_5_UNDERGROUND_PATH_ENTRANCE": { + "group": 25, + "height": 4, + "map": 13, + "name": "ROUTE_5_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + "ROUTE_6": { + "group": 12, + "height": 9, + "map": 1, + "name": "ROUTE_6", + "width": 10 + }, + "ROUTE_6_SAFFRON_GATE": { + "group": 12, + "height": 4, + "map": 12, + "name": "ROUTE_6_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_6_UNDERGROUND_PATH_ENTRANCE": { + "group": 12, + "height": 4, + "map": 13, + "name": "ROUTE_6_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + "ROUTE_7": { + "group": 21, + "height": 9, + "map": 1, + "name": "ROUTE_7", + "width": 10 + }, + "ROUTE_7_SAFFRON_GATE": { + "group": 21, + "height": 4, + "map": 25, + "name": "ROUTE_7_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_8": { + "group": 18, + "height": 9, + "map": 1, + "name": "ROUTE_8", + "width": 20 + }, + "ROUTE_8_SAFFRON_GATE": { + "group": 18, + "height": 4, + "map": 13, + "name": "ROUTE_8_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_9": { + "group": 7, + "height": 9, + "map": 13, + "name": "ROUTE_9", + "width": 30 + }, + "RUINS_OF_ALPH_AERODACTYL_CHAMBER": { + "group": 3, + "height": 5, + "map": 26, + "name": "RUINS_OF_ALPH_AERODACTYL_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_AERODACTYL_ITEM_ROOM": { + "group": 3, + "height": 5, + "map": 32, + "name": "RUINS_OF_ALPH_AERODACTYL_ITEM_ROOM", + "width": 4 + }, + "RUINS_OF_ALPH_AERODACTYL_WORD_ROOM": { + "group": 3, + "height": 7, + "map": 36, + "name": "RUINS_OF_ALPH_AERODACTYL_WORD_ROOM", + "width": 10 + }, + "RUINS_OF_ALPH_HO_OH_CHAMBER": { + "group": 3, + "height": 5, + "map": 23, + "name": "RUINS_OF_ALPH_HO_OH_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_HO_OH_ITEM_ROOM": { + "group": 3, + "height": 5, + "map": 29, + "name": "RUINS_OF_ALPH_HO_OH_ITEM_ROOM", + "width": 4 + }, + "RUINS_OF_ALPH_HO_OH_WORD_ROOM": { + "group": 3, + "height": 12, + "map": 33, + "name": "RUINS_OF_ALPH_HO_OH_WORD_ROOM", + "width": 10 + }, + "RUINS_OF_ALPH_INNER_CHAMBER": { + "group": 3, + "height": 14, + "map": 27, + "name": "RUINS_OF_ALPH_INNER_CHAMBER", + "width": 10 + }, + "RUINS_OF_ALPH_KABUTO_CHAMBER": { + "group": 3, + "height": 5, + "map": 24, + "name": "RUINS_OF_ALPH_KABUTO_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_KABUTO_ITEM_ROOM": { + "group": 3, + "height": 5, + "map": 30, + "name": "RUINS_OF_ALPH_KABUTO_ITEM_ROOM", + "width": 4 + }, + "RUINS_OF_ALPH_KABUTO_WORD_ROOM": { + "group": 3, + "height": 7, + "map": 34, + "name": "RUINS_OF_ALPH_KABUTO_WORD_ROOM", + "width": 10 + }, + "RUINS_OF_ALPH_OMANYTE_CHAMBER": { + "group": 3, + "height": 5, + "map": 25, + "name": "RUINS_OF_ALPH_OMANYTE_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_OMANYTE_ITEM_ROOM": { + "group": 3, + "height": 5, + "map": 31, + "name": "RUINS_OF_ALPH_OMANYTE_ITEM_ROOM", + "width": 4 + }, + "RUINS_OF_ALPH_OMANYTE_WORD_ROOM": { + "group": 3, + "height": 8, + "map": 35, + "name": "RUINS_OF_ALPH_OMANYTE_WORD_ROOM", + "width": 10 + }, + "RUINS_OF_ALPH_OUTSIDE": { + "group": 3, + "height": 18, + "map": 22, + "name": "RUINS_OF_ALPH_OUTSIDE", + "width": 10 + }, + "RUINS_OF_ALPH_RESEARCH_CENTER": { + "group": 3, + "height": 4, + "map": 28, + "name": "RUINS_OF_ALPH_RESEARCH_CENTER", + "width": 4 + }, + "SAFARI_ZONE_BETA": { + "group": 3, + "height": 18, + "map": 90, + "name": "SAFARI_ZONE_BETA", + "width": 10 + }, + "SAFARI_ZONE_FUCHSIA_GATE_BETA": { + "group": 3, + "height": 4, + "map": 89, + "name": "SAFARI_ZONE_FUCHSIA_GATE_BETA", + "width": 5 + }, + "SAFARI_ZONE_MAIN_OFFICE": { + "group": 17, + "height": 4, + "map": 7, + "name": "SAFARI_ZONE_MAIN_OFFICE", + "width": 4 + }, + "SAFARI_ZONE_WARDENS_HOME": { + "group": 17, + "height": 4, + "map": 12, + "name": "SAFARI_ZONE_WARDENS_HOME", + "width": 5 + }, + "SAFFRON_CITY": { + "group": 25, + "height": 18, + "map": 2, + "name": "SAFFRON_CITY", + "width": 20 + }, + "SAFFRON_GYM": { + "group": 25, + "height": 9, + "map": 4, + "name": "SAFFRON_GYM", + "width": 10 + }, + "SAFFRON_MAGNET_TRAIN_STATION": { + "group": 25, + "height": 9, + "map": 9, + "name": "SAFFRON_MAGNET_TRAIN_STATION", + "width": 10 + }, + "SAFFRON_MART": { + "group": 25, + "height": 4, + "map": 5, + "name": "SAFFRON_MART", + "width": 6 + }, + "SAFFRON_POKECENTER_1F": { + "group": 25, + "height": 4, + "map": 6, + "name": "SAFFRON_POKECENTER_1F", + "width": 5 + }, + "SAFFRON_POKECENTER_2F_BETA": { + "group": 25, + "height": 4, + "map": 7, + "name": "SAFFRON_POKECENTER_2F_BETA", + "width": 8 + }, + "SEAFOAM_GYM": { + "group": 6, + "height": 4, + "map": 4, + "name": "SEAFOAM_GYM", + "width": 5 + }, + "SILPH_CO_1F": { + "group": 25, + "height": 4, + "map": 10, + "name": "SILPH_CO_1F", + "width": 8 + }, + "SILVER_CAVE_ITEM_ROOMS": { + "group": 3, + "height": 9, + "map": 77, + "name": "SILVER_CAVE_ITEM_ROOMS", + "width": 10 + }, + "SILVER_CAVE_OUTSIDE": { + "group": 19, + "height": 18, + "map": 2, + "name": "SILVER_CAVE_OUTSIDE", + "width": 20 + }, + "SILVER_CAVE_POKECENTER_1F": { + "group": 19, + "height": 4, + "map": 3, + "name": "SILVER_CAVE_POKECENTER_1F", + "width": 5 + }, + "SILVER_CAVE_ROOM_1": { + "group": 3, + "height": 18, + "map": 74, + "name": "SILVER_CAVE_ROOM_1", + "width": 10 + }, + "SILVER_CAVE_ROOM_2": { + "group": 3, + "height": 18, + "map": 75, + "name": "SILVER_CAVE_ROOM_2", + "width": 15 + }, + "SILVER_CAVE_ROOM_3": { + "group": 3, + "height": 18, + "map": 76, + "name": "SILVER_CAVE_ROOM_3", + "width": 10 + }, + "SLOWPOKE_WELL_B1F": { + "group": 3, + "height": 9, + "map": 40, + "name": "SLOWPOKE_WELL_B1F", + "width": 10 + }, + "SLOWPOKE_WELL_B2F": { + "group": 3, + "height": 9, + "map": 41, + "name": "SLOWPOKE_WELL_B2F", + "width": 10 + }, + "SOUL_HOUSE": { + "group": 18, + "height": 4, + "map": 11, + "name": "SOUL_HOUSE", + "width": 5 + }, + "SPROUT_TOWER_1F": { + "group": 3, + "height": 8, + "map": 1, + "name": "SPROUT_TOWER_1F", + "width": 10 + }, + "SPROUT_TOWER_2F": { + "group": 3, + "height": 8, + "map": 2, + "name": "SPROUT_TOWER_2F", + "width": 10 + }, + "SPROUT_TOWER_3F": { + "group": 3, + "height": 8, + "map": 3, + "name": "SPROUT_TOWER_3F", + "width": 10 + }, + "TEAM_ROCKET_BASE_B1F": { + "group": 3, + "height": 9, + "map": 49, + "name": "TEAM_ROCKET_BASE_B1F", + "width": 15 + }, + "TEAM_ROCKET_BASE_B2F": { + "group": 3, + "height": 9, + "map": 50, + "name": "TEAM_ROCKET_BASE_B2F", + "width": 15 + }, + "TEAM_ROCKET_BASE_B3F": { + "group": 3, + "height": 9, + "map": 51, + "name": "TEAM_ROCKET_BASE_B3F", + "width": 15 + }, + "TIME_CAPSULE": { + "group": 20, + "height": 4, + "map": 4, + "name": "TIME_CAPSULE", + "width": 5 + }, + "TIN_TOWER_1F": { + "group": 3, + "height": 9, + "map": 4, + "name": "TIN_TOWER_1F", + "width": 10 + }, + "TIN_TOWER_2F": { + "group": 3, + "height": 9, + "map": 5, + "name": "TIN_TOWER_2F", + "width": 10 + }, + "TIN_TOWER_3F": { + "group": 3, + "height": 9, + "map": 6, + "name": "TIN_TOWER_3F", + "width": 10 + }, + "TIN_TOWER_4F": { + "group": 3, + "height": 9, + "map": 7, + "name": "TIN_TOWER_4F", + "width": 10 + }, + "TIN_TOWER_5F": { + "group": 3, + "height": 9, + "map": 8, + "name": "TIN_TOWER_5F", + "width": 10 + }, + "TIN_TOWER_6F": { + "group": 3, + "height": 9, + "map": 9, + "name": "TIN_TOWER_6F", + "width": 10 + }, + "TIN_TOWER_7F": { + "group": 3, + "height": 9, + "map": 10, + "name": "TIN_TOWER_7F", + "width": 10 + }, + "TIN_TOWER_8F": { + "group": 3, + "height": 9, + "map": 11, + "name": "TIN_TOWER_8F", + "width": 10 + }, + "TIN_TOWER_9F": { + "group": 3, + "height": 9, + "map": 12, + "name": "TIN_TOWER_9F", + "width": 10 + }, + "TIN_TOWER_ROOF": { + "group": 15, + "height": 9, + "map": 12, + "name": "TIN_TOWER_ROOF", + "width": 10 + }, + "TOHJO_FALLS": { + "group": 3, + "height": 9, + "map": 83, + "name": "TOHJO_FALLS", + "width": 15 + }, + "TRADE_CENTER": { + "group": 20, + "height": 4, + "map": 2, + "name": "TRADE_CENTER", + "width": 5 + }, + "TRAINER_HOUSE_1F": { + "group": 23, + "height": 7, + "map": 6, + "name": "TRAINER_HOUSE_1F", + "width": 5 + }, + "TRAINER_HOUSE_B1F": { + "group": 23, + "height": 8, + "map": 7, + "name": "TRAINER_HOUSE_B1F", + "width": 5 + }, + "UNDERGROUND_PATH": { + "group": 3, + "height": 14, + "map": 86, + "name": "UNDERGROUND_PATH", + "width": 3 + }, + "UNION_CAVE_1F": { + "group": 3, + "height": 18, + "map": 37, + "name": "UNION_CAVE_1F", + "width": 10 + }, + "UNION_CAVE_B1F": { + "group": 3, + "height": 18, + "map": 38, + "name": "UNION_CAVE_B1F", + "width": 10 + }, + "UNION_CAVE_B2F": { + "group": 3, + "height": 18, + "map": 39, + "name": "UNION_CAVE_B2F", + "width": 10 + }, + "VERMILION_CITY": { + "group": 12, + "height": 18, + "map": 3, + "name": "VERMILION_CITY", + "width": 20 + }, + "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE": { + "group": 12, + "height": 4, + "map": 10, + "name": "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE", + "width": 4 + }, + "VERMILION_FISHING_SPEECH_HOUSE": { + "group": 12, + "height": 4, + "map": 4, + "name": "VERMILION_FISHING_SPEECH_HOUSE", + "width": 4 + }, + "VERMILION_GYM": { + "group": 12, + "height": 9, + "map": 11, + "name": "VERMILION_GYM", + "width": 5 + }, + "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE": { + "group": 12, + "height": 4, + "map": 8, + "name": "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE", + "width": 4 + }, + "VERMILION_MART": { + "group": 12, + "height": 4, + "map": 9, + "name": "VERMILION_MART", + "width": 6 + }, + "VERMILION_POKECENTER_1F": { + "group": 12, + "height": 4, + "map": 5, + "name": "VERMILION_POKECENTER_1F", + "width": 5 + }, + "VERMILION_POKECENTER_2F_BETA": { + "group": 12, + "height": 4, + "map": 6, + "name": "VERMILION_POKECENTER_2F_BETA", + "width": 8 + }, + "VERMILION_PORT": { + "group": 15, + "height": 18, + "map": 2, + "name": "VERMILION_PORT", + "width": 10 + }, + "VERMILION_PORT_PASSAGE": { + "group": 15, + "height": 9, + "map": 9, + "name": "VERMILION_PORT_PASSAGE", + "width": 10 + }, + "VICTORY_ROAD": { + "group": 3, + "height": 36, + "map": 91, + "name": "VICTORY_ROAD", + "width": 10 + }, + "VICTORY_ROAD_GATE": { + "group": 23, + "height": 9, + "map": 13, + "name": "VICTORY_ROAD_GATE", + "width": 10 + }, + "VIOLET_CITY": { + "group": 10, + "height": 18, + "map": 5, + "name": "VIOLET_CITY", + "width": 20 + }, + "VIOLET_GYM": { + "group": 10, + "height": 8, + "map": 7, + "name": "VIOLET_GYM", + "width": 5 + }, + "VIOLET_KYLES_HOUSE": { + "group": 10, + "height": 4, + "map": 11, + "name": "VIOLET_KYLES_HOUSE", + "width": 4 + }, + "VIOLET_MART": { + "group": 10, + "height": 4, + "map": 6, + "name": "VIOLET_MART", + "width": 6 + }, + "VIOLET_NICKNAME_SPEECH_HOUSE": { + "group": 10, + "height": 4, + "map": 9, + "name": "VIOLET_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + "VIOLET_POKECENTER_1F": { + "group": 10, + "height": 4, + "map": 10, + "name": "VIOLET_POKECENTER_1F", + "width": 5 + }, + "VIRIDIAN_CITY": { + "group": 23, + "height": 18, + "map": 3, + "name": "VIRIDIAN_CITY", + "width": 20 + }, + "VIRIDIAN_GYM": { + "group": 23, + "height": 9, + "map": 4, + "name": "VIRIDIAN_GYM", + "width": 5 + }, + "VIRIDIAN_MART": { + "group": 23, + "height": 4, + "map": 8, + "name": "VIRIDIAN_MART", + "width": 6 + }, + "VIRIDIAN_NICKNAME_SPEECH_HOUSE": { + "group": 23, + "height": 4, + "map": 5, + "name": "VIRIDIAN_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + "VIRIDIAN_POKECENTER_1F": { + "group": 23, + "height": 4, + "map": 9, + "name": "VIRIDIAN_POKECENTER_1F", + "width": 5 + }, + "VIRIDIAN_POKECENTER_2F_BETA": { + "group": 23, + "height": 4, + "map": 10, + "name": "VIRIDIAN_POKECENTER_2F_BETA", + "width": 8 + }, + "WHIRL_ISLAND_B1F": { + "group": 3, + "height": 18, + "map": 71, + "name": "WHIRL_ISLAND_B1F", + "width": 20 + }, + "WHIRL_ISLAND_B2F": { + "group": 3, + "height": 18, + "map": 72, + "name": "WHIRL_ISLAND_B2F", + "width": 10 + }, + "WHIRL_ISLAND_CAVE": { + "group": 3, + "height": 9, + "map": 69, + "name": "WHIRL_ISLAND_CAVE", + "width": 5 + }, + "WHIRL_ISLAND_LUGIA_CHAMBER": { + "group": 3, + "height": 9, + "map": 73, + "name": "WHIRL_ISLAND_LUGIA_CHAMBER", + "width": 10 + }, + "WHIRL_ISLAND_NE": { + "group": 3, + "height": 9, + "map": 67, + "name": "WHIRL_ISLAND_NE", + "width": 10 + }, + "WHIRL_ISLAND_NW": { + "group": 3, + "height": 9, + "map": 66, + "name": "WHIRL_ISLAND_NW", + "width": 5 + }, + "WHIRL_ISLAND_SE": { + "group": 3, + "height": 9, + "map": 70, + "name": "WHIRL_ISLAND_SE", + "width": 5 + }, + "WHIRL_ISLAND_SW": { + "group": 3, + "height": 9, + "map": 68, + "name": "WHIRL_ISLAND_SW", + "width": 10 + }, + "WILLS_ROOM": { + "group": 16, + "height": 9, + "map": 3, + "name": "WILLS_ROOM", + "width": 5 + }, + "WISE_TRIOS_ROOM": { + "group": 4, + "height": 4, + "map": 2, + "name": "WISE_TRIOS_ROOM", + "width": 4 + } + }, + "pokemonAssets": { + "ABRA": { + "animLabel": "AbraAnimation", + "back": "abra_back", + "backLabel": "AbraBackpic", + "bitmaskLabel": "AbraBitmasks", + "dexLabel": "AbraPokedexEntry", + "framesLabel": "AbraFrames", + "front": "abra", + "frontLabel": "AbraFrontpic", + "id": "ABRA", + "idleLabel": "AbraAnimationIdle", + "name": "ABRA" + }, + "AERODACTYL": { + "animLabel": "AerodactylAnimation", + "back": "aerodactyl_back", + "backLabel": "AerodactylBackpic", + "bitmaskLabel": "AerodactylBitmasks", + "dexLabel": "AerodactylPokedexEntry", + "framesLabel": "AerodactylFrames", + "front": "aerodactyl", + "frontLabel": "AerodactylFrontpic", + "id": "AERODACTYL", + "idleLabel": "AerodactylAnimationIdle", + "name": "AERODACTYL" + }, + "AIPOM": { + "animLabel": "AipomAnimation", + "back": "aipom_back", + "backLabel": "AipomBackpic", + "bitmaskLabel": "AipomBitmasks", + "dexLabel": "AipomPokedexEntry", + "framesLabel": "AipomFrames", + "front": "aipom", + "frontLabel": "AipomFrontpic", + "id": "AIPOM", + "idleLabel": "AipomAnimationIdle", + "name": "AIPOM" + }, + "ALAKAZAM": { + "animLabel": "AlakazamAnimation", + "back": "alakazam_back", + "backLabel": "AlakazamBackpic", + "bitmaskLabel": "AlakazamBitmasks", + "dexLabel": "AlakazamPokedexEntry", + "framesLabel": "AlakazamFrames", + "front": "alakazam", + "frontLabel": "AlakazamFrontpic", + "id": "ALAKAZAM", + "idleLabel": "AlakazamAnimationIdle", + "name": "ALAKAZAM" + }, + "AMPHAROS": { + "animLabel": "AmpharosAnimation", + "back": "ampharos_back", + "backLabel": "AmpharosBackpic", + "bitmaskLabel": "AmpharosBitmasks", + "dexLabel": "AmpharosPokedexEntry", + "framesLabel": "AmpharosFrames", + "front": "ampharos", + "frontLabel": "AmpharosFrontpic", + "id": "AMPHAROS", + "idleLabel": "AmpharosAnimationIdle", + "name": "AMPHAROS" + }, + "ARBOK": { + "animLabel": "ArbokAnimation", + "back": "arbok_back", + "backLabel": "ArbokBackpic", + "bitmaskLabel": "ArbokBitmasks", + "dexLabel": "ArbokPokedexEntry", + "framesLabel": "ArbokFrames", + "front": "arbok", + "frontLabel": "ArbokFrontpic", + "id": "ARBOK", + "idleLabel": "ArbokAnimationIdle", + "name": "ARBOK" + }, + "ARCANINE": { + "animLabel": "ArcanineAnimation", + "back": "arcanine_back", + "backLabel": "ArcanineBackpic", + "bitmaskLabel": "ArcanineBitmasks", + "dexLabel": "ArcaninePokedexEntry", + "framesLabel": "ArcanineFrames", + "front": "arcanine", + "frontLabel": "ArcanineFrontpic", + "id": "ARCANINE", + "idleLabel": "ArcanineAnimationIdle", + "name": "ARCANINE" + }, + "ARIADOS": { + "animLabel": "AriadosAnimation", + "back": "ariados_back", + "backLabel": "AriadosBackpic", + "bitmaskLabel": "AriadosBitmasks", + "dexLabel": "AriadosPokedexEntry", + "framesLabel": "AriadosFrames", + "front": "ariados", + "frontLabel": "AriadosFrontpic", + "id": "ARIADOS", + "idleLabel": "AriadosAnimationIdle", + "name": "ARIADOS" + }, + "ARTICUNO": { + "animLabel": "ArticunoAnimation", + "back": "articuno_back", + "backLabel": "ArticunoBackpic", + "bitmaskLabel": "ArticunoBitmasks", + "dexLabel": "ArticunoPokedexEntry", + "framesLabel": "ArticunoFrames", + "front": "articuno", + "frontLabel": "ArticunoFrontpic", + "id": "ARTICUNO", + "idleLabel": "ArticunoAnimationIdle", + "name": "ARTICUNO" + }, + "AZUMARILL": { + "animLabel": "AzumarillAnimation", + "back": "azumarill_back", + "backLabel": "AzumarillBackpic", + "bitmaskLabel": "AzumarillBitmasks", + "dexLabel": "AzumarillPokedexEntry", + "framesLabel": "AzumarillFrames", + "front": "azumarill", + "frontLabel": "AzumarillFrontpic", + "id": "AZUMARILL", + "idleLabel": "AzumarillAnimationIdle", + "name": "AZUMARILL" + }, + "BAYLEEF": { + "animLabel": "BayleefAnimation", + "back": "bayleef_back", + "backLabel": "BayleefBackpic", + "bitmaskLabel": "BayleefBitmasks", + "dexLabel": "BayleefPokedexEntry", + "framesLabel": "BayleefFrames", + "front": "bayleef", + "frontLabel": "BayleefFrontpic", + "id": "BAYLEEF", + "idleLabel": "BayleefAnimationIdle", + "name": "BAYLEEF" + }, + "BEEDRILL": { + "animLabel": "BeedrillAnimation", + "back": "beedrill_back", + "backLabel": "BeedrillBackpic", + "bitmaskLabel": "BeedrillBitmasks", + "dexLabel": "BeedrillPokedexEntry", + "framesLabel": "BeedrillFrames", + "front": "beedrill", + "frontLabel": "BeedrillFrontpic", + "id": "BEEDRILL", + "idleLabel": "BeedrillAnimationIdle", + "name": "BEEDRILL" + }, + "BELLOSSOM": { + "animLabel": "BellossomAnimation", + "back": "bellossom_back", + "backLabel": "BellossomBackpic", + "bitmaskLabel": "BellossomBitmasks", + "dexLabel": "BellossomPokedexEntry", + "framesLabel": "BellossomFrames", + "front": "bellossom", + "frontLabel": "BellossomFrontpic", + "id": "BELLOSSOM", + "idleLabel": "BellossomAnimationIdle", + "name": "BELLOSSOM" + }, + "BELLSPROUT": { + "animLabel": "BellsproutAnimation", + "back": "bellsprout_back", + "backLabel": "BellsproutBackpic", + "bitmaskLabel": "BellsproutBitmasks", + "dexLabel": "BellsproutPokedexEntry", + "framesLabel": "BellsproutFrames", + "front": "bellsprout", + "frontLabel": "BellsproutFrontpic", + "id": "BELLSPROUT", + "idleLabel": "BellsproutAnimationIdle", + "name": "BELLSPROUT" + }, + "BLASTOISE": { + "animLabel": "BlastoiseAnimation", + "back": "blastoise_back", + "backLabel": "BlastoiseBackpic", + "bitmaskLabel": "BlastoiseBitmasks", + "dexLabel": "BlastoisePokedexEntry", + "framesLabel": "BlastoiseFrames", + "front": "blastoise", + "frontLabel": "BlastoiseFrontpic", + "id": "BLASTOISE", + "idleLabel": "BlastoiseAnimationIdle", + "name": "BLASTOISE" + }, + "BLISSEY": { + "animLabel": "BlisseyAnimation", + "back": "blissey_back", + "backLabel": "BlisseyBackpic", + "bitmaskLabel": "BlisseyBitmasks", + "dexLabel": "BlisseyPokedexEntry", + "framesLabel": "BlisseyFrames", + "front": "blissey", + "frontLabel": "BlisseyFrontpic", + "id": "BLISSEY", + "idleLabel": "BlisseyAnimationIdle", + "name": "BLISSEY" + }, + "BULBASAUR": { + "animLabel": "BulbasaurAnimation", + "back": "bulbasaur_back", + "backLabel": "BulbasaurBackpic", + "bitmaskLabel": "BulbasaurBitmasks", + "dexLabel": "BulbasaurPokedexEntry", + "framesLabel": "BulbasaurFrames", + "front": "bulbasaur", + "frontLabel": "BulbasaurFrontpic", + "id": "BULBASAUR", + "idleLabel": "BulbasaurAnimationIdle", + "name": "BULBASAUR" + }, + "BUTTERFREE": { + "animLabel": "ButterfreeAnimation", + "back": "butterfree_back", + "backLabel": "ButterfreeBackpic", + "bitmaskLabel": "ButterfreeBitmasks", + "dexLabel": "ButterfreePokedexEntry", + "framesLabel": "ButterfreeFrames", + "front": "butterfree", + "frontLabel": "ButterfreeFrontpic", + "id": "BUTTERFREE", + "idleLabel": "ButterfreeAnimationIdle", + "name": "BUTTERFREE" + }, + "CATERPIE": { + "animLabel": "CaterpieAnimation", + "back": "caterpie_back", + "backLabel": "CaterpieBackpic", + "bitmaskLabel": "CaterpieBitmasks", + "dexLabel": "CaterpiePokedexEntry", + "framesLabel": "CaterpieFrames", + "front": "caterpie", + "frontLabel": "CaterpieFrontpic", + "id": "CATERPIE", + "idleLabel": "CaterpieAnimationIdle", + "name": "CATERPIE" + }, + "CELEBI": { + "animLabel": "CelebiAnimation", + "back": "celebi_back", + "backLabel": "CelebiBackpic", + "bitmaskLabel": "CelebiBitmasks", + "dexLabel": "CelebiPokedexEntry", + "framesLabel": "CelebiFrames", + "front": "celebi", + "frontLabel": "CelebiFrontpic", + "id": "CELEBI", + "idleLabel": "CelebiAnimationIdle", + "name": "CELEBI" + }, + "CHANSEY": { + "animLabel": "ChanseyAnimation", + "back": "chansey_back", + "backLabel": "ChanseyBackpic", + "bitmaskLabel": "ChanseyBitmasks", + "dexLabel": "ChanseyPokedexEntry", + "framesLabel": "ChanseyFrames", + "front": "chansey", + "frontLabel": "ChanseyFrontpic", + "id": "CHANSEY", + "idleLabel": "ChanseyAnimationIdle", + "name": "CHANSEY" + }, + "CHARIZARD": { + "animLabel": "CharizardAnimation", + "back": "charizard_back", + "backLabel": "CharizardBackpic", + "bitmaskLabel": "CharizardBitmasks", + "dexLabel": "CharizardPokedexEntry", + "framesLabel": "CharizardFrames", + "front": "charizard", + "frontLabel": "CharizardFrontpic", + "id": "CHARIZARD", + "idleLabel": "CharizardAnimationIdle", + "name": "CHARIZARD" + }, + "CHARMANDER": { + "animLabel": "CharmanderAnimation", + "back": "charmander_back", + "backLabel": "CharmanderBackpic", + "bitmaskLabel": "CharmanderBitmasks", + "dexLabel": "CharmanderPokedexEntry", + "framesLabel": "CharmanderFrames", + "front": "charmander", + "frontLabel": "CharmanderFrontpic", + "id": "CHARMANDER", + "idleLabel": "CharmanderAnimationIdle", + "name": "CHARMANDER" + }, + "CHARMELEON": { + "animLabel": "CharmeleonAnimation", + "back": "charmeleon_back", + "backLabel": "CharmeleonBackpic", + "bitmaskLabel": "CharmeleonBitmasks", + "dexLabel": "CharmeleonPokedexEntry", + "framesLabel": "CharmeleonFrames", + "front": "charmeleon", + "frontLabel": "CharmeleonFrontpic", + "id": "CHARMELEON", + "idleLabel": "CharmeleonAnimationIdle", + "name": "CHARMELEON" + }, + "CHIKORITA": { + "animLabel": "ChikoritaAnimation", + "back": "chikorita_back", + "backLabel": "ChikoritaBackpic", + "bitmaskLabel": "ChikoritaBitmasks", + "dexLabel": "ChikoritaPokedexEntry", + "framesLabel": "ChikoritaFrames", + "front": "chikorita", + "frontLabel": "ChikoritaFrontpic", + "id": "CHIKORITA", + "idleLabel": "ChikoritaAnimationIdle", + "name": "CHIKORITA" + }, + "CHINCHOU": { + "animLabel": "ChinchouAnimation", + "back": "chinchou_back", + "backLabel": "ChinchouBackpic", + "bitmaskLabel": "ChinchouBitmasks", + "dexLabel": "ChinchouPokedexEntry", + "framesLabel": "ChinchouFrames", + "front": "chinchou", + "frontLabel": "ChinchouFrontpic", + "id": "CHINCHOU", + "idleLabel": "ChinchouAnimationIdle", + "name": "CHINCHOU" + }, + "CLEFABLE": { + "animLabel": "ClefableAnimation", + "back": "clefable_back", + "backLabel": "ClefableBackpic", + "bitmaskLabel": "ClefableBitmasks", + "dexLabel": "ClefablePokedexEntry", + "framesLabel": "ClefableFrames", + "front": "clefable", + "frontLabel": "ClefableFrontpic", + "id": "CLEFABLE", + "idleLabel": "ClefableAnimationIdle", + "name": "CLEFABLE" + }, + "CLEFAIRY": { + "animLabel": "ClefairyAnimation", + "back": "clefairy_back", + "backLabel": "ClefairyBackpic", + "bitmaskLabel": "ClefairyBitmasks", + "dexLabel": "ClefairyPokedexEntry", + "framesLabel": "ClefairyFrames", + "front": "clefairy", + "frontLabel": "ClefairyFrontpic", + "id": "CLEFAIRY", + "idleLabel": "ClefairyAnimationIdle", + "name": "CLEFAIRY" + }, + "CLEFFA": { + "animLabel": "CleffaAnimation", + "back": "cleffa_back", + "backLabel": "CleffaBackpic", + "bitmaskLabel": "CleffaBitmasks", + "dexLabel": "CleffaPokedexEntry", + "framesLabel": "CleffaFrames", + "front": "cleffa", + "frontLabel": "CleffaFrontpic", + "id": "CLEFFA", + "idleLabel": "CleffaAnimationIdle", + "name": "CLEFFA" + }, + "CLOYSTER": { + "animLabel": "CloysterAnimation", + "back": "cloyster_back", + "backLabel": "CloysterBackpic", + "bitmaskLabel": "CloysterBitmasks", + "dexLabel": "CloysterPokedexEntry", + "framesLabel": "CloysterFrames", + "front": "cloyster", + "frontLabel": "CloysterFrontpic", + "id": "CLOYSTER", + "idleLabel": "CloysterAnimationIdle", + "name": "CLOYSTER" + }, + "CORSOLA": { + "animLabel": "CorsolaAnimation", + "back": "corsola_back", + "backLabel": "CorsolaBackpic", + "bitmaskLabel": "CorsolaBitmasks", + "dexLabel": "CorsolaPokedexEntry", + "framesLabel": "CorsolaFrames", + "front": "corsola", + "frontLabel": "CorsolaFrontpic", + "id": "CORSOLA", + "idleLabel": "CorsolaAnimationIdle", + "name": "CORSOLA" + }, + "CROBAT": { + "animLabel": "CrobatAnimation", + "back": "crobat_back", + "backLabel": "CrobatBackpic", + "bitmaskLabel": "CrobatBitmasks", + "dexLabel": "CrobatPokedexEntry", + "framesLabel": "CrobatFrames", + "front": "crobat", + "frontLabel": "CrobatFrontpic", + "id": "CROBAT", + "idleLabel": "CrobatAnimationIdle", + "name": "CROBAT" + }, + "CROCONAW": { + "animLabel": "CroconawAnimation", + "back": "croconaw_back", + "backLabel": "CroconawBackpic", + "bitmaskLabel": "CroconawBitmasks", + "dexLabel": "CroconawPokedexEntry", + "framesLabel": "CroconawFrames", + "front": "croconaw", + "frontLabel": "CroconawFrontpic", + "id": "CROCONAW", + "idleLabel": "CroconawAnimationIdle", + "name": "CROCONAW" + }, + "CUBONE": { + "animLabel": "CuboneAnimation", + "back": "cubone_back", + "backLabel": "CuboneBackpic", + "bitmaskLabel": "CuboneBitmasks", + "dexLabel": "CubonePokedexEntry", + "framesLabel": "CuboneFrames", + "front": "cubone", + "frontLabel": "CuboneFrontpic", + "id": "CUBONE", + "idleLabel": "CuboneAnimationIdle", + "name": "CUBONE" + }, + "CYNDAQUIL": { + "animLabel": "CyndaquilAnimation", + "back": "cyndaquil_back", + "backLabel": "CyndaquilBackpic", + "bitmaskLabel": "CyndaquilBitmasks", + "dexLabel": "CyndaquilPokedexEntry", + "framesLabel": "CyndaquilFrames", + "front": "cyndaquil", + "frontLabel": "CyndaquilFrontpic", + "id": "CYNDAQUIL", + "idleLabel": "CyndaquilAnimationIdle", + "name": "CYNDAQUIL" + }, + "DELIBIRD": { + "animLabel": "DelibirdAnimation", + "back": "delibird_back", + "backLabel": "DelibirdBackpic", + "bitmaskLabel": "DelibirdBitmasks", + "dexLabel": "DelibirdPokedexEntry", + "framesLabel": "DelibirdFrames", + "front": "delibird", + "frontLabel": "DelibirdFrontpic", + "id": "DELIBIRD", + "idleLabel": "DelibirdAnimationIdle", + "name": "DELIBIRD" + }, + "DEWGONG": { + "animLabel": "DewgongAnimation", + "back": "dewgong_back", + "backLabel": "DewgongBackpic", + "bitmaskLabel": "DewgongBitmasks", + "dexLabel": "DewgongPokedexEntry", + "framesLabel": "DewgongFrames", + "front": "dewgong", + "frontLabel": "DewgongFrontpic", + "id": "DEWGONG", + "idleLabel": "DewgongAnimationIdle", + "name": "DEWGONG" + }, + "DIGLETT": { + "animLabel": "DiglettAnimation", + "back": "diglett_back", + "backLabel": "DiglettBackpic", + "bitmaskLabel": "DiglettBitmasks", + "dexLabel": "DiglettPokedexEntry", + "framesLabel": "DiglettFrames", + "front": "diglett", + "frontLabel": "DiglettFrontpic", + "id": "DIGLETT", + "idleLabel": "DiglettAnimationIdle", + "name": "DIGLETT" + }, + "DITTO": { + "animLabel": "DittoAnimation", + "back": "ditto_back", + "backLabel": "DittoBackpic", + "bitmaskLabel": "DittoBitmasks", + "dexLabel": "DittoPokedexEntry", + "framesLabel": "DittoFrames", + "front": "ditto", + "frontLabel": "DittoFrontpic", + "id": "DITTO", + "idleLabel": "DittoAnimationIdle", + "name": "DITTO" + }, + "DODRIO": { + "animLabel": "DodrioAnimation", + "back": "dodrio_back", + "backLabel": "DodrioBackpic", + "bitmaskLabel": "DodrioBitmasks", + "dexLabel": "DodrioPokedexEntry", + "framesLabel": "DodrioFrames", + "front": "dodrio", + "frontLabel": "DodrioFrontpic", + "id": "DODRIO", + "idleLabel": "DodrioAnimationIdle", + "name": "DODRIO" + }, + "DODUO": { + "animLabel": "DoduoAnimation", + "back": "doduo_back", + "backLabel": "DoduoBackpic", + "bitmaskLabel": "DoduoBitmasks", + "dexLabel": "DoduoPokedexEntry", + "framesLabel": "DoduoFrames", + "front": "doduo", + "frontLabel": "DoduoFrontpic", + "id": "DODUO", + "idleLabel": "DoduoAnimationIdle", + "name": "DODUO" + }, + "DONPHAN": { + "animLabel": "DonphanAnimation", + "back": "donphan_back", + "backLabel": "DonphanBackpic", + "bitmaskLabel": "DonphanBitmasks", + "dexLabel": "DonphanPokedexEntry", + "framesLabel": "DonphanFrames", + "front": "donphan", + "frontLabel": "DonphanFrontpic", + "id": "DONPHAN", + "idleLabel": "DonphanAnimationIdle", + "name": "DONPHAN" + }, + "DRAGONAIR": { + "animLabel": "DragonairAnimation", + "back": "dragonair_back", + "backLabel": "DragonairBackpic", + "bitmaskLabel": "DragonairBitmasks", + "dexLabel": "DragonairPokedexEntry", + "framesLabel": "DragonairFrames", + "front": "dragonair", + "frontLabel": "DragonairFrontpic", + "id": "DRAGONAIR", + "idleLabel": "DragonairAnimationIdle", + "name": "DRAGONAIR" + }, + "DRAGONITE": { + "animLabel": "DragoniteAnimation", + "back": "dragonite_back", + "backLabel": "DragoniteBackpic", + "bitmaskLabel": "DragoniteBitmasks", + "dexLabel": "DragonitePokedexEntry", + "framesLabel": "DragoniteFrames", + "front": "dragonite", + "frontLabel": "DragoniteFrontpic", + "id": "DRAGONITE", + "idleLabel": "DragoniteAnimationIdle", + "name": "DRAGONITE" + }, + "DRATINI": { + "animLabel": "DratiniAnimation", + "back": "dratini_back", + "backLabel": "DratiniBackpic", + "bitmaskLabel": "DratiniBitmasks", + "dexLabel": "DratiniPokedexEntry", + "framesLabel": "DratiniFrames", + "front": "dratini", + "frontLabel": "DratiniFrontpic", + "id": "DRATINI", + "idleLabel": "DratiniAnimationIdle", + "name": "DRATINI" + }, + "DROWZEE": { + "animLabel": "DrowzeeAnimation", + "back": "drowzee_back", + "backLabel": "DrowzeeBackpic", + "bitmaskLabel": "DrowzeeBitmasks", + "dexLabel": "DrowzeePokedexEntry", + "framesLabel": "DrowzeeFrames", + "front": "drowzee", + "frontLabel": "DrowzeeFrontpic", + "id": "DROWZEE", + "idleLabel": "DrowzeeAnimationIdle", + "name": "DROWZEE" + }, + "DUGTRIO": { + "animLabel": "DugtrioAnimation", + "back": "dugtrio_back", + "backLabel": "DugtrioBackpic", + "bitmaskLabel": "DugtrioBitmasks", + "dexLabel": "DugtrioPokedexEntry", + "framesLabel": "DugtrioFrames", + "front": "dugtrio", + "frontLabel": "DugtrioFrontpic", + "id": "DUGTRIO", + "idleLabel": "DugtrioAnimationIdle", + "name": "DUGTRIO" + }, + "DUNSPARCE": { + "animLabel": "DunsparceAnimation", + "back": "dunsparce_back", + "backLabel": "DunsparceBackpic", + "bitmaskLabel": "DunsparceBitmasks", + "dexLabel": "DunsparcePokedexEntry", + "framesLabel": "DunsparceFrames", + "front": "dunsparce", + "frontLabel": "DunsparceFrontpic", + "id": "DUNSPARCE", + "idleLabel": "DunsparceAnimationIdle", + "name": "DUNSPARCE" + }, + "EEVEE": { + "animLabel": "EeveeAnimation", + "back": "eevee_back", + "backLabel": "EeveeBackpic", + "bitmaskLabel": "EeveeBitmasks", + "dexLabel": "EeveePokedexEntry", + "framesLabel": "EeveeFrames", + "front": "eevee", + "frontLabel": "EeveeFrontpic", + "id": "EEVEE", + "idleLabel": "EeveeAnimationIdle", + "name": "EEVEE" + }, + "EKANS": { + "animLabel": "EkansAnimation", + "back": "ekans_back", + "backLabel": "EkansBackpic", + "bitmaskLabel": "EkansBitmasks", + "dexLabel": "EkansPokedexEntry", + "framesLabel": "EkansFrames", + "front": "ekans", + "frontLabel": "EkansFrontpic", + "id": "EKANS", + "idleLabel": "EkansAnimationIdle", + "name": "EKANS" + }, + "ELECTABUZZ": { + "animLabel": "ElectabuzzAnimation", + "back": "electabuzz_back", + "backLabel": "ElectabuzzBackpic", + "bitmaskLabel": "ElectabuzzBitmasks", + "dexLabel": "ElectabuzzPokedexEntry", + "framesLabel": "ElectabuzzFrames", + "front": "electabuzz", + "frontLabel": "ElectabuzzFrontpic", + "id": "ELECTABUZZ", + "idleLabel": "ElectabuzzAnimationIdle", + "name": "ELECTABUZZ" + }, + "ELECTRODE": { + "animLabel": "ElectrodeAnimation", + "back": "electrode_back", + "backLabel": "ElectrodeBackpic", + "bitmaskLabel": "ElectrodeBitmasks", + "dexLabel": "ElectrodePokedexEntry", + "framesLabel": "ElectrodeFrames", + "front": "electrode", + "frontLabel": "ElectrodeFrontpic", + "id": "ELECTRODE", + "idleLabel": "ElectrodeAnimationIdle", + "name": "ELECTRODE" + }, + "ELEKID": { + "animLabel": "ElekidAnimation", + "back": "elekid_back", + "backLabel": "ElekidBackpic", + "bitmaskLabel": "ElekidBitmasks", + "dexLabel": "ElekidPokedexEntry", + "framesLabel": "ElekidFrames", + "front": "elekid", + "frontLabel": "ElekidFrontpic", + "id": "ELEKID", + "idleLabel": "ElekidAnimationIdle", + "name": "ELEKID" + }, + "ENTEI": { + "animLabel": "EnteiAnimation", + "back": "entei_back", + "backLabel": "EnteiBackpic", + "bitmaskLabel": "EnteiBitmasks", + "dexLabel": "EnteiPokedexEntry", + "framesLabel": "EnteiFrames", + "front": "entei", + "frontLabel": "EnteiFrontpic", + "id": "ENTEI", + "idleLabel": "EnteiAnimationIdle", + "name": "ENTEI" + }, + "ESPEON": { + "animLabel": "EspeonAnimation", + "back": "espeon_back", + "backLabel": "EspeonBackpic", + "bitmaskLabel": "EspeonBitmasks", + "dexLabel": "EspeonPokedexEntry", + "framesLabel": "EspeonFrames", + "front": "espeon", + "frontLabel": "EspeonFrontpic", + "id": "ESPEON", + "idleLabel": "EspeonAnimationIdle", + "name": "ESPEON" + }, + "EXEGGCUTE": { + "animLabel": "ExeggcuteAnimation", + "back": "exeggcute_back", + "backLabel": "ExeggcuteBackpic", + "bitmaskLabel": "ExeggcuteBitmasks", + "dexLabel": "ExeggcutePokedexEntry", + "framesLabel": "ExeggcuteFrames", + "front": "exeggcute", + "frontLabel": "ExeggcuteFrontpic", + "id": "EXEGGCUTE", + "idleLabel": "ExeggcuteAnimationIdle", + "name": "EXEGGCUTE" + }, + "EXEGGUTOR": { + "animLabel": "ExeggutorAnimation", + "back": "exeggutor_back", + "backLabel": "ExeggutorBackpic", + "bitmaskLabel": "ExeggutorBitmasks", + "dexLabel": "ExeggutorPokedexEntry", + "framesLabel": "ExeggutorFrames", + "front": "exeggutor", + "frontLabel": "ExeggutorFrontpic", + "id": "EXEGGUTOR", + "idleLabel": "ExeggutorAnimationIdle", + "name": "EXEGGUTOR" + }, + "FARFETCH_D": { + "animLabel": "FarfetchDAnimation", + "back": "farfetchd_back", + "backLabel": "FarfetchDBackpic", + "bitmaskLabel": "FarfetchDBitmasks", + "dexLabel": "FarfetchDPokedexEntry", + "framesLabel": "FarfetchDFrames", + "front": "farfetchd", + "frontLabel": "FarfetchDFrontpic", + "id": "FARFETCH_D", + "idleLabel": "FarfetchDAnimationIdle", + "name": "FARFETCH'D" + }, + "FEAROW": { + "animLabel": "FearowAnimation", + "back": "fearow_back", + "backLabel": "FearowBackpic", + "bitmaskLabel": "FearowBitmasks", + "dexLabel": "FearowPokedexEntry", + "framesLabel": "FearowFrames", + "front": "fearow", + "frontLabel": "FearowFrontpic", + "id": "FEAROW", + "idleLabel": "FearowAnimationIdle", + "name": "FEAROW" + }, + "FERALIGATR": { + "animLabel": "FeraligatrAnimation", + "back": "feraligatr_back", + "backLabel": "FeraligatrBackpic", + "bitmaskLabel": "FeraligatrBitmasks", + "dexLabel": "FeraligatrPokedexEntry", + "framesLabel": "FeraligatrFrames", + "front": "feraligatr", + "frontLabel": "FeraligatrFrontpic", + "id": "FERALIGATR", + "idleLabel": "FeraligatrAnimationIdle", + "name": "FERALIGATR" + }, + "FLAAFFY": { + "animLabel": "FlaaffyAnimation", + "back": "flaaffy_back", + "backLabel": "FlaaffyBackpic", + "bitmaskLabel": "FlaaffyBitmasks", + "dexLabel": "FlaaffyPokedexEntry", + "framesLabel": "FlaaffyFrames", + "front": "flaaffy", + "frontLabel": "FlaaffyFrontpic", + "id": "FLAAFFY", + "idleLabel": "FlaaffyAnimationIdle", + "name": "FLAAFFY" + }, + "FLAREON": { + "animLabel": "FlareonAnimation", + "back": "flareon_back", + "backLabel": "FlareonBackpic", + "bitmaskLabel": "FlareonBitmasks", + "dexLabel": "FlareonPokedexEntry", + "framesLabel": "FlareonFrames", + "front": "flareon", + "frontLabel": "FlareonFrontpic", + "id": "FLAREON", + "idleLabel": "FlareonAnimationIdle", + "name": "FLAREON" + }, + "FORRETRESS": { + "animLabel": "ForretressAnimation", + "back": "forretress_back", + "backLabel": "ForretressBackpic", + "bitmaskLabel": "ForretressBitmasks", + "dexLabel": "ForretressPokedexEntry", + "framesLabel": "ForretressFrames", + "front": "forretress", + "frontLabel": "ForretressFrontpic", + "id": "FORRETRESS", + "idleLabel": "ForretressAnimationIdle", + "name": "FORRETRESS" + }, + "FURRET": { + "animLabel": "FurretAnimation", + "back": "furret_back", + "backLabel": "FurretBackpic", + "bitmaskLabel": "FurretBitmasks", + "dexLabel": "FurretPokedexEntry", + "framesLabel": "FurretFrames", + "front": "furret", + "frontLabel": "FurretFrontpic", + "id": "FURRET", + "idleLabel": "FurretAnimationIdle", + "name": "FURRET" + }, + "GASTLY": { + "animLabel": "GastlyAnimation", + "back": "gastly_back", + "backLabel": "GastlyBackpic", + "bitmaskLabel": "GastlyBitmasks", + "dexLabel": "GastlyPokedexEntry", + "framesLabel": "GastlyFrames", + "front": "gastly", + "frontLabel": "GastlyFrontpic", + "id": "GASTLY", + "idleLabel": "GastlyAnimationIdle", + "name": "GASTLY" + }, + "GENGAR": { + "animLabel": "GengarAnimation", + "back": "gengar_back", + "backLabel": "GengarBackpic", + "bitmaskLabel": "GengarBitmasks", + "dexLabel": "GengarPokedexEntry", + "framesLabel": "GengarFrames", + "front": "gengar", + "frontLabel": "GengarFrontpic", + "id": "GENGAR", + "idleLabel": "GengarAnimationIdle", + "name": "GENGAR" + }, + "GEODUDE": { + "animLabel": "GeodudeAnimation", + "back": "geodude_back", + "backLabel": "GeodudeBackpic", + "bitmaskLabel": "GeodudeBitmasks", + "dexLabel": "GeodudePokedexEntry", + "framesLabel": "GeodudeFrames", + "front": "geodude", + "frontLabel": "GeodudeFrontpic", + "id": "GEODUDE", + "idleLabel": "GeodudeAnimationIdle", + "name": "GEODUDE" + }, + "GIRAFARIG": { + "animLabel": "GirafarigAnimation", + "back": "girafarig_back", + "backLabel": "GirafarigBackpic", + "bitmaskLabel": "GirafarigBitmasks", + "dexLabel": "GirafarigPokedexEntry", + "framesLabel": "GirafarigFrames", + "front": "girafarig", + "frontLabel": "GirafarigFrontpic", + "id": "GIRAFARIG", + "idleLabel": "GirafarigAnimationIdle", + "name": "GIRAFARIG" + }, + "GLIGAR": { + "animLabel": "GligarAnimation", + "back": "gligar_back", + "backLabel": "GligarBackpic", + "bitmaskLabel": "GligarBitmasks", + "dexLabel": "GligarPokedexEntry", + "framesLabel": "GligarFrames", + "front": "gligar", + "frontLabel": "GligarFrontpic", + "id": "GLIGAR", + "idleLabel": "GligarAnimationIdle", + "name": "GLIGAR" + }, + "GLOOM": { + "animLabel": "GloomAnimation", + "back": "gloom_back", + "backLabel": "GloomBackpic", + "bitmaskLabel": "GloomBitmasks", + "dexLabel": "GloomPokedexEntry", + "framesLabel": "GloomFrames", + "front": "gloom", + "frontLabel": "GloomFrontpic", + "id": "GLOOM", + "idleLabel": "GloomAnimationIdle", + "name": "GLOOM" + }, + "GOLBAT": { + "animLabel": "GolbatAnimation", + "back": "golbat_back", + "backLabel": "GolbatBackpic", + "bitmaskLabel": "GolbatBitmasks", + "dexLabel": "GolbatPokedexEntry", + "framesLabel": "GolbatFrames", + "front": "golbat", + "frontLabel": "GolbatFrontpic", + "id": "GOLBAT", + "idleLabel": "GolbatAnimationIdle", + "name": "GOLBAT" + }, + "GOLDEEN": { + "animLabel": "GoldeenAnimation", + "back": "goldeen_back", + "backLabel": "GoldeenBackpic", + "bitmaskLabel": "GoldeenBitmasks", + "dexLabel": "GoldeenPokedexEntry", + "framesLabel": "GoldeenFrames", + "front": "goldeen", + "frontLabel": "GoldeenFrontpic", + "id": "GOLDEEN", + "idleLabel": "GoldeenAnimationIdle", + "name": "GOLDEEN" + }, + "GOLDUCK": { + "animLabel": "GolduckAnimation", + "back": "golduck_back", + "backLabel": "GolduckBackpic", + "bitmaskLabel": "GolduckBitmasks", + "dexLabel": "GolduckPokedexEntry", + "framesLabel": "GolduckFrames", + "front": "golduck", + "frontLabel": "GolduckFrontpic", + "id": "GOLDUCK", + "idleLabel": "GolduckAnimationIdle", + "name": "GOLDUCK" + }, + "GOLEM": { + "animLabel": "GolemAnimation", + "back": "golem_back", + "backLabel": "GolemBackpic", + "bitmaskLabel": "GolemBitmasks", + "dexLabel": "GolemPokedexEntry", + "framesLabel": "GolemFrames", + "front": "golem", + "frontLabel": "GolemFrontpic", + "id": "GOLEM", + "idleLabel": "GolemAnimationIdle", + "name": "GOLEM" + }, + "GRANBULL": { + "animLabel": "GranbullAnimation", + "back": "granbull_back", + "backLabel": "GranbullBackpic", + "bitmaskLabel": "GranbullBitmasks", + "dexLabel": "GranbullPokedexEntry", + "framesLabel": "GranbullFrames", + "front": "granbull", + "frontLabel": "GranbullFrontpic", + "id": "GRANBULL", + "idleLabel": "GranbullAnimationIdle", + "name": "GRANBULL" + }, + "GRAVELER": { + "animLabel": "GravelerAnimation", + "back": "graveler_back", + "backLabel": "GravelerBackpic", + "bitmaskLabel": "GravelerBitmasks", + "dexLabel": "GravelerPokedexEntry", + "framesLabel": "GravelerFrames", + "front": "graveler", + "frontLabel": "GravelerFrontpic", + "id": "GRAVELER", + "idleLabel": "GravelerAnimationIdle", + "name": "GRAVELER" + }, + "GRIMER": { + "animLabel": "GrimerAnimation", + "back": "grimer_back", + "backLabel": "GrimerBackpic", + "bitmaskLabel": "GrimerBitmasks", + "dexLabel": "GrimerPokedexEntry", + "framesLabel": "GrimerFrames", + "front": "grimer", + "frontLabel": "GrimerFrontpic", + "id": "GRIMER", + "idleLabel": "GrimerAnimationIdle", + "name": "GRIMER" + }, + "GROWLITHE": { + "animLabel": "GrowlitheAnimation", + "back": "growlithe_back", + "backLabel": "GrowlitheBackpic", + "bitmaskLabel": "GrowlitheBitmasks", + "dexLabel": "GrowlithePokedexEntry", + "framesLabel": "GrowlitheFrames", + "front": "growlithe", + "frontLabel": "GrowlitheFrontpic", + "id": "GROWLITHE", + "idleLabel": "GrowlitheAnimationIdle", + "name": "GROWLITHE" + }, + "GYARADOS": { + "animLabel": "GyaradosAnimation", + "back": "gyarados_back", + "backLabel": "GyaradosBackpic", + "bitmaskLabel": "GyaradosBitmasks", + "dexLabel": "GyaradosPokedexEntry", + "framesLabel": "GyaradosFrames", + "front": "gyarados", + "frontLabel": "GyaradosFrontpic", + "id": "GYARADOS", + "idleLabel": "GyaradosAnimationIdle", + "name": "GYARADOS" + }, + "HAUNTER": { + "animLabel": "HaunterAnimation", + "back": "haunter_back", + "backLabel": "HaunterBackpic", + "bitmaskLabel": "HaunterBitmasks", + "dexLabel": "HaunterPokedexEntry", + "framesLabel": "HaunterFrames", + "front": "haunter", + "frontLabel": "HaunterFrontpic", + "id": "HAUNTER", + "idleLabel": "HaunterAnimationIdle", + "name": "HAUNTER" + }, + "HERACROSS": { + "animLabel": "HeracrossAnimation", + "back": "heracross_back", + "backLabel": "HeracrossBackpic", + "bitmaskLabel": "HeracrossBitmasks", + "dexLabel": "HeracrossPokedexEntry", + "framesLabel": "HeracrossFrames", + "front": "heracross", + "frontLabel": "HeracrossFrontpic", + "id": "HERACROSS", + "idleLabel": "HeracrossAnimationIdle", + "name": "HERACROSS" + }, + "HITMONCHAN": { + "animLabel": "HitmonchanAnimation", + "back": "hitmonchan_back", + "backLabel": "HitmonchanBackpic", + "bitmaskLabel": "HitmonchanBitmasks", + "dexLabel": "HitmonchanPokedexEntry", + "framesLabel": "HitmonchanFrames", + "front": "hitmonchan", + "frontLabel": "HitmonchanFrontpic", + "id": "HITMONCHAN", + "idleLabel": "HitmonchanAnimationIdle", + "name": "HITMONCHAN" + }, + "HITMONLEE": { + "animLabel": "HitmonleeAnimation", + "back": "hitmonlee_back", + "backLabel": "HitmonleeBackpic", + "bitmaskLabel": "HitmonleeBitmasks", + "dexLabel": "HitmonleePokedexEntry", + "framesLabel": "HitmonleeFrames", + "front": "hitmonlee", + "frontLabel": "HitmonleeFrontpic", + "id": "HITMONLEE", + "idleLabel": "HitmonleeAnimationIdle", + "name": "HITMONLEE" + }, + "HITMONTOP": { + "animLabel": "HitmontopAnimation", + "back": "hitmontop_back", + "backLabel": "HitmontopBackpic", + "bitmaskLabel": "HitmontopBitmasks", + "dexLabel": "HitmontopPokedexEntry", + "framesLabel": "HitmontopFrames", + "front": "hitmontop", + "frontLabel": "HitmontopFrontpic", + "id": "HITMONTOP", + "idleLabel": "HitmontopAnimationIdle", + "name": "HITMONTOP" + }, + "HOOTHOOT": { + "animLabel": "HoothootAnimation", + "back": "hoothoot_back", + "backLabel": "HoothootBackpic", + "bitmaskLabel": "HoothootBitmasks", + "dexLabel": "HoothootPokedexEntry", + "framesLabel": "HoothootFrames", + "front": "hoothoot", + "frontLabel": "HoothootFrontpic", + "id": "HOOTHOOT", + "idleLabel": "HoothootAnimationIdle", + "name": "HOOTHOOT" + }, + "HOPPIP": { + "animLabel": "HoppipAnimation", + "back": "hoppip_back", + "backLabel": "HoppipBackpic", + "bitmaskLabel": "HoppipBitmasks", + "dexLabel": "HoppipPokedexEntry", + "framesLabel": "HoppipFrames", + "front": "hoppip", + "frontLabel": "HoppipFrontpic", + "id": "HOPPIP", + "idleLabel": "HoppipAnimationIdle", + "name": "HOPPIP" + }, + "HORSEA": { + "animLabel": "HorseaAnimation", + "back": "horsea_back", + "backLabel": "HorseaBackpic", + "bitmaskLabel": "HorseaBitmasks", + "dexLabel": "HorseaPokedexEntry", + "framesLabel": "HorseaFrames", + "front": "horsea", + "frontLabel": "HorseaFrontpic", + "id": "HORSEA", + "idleLabel": "HorseaAnimationIdle", + "name": "HORSEA" + }, + "HOUNDOOM": { + "animLabel": "HoundoomAnimation", + "back": "houndoom_back", + "backLabel": "HoundoomBackpic", + "bitmaskLabel": "HoundoomBitmasks", + "dexLabel": "HoundoomPokedexEntry", + "framesLabel": "HoundoomFrames", + "front": "houndoom", + "frontLabel": "HoundoomFrontpic", + "id": "HOUNDOOM", + "idleLabel": "HoundoomAnimationIdle", + "name": "HOUNDOOM" + }, + "HOUNDOUR": { + "animLabel": "HoundourAnimation", + "back": "houndour_back", + "backLabel": "HoundourBackpic", + "bitmaskLabel": "HoundourBitmasks", + "dexLabel": "HoundourPokedexEntry", + "framesLabel": "HoundourFrames", + "front": "houndour", + "frontLabel": "HoundourFrontpic", + "id": "HOUNDOUR", + "idleLabel": "HoundourAnimationIdle", + "name": "HOUNDOUR" + }, + "HO_OH": { + "animLabel": "HoOhAnimation", + "back": "hooh_back", + "backLabel": "HoOhBackpic", + "bitmaskLabel": "HoOhBitmasks", + "dexLabel": "HoOhPokedexEntry", + "framesLabel": "HoOhFrames", + "front": "hooh", + "frontLabel": "HoOhFrontpic", + "id": "HO_OH", + "idleLabel": "HoOhAnimationIdle", + "name": "HO-OH" + }, + "HYPNO": { + "animLabel": "HypnoAnimation", + "back": "hypno_back", + "backLabel": "HypnoBackpic", + "bitmaskLabel": "HypnoBitmasks", + "dexLabel": "HypnoPokedexEntry", + "framesLabel": "HypnoFrames", + "front": "hypno", + "frontLabel": "HypnoFrontpic", + "id": "HYPNO", + "idleLabel": "HypnoAnimationIdle", + "name": "HYPNO" + }, + "IGGLYBUFF": { + "animLabel": "IgglybuffAnimation", + "back": "igglybuff_back", + "backLabel": "IgglybuffBackpic", + "bitmaskLabel": "IgglybuffBitmasks", + "dexLabel": "IgglybuffPokedexEntry", + "framesLabel": "IgglybuffFrames", + "front": "igglybuff", + "frontLabel": "IgglybuffFrontpic", + "id": "IGGLYBUFF", + "idleLabel": "IgglybuffAnimationIdle", + "name": "IGGLYBUFF" + }, + "IVYSAUR": { + "animLabel": "IvysaurAnimation", + "back": "ivysaur_back", + "backLabel": "IvysaurBackpic", + "bitmaskLabel": "IvysaurBitmasks", + "dexLabel": "IvysaurPokedexEntry", + "framesLabel": "IvysaurFrames", + "front": "ivysaur", + "frontLabel": "IvysaurFrontpic", + "id": "IVYSAUR", + "idleLabel": "IvysaurAnimationIdle", + "name": "IVYSAUR" + }, + "JIGGLYPUFF": { + "animLabel": "JigglypuffAnimation", + "back": "jigglypuff_back", + "backLabel": "JigglypuffBackpic", + "bitmaskLabel": "JigglypuffBitmasks", + "dexLabel": "JigglypuffPokedexEntry", + "framesLabel": "JigglypuffFrames", + "front": "jigglypuff", + "frontLabel": "JigglypuffFrontpic", + "id": "JIGGLYPUFF", + "idleLabel": "JigglypuffAnimationIdle", + "name": "JIGGLYPUFF" + }, + "JOLTEON": { + "animLabel": "JolteonAnimation", + "back": "jolteon_back", + "backLabel": "JolteonBackpic", + "bitmaskLabel": "JolteonBitmasks", + "dexLabel": "JolteonPokedexEntry", + "framesLabel": "JolteonFrames", + "front": "jolteon", + "frontLabel": "JolteonFrontpic", + "id": "JOLTEON", + "idleLabel": "JolteonAnimationIdle", + "name": "JOLTEON" + }, + "JUMPLUFF": { + "animLabel": "JumpluffAnimation", + "back": "jumpluff_back", + "backLabel": "JumpluffBackpic", + "bitmaskLabel": "JumpluffBitmasks", + "dexLabel": "JumpluffPokedexEntry", + "framesLabel": "JumpluffFrames", + "front": "jumpluff", + "frontLabel": "JumpluffFrontpic", + "id": "JUMPLUFF", + "idleLabel": "JumpluffAnimationIdle", + "name": "JUMPLUFF" + }, + "JYNX": { + "animLabel": "JynxAnimation", + "back": "jynx_back", + "backLabel": "JynxBackpic", + "bitmaskLabel": "JynxBitmasks", + "dexLabel": "JynxPokedexEntry", + "framesLabel": "JynxFrames", + "front": "jynx", + "frontLabel": "JynxFrontpic", + "id": "JYNX", + "idleLabel": "JynxAnimationIdle", + "name": "JYNX" + }, + "KABUTO": { + "animLabel": "KabutoAnimation", + "back": "kabuto_back", + "backLabel": "KabutoBackpic", + "bitmaskLabel": "KabutoBitmasks", + "dexLabel": "KabutoPokedexEntry", + "framesLabel": "KabutoFrames", + "front": "kabuto", + "frontLabel": "KabutoFrontpic", + "id": "KABUTO", + "idleLabel": "KabutoAnimationIdle", + "name": "KABUTO" + }, + "KABUTOPS": { + "animLabel": "KabutopsAnimation", + "back": "kabutops_back", + "backLabel": "KabutopsBackpic", + "bitmaskLabel": "KabutopsBitmasks", + "dexLabel": "KabutopsPokedexEntry", + "framesLabel": "KabutopsFrames", + "front": "kabutops", + "frontLabel": "KabutopsFrontpic", + "id": "KABUTOPS", + "idleLabel": "KabutopsAnimationIdle", + "name": "KABUTOPS" + }, + "KADABRA": { + "animLabel": "KadabraAnimation", + "back": "kadabra_back", + "backLabel": "KadabraBackpic", + "bitmaskLabel": "KadabraBitmasks", + "dexLabel": "KadabraPokedexEntry", + "framesLabel": "KadabraFrames", + "front": "kadabra", + "frontLabel": "KadabraFrontpic", + "id": "KADABRA", + "idleLabel": "KadabraAnimationIdle", + "name": "KADABRA" + }, + "KAKUNA": { + "animLabel": "KakunaAnimation", + "back": "kakuna_back", + "backLabel": "KakunaBackpic", + "bitmaskLabel": "KakunaBitmasks", + "dexLabel": "KakunaPokedexEntry", + "framesLabel": "KakunaFrames", + "front": "kakuna", + "frontLabel": "KakunaFrontpic", + "id": "KAKUNA", + "idleLabel": "KakunaAnimationIdle", + "name": "KAKUNA" + }, + "KANGASKHAN": { + "animLabel": "KangaskhanAnimation", + "back": "kangaskhan_back", + "backLabel": "KangaskhanBackpic", + "bitmaskLabel": "KangaskhanBitmasks", + "dexLabel": "KangaskhanPokedexEntry", + "framesLabel": "KangaskhanFrames", + "front": "kangaskhan", + "frontLabel": "KangaskhanFrontpic", + "id": "KANGASKHAN", + "idleLabel": "KangaskhanAnimationIdle", + "name": "KANGASKHAN" + }, + "KINGDRA": { + "animLabel": "KingdraAnimation", + "back": "kingdra_back", + "backLabel": "KingdraBackpic", + "bitmaskLabel": "KingdraBitmasks", + "dexLabel": "KingdraPokedexEntry", + "framesLabel": "KingdraFrames", + "front": "kingdra", + "frontLabel": "KingdraFrontpic", + "id": "KINGDRA", + "idleLabel": "KingdraAnimationIdle", + "name": "KINGDRA" + }, + "KINGLER": { + "animLabel": "KinglerAnimation", + "back": "kingler_back", + "backLabel": "KinglerBackpic", + "bitmaskLabel": "KinglerBitmasks", + "dexLabel": "KinglerPokedexEntry", + "framesLabel": "KinglerFrames", + "front": "kingler", + "frontLabel": "KinglerFrontpic", + "id": "KINGLER", + "idleLabel": "KinglerAnimationIdle", + "name": "KINGLER" + }, + "KOFFING": { + "animLabel": "KoffingAnimation", + "back": "koffing_back", + "backLabel": "KoffingBackpic", + "bitmaskLabel": "KoffingBitmasks", + "dexLabel": "KoffingPokedexEntry", + "framesLabel": "KoffingFrames", + "front": "koffing", + "frontLabel": "KoffingFrontpic", + "id": "KOFFING", + "idleLabel": "KoffingAnimationIdle", + "name": "KOFFING" + }, + "KRABBY": { + "animLabel": "KrabbyAnimation", + "back": "krabby_back", + "backLabel": "KrabbyBackpic", + "bitmaskLabel": "KrabbyBitmasks", + "dexLabel": "KrabbyPokedexEntry", + "framesLabel": "KrabbyFrames", + "front": "krabby", + "frontLabel": "KrabbyFrontpic", + "id": "KRABBY", + "idleLabel": "KrabbyAnimationIdle", + "name": "KRABBY" + }, + "LANTURN": { + "animLabel": "LanturnAnimation", + "back": "lanturn_back", + "backLabel": "LanturnBackpic", + "bitmaskLabel": "LanturnBitmasks", + "dexLabel": "LanturnPokedexEntry", + "framesLabel": "LanturnFrames", + "front": "lanturn", + "frontLabel": "LanturnFrontpic", + "id": "LANTURN", + "idleLabel": "LanturnAnimationIdle", + "name": "LANTURN" + }, + "LAPRAS": { + "animLabel": "LaprasAnimation", + "back": "lapras_back", + "backLabel": "LaprasBackpic", + "bitmaskLabel": "LaprasBitmasks", + "dexLabel": "LaprasPokedexEntry", + "framesLabel": "LaprasFrames", + "front": "lapras", + "frontLabel": "LaprasFrontpic", + "id": "LAPRAS", + "idleLabel": "LaprasAnimationIdle", + "name": "LAPRAS" + }, + "LARVITAR": { + "animLabel": "LarvitarAnimation", + "back": "larvitar_back", + "backLabel": "LarvitarBackpic", + "bitmaskLabel": "LarvitarBitmasks", + "dexLabel": "LarvitarPokedexEntry", + "framesLabel": "LarvitarFrames", + "front": "larvitar", + "frontLabel": "LarvitarFrontpic", + "id": "LARVITAR", + "idleLabel": "LarvitarAnimationIdle", + "name": "LARVITAR" + }, + "LEDIAN": { + "animLabel": "LedianAnimation", + "back": "ledian_back", + "backLabel": "LedianBackpic", + "bitmaskLabel": "LedianBitmasks", + "dexLabel": "LedianPokedexEntry", + "framesLabel": "LedianFrames", + "front": "ledian", + "frontLabel": "LedianFrontpic", + "id": "LEDIAN", + "idleLabel": "LedianAnimationIdle", + "name": "LEDIAN" + }, + "LEDYBA": { + "animLabel": "LedybaAnimation", + "back": "ledyba_back", + "backLabel": "LedybaBackpic", + "bitmaskLabel": "LedybaBitmasks", + "dexLabel": "LedybaPokedexEntry", + "framesLabel": "LedybaFrames", + "front": "ledyba", + "frontLabel": "LedybaFrontpic", + "id": "LEDYBA", + "idleLabel": "LedybaAnimationIdle", + "name": "LEDYBA" + }, + "LICKITUNG": { + "animLabel": "LickitungAnimation", + "back": "lickitung_back", + "backLabel": "LickitungBackpic", + "bitmaskLabel": "LickitungBitmasks", + "dexLabel": "LickitungPokedexEntry", + "framesLabel": "LickitungFrames", + "front": "lickitung", + "frontLabel": "LickitungFrontpic", + "id": "LICKITUNG", + "idleLabel": "LickitungAnimationIdle", + "name": "LICKITUNG" + }, + "LUGIA": { + "animLabel": "LugiaAnimation", + "back": "lugia_back", + "backLabel": "LugiaBackpic", + "bitmaskLabel": "LugiaBitmasks", + "dexLabel": "LugiaPokedexEntry", + "framesLabel": "LugiaFrames", + "front": "lugia", + "frontLabel": "LugiaFrontpic", + "id": "LUGIA", + "idleLabel": "LugiaAnimationIdle", + "name": "LUGIA" + }, + "MACHAMP": { + "animLabel": "MachampAnimation", + "back": "machamp_back", + "backLabel": "MachampBackpic", + "bitmaskLabel": "MachampBitmasks", + "dexLabel": "MachampPokedexEntry", + "framesLabel": "MachampFrames", + "front": "machamp", + "frontLabel": "MachampFrontpic", + "id": "MACHAMP", + "idleLabel": "MachampAnimationIdle", + "name": "MACHAMP" + }, + "MACHOKE": { + "animLabel": "MachokeAnimation", + "back": "machoke_back", + "backLabel": "MachokeBackpic", + "bitmaskLabel": "MachokeBitmasks", + "dexLabel": "MachokePokedexEntry", + "framesLabel": "MachokeFrames", + "front": "machoke", + "frontLabel": "MachokeFrontpic", + "id": "MACHOKE", + "idleLabel": "MachokeAnimationIdle", + "name": "MACHOKE" + }, + "MACHOP": { + "animLabel": "MachopAnimation", + "back": "machop_back", + "backLabel": "MachopBackpic", + "bitmaskLabel": "MachopBitmasks", + "dexLabel": "MachopPokedexEntry", + "framesLabel": "MachopFrames", + "front": "machop", + "frontLabel": "MachopFrontpic", + "id": "MACHOP", + "idleLabel": "MachopAnimationIdle", + "name": "MACHOP" + }, + "MAGBY": { + "animLabel": "MagbyAnimation", + "back": "magby_back", + "backLabel": "MagbyBackpic", + "bitmaskLabel": "MagbyBitmasks", + "dexLabel": "MagbyPokedexEntry", + "framesLabel": "MagbyFrames", + "front": "magby", + "frontLabel": "MagbyFrontpic", + "id": "MAGBY", + "idleLabel": "MagbyAnimationIdle", + "name": "MAGBY" + }, + "MAGCARGO": { + "animLabel": "MagcargoAnimation", + "back": "magcargo_back", + "backLabel": "MagcargoBackpic", + "bitmaskLabel": "MagcargoBitmasks", + "dexLabel": "MagcargoPokedexEntry", + "framesLabel": "MagcargoFrames", + "front": "magcargo", + "frontLabel": "MagcargoFrontpic", + "id": "MAGCARGO", + "idleLabel": "MagcargoAnimationIdle", + "name": "MAGCARGO" + }, + "MAGIKARP": { + "animLabel": "MagikarpAnimation", + "back": "magikarp_back", + "backLabel": "MagikarpBackpic", + "bitmaskLabel": "MagikarpBitmasks", + "dexLabel": "MagikarpPokedexEntry", + "framesLabel": "MagikarpFrames", + "front": "magikarp", + "frontLabel": "MagikarpFrontpic", + "id": "MAGIKARP", + "idleLabel": "MagikarpAnimationIdle", + "name": "MAGIKARP" + }, + "MAGMAR": { + "animLabel": "MagmarAnimation", + "back": "magmar_back", + "backLabel": "MagmarBackpic", + "bitmaskLabel": "MagmarBitmasks", + "dexLabel": "MagmarPokedexEntry", + "framesLabel": "MagmarFrames", + "front": "magmar", + "frontLabel": "MagmarFrontpic", + "id": "MAGMAR", + "idleLabel": "MagmarAnimationIdle", + "name": "MAGMAR" + }, + "MAGNEMITE": { + "animLabel": "MagnemiteAnimation", + "back": "magnemite_back", + "backLabel": "MagnemiteBackpic", + "bitmaskLabel": "MagnemiteBitmasks", + "dexLabel": "MagnemitePokedexEntry", + "framesLabel": "MagnemiteFrames", + "front": "magnemite", + "frontLabel": "MagnemiteFrontpic", + "id": "MAGNEMITE", + "idleLabel": "MagnemiteAnimationIdle", + "name": "MAGNEMITE" + }, + "MAGNETON": { + "animLabel": "MagnetonAnimation", + "back": "magneton_back", + "backLabel": "MagnetonBackpic", + "bitmaskLabel": "MagnetonBitmasks", + "dexLabel": "MagnetonPokedexEntry", + "framesLabel": "MagnetonFrames", + "front": "magneton", + "frontLabel": "MagnetonFrontpic", + "id": "MAGNETON", + "idleLabel": "MagnetonAnimationIdle", + "name": "MAGNETON" + }, + "MANKEY": { + "animLabel": "MankeyAnimation", + "back": "mankey_back", + "backLabel": "MankeyBackpic", + "bitmaskLabel": "MankeyBitmasks", + "dexLabel": "MankeyPokedexEntry", + "framesLabel": "MankeyFrames", + "front": "mankey", + "frontLabel": "MankeyFrontpic", + "id": "MANKEY", + "idleLabel": "MankeyAnimationIdle", + "name": "MANKEY" + }, + "MANTINE": { + "animLabel": "MantineAnimation", + "back": "mantine_back", + "backLabel": "MantineBackpic", + "bitmaskLabel": "MantineBitmasks", + "dexLabel": "MantinePokedexEntry", + "framesLabel": "MantineFrames", + "front": "mantine", + "frontLabel": "MantineFrontpic", + "id": "MANTINE", + "idleLabel": "MantineAnimationIdle", + "name": "MANTINE" + }, + "MAREEP": { + "animLabel": "MareepAnimation", + "back": "mareep_back", + "backLabel": "MareepBackpic", + "bitmaskLabel": "MareepBitmasks", + "dexLabel": "MareepPokedexEntry", + "framesLabel": "MareepFrames", + "front": "mareep", + "frontLabel": "MareepFrontpic", + "id": "MAREEP", + "idleLabel": "MareepAnimationIdle", + "name": "MAREEP" + }, + "MARILL": { + "animLabel": "MarillAnimation", + "back": "marill_back", + "backLabel": "MarillBackpic", + "bitmaskLabel": "MarillBitmasks", + "dexLabel": "MarillPokedexEntry", + "framesLabel": "MarillFrames", + "front": "marill", + "frontLabel": "MarillFrontpic", + "id": "MARILL", + "idleLabel": "MarillAnimationIdle", + "name": "MARILL" + }, + "MAROWAK": { + "animLabel": "MarowakAnimation", + "back": "marowak_back", + "backLabel": "MarowakBackpic", + "bitmaskLabel": "MarowakBitmasks", + "dexLabel": "MarowakPokedexEntry", + "framesLabel": "MarowakFrames", + "front": "marowak", + "frontLabel": "MarowakFrontpic", + "id": "MAROWAK", + "idleLabel": "MarowakAnimationIdle", + "name": "MAROWAK" + }, + "MEGANIUM": { + "animLabel": "MeganiumAnimation", + "back": "meganium_back", + "backLabel": "MeganiumBackpic", + "bitmaskLabel": "MeganiumBitmasks", + "dexLabel": "MeganiumPokedexEntry", + "framesLabel": "MeganiumFrames", + "front": "meganium", + "frontLabel": "MeganiumFrontpic", + "id": "MEGANIUM", + "idleLabel": "MeganiumAnimationIdle", + "name": "MEGANIUM" + }, + "MEOWTH": { + "animLabel": "MeowthAnimation", + "back": "meowth_back", + "backLabel": "MeowthBackpic", + "bitmaskLabel": "MeowthBitmasks", + "dexLabel": "MeowthPokedexEntry", + "framesLabel": "MeowthFrames", + "front": "meowth", + "frontLabel": "MeowthFrontpic", + "id": "MEOWTH", + "idleLabel": "MeowthAnimationIdle", + "name": "MEOWTH" + }, + "METAPOD": { + "animLabel": "MetapodAnimation", + "back": "metapod_back", + "backLabel": "MetapodBackpic", + "bitmaskLabel": "MetapodBitmasks", + "dexLabel": "MetapodPokedexEntry", + "framesLabel": "MetapodFrames", + "front": "metapod", + "frontLabel": "MetapodFrontpic", + "id": "METAPOD", + "idleLabel": "MetapodAnimationIdle", + "name": "METAPOD" + }, + "MEW": { + "animLabel": "MewAnimation", + "back": "mew_back", + "backLabel": "MewBackpic", + "bitmaskLabel": "MewBitmasks", + "dexLabel": "MewPokedexEntry", + "framesLabel": "MewFrames", + "front": "mew", + "frontLabel": "MewFrontpic", + "id": "MEW", + "idleLabel": "MewAnimationIdle", + "name": "MEW" + }, + "MEWTWO": { + "animLabel": "MewtwoAnimation", + "back": "mewtwo_back", + "backLabel": "MewtwoBackpic", + "bitmaskLabel": "MewtwoBitmasks", + "dexLabel": "MewtwoPokedexEntry", + "framesLabel": "MewtwoFrames", + "front": "mewtwo", + "frontLabel": "MewtwoFrontpic", + "id": "MEWTWO", + "idleLabel": "MewtwoAnimationIdle", + "name": "MEWTWO" + }, + "MILTANK": { + "animLabel": "MiltankAnimation", + "back": "miltank_back", + "backLabel": "MiltankBackpic", + "bitmaskLabel": "MiltankBitmasks", + "dexLabel": "MiltankPokedexEntry", + "framesLabel": "MiltankFrames", + "front": "miltank", + "frontLabel": "MiltankFrontpic", + "id": "MILTANK", + "idleLabel": "MiltankAnimationIdle", + "name": "MILTANK" + }, + "MISDREAVUS": { + "animLabel": "MisdreavusAnimation", + "back": "misdreavus_back", + "backLabel": "MisdreavusBackpic", + "bitmaskLabel": "MisdreavusBitmasks", + "dexLabel": "MisdreavusPokedexEntry", + "framesLabel": "MisdreavusFrames", + "front": "misdreavus", + "frontLabel": "MisdreavusFrontpic", + "id": "MISDREAVUS", + "idleLabel": "MisdreavusAnimationIdle", + "name": "MISDREAVUS" + }, + "MOLTRES": { + "animLabel": "MoltresAnimation", + "back": "moltres_back", + "backLabel": "MoltresBackpic", + "bitmaskLabel": "MoltresBitmasks", + "dexLabel": "MoltresPokedexEntry", + "framesLabel": "MoltresFrames", + "front": "moltres", + "frontLabel": "MoltresFrontpic", + "id": "MOLTRES", + "idleLabel": "MoltresAnimationIdle", + "name": "MOLTRES" + }, + "MR__MIME": { + "animLabel": "MrMimeAnimation", + "back": "mrmime_back", + "backLabel": "MrMimeBackpic", + "bitmaskLabel": "MrMimeBitmasks", + "dexLabel": "MrMimePokedexEntry", + "framesLabel": "MrMimeFrames", + "front": "mrmime", + "frontLabel": "MrMimeFrontpic", + "id": "MR__MIME", + "idleLabel": "MrMimeAnimationIdle", + "name": "MR.MIME" + }, + "MUK": { + "animLabel": "MukAnimation", + "back": "muk_back", + "backLabel": "MukBackpic", + "bitmaskLabel": "MukBitmasks", + "dexLabel": "MukPokedexEntry", + "framesLabel": "MukFrames", + "front": "muk", + "frontLabel": "MukFrontpic", + "id": "MUK", + "idleLabel": "MukAnimationIdle", + "name": "MUK" + }, + "MURKROW": { + "animLabel": "MurkrowAnimation", + "back": "murkrow_back", + "backLabel": "MurkrowBackpic", + "bitmaskLabel": "MurkrowBitmasks", + "dexLabel": "MurkrowPokedexEntry", + "framesLabel": "MurkrowFrames", + "front": "murkrow", + "frontLabel": "MurkrowFrontpic", + "id": "MURKROW", + "idleLabel": "MurkrowAnimationIdle", + "name": "MURKROW" + }, + "NATU": { + "animLabel": "NatuAnimation", + "back": "natu_back", + "backLabel": "NatuBackpic", + "bitmaskLabel": "NatuBitmasks", + "dexLabel": "NatuPokedexEntry", + "framesLabel": "NatuFrames", + "front": "natu", + "frontLabel": "NatuFrontpic", + "id": "NATU", + "idleLabel": "NatuAnimationIdle", + "name": "NATU" + }, + "NIDOKING": { + "animLabel": "NidokingAnimation", + "back": "nidoking_back", + "backLabel": "NidokingBackpic", + "bitmaskLabel": "NidokingBitmasks", + "dexLabel": "NidokingPokedexEntry", + "framesLabel": "NidokingFrames", + "front": "nidoking", + "frontLabel": "NidokingFrontpic", + "id": "NIDOKING", + "idleLabel": "NidokingAnimationIdle", + "name": "NIDOKING" + }, + "NIDOQUEEN": { + "animLabel": "NidoqueenAnimation", + "back": "nidoqueen_back", + "backLabel": "NidoqueenBackpic", + "bitmaskLabel": "NidoqueenBitmasks", + "dexLabel": "NidoqueenPokedexEntry", + "framesLabel": "NidoqueenFrames", + "front": "nidoqueen", + "frontLabel": "NidoqueenFrontpic", + "id": "NIDOQUEEN", + "idleLabel": "NidoqueenAnimationIdle", + "name": "NIDOQUEEN" + }, + "NIDORAN_F": { + "animLabel": "NidoranFAnimation", + "back": "nidoranf_back", + "backLabel": "NidoranFBackpic", + "bitmaskLabel": "NidoranFBitmasks", + "dexLabel": "NidoranFPokedexEntry", + "framesLabel": "NidoranFFrames", + "front": "nidoranf", + "frontLabel": "NidoranFFrontpic", + "id": "NIDORAN_F", + "idleLabel": "NidoranFAnimationIdle", + "name": "NIDORAN♀" + }, + "NIDORAN_M": { + "animLabel": "NidoranMAnimation", + "back": "nidoranm_back", + "backLabel": "NidoranMBackpic", + "bitmaskLabel": "NidoranMBitmasks", + "dexLabel": "NidoranMPokedexEntry", + "framesLabel": "NidoranMFrames", + "front": "nidoranm", + "frontLabel": "NidoranMFrontpic", + "id": "NIDORAN_M", + "idleLabel": "NidoranMAnimationIdle", + "name": "NIDORAN♂" + }, + "NIDORINA": { + "animLabel": "NidorinaAnimation", + "back": "nidorina_back", + "backLabel": "NidorinaBackpic", + "bitmaskLabel": "NidorinaBitmasks", + "dexLabel": "NidorinaPokedexEntry", + "framesLabel": "NidorinaFrames", + "front": "nidorina", + "frontLabel": "NidorinaFrontpic", + "id": "NIDORINA", + "idleLabel": "NidorinaAnimationIdle", + "name": "NIDORINA" + }, + "NIDORINO": { + "animLabel": "NidorinoAnimation", + "back": "nidorino_back", + "backLabel": "NidorinoBackpic", + "bitmaskLabel": "NidorinoBitmasks", + "dexLabel": "NidorinoPokedexEntry", + "framesLabel": "NidorinoFrames", + "front": "nidorino", + "frontLabel": "NidorinoFrontpic", + "id": "NIDORINO", + "idleLabel": "NidorinoAnimationIdle", + "name": "NIDORINO" + }, + "NINETALES": { + "animLabel": "NinetalesAnimation", + "back": "ninetales_back", + "backLabel": "NinetalesBackpic", + "bitmaskLabel": "NinetalesBitmasks", + "dexLabel": "NinetalesPokedexEntry", + "framesLabel": "NinetalesFrames", + "front": "ninetales", + "frontLabel": "NinetalesFrontpic", + "id": "NINETALES", + "idleLabel": "NinetalesAnimationIdle", + "name": "NINETALES" + }, + "NOCTOWL": { + "animLabel": "NoctowlAnimation", + "back": "noctowl_back", + "backLabel": "NoctowlBackpic", + "bitmaskLabel": "NoctowlBitmasks", + "dexLabel": "NoctowlPokedexEntry", + "framesLabel": "NoctowlFrames", + "front": "noctowl", + "frontLabel": "NoctowlFrontpic", + "id": "NOCTOWL", + "idleLabel": "NoctowlAnimationIdle", + "name": "NOCTOWL" + }, + "OCTILLERY": { + "animLabel": "OctilleryAnimation", + "back": "octillery_back", + "backLabel": "OctilleryBackpic", + "bitmaskLabel": "OctilleryBitmasks", + "dexLabel": "OctilleryPokedexEntry", + "framesLabel": "OctilleryFrames", + "front": "octillery", + "frontLabel": "OctilleryFrontpic", + "id": "OCTILLERY", + "idleLabel": "OctilleryAnimationIdle", + "name": "OCTILLERY" + }, + "ODDISH": { + "animLabel": "OddishAnimation", + "back": "oddish_back", + "backLabel": "OddishBackpic", + "bitmaskLabel": "OddishBitmasks", + "dexLabel": "OddishPokedexEntry", + "framesLabel": "OddishFrames", + "front": "oddish", + "frontLabel": "OddishFrontpic", + "id": "ODDISH", + "idleLabel": "OddishAnimationIdle", + "name": "ODDISH" + }, + "OMANYTE": { + "animLabel": "OmanyteAnimation", + "back": "omanyte_back", + "backLabel": "OmanyteBackpic", + "bitmaskLabel": "OmanyteBitmasks", + "dexLabel": "OmanytePokedexEntry", + "framesLabel": "OmanyteFrames", + "front": "omanyte", + "frontLabel": "OmanyteFrontpic", + "id": "OMANYTE", + "idleLabel": "OmanyteAnimationIdle", + "name": "OMANYTE" + }, + "OMASTAR": { + "animLabel": "OmastarAnimation", + "back": "omastar_back", + "backLabel": "OmastarBackpic", + "bitmaskLabel": "OmastarBitmasks", + "dexLabel": "OmastarPokedexEntry", + "framesLabel": "OmastarFrames", + "front": "omastar", + "frontLabel": "OmastarFrontpic", + "id": "OMASTAR", + "idleLabel": "OmastarAnimationIdle", + "name": "OMASTAR" + }, + "ONIX": { + "animLabel": "OnixAnimation", + "back": "onix_back", + "backLabel": "OnixBackpic", + "bitmaskLabel": "OnixBitmasks", + "dexLabel": "OnixPokedexEntry", + "framesLabel": "OnixFrames", + "front": "onix", + "frontLabel": "OnixFrontpic", + "id": "ONIX", + "idleLabel": "OnixAnimationIdle", + "name": "ONIX" + }, + "PARAS": { + "animLabel": "ParasAnimation", + "back": "paras_back", + "backLabel": "ParasBackpic", + "bitmaskLabel": "ParasBitmasks", + "dexLabel": "ParasPokedexEntry", + "framesLabel": "ParasFrames", + "front": "paras", + "frontLabel": "ParasFrontpic", + "id": "PARAS", + "idleLabel": "ParasAnimationIdle", + "name": "PARAS" + }, + "PARASECT": { + "animLabel": "ParasectAnimation", + "back": "parasect_back", + "backLabel": "ParasectBackpic", + "bitmaskLabel": "ParasectBitmasks", + "dexLabel": "ParasectPokedexEntry", + "framesLabel": "ParasectFrames", + "front": "parasect", + "frontLabel": "ParasectFrontpic", + "id": "PARASECT", + "idleLabel": "ParasectAnimationIdle", + "name": "PARASECT" + }, + "PERSIAN": { + "animLabel": "PersianAnimation", + "back": "persian_back", + "backLabel": "PersianBackpic", + "bitmaskLabel": "PersianBitmasks", + "dexLabel": "PersianPokedexEntry", + "framesLabel": "PersianFrames", + "front": "persian", + "frontLabel": "PersianFrontpic", + "id": "PERSIAN", + "idleLabel": "PersianAnimationIdle", + "name": "PERSIAN" + }, + "PHANPY": { + "animLabel": "PhanpyAnimation", + "back": "phanpy_back", + "backLabel": "PhanpyBackpic", + "bitmaskLabel": "PhanpyBitmasks", + "dexLabel": "PhanpyPokedexEntry", + "framesLabel": "PhanpyFrames", + "front": "phanpy", + "frontLabel": "PhanpyFrontpic", + "id": "PHANPY", + "idleLabel": "PhanpyAnimationIdle", + "name": "PHANPY" + }, + "PICHU": { + "animLabel": "PichuAnimation", + "back": "pichu_back", + "backLabel": "PichuBackpic", + "bitmaskLabel": "PichuBitmasks", + "dexLabel": "PichuPokedexEntry", + "framesLabel": "PichuFrames", + "front": "pichu", + "frontLabel": "PichuFrontpic", + "id": "PICHU", + "idleLabel": "PichuAnimationIdle", + "name": "PICHU" + }, + "PIDGEOT": { + "animLabel": "PidgeotAnimation", + "back": "pidgeot_back", + "backLabel": "PidgeotBackpic", + "bitmaskLabel": "PidgeotBitmasks", + "dexLabel": "PidgeotPokedexEntry", + "framesLabel": "PidgeotFrames", + "front": "pidgeot", + "frontLabel": "PidgeotFrontpic", + "id": "PIDGEOT", + "idleLabel": "PidgeotAnimationIdle", + "name": "PIDGEOT" + }, + "PIDGEOTTO": { + "animLabel": "PidgeottoAnimation", + "back": "pidgeotto_back", + "backLabel": "PidgeottoBackpic", + "bitmaskLabel": "PidgeottoBitmasks", + "dexLabel": "PidgeottoPokedexEntry", + "framesLabel": "PidgeottoFrames", + "front": "pidgeotto", + "frontLabel": "PidgeottoFrontpic", + "id": "PIDGEOTTO", + "idleLabel": "PidgeottoAnimationIdle", + "name": "PIDGEOTTO" + }, + "PIDGEY": { + "animLabel": "PidgeyAnimation", + "back": "pidgey_back", + "backLabel": "PidgeyBackpic", + "bitmaskLabel": "PidgeyBitmasks", + "dexLabel": "PidgeyPokedexEntry", + "framesLabel": "PidgeyFrames", + "front": "pidgey", + "frontLabel": "PidgeyFrontpic", + "id": "PIDGEY", + "idleLabel": "PidgeyAnimationIdle", + "name": "PIDGEY" + }, + "PIKACHU": { + "animLabel": "PikachuAnimation", + "back": "pikachu_back", + "backLabel": "PikachuBackpic", + "bitmaskLabel": "PikachuBitmasks", + "dexLabel": "PikachuPokedexEntry", + "framesLabel": "PikachuFrames", + "front": "pikachu", + "frontLabel": "PikachuFrontpic", + "id": "PIKACHU", + "idleLabel": "PikachuAnimationIdle", + "name": "PIKACHU" + }, + "PILOSWINE": { + "animLabel": "PiloswineAnimation", + "back": "piloswine_back", + "backLabel": "PiloswineBackpic", + "bitmaskLabel": "PiloswineBitmasks", + "dexLabel": "PiloswinePokedexEntry", + "framesLabel": "PiloswineFrames", + "front": "piloswine", + "frontLabel": "PiloswineFrontpic", + "id": "PILOSWINE", + "idleLabel": "PiloswineAnimationIdle", + "name": "PILOSWINE" + }, + "PINECO": { + "animLabel": "PinecoAnimation", + "back": "pineco_back", + "backLabel": "PinecoBackpic", + "bitmaskLabel": "PinecoBitmasks", + "dexLabel": "PinecoPokedexEntry", + "framesLabel": "PinecoFrames", + "front": "pineco", + "frontLabel": "PinecoFrontpic", + "id": "PINECO", + "idleLabel": "PinecoAnimationIdle", + "name": "PINECO" + }, + "PINSIR": { + "animLabel": "PinsirAnimation", + "back": "pinsir_back", + "backLabel": "PinsirBackpic", + "bitmaskLabel": "PinsirBitmasks", + "dexLabel": "PinsirPokedexEntry", + "framesLabel": "PinsirFrames", + "front": "pinsir", + "frontLabel": "PinsirFrontpic", + "id": "PINSIR", + "idleLabel": "PinsirAnimationIdle", + "name": "PINSIR" + }, + "POLITOED": { + "animLabel": "PolitoedAnimation", + "back": "politoed_back", + "backLabel": "PolitoedBackpic", + "bitmaskLabel": "PolitoedBitmasks", + "dexLabel": "PolitoedPokedexEntry", + "framesLabel": "PolitoedFrames", + "front": "politoed", + "frontLabel": "PolitoedFrontpic", + "id": "POLITOED", + "idleLabel": "PolitoedAnimationIdle", + "name": "POLITOED" + }, + "POLIWAG": { + "animLabel": "PoliwagAnimation", + "back": "poliwag_back", + "backLabel": "PoliwagBackpic", + "bitmaskLabel": "PoliwagBitmasks", + "dexLabel": "PoliwagPokedexEntry", + "framesLabel": "PoliwagFrames", + "front": "poliwag", + "frontLabel": "PoliwagFrontpic", + "id": "POLIWAG", + "idleLabel": "PoliwagAnimationIdle", + "name": "POLIWAG" + }, + "POLIWHIRL": { + "animLabel": "PoliwhirlAnimation", + "back": "poliwhirl_back", + "backLabel": "PoliwhirlBackpic", + "bitmaskLabel": "PoliwhirlBitmasks", + "dexLabel": "PoliwhirlPokedexEntry", + "framesLabel": "PoliwhirlFrames", + "front": "poliwhirl", + "frontLabel": "PoliwhirlFrontpic", + "id": "POLIWHIRL", + "idleLabel": "PoliwhirlAnimationIdle", + "name": "POLIWHIRL" + }, + "POLIWRATH": { + "animLabel": "PoliwrathAnimation", + "back": "poliwrath_back", + "backLabel": "PoliwrathBackpic", + "bitmaskLabel": "PoliwrathBitmasks", + "dexLabel": "PoliwrathPokedexEntry", + "framesLabel": "PoliwrathFrames", + "front": "poliwrath", + "frontLabel": "PoliwrathFrontpic", + "id": "POLIWRATH", + "idleLabel": "PoliwrathAnimationIdle", + "name": "POLIWRATH" + }, + "PONYTA": { + "animLabel": "PonytaAnimation", + "back": "ponyta_back", + "backLabel": "PonytaBackpic", + "bitmaskLabel": "PonytaBitmasks", + "dexLabel": "PonytaPokedexEntry", + "framesLabel": "PonytaFrames", + "front": "ponyta", + "frontLabel": "PonytaFrontpic", + "id": "PONYTA", + "idleLabel": "PonytaAnimationIdle", + "name": "PONYTA" + }, + "PORYGON": { + "animLabel": "PorygonAnimation", + "back": "porygon_back", + "backLabel": "PorygonBackpic", + "bitmaskLabel": "PorygonBitmasks", + "dexLabel": "PorygonPokedexEntry", + "framesLabel": "PorygonFrames", + "front": "porygon", + "frontLabel": "PorygonFrontpic", + "id": "PORYGON", + "idleLabel": "PorygonAnimationIdle", + "name": "PORYGON" + }, + "PORYGON2": { + "animLabel": "Porygon2Animation", + "back": "porygon2_back", + "backLabel": "Porygon2Backpic", + "bitmaskLabel": "Porygon2Bitmasks", + "dexLabel": "Porygon2PokedexEntry", + "framesLabel": "Porygon2Frames", + "front": "porygon2", + "frontLabel": "Porygon2Frontpic", + "id": "PORYGON2", + "idleLabel": "Porygon2AnimationIdle", + "name": "PORYGON2" + }, + "PRIMEAPE": { + "animLabel": "PrimeapeAnimation", + "back": "primeape_back", + "backLabel": "PrimeapeBackpic", + "bitmaskLabel": "PrimeapeBitmasks", + "dexLabel": "PrimeapePokedexEntry", + "framesLabel": "PrimeapeFrames", + "front": "primeape", + "frontLabel": "PrimeapeFrontpic", + "id": "PRIMEAPE", + "idleLabel": "PrimeapeAnimationIdle", + "name": "PRIMEAPE" + }, + "PSYDUCK": { + "animLabel": "PsyduckAnimation", + "back": "psyduck_back", + "backLabel": "PsyduckBackpic", + "bitmaskLabel": "PsyduckBitmasks", + "dexLabel": "PsyduckPokedexEntry", + "framesLabel": "PsyduckFrames", + "front": "psyduck", + "frontLabel": "PsyduckFrontpic", + "id": "PSYDUCK", + "idleLabel": "PsyduckAnimationIdle", + "name": "PSYDUCK" + }, + "PUPITAR": { + "animLabel": "PupitarAnimation", + "back": "pupitar_back", + "backLabel": "PupitarBackpic", + "bitmaskLabel": "PupitarBitmasks", + "dexLabel": "PupitarPokedexEntry", + "framesLabel": "PupitarFrames", + "front": "pupitar", + "frontLabel": "PupitarFrontpic", + "id": "PUPITAR", + "idleLabel": "PupitarAnimationIdle", + "name": "PUPITAR" + }, + "QUAGSIRE": { + "animLabel": "QuagsireAnimation", + "back": "quagsire_back", + "backLabel": "QuagsireBackpic", + "bitmaskLabel": "QuagsireBitmasks", + "dexLabel": "QuagsirePokedexEntry", + "framesLabel": "QuagsireFrames", + "front": "quagsire", + "frontLabel": "QuagsireFrontpic", + "id": "QUAGSIRE", + "idleLabel": "QuagsireAnimationIdle", + "name": "QUAGSIRE" + }, + "QUILAVA": { + "animLabel": "QuilavaAnimation", + "back": "quilava_back", + "backLabel": "QuilavaBackpic", + "bitmaskLabel": "QuilavaBitmasks", + "dexLabel": "QuilavaPokedexEntry", + "framesLabel": "QuilavaFrames", + "front": "quilava", + "frontLabel": "QuilavaFrontpic", + "id": "QUILAVA", + "idleLabel": "QuilavaAnimationIdle", + "name": "QUILAVA" + }, + "QWILFISH": { + "animLabel": "QwilfishAnimation", + "back": "qwilfish_back", + "backLabel": "QwilfishBackpic", + "bitmaskLabel": "QwilfishBitmasks", + "dexLabel": "QwilfishPokedexEntry", + "framesLabel": "QwilfishFrames", + "front": "qwilfish", + "frontLabel": "QwilfishFrontpic", + "id": "QWILFISH", + "idleLabel": "QwilfishAnimationIdle", + "name": "QWILFISH" + }, + "RAICHU": { + "animLabel": "RaichuAnimation", + "back": "raichu_back", + "backLabel": "RaichuBackpic", + "bitmaskLabel": "RaichuBitmasks", + "dexLabel": "RaichuPokedexEntry", + "framesLabel": "RaichuFrames", + "front": "raichu", + "frontLabel": "RaichuFrontpic", + "id": "RAICHU", + "idleLabel": "RaichuAnimationIdle", + "name": "RAICHU" + }, + "RAIKOU": { + "animLabel": "RaikouAnimation", + "back": "raikou_back", + "backLabel": "RaikouBackpic", + "bitmaskLabel": "RaikouBitmasks", + "dexLabel": "RaikouPokedexEntry", + "framesLabel": "RaikouFrames", + "front": "raikou", + "frontLabel": "RaikouFrontpic", + "id": "RAIKOU", + "idleLabel": "RaikouAnimationIdle", + "name": "RAIKOU" + }, + "RAPIDASH": { + "animLabel": "RapidashAnimation", + "back": "rapidash_back", + "backLabel": "RapidashBackpic", + "bitmaskLabel": "RapidashBitmasks", + "dexLabel": "RapidashPokedexEntry", + "framesLabel": "RapidashFrames", + "front": "rapidash", + "frontLabel": "RapidashFrontpic", + "id": "RAPIDASH", + "idleLabel": "RapidashAnimationIdle", + "name": "RAPIDASH" + }, + "RATICATE": { + "animLabel": "RaticateAnimation", + "back": "raticate_back", + "backLabel": "RaticateBackpic", + "bitmaskLabel": "RaticateBitmasks", + "dexLabel": "RaticatePokedexEntry", + "framesLabel": "RaticateFrames", + "front": "raticate", + "frontLabel": "RaticateFrontpic", + "id": "RATICATE", + "idleLabel": "RaticateAnimationIdle", + "name": "RATICATE" + }, + "RATTATA": { + "animLabel": "RattataAnimation", + "back": "rattata_back", + "backLabel": "RattataBackpic", + "bitmaskLabel": "RattataBitmasks", + "dexLabel": "RattataPokedexEntry", + "framesLabel": "RattataFrames", + "front": "rattata", + "frontLabel": "RattataFrontpic", + "id": "RATTATA", + "idleLabel": "RattataAnimationIdle", + "name": "RATTATA" + }, + "REMORAID": { + "animLabel": "RemoraidAnimation", + "back": "remoraid_back", + "backLabel": "RemoraidBackpic", + "bitmaskLabel": "RemoraidBitmasks", + "dexLabel": "RemoraidPokedexEntry", + "framesLabel": "RemoraidFrames", + "front": "remoraid", + "frontLabel": "RemoraidFrontpic", + "id": "REMORAID", + "idleLabel": "RemoraidAnimationIdle", + "name": "REMORAID" + }, + "RHYDON": { + "animLabel": "RhydonAnimation", + "back": "rhydon_back", + "backLabel": "RhydonBackpic", + "bitmaskLabel": "RhydonBitmasks", + "dexLabel": "RhydonPokedexEntry", + "framesLabel": "RhydonFrames", + "front": "rhydon", + "frontLabel": "RhydonFrontpic", + "id": "RHYDON", + "idleLabel": "RhydonAnimationIdle", + "name": "RHYDON" + }, + "RHYHORN": { + "animLabel": "RhyhornAnimation", + "back": "rhyhorn_back", + "backLabel": "RhyhornBackpic", + "bitmaskLabel": "RhyhornBitmasks", + "dexLabel": "RhyhornPokedexEntry", + "framesLabel": "RhyhornFrames", + "front": "rhyhorn", + "frontLabel": "RhyhornFrontpic", + "id": "RHYHORN", + "idleLabel": "RhyhornAnimationIdle", + "name": "RHYHORN" + }, + "SANDSHREW": { + "animLabel": "SandshrewAnimation", + "back": "sandshrew_back", + "backLabel": "SandshrewBackpic", + "bitmaskLabel": "SandshrewBitmasks", + "dexLabel": "SandshrewPokedexEntry", + "framesLabel": "SandshrewFrames", + "front": "sandshrew", + "frontLabel": "SandshrewFrontpic", + "id": "SANDSHREW", + "idleLabel": "SandshrewAnimationIdle", + "name": "SANDSHREW" + }, + "SANDSLASH": { + "animLabel": "SandslashAnimation", + "back": "sandslash_back", + "backLabel": "SandslashBackpic", + "bitmaskLabel": "SandslashBitmasks", + "dexLabel": "SandslashPokedexEntry", + "framesLabel": "SandslashFrames", + "front": "sandslash", + "frontLabel": "SandslashFrontpic", + "id": "SANDSLASH", + "idleLabel": "SandslashAnimationIdle", + "name": "SANDSLASH" + }, + "SCIZOR": { + "animLabel": "ScizorAnimation", + "back": "scizor_back", + "backLabel": "ScizorBackpic", + "bitmaskLabel": "ScizorBitmasks", + "dexLabel": "ScizorPokedexEntry", + "framesLabel": "ScizorFrames", + "front": "scizor", + "frontLabel": "ScizorFrontpic", + "id": "SCIZOR", + "idleLabel": "ScizorAnimationIdle", + "name": "SCIZOR" + }, + "SCYTHER": { + "animLabel": "ScytherAnimation", + "back": "scyther_back", + "backLabel": "ScytherBackpic", + "bitmaskLabel": "ScytherBitmasks", + "dexLabel": "ScytherPokedexEntry", + "framesLabel": "ScytherFrames", + "front": "scyther", + "frontLabel": "ScytherFrontpic", + "id": "SCYTHER", + "idleLabel": "ScytherAnimationIdle", + "name": "SCYTHER" + }, + "SEADRA": { + "animLabel": "SeadraAnimation", + "back": "seadra_back", + "backLabel": "SeadraBackpic", + "bitmaskLabel": "SeadraBitmasks", + "dexLabel": "SeadraPokedexEntry", + "framesLabel": "SeadraFrames", + "front": "seadra", + "frontLabel": "SeadraFrontpic", + "id": "SEADRA", + "idleLabel": "SeadraAnimationIdle", + "name": "SEADRA" + }, + "SEAKING": { + "animLabel": "SeakingAnimation", + "back": "seaking_back", + "backLabel": "SeakingBackpic", + "bitmaskLabel": "SeakingBitmasks", + "dexLabel": "SeakingPokedexEntry", + "framesLabel": "SeakingFrames", + "front": "seaking", + "frontLabel": "SeakingFrontpic", + "id": "SEAKING", + "idleLabel": "SeakingAnimationIdle", + "name": "SEAKING" + }, + "SEEL": { + "animLabel": "SeelAnimation", + "back": "seel_back", + "backLabel": "SeelBackpic", + "bitmaskLabel": "SeelBitmasks", + "dexLabel": "SeelPokedexEntry", + "framesLabel": "SeelFrames", + "front": "seel", + "frontLabel": "SeelFrontpic", + "id": "SEEL", + "idleLabel": "SeelAnimationIdle", + "name": "SEEL" + }, + "SENTRET": { + "animLabel": "SentretAnimation", + "back": "sentret_back", + "backLabel": "SentretBackpic", + "bitmaskLabel": "SentretBitmasks", + "dexLabel": "SentretPokedexEntry", + "framesLabel": "SentretFrames", + "front": "sentret", + "frontLabel": "SentretFrontpic", + "id": "SENTRET", + "idleLabel": "SentretAnimationIdle", + "name": "SENTRET" + }, + "SHELLDER": { + "animLabel": "ShellderAnimation", + "back": "shellder_back", + "backLabel": "ShellderBackpic", + "bitmaskLabel": "ShellderBitmasks", + "dexLabel": "ShellderPokedexEntry", + "framesLabel": "ShellderFrames", + "front": "shellder", + "frontLabel": "ShellderFrontpic", + "id": "SHELLDER", + "idleLabel": "ShellderAnimationIdle", + "name": "SHELLDER" + }, + "SHUCKLE": { + "animLabel": "ShuckleAnimation", + "back": "shuckle_back", + "backLabel": "ShuckleBackpic", + "bitmaskLabel": "ShuckleBitmasks", + "dexLabel": "ShucklePokedexEntry", + "framesLabel": "ShuckleFrames", + "front": "shuckle", + "frontLabel": "ShuckleFrontpic", + "id": "SHUCKLE", + "idleLabel": "ShuckleAnimationIdle", + "name": "SHUCKLE" + }, + "SKARMORY": { + "animLabel": "SkarmoryAnimation", + "back": "skarmory_back", + "backLabel": "SkarmoryBackpic", + "bitmaskLabel": "SkarmoryBitmasks", + "dexLabel": "SkarmoryPokedexEntry", + "framesLabel": "SkarmoryFrames", + "front": "skarmory", + "frontLabel": "SkarmoryFrontpic", + "id": "SKARMORY", + "idleLabel": "SkarmoryAnimationIdle", + "name": "SKARMORY" + }, + "SKIPLOOM": { + "animLabel": "SkiploomAnimation", + "back": "skiploom_back", + "backLabel": "SkiploomBackpic", + "bitmaskLabel": "SkiploomBitmasks", + "dexLabel": "SkiploomPokedexEntry", + "framesLabel": "SkiploomFrames", + "front": "skiploom", + "frontLabel": "SkiploomFrontpic", + "id": "SKIPLOOM", + "idleLabel": "SkiploomAnimationIdle", + "name": "SKIPLOOM" + }, + "SLOWBRO": { + "animLabel": "SlowbroAnimation", + "back": "slowbro_back", + "backLabel": "SlowbroBackpic", + "bitmaskLabel": "SlowbroBitmasks", + "dexLabel": "SlowbroPokedexEntry", + "framesLabel": "SlowbroFrames", + "front": "slowbro", + "frontLabel": "SlowbroFrontpic", + "id": "SLOWBRO", + "idleLabel": "SlowbroAnimationIdle", + "name": "SLOWBRO" + }, + "SLOWKING": { + "animLabel": "SlowkingAnimation", + "back": "slowking_back", + "backLabel": "SlowkingBackpic", + "bitmaskLabel": "SlowkingBitmasks", + "dexLabel": "SlowkingPokedexEntry", + "framesLabel": "SlowkingFrames", + "front": "slowking", + "frontLabel": "SlowkingFrontpic", + "id": "SLOWKING", + "idleLabel": "SlowkingAnimationIdle", + "name": "SLOWKING" + }, + "SLOWPOKE": { + "animLabel": "SlowpokeAnimation", + "back": "slowpoke_back", + "backLabel": "SlowpokeBackpic", + "bitmaskLabel": "SlowpokeBitmasks", + "dexLabel": "SlowpokePokedexEntry", + "framesLabel": "SlowpokeFrames", + "front": "slowpoke", + "frontLabel": "SlowpokeFrontpic", + "id": "SLOWPOKE", + "idleLabel": "SlowpokeAnimationIdle", + "name": "SLOWPOKE" + }, + "SLUGMA": { + "animLabel": "SlugmaAnimation", + "back": "slugma_back", + "backLabel": "SlugmaBackpic", + "bitmaskLabel": "SlugmaBitmasks", + "dexLabel": "SlugmaPokedexEntry", + "framesLabel": "SlugmaFrames", + "front": "slugma", + "frontLabel": "SlugmaFrontpic", + "id": "SLUGMA", + "idleLabel": "SlugmaAnimationIdle", + "name": "SLUGMA" + }, + "SMEARGLE": { + "animLabel": "SmeargleAnimation", + "back": "smeargle_back", + "backLabel": "SmeargleBackpic", + "bitmaskLabel": "SmeargleBitmasks", + "dexLabel": "SmearglePokedexEntry", + "framesLabel": "SmeargleFrames", + "front": "smeargle", + "frontLabel": "SmeargleFrontpic", + "id": "SMEARGLE", + "idleLabel": "SmeargleAnimationIdle", + "name": "SMEARGLE" + }, + "SMOOCHUM": { + "animLabel": "SmoochumAnimation", + "back": "smoochum_back", + "backLabel": "SmoochumBackpic", + "bitmaskLabel": "SmoochumBitmasks", + "dexLabel": "SmoochumPokedexEntry", + "framesLabel": "SmoochumFrames", + "front": "smoochum", + "frontLabel": "SmoochumFrontpic", + "id": "SMOOCHUM", + "idleLabel": "SmoochumAnimationIdle", + "name": "SMOOCHUM" + }, + "SNEASEL": { + "animLabel": "SneaselAnimation", + "back": "sneasel_back", + "backLabel": "SneaselBackpic", + "bitmaskLabel": "SneaselBitmasks", + "dexLabel": "SneaselPokedexEntry", + "framesLabel": "SneaselFrames", + "front": "sneasel", + "frontLabel": "SneaselFrontpic", + "id": "SNEASEL", + "idleLabel": "SneaselAnimationIdle", + "name": "SNEASEL" + }, + "SNORLAX": { + "animLabel": "SnorlaxAnimation", + "back": "snorlax_back", + "backLabel": "SnorlaxBackpic", + "bitmaskLabel": "SnorlaxBitmasks", + "dexLabel": "SnorlaxPokedexEntry", + "framesLabel": "SnorlaxFrames", + "front": "snorlax", + "frontLabel": "SnorlaxFrontpic", + "id": "SNORLAX", + "idleLabel": "SnorlaxAnimationIdle", + "name": "SNORLAX" + }, + "SNUBBULL": { + "animLabel": "SnubbullAnimation", + "back": "snubbull_back", + "backLabel": "SnubbullBackpic", + "bitmaskLabel": "SnubbullBitmasks", + "dexLabel": "SnubbullPokedexEntry", + "framesLabel": "SnubbullFrames", + "front": "snubbull", + "frontLabel": "SnubbullFrontpic", + "id": "SNUBBULL", + "idleLabel": "SnubbullAnimationIdle", + "name": "SNUBBULL" + }, + "SPEAROW": { + "animLabel": "SpearowAnimation", + "back": "spearow_back", + "backLabel": "SpearowBackpic", + "bitmaskLabel": "SpearowBitmasks", + "dexLabel": "SpearowPokedexEntry", + "framesLabel": "SpearowFrames", + "front": "spearow", + "frontLabel": "SpearowFrontpic", + "id": "SPEAROW", + "idleLabel": "SpearowAnimationIdle", + "name": "SPEAROW" + }, + "SPINARAK": { + "animLabel": "SpinarakAnimation", + "back": "spinarak_back", + "backLabel": "SpinarakBackpic", + "bitmaskLabel": "SpinarakBitmasks", + "dexLabel": "SpinarakPokedexEntry", + "framesLabel": "SpinarakFrames", + "front": "spinarak", + "frontLabel": "SpinarakFrontpic", + "id": "SPINARAK", + "idleLabel": "SpinarakAnimationIdle", + "name": "SPINARAK" + }, + "SQUIRTLE": { + "animLabel": "SquirtleAnimation", + "back": "squirtle_back", + "backLabel": "SquirtleBackpic", + "bitmaskLabel": "SquirtleBitmasks", + "dexLabel": "SquirtlePokedexEntry", + "framesLabel": "SquirtleFrames", + "front": "squirtle", + "frontLabel": "SquirtleFrontpic", + "id": "SQUIRTLE", + "idleLabel": "SquirtleAnimationIdle", + "name": "SQUIRTLE" + }, + "STANTLER": { + "animLabel": "StantlerAnimation", + "back": "stantler_back", + "backLabel": "StantlerBackpic", + "bitmaskLabel": "StantlerBitmasks", + "dexLabel": "StantlerPokedexEntry", + "framesLabel": "StantlerFrames", + "front": "stantler", + "frontLabel": "StantlerFrontpic", + "id": "STANTLER", + "idleLabel": "StantlerAnimationIdle", + "name": "STANTLER" + }, + "STARMIE": { + "animLabel": "StarmieAnimation", + "back": "starmie_back", + "backLabel": "StarmieBackpic", + "bitmaskLabel": "StarmieBitmasks", + "dexLabel": "StarmiePokedexEntry", + "framesLabel": "StarmieFrames", + "front": "starmie", + "frontLabel": "StarmieFrontpic", + "id": "STARMIE", + "idleLabel": "StarmieAnimationIdle", + "name": "STARMIE" + }, + "STARYU": { + "animLabel": "StaryuAnimation", + "back": "staryu_back", + "backLabel": "StaryuBackpic", + "bitmaskLabel": "StaryuBitmasks", + "dexLabel": "StaryuPokedexEntry", + "framesLabel": "StaryuFrames", + "front": "staryu", + "frontLabel": "StaryuFrontpic", + "id": "STARYU", + "idleLabel": "StaryuAnimationIdle", + "name": "STARYU" + }, + "STEELIX": { + "animLabel": "SteelixAnimation", + "back": "steelix_back", + "backLabel": "SteelixBackpic", + "bitmaskLabel": "SteelixBitmasks", + "dexLabel": "SteelixPokedexEntry", + "framesLabel": "SteelixFrames", + "front": "steelix", + "frontLabel": "SteelixFrontpic", + "id": "STEELIX", + "idleLabel": "SteelixAnimationIdle", + "name": "STEELIX" + }, + "SUDOWOODO": { + "animLabel": "SudowoodoAnimation", + "back": "sudowoodo_back", + "backLabel": "SudowoodoBackpic", + "bitmaskLabel": "SudowoodoBitmasks", + "dexLabel": "SudowoodoPokedexEntry", + "framesLabel": "SudowoodoFrames", + "front": "sudowoodo", + "frontLabel": "SudowoodoFrontpic", + "id": "SUDOWOODO", + "idleLabel": "SudowoodoAnimationIdle", + "name": "SUDOWOODO" + }, + "SUICUNE": { + "animLabel": "SuicuneAnimation", + "back": "suicune_back", + "backLabel": "SuicuneBackpic", + "bitmaskLabel": "SuicuneBitmasks", + "dexLabel": "SuicunePokedexEntry", + "framesLabel": "SuicuneFrames", + "front": "suicune", + "frontLabel": "SuicuneFrontpic", + "id": "SUICUNE", + "idleLabel": "SuicuneAnimationIdle", + "name": "SUICUNE" + }, + "SUNFLORA": { + "animLabel": "SunfloraAnimation", + "back": "sunflora_back", + "backLabel": "SunfloraBackpic", + "bitmaskLabel": "SunfloraBitmasks", + "dexLabel": "SunfloraPokedexEntry", + "framesLabel": "SunfloraFrames", + "front": "sunflora", + "frontLabel": "SunfloraFrontpic", + "id": "SUNFLORA", + "idleLabel": "SunfloraAnimationIdle", + "name": "SUNFLORA" + }, + "SUNKERN": { + "animLabel": "SunkernAnimation", + "back": "sunkern_back", + "backLabel": "SunkernBackpic", + "bitmaskLabel": "SunkernBitmasks", + "dexLabel": "SunkernPokedexEntry", + "framesLabel": "SunkernFrames", + "front": "sunkern", + "frontLabel": "SunkernFrontpic", + "id": "SUNKERN", + "idleLabel": "SunkernAnimationIdle", + "name": "SUNKERN" + }, + "SWINUB": { + "animLabel": "SwinubAnimation", + "back": "swinub_back", + "backLabel": "SwinubBackpic", + "bitmaskLabel": "SwinubBitmasks", + "dexLabel": "SwinubPokedexEntry", + "framesLabel": "SwinubFrames", + "front": "swinub", + "frontLabel": "SwinubFrontpic", + "id": "SWINUB", + "idleLabel": "SwinubAnimationIdle", + "name": "SWINUB" + }, + "TANGELA": { + "animLabel": "TangelaAnimation", + "back": "tangela_back", + "backLabel": "TangelaBackpic", + "bitmaskLabel": "TangelaBitmasks", + "dexLabel": "TangelaPokedexEntry", + "framesLabel": "TangelaFrames", + "front": "tangela", + "frontLabel": "TangelaFrontpic", + "id": "TANGELA", + "idleLabel": "TangelaAnimationIdle", + "name": "TANGELA" + }, + "TAUROS": { + "animLabel": "TaurosAnimation", + "back": "tauros_back", + "backLabel": "TaurosBackpic", + "bitmaskLabel": "TaurosBitmasks", + "dexLabel": "TaurosPokedexEntry", + "framesLabel": "TaurosFrames", + "front": "tauros", + "frontLabel": "TaurosFrontpic", + "id": "TAUROS", + "idleLabel": "TaurosAnimationIdle", + "name": "TAUROS" + }, + "TEDDIURSA": { + "animLabel": "TeddiursaAnimation", + "back": "teddiursa_back", + "backLabel": "TeddiursaBackpic", + "bitmaskLabel": "TeddiursaBitmasks", + "dexLabel": "TeddiursaPokedexEntry", + "framesLabel": "TeddiursaFrames", + "front": "teddiursa", + "frontLabel": "TeddiursaFrontpic", + "id": "TEDDIURSA", + "idleLabel": "TeddiursaAnimationIdle", + "name": "TEDDIURSA" + }, + "TENTACOOL": { + "animLabel": "TentacoolAnimation", + "back": "tentacool_back", + "backLabel": "TentacoolBackpic", + "bitmaskLabel": "TentacoolBitmasks", + "dexLabel": "TentacoolPokedexEntry", + "framesLabel": "TentacoolFrames", + "front": "tentacool", + "frontLabel": "TentacoolFrontpic", + "id": "TENTACOOL", + "idleLabel": "TentacoolAnimationIdle", + "name": "TENTACOOL" + }, + "TENTACRUEL": { + "animLabel": "TentacruelAnimation", + "back": "tentacruel_back", + "backLabel": "TentacruelBackpic", + "bitmaskLabel": "TentacruelBitmasks", + "dexLabel": "TentacruelPokedexEntry", + "framesLabel": "TentacruelFrames", + "front": "tentacruel", + "frontLabel": "TentacruelFrontpic", + "id": "TENTACRUEL", + "idleLabel": "TentacruelAnimationIdle", + "name": "TENTACRUEL" + }, + "TOGEPI": { + "animLabel": "TogepiAnimation", + "back": "togepi_back", + "backLabel": "TogepiBackpic", + "bitmaskLabel": "TogepiBitmasks", + "dexLabel": "TogepiPokedexEntry", + "framesLabel": "TogepiFrames", + "front": "togepi", + "frontLabel": "TogepiFrontpic", + "id": "TOGEPI", + "idleLabel": "TogepiAnimationIdle", + "name": "TOGEPI" + }, + "TOGETIC": { + "animLabel": "TogeticAnimation", + "back": "togetic_back", + "backLabel": "TogeticBackpic", + "bitmaskLabel": "TogeticBitmasks", + "dexLabel": "TogeticPokedexEntry", + "framesLabel": "TogeticFrames", + "front": "togetic", + "frontLabel": "TogeticFrontpic", + "id": "TOGETIC", + "idleLabel": "TogeticAnimationIdle", + "name": "TOGETIC" + }, + "TOTODILE": { + "animLabel": "TotodileAnimation", + "back": "totodile_back", + "backLabel": "TotodileBackpic", + "bitmaskLabel": "TotodileBitmasks", + "dexLabel": "TotodilePokedexEntry", + "framesLabel": "TotodileFrames", + "front": "totodile", + "frontLabel": "TotodileFrontpic", + "id": "TOTODILE", + "idleLabel": "TotodileAnimationIdle", + "name": "TOTODILE" + }, + "TYPHLOSION": { + "animLabel": "TyphlosionAnimation", + "back": "typhlosion_back", + "backLabel": "TyphlosionBackpic", + "bitmaskLabel": "TyphlosionBitmasks", + "dexLabel": "TyphlosionPokedexEntry", + "framesLabel": "TyphlosionFrames", + "front": "typhlosion", + "frontLabel": "TyphlosionFrontpic", + "id": "TYPHLOSION", + "idleLabel": "TyphlosionAnimationIdle", + "name": "TYPHLOSION" + }, + "TYRANITAR": { + "animLabel": "TyranitarAnimation", + "back": "tyranitar_back", + "backLabel": "TyranitarBackpic", + "bitmaskLabel": "TyranitarBitmasks", + "dexLabel": "TyranitarPokedexEntry", + "framesLabel": "TyranitarFrames", + "front": "tyranitar", + "frontLabel": "TyranitarFrontpic", + "id": "TYRANITAR", + "idleLabel": "TyranitarAnimationIdle", + "name": "TYRANITAR" + }, + "TYROGUE": { + "animLabel": "TyrogueAnimation", + "back": "tyrogue_back", + "backLabel": "TyrogueBackpic", + "bitmaskLabel": "TyrogueBitmasks", + "dexLabel": "TyroguePokedexEntry", + "framesLabel": "TyrogueFrames", + "front": "tyrogue", + "frontLabel": "TyrogueFrontpic", + "id": "TYROGUE", + "idleLabel": "TyrogueAnimationIdle", + "name": "TYROGUE" + }, + "UMBREON": { + "animLabel": "UmbreonAnimation", + "back": "umbreon_back", + "backLabel": "UmbreonBackpic", + "bitmaskLabel": "UmbreonBitmasks", + "dexLabel": "UmbreonPokedexEntry", + "framesLabel": "UmbreonFrames", + "front": "umbreon", + "frontLabel": "UmbreonFrontpic", + "id": "UMBREON", + "idleLabel": "UmbreonAnimationIdle", + "name": "UMBREON" + }, + "UNOWN": { + "animLabel": "UnownAnimation", + "back": null, + "backLabel": null, + "bitmaskLabel": "UnownBitmasks", + "dexLabel": "UnownPokedexEntry", + "framesLabel": "UnownFrames", + "front": null, + "frontLabel": null, + "id": "UNOWN", + "idleLabel": "UnownAnimationIdle", + "name": "UNOWN" + }, + "URSARING": { + "animLabel": "UrsaringAnimation", + "back": "ursaring_back", + "backLabel": "UrsaringBackpic", + "bitmaskLabel": "UrsaringBitmasks", + "dexLabel": "UrsaringPokedexEntry", + "framesLabel": "UrsaringFrames", + "front": "ursaring", + "frontLabel": "UrsaringFrontpic", + "id": "URSARING", + "idleLabel": "UrsaringAnimationIdle", + "name": "URSARING" + }, + "VAPOREON": { + "animLabel": "VaporeonAnimation", + "back": "vaporeon_back", + "backLabel": "VaporeonBackpic", + "bitmaskLabel": "VaporeonBitmasks", + "dexLabel": "VaporeonPokedexEntry", + "framesLabel": "VaporeonFrames", + "front": "vaporeon", + "frontLabel": "VaporeonFrontpic", + "id": "VAPOREON", + "idleLabel": "VaporeonAnimationIdle", + "name": "VAPOREON" + }, + "VENOMOTH": { + "animLabel": "VenomothAnimation", + "back": "venomoth_back", + "backLabel": "VenomothBackpic", + "bitmaskLabel": "VenomothBitmasks", + "dexLabel": "VenomothPokedexEntry", + "framesLabel": "VenomothFrames", + "front": "venomoth", + "frontLabel": "VenomothFrontpic", + "id": "VENOMOTH", + "idleLabel": "VenomothAnimationIdle", + "name": "VENOMOTH" + }, + "VENONAT": { + "animLabel": "VenonatAnimation", + "back": "venonat_back", + "backLabel": "VenonatBackpic", + "bitmaskLabel": "VenonatBitmasks", + "dexLabel": "VenonatPokedexEntry", + "framesLabel": "VenonatFrames", + "front": "venonat", + "frontLabel": "VenonatFrontpic", + "id": "VENONAT", + "idleLabel": "VenonatAnimationIdle", + "name": "VENONAT" + }, + "VENUSAUR": { + "animLabel": "VenusaurAnimation", + "back": "venusaur_back", + "backLabel": "VenusaurBackpic", + "bitmaskLabel": "VenusaurBitmasks", + "dexLabel": "VenusaurPokedexEntry", + "framesLabel": "VenusaurFrames", + "front": "venusaur", + "frontLabel": "VenusaurFrontpic", + "id": "VENUSAUR", + "idleLabel": "VenusaurAnimationIdle", + "name": "VENUSAUR" + }, + "VICTREEBEL": { + "animLabel": "VictreebelAnimation", + "back": "victreebel_back", + "backLabel": "VictreebelBackpic", + "bitmaskLabel": "VictreebelBitmasks", + "dexLabel": "VictreebelPokedexEntry", + "framesLabel": "VictreebelFrames", + "front": "victreebel", + "frontLabel": "VictreebelFrontpic", + "id": "VICTREEBEL", + "idleLabel": "VictreebelAnimationIdle", + "name": "VICTREEBEL" + }, + "VILEPLUME": { + "animLabel": "VileplumeAnimation", + "back": "vileplume_back", + "backLabel": "VileplumeBackpic", + "bitmaskLabel": "VileplumeBitmasks", + "dexLabel": "VileplumePokedexEntry", + "framesLabel": "VileplumeFrames", + "front": "vileplume", + "frontLabel": "VileplumeFrontpic", + "id": "VILEPLUME", + "idleLabel": "VileplumeAnimationIdle", + "name": "VILEPLUME" + }, + "VOLTORB": { + "animLabel": "VoltorbAnimation", + "back": "voltorb_back", + "backLabel": "VoltorbBackpic", + "bitmaskLabel": "VoltorbBitmasks", + "dexLabel": "VoltorbPokedexEntry", + "framesLabel": "VoltorbFrames", + "front": "voltorb", + "frontLabel": "VoltorbFrontpic", + "id": "VOLTORB", + "idleLabel": "VoltorbAnimationIdle", + "name": "VOLTORB" + }, + "VULPIX": { + "animLabel": "VulpixAnimation", + "back": "vulpix_back", + "backLabel": "VulpixBackpic", + "bitmaskLabel": "VulpixBitmasks", + "dexLabel": "VulpixPokedexEntry", + "framesLabel": "VulpixFrames", + "front": "vulpix", + "frontLabel": "VulpixFrontpic", + "id": "VULPIX", + "idleLabel": "VulpixAnimationIdle", + "name": "VULPIX" + }, + "WARTORTLE": { + "animLabel": "WartortleAnimation", + "back": "wartortle_back", + "backLabel": "WartortleBackpic", + "bitmaskLabel": "WartortleBitmasks", + "dexLabel": "WartortlePokedexEntry", + "framesLabel": "WartortleFrames", + "front": "wartortle", + "frontLabel": "WartortleFrontpic", + "id": "WARTORTLE", + "idleLabel": "WartortleAnimationIdle", + "name": "WARTORTLE" + }, + "WEEDLE": { + "animLabel": "WeedleAnimation", + "back": "weedle_back", + "backLabel": "WeedleBackpic", + "bitmaskLabel": "WeedleBitmasks", + "dexLabel": "WeedlePokedexEntry", + "framesLabel": "WeedleFrames", + "front": "weedle", + "frontLabel": "WeedleFrontpic", + "id": "WEEDLE", + "idleLabel": "WeedleAnimationIdle", + "name": "WEEDLE" + }, + "WEEPINBELL": { + "animLabel": "WeepinbellAnimation", + "back": "weepinbell_back", + "backLabel": "WeepinbellBackpic", + "bitmaskLabel": "WeepinbellBitmasks", + "dexLabel": "WeepinbellPokedexEntry", + "framesLabel": "WeepinbellFrames", + "front": "weepinbell", + "frontLabel": "WeepinbellFrontpic", + "id": "WEEPINBELL", + "idleLabel": "WeepinbellAnimationIdle", + "name": "WEEPINBELL" + }, + "WEEZING": { + "animLabel": "WeezingAnimation", + "back": "weezing_back", + "backLabel": "WeezingBackpic", + "bitmaskLabel": "WeezingBitmasks", + "dexLabel": "WeezingPokedexEntry", + "framesLabel": "WeezingFrames", + "front": "weezing", + "frontLabel": "WeezingFrontpic", + "id": "WEEZING", + "idleLabel": "WeezingAnimationIdle", + "name": "WEEZING" + }, + "WIGGLYTUFF": { + "animLabel": "WigglytuffAnimation", + "back": "wigglytuff_back", + "backLabel": "WigglytuffBackpic", + "bitmaskLabel": "WigglytuffBitmasks", + "dexLabel": "WigglytuffPokedexEntry", + "framesLabel": "WigglytuffFrames", + "front": "wigglytuff", + "frontLabel": "WigglytuffFrontpic", + "id": "WIGGLYTUFF", + "idleLabel": "WigglytuffAnimationIdle", + "name": "WIGGLYTUFF" + }, + "WOBBUFFET": { + "animLabel": "WobbuffetAnimation", + "back": "wobbuffet_back", + "backLabel": "WobbuffetBackpic", + "bitmaskLabel": "WobbuffetBitmasks", + "dexLabel": "WobbuffetPokedexEntry", + "framesLabel": "WobbuffetFrames", + "front": "wobbuffet", + "frontLabel": "WobbuffetFrontpic", + "id": "WOBBUFFET", + "idleLabel": "WobbuffetAnimationIdle", + "name": "WOBBUFFET" + }, + "WOOPER": { + "animLabel": "WooperAnimation", + "back": "wooper_back", + "backLabel": "WooperBackpic", + "bitmaskLabel": "WooperBitmasks", + "dexLabel": "WooperPokedexEntry", + "framesLabel": "WooperFrames", + "front": "wooper", + "frontLabel": "WooperFrontpic", + "id": "WOOPER", + "idleLabel": "WooperAnimationIdle", + "name": "WOOPER" + }, + "XATU": { + "animLabel": "XatuAnimation", + "back": "xatu_back", + "backLabel": "XatuBackpic", + "bitmaskLabel": "XatuBitmasks", + "dexLabel": "XatuPokedexEntry", + "framesLabel": "XatuFrames", + "front": "xatu", + "frontLabel": "XatuFrontpic", + "id": "XATU", + "idleLabel": "XatuAnimationIdle", + "name": "XATU" + }, + "YANMA": { + "animLabel": "YanmaAnimation", + "back": "yanma_back", + "backLabel": "YanmaBackpic", + "bitmaskLabel": "YanmaBitmasks", + "dexLabel": "YanmaPokedexEntry", + "framesLabel": "YanmaFrames", + "front": "yanma", + "frontLabel": "YanmaFrontpic", + "id": "YANMA", + "idleLabel": "YanmaAnimationIdle", + "name": "YANMA" + }, + "ZAPDOS": { + "animLabel": "ZapdosAnimation", + "back": "zapdos_back", + "backLabel": "ZapdosBackpic", + "bitmaskLabel": "ZapdosBitmasks", + "dexLabel": "ZapdosPokedexEntry", + "framesLabel": "ZapdosFrames", + "front": "zapdos", + "frontLabel": "ZapdosFrontpic", + "id": "ZAPDOS", + "idleLabel": "ZapdosAnimationIdle", + "name": "ZAPDOS" + }, + "ZUBAT": { + "animLabel": "ZubatAnimation", + "back": "zubat_back", + "backLabel": "ZubatBackpic", + "bitmaskLabel": "ZubatBitmasks", + "dexLabel": "ZubatPokedexEntry", + "framesLabel": "ZubatFrames", + "front": "zubat", + "frontLabel": "ZubatFrontpic", + "id": "ZUBAT", + "idleLabel": "ZubatAnimationIdle", + "name": "ZUBAT" + } + }, + "romSha1": "f4cd194bdee0d04ca4eac29e09b8e4e9d818c133", + "symbols": { + "AbraBackpic": [ + 86, + 25647 + ], + "AbraFrontpic": [ + 81, + 30783 + ], + "AbraPokedexEntry": [ + 96, + 28885 + ], + "AerodactylBackpic": [ + 86, + 25982 + ], + "AerodactylFrontpic": [ + 75, + 24187 + ], + "AerodactylPokedexEntry": [ + 115, + 17782 + ], + "AerodactylPuzzleLZ": [ + 56, + 23035 + ], + "AipomBackpic": [ + 86, + 27985 + ], + "AipomFrontpic": [ + 81, + 30322 + ], + "AipomPokedexEntry": [ + 115, + 23057 + ], + "AlakazamBackpic": [ + 81, + 29861 + ], + "AlakazamFrontpic": [ + 74, + 17581 + ], + "AlakazamPokedexEntry": [ + 110, + 16384 + ], + "AlphabeticalPokedexOrder": [ + 16, + 19557 + ], + "AlreadyAsleepText": [ + 32, + 20929 + ], + "AlreadyConfusedText": [ + 32, + 19916 + ], + "AlreadyParalyzedText": [ + 32, + 21906 + ], + "AlreadyPoisonedText": [ + 32, + 20986 + ], + "AmpharosBackpic": [ + 88, + 26249 + ], + "AmpharosFrontpic": [ + 77, + 22993 + ], + "AmpharosPokedexEntry": [ + 115, + 22054 + ], + "AnimObjGFX": [ + 51, + 31990 + ], + "AnimateFlowerTile": [ + 63, + 17773 + ], + "AnimateFlowerTile.FlowerTileFrames": [ + 63, + 17804 + ], + "AnimateFountainTile": [ + 63, + 17287 + ], + "AnimateFrontpic": [ + 52, + 16526 + ], + "AnimateHallOfFame.String_NewHallOfFamer": [ + 33, + 25900 + ], + "AnimateLavaBubbleTile1": [ + 63, + 17868 + ], + "AnimateLavaBubbleTile2": [ + 63, + 17899 + ], + "AnimateTowerPillarTile": [ + 63, + 17989 + ], + "AnimateTrademonFrontpic": [ + 19, + 22558 + ], + "AnimateWaterPalette": [ + 63, + 18135 + ], + "AnimateWaterTile": [ + 63, + 17410 + ], + "AnimateWaterTile.WaterTileFrames": [ + 63, + 17436 + ], + "AnimateWhirlpoolTile": [ + 63, + 18040 + ], + "AnimationIdlePointers": [ + 52, + 22179 + ], + "AnimationPointers": [ + 52, + 18069 + ], + "ArbokBackpic": [ + 88, + 22126 + ], + "ArbokFrontpic": [ + 73, + 28016 + ], + "ArbokPokedexEntry": [ + 96, + 24637 + ], + "ArcanineBackpic": [ + 83, + 30930 + ], + "ArcanineFrontpic": [ + 73, + 23940 + ], + "ArcaninePokedexEntry": [ + 96, + 28444 + ], + "AriadosBackpic": [ + 86, + 19864 + ], + "AriadosFrontpic": [ + 77, + 16384 + ], + "AriadosPokedexEntry": [ + 115, + 20611 + ], + "ArticunoBackpic": [ + 88, + 28867 + ], + "ArticunoFrontpic": [ + 72, + 26326 + ], + "ArticunoPokedexEntry": [ + 115, + 17970 + ], + "AsciiFontGFX": [ + 92, + 23985 + ], + "AttackMissed2Text": [ + 32, + 20531 + ], + "AttackMissedText": [ + 32, + 20512 + ], + "AzumarillBackpic": [ + 88, + 26780 + ], + "AzumarillFrontpic": [ + 76, + 29842 + ], + "AzumarillPokedexEntry": [ + 115, + 22385 + ], + "BTTrainerClassSprites": [ + 92, + 19344 + ], + "BadgeGFX": [ + 9, + 24643 + ], + "BadlyPoisonedText": [ + 32, + 20966 + ], + "BargainShopData": [ + 5, + 23633 + ], + "BaseData": [ + 20, + 21540 + ], + "BattleAnimFrameData": [ + 51, + 26718 + ], + "BattleAnimOAMData": [ + 51, + 28334 + ], + "BattleAnimObjects": [ + 51, + 19286 + ], + "BattleAnimations": [ + 50, + 20591 + ], + "BattleObjectPals": [ + 2, + 22428 + ], + "BattleText_AnEGGCantBattle": [ + 32, + 19238 + ], + "BattleText_CantEscape": [ + 32, + 19360 + ], + "BattleText_CantEscape2": [ + 32, + 19259 + ], + "BattleText_EnemyFled": [ + 32, + 18383 + ], + "BattleText_EnemyIsAboutToUseWillPlayerChangeMon": [ + 32, + 19146 + ], + "BattleText_EnemyMonFainted": [ + 32, + 18856 + ], + "BattleText_EnemySentOut": [ + 32, + 19192 + ], + "BattleText_EnemyWasDefeated": [ + 32, + 18906 + ], + "BattleText_GotAwaySafely": [ + 32, + 19319 + ], + "BattleText_ItemHealedConfusion": [ + 32, + 19883 + ], + "BattleText_ItemsCantBeUsedHere": [ + 32, + 19443 + ], + "BattleText_LinkErrorBattleCanceled": [ + 32, + 22627 + ], + "BattleText_MonCantBeRecalled": [ + 32, + 19490 + ], + "BattleText_MonFainted": [ + 32, + 19061 + ], + "BattleText_MonHasNoMovesLeft": [ + 32, + 19570 + ], + "BattleText_MonIsAlreadyOut": [ + 32, + 19469 + ], + "BattleText_MonsLightScreenFell": [ + 32, + 18663 + ], + "BattleText_MonsReflectFaded": [ + 32, + 18693 + ], + "BattleText_NoTimeLeftToday": [ + 32, + 22670 + ], + "BattleText_PlayerPickedUpPayDayMoney": [ + 32, + 18224 + ], + "BattleText_RainContinuesToFall": [ + 32, + 18719 + ], + "BattleText_SafeguardFaded": [ + 32, + 18642 + ], + "BattleText_StringBuffer1GrewToLevel": [ + 32, + 19612 + ], + "BattleText_TargetRecoveredWithItem": [ + 32, + 18560 + ], + "BattleText_TargetWasHitByFutureSight": [ + 32, + 18614 + ], + "BattleText_TargetsEncoreEnded": [ + 32, + 19594 + ], + "BattleText_TheMoveIsDisabled": [ + 32, + 19547 + ], + "BattleText_TheRainStopped": [ + 32, + 18791 + ], + "BattleText_TheSandstormRages": [ + 32, + 18769 + ], + "BattleText_TheSandstormSubsided": [ + 32, + 18831 + ], + "BattleText_TheSunlightFaded": [ + 32, + 18810 + ], + "BattleText_TheSunlightIsStrong": [ + 32, + 18744 + ], + "BattleText_TheresNoEscapeFromTrainerBattle": [ + 32, + 19273 + ], + "BattleText_TheresNoPPLeftForThisMove": [ + 32, + 19513 + ], + "BattleText_TheresNoWillToBattle": [ + 32, + 19211 + ], + "BattleText_UseNextMon": [ + 32, + 19075 + ], + "BattleText_UserFledUsingAStringBuffer1": [ + 32, + 19337 + ], + "BattleText_UserHurtBySpikes": [ + 32, + 19374 + ], + "BattleText_UserRecoveredPPUsing": [ + 32, + 18585 + ], + "BattleText_UserWasReleasedFromStringBuffer1": [ + 32, + 19957 + ], + "BattleText_UsersHurtByStringBuffer1": [ + 32, + 19938 + ], + "BattleText_UsersStringBuffer1Activated": [ + 32, + 19422 + ], + "BattleText_WildFled": [ + 32, + 18365 + ], + "BattleText_WildMonIsAngry": [ + 32, + 19665 + ], + "BattleText_WildMonIsEating": [ + 32, + 19642 + ], + "BattleTowerMons": [ + 126, + 17488 + ], + "BattleTowerTrainerData": [ + 124, + 16384 + ], + "BattleTowerTrainers": [ + 126, + 16718 + ], + "BattleWinSlideInEnemyTrainerFrontpic": [ + 15, + 27608 + ], + "BayleefBackpic": [ + 83, + 22165 + ], + "BayleefFrontpic": [ + 77, + 26563 + ], + "BayleefPokedexEntry": [ + 115, + 18921 + ], + "BeatUpAttackText": [ + 32, + 22573 + ], + "BecameConfusedText": [ + 32, + 19863 + ], + "BeedrillBackpic": [ + 83, + 30536 + ], + "BeedrillFrontpic": [ + 73, + 22902 + ], + "BeedrillPokedexEntry": [ + 96, + 23690 + ], + "BeganToNapText": [ + 32, + 20273 + ], + "BellChimedText": [ + 32, + 20896 + ], + "BellossomBackpic": [ + 85, + 31844 + ], + "BellossomFrontpic": [ + 78, + 19124 + ], + "BellossomPokedexEntry": [ + 115, + 22170 + ], + "BellsproutBackpic": [ + 88, + 18720 + ], + "BellsproutFrontpic": [ + 82, + 23595 + ], + "BellsproutPokedexEntry": [ + 110, + 16801 + ], + "BellyDrumText": [ + 32, + 22482 + ], + "BillsPCOrangePalette": [ + 2, + 20534 + ], + "BitmasksPointers": [ + 52, + 25839 + ], + "BlastoiseBackpic": [ + 85, + 20786 + ], + "BlastoiseFrontpic": [ + 73, + 16540 + ], + "BlastoisePokedexEntry": [ + 96, + 23033 + ], + "BlewSpikesText": [ + 32, + 22414 + ], + "BlisseyBackpic": [ + 88, + 25981 + ], + "BlisseyFrontpic": [ + 75, + 19884 + ], + "BlisseyPokedexEntry": [ + 116, + 21751 + ], + "BlownAwayText": [ + 32, + 21202 + ], + "BoltEmote": [ + 65, + 17552 + ], + "BracedItselfText": [ + 32, + 22265 + ], + "BugCatchingContestantEventFlagTable": [ + 4, + 31230 + ], + "BugContestPrizeNoRoomText": [ + 108, + 18636 + ], + "BulbasaurBackpic": [ + 88, + 17563 + ], + "BulbasaurFrontpic": [ + 83, + 32109 + ], + "BulbasaurPokedexEntry": [ + 96, + 22165 + ], + "ButItFailedText": [ + 32, + 21744 + ], + "ButterfreeBackpic": [ + 81, + 28473 + ], + "ButterfreeFrontpic": [ + 74, + 25162 + ], + "ButterfreePokedexEntry": [ + 96, + 23365 + ], + "CalPic": [ + 86, + 17084 + ], + "CantEscapeNowText": [ + 32, + 22007 + ], + "CardFlipLZ01": [ + 56, + 19734 + ], + "CardFlipLZ02": [ + 56, + 20136 + ], + "CardFlipLZ03": [ + 56, + 19675 + ], + "CardFlipOffButtonGFX": [ + 56, + 19702 + ], + "CardFlipOnButtonGFX": [ + 56, + 19718 + ], + "CardFlipTilemap": [ + 56, + 20748 + ], + "CardLargeSpriteAndFolderGFX": [ + 94, + 25023 + ], + "CardSpriteGFX": [ + 94, + 26191 + ], + "CardStatusGFX": [ + 9, + 21795 + ], + "CardTradeGFX": [ + 65, + 22832 + ], + "CardTradeSpriteGFX": [ + 65, + 23856 + ], + "CaterpieBackpic": [ + 88, + 20434 + ], + "CaterpieFrontpic": [ + 87, + 23750 + ], + "CaterpiePokedexEntry": [ + 96, + 23136 + ], + "CelebiBackpic": [ + 82, + 31339 + ], + "CelebiFrontpic": [ + 81, + 17889 + ], + "CelebiPokedexEntry": [ + 116, + 22732 + ], + "ChanseyBackpic": [ + 87, + 28388 + ], + "ChanseyFrontpic": [ + 79, + 17666 + ], + "ChanseyPokedexEntry": [ + 110, + 21550 + ], + "CharizardBackpic": [ + 85, + 23674 + ], + "CharizardFrontpic": [ + 73, + 31031 + ], + "CharizardPokedexEntry": [ + 96, + 22707 + ], + "CharmanderBackpic": [ + 87, + 29899 + ], + "CharmanderFrontpic": [ + 80, + 24677 + ], + "CharmanderPokedexEntry": [ + 96, + 22491 + ], + "CharmeleonBackpic": [ + 84, + 18725 + ], + "CharmeleonFrontpic": [ + 76, + 26753 + ], + "CharmeleonPokedexEntry": [ + 96, + 22602 + ], + "ChikoritaBackpic": [ + 87, + 27468 + ], + "ChikoritaFrontpic": [ + 79, + 22680 + ], + "ChikoritaPokedexEntry": [ + 115, + 18824 + ], + "ChinchouBackpic": [ + 87, + 28082 + ], + "ChinchouFrontpic": [ + 80, + 22018 + ], + "ChinchouPokedexEntry": [ + 115, + 20837 + ], + "ChooseMobileCenterAttrmap": [ + 92, + 26965 + ], + "ChooseMobileCenterTilemap": [ + 92, + 26245 + ], + "ChrisBackpic": [ + 10, + 31258 + ], + "ChrisCardPic": [ + 34, + 17253 + ], + "ChrisPic": [ + 34, + 18601 + ], + "ChrisSilhouetteGFX": [ + 94, + 23535 + ], + "ChrisSpriteGFX": [ + 48, + 16384 + ], + "ClampedByText": [ + 32, + 20057 + ], + "ClefableBackpic": [ + 82, + 27514 + ], + "ClefableFrontpic": [ + 78, + 22484 + ], + "ClefablePokedexEntry": [ + 96, + 25904 + ], + "ClefairyBackpic": [ + 85, + 31142 + ], + "ClefairyFrontpic": [ + 82, + 16839 + ], + "ClefairyPokedexEntry": [ + 96, + 25800 + ], + "CleffaBackpic": [ + 88, + 29888 + ], + "CleffaFrontpic": [ + 82, + 24921 + ], + "CleffaPokedexEntry": [ + 115, + 21180 + ], + "ClockTilemapRLE": [ + 36, + 21979 + ], + "CloysterBackpic": [ + 81, + 31700 + ], + "CloysterFrontpic": [ + 74, + 26980 + ], + "CloysterPokedexEntry": [ + 110, + 19161 + ], + "CoinVendor_Buy500CoinsText": [ + 108, + 18511 + ], + "CoinVendor_Buy50CoinsText": [ + 108, + 18480 + ], + "CoinVendor_CancelText": [ + 108, + 18605 + ], + "CoinVendor_CoinCaseFullText": [ + 108, + 18572 + ], + "CoinVendor_IntroText": [ + 108, + 18403 + ], + "CoinVendor_NoCoinCaseText": [ + 108, + 18332 + ], + "CoinVendor_NotEnoughMoneyText": [ + 108, + 18543 + ], + "CoinVendor_WelcomeText": [ + 108, + 18303 + ], + "CoinsScatteredText": [ + 32, + 21557 + ], + "ConfusedNoMoreText": [ + 32, + 19841 + ], + "ContestMons": [ + 37, + 32135 + ], + "ContestResults_ConsolationPrizeText": [ + 108, + 18049 + ], + "ContestResults_DidNotWinText": [ + 108, + 18103 + ], + "ContestResults_JoinUsNextTimeText": [ + 108, + 18011 + ], + "ContestResults_PartyFullText": [ + 108, + 18189 + ], + "ContestResults_PlayerWonAPrizeText": [ + 108, + 17953 + ], + "ContestResults_ReadyToJudgeText": [ + 108, + 17855 + ], + "ContestResults_ReturnPartyText": [ + 108, + 18137 + ], + "CopiedStatsText": [ + 32, + 22518 + ], + "CopyBackpic": [ + 15, + 31792 + ], + "CopyrightGFX": [ + 57, + 16384 + ], + "CorsolaBackpic": [ + 87, + 27775 + ], + "CorsolaFrontpic": [ + 80, + 20370 + ], + "CorsolaPokedexEntry": [ + 116, + 19560 + ], + "CoveredByVeilText": [ + 32, + 22300 + ], + "CrashedText": [ + 32, + 20550 + ], + "CreditsBorderGFX": [ + 66, + 23588 + ], + "CreditsDittoGFX": [ + 66, + 25780 + ], + "CreditsIgglybuffGFX": [ + 66, + 26804 + ], + "CreditsPalettes": [ + 66, + 23402 + ], + "CreditsPichuGFX": [ + 66, + 23732 + ], + "CreditsSmoochumGFX": [ + 66, + 24756 + ], + "Cries": [ + 58, + 20912 + ], + "CriticalHitText": [ + 32, + 20614 + ], + "CrobatBackpic": [ + 88, + 25712 + ], + "CrobatFrontpic": [ + 79, + 17028 + ], + "CrobatPokedexEntry": [ + 115, + 20725 + ], + "CroconawBackpic": [ + 83, + 25793 + ], + "CroconawFrontpic": [ + 75, + 26730 + ], + "CroconawPokedexEntry": [ + 115, + 19588 + ], + "CuboneBackpic": [ + 83, + 28566 + ], + "CuboneFrontpic": [ + 80, + 25205 + ], + "CubonePokedexEntry": [ + 110, + 20584 + ], + "CyndaquilBackpic": [ + 83, + 21755 + ], + "CyndaquilFrontpic": [ + 79, + 31025 + ], + "CyndaquilPokedexEntry": [ + 115, + 19133 + ], + "DecorationDesc_GiantOrnament.BigDollScript": [ + 9, + 28643 + ], + "DecorationDesc_NullPoster": [ + 9, + 28600 + ], + "DecorationDesc_OrnamentOrConsole.OrnamentConsoleScript": [ + 9, + 28629 + ], + "DecorationDesc_PosterPointers": [ + 9, + 28548 + ], + "DefrostedOpponentText": [ + 32, + 21067 + ], + "DelibirdBackpic": [ + 86, + 18826 + ], + "DelibirdFrontpic": [ + 79, + 27496 + ], + "DelibirdPokedexEntry": [ + 116, + 19889 + ], + "DestinyBondEffectText": [ + 32, + 20822 + ], + "DewgongBackpic": [ + 89, + 18066 + ], + "DewgongFrontpic": [ + 74, + 28781 + ], + "DewgongPokedexEntry": [ + 110, + 18740 + ], + "DialpadAttrmap": [ + 94, + 28221 + ], + "DialpadCursorGFX": [ + 94, + 29797 + ], + "DialpadGFX": [ + 94, + 28581 + ], + "DialpadTilemap": [ + 94, + 27861 + ], + "DidntAffect1Text": [ + 32, + 21772 + ], + "DidntAffect2Text": [ + 32, + 21792 + ], + "DifficultBookshelfText": [ + 108, + 17242 + ], + "DiglettBackpic": [ + 89, + 22698 + ], + "DiglettFrontpic": [ + 86, + 17782 + ], + "DiglettPokedexEntry": [ + 96, + 27440 + ], + "DiplomaGFX": [ + 119, + 22533 + ], + "DiplomaPage1Tilemap": [ + 119, + 23627 + ], + "DiplomaPalettes": [ + 2, + 30273 + ], + "DisabledMoveText": [ + 32, + 20226 + ], + "DisabledNoMoreText": [ + 32, + 19769 + ], + "DittoBackpic": [ + 88, + 29123 + ], + "DittoFrontpic": [ + 85, + 29734 + ], + "DittoPokedexEntry": [ + 115, + 16700 + ], + "DodrioBackpic": [ + 82, + 16384 + ], + "DodrioFrontpic": [ + 75, + 16384 + ], + "DodrioPokedexEntry": [ + 110, + 18506 + ], + "DoduoBackpic": [ + 83, + 23380 + ], + "DoduoFrontpic": [ + 82, + 27942 + ], + "DoduoPokedexEntry": [ + 110, + 18391 + ], + "DoesntAffectText": [ + 32, + 20593 + ], + "DoneTileAnimation": [ + 63, + 17147 + ], + "DonphanBackpic": [ + 89, + 19006 + ], + "DonphanFrontpic": [ + 75, + 30892 + ], + "DonphanPokedexEntry": [ + 116, + 20652 + ], + "DownpourText": [ + 32, + 22435 + ], + "DraggedOutText": [ + 32, + 21828 + ], + "DragonairBackpic": [ + 87, + 26854 + ], + "DragonairFrontpic": [ + 78, + 30389 + ], + "DragonairPokedexEntry": [ + 115, + 18396 + ], + "DragoniteBackpic": [ + 88, + 22684 + ], + "DragoniteFrontpic": [ + 75, + 21614 + ], + "DragonitePokedexEntry": [ + 115, + 18499 + ], + "DratiniBackpic": [ + 88, + 31139 + ], + "DratiniFrontpic": [ + 82, + 28797 + ], + "DratiniPokedexEntry": [ + 115, + 18273 + ], + "DrawPocketName.tilemap": [ + 4, + 18913 + ], + "DreamEatenText": [ + 32, + 21031 + ], + "DrowzeeBackpic": [ + 88, + 30140 + ], + "DrowzeeFrontpic": [ + 78, + 17762 + ], + "DrowzeePokedexEntry": [ + 110, + 19722 + ], + "Drumkits": [ + 58, + 20050 + ], + "DudeBackpic": [ + 10, + 31658 + ], + "DugtrioBackpic": [ + 86, + 26650 + ], + "DugtrioFrontpic": [ + 78, + 29090 + ], + "DugtrioPokedexEntry": [ + 96, + 27549 + ], + "DunsparceBackpic": [ + 89, + 18772 + ], + "DunsparceFrontpic": [ + 77, + 32161 + ], + "DunsparcePokedexEntry": [ + 116, + 17811 + ], + "EZChatCursorGFX": [ + 34, + 21515 + ], + "EeveeBackpic": [ + 84, + 24109 + ], + "EeveeFrontpic": [ + 81, + 28008 + ], + "EeveePokedexEntry": [ + 115, + 16818 + ], + "EggHatchGFX": [ + 5, + 29587 + ], + "EggMovePointers": [ + 8, + 31505 + ], + "EggPic": [ + 84, + 23727 + ], + "EkansBackpic": [ + 85, + 26897 + ], + "EkansFrontpic": [ + 80, + 16384 + ], + "EkansPokedexEntry": [ + 96, + 24532 + ], + "ElectabuzzBackpic": [ + 84, + 19886 + ], + "ElectabuzzFrontpic": [ + 76, + 23602 + ], + "ElectabuzzPokedexEntry": [ + 110, + 22826 + ], + "ElectroBallMobileGFX": [ + 92, + 21924 + ], + "ElectrodeBackpic": [ + 88, + 31388 + ], + "ElectrodeFrontpic": [ + 84, + 32370 + ], + "ElectrodePokedexEntry": [ + 110, + 20249 + ], + "ElekidBackpic": [ + 82, + 30918 + ], + "ElekidFrontpic": [ + 77, + 28671 + ], + "ElekidPokedexEntry": [ + 116, + 21400 + ], + "ElevatorFloorNames": [ + 4, + 30083 + ], + "EliminatedStatsText": [ + 32, + 21622 + ], + "EnduredText": [ + 32, + 20144 + ], + "EnemyHPBarBorderGFX": [ + 62, + 19136 + ], + "EnemyHitTimesText": [ + 32, + 21240 + ], + "EnteiBackpic": [ + 86, + 22947 + ], + "EnteiFrontpic": [ + 72, + 29643 + ], + "EnteiPokedexEntry": [ + 116, + 21981 + ], + "EnvironmentColorsPointers": [ + 2, + 29305 + ], + "EspeonBackpic": [ + 86, + 28318 + ], + "EspeonFrontpic": [ + 79, + 23902 + ], + "EspeonPokedexEntry": [ + 116, + 16725 + ], + "EvadedText": [ + 32, + 21511 + ], + "EvosAttacksPointers": [ + 16, + 26033 + ], + "ExeggcuteBackpic": [ + 85, + 25468 + ], + "ExeggcuteFrontpic": [ + 76, + 18010 + ], + "ExeggcutePokedexEntry": [ + 110, + 20356 + ], + "ExeggutorBackpic": [ + 81, + 25194 + ], + "ExeggutorFrontpic": [ + 76, + 28304 + ], + "ExeggutorPokedexEntry": [ + 110, + 20470 + ], + "ExpBarGFX": [ + 62, + 19216 + ], + "ExpBarPalette": [ + 2, + 26826 + ], + "FarfetchDBackpic": [ + 83, + 20522 + ], + "FarfetchDFrontpic": [ + 77, + 25143 + ], + "FarfetchDPokedexEntry": [ + 110, + 18284 + ], + "FastAsleepText": [ + 32, + 19687 + ], + "FearowBackpic": [ + 88, + 30641 + ], + "FearowFrontpic": [ + 73, + 30033 + ], + "FearowPokedexEntry": [ + 96, + 24420 + ], + "FellAsleepText": [ + 32, + 20913 + ], + "FellInLoveText": [ + 32, + 22283 + ], + "FemalePokegearPals": [ + 2, + 30553 + ], + "FeraligatrBackpic": [ + 82, + 28370 + ], + "FeraligatrFrontpic": [ + 72, + 21725 + ], + "FeraligatrPokedexEntry": [ + 115, + 19705 + ], + "FireSpinTrapText": [ + 32, + 20020 + ], + "FishEmote": [ + 65, + 17680 + ], + "FishGroups": [ + 36, + 25736 + ], + "FlaaffyBackpic": [ + 85, + 16753 + ], + "FlaaffyFrontpic": [ + 79, + 29271 + ], + "FlaaffyPokedexEntry": [ + 115, + 21944 + ], + "FlareonBackpic": [ + 83, + 31323 + ], + "FlareonFrontpic": [ + 77, + 24429 + ], + "FlareonPokedexEntry": [ + 115, + 17132 + ], + "FledFromBattleText": [ + 32, + 21164 + ], + "FledInFearText": [ + 32, + 21185 + ], + "FlickeringCaveEntrancePalette": [ + 63, + 18206 + ], + "FlinchedText": [ + 32, + 19738 + ], + "Font": [ + 62, + 16896 + ], + "FontBattleExtra": [ + 62, + 17920 + ], + "FontExtra": [ + 62, + 16384 + ], + "FontsExtra2_UpArrowGFX": [ + 62, + 21540 + ], + "FontsExtra_SolidBlackGFX": [ + 62, + 21012 + ], + "Footprints": [ + 62, + 21556 + ], + "ForesawAttackText": [ + 32, + 22551 + ], + "ForestTreeLeftAnimation": [ + 63, + 17500 + ], + "ForestTreeLeftAnimation2": [ + 63, + 17650 + ], + "ForestTreeRightAnimation": [ + 63, + 17604 + ], + "ForestTreeRightAnimation2": [ + 63, + 17692 + ], + "ForretressBackpic": [ + 89, + 24454 + ], + "ForretressFrontpic": [ + 78, + 31035 + ], + "ForretressPokedexEntry": [ + 116, + 17700 + ], + "Frames": [ + 62, + 18432 + ], + "FramesPointers": [ + 53, + 16384 + ], + "FrozenSolidText": [ + 32, + 19718 + ], + "FullyParalyzedText": [ + 32, + 21885 + ], + "FurretBackpic": [ + 85, + 24752 + ], + "FurretFrontpic": [ + 79, + 30444 + ], + "FurretPokedexEntry": [ + 115, + 19933 + ], + "GSIntro_GetMonFrontpic": [ + 20, + 20972 + ], + "GameFreakDittoGFX": [ + 66, + 21511 + ], + "GameFreakDittoPaletteFade": [ + 57, + 18348 + ], + "GameFreakLogoGFX": [ + 57, + 18380 + ], + "GastlyBackpic": [ + 88, + 30391 + ], + "GastlyFrontpic": [ + 76, + 29076 + ], + "GastlyPokedexEntry": [ + 110, + 19274 + ], + "GengarBackpic": [ + 86, + 29978 + ], + "GengarFrontpic": [ + 78, + 27124 + ], + "GengarPokedexEntry": [ + 110, + 19493 + ], + "GeodudeBackpic": [ + 85, + 18595 + ], + "GeodudeFrontpic": [ + 85, + 21872 + ], + "GeodudePokedexEntry": [ + 110, + 17313 + ], + "GetAnimatedEnemyFrontpic": [ + 20, + 20739 + ], + "GetAnimatedFrontpic": [ + 20, + 20619 + ], + "GetBattleMonBackpic": [ + 15, + 29757 + ], + "GetChrisBackpic": [ + 34, + 18480 + ], + "GetEggFrontpic": [ + 5, + 29220 + ], + "GetEnemyMonFrontpic": [ + 15, + 29820 + ], + "GetHatchlingFrontpic": [ + 5, + 29244 + ], + "GetKrisBackpic": [ + 34, + 20169 + ], + "GetMonBackpic": [ + 20, + 20844 + ], + "GetMonFrontpic": [ + 20, + 20599 + ], + "GetPlayerBackpic": [ + 34, + 18469 + ], + "GetTrademonFrontpic": [ + 19, + 22525 + ], + "GetTrainerBackpic": [ + 15, + 31743 + ], + "GettingPumpedText": [ + 32, + 21304 + ], + "GirafarigBackpic": [ + 85, + 22594 + ], + "GirafarigFrontpic": [ + 78, + 17075 + ], + "GirafarigPokedexEntry": [ + 116, + 17478 + ], + "GligarBackpic": [ + 84, + 17948 + ], + "GligarFrontpic": [ + 77, + 31469 + ], + "GligarPokedexEntry": [ + 116, + 17924 + ], + "GloomBackpic": [ + 83, + 29354 + ], + "GloomFrontpic": [ + 79, + 28683 + ], + "GloomPokedexEntry": [ + 96, + 26790 + ], + "GolbatBackpic": [ + 89, + 23622 + ], + "GolbatFrontpic": [ + 76, + 16384 + ], + "GolbatPokedexEntry": [ + 96, + 26564 + ], + "GoldeenBackpic": [ + 83, + 31716 + ], + "GoldeenFrontpic": [ + 79, + 23292 + ], + "GoldeenPokedexEntry": [ + 110, + 22054 + ], + "GolduckBackpic": [ + 86, + 22266 + ], + "GolduckFrontpic": [ + 74, + 21463 + ], + "GolduckPokedexEntry": [ + 96, + 27989 + ], + "GolemBackpic": [ + 89, + 22308 + ], + "GolemFrontpic": [ + 77, + 19351 + ], + "GolemPokedexEntry": [ + 110, + 17537 + ], + "GotAnEncoreText": [ + 32, + 20745 + ], + "GotMoneyForWinningText": [ + 32, + 18878 + ], + "GranbullBackpic": [ + 87, + 24687 + ], + "GranbullFrontpic": [ + 79, + 19566 + ], + "GranbullPokedexEntry": [ + 116, + 18250 + ], + "GrassRustleGFX": [ + 65, + 17824 + ], + "GravelerBackpic": [ + 86, + 27652 + ], + "GravelerFrontpic": [ + 78, + 24480 + ], + "GravelerPokedexEntry": [ + 110, + 17420 + ], + "GrimerBackpic": [ + 88, + 19007 + ], + "GrimerFrontpic": [ + 80, + 28350 + ], + "GrimerPokedexEntry": [ + 110, + 18850 + ], + "GrowlitheBackpic": [ + 84, + 28641 + ], + "GrowlitheFrontpic": [ + 82, + 17747 + ], + "GrowlithePokedexEntry": [ + 96, + 28330 + ], + "GrowthRates": [ + 20, + 20218 + ], + "GyaradosBackpic": [ + 82, + 25356 + ], + "GyaradosFrontpic": [ + 74, + 18566 + ], + "GyaradosPokedexEntry": [ + 115, + 16485 + ], + "GymStatue_CityGymText": [ + 108, + 18254 + ], + "GymStatue_WinningTrainersText": [ + 108, + 18268 + ], + "HOF_AnimateFrontpic": [ + 52, + 18030 + ], + "HOF_LoadTrainerFrontpic": [ + 34, + 18496 + ], + "HOF_SlideBackpic": [ + 33, + 26165 + ], + "HOF_SlideFrontpic": [ + 33, + 26179 + ], + "HPBarPals": [ + 2, + 26814 + ], + "HPExpBarBorderGFX": [ + 62, + 19168 + ], + "HPIsFullText": [ + 32, + 21812 + ], + "HappinessText1": [ + 108, + 18825 + ], + "HappinessText2": [ + 108, + 18772 + ], + "HappinessText3": [ + 108, + 18730 + ], + "HappyEmote": [ + 65, + 17360 + ], + "HasANightmareText": [ + 32, + 18466 + ], + "HasNoPPLeftText": [ + 32, + 20410 + ], + "HasSubstituteText": [ + 32, + 21368 + ], + "HaunterBackpic": [ + 87, + 20251 + ], + "HaunterFrontpic": [ + 79, + 20819 + ], + "HaunterPokedexEntry": [ + 110, + 19389 + ], + "HaveWantGFX": [ + 95, + 16515 + ], + "HaveWantMap": [ + 95, + 19331 + ], + "HealMachineAnim.HealMachineGFX": [ + 4, + 25596 + ], + "HealMachineAnim.palettes": [ + 4, + 25681 + ], + "HeartEmote": [ + 65, + 17488 + ], + "HeldItemIcons": [ + 35, + 27127 + ], + "HeracrossBackpic": [ + 84, + 21042 + ], + "HeracrossFrontpic": [ + 76, + 32123 + ], + "HeracrossPokedexEntry": [ + 116, + 18695 + ], + "HitmonchanBackpic": [ + 85, + 19694 + ], + "HitmonchanFrontpic": [ + 79, + 31604 + ], + "HitmonchanPokedexEntry": [ + 110, + 20900 + ], + "HitmonleeBackpic": [ + 88, + 22963 + ], + "HitmonleeFrontpic": [ + 73, + 20802 + ], + "HitmonleePokedexEntry": [ + 110, + 20799 + ], + "HitmontopBackpic": [ + 81, + 31242 + ], + "HitmontopFrontpic": [ + 75, + 18143 + ], + "HitmontopPokedexEntry": [ + 116, + 21184 + ], + "HoOhBackpic": [ + 86, + 24304 + ], + "HoOhFrontpic": [ + 72, + 17902 + ], + "HoOhPokedexEntry": [ + 116, + 22621 + ], + "HoOhPuzzleLZ": [ + 56, + 22699 + ], + "HomepageText": [ + 108, + 17609 + ], + "HookedPokemonAttackedText": [ + 32, + 18268 + ], + "HoothootBackpic": [ + 87, + 16384 + ], + "HoothootFrontpic": [ + 81, + 32158 + ], + "HoothootPokedexEntry": [ + 115, + 20056 + ], + "HoppipBackpic": [ + 87, + 24063 + ], + "HoppipFrontpic": [ + 83, + 23784 + ], + "HoppipPokedexEntry": [ + 115, + 22709 + ], + "HorseaBackpic": [ + 88, + 27568 + ], + "HorseaFrontpic": [ + 86, + 23626 + ], + "HorseaPokedexEntry": [ + 110, + 21843 + ], + "HoundoomBackpic": [ + 88, + 18431 + ], + "HoundoomFrontpic": [ + 77, + 21541 + ], + "HoundoomPokedexEntry": [ + 116, + 20326 + ], + "HoundourBackpic": [ + 89, + 17111 + ], + "HoundourFrontpic": [ + 81, + 16887 + ], + "HoundourPokedexEntry": [ + 116, + 20223 + ], + "HungOnText": [ + 32, + 20121 + ], + "HurtByBurnText": [ + 32, + 18424 + ], + "HurtByCurseText": [ + 32, + 18486 + ], + "HurtByPoisonText": [ + 32, + 18402 + ], + "HurtItselfText": [ + 32, + 19807 + ], + "HypnoBackpic": [ + 83, + 24992 + ], + "HypnoFrontpic": [ + 75, + 27574 + ], + "HypnoPokedexEntry": [ + 110, + 19840 + ], + "IconPointers": [ + 35, + 27583 + ], + "Icons": [ + 35, + 27661 + ], + "IdentifiedText": [ + 32, + 22193 + ], + "IgglybuffBackpic": [ + 88, + 26515 + ], + "IgglybuffFrontpic": [ + 85, + 25826 + ], + "IgglybuffPokedexEntry": [ + 115, + 21292 + ], + "IgnoredOrders2Text": [ + 32, + 22608 + ], + "IgnoredOrdersText": [ + 32, + 20326 + ], + "IgnoredSleepingText": [ + 32, + 20347 + ], + "InLoveWithText": [ + 32, + 20164 + ], + "IncenseBurnerText": [ + 108, + 17480 + ], + "InfatuationText": [ + 32, + 20186 + ], + "InitRoamMons": [ + 10, + 25248 + ], + "InitializeEventsScript": [ + 47, + 17371 + ], + "IntroBackgroundAttrmap": [ + 57, + 24269 + ], + "IntroBackgroundGFX": [ + 57, + 23677 + ], + "IntroBackgroundPalette": [ + 57, + 24285 + ], + "IntroBackgroundTilemap": [ + 57, + 24173 + ], + "IntroCrystalUnownsAttrmap": [ + 57, + 26477 + ], + "IntroCrystalUnownsGFX": [ + 57, + 26157 + ], + "IntroCrystalUnownsPalette": [ + 57, + 26525 + ], + "IntroCrystalUnownsTilemap": [ + 57, + 26413 + ], + "IntroGrass1GFX": [ + 57, + 31133 + ], + "IntroGrass2GFX": [ + 57, + 31197 + ], + "IntroGrass3GFX": [ + 57, + 31261 + ], + "IntroGrass4GFX": [ + 57, + 31325 + ], + "IntroPichuWooperGFX": [ + 57, + 22829 + ], + "IntroPulseGFX": [ + 57, + 25421 + ], + "IntroSuicuneBackAttrmap": [ + 57, + 30605 + ], + "IntroSuicuneBackGFX": [ + 57, + 29357 + ], + "IntroSuicuneBackTilemap": [ + 57, + 30397 + ], + "IntroSuicuneCloseAttrmap": [ + 57, + 27917 + ], + "IntroSuicuneCloseGFX": [ + 57, + 26653 + ], + "IntroSuicuneClosePalette": [ + 57, + 28013 + ], + "IntroSuicuneCloseTilemap": [ + 57, + 27709 + ], + "IntroSuicuneJumpAttrmap": [ + 57, + 30381 + ], + "IntroSuicuneJumpGFX": [ + 57, + 28141 + ], + "IntroSuicuneJumpTilemap": [ + 57, + 30285 + ], + "IntroSuicunePalette": [ + 57, + 30685 + ], + "IntroSuicuneRunGFX": [ + 57, + 21853 + ], + "IntroUnownAAttrmap": [ + 57, + 25629 + ], + "IntroUnownATilemap": [ + 57, + 25565 + ], + "IntroUnownBackGFX": [ + 57, + 30813 + ], + "IntroUnownHIAttrmap": [ + 57, + 25725 + ], + "IntroUnownHITilemap": [ + 57, + 25645 + ], + "IntroUnownsAttrmap": [ + 57, + 25949 + ], + "IntroUnownsGFX": [ + 57, + 24413 + ], + "IntroUnownsPalette": [ + 57, + 26029 + ], + "IntroUnownsTilemap": [ + 57, + 25757 + ], + "Intro_FadeUnownWordPals.FastFadePalettes": [ + 57, + 21467 + ], + "Intro_FadeUnownWordPals.SlowFadePalettes": [ + 57, + 21499 + ], + "Intro_LoadMagikarpPalettes.MagikarpBGPal": [ + 2, + 19247 + ], + "Intro_LoadMagikarpPalettes.MagikarpOBPal": [ + 2, + 19255 + ], + "Intro_RotatePalettesLeftFrontpic": [ + 1, + 24938 + ], + "Intro_Scene20_AppearUnown.pal1": [ + 57, + 21389 + ], + "Intro_Scene20_AppearUnown.pal2": [ + 57, + 21397 + ], + "Intro_Scene24_ApplyPaletteFade.FadePals": [ + 57, + 20892 + ], + "Intro_WipeInFrontpic": [ + 1, + 24962 + ], + "IsConfusedText": [ + 32, + 19791 + ], + "ItFailedText": [ + 32, + 21760 + ], + "ItemAttributes": [ + 1, + 26561 + ], + "ItemDescriptions": [ + 114, + 18823 + ], + "ItemNames": [ + 114, + 16384 + ], + "IvysaurBackpic": [ + 86, + 21239 + ], + "IvysaurFrontpic": [ + 79, + 29858 + ], + "IvysaurPokedexEntry": [ + 96, + 22274 + ], + "JigglypuffBackpic": [ + 88, + 32125 + ], + "JigglypuffFrontpic": [ + 81, + 20355 + ], + "JigglypuffPokedexEntry": [ + 96, + 26227 + ], + "JohtoGrassWildMons": [ + 10, + 26089 + ], + "JohtoMap": [ + 36, + 24575 + ], + "JohtoWaterWildMons": [ + 10, + 28957 + ], + "JolteonBackpic": [ + 87, + 23435 + ], + "JolteonFrontpic": [ + 75, + 30069 + ], + "JolteonPokedexEntry": [ + 115, + 17035 + ], + "JumpluffBackpic": [ + 85, + 20059 + ], + "JumpluffFrontpic": [ + 77, + 29373 + ], + "JumpluffPokedexEntry": [ + 115, + 22936 + ], + "JynxBackpic": [ + 89, + 23443 + ], + "JynxFrontpic": [ + 79, + 26304 + ], + "JynxPokedexEntry": [ + 110, + 22725 + ], + "KabutoBackpic": [ + 87, + 17677 + ], + "KabutoFrontpic": [ + 85, + 28675 + ], + "KabutoPokedexEntry": [ + 115, + 17559 + ], + "KabutoPuzzleLZ": [ + 56, + 23467 + ], + "KabutopsBackpic": [ + 83, + 30142 + ], + "KabutopsFrontpic": [ + 77, + 22268 + ], + "KabutopsPokedexEntry": [ + 115, + 17671 + ], + "KadabraBackpic": [ + 85, + 24034 + ], + "KadabraFrontpic": [ + 76, + 27531 + ], + "KadabraPokedexEntry": [ + 96, + 28988 + ], + "KakunaBackpic": [ + 88, + 24897 + ], + "KakunaFrontpic": [ + 86, + 26316 + ], + "KakunaPokedexEntry": [ + 96, + 23587 + ], + "KangaskhanBackpic": [ + 78, + 32325 + ], + "KangaskhanFrontpic": [ + 74, + 19540 + ], + "KangaskhanPokedexEntry": [ + 110, + 21750 + ], + "KantoGrassWildMons": [ + 10, + 29300 + ], + "KantoMap": [ + 36, + 24936 + ], + "KantoWaterWildMons": [ + 10, + 30711 + ], + "KingdraBackpic": [ + 85, + 30086 + ], + "KingdraFrontpic": [ + 76, + 25971 + ], + "KingdraPokedexEntry": [ + 116, + 20433 + ], + "KinglerBackpic": [ + 86, + 29647 + ], + "KinglerFrontpic": [ + 76, + 17198 + ], + "KinglerPokedexEntry": [ + 110, + 20037 + ], + "KoffingBackpic": [ + 84, + 26383 + ], + "KoffingFrontpic": [ + 81, + 24231 + ], + "KoffingPokedexEntry": [ + 110, + 21110 + ], + "KrabbyBackpic": [ + 82, + 31759 + ], + "KrabbyFrontpic": [ + 81, + 19374 + ], + "KrabbyPokedexEntry": [ + 110, + 19933 + ], + "KrisBackpic": [ + 34, + 20182 + ], + "KrisCardPic": [ + 34, + 17813 + ], + "KrisPic": [ + 34, + 19385 + ], + "KrisSilhouetteGFX": [ + 94, + 24095 + ], + "Landmarks": [ + 114, + 26819 + ], + "LanturnBackpic": [ + 88, + 19293 + ], + "LanturnFrontpic": [ + 81, + 25666 + ], + "LanturnPokedexEntry": [ + 115, + 20958 + ], + "LaprasBackpic": [ + 87, + 26238 + ], + "LaprasFrontpic": [ + 77, + 18615 + ], + "LaprasPokedexEntry": [ + 115, + 16589 + ], + "LarvitarBackpic": [ + 87, + 31996 + ], + "LarvitarFrontpic": [ + 83, + 18460 + ], + "LarvitarPokedexEntry": [ + 116, + 22172 + ], + "LavaBubbleTileFrames": [ + 63, + 17925 + ], + "LeaderGFX": [ + 9, + 21891 + ], + "LedianBackpic": [ + 84, + 20272 + ], + "LedianFrontpic": [ + 79, + 28090 + ], + "LedianPokedexEntry": [ + 115, + 20384 + ], + "LedybaBackpic": [ + 83, + 21344 + ], + "LedybaFrontpic": [ + 78, + 26466 + ], + "LedybaPokedexEntry": [ + 115, + 20268 + ], + "LeechSeedSapsText": [ + 32, + 18446 + ], + "LickitungBackpic": [ + 87, + 19288 + ], + "LickitungFrontpic": [ + 76, + 25184 + ], + "LickitungPokedexEntry": [ + 110, + 21008 + ], + "LightScreenEffectText": [ + 32, + 21684 + ], + "LoadOpponentTrainerAndPokemon.resample": [ + 126, + 16418 + ], + "LoadOrientedFrontpic": [ + 20, + 21234 + ], + "LoadQuestionMarkPic.QuestionMarkLZ": [ + 119, + 24801 + ], + "LoadRandomBattleTowerMon.resample": [ + 126, + 16537 + ], + "LoafingAroundText": [ + 32, + 20249 + ], + "LookTownMapText": [ + 108, + 17549 + ], + "LostAgainstText": [ + 32, + 19129 + ], + "LugiaBackpic": [ + 88, + 21000 + ], + "LugiaFrontpic": [ + 72, + 25198 + ], + "LugiaPokedexEntry": [ + 116, + 22505 + ], + "MachampBackpic": [ + 81, + 23749 + ], + "MachampFrontpic": [ + 72, + 19205 + ], + "MachampPokedexEntry": [ + 110, + 16691 + ], + "MachokeBackpic": [ + 84, + 29391 + ], + "MachokeFrontpic": [ + 75, + 20751 + ], + "MachokePokedexEntry": [ + 110, + 16587 + ], + "MachopBackpic": [ + 86, + 25312 + ], + "MachopFrontpic": [ + 80, + 21481 + ], + "MachopPokedexEntry": [ + 110, + 16485 + ], + "MadeSubstituteText": [ + 32, + 21346 + ], + "MagazineBookshelfText": [ + 108, + 17315 + ], + "MagbyBackpic": [ + 87, + 26546 + ], + "MagbyFrontpic": [ + 80, + 18673 + ], + "MagbyPokedexEntry": [ + 116, + 21518 + ], + "MagcargoBackpic": [ + 83, + 29748 + ], + "MagcargoFrontpic": [ + 76, + 18818 + ], + "MagcargoPokedexEntry": [ + 116, + 19233 + ], + "MagikarpBackpic": [ + 86, + 19519 + ], + "MagikarpFrontpic": [ + 80, + 24148 + ], + "MagikarpPokedexEntry": [ + 115, + 16384 + ], + "MagmarBackpic": [ + 83, + 24590 + ], + "MagmarFrontpic": [ + 77, + 27266 + ], + "MagmarPokedexEntry": [ + 110, + 22932 + ], + "MagnemiteBackpic": [ + 86, + 32596 + ], + "MagnemiteFrontpic": [ + 86, + 31620 + ], + "MagnemitePokedexEntry": [ + 110, + 18077 + ], + "MagnetTrainBGTiles": [ + 35, + 19842 + ], + "MagnetTrainTilemap": [ + 35, + 20223 + ], + "MagnetonBackpic": [ + 82, + 29224 + ], + "MagnetonFrontpic": [ + 78, + 29741 + ], + "MagnetonPokedexEntry": [ + 110, + 18186 + ], + "MagnitudeText": [ + 32, + 22353 + ], + "MalePokegearPals": [ + 2, + 30505 + ], + "MankeyBackpic": [ + 83, + 24187 + ], + "MankeyFrontpic": [ + 81, + 17390 + ], + "MankeyPokedexEntry": [ + 96, + 28093 + ], + "MantineBackpic": [ + 89, + 20850 + ], + "MantineFrontpic": [ + 76, + 24395 + ], + "MantinePokedexEntry": [ + 116, + 20005 + ], + "MapGroupPointers": [ + 37, + 16384 + ], + "MapGroupRoofs": [ + 7, + 16417 + ], + "MapObjectPals": [ + 2, + 29801 + ], + "MareepBackpic": [ + 85, + 29028 + ], + "MareepFrontpic": [ + 81, + 27076 + ], + "MareepPokedexEntry": [ + 115, + 21841 + ], + "MarillBackpic": [ + 88, + 30890 + ], + "MarillFrontpic": [ + 82, + 19558 + ], + "MarillPokedexEntry": [ + 115, + 22277 + ], + "MarowakBackpic": [ + 85, + 18227 + ], + "MarowakFrontpic": [ + 77, + 30074 + ], + "MarowakPokedexEntry": [ + 110, + 20690 + ], + "MartSignText": [ + 108, + 17820 + ], + "Marts": [ + 5, + 24745 + ], + "MeganiumBackpic": [ + 87, + 18644 + ], + "MeganiumFrontpic": [ + 73, + 18692 + ], + "MeganiumPokedexEntry": [ + 115, + 19028 + ], + "MenuHeaders_UnownWalls": [ + 34, + 28373 + ], + "MeowthBackpic": [ + 87, + 18322 + ], + "MeowthFrontpic": [ + 80, + 29901 + ], + "MeowthPokedexEntry": [ + 96, + 27656 + ], + "MerchandiseShelfText": [ + 108, + 17522 + ], + "MetapodBackpic": [ + 88, + 31880 + ], + "MetapodFrontpic": [ + 87, + 22169 + ], + "MetapodPokedexEntry": [ + 96, + 23246 + ], + "MewBackpic": [ + 86, + 24977 + ], + "MewFrontpic": [ + 79, + 25107 + ], + "MewPokedexEntry": [ + 115, + 18709 + ], + "MewtwoBackpic": [ + 86, + 16384 + ], + "MewtwoFrontpic": [ + 73, + 29025 + ], + "MewtwoPokedexEntry": [ + 115, + 18606 + ], + "MiltankBackpic": [ + 84, + 21812 + ], + "MiltankFrontpic": [ + 79, + 20194 + ], + "MiltankPokedexEntry": [ + 116, + 21634 + ], + "MimicLearnedMoveText": [ + 32, + 21478 + ], + "MirrorMoveFailedText": [ + 32, + 21953 + ], + "MisdreavusBackpic": [ + 85, + 21149 + ], + "MisdreavusFrontpic": [ + 81, + 16384 + ], + "MisdreavusPokedexEntry": [ + 116, + 17153 + ], + "MistText": [ + 32, + 21259 + ], + "MobileAdapterCheckGFX": [ + 91, + 19619 + ], + "MobileAdapterPalettes": [ + 66, + 21447 + ], + "MobileCable1GFX": [ + 66, + 20935 + ], + "MobileCable2GFX": [ + 66, + 21191 + ], + "MobileCard2GFX": [ + 94, + 24655 + ], + "MobileCardGFX": [ + 94, + 23023 + ], + "MobileCardListGFX": [ + 94, + 29881 + ], + "MobileDialingFrameGFX": [ + 65, + 25876 + ], + "MobileDialingGFX": [ + 69, + 24602 + ], + "MobileDownArrowGFX": [ + 18, + 18635 + ], + "MobileMenuGFX": [ + 18, + 23564 + ], + "MobilePasswordAttrmap": [ + 92, + 26605 + ], + "MobilePasswordPalettes": [ + 92, + 23921 + ], + "MobilePhoneTilesGFX": [ + 62, + 21044 + ], + "MobileSelectGFX": [ + 95, + 18819 + ], + "MobileSplashScreenPalettes": [ + 91, + 18691 + ], + "MobileSystemSplashScreen_InitGFX.Attrmap": [ + 91, + 18331 + ], + "MobileSystemSplashScreen_InitGFX.Tilemap": [ + 91, + 17971 + ], + "MobileSystemSplashScreen_InitGFX.Tiles": [ + 91, + 16755 + ], + "MobileTradeAnim_GetFrontpic": [ + 66, + 16873 + ], + "MobileTradeAttrmapLZ": [ + 66, + 20647 + ], + "MobileTradeBGPalettes": [ + 66, + 20743 + ], + "MobileTradeGFX": [ + 66, + 19879 + ], + "MobileTradeLightsGFX": [ + 64, + 29346 + ], + "MobileTradeLightsPalettes": [ + 64, + 29410 + ], + "MobileTradeOB1Palettes": [ + 66, + 20807 + ], + "MobileTradeOB2Palettes": [ + 66, + 20871 + ], + "MobileTradeSpritesGFX": [ + 66, + 19751 + ], + "MobileTradeTilemapLZ": [ + 66, + 20455 + ], + "MobileUpArrowGFX": [ + 18, + 18627 + ], + "MoltresBackpic": [ + 83, + 16802 + ], + "MoltresFrontpic": [ + 73, + 25984 + ], + "MoltresPokedexEntry": [ + 115, + 18182 + ], + "MonMenuIcons": [ + 35, + 27332 + ], + "MoveDescriptions": [ + 11, + 19282 + ], + "MoveNames": [ + 114, + 24361 + ], + "Moves": [ + 16, + 23291 + ], + "MrMimeBackpic": [ + 88, + 20149 + ], + "MrMimeFrontpic": [ + 76, + 31370 + ], + "MrMimePokedexEntry": [ + 110, + 22506 + ], + "MukBackpic": [ + 86, + 18479 + ], + "MukFrontpic": [ + 75, + 25884 + ], + "MukPokedexEntry": [ + 110, + 18940 + ], + "MurkrowBackpic": [ + 86, + 20896 + ], + "MurkrowFrontpic": [ + 78, + 23815 + ], + "MurkrowPokedexEntry": [ + 116, + 16926 + ], + "Music": [ + 58, + 20590 + ], + "Music_AfterTheRivalFight": [ + 61, + 20775 + ], + "Music_AzaleaTown": [ + 61, + 22504 + ], + "Music_BattleTowerLobby": [ + 94, + 21643 + ], + "Music_BattleTowerTheme": [ + 94, + 18569 + ], + "Music_Bicycle": [ + 59, + 24857 + ], + "Music_BuenasPassword": [ + 94, + 16723 + ], + "Music_BugCatchingContest": [ + 61, + 31766 + ], + "Music_BurnedTower": [ + 61, + 27289 + ], + "Music_CeladonCity": [ + 61, + 17243 + ], + "Music_ChampionBattle": [ + 58, + 27073 + ], + "Music_CherrygroveCity": [ + 61, + 23299 + ], + "Music_Clair": [ + 7, + 31373 + ], + "Music_ContestResults": [ + 59, + 31550 + ], + "Music_Credits": [ + 7, + 29468 + ], + "Music_CrystalOpening": [ + 94, + 18152 + ], + "Music_DancingHall": [ + 59, + 31164 + ], + "Music_DarkCave": [ + 58, + 25278 + ], + "Music_DragonsDen": [ + 59, + 27880 + ], + "Music_EcruteakCity": [ + 59, + 29392 + ], + "Music_ElmsLab": [ + 58, + 24640 + ], + "Music_Evolution": [ + 60, + 18145 + ], + "Music_GameCorner": [ + 59, + 23917 + ], + "Music_GoldSilverOpening": [ + 61, + 28757 + ], + "Music_GoldSilverOpening2": [ + 61, + 29448 + ], + "Music_GoldenrodCity": [ + 58, + 29779 + ], + "Music_Gym": [ + 61, + 18606 + ], + "Music_GymLeaderVictory": [ + 61, + 17964 + ], + "Music_HallOfFame": [ + 60, + 17855 + ], + "Music_HealPokemon": [ + 60, + 18071 + ], + "Music_IndigoPlateau": [ + 59, + 26706 + ], + "Music_JohtoGymBattle": [ + 58, + 25869 + ], + "Music_JohtoTrainerBattle": [ + 61, + 24726 + ], + "Music_JohtoWildBattle": [ + 61, + 24005 + ], + "Music_JohtoWildBattleNight": [ + 61, + 24668 + ], + "Music_KantoGymBattle": [ + 59, + 18208 + ], + "Music_KantoTrainerBattle": [ + 59, + 18938 + ], + "Music_KantoWildBattle": [ + 59, + 20589 + ], + "Music_LakeOfRage": [ + 59, + 26309 + ], + "Music_LakeOfRageRocketRadio": [ + 59, + 30129 + ], + "Music_LavenderTown": [ + 59, + 30511 + ], + "Music_Lighthouse": [ + 59, + 25961 + ], + "Music_LookBeauty": [ + 59, + 28222 + ], + "Music_LookHiker": [ + 61, + 29713 + ], + "Music_LookKimonoGirl": [ + 61, + 31160 + ], + "Music_LookLass": [ + 59, + 22427 + ], + "Music_LookMysticalMan": [ + 94, + 17467 + ], + "Music_LookOfficer": [ + 59, + 22573 + ], + "Music_LookPokemaniac": [ + 58, + 32225 + ], + "Music_LookRival": [ + 61, + 20345 + ], + "Music_LookRocket": [ + 61, + 29858 + ], + "Music_LookSage": [ + 59, + 25438 + ], + "Music_LookYoungster": [ + 61, + 26307 + ], + "Music_MagnetTrain": [ + 59, + 30192 + ], + "Music_MainMenu": [ + 61, + 30973 + ], + "Music_MobileAdapter": [ + 7, + 31879 + ], + "Music_MobileAdapterMenu": [ + 94, + 16415 + ], + "Music_MobileCenter": [ + 94, + 22045 + ], + "Music_Mom": [ + 61, + 27634 + ], + "Music_MtMoon": [ + 59, + 23337 + ], + "Music_MtMoonSquare": [ + 61, + 18453 + ], + "Music_NationalPark": [ + 61, + 21736 + ], + "Music_NewBarkTown": [ + 58, + 29395 + ], + "Music_Nothing": [ + 58, + 20899 + ], + "Music_PalletTown": [ + 61, + 19212 + ], + "Music_PokeFluteChannel": [ + 61, + 31507 + ], + "Music_PokemonCenter": [ + 59, + 21958 + ], + "Music_PokemonChannel": [ + 59, + 25695 + ], + "Music_PokemonLullaby": [ + 61, + 28025 + ], + "Music_PokemonMarch": [ + 61, + 28195 + ], + "Music_PostCredits": [ + 51, + 32158 + ], + "Music_Printer": [ + 60, + 18429 + ], + "Music_ProfOak": [ + 61, + 19946 + ], + "Music_ProfOaksPokemonTalk": [ + 61, + 19615 + ], + "Music_RivalBattle": [ + 58, + 22351 + ], + "Music_RocketBattle": [ + 58, + 23407 + ], + "Music_RocketHideout": [ + 59, + 27509 + ], + "Music_RocketTheme": [ + 61, + 30317 + ], + "Music_Route1": [ + 59, + 16384 + ], + "Music_Route12": [ + 59, + 17670 + ], + "Music_Route2": [ + 59, + 22749 + ], + "Music_Route26": [ + 59, + 28594 + ], + "Music_Route29": [ + 60, + 17286 + ], + "Music_Route3": [ + 59, + 17098 + ], + "Music_Route30": [ + 59, + 31745 + ], + "Music_Route36": [ + 58, + 21737 + ], + "Music_Route37": [ + 59, + 26955 + ], + "Music_RuinsOfAlphInterior": [ + 58, + 32158 + ], + "Music_RuinsOfAlphRadio": [ + 59, + 28107 + ], + "Music_SSAqua": [ + 58, + 28057 + ], + "Music_ShowMeAround": [ + 59, + 23512 + ], + "Music_SproutTower": [ + 61, + 26996 + ], + "Music_SuccessfulCapture": [ + 61, + 17922 + ], + "Music_SuicuneBattle": [ + 94, + 19329 + ], + "Music_Surf": [ + 61, + 20874 + ], + "Music_TinTower": [ + 61, + 26641 + ], + "Music_TitleScreen": [ + 58, + 30728 + ], + "Music_TrainerVictory": [ + 58, + 32427 + ], + "Music_UnionCave": [ + 61, + 23648 + ], + "Music_VermilionCity": [ + 58, + 30326 + ], + "Music_VictoryRoad": [ + 61, + 27762 + ], + "Music_VioletCity": [ + 60, + 16384 + ], + "Music_ViridianCity": [ + 61, + 16384 + ], + "Music_WildPokemonVictory": [ + 61, + 17688 + ], + "MustRechargeText": [ + 32, + 19751 + ], + "MysteryGiftGFX": [ + 65, + 21080 + ], + "NPCTradeCableText": [ + 63, + 20347 + ], + "NPCTrades": [ + 63, + 20056 + ], + "NamingScreenGFX_Border": [ + 4, + 23735 + ], + "NamingScreenGFX_Cursor": [ + 4, + 23751 + ], + "NamingScreenGFX_MiddleLine": [ + 4, + 24165 + ], + "NamingScreenGFX_UnderLine": [ + 4, + 24173 + ], + "NatuBackpic": [ + 89, + 21902 + ], + "NatuFrontpic": [ + 88, + 23241 + ], + "NatuPokedexEntry": [ + 115, + 21629 + ], + "NewPokedexEntry": [ + 62, + 30839 + ], + "NewPokedexOrder": [ + 16, + 19808 + ], + "NidokingBackpic": [ + 81, + 21328 + ], + "NidokingFrontpic": [ + 72, + 22902 + ], + "NidokingPokedexEntry": [ + 96, + 25699 + ], + "NidoqueenBackpic": [ + 84, + 19113 + ], + "NidoqueenFrontpic": [ + 73, + 19748 + ], + "NidoqueenPokedexEntry": [ + 96, + 25390 + ], + "NidoranFBackpic": [ + 86, + 27318 + ], + "NidoranFFrontpic": [ + 80, + 31442 + ], + "NidoranFPokedexEntry": [ + 96, + 25163 + ], + "NidoranMBackpic": [ + 83, + 20933 + ], + "NidoranMFrontpic": [ + 80, + 26783 + ], + "NidoranMPokedexEntry": [ + 96, + 25490 + ], + "NidorinaBackpic": [ + 84, + 27891 + ], + "NidorinaFrontpic": [ + 77, + 23714 + ], + "NidorinaPokedexEntry": [ + 96, + 25270 + ], + "NidorinoBackpic": [ + 84, + 31259 + ], + "NidorinoFrontpic": [ + 75, + 28411 + ], + "NidorinoPokedexEntry": [ + 96, + 25597 + ], + "NinetalesBackpic": [ + 82, + 25791 + ], + "NinetalesFrontpic": [ + 72, + 20498 + ], + "NinetalesPokedexEntry": [ + 96, + 26124 + ], + "NoPPLeftText": [ + 32, + 20377 + ], + "NoctowlBackpic": [ + 87, + 16708 + ], + "NoctowlFrontpic": [ + 77, + 17131 + ], + "NoctowlPokedexEntry": [ + 115, + 20153 + ], + "NotVeryEffectiveText": [ + 32, + 20673 + ], + "NothingHappenedText": [ + 32, + 21721 + ], + "NurseAskHealText": [ + 108, + 16762 + ], + "NurseDayText": [ + 108, + 16427 + ], + "NurseGoodbyeText": [ + 108, + 16907 + ], + "NurseMornText": [ + 108, + 16384 + ], + "NurseNiteText": [ + 108, + 16463 + ], + "NursePokerusText": [ + 108, + 16961 + ], + "NurseReturnPokemonText": [ + 108, + 16855 + ], + "NurseTakePokemonText": [ + 108, + 16829 + ], + "OctilleryBackpic": [ + 88, + 27044 + ], + "OctilleryFrontpic": [ + 79, + 25706 + ], + "OctilleryPokedexEntry": [ + 116, + 19778 + ], + "OddishBackpic": [ + 88, + 32370 + ], + "OddishFrontpic": [ + 83, + 22572 + ], + "OddishPokedexEntry": [ + 96, + 26678 + ], + "OmanyteBackpic": [ + 84, + 16384 + ], + "OmanyteFrontpic": [ + 82, + 22257 + ], + "OmanytePokedexEntry": [ + 115, + 17345 + ], + "OmanytePuzzleLZ": [ + 56, + 23707 + ], + "OmastarBackpic": [ + 74, + 32337 + ], + "OmastarFrontpic": [ + 78, + 27781 + ], + "OmastarPokedexEntry": [ + 115, + 17454 + ], + "OneHitKOText": [ + 32, + 20631 + ], + "OnixBackpic": [ + 84, + 26005 + ], + "OnixFrontpic": [ + 75, + 19015 + ], + "OnixPokedexEntry": [ + 110, + 19608 + ], + "OverworldSprites": [ + 5, + 18230 + ], + "PCMailGFX": [ + 56, + 29853 + ], + "PackGFX": [ + 4, + 20502 + ], + "PackMenuGFX": [ + 4, + 19222 + ], + "PadFrontpic": [ + 20, + 21163 + ], + "PalPacket_Pack": [ + 2, + 23606 + ], + "ParalyzedText": [ + 32, + 21848 + ], + "ParasBackpic": [ + 88, + 16384 + ], + "ParasFrontpic": [ + 81, + 20842 + ], + "ParasPokedexEntry": [ + 96, + 27007 + ], + "ParasectBackpic": [ + 80, + 32454 + ], + "ParasectFrontpic": [ + 76, + 30607 + ], + "ParasectPokedexEntry": [ + 96, + 27106 + ], + "PartyMenuOBPals": [ + 2, + 30337 + ], + "PasswordBottomTilemap": [ + 92, + 25885 + ], + "PasswordShiftTilemap": [ + 92, + 26105 + ], + "PasswordTopTilemap": [ + 92, + 25745 + ], + "PerishCountText": [ + 32, + 18532 + ], + "PersianBackpic": [ + 84, + 22580 + ], + "PersianFrontpic": [ + 76, + 19617 + ], + "PersianPokedexEntry": [ + 96, + 27768 + ], + "PhanpyBackpic": [ + 88, + 24347 + ], + "PhanpyFrontpic": [ + 83, + 17633 + ], + "PhanpyPokedexEntry": [ + 116, + 20536 + ], + "PhoneContacts": [ + 36, + 17503 + ], + "PhoneOutOfAreaScript": [ + 36, + 18007 + ], + "PhoneScript_JustTalkToThem": [ + 36, + 18016 + ], + "PhoneTilemapRLE": [ + 36, + 21898 + ], + "PichuAnimatedMobileGFX": [ + 92, + 19734 + ], + "PichuBackpic": [ + 88, + 18142 + ], + "PichuBorderMobileBGPalettes": [ + 69, + 29518 + ], + "PichuBorderMobileGFX": [ + 92, + 22600 + ], + "PichuBorderMobileOBPalettes": [ + 69, + 29454 + ], + "PichuBorderMobileTilemapAttrmap": [ + 69, + 29526 + ], + "PichuFrontpic": [ + 84, + 19500 + ], + "PichuPokedexEntry": [ + 115, + 21059 + ], + "PictureBookshelfText": [ + 108, + 17272 + ], + "PidgeotBackpic": [ + 86, + 23965 + ], + "PidgeotFrontpic": [ + 74, + 23325 + ], + "PidgeotPokedexEntry": [ + 96, + 24023 + ], + "PidgeottoBackpic": [ + 88, + 19579 + ], + "PidgeottoFrontpic": [ + 78, + 25807 + ], + "PidgeottoPokedexEntry": [ + 96, + 23925 + ], + "PidgeyBackpic": [ + 84, + 16776 + ], + "PidgeyFrontpic": [ + 80, + 31948 + ], + "PidgeyPokedexEntry": [ + 96, + 23802 + ], + "PikachuBackpic": [ + 85, + 28321 + ], + "PikachuFrontpic": [ + 80, + 17533 + ], + "PikachuPokedexEntry": [ + 96, + 24749 + ], + "PiloswineBackpic": [ + 89, + 21277 + ], + "PiloswineFrontpic": [ + 78, + 28437 + ], + "PiloswinePokedexEntry": [ + 116, + 19457 + ], + "PinecoBackpic": [ + 87, + 21850 + ], + "PinecoFrontpic": [ + 81, + 18880 + ], + "PinecoPokedexEntry": [ + 116, + 17584 + ], + "PinsirBackpic": [ + 82, + 26657 + ], + "PinsirFrontpic": [ + 75, + 31711 + ], + "PinsirPokedexEntry": [ + 110, + 23035 + ], + "PlaceUnownPrinterFrontpic": [ + 5, + 28076 + ], + "PlayerHitTimesText": [ + 32, + 21221 + ], + "PokeComNurseDayText": [ + 108, + 16598 + ], + "PokeComNurseMornText": [ + 108, + 16522 + ], + "PokeComNurseNiteText": [ + 108, + 16667 + ], + "PokeComNursePokerusText": [ + 108, + 17110 + ], + "PokecenterSignText": [ + 108, + 17791 + ], + "PokedexCursorPalette": [ + 2, + 20418 + ], + "PokedexDataPointerTable": [ + 17, + 17272 + ], + "PokedexLZ": [ + 16, + 21774 + ], + "PokedexQuestionMarkPalette": [ + 2, + 20410 + ], + "PokedexSlowpokeLZ": [ + 16, + 22192 + ], + "PokegearGFX": [ + 119, + 25316 + ], + "PokegearPhoneIconGFX": [ + 62, + 20260 + ], + "PokegearSpritesGFX": [ + 36, + 21725 + ], + "PokemonCries": [ + 60, + 26503 + ], + "PokemonFellFromTreeText": [ + 32, + 18296 + ], + "PokemonNames": [ + 20, + 29572 + ], + "PokemonNewsGFX": [ + 95, + 26366 + ], + "PokemonNewsPalettes": [ + 95, + 28662 + ], + "PokemonNewsTileAttrmap": [ + 95, + 27534 + ], + "PokemonPalettes": [ + 2, + 26830 + ], + "PokemonPicPointers": [ + 72, + 16384 + ], + "PokemonProfPic": [ + 86, + 16734 + ], + "PolitoedBackpic": [ + 88, + 22405 + ], + "PolitoedFrontpic": [ + 76, + 22806 + ], + "PolitoedPokedexEntry": [ + 115, + 22603 + ], + "PoliwagBackpic": [ + 89, + 17351 + ], + "PoliwagFrontpic": [ + 84, + 25626 + ], + "PoliwagPokedexEntry": [ + 96, + 28561 + ], + "PoliwhirlBackpic": [ + 86, + 24641 + ], + "PoliwhirlFrontpic": [ + 77, + 20086 + ], + "PoliwhirlPokedexEntry": [ + 96, + 28669 + ], + "PoliwrathBackpic": [ + 84, + 30141 + ], + "PoliwrathFrontpic": [ + 75, + 22474 + ], + "PoliwrathPokedexEntry": [ + 96, + 28774 + ], + "PonytaBackpic": [ + 84, + 24868 + ], + "PonytaFrontpic": [ + 78, + 23150 + ], + "PonytaPokedexEntry": [ + 110, + 17650 + ], + "Porygon2Backpic": [ + 87, + 21211 + ], + "Porygon2Frontpic": [ + 80, + 30417 + ], + "Porygon2PokedexEntry": [ + 116, + 20748 + ], + "PorygonBackpic": [ + 87, + 32294 + ], + "PorygonFrontpic": [ + 80, + 27307 + ], + "PorygonPokedexEntry": [ + 115, + 17235 + ], + "PredefPals": [ + 2, + 24054 + ], + "PrepMonFrontpic": [ + 0, + 14214 + ], + "PresentFailedText": [ + 32, + 22587 + ], + "PrimeapeBackpic": [ + 85, + 24393 + ], + "PrimeapeFrontpic": [ + 74, + 31456 + ], + "PrimeapePokedexEntry": [ + 96, + 28217 + ], + "ProtectedByMistText": [ + 32, + 21281 + ], + "ProtectedByText": [ + 32, + 21929 + ], + "ProtectedItselfText": [ + 32, + 22117 + ], + "ProtectingItselfText": [ + 32, + 22138 + ], + "PsyduckBackpic": [ + 85, + 27965 + ], + "PsyduckFrontpic": [ + 81, + 22782 + ], + "PsyduckPokedexEntry": [ + 96, + 27886 + ], + "PupitarBackpic": [ + 84, + 20657 + ], + "PupitarFrontpic": [ + 82, + 23149 + ], + "PupitarPokedexEntry": [ + 116, + 22281 + ], + "PutACurseText": [ + 32, + 22077 + ], + "PuzzlePieceBorderData.TileBordersGFX": [ + 56, + 22307 + ], + "QuagsireBackpic": [ + 87, + 22803 + ], + "QuagsireFrontpic": [ + 79, + 32183 + ], + "QuagsirePokedexEntry": [ + 116, + 16605 + ], + "QuestionEmote": [ + 65, + 17296 + ], + "QuilavaBackpic": [ + 83, + 25393 + ], + "QuilavaFrontpic": [ + 73, + 32028 + ], + "QuilavaPokedexEntry": [ + 115, + 19251 + ], + "QwilfishBackpic": [ + 84, + 17558 + ], + "QwilfishFrontpic": [ + 82, + 29649 + ], + "QwilfishPokedexEntry": [ + 116, + 18353 + ], + "RadioTilemapRLE": [ + 36, + 21773 + ], + "RageBuildingText": [ + 32, + 20723 + ], + "RaichuBackpic": [ + 84, + 29766 + ], + "RaichuFrontpic": [ + 74, + 30565 + ], + "RaichuPokedexEntry": [ + 96, + 24855 + ], + "RaikouBackpic": [ + 89, + 16627 + ], + "RaikouFrontpic": [ + 72, + 24064 + ], + "RaikouPokedexEntry": [ + 116, + 21867 + ], + "RapidashBackpic": [ + 83, + 22976 + ], + "RapidashFrontpic": [ + 73, + 17624 + ], + "RapidashPokedexEntry": [ + 110, + 17758 + ], + "RaticateBackpic": [ + 85, + 26183 + ], + "RaticateFrontpic": [ + 76, + 21213 + ], + "RaticatePokedexEntry": [ + 96, + 24227 + ], + "RattataBackpic": [ + 86, + 30308 + ], + "RattataFrontpic": [ + 80, + 22553 + ], + "RattataPokedexEntry": [ + 96, + 24125 + ], + "ReadTileToAnimBuffer": [ + 63, + 18082 + ], + "ReceivedItemText": [ + 108, + 17992 + ], + "RecoilText": [ + 32, + 21325 + ], + "RecoveredUsingText": [ + 32, + 19394 + ], + "ReflectEffectText": [ + 32, + 21703 + ], + "RegainedHealthText": [ + 32, + 20492 + ], + "RegisteredNumber1Text": [ + 108, + 18884 + ], + "RegisteredNumber2Text": [ + 108, + 18913 + ], + "ReleasedByText": [ + 32, + 22372 + ], + "RemoraidBackpic": [ + 85, + 29381 + ], + "RemoraidFrontpic": [ + 84, + 25247 + ], + "RemoraidPokedexEntry": [ + 116, + 19667 + ], + "RestedText": [ + 32, + 20457 + ], + "RhydonBackpic": [ + 83, + 18047 + ], + "RhydonFrontpic": [ + 74, + 20510 + ], + "RhydonPokedexEntry": [ + 110, + 21445 + ], + "RhyhornBackpic": [ + 87, + 30200 + ], + "RhyhornFrontpic": [ + 74, + 22399 + ], + "RhyhornPokedexEntry": [ + 110, + 21341 + ], + "RoamMaps": [ + 10, + 25615 + ], + "RockMonMaps": [ + 46, + 17093 + ], + "RoofPals": [ + 2, + 30057 + ], + "Roofs": [ + 7, + 16444 + ], + "RotateUnownFrontpic": [ + 56, + 16384 + ], + "SFX": [ + 58, + 21116 + ], + "SadEmote": [ + 65, + 17424 + ], + "SafeguardProtectText": [ + 32, + 22323 + ], + "SandshrewBackpic": [ + 83, + 26192 + ], + "SandshrewFrontpic": [ + 80, + 30930 + ], + "SandshrewPokedexEntry": [ + 96, + 24964 + ], + "SandslashBackpic": [ + 83, + 19286 + ], + "SandslashFrontpic": [ + 75, + 29244 + ], + "SandslashPokedexEntry": [ + 96, + 25063 + ], + "SandstormBrewedText": [ + 32, + 22244 + ], + "SandstormHitsText": [ + 32, + 18509 + ], + "ScizorBackpic": [ + 85, + 22233 + ], + "ScizorFrontpic": [ + 73, + 21852 + ], + "ScizorPokedexEntry": [ + 116, + 18465 + ], + "ScrollTileDown": [ + 63, + 17258 + ], + "ScrollTileLeft": [ + 63, + 17191 + ], + "ScrollTileRight": [ + 63, + 17211 + ], + "ScrollTileRightLeft": [ + 63, + 17161 + ], + "ScrollTileUp": [ + 63, + 17231 + ], + "ScytherBackpic": [ + 85, + 18962 + ], + "ScytherFrontpic": [ + 75, + 23333 + ], + "ScytherPokedexEntry": [ + 110, + 22609 + ], + "SeadraBackpic": [ + 83, + 19698 + ], + "SeadraFrontpic": [ + 80, + 18103 + ], + "SeadraPokedexEntry": [ + 110, + 21944 + ], + "SeakingBackpic": [ + 85, + 27253 + ], + "SeakingFrontpic": [ + 75, + 25036 + ], + "SeakingPokedexEntry": [ + 110, + 22160 + ], + "SeelBackpic": [ + 87, + 22486 + ], + "SeelFrontpic": [ + 79, + 16384 + ], + "SeelPokedexEntry": [ + 110, + 18623 + ], + "SelectStartGFX": [ + 71, + 22142 + ], + "SentAllToMomText": [ + 32, + 19005 + ], + "SentHalfToMomText": [ + 32, + 18986 + ], + "SentSomeToMomText": [ + 32, + 18940 + ], + "SentretBackpic": [ + 88, + 27829 + ], + "SentretFrontpic": [ + 85, + 17122 + ], + "SentretPokedexEntry": [ + 115, + 19819 + ], + "SharedPainText": [ + 32, + 20763 + ], + "ShedLeechSeedText": [ + 32, + 22394 + ], + "ShellderBackpic": [ + 83, + 27381 + ], + "ShellderFrontpic": [ + 82, + 24038 + ], + "ShellderPokedexEntry": [ + 110, + 19048 + ], + "ShockEmote": [ + 65, + 17232 + ], + "Shrink1Pic": [ + 19, + 21065 + ], + "Shrink2Pic": [ + 19, + 21209 + ], + "ShuckleBackpic": [ + 89, + 17830 + ], + "ShuckleFrontpic": [ + 84, + 24489 + ], + "ShucklePokedexEntry": [ + 116, + 18574 + ], + "SkarmoryBackpic": [ + 88, + 31634 + ], + "SkarmoryFrontpic": [ + 74, + 27888 + ], + "SkarmoryPokedexEntry": [ + 116, + 20108 + ], + "SketchedText": [ + 32, + 20803 + ], + "SkiploomBackpic": [ + 87, + 28692 + ], + "SkiploomFrontpic": [ + 81, + 26608 + ], + "SkiploomPokedexEntry": [ + 115, + 22824 + ], + "SleepEmote": [ + 65, + 17616 + ], + "Slots1LZ": [ + 36, + 29773 + ], + "Slots2LZ": [ + 36, + 30157 + ], + "Slots3LZ": [ + 36, + 30765 + ], + "SlotsTilemap": [ + 36, + 29533 + ], + "SlowbroBackpic": [ + 86, + 21582 + ], + "SlowbroFrontpic": [ + 74, + 24245 + ], + "SlowbroPokedexEntry": [ + 110, + 17973 + ], + "SlowkingBackpic": [ + 82, + 30496 + ], + "SlowkingFrontpic": [ + 75, + 17265 + ], + "SlowkingPokedexEntry": [ + 116, + 17042 + ], + "SlowpokeBackpic": [ + 89, + 18537 + ], + "SlowpokeFrontpic": [ + 82, + 18200 + ], + "SlowpokePokedexEntry": [ + 110, + 17875 + ], + "SlugmaBackpic": [ + 87, + 17354 + ], + "SlugmaFrontpic": [ + 82, + 17293 + ], + "SlugmaPokedexEntry": [ + 116, + 19128 + ], + "SmeargleBackpic": [ + 85, + 23314 + ], + "SmeargleFrontpic": [ + 78, + 21817 + ], + "SmearglePokedexEntry": [ + 116, + 20960 + ], + "SmoochumBackpic": [ + 88, + 17853 + ], + "SmoochumFrontpic": [ + 82, + 18653 + ], + "SmoochumPokedexEntry": [ + 116, + 21291 + ], + "SneaselBackpic": [ + 86, + 20209 + ], + "SneaselFrontpic": [ + 78, + 18446 + ], + "SneaselPokedexEntry": [ + 116, + 18810 + ], + "SnorlaxBackpic": [ + 82, + 32597 + ], + "SnorlaxFrontpic": [ + 78, + 19802 + ], + "SnorlaxPokedexEntry": [ + 115, + 17871 + ], + "SnubbullBackpic": [ + 86, + 29316 + ], + "SnubbullFrontpic": [ + 79, + 18933 + ], + "SnubbullPokedexEntry": [ + 116, + 18144 + ], + "SpawnPoints": [ + 5, + 21163 + ], + "SpearowBackpic": [ + 87, + 25619 + ], + "SpearowFrontpic": [ + 80, + 23619 + ], + "SpearowPokedexEntry": [ + 96, + 24323 + ], + "SpecialPhoneCallList": [ + 36, + 17959 + ], + "SpikesText": [ + 32, + 22161 + ], + "SpinarakBackpic": [ + 89, + 16384 + ], + "SpinarakFrontpic": [ + 87, + 28994 + ], + "SpinarakPokedexEntry": [ + 115, + 20498 + ], + "SpiteEffectText": [ + 32, + 20863 + ], + "SpriteMons": [ + 5, + 17557 + ], + "SquirtleBackpic": [ + 89, + 17591 + ], + "SquirtleFrontpic": [ + 81, + 23266 + ], + "SquirtlePokedexEntry": [ + 96, + 22822 + ], + "Stadium2N64Attrmap": [ + 92, + 29975 + ], + "Stadium2N64GFX": [ + 92, + 28447 + ], + "Stadium2N64Tilemap": [ + 92, + 29615 + ], + "StandingTileFrame": [ + 63, + 18035 + ], + "StandingTileFrame8": [ + 63, + 17151 + ], + "StantlerBackpic": [ + 85, + 22954 + ], + "StantlerFrontpic": [ + 76, + 20415 + ], + "StantlerPokedexEntry": [ + 116, + 20852 + ], + "StarmieBackpic": [ + 83, + 32501 + ], + "StarmieFrontpic": [ + 78, + 25144 + ], + "StarmiePokedexEntry": [ + 110, + 22390 + ], + "StartPerishText": [ + 32, + 22210 + ], + "StartedNightmareText": [ + 32, + 22027 + ], + "StaryuBackpic": [ + 88, + 19864 + ], + "StaryuFrontpic": [ + 80, + 28868 + ], + "StaryuPokedexEntry": [ + 110, + 22274 + ], + "StatsScreenPagePals": [ + 2, + 20306 + ], + "StatsScreenPageTilesGFX": [ + 62, + 18864 + ], + "StatsScreen_PlaceFrontpic": [ + 19, + 25126 + ], + "StdScripts": [ + 47, + 16384 + ], + "SteelixBackpic": [ + 84, + 22196 + ], + "SteelixFrontpic": [ + 74, + 16585 + ], + "SteelixPokedexEntry": [ + 116, + 18044 + ], + "StoleText": [ + 32, + 21978 + ], + "StoringEnergyText": [ + 32, + 20078 + ], + "SubFadedText": [ + 32, + 21456 + ], + "SubTookDamageText": [ + 32, + 21421 + ], + "SuckedHealthText": [ + 32, + 21008 + ], + "SudowoodoBackpic": [ + 85, + 16384 + ], + "SudowoodoFrontpic": [ + 80, + 16959 + ], + "SudowoodoPokedexEntry": [ + 115, + 22489 + ], + "SuicuneBackpic": [ + 82, + 30073 + ], + "SuicuneFrontpic": [ + 72, + 30736 + ], + "SuicunePokedexEntry": [ + 116, + 22082 + ], + "SunGotBrightText": [ + 32, + 22456 + ], + "SunfloraBackpic": [ + 83, + 17218 + ], + "SunfloraFrontpic": [ + 79, + 21443 + ], + "SunfloraPokedexEntry": [ + 115, + 23279 + ], + "SunkernBackpic": [ + 87, + 25929 + ], + "SunkernFrontpic": [ + 84, + 30888 + ], + "SunkernPokedexEntry": [ + 115, + 23175 + ], + "SuperEffectiveText": [ + 32, + 20650 + ], + "SwarmGrassWildMons": [ + 10, + 30928 + ], + "SwarmWaterWildMons": [ + 10, + 31023 + ], + "SwinubBackpic": [ + 85, + 32544 + ], + "SwinubFrontpic": [ + 87, + 31698 + ], + "SwinubPokedexEntry": [ + 116, + 19341 + ], + "TMHMMoves": [ + 4, + 22138 + ], + "TVText": [ + 108, + 17598 + ], + "TangelaBackpic": [ + 89, + 20163 + ], + "TangelaFrontpic": [ + 79, + 18300 + ], + "TangelaPokedexEntry": [ + 110, + 21644 + ], + "TaurosBackpic": [ + 89, + 19472 + ], + "TaurosFrontpic": [ + 72, + 27437 + ], + "TaurosPokedexEntry": [ + 110, + 23151 + ], + "TeamRocketOathText": [ + 108, + 17369 + ], + "TeddiursaBackpic": [ + 88, + 24071 + ], + "TeddiursaFrontpic": [ + 83, + 28171 + ], + "TeddiursaPokedexEntry": [ + 116, + 18906 + ], + "TentacoolBackpic": [ + 88, + 16976 + ], + "TentacoolFrontpic": [ + 82, + 24480 + ], + "TentacoolPokedexEntry": [ + 110, + 17105 + ], + "TentacruelBackpic": [ + 84, + 28266 + ], + "TentacruelFrontpic": [ + 77, + 27969 + ], + "TentacruelPokedexEntry": [ + 110, + 17207 + ], + "Text_BallCaught": [ + 113, + 23319 + ], + "Text_BattleEffectActivate": [ + 112, + 19654 + ], + "Text_BattleFoeEffectActivate": [ + 112, + 19691 + ], + "Text_BattleUser": [ + 112, + 19726 + ], + "Text_BreedHuh": [ + 112, + 19888 + ], + "Text_Gained": [ + 112, + 17052 + ], + "Text_MoveForgetCount": [ + 113, + 22336 + ], + "Text_NPCTraded": [ + 111, + 21545 + ], + "Text_PlayedPokeFlute": [ + 113, + 23620 + ], + "TheEndGFX": [ + 50, + 32046 + ], + "TiedAgainstText": [ + 32, + 18923 + ], + "TilesetBGPalette": [ + 2, + 29465 + ], + "Tilesets": [ + 19, + 21910 + ], + "TimeFishGroups": [ + 36, + 26223 + ], + "TitleCrystalGFX": [ + 67, + 31982 + ], + "TitleLogoGFX": [ + 67, + 29478 + ], + "TitleScreenPalettes": [ + 67, + 32478 + ], + "TitleSuicuneGFX": [ + 67, + 28486 + ], + "TogepiBackpic": [ + 88, + 25442 + ], + "TogepiFrontpic": [ + 87, + 19609 + ], + "TogepiPokedexEntry": [ + 115, + 21398 + ], + "TogeticBackpic": [ + 85, + 17491 + ], + "TogeticFrontpic": [ + 78, + 31681 + ], + "TogeticPokedexEntry": [ + 115, + 21506 + ], + "TooWeakSubText": [ + 32, + 21389 + ], + "TookAimText": [ + 32, + 20790 + ], + "TookDownWithItText": [ + 32, + 20698 + ], + "TotodileBackpic": [ + 86, + 28984 + ], + "TotodileFrontpic": [ + 80, + 19809 + ], + "TotodilePokedexEntry": [ + 115, + 19476 + ], + "TownMapGFX": [ + 62, + 19360 + ], + "TownMapPals.PalMap": [ + 36, + 24395 + ], + "TradeAnim_AnimateFrontpic": [ + 10, + 21639 + ], + "TradeAnim_GetFrontpic": [ + 10, + 21649 + ], + "TradeAnim_ShowFrontpic": [ + 10, + 21699 + ], + "TradeAnim_ShowGetmonFrontpic": [ + 10, + 21696 + ], + "TradeAnim_ShowGivemonFrontpic": [ + 10, + 21691 + ], + "TradeArrowLeftGFX": [ + 10, + 22827 + ], + "TradeArrowRightGFX": [ + 10, + 22811 + ], + "TradeBallGFX": [ + 10, + 23259 + ], + "TradeBubbleGFX": [ + 10, + 22875 + ], + "TradeCableGFX": [ + 10, + 22843 + ], + "TradeGameBoyLZ": [ + 10, + 22939 + ], + "TradeGameBoyTilemap": [ + 10, + 22727 + ], + "TradeLinkTubeTilemap": [ + 10, + 22775 + ], + "TradePoofGFX": [ + 10, + 23355 + ], + "TradeTexts": [ + 63, + 20307 + ], + "TradedForText": [ + 63, + 20352 + ], + "TrainerCardGFX": [ + 34, + 18373 + ], + "TrainerCard_JohtoBadgesOAM": [ + 9, + 21705 + ], + "TrainerClassAttributes": [ + 14, + 21916 + ], + "TrainerClassNames": [ + 11, + 16879 + ], + "TrainerEncounterMusic": [ + 58, + 20519 + ], + "TrainerGroups": [ + 14, + 22937 + ], + "TrainerPalettes": [ + 2, + 28878 + ], + "TrainerPicPointers": [ + 74, + 16384 + ], + "Trainers": [ + 14, + 23071 + ], + "TransformedText": [ + 32, + 21657 + ], + "TransformedTypeText": [ + 32, + 21586 + ], + "TrashCanText": [ + 108, + 17702 + ], + "TreeMonMaps": [ + 46, + 16990 + ], + "TreeMons": [ + 46, + 17128 + ], + "TurnedAwayText": [ + 32, + 20308 + ], + "TypeMatchups": [ + 13, + 19377 + ], + "TypeNames": [ + 20, + 18811 + ], + "TyphlosionBackpic": [ + 84, + 18337 + ], + "TyphlosionFrontpic": [ + 72, + 31821 + ], + "TyphlosionPokedexEntry": [ + 115, + 19360 + ], + "TyranitarBackpic": [ + 83, + 18873 + ], + "TyranitarFrontpic": [ + 73, + 24963 + ], + "TyranitarPokedexEntry": [ + 116, + 22395 + ], + "TyrogueBackpic": [ + 85, + 21511 + ], + "TyrogueFrontpic": [ + 81, + 26138 + ], + "TyroguePokedexEntry": [ + 116, + 21067 + ], + "UmbreonBackpic": [ + 86, + 20553 + ], + "UmbreonFrontpic": [ + 79, + 22062 + ], + "UmbreonPokedexEntry": [ + 116, + 16815 + ], + "UnaffectedText": [ + 32, + 20577 + ], + "UnleashedEnergyText": [ + 32, + 20100 + ], + "UnownABackpic": [ + 89, + 25801 + ], + "UnownAFrontpic": [ + 89, + 22105 + ], + "UnownAnimationIdlePointers": [ + 52, + 25553 + ], + "UnownAnimationPointers": [ + 52, + 25129 + ], + "UnownBBackpic": [ + 89, + 25164 + ], + "UnownBFrontpic": [ + 89, + 18302 + ], + "UnownBitmasksPointers": [ + 52, + 31443 + ], + "UnownCBackpic": [ + 89, + 23263 + ], + "UnownCFrontpic": [ + 87, + 30500 + ], + "UnownDBackpic": [ + 88, + 32614 + ], + "UnownDFrontpic": [ + 84, + 21427 + ], + "UnownEBackpic": [ + 89, + 24893 + ], + "UnownEFrontpic": [ + 75, + 32526 + ], + "UnownFBackpic": [ + 81, + 32615 + ], + "UnownFFrontpic": [ + 89, + 21695 + ], + "UnownFont": [ + 119, + 16384 + ], + "UnownFramesPointers": [ + 54, + 22953 + ], + "UnownGBackpic": [ + 89, + 23971 + ], + "UnownGFrontpic": [ + 88, + 21845 + ], + "UnownHBackpic": [ + 87, + 32591 + ], + "UnownHFrontpic": [ + 88, + 29635 + ], + "UnownIBackpic": [ + 89, + 26907 + ], + "UnownIFrontpic": [ + 89, + 24135 + ], + "UnownJBackpic": [ + 89, + 25033 + ], + "UnownJFrontpic": [ + 89, + 20621 + ], + "UnownKBackpic": [ + 89, + 26045 + ], + "UnownKFrontpic": [ + 89, + 16870 + ], + "UnownLBackpic": [ + 89, + 26391 + ], + "UnownLFrontpic": [ + 89, + 21066 + ], + "UnownMBackpic": [ + 89, + 25924 + ], + "UnownMFrontpic": [ + 89, + 21487 + ], + "UnownNBackpic": [ + 89, + 25678 + ], + "UnownNFrontpic": [ + 89, + 19933 + ], + "UnownOBackpic": [ + 89, + 25295 + ], + "UnownOFrontpic": [ + 88, + 28090 + ], + "UnownPBackpic": [ + 89, + 26813 + ], + "UnownPFrontpic": [ + 89, + 23078 + ], + "UnownPicPointers": [ + 73, + 16384 + ], + "UnownPokedexEntry": [ + 116, + 17267 + ], + "UnownPuzzleCursorGFX": [ + 56, + 22469 + ], + "UnownPuzzleStartCancelLZ": [ + 56, + 22533 + ], + "UnownQBackpic": [ + 89, + 26606 + ], + "UnownQFrontpic": [ + 89, + 22889 + ], + "UnownRBackpic": [ + 89, + 27001 + ], + "UnownRFrontpic": [ + 89, + 24747 + ], + "UnownSBackpic": [ + 89, + 24601 + ], + "UnownSFrontpic": [ + 88, + 27307 + ], + "UnownTBackpic": [ + 89, + 26162 + ], + "UnownTFrontpic": [ + 88, + 28350 + ], + "UnownUBackpic": [ + 89, + 26499 + ], + "UnownUFrontpic": [ + 89, + 22506 + ], + "UnownVBackpic": [ + 89, + 24298 + ], + "UnownVFrontpic": [ + 88, + 24622 + ], + "UnownWBackpic": [ + 89, + 25552 + ], + "UnownWFrontpic": [ + 87, + 29598 + ], + "UnownWalls": [ + 34, + 28348 + ], + "UnownXBackpic": [ + 89, + 26278 + ], + "UnownXFrontpic": [ + 89, + 19703 + ], + "UnownYBackpic": [ + 89, + 26711 + ], + "UnownYFrontpic": [ + 89, + 23798 + ], + "UnownZBackpic": [ + 89, + 25425 + ], + "UnownZFrontpic": [ + 87, + 31399 + ], + "UnusedMobilePulsePalettes": [ + 66, + 20727 + ], + "UnusedRivalLossText": [ + 32, + 19023 + ], + "UnusedRivalWinText": [ + 32, + 19091 + ], + "Unused_HOF_AnimateAlignedFrontpic": [ + 52, + 18025 + ], + "UrsaringBackpic": [ + 88, + 23518 + ], + "UrsaringFrontpic": [ + 77, + 20814 + ], + "UrsaringPokedexEntry": [ + 116, + 19009 + ], + "UsedBindText": [ + 32, + 19985 + ], + "VaporeonBackpic": [ + 88, + 16680 + ], + "VaporeonFrontpic": [ + 78, + 16384 + ], + "VaporeonPokedexEntry": [ + 115, + 16932 + ], + "VenomothBackpic": [ + 82, + 20910 + ], + "VenomothFrontpic": [ + 76, + 22010 + ], + "VenomothPokedexEntry": [ + 96, + 27327 + ], + "VenonatBackpic": [ + 85, + 31493 + ], + "VenonatFrontpic": [ + 81, + 24713 + ], + "VenonatPokedexEntry": [ + 96, + 27219 + ], + "VenusaurBackpic": [ + 83, + 16384 + ], + "VenusaurFrontpic": [ + 72, + 28545 + ], + "VenusaurPokedexEntry": [ + 96, + 22387 + ], + "VictreebelBackpic": [ + 87, + 18000 + ], + "VictreebelFrontpic": [ + 74, + 29673 + ], + "VictreebelPokedexEntry": [ + 110, + 17006 + ], + "VileplumeBackpic": [ + 85, + 19328 + ], + "VileplumeFrontpic": [ + 77, + 25855 + ], + "VileplumePokedexEntry": [ + 96, + 26904 + ], + "VoltorbBackpic": [ + 89, + 20392 + ], + "VoltorbFrontpic": [ + 88, + 20718 + ], + "VoltorbPokedexEntry": [ + 110, + 20144 + ], + "VulpixBackpic": [ + 85, + 26540 + ], + "VulpixFrontpic": [ + 77, + 30774 + ], + "VulpixPokedexEntry": [ + 96, + 26011 + ], + "WaitTileAnimation": [ + 63, + 17150 + ], + "WantsToBattleText": [ + 32, + 18345 + ], + "WartortleBackpic": [ + 85, + 25110 + ], + "WartortleFrontpic": [ + 77, + 17874 + ], + "WartortlePokedexEntry": [ + 96, + 22931 + ], + "WasBurnedText": [ + 32, + 21052 + ], + "WasDefrostedText": [ + 32, + 22059 + ], + "WasDisabledText": [ + 32, + 21533 + ], + "WasFrozenText": [ + 32, + 21085 + ], + "WasPoisonedText": [ + 32, + 20949 + ], + "WasSeededText": [ + 32, + 21496 + ], + "WaveSamples": [ + 58, + 19890 + ], + "WeedleBackpic": [ + 88, + 29379 + ], + "WeedleFrontpic": [ + 86, + 28651 + ], + "WeedlePokedexEntry": [ + 96, + 23476 + ], + "WeepinbellBackpic": [ + 86, + 26984 + ], + "WeepinbellFrontpic": [ + 80, + 19242 + ], + "WeepinbellPokedexEntry": [ + 110, + 16893 + ], + "WeezingBackpic": [ + 86, + 22607 + ], + "WeezingFrontpic": [ + 74, + 26071 + ], + "WeezingPokedexEntry": [ + 110, + 21228 + ], + "WentToSleepText": [ + 32, + 20439 + ], + "WhirlpoolTrapText": [ + 32, + 20004 + ], + "WigglytuffBackpic": [ + 88, + 28609 + ], + "WigglytuffFrontpic": [ + 78, + 20479 + ], + "WigglytuffPokedexEntry": [ + 96, + 26345 + ], + "WildCelebiAppearedText": [ + 32, + 18323 + ], + "WildPokemonAppearedText": [ + 32, + 18246 + ], + "WindowText": [ + 108, + 17568 + ], + "WobbuffetBackpic": [ + 88, + 25172 + ], + "WobbuffetFrontpic": [ + 79, + 26901 + ], + "WobbuffetPokedexEntry": [ + 116, + 17373 + ], + "WokeUpText": [ + 32, + 19706 + ], + "WontDropAnymoreText": [ + 32, + 21135 + ], + "WontObeyText": [ + 32, + 20292 + ], + "WontRiseAnymoreText": [ + 32, + 21106 + ], + "WooperBackpic": [ + 89, + 19239 + ], + "WooperFrontpic": [ + 85, + 30790 + ], + "WooperPokedexEntry": [ + 116, + 16504 + ], + "WrappedByText": [ + 32, + 20036 + ], + "WriteTileFromAnimBuffer": [ + 63, + 18070 + ], + "WrongNumber.script": [ + 36, + 16952 + ], + "XatuBackpic": [ + 87, + 20571 + ], + "XatuFrontpic": [ + 79, + 24508 + ], + "XatuPokedexEntry": [ + 115, + 21737 + ], + "YanmaBackpic": [ + 82, + 26224 + ], + "YanmaFrontpic": [ + 78, + 21149 + ], + "YanmaPokedexEntry": [ + 116, + 16384 + ], + "ZapdosBackpic": [ + 87, + 27161 + ], + "ZapdosFrontpic": [ + 73, + 27004 + ], + "ZapdosPokedexEntry": [ + 115, + 18071 + ], + "ZubatBackpic": [ + 83, + 27776 + ], + "ZubatFrontpic": [ + 81, + 28936 + ], + "ZubatPokedexEntry": [ + 96, + 26461 + ], + "_ActorNameText": [ + 112, + 19834 + ], + "_AlreadyASaveFileText": [ + 113, + 17827 + ], + "_AlreadySetUpText": [ + 111, + 17734 + ], + "_AlreadySurfingText": [ + 112, + 18004 + ], + "_AlreadyUsingStrengthText": [ + 112, + 18257 + ], + "_AnEggCantHoldAnItemText": [ + 112, + 19327 + ], + "_AnimationTypeText": [ + 112, + 20412 + ], + "_AnotherSaveFileText": [ + 113, + 17881 + ], + "_AreWeGeniusesText": [ + 111, + 23908 + ], + "_AreYouABoyOrAreYouAGirlText": [ + 112, + 19619 + ], + "_AskCutText": [ + 112, + 18909 + ], + "_AskDeleteMoveText": [ + 113, + 24282 + ], + "_AskFloorElevatorText": [ + 111, + 21180 + ], + "_AskForgetMoveText": [ + 113, + 22217 + ], + "_AskGiveNicknameText": [ + 113, + 23423 + ], + "_AskHeadbuttText": [ + 112, + 18620 + ], + "_AskItemMoveText": [ + 112, + 19555 + ], + "_AskQuantityThrowAwayText": [ + 112, + 19387 + ], + "_AskRockSmashText": [ + 112, + 18724 + ], + "_AskStrengthText": [ + 112, + 18336 + ], + "_AskSurfText": [ + 112, + 18028 + ], + "_AskThrowAwayText": [ + 112, + 19365 + ], + "_AskWaterfallText": [ + 112, + 18111 + ], + "_AskWhirlpoolText": [ + 112, + 18532 + ], + "_BGEventText": [ + 113, + 18172 + ], + "_BTExcuseMeText": [ + 113, + 22839 + ], + "_BackAlreadyText": [ + 111, + 24114 + ], + "_BadgeRequiredText": [ + 112, + 17831 + ], + "_BallAlmostHadItText": [ + 113, + 23267 + ], + "_BallAppearedCaughtText": [ + 113, + 23235 + ], + "_BallBlockedText": [ + 113, + 24016 + ], + "_BallBoxFullText": [ + 113, + 24122 + ], + "_BallBrokeFreeText": [ + 113, + 23206 + ], + "_BallDodgedText": [ + 113, + 23130 + ], + "_BallDontBeAThiefText": [ + 113, + 24047 + ], + "_BallMissedText": [ + 113, + 23184 + ], + "_BallSentToPCText": [ + 113, + 23352 + ], + "_BallSoCloseText": [ + 113, + 23290 + ], + "_BargainShopComeAgainText": [ + 113, + 20038 + ], + "_BargainShopFinalPriceText": [ + 113, + 19888 + ], + "_BargainShopIntroText": [ + 113, + 19783 + ], + "_BargainShopNoFundsText": [ + 113, + 20008 + ], + "_BargainShopPackFullText": [ + 113, + 19926 + ], + "_BargainShopSoldOutText": [ + 113, + 19959 + ], + "_BargainShopThanksText": [ + 113, + 19917 + ], + "_BattleDugText": [ + 112, + 19820 + ], + "_BattleFlewText": [ + 112, + 19804 + ], + "_BattleGlowingText": [ + 112, + 19790 + ], + "_BattleLoweredHeadText": [ + 112, + 19770 + ], + "_BattleMadeWhirlwindText": [ + 112, + 19730 + ], + "_BattleMonNickCommaText": [ + 112, + 17181 + ], + "_BattleMonNicknameText": [ + 112, + 17175 + ], + "_BattleStatFellText": [ + 112, + 19718 + ], + "_BattleStatSharplyFellText": [ + 112, + 19701 + ], + "_BattleStatWentUpText": [ + 112, + 19680 + ], + "_BattleStatWentWayUpText": [ + 112, + 19664 + ], + "_BattleTookSunlightText": [ + 112, + 19750 + ], + "_BattleTowerReturnWhenReadyText": [ + 113, + 22882 + ], + "_BenFernText1": [ + 111, + 19176 + ], + "_BenFernText2A": [ + 111, + 19190 + ], + "_BenFernText2B": [ + 111, + 19209 + ], + "_BenFernText3A": [ + 111, + 19227 + ], + "_BenFernText3B": [ + 111, + 19241 + ], + "_BenIntroText1": [ + 111, + 19097 + ], + "_BenIntroText2": [ + 111, + 19115 + ], + "_BenIntroText3": [ + 111, + 19126 + ], + "_BidsFarewellToMonText": [ + 111, + 18179 + ], + "_BlindingFlashText": [ + 112, + 17929 + ], + "_BlueCardBalanceText": [ + 113, + 23646 + ], + "_BoostedExpPointsText": [ + 112, + 17065 + ], + "_BootedHMText": [ + 112, + 17284 + ], + "_BootedTMText": [ + 112, + 17267 + ], + "_BouldersMayMoveText": [ + 112, + 18420 + ], + "_BouldersMoveText": [ + 112, + 18392 + ], + "_BreedAppearsToCareForText": [ + 112, + 20109 + ], + "_BreedAskNicknameText": [ + 112, + 19928 + ], + "_BreedBrimmingWithEnergyText": [ + 112, + 20052 + ], + "_BreedClearboxText": [ + 112, + 19896 + ], + "_BreedEggHatchText": [ + 112, + 19898 + ], + "_BreedFriendlyText": [ + 112, + 20140 + ], + "_BreedNoInterestText": [ + 112, + 20079 + ], + "_BreedShowsInterestText": [ + 112, + 20166 + ], + "_BreedingIsNotPossibleText": [ + 111, + 20669 + ], + "_BuenaAskWhichPrizeText": [ + 113, + 22687 + ], + "_BuenaComeAgainText": [ + 113, + 22810 + ], + "_BuenaHereYouGoText": [ + 113, + 22737 + ], + "_BuenaIsThatRightText": [ + 113, + 22716 + ], + "_BuenaNoRoomText": [ + 113, + 22783 + ], + "_BuenaNotEnoughPointsText": [ + 113, + 22752 + ], + "_BuenaOffTheAirText": [ + 111, + 20377 + ], + "_BuenaRadioMidnightText1": [ + 111, + 20203 + ], + "_BuenaRadioMidnightText10": [ + 111, + 20374 + ], + "_BuenaRadioMidnightText2": [ + 111, + 20219 + ], + "_BuenaRadioMidnightText3": [ + 111, + 20237 + ], + "_BuenaRadioMidnightText4": [ + 111, + 20258 + ], + "_BuenaRadioMidnightText5": [ + 111, + 20278 + ], + "_BuenaRadioMidnightText6": [ + 111, + 20299 + ], + "_BuenaRadioMidnightText7": [ + 111, + 20318 + ], + "_BuenaRadioMidnightText8": [ + 111, + 20339 + ], + "_BuenaRadioMidnightText9": [ + 111, + 20358 + ], + "_BuenaRadioText1": [ + 111, + 20082 + ], + "_BuenaRadioText2": [ + 111, + 20103 + ], + "_BuenaRadioText3": [ + 111, + 20122 + ], + "_BuenaRadioText4": [ + 111, + 20142 + ], + "_BuenaRadioText5": [ + 111, + 20151 + ], + "_BuenaRadioText6": [ + 111, + 20169 + ], + "_BuenaRadioText7": [ + 111, + 20188 + ], + "_BugCatchingContestIsOverText": [ + 111, + 21223 + ], + "_BugCatchingContestTimeUpText": [ + 111, + 21194 + ], + "_BurnWasHealedText": [ + 111, + 16618 + ], + "_ButNoSpaceText": [ + 111, + 21297 + ], + "_CGB_GSIntro.ShellderLaprasBGPalette": [ + 2, + 20814 + ], + "_CGB_GSIntro.ShellderLaprasOBPals": [ + 2, + 20822 + ], + "_CGB_PackPals.ChrisPackPals": [ + 2, + 21561 + ], + "_CGB_PackPals.KrisPackPals": [ + 2, + 21609 + ], + "_CameToItsSensesText": [ + 111, + 16750 + ], + "_CanCutText": [ + 112, + 18949 + ], + "_CantAcceptEggText": [ + 111, + 23736 + ], + "_CantCarryItemText": [ + 112, + 18988 + ], + "_CantGetOffBikeText": [ + 112, + 18842 + ], + "_CantRegisterText": [ + 112, + 19525 + ], + "_CantSurfText": [ + 112, + 17983 + ], + "_CantUseDigText": [ + 112, + 18181 + ], + "_CantUseItemText": [ + 112, + 17864 + ], + "_CantUseTeleportText": [ + 112, + 18235 + ], + "_CardFlipChooseACardText": [ + 113, + 22462 + ], + "_CardFlipDarnText": [ + 113, + 22554 + ], + "_CardFlipNotEnoughCoinsText": [ + 113, + 22443 + ], + "_CardFlipPlaceYourBetText": [ + 113, + 22478 + ], + "_CardFlipPlayAgainText": [ + 113, + 22495 + ], + "_CardFlipPlayWithThreeCoinsText": [ + 113, + 22419 + ], + "_CardFlipShuffledText": [ + 113, + 22516 + ], + "_CardFlipYeahText": [ + 113, + 22547 + ], + "_CardFolderOpenText": [ + 111, + 17032 + ], + "_CardWasListedText": [ + 111, + 20957 + ], + "_CaughtAskNicknameText": [ + 112, + 21244 + ], + "_ChangeBoxSaveText": [ + 113, + 17962 + ], + "_ChangeWhichNumberText": [ + 111, + 20574 + ], + "_CheckCDMAAdapterText": [ + 111, + 17340 + ], + "_CheckCellPhoneAdapterText": [ + 111, + 17313 + ], + "_CheckDDIPHSAdapterText": [ + 111, + 17388 + ], + "_CheckDOCOMOPHSAdapterText": [ + 111, + 17361 + ], + "_CheckMobileAdapterText": [ + 111, + 17412 + ], + "_ClearAllSaveDataText": [ + 113, + 22090 + ], + "_ClearTimeLimitText": [ + 111, + 21042 + ], + "_ClockHasResetText": [ + 113, + 16744 + ], + "_ClockIsThisOKText": [ + 113, + 16731 + ], + "_ClockSetWithControlPadText": [ + 113, + 16668 + ], + "_ClockTimeMayBeWrongText": [ + 113, + 16614 + ], + "_ClosingLinkText": [ + 111, + 21027 + ], + "_CoinCaseCountText": [ + 113, + 23675 + ], + "_ComeAgainText": [ + 111, + 24297 + ], + "_ComeBackLaterText": [ + 111, + 23883 + ], + "_ComeBackText": [ + 112, + 17254 + ], + "_CompatibilityShouldTheyBreedText": [ + 111, + 20696 + ], + "_ConfirmPasscodeText": [ + 111, + 16812 + ], + "_CongratulationsYourPokemonText": [ + 113, + 19346 + ], + "_ContainedMoveText": [ + 112, + 17302 + ], + "_ContestAlreadyCaughtText": [ + 112, + 20701 + ], + "_ContestAskSwitchText": [ + 112, + 20687 + ], + "_ContestCaughtMonText": [ + 112, + 20672 + ], + "_ContestJudging_FirstPlaceScoreText": [ + 112, + 20799 + ], + "_ContestJudging_FirstPlaceText": [ + 112, + 20730 + ], + "_ContestJudging_SecondPlaceScoreText": [ + 112, + 20886 + ], + "_ContestJudging_SecondPlaceText": [ + 112, + 20838 + ], + "_ContestJudging_ThirdPlaceScoreText": [ + 112, + 20964 + ], + "_ContestJudging_ThirdPlaceText": [ + 112, + 20917 + ], + "_CoordinatesEventText": [ + 113, + 18182 + ], + "_CorruptedEventText": [ + 113, + 18140 + ], + "_CuredOfPoisonText": [ + 111, + 16571 + ], + "_CutNothingText": [ + 112, + 17900 + ], + "_DSTIsThatOKText": [ + 113, + 24542 + ], + "_DayCareLadyIntroEggText": [ + 111, + 23483 + ], + "_DayCareLadyIntroText": [ + 111, + 23429 + ], + "_DayCareManIntroEggText": [ + 111, + 23256 + ], + "_DayCareManIntroText": [ + 111, + 23209 + ], + "_DaycareDummyText": [ + 111, + 23207 + ], + "_DeleteSavedLoginPasswordText": [ + 113, + 20886 + ], + "_DeletedTheLoginPasswordText": [ + 113, + 20921 + ], + "_DeleterAskWhichMonText": [ + 113, + 24529 + ], + "_DeleterAskWhichMoveText": [ + 113, + 24400 + ], + "_DeleterEggText": [ + 113, + 24343 + ], + "_DeleterForgotMoveText": [ + 113, + 24309 + ], + "_DeleterIntroText": [ + 113, + 24436 + ], + "_DeleterNoComeAgainText": [ + 113, + 24374 + ], + "_DidNotLearnMoveText": [ + 113, + 22191 + ], + "_DoItMonText": [ + 112, + 17126 + ], + "_DoesntConcernABoyText": [ + 111, + 20844 + ], + "_EggDoesNotQualifyText": [ + 113, + 22947 + ], + "_EggPhotoText": [ + 112, + 16417 + ], + "_EmptyMailboxText": [ + 112, + 20195 + ], + "_EndText": [ + 111, + 20813 + ], + "_EndUsedMove1Text": [ + 112, + 19873 + ], + "_EndUsedMove2Text": [ + 112, + 19876 + ], + "_EndUsedMove3Text": [ + 112, + 19879 + ], + "_EndUsedMove4Text": [ + 112, + 19882 + ], + "_EndUsedMove5Text": [ + 112, + 19885 + ], + "_EnemyUsedOnText": [ + 111, + 20399 + ], + "_EnemyWithdrewText": [ + 111, + 20380 + ], + "_EnterNewPasscodeText": [ + 111, + 16775 + ], + "_EnterPasscodeText": [ + 111, + 16977 + ], + "_EnterTheAmountText": [ + 111, + 17502 + ], + "_EnterTheIDNoText": [ + 111, + 17484 + ], + "_EvolvedIntoText": [ + 113, + 19375 + ], + "_EvolvingText": [ + 113, + 19427 + ], + "_ExcuseMeYoureNotReadyText": [ + 113, + 22852 + ], + "_ExpPointsText": [ + 112, + 17097 + ], + "_FernIntroText1": [ + 111, + 19144 + ], + "_FernIntroText2": [ + 111, + 19160 + ], + "_FluteWakeUpText": [ + 113, + 23592 + ], + "_ForABoyText": [ + 111, + 20819 + ], + "_ForAGirlText": [ + 111, + 20831 + ], + "_ForYourMonSendsText": [ + 111, + 18233 + ], + "_ForYourMonWillTradeText": [ + 111, + 18292 + ], + "_FoundAnEggText": [ + 111, + 24320 + ], + "_FoundItemText": [ + 112, + 18972 + ], + "_FourZerosInvalidText": [ + 111, + 16958 + ], + "_FruitBearingTreeText": [ + 111, + 16384 + ], + "_FruitPackIsFullText": [ + 111, + 16446 + ], + "_GearEllipseText": [ + 113, + 22564 + ], + "_GearOutOfServiceText": [ + 113, + 22567 + ], + "_GearTodayText": [ + 113, + 22561 + ], + "_GetFrontpic": [ + 20, + 20645 + ], + "_GoForItMonText": [ + 112, + 17136 + ], + "_GoMonText": [ + 112, + 17119 + ], + "_GoodComeBackText": [ + 112, + 17234 + ], + "_GotBackMonText": [ + 111, + 24095 + ], + "_GotOffBikeText": [ + 112, + 18887 + ], + "_GotOnBikeText": [ + 112, + 18866 + ], + "_GrewToLevelText": [ + 111, + 16719 + ], + "_HallOfFamePC.HOFMaster": [ + 33, + 26364 + ], + "_HallOfFamePC.TimeFamer": [ + 33, + 26380 + ], + "_HaveNoRoomText": [ + 111, + 24226 + ], + "_HeadbuttNothingText": [ + 112, + 18604 + ], + "_HealthReturnedText": [ + 111, + 16675 + ], + "_HerbShopLadyIntroText": [ + 113, + 19496 + ], + "_HerbalLadyComeAgainText": [ + 113, + 19754 + ], + "_HerbalLadyFinalPriceText": [ + 113, + 19630 + ], + "_HerbalLadyHowManyText": [ + 113, + 19619 + ], + "_HerbalLadyNoMoneyText": [ + 113, + 19720 + ], + "_HerbalLadyPackFullText": [ + 113, + 19690 + ], + "_HerbalLadyThanksText": [ + 113, + 19662 + ], + "_HeyItsFruitText": [ + 111, + 16412 + ], + "_HoldStillText": [ + 111, + 24647 + ], + "_HowManyShouldIMakeText": [ + 111, + 16521 + ], + "_HugeWaterfallText": [ + 112, + 18083 + ], + "_IllKeepItThanksText": [ + 111, + 24529 + ], + "_IllRaiseYourMonText": [ + 111, + 23856 + ], + "_IncorrectPasscodeText": [ + 111, + 17010 + ], + "_IsThisOKText": [ + 111, + 17471 + ], + "_ItemBelongsToSomeoneElseText": [ + 113, + 23959 + ], + "_ItemCantGetOnText": [ + 113, + 24093 + ], + "_ItemCantHeldText": [ + 112, + 23561 + ], + "_ItemCantUseOnEggText": [ + 113, + 23888 + ], + "_ItemCantUseOnMonText": [ + 113, + 23468 + ], + "_ItemGotOffText": [ + 113, + 24208 + ], + "_ItemGotOnText": [ + 113, + 24187 + ], + "_ItemLooksBitterText": [ + 113, + 23870 + ], + "_ItemOakWarningText": [ + 113, + 23918 + ], + "_ItemStatRoseText": [ + 113, + 23450 + ], + "_ItemStorageFullText": [ + 112, + 23466 + ], + "_ItemUsedText": [ + 113, + 24168 + ], + "_ItemWontHaveEffectText": [ + 113, + 23990 + ], + "_ItemfinderItemNearbyText": [ + 112, + 19063 + ], + "_ItemfinderNopeText": [ + 112, + 19113 + ], + "_ItemsDiscardedText": [ + 112, + 23242 + ], + "_ItemsOakWarningText": [ + 112, + 23299 + ], + "_ItemsThrowAwayText": [ + 112, + 23213 + ], + "_ItemsTooImportantText": [ + 112, + 23263 + ], + "_ItemsTossOutHowManyText": [ + 112, + 23184 + ], + "_ItsGoingToHatchText": [ + 111, + 20764 + ], + "_JustSawSomeRareMonText": [ + 111, + 21323 + ], + "_KarpGuruRecordText": [ + 112, + 21050 + ], + "_KnowsMoveText": [ + 113, + 24232 + ], + "_LC_DragText1": [ + 111, + 19473 + ], + "_LC_DragText2": [ + 111, + 19493 + ], + "_LC_Text1": [ + 111, + 19257 + ], + "_LC_Text10": [ + 111, + 19433 + ], + "_LC_Text11": [ + 111, + 19454 + ], + "_LC_Text2": [ + 111, + 19277 + ], + "_LC_Text3": [ + 111, + 19296 + ], + "_LC_Text4": [ + 111, + 19315 + ], + "_LC_Text5": [ + 111, + 19334 + ], + "_LC_Text6": [ + 111, + 19354 + ], + "_LC_Text7": [ + 111, + 19375 + ], + "_LC_Text8": [ + 111, + 19394 + ], + "_LC_Text9": [ + 111, + 19414 + ], + "_LastHealthyMonText": [ + 111, + 23807 + ], + "_LearnedMoveText": [ + 113, + 22112 + ], + "_LeftWithDayCareLadyText": [ + 112, + 19955 + ], + "_LeftWithDayCareManText": [ + 112, + 20004 + ], + "_LinkAbnormalMonText": [ + 113, + 16870 + ], + "_LinkAskTradeForText": [ + 113, + 16914 + ], + "_LinkTerminatedText": [ + 111, + 21009 + ], + "_LinkTimeoutText": [ + 113, + 16771 + ], + "_LinkTradeCantBattleText": [ + 113, + 16817 + ], + "_LookAdorableDecoText": [ + 111, + 17879 + ], + "_LookClefairyPosterText": [ + 111, + 17809 + ], + "_LookGiantDecoText": [ + 111, + 17903 + ], + "_LookJigglypuffPosterText": [ + 111, + 17843 + ], + "_LookPikachuPosterText": [ + 111, + 17776 + ], + "_LookTownMapText": [ + 111, + 17757 + ], + "_LuckyNumberMatchPCText": [ + 112, + 21166 + ], + "_LuckyNumberMatchPartyText": [ + 112, + 21089 + ], + "_MagikarpGuruMeasureText": [ + 112, + 20995 + ], + "_MailAlreadyHoldingItemText": [ + 112, + 20305 + ], + "_MailAskSendToPCText": [ + 112, + 23686 + ], + "_MailClearedPutAwayText": [ + 112, + 20217 + ], + "_MailDetachedText": [ + 112, + 23623 + ], + "_MailEggText": [ + 112, + 20337 + ], + "_MailLoseMessageText": [ + 112, + 23586 + ], + "_MailMessageLostText": [ + 112, + 20268 + ], + "_MailMovedFromBoxText": [ + 112, + 20365 + ], + "_MailNoSpaceText": [ + 112, + 23650 + ], + "_MailPackFullText": [ + 112, + 20249 + ], + "_MailSentToPCText": [ + 112, + 23748 + ], + "_MailboxFullText": [ + 112, + 23721 + ], + "_MainMenuTimeUnknownText": [ + 113, + 20866 + ], + "_MartAskMoreText": [ + 113, + 20493 + ], + "_MartBoughtText": [ + 113, + 20526 + ], + "_MartCantBuyText": [ + 113, + 20439 + ], + "_MartComeAgainText": [ + 113, + 20473 + ], + "_MartFinalPriceText": [ + 113, + 19464 + ], + "_MartHowManyText": [ + 113, + 19453 + ], + "_MartNoMoneyText": [ + 113, + 20378 + ], + "_MartPackFullText": [ + 113, + 20407 + ], + "_MartSellHowManyText": [ + 113, + 20275 + ], + "_MartSellPriceText": [ + 113, + 20286 + ], + "_MartThanksText": [ + 113, + 20352 + ], + "_MartWelcomeText": [ + 113, + 20322 + ], + "_MayPassWhirlpoolText": [ + 112, + 18475 + ], + "_MayRegisterItemText": [ + 112, + 23795 + ], + "_MaySmashText": [ + 112, + 18694 + ], + "_MemoryGameDarnText": [ + 112, + 23141 + ], + "_MemoryGameYeahText": [ + 112, + 23131 + ], + "_MobileBattleLessThanOneMinuteLeftText": [ + 113, + 17600 + ], + "_MobileBattleMoreInfoText": [ + 113, + 17013 + ], + "_MobileBattleMustPickThreeMonText": [ + 113, + 16938 + ], + "_MobileBattleNoTimeLeftForLinkingText": [ + 113, + 17639 + ], + "_MobileBattleRemainingTimeText": [ + 113, + 17701 + ], + "_MobileBattleRulesText": [ + 113, + 17048 + ], + "_MobileCardFolderAskDeleteOldText": [ + 113, + 21805 + ], + "_MobileCardFolderAskDeleteText": [ + 113, + 21486 + ], + "_MobileCardFolderAskOpenOldText": [ + 113, + 21725 + ], + "_MobileCardFolderDeleteAreYouSureText": [ + 113, + 21652 + ], + "_MobileCardFolderDeletedText": [ + 113, + 21689 + ], + "_MobileCardFolderFinishRegisteringCardsText": [ + 113, + 21834 + ], + "_MobileCardFolderIntro1Text": [ + 113, + 21048 + ], + "_MobileCardFolderIntro2Text": [ + 113, + 21180 + ], + "_MobileCardFolderIntro3Text": [ + 113, + 21278 + ], + "_MobileCardFolderIntro4Text": [ + 113, + 21396 + ], + "_MobileForPartnersMonText": [ + 111, + 18333 + ], + "_MobileOnlyThreeMonMayEnterText": [ + 113, + 21020 + ], + "_MobilePickThreeMonForBattleText": [ + 113, + 20951 + ], + "_MobilePlayerWillTradeMonText": [ + 111, + 18311 + ], + "_MobilePlayersMonTrade2Text": [ + 111, + 18397 + ], + "_MobilePlayersMonTradeText": [ + 111, + 18352 + ], + "_MobileStadiumEntryText": [ + 113, + 20674 + ], + "_MobileStadiumSuccessText": [ + 113, + 20769 + ], + "_MobileTakeGoodCareOfMonText": [ + 111, + 18371 + ], + "_MobileTakeGoodCareOfText": [ + 111, + 18416 + ], + "_MobileTradeCameBackText": [ + 111, + 18442 + ], + "_MobileUseTheseThreeMonText": [ + 113, + 20980 + ], + "_MomBankWhatDoYouWantToDoText": [ + 111, + 22850 + ], + "_MomBoughtWithYourMoneyText": [ + 111, + 17998 + ], + "_MomFoundADollText": [ + 111, + 18067 + ], + "_MomFoundAnItemText": [ + 111, + 17962 + ], + "_MomHaventSavedThatMuchText": [ + 111, + 22970 + ], + "_MomHiHowAreYouText": [ + 111, + 17941 + ], + "_MomInsufficientFundsInWalletText": [ + 111, + 23025 + ], + "_MomIsThisAboutYourMoneyText": [ + 111, + 22746 + ], + "_MomItsInPCText": [ + 111, + 18035 + ], + "_MomItsInYourRoomText": [ + 111, + 18119 + ], + "_MomJustDoWhatYouCanText": [ + 111, + 23184 + ], + "_MomLeavingText1": [ + 111, + 22399 + ], + "_MomLeavingText2": [ + 111, + 22632 + ], + "_MomLeavingText3": [ + 111, + 22670 + ], + "_MomLostGearBookletText": [ + 113, + 24785 + ], + "_MomNotEnoughRoomInBankText": [ + 111, + 23051 + ], + "_MomNotEnoughRoomInWalletText": [ + 111, + 22999 + ], + "_MomSaveMoneyText": [ + 111, + 22937 + ], + "_MomStartSavingMoneyText": [ + 111, + 23077 + ], + "_MomStoreMoneyText": [ + 111, + 22875 + ], + "_MomStoredMoneyText": [ + 111, + 23131 + ], + "_MomTakeMoneyText": [ + 111, + 22906 + ], + "_MomTakenMoneyText": [ + 111, + 23166 + ], + "_MonNameBidsFarewellText": [ + 111, + 18201 + ], + "_MonNameSentToText": [ + 111, + 18177 + ], + "_MonNumberText": [ + 112, + 20445 + ], + "_MonWasSentToText": [ + 111, + 18153 + ], + "_MoveAskForgetText": [ + 113, + 22136 + ], + "_MoveBoulderText": [ + 112, + 18312 + ], + "_MoveCantForgetHMText": [ + 113, + 22386 + ], + "_MoveForgotText": [ + 113, + 22350 + ], + "_MoveKnowsOneText": [ + 113, + 24250 + ], + "_MoveMonWOMailSaveText": [ + 113, + 18015 + ], + "_MoveNameText": [ + 112, + 19868 + ], + "_MysteryGiftCanceledText": [ + 112, + 17462 + ], + "_MysteryGiftCommErrorText": [ + 112, + 17492 + ], + "_MysteryGiftFiveADayText": [ + 112, + 17575 + ], + "_MysteryGiftOneADayText": [ + 112, + 17606 + ], + "_MysteryGiftSentHomeText": [ + 112, + 17658 + ], + "_MysteryGiftSentText": [ + 112, + 17641 + ], + "_NPCTradeAfterText1": [ + 111, + 21748 + ], + "_NPCTradeAfterText2": [ + 111, + 22004 + ], + "_NPCTradeAfterText3": [ + 111, + 22261 + ], + "_NPCTradeAfterText4": [ + 111, + 22341 + ], + "_NPCTradeCableText": [ + 111, + 21511 + ], + "_NPCTradeCancelText1": [ + 111, + 21644 + ], + "_NPCTradeCancelText2": [ + 111, + 21861 + ], + "_NPCTradeCancelText3": [ + 111, + 22131 + ], + "_NPCTradeCompleteText1": [ + 111, + 21714 + ], + "_NPCTradeCompleteText2": [ + 111, + 21964 + ], + "_NPCTradeCompleteText3": [ + 111, + 22221 + ], + "_NPCTradeCompleteText4": [ + 111, + 22321 + ], + "_NPCTradeFanfareText": [ + 111, + 21573 + ], + "_NPCTradeIntroText1": [ + 111, + 21577 + ], + "_NPCTradeIntroText2": [ + 111, + 21778 + ], + "_NPCTradeIntroText3": [ + 111, + 22049 + ], + "_NPCTradeWrongText1": [ + 111, + 21674 + ], + "_NPCTradeWrongText2": [ + 111, + 21921 + ], + "_NPCTradeWrongText3": [ + 111, + 22166 + ], + "_NameCardLinkCancelledText": [ + 112, + 17779 + ], + "_NameCardLinkCommErrorText": [ + 112, + 17809 + ], + "_NameCardListedCardText": [ + 112, + 17713 + ], + "_NameCardNotRegisteredCardText": [ + 112, + 17749 + ], + "_NameCardReceivedCardText": [ + 112, + 17690 + ], + "_NameRaterBetterNameText": [ + 112, + 16589 + ], + "_NameRaterComeAgainText": [ + 112, + 16798 + ], + "_NameRaterEggText": [ + 112, + 16904 + ], + "_NameRaterFinishedText": [ + 112, + 16753 + ], + "_NameRaterHelloText": [ + 112, + 16451 + ], + "_NameRaterNamedText": [ + 112, + 17010 + ], + "_NameRaterPerfectNameText": [ + 112, + 16830 + ], + "_NameRaterSameNameText": [ + 112, + 16930 + ], + "_NameRaterWhatNameText": [ + 112, + 16706 + ], + "_NameRaterWhichMonText": [ + 112, + 16544 + ], + "_NeedAtLeastThreeMonText": [ + 113, + 22915 + ], + "_NewCardArrivedText": [ + 111, + 20890 + ], + "_NewDexDataText": [ + 113, + 23379 + ], + "_NewPokedexEntry": [ + 16, + 23167 + ], + "_NoCoinCaseText": [ + 111, + 21483 + ], + "_NoCoinsText": [ + 111, + 21463 + ], + "_NoCyclingText": [ + 113, + 24065 + ], + "_NoPhotoText": [ + 112, + 16384 + ], + "_NoPromptText": [ + 112, + 20408 + ], + "_NoRoomForEggText": [ + 111, + 24562 + ], + "_NoRoomTMHMText": [ + 112, + 17402 + ], + "_NotEnoughMoneyText": [ + 111, + 24252 + ], + "_NotYetText": [ + 111, + 24310 + ], + "_NothingHereText": [ + 111, + 16469 + ], + "_NothingToChooseText": [ + 111, + 17521 + ], + "_NothingToPutAwayText": [ + 111, + 17644 + ], + "_NothingToSellText": [ + 113, + 20242 + ], + "_OKComeBackText": [ + 112, + 17216 + ], + "_OPT_AddictivelyText": [ + 111, + 18766 + ], + "_OPT_AlmostPoisonouslyText": [ + 111, + 18686 + ], + "_OPT_AptlyNamedText": [ + 111, + 18607 + ], + "_OPT_BoldSortOfText": [ + 111, + 18909 + ], + "_OPT_CuteText": [ + 111, + 18880 + ], + "_OPT_EvolutionMustBeText": [ + 111, + 18805 + ], + "_OPT_ExcitingText": [ + 111, + 18973 + ], + "_OPT_FlippedOutText": [ + 111, + 18841 + ], + "_OPT_FriendlyText": [ + 111, + 19008 + ], + "_OPT_FrighteningText": [ + 111, + 18926 + ], + "_OPT_GroovyText": [ + 111, + 18985 + ], + "_OPT_GuardedText": [ + 111, + 19052 + ], + "_OPT_HeartMeltinglyText": [ + 111, + 18862 + ], + "_OPT_HotHotHotText": [ + 111, + 19020 + ], + "_OPT_InspiringText": [ + 111, + 18995 + ], + "_OPT_IntroText1": [ + 111, + 18458 + ], + "_OPT_IntroText2": [ + 111, + 18477 + ], + "_OPT_IntroText3": [ + 111, + 18490 + ], + "_OPT_LooksInWaterText": [ + 111, + 18785 + ], + "_OPT_LovelyText": [ + 111, + 19063 + ], + "_OPT_MaryText1": [ + 111, + 18550 + ], + "_OPT_MischievouslyText": [ + 111, + 18727 + ], + "_OPT_OakText1": [ + 111, + 18507 + ], + "_OPT_OakText2": [ + 111, + 18520 + ], + "_OPT_OakText3": [ + 111, + 18541 + ], + "_OPT_PleasantText": [ + 111, + 18897 + ], + "_OPT_PokemonChannelText": [ + 111, + 19083 + ], + "_OPT_PowerfulText": [ + 111, + 18961 + ], + "_OPT_ProvocativelyText": [ + 111, + 18825 + ], + "_OPT_SensuallyText": [ + 111, + 18707 + ], + "_OPT_SpeedyText": [ + 111, + 19073 + ], + "_OPT_StimulatingText": [ + 111, + 19037 + ], + "_OPT_SuaveDebonairText": [ + 111, + 18941 + ], + "_OPT_SweetAdorablyText": [ + 111, + 18565 + ], + "_OPT_TopicallyText": [ + 111, + 18746 + ], + "_OPT_UnbearablyText": [ + 111, + 18646 + ], + "_OPT_UndeniablyKindOfText": [ + 111, + 18625 + ], + "_OPT_WeirdText": [ + 111, + 18888 + ], + "_OPT_WigglySlicklyText": [ + 111, + 18586 + ], + "_OPT_WowImpressivelyText": [ + 111, + 18666 + ], + "_OTSendsText": [ + 111, + 18252 + ], + "_OakPCText1": [ + 112, + 21781 + ], + "_OakPCText2": [ + 112, + 21811 + ], + "_OakPCText3": [ + 112, + 21843 + ], + "_OakPCText4": [ + 112, + 22954 + ], + "_OakRating01": [ + 112, + 21893 + ], + "_OakRating02": [ + 112, + 21925 + ], + "_OakRating03": [ + 112, + 21973 + ], + "_OakRating04": [ + 112, + 22033 + ], + "_OakRating05": [ + 112, + 22095 + ], + "_OakRating06": [ + 112, + 22156 + ], + "_OakRating07": [ + 112, + 22218 + ], + "_OakRating08": [ + 112, + 22281 + ], + "_OakRating09": [ + 112, + 22331 + ], + "_OakRating10": [ + 112, + 22387 + ], + "_OakRating11": [ + 112, + 22436 + ], + "_OakRating12": [ + 112, + 22496 + ], + "_OakRating13": [ + 112, + 22546 + ], + "_OakRating14": [ + 112, + 22611 + ], + "_OakRating15": [ + 112, + 22667 + ], + "_OakRating16": [ + 112, + 22716 + ], + "_OakRating17": [ + 112, + 22775 + ], + "_OakRating18": [ + 112, + 22834 + ], + "_OakRating19": [ + 112, + 22891 + ], + "_OakText1": [ + 112, + 23861 + ], + "_OakText2": [ + 112, + 23972 + ], + "_OakText3": [ + 112, + 24034 + ], + "_OakText4": [ + 112, + 24037 + ], + "_OakText5": [ + 112, + 24145 + ], + "_OakText6": [ + 113, + 16384 + ], + "_OakText7": [ + 113, + 16422 + ], + "_OakThisIsntTheTimeText": [ + 112, + 19438 + ], + "_OakTimeHoursQuestionMarkText": [ + 111, + 17157 + ], + "_OakTimeHowManyMinutesText": [ + 111, + 17160 + ], + "_OakTimeIsItText": [ + 111, + 17274 + ], + "_OakTimeMinutesQuestionMarkText": [ + 111, + 17187 + ], + "_OakTimeOversleptText": [ + 111, + 17190 + ], + "_OakTimeSoDarkText": [ + 111, + 17231 + ], + "_OakTimeWhatDayIsItText": [ + 111, + 17257 + ], + "_OakTimeWhatHoursText": [ + 111, + 17149 + ], + "_OakTimeWhatTimeIsItText": [ + 111, + 17131 + ], + "_OakTimeWhoaMinutesText": [ + 111, + 17179 + ], + "_OakTimeWokeUpText": [ + 111, + 17052 + ], + "_OakTimeYikesText": [ + 111, + 17206 + ], + "_ObjectEventText": [ + 113, + 18158 + ], + "_ObtainedFruitText": [ + 111, + 16429 + ], + "_ObtainedTheVoltorbBadgeText": [ + 111, + 21152 + ], + "_OhFineThenText": [ + 111, + 24281 + ], + "_OnlyOneMonText": [ + 111, + 23703 + ], + "_OnlyThreeMonMayBeEnteredText": [ + 113, + 22979 + ], + "_PCCantDepositLastMonText": [ + 112, + 20608 + ], + "_PCCantTakeText": [ + 112, + 20642 + ], + "_PCGottaHavePokemonText": [ + 112, + 20486 + ], + "_PCMonHoldingMailText": [ + 112, + 20523 + ], + "_PCNoSingleMonText": [ + 112, + 20578 + ], + "_PCWhatText": [ + 112, + 20516 + ], + "_PPIsMaxedOutText": [ + 113, + 23750 + ], + "_PPRestoredText": [ + 113, + 23793 + ], + "_PPsIncreasedText": [ + 113, + 23773 + ], + "_PackEmptyText": [ + 112, + 19587 + ], + "_PackNoItemText": [ + 112, + 19354 + ], + "_PasscodeSetText": [ + 111, + 16875 + ], + "_PasscodesNotSameText": [ + 111, + 16847 + ], + "_PasswordAskEnterText": [ + 113, + 22062 + ], + "_PasswordAskResetClockText": [ + 113, + 22044 + ], + "_PasswordAskResetText": [ + 113, + 21979 + ], + "_PasswordWrongText": [ + 113, + 22027 + ], + "_PerfectHeresYourMonText": [ + 111, + 24068 + ], + "_PharmacyComeAgainText": [ + 113, + 20214 + ], + "_PharmacyFinalPriceText": [ + 113, + 20105 + ], + "_PharmacyHowManyText": [ + 113, + 20094 + ], + "_PharmacyIntroText": [ + 113, + 20063 + ], + "_PharmacyNoMoneyText": [ + 113, + 20184 + ], + "_PharmacyPackFullText": [ + 113, + 20153 + ], + "_PharmacyThanksText": [ + 113, + 20139 + ], + "_PhoneClickText": [ + 113, + 21888 + ], + "_PhoneEllipseText": [ + 113, + 21896 + ], + "_PhoneJustTalkToThemText": [ + 113, + 21932 + ], + "_PhoneOutOfAreaText": [ + 113, + 21899 + ], + "_PhoneThankYouText": [ + 113, + 21962 + ], + "_PhoneWrongNumberText": [ + 113, + 21861 + ], + "_PickErrorPacketText": [ + 111, + 21094 + ], + "_PickThreeMonForMobileBattleText": [ + 113, + 17672 + ], + "_PlayedFluteText": [ + 113, + 23545 + ], + "_PlayerFoundItemText": [ + 111, + 21281 + ], + "_PlayersPCAskWhatDoText": [ + 112, + 21352 + ], + "_PlayersPCDepositItemsText": [ + 112, + 21521 + ], + "_PlayersPCHowManyDepositText": [ + 112, + 21487 + ], + "_PlayersPCHowManyWithdrawText": [ + 112, + 21377 + ], + "_PlayersPCNoItemsText": [ + 112, + 21471 + ], + "_PlayersPCNoRoomDepositText": [ + 112, + 21549 + ], + "_PlayersPCNoRoomWithdrawText": [ + 112, + 21439 + ], + "_PlayersPCTurnOnText": [ + 112, + 21331 + ], + "_PlayersPCWithdrewItemsText": [ + 112, + 21412 + ], + "_PleaseTryAgainTomorrowText": [ + 113, + 17498 + ], + "_PnP_BoldText": [ + 111, + 19668 + ], + "_PnP_CoolText": [ + 111, + 19778 + ], + "_PnP_CuteText": [ + 111, + 19584 + ], + "_PnP_GreatText": [ + 111, + 19738 + ], + "_PnP_HappyText": [ + 111, + 19614 + ], + "_PnP_InspiringText": [ + 111, + 19796 + ], + "_PnP_LazyText": [ + 111, + 19595 + ], + "_PnP_MyTypeText": [ + 111, + 19759 + ], + "_PnP_NoisyText": [ + 111, + 19633 + ], + "_PnP_OddText": [ + 111, + 19851 + ], + "_PnP_PickyText": [ + 111, + 19688 + ], + "_PnP_PrecociousText": [ + 111, + 19651 + ], + "_PnP_RightForMeText": [ + 111, + 19832 + ], + "_PnP_SoSoText": [ + 111, + 19721 + ], + "_PnP_SortOfOKText": [ + 111, + 19704 + ], + "_PnP_Text1": [ + 111, + 19514 + ], + "_PnP_Text2": [ + 111, + 19535 + ], + "_PnP_Text3": [ + 111, + 19555 + ], + "_PnP_Text4": [ + 111, + 19570 + ], + "_PnP_Text5": [ + 111, + 19872 + ], + "_PnP_WeirdText": [ + 111, + 19812 + ], + "_PocketIsFullText": [ + 113, + 18251 + ], + "_PoisonFaintText": [ + 112, + 19148 + ], + "_PoisonWhiteoutText": [ + 112, + 19162 + ], + "_PokecenterBillsPCText": [ + 112, + 21620 + ], + "_PokecenterOaksPCText": [ + 112, + 21714 + ], + "_PokecenterPCCantUseText": [ + 112, + 21288 + ], + "_PokecenterPCOaksClosedText": [ + 112, + 21765 + ], + "_PokecenterPCTurnOnText": [ + 112, + 21581 + ], + "_PokecenterPCWhoseText": [ + 112, + 21602 + ], + "_PokecenterPlayersPCText": [ + 112, + 21668 + ], + "_PokedexShowText": [ + 111, + 19089 + ], + "_PokegearAskDeleteText": [ + 113, + 22653 + ], + "_PokegearAskWhoCallText": [ + 113, + 22599 + ], + "_PokegearPressButtonText": [ + 113, + 22626 + ], + "_PokemonAskSwapItemText": [ + 112, + 23516 + ], + "_PokemonHoldItemText": [ + 112, + 23383 + ], + "_PokemonNotEnoughHPText": [ + 112, + 23779 + ], + "_PokemonNotHoldingText": [ + 112, + 23438 + ], + "_PokemonRemoveMailText": [ + 112, + 23407 + ], + "_PokemonSwapItemText": [ + 112, + 23340 + ], + "_PokemonTookItemText": [ + 112, + 23492 + ], + "_PrepMonFrontpic": [ + 0, + 14219 + ], + "_PrestoAllDoneText": [ + 111, + 24682 + ], + "_PutAwayAndSetUpText": [ + 111, + 17692 + ], + "_PutAwayTheDecoText": [ + 111, + 17623 + ], + "_PutCardInCardFolderText": [ + 111, + 20922 + ], + "_PutItemInPocketText": [ + 113, + 18220 + ], + "_RaiseThePPOfWhichMoveText": [ + 113, + 23690 + ], + "_ReceiveItemText": [ + 111, + 21438 + ], + "_ReceivedEggText": [ + 111, + 24485 + ], + "_ReceivedItemText": [ + 113, + 18201 + ], + "_ReceivedTMHMText": [ + 112, + 17441 + ], + "_RecoveredSomeHPText": [ + 111, + 16546 + ], + "_RegisteredItemText": [ + 112, + 19502 + ], + "_RemainingTimeText": [ + 111, + 20521 + ], + "_RemoveMailText": [ + 111, + 23770 + ], + "_RepelUsedEarlierIsStillInEffectText": [ + 113, + 23501 + ], + "_RepelWoreOffText": [ + 111, + 21256 + ], + "_RestoreThePPOfWhichMoveText": [ + 113, + 23719 + ], + "_RetrieveMysteryGiftText": [ + 112, + 17514 + ], + "_RevitalizedText": [ + 111, + 16698 + ], + "_RidOfParalysisText": [ + 111, + 16594 + ], + "_RocketRadioText1": [ + 111, + 19880 + ], + "_RocketRadioText10": [ + 111, + 20060 + ], + "_RocketRadioText2": [ + 111, + 19898 + ], + "_RocketRadioText3": [ + 111, + 19913 + ], + "_RocketRadioText4": [ + 111, + 19933 + ], + "_RocketRadioText5": [ + 111, + 19954 + ], + "_RocketRadioText6": [ + 111, + 19973 + ], + "_RocketRadioText7": [ + 111, + 19991 + ], + "_RocketRadioText8": [ + 111, + 20014 + ], + "_RocketRadioText9": [ + 111, + 20036 + ], + "_RodBiteText": [ + 112, + 18776 + ], + "_RodNothingText": [ + 112, + 18789 + ], + "_SaveFileCorruptedText": [ + 113, + 17933 + ], + "_SavedTheGameText": [ + 113, + 17808 + ], + "_SavingDontTurnOffThePowerText": [ + 113, + 17773 + ], + "_SavingRecordText": [ + 111, + 21406 + ], + "_SeerCantTellAThingText": [ + 113, + 18327 + ], + "_SeerDoNothingText": [ + 113, + 18773 + ], + "_SeerEggText": [ + 113, + 18717 + ], + "_SeerImpressedText": [ + 113, + 19173 + ], + "_SeerMightyText": [ + 113, + 19035 + ], + "_SeerMoreCareText": [ + 113, + 18810 + ], + "_SeerMoreConfidentText": [ + 113, + 18886 + ], + "_SeerMuchStrengthText": [ + 113, + 18977 + ], + "_SeerNameLocationText": [ + 113, + 18388 + ], + "_SeerNoLocationText": [ + 113, + 18559 + ], + "_SeerSeeAllText": [ + 113, + 18271 + ], + "_SeerTimeLevelText": [ + 113, + 18426 + ], + "_SeerTradeText": [ + 113, + 18487 + ], + "_SentTrophyHomeText": [ + 113, + 23811 + ], + "_SetUpTheDecoText": [ + 111, + 17673 + ], + "_SlotsBetHowManyCoinsText": [ + 113, + 20553 + ], + "_SlotsDarnText": [ + 113, + 20667 + ], + "_SlotsLinedUpText": [ + 113, + 20639 + ], + "_SlotsNotEnoughCoinsText": [ + 113, + 20582 + ], + "_SlotsPlayAgainText": [ + 113, + 20626 + ], + "_SlotsRanOutOfCoinsText": [ + 113, + 20601 + ], + "_SlotsStartText": [ + 113, + 20574 + ], + "_SpaceSpaceColonText": [ + 113, + 21974 + ], + "_SquirtbottleNothingText": [ + 112, + 19259 + ], + "_StartMenuContestEndText": [ + 112, + 23148 + ], + "_StartText": [ + 111, + 20805 + ], + "_StartingLinkText": [ + 111, + 20993 + ], + "_StopLearningMoveText": [ + 113, + 22169 + ], + "_StoppedEvolvingText": [ + 113, + 19397 + ], + "_SweetScentNothingText": [ + 112, + 19226 + ], + "_TMHMNotCompatibleText": [ + 112, + 17346 + ], + "_TakeGoodCareOfEggText": [ + 111, + 24506 + ], + "_TakeGoodCareOfMonText": [ + 111, + 18207 + ], + "_TeleportReturnText": [ + 112, + 18202 + ], + "_TestEventText": [ + 111, + 20785 + ], + "_ThatCantBeUsedRightNowText": [ + 111, + 20423 + ], + "_ThatItemCantBePutInThePackText": [ + 111, + 20453 + ], + "_ThatsEnoughComeBackText": [ + 112, + 17188 + ], + "_TheBoxIsFullText": [ + 111, + 20872 + ], + "_TheItemWasPutInThePackText": [ + 111, + 20489 + ], + "_TheMonMustAllBeDifferentKindsText": [ + 113, + 23013 + ], + "_TheMonMustNotHoldTheSameItemsText": [ + 113, + 23059 + ], + "_ThePasswordIsText": [ + 111, + 17452 + ], + "_ThereIsNoEggText": [ + 111, + 20745 + ], + "_ThereIsNothingConnectedText": [ + 111, + 17284 + ], + "_ThrewAwayText": [ + 112, + 19416 + ], + "_TimeAskOkayText": [ + 113, + 24561 + ], + "_TimeLimitWasClearedText": [ + 111, + 21065 + ], + "_TimesetAskAdjustDSTText": [ + 113, + 24725 + ], + "_TimesetAskDSTText": [ + 113, + 24576 + ], + "_TimesetAskNotDSTText": [ + 113, + 24662 + ], + "_TimesetDSTText": [ + 113, + 24624 + ], + "_TimesetNotDSTText": [ + 113, + 24693 + ], + "_TradingMonForOTMonText": [ + 111, + 21126 + ], + "_TrainerRankingExplanationText": [ + 112, + 22989 + ], + "_TrainerRankingNoDataText": [ + 112, + 23074 + ], + "_TryAgainUsingSameSettingsText": [ + 113, + 17564 + ], + "_UnusedNothingHereText": [ + 112, + 18809 + ], + "_UseCutText": [ + 112, + 17885 + ], + "_UseDigText": [ + 112, + 18142 + ], + "_UseEscapeRopeText": [ + 112, + 18157 + ], + "_UseHeadbuttText": [ + 112, + 18583 + ], + "_UseRockSmashText": [ + 112, + 18672 + ], + "_UseSacredAshText": [ + 112, + 19301 + ], + "_UseStrengthText": [ + 112, + 18292 + ], + "_UseSweetScentText": [ + 112, + 19203 + ], + "_UseWaterfallText": [ + 112, + 18062 + ], + "_UseWhirlpoolText": [ + 112, + 18454 + ], + "_UsedInsteadText": [ + 112, + 19856 + ], + "_UsedMove1Text": [ + 112, + 19838 + ], + "_UsedMove2Text": [ + 112, + 19847 + ], + "_UsedSurfText": [ + 112, + 17967 + ], + "_WaitButtonText": [ + 113, + 23349 + ], + "_WantAQuickMobileBattleText": [ + 113, + 17372 + ], + "_WantToRushThroughAMobileBattleText": [ + 113, + 17433 + ], + "_WarpingText": [ + 111, + 20564 + ], + "_WasDefrostedText": [ + 111, + 16641 + ], + "_WasSentToBillsPCText": [ + 112, + 20459 + ], + "_WhatShouldIRaiseText": [ + 111, + 23673 + ], + "_WhichApricornText": [ + 111, + 16491 + ], + "_WhichMonPhotoText": [ + 111, + 24612 + ], + "_WhichSidePutAwayText": [ + 111, + 17586 + ], + "_WhichSidePutOnText": [ + 111, + 17548 + ], + "_WhitedOutText": [ + 112, + 19022 + ], + "_WillTradeText": [ + 111, + 18270 + ], + "_WillYouPlayWithMonText": [ + 111, + 20607 + ], + "_WindowAreaExceededErrorText": [ + 113, + 18067 + ], + "_WindowPoppingErrorText": [ + 113, + 18103 + ], + "_WokeUpText": [ + 111, + 16661 + ], + "_WouldYouLikeToMobileBattleText": [ + 113, + 17308 + ], + "_WouldYouLikeToSaveTheGameText": [ + 113, + 17739 + ], + "_YesPromptText": [ + 112, + 20403 + ], + "_YouCantTakeAnEggText": [ + 113, + 23106 + ], + "_YouCantUseItInABattleText": [ + 112, + 19589 + ], + "_YouDontHaveAMonText": [ + 112, + 19479 + ], + "_YouNeedTwoMonForBreedingText": [ + 111, + 20634 + ], + "_YourFoesWeakGetmMonText": [ + 112, + 17150 + ], + "_YourFriendIsNotReadyText": [ + 112, + 17550 + ], + "_YourMonHasGrownText": [ + 111, + 23958 + ], + "_YourMonsHPWasHealedText": [ + 111, + 20537 + ], + "wBaseUnusedBackpic": [ + 1, + 53834 + ], + "wBaseUnusedFrontpic": [ + 1, + 53832 + ], + "wDecompressEnemyFrontpic": [ + 6, + 55296 + ] + }, + "text": { + "labels": [ + "AlreadyAsleepText", + "AlreadyConfusedText", + "AlreadyParalyzedText", + "AlreadyPoisonedText", + "AttackMissed2Text", + "AttackMissedText", + "BadlyPoisonedText", + "BattleText_AnEGGCantBattle", + "BattleText_CantEscape", + "BattleText_CantEscape2", + "BattleText_EnemyFled", + "BattleText_EnemyIsAboutToUseWillPlayerChangeMon", + "BattleText_EnemyMonFainted", + "BattleText_EnemySentOut", + "BattleText_EnemyWasDefeated", + "BattleText_GotAwaySafely", + "BattleText_ItemHealedConfusion", + "BattleText_ItemsCantBeUsedHere", + "BattleText_LinkErrorBattleCanceled", + "BattleText_MonCantBeRecalled", + "BattleText_MonFainted", + "BattleText_MonHasNoMovesLeft", + "BattleText_MonIsAlreadyOut", + "BattleText_MonsLightScreenFell", + "BattleText_MonsReflectFaded", + "BattleText_NoTimeLeftToday", + "BattleText_PlayerPickedUpPayDayMoney", + "BattleText_RainContinuesToFall", + "BattleText_SafeguardFaded", + "BattleText_StringBuffer1GrewToLevel", + "BattleText_TargetRecoveredWithItem", + "BattleText_TargetWasHitByFutureSight", + "BattleText_TargetsEncoreEnded", + "BattleText_TheMoveIsDisabled", + "BattleText_TheRainStopped", + "BattleText_TheSandstormRages", + "BattleText_TheSandstormSubsided", + "BattleText_TheSunlightFaded", + "BattleText_TheSunlightIsStrong", + "BattleText_TheresNoEscapeFromTrainerBattle", + "BattleText_TheresNoPPLeftForThisMove", + "BattleText_TheresNoWillToBattle", + "BattleText_UseNextMon", + "BattleText_UserFledUsingAStringBuffer1", + "BattleText_UserHurtBySpikes", + "BattleText_UserRecoveredPPUsing", + "BattleText_UserWasReleasedFromStringBuffer1", + "BattleText_UsersHurtByStringBuffer1", + "BattleText_UsersStringBuffer1Activated", + "BattleText_WildFled", + "BattleText_WildMonIsAngry", + "BattleText_WildMonIsEating", + "BeatUpAttackText", + "BecameConfusedText", + "BeganToNapText", + "BellChimedText", + "BellyDrumText", + "BlewSpikesText", + "BlownAwayText", + "BracedItselfText", + "BugContestPrizeNoRoomText", + "ButItFailedText", + "CantEscapeNowText", + "ClampedByText", + "CoinVendor_Buy500CoinsText", + "CoinVendor_Buy50CoinsText", + "CoinVendor_CancelText", + "CoinVendor_CoinCaseFullText", + "CoinVendor_IntroText", + "CoinVendor_NoCoinCaseText", + "CoinVendor_NotEnoughMoneyText", + "CoinVendor_WelcomeText", + "CoinsScatteredText", + "ConfusedNoMoreText", + "ContestResults_ConsolationPrizeText", + "ContestResults_DidNotWinText", + "ContestResults_JoinUsNextTimeText", + "ContestResults_PartyFullText", + "ContestResults_PlayerWonAPrizeText", + "ContestResults_ReadyToJudgeText", + "ContestResults_ReturnPartyText", + "CopiedStatsText", + "CoveredByVeilText", + "CrashedText", + "CriticalHitText", + "DefrostedOpponentText", + "DestinyBondEffectText", + "DidntAffect1Text", + "DidntAffect2Text", + "DifficultBookshelfText", + "DisabledMoveText", + "DisabledNoMoreText", + "DoesntAffectText", + "DownpourText", + "DraggedOutText", + "DreamEatenText", + "EliminatedStatsText", + "EnduredText", + "EnemyHitTimesText", + "EvadedText", + "FastAsleepText", + "FellAsleepText", + "FellInLoveText", + "FireSpinTrapText", + "FledFromBattleText", + "FledInFearText", + "FlinchedText", + "ForesawAttackText", + "FrozenSolidText", + "FullyParalyzedText", + "GettingPumpedText", + "GotAnEncoreText", + "GotMoneyForWinningText", + "GymStatue_CityGymText", + "GymStatue_WinningTrainersText", + "HPIsFullText", + "HappinessText1", + "HappinessText2", + "HappinessText3", + "HasANightmareText", + "HasNoPPLeftText", + "HasSubstituteText", + "HomepageText", + "HookedPokemonAttackedText", + "HungOnText", + "HurtByBurnText", + "HurtByCurseText", + "HurtByPoisonText", + "HurtItselfText", + "IdentifiedText", + "IgnoredOrders2Text", + "IgnoredOrdersText", + "IgnoredSleepingText", + "InLoveWithText", + "IncenseBurnerText", + "InfatuationText", + "IsConfusedText", + "ItFailedText", + "LeechSeedSapsText", + "LightScreenEffectText", + "LoafingAroundText", + "LookTownMapText", + "LostAgainstText", + "MadeSubstituteText", + "MagazineBookshelfText", + "MagnitudeText", + "MartSignText", + "MerchandiseShelfText", + "MimicLearnedMoveText", + "MirrorMoveFailedText", + "MistText", + "MustRechargeText", + "NoPPLeftText", + "NotVeryEffectiveText", + "NothingHappenedText", + "NurseAskHealText", + "NurseDayText", + "NurseGoodbyeText", + "NurseMornText", + "NurseNiteText", + "NursePokerusText", + "NurseReturnPokemonText", + "NurseTakePokemonText", + "OneHitKOText", + "ParalyzedText", + "PerishCountText", + "PictureBookshelfText", + "PlayerHitTimesText", + "PokeComNurseDayText", + "PokeComNurseMornText", + "PokeComNurseNiteText", + "PokeComNursePokerusText", + "PokecenterSignText", + "PokemonFellFromTreeText", + "PresentFailedText", + "ProtectedByMistText", + "ProtectedByText", + "ProtectedItselfText", + "ProtectingItselfText", + "PutACurseText", + "RageBuildingText", + "ReceivedItemText", + "RecoilText", + "RecoveredUsingText", + "ReflectEffectText", + "RegainedHealthText", + "RegisteredNumber1Text", + "RegisteredNumber2Text", + "ReleasedByText", + "RestedText", + "SafeguardProtectText", + "SandstormBrewedText", + "SandstormHitsText", + "SentAllToMomText", + "SentHalfToMomText", + "SentSomeToMomText", + "SharedPainText", + "ShedLeechSeedText", + "SketchedText", + "SpikesText", + "SpiteEffectText", + "StartPerishText", + "StartedNightmareText", + "StoleText", + "StoringEnergyText", + "SubFadedText", + "SubTookDamageText", + "SuckedHealthText", + "SunGotBrightText", + "SuperEffectiveText", + "TVText", + "TeamRocketOathText", + "Text_BallCaught", + "Text_BattleEffectActivate", + "Text_BattleFoeEffectActivate", + "Text_BattleUser", + "Text_BreedHuh", + "Text_Gained", + "Text_MoveForgetCount", + "Text_NPCTraded", + "Text_PlayedPokeFlute", + "TiedAgainstText", + "TooWeakSubText", + "TookAimText", + "TookDownWithItText", + "TransformedText", + "TransformedTypeText", + "TrashCanText", + "TurnedAwayText", + "UnaffectedText", + "UnleashedEnergyText", + "UnusedRivalLossText", + "UnusedRivalWinText", + "UsedBindText", + "WantsToBattleText", + "WasBurnedText", + "WasDefrostedText", + "WasDisabledText", + "WasFrozenText", + "WasPoisonedText", + "WasSeededText", + "WentToSleepText", + "WhirlpoolTrapText", + "WildCelebiAppearedText", + "WildPokemonAppearedText", + "WindowText", + "WokeUpText", + "WontDropAnymoreText", + "WontObeyText", + "WontRiseAnymoreText", + "WrappedByText", + "_ActorNameText", + "_AlreadyASaveFileText", + "_AlreadySetUpText", + "_AlreadySurfingText", + "_AlreadyUsingStrengthText", + "_AnEggCantHoldAnItemText", + "_AnimationTypeText", + "_AnotherSaveFileText", + "_AreWeGeniusesText", + "_AreYouABoyOrAreYouAGirlText", + "_AskCutText", + "_AskDeleteMoveText", + "_AskFloorElevatorText", + "_AskForgetMoveText", + "_AskGiveNicknameText", + "_AskHeadbuttText", + "_AskItemMoveText", + "_AskQuantityThrowAwayText", + "_AskRockSmashText", + "_AskStrengthText", + "_AskSurfText", + "_AskThrowAwayText", + "_AskWaterfallText", + "_AskWhirlpoolText", + "_BGEventText", + "_BTExcuseMeText", + "_BackAlreadyText", + "_BadgeRequiredText", + "_BallAlmostHadItText", + "_BallAppearedCaughtText", + "_BallBlockedText", + "_BallBoxFullText", + "_BallBrokeFreeText", + "_BallDodgedText", + "_BallDontBeAThiefText", + "_BallMissedText", + "_BallSentToPCText", + "_BallSoCloseText", + "_BargainShopComeAgainText", + "_BargainShopFinalPriceText", + "_BargainShopIntroText", + "_BargainShopNoFundsText", + "_BargainShopPackFullText", + "_BargainShopSoldOutText", + "_BargainShopThanksText", + "_BattleDugText", + "_BattleFlewText", + "_BattleGlowingText", + "_BattleLoweredHeadText", + "_BattleMadeWhirlwindText", + "_BattleMonNickCommaText", + "_BattleMonNicknameText", + "_BattleStatFellText", + "_BattleStatSharplyFellText", + "_BattleStatWentUpText", + "_BattleStatWentWayUpText", + "_BattleTookSunlightText", + "_BattleTowerReturnWhenReadyText", + "_BenFernText1", + "_BenFernText2A", + "_BenFernText2B", + "_BenFernText3A", + "_BenFernText3B", + "_BenIntroText1", + "_BenIntroText2", + "_BenIntroText3", + "_BidsFarewellToMonText", + "_BlindingFlashText", + "_BlueCardBalanceText", + "_BoostedExpPointsText", + "_BootedHMText", + "_BootedTMText", + "_BouldersMayMoveText", + "_BouldersMoveText", + "_BreedAppearsToCareForText", + "_BreedAskNicknameText", + "_BreedBrimmingWithEnergyText", + "_BreedClearboxText", + "_BreedEggHatchText", + "_BreedFriendlyText", + "_BreedNoInterestText", + "_BreedShowsInterestText", + "_BreedingIsNotPossibleText", + "_BuenaAskWhichPrizeText", + "_BuenaComeAgainText", + "_BuenaHereYouGoText", + "_BuenaIsThatRightText", + "_BuenaNoRoomText", + "_BuenaNotEnoughPointsText", + "_BuenaOffTheAirText", + "_BuenaRadioMidnightText1", + "_BuenaRadioMidnightText10", + "_BuenaRadioMidnightText2", + "_BuenaRadioMidnightText3", + "_BuenaRadioMidnightText4", + "_BuenaRadioMidnightText5", + "_BuenaRadioMidnightText6", + "_BuenaRadioMidnightText7", + "_BuenaRadioMidnightText8", + "_BuenaRadioMidnightText9", + "_BuenaRadioText1", + "_BuenaRadioText2", + "_BuenaRadioText3", + "_BuenaRadioText4", + "_BuenaRadioText5", + "_BuenaRadioText6", + "_BuenaRadioText7", + "_BugCatchingContestIsOverText", + "_BugCatchingContestTimeUpText", + "_BurnWasHealedText", + "_ButNoSpaceText", + "_CameToItsSensesText", + "_CanCutText", + "_CantAcceptEggText", + "_CantCarryItemText", + "_CantGetOffBikeText", + "_CantRegisterText", + "_CantSurfText", + "_CantUseDigText", + "_CantUseItemText", + "_CantUseTeleportText", + "_CardFlipChooseACardText", + "_CardFlipDarnText", + "_CardFlipNotEnoughCoinsText", + "_CardFlipPlaceYourBetText", + "_CardFlipPlayAgainText", + "_CardFlipPlayWithThreeCoinsText", + "_CardFlipShuffledText", + "_CardFlipYeahText", + "_CardFolderOpenText", + "_CardWasListedText", + "_CaughtAskNicknameText", + "_ChangeBoxSaveText", + "_ChangeWhichNumberText", + "_CheckCDMAAdapterText", + "_CheckCellPhoneAdapterText", + "_CheckDDIPHSAdapterText", + "_CheckDOCOMOPHSAdapterText", + "_CheckMobileAdapterText", + "_ClearAllSaveDataText", + "_ClearTimeLimitText", + "_ClockHasResetText", + "_ClockIsThisOKText", + "_ClockSetWithControlPadText", + "_ClockTimeMayBeWrongText", + "_ClosingLinkText", + "_CoinCaseCountText", + "_ComeAgainText", + "_ComeBackLaterText", + "_ComeBackText", + "_CompatibilityShouldTheyBreedText", + "_ConfirmPasscodeText", + "_CongratulationsYourPokemonText", + "_ContainedMoveText", + "_ContestAlreadyCaughtText", + "_ContestAskSwitchText", + "_ContestCaughtMonText", + "_ContestJudging_FirstPlaceScoreText", + "_ContestJudging_FirstPlaceText", + "_ContestJudging_SecondPlaceScoreText", + "_ContestJudging_SecondPlaceText", + "_ContestJudging_ThirdPlaceScoreText", + "_ContestJudging_ThirdPlaceText", + "_CoordinatesEventText", + "_CorruptedEventText", + "_CuredOfPoisonText", + "_CutNothingText", + "_DSTIsThatOKText", + "_DayCareLadyIntroEggText", + "_DayCareLadyIntroText", + "_DayCareManIntroEggText", + "_DayCareManIntroText", + "_DaycareDummyText", + "_DeleteSavedLoginPasswordText", + "_DeletedTheLoginPasswordText", + "_DeleterAskWhichMonText", + "_DeleterAskWhichMoveText", + "_DeleterEggText", + "_DeleterForgotMoveText", + "_DeleterIntroText", + "_DeleterNoComeAgainText", + "_DidNotLearnMoveText", + "_DoItMonText", + "_DoesntConcernABoyText", + "_EggDoesNotQualifyText", + "_EggPhotoText", + "_EmptyMailboxText", + "_EndText", + "_EndUsedMove1Text", + "_EndUsedMove2Text", + "_EndUsedMove3Text", + "_EndUsedMove4Text", + "_EndUsedMove5Text", + "_EnemyUsedOnText", + "_EnemyWithdrewText", + "_EnterNewPasscodeText", + "_EnterPasscodeText", + "_EnterTheAmountText", + "_EnterTheIDNoText", + "_EvolvedIntoText", + "_EvolvingText", + "_ExcuseMeYoureNotReadyText", + "_ExpPointsText", + "_FernIntroText1", + "_FernIntroText2", + "_FluteWakeUpText", + "_ForABoyText", + "_ForAGirlText", + "_ForYourMonSendsText", + "_ForYourMonWillTradeText", + "_FoundAnEggText", + "_FoundItemText", + "_FourZerosInvalidText", + "_FruitBearingTreeText", + "_FruitPackIsFullText", + "_GearEllipseText", + "_GearOutOfServiceText", + "_GearTodayText", + "_GoForItMonText", + "_GoMonText", + "_GoodComeBackText", + "_GotBackMonText", + "_GotOffBikeText", + "_GotOnBikeText", + "_GrewToLevelText", + "_HaveNoRoomText", + "_HeadbuttNothingText", + "_HealthReturnedText", + "_HerbShopLadyIntroText", + "_HerbalLadyComeAgainText", + "_HerbalLadyFinalPriceText", + "_HerbalLadyHowManyText", + "_HerbalLadyNoMoneyText", + "_HerbalLadyPackFullText", + "_HerbalLadyThanksText", + "_HeyItsFruitText", + "_HoldStillText", + "_HowManyShouldIMakeText", + "_HugeWaterfallText", + "_IllKeepItThanksText", + "_IllRaiseYourMonText", + "_IncorrectPasscodeText", + "_IsThisOKText", + "_ItemBelongsToSomeoneElseText", + "_ItemCantGetOnText", + "_ItemCantHeldText", + "_ItemCantUseOnEggText", + "_ItemCantUseOnMonText", + "_ItemGotOffText", + "_ItemGotOnText", + "_ItemLooksBitterText", + "_ItemOakWarningText", + "_ItemStatRoseText", + "_ItemStorageFullText", + "_ItemUsedText", + "_ItemWontHaveEffectText", + "_ItemfinderItemNearbyText", + "_ItemfinderNopeText", + "_ItemsDiscardedText", + "_ItemsOakWarningText", + "_ItemsThrowAwayText", + "_ItemsTooImportantText", + "_ItemsTossOutHowManyText", + "_ItsGoingToHatchText", + "_JustSawSomeRareMonText", + "_KarpGuruRecordText", + "_KnowsMoveText", + "_LC_DragText1", + "_LC_DragText2", + "_LC_Text1", + "_LC_Text10", + "_LC_Text11", + "_LC_Text2", + "_LC_Text3", + "_LC_Text4", + "_LC_Text5", + "_LC_Text6", + "_LC_Text7", + "_LC_Text8", + "_LC_Text9", + "_LastHealthyMonText", + "_LearnedMoveText", + "_LeftWithDayCareLadyText", + "_LeftWithDayCareManText", + "_LinkAbnormalMonText", + "_LinkAskTradeForText", + "_LinkTerminatedText", + "_LinkTimeoutText", + "_LinkTradeCantBattleText", + "_LookAdorableDecoText", + "_LookClefairyPosterText", + "_LookGiantDecoText", + "_LookJigglypuffPosterText", + "_LookPikachuPosterText", + "_LookTownMapText", + "_LuckyNumberMatchPCText", + "_LuckyNumberMatchPartyText", + "_MagikarpGuruMeasureText", + "_MailAlreadyHoldingItemText", + "_MailAskSendToPCText", + "_MailClearedPutAwayText", + "_MailDetachedText", + "_MailEggText", + "_MailLoseMessageText", + "_MailMessageLostText", + "_MailMovedFromBoxText", + "_MailNoSpaceText", + "_MailPackFullText", + "_MailSentToPCText", + "_MailboxFullText", + "_MainMenuTimeUnknownText", + "_MartAskMoreText", + "_MartBoughtText", + "_MartCantBuyText", + "_MartComeAgainText", + "_MartFinalPriceText", + "_MartHowManyText", + "_MartNoMoneyText", + "_MartPackFullText", + "_MartSellHowManyText", + "_MartSellPriceText", + "_MartThanksText", + "_MartWelcomeText", + "_MayPassWhirlpoolText", + "_MayRegisterItemText", + "_MaySmashText", + "_MemoryGameDarnText", + "_MemoryGameYeahText", + "_MobileBattleLessThanOneMinuteLeftText", + "_MobileBattleMoreInfoText", + "_MobileBattleMustPickThreeMonText", + "_MobileBattleNoTimeLeftForLinkingText", + "_MobileBattleRemainingTimeText", + "_MobileBattleRulesText", + "_MobileCardFolderAskDeleteOldText", + "_MobileCardFolderAskDeleteText", + "_MobileCardFolderAskOpenOldText", + "_MobileCardFolderDeleteAreYouSureText", + "_MobileCardFolderDeletedText", + "_MobileCardFolderFinishRegisteringCardsText", + "_MobileCardFolderIntro1Text", + "_MobileCardFolderIntro2Text", + "_MobileCardFolderIntro3Text", + "_MobileCardFolderIntro4Text", + "_MobileForPartnersMonText", + "_MobileOnlyThreeMonMayEnterText", + "_MobilePickThreeMonForBattleText", + "_MobilePlayerWillTradeMonText", + "_MobilePlayersMonTrade2Text", + "_MobilePlayersMonTradeText", + "_MobileStadiumEntryText", + "_MobileStadiumSuccessText", + "_MobileTakeGoodCareOfMonText", + "_MobileTakeGoodCareOfText", + "_MobileTradeCameBackText", + "_MobileUseTheseThreeMonText", + "_MomBankWhatDoYouWantToDoText", + "_MomBoughtWithYourMoneyText", + "_MomFoundADollText", + "_MomFoundAnItemText", + "_MomHaventSavedThatMuchText", + "_MomHiHowAreYouText", + "_MomInsufficientFundsInWalletText", + "_MomIsThisAboutYourMoneyText", + "_MomItsInPCText", + "_MomItsInYourRoomText", + "_MomJustDoWhatYouCanText", + "_MomLeavingText1", + "_MomLeavingText2", + "_MomLeavingText3", + "_MomLostGearBookletText", + "_MomNotEnoughRoomInBankText", + "_MomNotEnoughRoomInWalletText", + "_MomSaveMoneyText", + "_MomStartSavingMoneyText", + "_MomStoreMoneyText", + "_MomStoredMoneyText", + "_MomTakeMoneyText", + "_MomTakenMoneyText", + "_MonNameBidsFarewellText", + "_MonNameSentToText", + "_MonNumberText", + "_MonWasSentToText", + "_MoveAskForgetText", + "_MoveBoulderText", + "_MoveCantForgetHMText", + "_MoveForgotText", + "_MoveKnowsOneText", + "_MoveMonWOMailSaveText", + "_MoveNameText", + "_MysteryGiftCanceledText", + "_MysteryGiftCommErrorText", + "_MysteryGiftFiveADayText", + "_MysteryGiftOneADayText", + "_MysteryGiftSentHomeText", + "_MysteryGiftSentText", + "_NPCTradeAfterText1", + "_NPCTradeAfterText2", + "_NPCTradeAfterText3", + "_NPCTradeAfterText4", + "_NPCTradeCableText", + "_NPCTradeCancelText1", + "_NPCTradeCancelText2", + "_NPCTradeCancelText3", + "_NPCTradeCompleteText1", + "_NPCTradeCompleteText2", + "_NPCTradeCompleteText3", + "_NPCTradeCompleteText4", + "_NPCTradeFanfareText", + "_NPCTradeIntroText1", + "_NPCTradeIntroText2", + "_NPCTradeIntroText3", + "_NPCTradeWrongText1", + "_NPCTradeWrongText2", + "_NPCTradeWrongText3", + "_NameCardLinkCancelledText", + "_NameCardLinkCommErrorText", + "_NameCardListedCardText", + "_NameCardNotRegisteredCardText", + "_NameCardReceivedCardText", + "_NameRaterBetterNameText", + "_NameRaterComeAgainText", + "_NameRaterEggText", + "_NameRaterFinishedText", + "_NameRaterHelloText", + "_NameRaterNamedText", + "_NameRaterPerfectNameText", + "_NameRaterSameNameText", + "_NameRaterWhatNameText", + "_NameRaterWhichMonText", + "_NeedAtLeastThreeMonText", + "_NewCardArrivedText", + "_NewDexDataText", + "_NoCoinCaseText", + "_NoCoinsText", + "_NoCyclingText", + "_NoPhotoText", + "_NoPromptText", + "_NoRoomForEggText", + "_NoRoomTMHMText", + "_NotEnoughMoneyText", + "_NotYetText", + "_NothingHereText", + "_NothingToChooseText", + "_NothingToPutAwayText", + "_NothingToSellText", + "_OKComeBackText", + "_OPT_AddictivelyText", + "_OPT_AlmostPoisonouslyText", + "_OPT_AptlyNamedText", + "_OPT_BoldSortOfText", + "_OPT_CuteText", + "_OPT_EvolutionMustBeText", + "_OPT_ExcitingText", + "_OPT_FlippedOutText", + "_OPT_FriendlyText", + "_OPT_FrighteningText", + "_OPT_GroovyText", + "_OPT_GuardedText", + "_OPT_HeartMeltinglyText", + "_OPT_HotHotHotText", + "_OPT_InspiringText", + "_OPT_IntroText1", + "_OPT_IntroText2", + "_OPT_IntroText3", + "_OPT_LooksInWaterText", + "_OPT_LovelyText", + "_OPT_MaryText1", + "_OPT_MischievouslyText", + "_OPT_OakText1", + "_OPT_OakText2", + "_OPT_OakText3", + "_OPT_PleasantText", + "_OPT_PokemonChannelText", + "_OPT_PowerfulText", + "_OPT_ProvocativelyText", + "_OPT_SensuallyText", + "_OPT_SpeedyText", + "_OPT_StimulatingText", + "_OPT_SuaveDebonairText", + "_OPT_SweetAdorablyText", + "_OPT_TopicallyText", + "_OPT_UnbearablyText", + "_OPT_UndeniablyKindOfText", + "_OPT_WeirdText", + "_OPT_WigglySlicklyText", + "_OPT_WowImpressivelyText", + "_OTSendsText", + "_OakPCText1", + "_OakPCText2", + "_OakPCText3", + "_OakPCText4", + "_OakRating01", + "_OakRating02", + "_OakRating03", + "_OakRating04", + "_OakRating05", + "_OakRating06", + "_OakRating07", + "_OakRating08", + "_OakRating09", + "_OakRating10", + "_OakRating11", + "_OakRating12", + "_OakRating13", + "_OakRating14", + "_OakRating15", + "_OakRating16", + "_OakRating17", + "_OakRating18", + "_OakRating19", + "_OakText1", + "_OakText2", + "_OakText3", + "_OakText4", + "_OakText5", + "_OakText6", + "_OakText7", + "_OakThisIsntTheTimeText", + "_OakTimeHoursQuestionMarkText", + "_OakTimeHowManyMinutesText", + "_OakTimeIsItText", + "_OakTimeMinutesQuestionMarkText", + "_OakTimeOversleptText", + "_OakTimeSoDarkText", + "_OakTimeWhatDayIsItText", + "_OakTimeWhatHoursText", + "_OakTimeWhatTimeIsItText", + "_OakTimeWhoaMinutesText", + "_OakTimeWokeUpText", + "_OakTimeYikesText", + "_ObjectEventText", + "_ObtainedFruitText", + "_ObtainedTheVoltorbBadgeText", + "_OhFineThenText", + "_OnlyOneMonText", + "_OnlyThreeMonMayBeEnteredText", + "_PCCantDepositLastMonText", + "_PCCantTakeText", + "_PCGottaHavePokemonText", + "_PCMonHoldingMailText", + "_PCNoSingleMonText", + "_PCWhatText", + "_PPIsMaxedOutText", + "_PPRestoredText", + "_PPsIncreasedText", + "_PackEmptyText", + "_PackNoItemText", + "_PasscodeSetText", + "_PasscodesNotSameText", + "_PasswordAskEnterText", + "_PasswordAskResetClockText", + "_PasswordAskResetText", + "_PasswordWrongText", + "_PerfectHeresYourMonText", + "_PharmacyComeAgainText", + "_PharmacyFinalPriceText", + "_PharmacyHowManyText", + "_PharmacyIntroText", + "_PharmacyNoMoneyText", + "_PharmacyPackFullText", + "_PharmacyThanksText", + "_PhoneClickText", + "_PhoneEllipseText", + "_PhoneJustTalkToThemText", + "_PhoneOutOfAreaText", + "_PhoneThankYouText", + "_PhoneWrongNumberText", + "_PickErrorPacketText", + "_PickThreeMonForMobileBattleText", + "_PlayedFluteText", + "_PlayerFoundItemText", + "_PlayersPCAskWhatDoText", + "_PlayersPCDepositItemsText", + "_PlayersPCHowManyDepositText", + "_PlayersPCHowManyWithdrawText", + "_PlayersPCNoItemsText", + "_PlayersPCNoRoomDepositText", + "_PlayersPCNoRoomWithdrawText", + "_PlayersPCTurnOnText", + "_PlayersPCWithdrewItemsText", + "_PleaseTryAgainTomorrowText", + "_PnP_BoldText", + "_PnP_CoolText", + "_PnP_CuteText", + "_PnP_GreatText", + "_PnP_HappyText", + "_PnP_InspiringText", + "_PnP_LazyText", + "_PnP_MyTypeText", + "_PnP_NoisyText", + "_PnP_OddText", + "_PnP_PickyText", + "_PnP_PrecociousText", + "_PnP_RightForMeText", + "_PnP_SoSoText", + "_PnP_SortOfOKText", + "_PnP_Text1", + "_PnP_Text2", + "_PnP_Text3", + "_PnP_Text4", + "_PnP_Text5", + "_PnP_WeirdText", + "_PocketIsFullText", + "_PoisonFaintText", + "_PoisonWhiteoutText", + "_PokecenterBillsPCText", + "_PokecenterOaksPCText", + "_PokecenterPCCantUseText", + "_PokecenterPCOaksClosedText", + "_PokecenterPCTurnOnText", + "_PokecenterPCWhoseText", + "_PokecenterPlayersPCText", + "_PokedexShowText", + "_PokegearAskDeleteText", + "_PokegearAskWhoCallText", + "_PokegearPressButtonText", + "_PokemonAskSwapItemText", + "_PokemonHoldItemText", + "_PokemonNotEnoughHPText", + "_PokemonNotHoldingText", + "_PokemonRemoveMailText", + "_PokemonSwapItemText", + "_PokemonTookItemText", + "_PrestoAllDoneText", + "_PutAwayAndSetUpText", + "_PutAwayTheDecoText", + "_PutCardInCardFolderText", + "_PutItemInPocketText", + "_RaiseThePPOfWhichMoveText", + "_ReceiveItemText", + "_ReceivedEggText", + "_ReceivedItemText", + "_ReceivedTMHMText", + "_RecoveredSomeHPText", + "_RegisteredItemText", + "_RemainingTimeText", + "_RemoveMailText", + "_RepelUsedEarlierIsStillInEffectText", + "_RepelWoreOffText", + "_RestoreThePPOfWhichMoveText", + "_RetrieveMysteryGiftText", + "_RevitalizedText", + "_RidOfParalysisText", + "_RocketRadioText1", + "_RocketRadioText10", + "_RocketRadioText2", + "_RocketRadioText3", + "_RocketRadioText4", + "_RocketRadioText5", + "_RocketRadioText6", + "_RocketRadioText7", + "_RocketRadioText8", + "_RocketRadioText9", + "_RodBiteText", + "_RodNothingText", + "_SaveFileCorruptedText", + "_SavedTheGameText", + "_SavingDontTurnOffThePowerText", + "_SavingRecordText", + "_SeerCantTellAThingText", + "_SeerDoNothingText", + "_SeerEggText", + "_SeerImpressedText", + "_SeerMightyText", + "_SeerMoreCareText", + "_SeerMoreConfidentText", + "_SeerMuchStrengthText", + "_SeerNameLocationText", + "_SeerNoLocationText", + "_SeerSeeAllText", + "_SeerTimeLevelText", + "_SeerTradeText", + "_SentTrophyHomeText", + "_SetUpTheDecoText", + "_SlotsBetHowManyCoinsText", + "_SlotsDarnText", + "_SlotsLinedUpText", + "_SlotsNotEnoughCoinsText", + "_SlotsPlayAgainText", + "_SlotsRanOutOfCoinsText", + "_SlotsStartText", + "_SpaceSpaceColonText", + "_SquirtbottleNothingText", + "_StartMenuContestEndText", + "_StartText", + "_StartingLinkText", + "_StopLearningMoveText", + "_StoppedEvolvingText", + "_SweetScentNothingText", + "_TMHMNotCompatibleText", + "_TakeGoodCareOfEggText", + "_TakeGoodCareOfMonText", + "_TeleportReturnText", + "_TestEventText", + "_ThatCantBeUsedRightNowText", + "_ThatItemCantBePutInThePackText", + "_ThatsEnoughComeBackText", + "_TheBoxIsFullText", + "_TheItemWasPutInThePackText", + "_TheMonMustAllBeDifferentKindsText", + "_TheMonMustNotHoldTheSameItemsText", + "_ThePasswordIsText", + "_ThereIsNoEggText", + "_ThereIsNothingConnectedText", + "_ThrewAwayText", + "_TimeAskOkayText", + "_TimeLimitWasClearedText", + "_TimesetAskAdjustDSTText", + "_TimesetAskDSTText", + "_TimesetAskNotDSTText", + "_TimesetDSTText", + "_TimesetNotDSTText", + "_TradingMonForOTMonText", + "_TrainerRankingExplanationText", + "_TrainerRankingNoDataText", + "_TryAgainUsingSameSettingsText", + "_UnusedNothingHereText", + "_UseCutText", + "_UseDigText", + "_UseEscapeRopeText", + "_UseHeadbuttText", + "_UseRockSmashText", + "_UseSacredAshText", + "_UseStrengthText", + "_UseSweetScentText", + "_UseWaterfallText", + "_UseWhirlpoolText", + "_UsedInsteadText", + "_UsedMove1Text", + "_UsedMove2Text", + "_UsedSurfText", + "_WaitButtonText", + "_WantAQuickMobileBattleText", + "_WantToRushThroughAMobileBattleText", + "_WarpingText", + "_WasDefrostedText", + "_WasSentToBillsPCText", + "_WhatShouldIRaiseText", + "_WhichApricornText", + "_WhichMonPhotoText", + "_WhichSidePutAwayText", + "_WhichSidePutOnText", + "_WhitedOutText", + "_WillTradeText", + "_WillYouPlayWithMonText", + "_WindowAreaExceededErrorText", + "_WindowPoppingErrorText", + "_WokeUpText", + "_WouldYouLikeToMobileBattleText", + "_WouldYouLikeToSaveTheGameText", + "_YesPromptText", + "_YouCantTakeAnEggText", + "_YouCantUseItInABattleText", + "_YouDontHaveAMonText", + "_YouNeedTwoMonForBreedingText", + "_YourFoesWeakGetmMonText", + "_YourFriendIsNotReadyText", + "_YourMonHasGrownText", + "_YourMonsHPWasHealedText" + ] + }, + "tilesets": { + "TILESET_AERODACTYL_WORD_ROOM": {}, + "TILESET_BATTLE_TOWER_INSIDE": {}, + "TILESET_BATTLE_TOWER_OUTSIDE": {}, + "TILESET_BETA_WORD_ROOM": {}, + "TILESET_CAVE": {}, + "TILESET_CHAMPIONS_ROOM": {}, + "TILESET_DARK_CAVE": {}, + "TILESET_ELITE_FOUR_ROOM": {}, + "TILESET_FACILITY": {}, + "TILESET_FOREST": {}, + "TILESET_GAME_CORNER": {}, + "TILESET_GATE": {}, + "TILESET_HOUSE": {}, + "TILESET_HO_OH_WORD_ROOM": {}, + "TILESET_ICE_PATH": {}, + "TILESET_JOHTO": {}, + "TILESET_JOHTO_MODERN": {}, + "TILESET_KABUTO_WORD_ROOM": {}, + "TILESET_KANTO": {}, + "TILESET_LAB": {}, + "TILESET_LIGHTHOUSE": {}, + "TILESET_MANSION": {}, + "TILESET_MART": {}, + "TILESET_OMANYTE_WORD_ROOM": {}, + "TILESET_PARK": {}, + "TILESET_PLAYERS_HOUSE": {}, + "TILESET_PLAYERS_ROOM": {}, + "TILESET_POKECENTER": {}, + "TILESET_POKECOM_CENTER": {}, + "TILESET_PORT": {}, + "TILESET_RADIO_TOWER": {}, + "TILESET_RUINS_OF_ALPH": {}, + "TILESET_TOWER": {}, + "TILESET_TRADITIONAL_HOUSE": {}, + "TILESET_TRAIN_STATION": {}, + "TILESET_UNDERGROUND": {} + }, + "unownCharmap": { + "0": "A", + "10": "F", + "100": "-", + "12": "G", + "14": "H", + "2": "B", + "255": "@", + "32": "I", + "34": "J", + "36": "K", + "38": "L", + "4": "C", + "40": "M", + "42": "N", + "44": "O", + "46": "P", + "6": "D", + "64": "Q", + "66": "R", + "68": "S", + "70": "T", + "72": "U", + "74": "V", + "76": "W", + "78": "X", + "8": "E", + "96": "Y", + "98": "Z" + } +} diff --git a/tools/save-editor/App.lua b/tools/save-editor/App.lua index 5e45e56f..b64816f4 100644 --- a/tools/save-editor/App.lua +++ b/tools/save-editor/App.lua @@ -103,6 +103,9 @@ local function applyLoaded(path, statusVerb) S.loadError = false S.allowSave = true end + if Gen.of(S.save, S.version) == 2 then + S.events = Catalog.gen2EventList(Gen.engineOf(S.save, S.version), S.modRoots) + end local mapId = Gen.playerMap(S.save) S.mapId = mapId S.dirty = false @@ -169,16 +172,14 @@ function App.load(pathOverride, opts) for _, mod in ipairs(S.mods:status().loaded) do modRoots[#modRoots + 1] = mod.path end + S.modRoots = modRoots if Gen.of(nil, opts.version) == 2 or require("src.core.GameVersion").generation() == 2 then - S.events = Catalog.goldEventList(modRoots) + S.events = Catalog.gen2EventList(Gen.engineOf(nil, opts.version), modRoots) else S.events = Catalog.scrapeEvents("data/scripts", "data/generated/trainer_headers.lua", nil, modRoots) end applyLoaded(pathOverride or SaveIO.defaultPath(), "Loaded") - if Gen.of(S.save, S.version) == 2 then - S.events = Catalog.goldEventList(modRoots) - end end -- Switch to another save file (Open button, drag-drop, or --save arg). diff --git a/tools/save-editor/Catalog.lua b/tools/save-editor/Catalog.lua index 6280ea25..2bd27988 100644 --- a/tools/save-editor/Catalog.lua +++ b/tools/save-editor/Catalog.lua @@ -125,15 +125,8 @@ function Catalog.scrapeEvents(scriptDir, headerPath, listFiles, extraDirs) return sortedKeys(found) end -function Catalog.goldEventList(extraDirs) - local names = {} - local ok, flags = pcall(require, "src.core.gen2.FlagNames") - if ok and flags and flags.events then - for name in pairs(flags.events) do - names[#names + 1] = name - end - end - table.sort(names) +function Catalog.gen2EventList(engine, extraDirs) + local names = require("Gen2Flags").names(engine) local modFlags = Catalog.scrapeEvents(nil, nil, nil, extraDirs) local seen = {} for _, name in ipairs(names) do seen[name] = true end @@ -146,4 +139,8 @@ function Catalog.goldEventList(extraDirs) return names end +function Catalog.goldEventList(extraDirs) + return Catalog.gen2EventList("gs", extraDirs) +end + return Catalog diff --git a/tools/save-editor/Gen.lua b/tools/save-editor/Gen.lua index 56258a85..3b978f55 100644 --- a/tools/save-editor/Gen.lua +++ b/tools/save-editor/Gen.lua @@ -24,6 +24,37 @@ function Gen.of(save, version) return GameVersion.generation() end +local function versionOf(save, version) + if type(save) == "table" and GameVersion.VERSIONS[save.version] then + return save.version + end + if type(version) == "string" and GameVersion.VERSIONS[version] then + return version + end + return GameVersion.get() +end +Gen.versionOf = versionOf + +function Gen.engineOf(save, version) + return GameVersion.engine(versionOf(save, version)) +end + +function Gen.editionLabel(save, version) + local info = GameVersion.info(versionOf(save, version)) + return tostring((info and info.label) or "GEN 2"):upper() +end + +function Gen.hasCaughtData(save, version) + if Gen.of(save, version) ~= 2 then return false end + return require("src.battle.gen2.Mon").hasCaughtData(versionOf(save, version)) +end + +-- engine/menus/init_gender.asm:23-38 +function Gen.hasPlayerGender(save, version) + if Gen.of(save, version) ~= 2 then return false end + return Gen.engineOf(save, version) == "crystal" +end + function Gen.ofState(S) if not S then return GameVersion.generation() end return Gen.of(S.save, S.version) @@ -110,10 +141,17 @@ function Gen.bindGoldData(data) end function Gen.newGame(version) - if (versionGeneration(version) or GameVersion.generation(version)) == 2 then - return require("src.core.gen2.Save").newGame() + local id = type(version) == "string" and GameVersion.VERSIONS[version] and version + or nil + if (versionGeneration(id) or GameVersion.generation()) == 2 then + local Save2 = require("src.core.gen2.Save") + local save = Save2.newGame({ + playerName = id and Save2.defaultPlayerName(id) or nil, + }) + if id then save.version = id end + return save end - return require("src.core.SaveData").newGame() + return require("src.core.SaveData").newGame({ version = id }) end function Gen.validate(save, data) @@ -223,6 +261,34 @@ function Gen.setCoins(save, amount) end end +-- constants/ram_constants.asm:176-177 +function Gen.playerGender(save) + local stored = save and save.player and save.player.gender + return stored == "female" and "female" or "male" +end + +function Gen.setPlayerGender(save, gender) + save.player = save.player or {} + save.player.gender = (gender == "female") and "female" or "male" + return save.player.gender +end + +-- constants/landmark_constants.asm:3, :111-113 +function Gen.landmarkName(data, index) + index = math.floor(tonumber(index) or 0) + local Mon = require("src.battle.gen2.Mon") + if index == Mon.LANDMARK_EVENT then return "EVENT" end + if index == Mon.LANDMARK_GIFT then return "GIFT" end + if index == 0 then return "UNKNOWN" end + local rows = data and data.gen2Landmarks and data.gen2Landmarks.landmarks + for _, rec in pairs(rows or {}) do + if type(rec) == "table" and rec.index == index then + return (tostring(rec.name or rec.id):gsub("\n", " ")) + end + end + return ("#%d"):format(index) +end + function Gen.dexOwnedKey(save) if Gen.of(save) == 2 then return "caught" end return "owned" @@ -317,14 +383,13 @@ function Gen.toggleBadge(save, id) return not on end -local function goldFlagId(name) - local flags = require("src.core.gen2.FlagNames") - return flags.events and flags.events[name] +local function gen2FlagId(save, name) + return require("Gen2Flags").byName(Gen.engineOf(save))[name] end function Gen.getFlag(save, name) if Gen.of(save) == 2 then - local id = goldFlagId(name) + local id = gen2FlagId(save, name) if id then local Events2 = require("src.world.gen2.Events") local ev = Events2.new() @@ -338,7 +403,7 @@ end function Gen.setFlag(save, name, on) if Gen.of(save) == 2 then - local id = goldFlagId(name) + local id = gen2FlagId(save, name) if id then local Events2 = require("src.world.gen2.Events") local ev = Events2.new() diff --git a/tools/save-editor/Gen2Flags.lua b/tools/save-editor/Gen2Flags.lua new file mode 100644 index 00000000..9de49a9d --- /dev/null +++ b/tools/save-editor/Gen2Flags.lua @@ -0,0 +1,275 @@ +-- ../pokecrystal/constants/event_flags.asm:1 against +-- ../pokegold/constants/event_flags.asm:1 + +local Gen2Flags = {} + +Gen2Flags.CRYSTAL_ADDED = { + EVENT_ALAN_GAVE_FIRE_STONE = 257, + EVENT_ANSWERED_DRAGON_MASTER_QUIZ_WRONG = 193, + EVENT_AZALEA_TOWN_KURT = 1956, + EVENT_BATTLE_TOWER_BATTLE_ROOM_YOUNGSTER = 1937, + EVENT_BATTLE_TOWER_OPEN_CIVILIANS = 1999, + EVENT_BEAT_BEAUTY_OLIVIA = 1473, + EVENT_BEAT_BUG_CATCHER_WAYNE = 1472, + EVENT_BEAT_CAMPER_QUENTIN = 1475, + EVENT_BEAT_COOLTRAINERF_CARA = 1470, + EVENT_BEAT_COOLTRAINERM_DARIN = 1469, + EVENT_BEAT_FISHER_TULLY = 1108, + EVENT_BEAT_FISHER_TULLY2 = 1119, + EVENT_BEAT_FISHER_TULLY3 = 1120, + EVENT_BEAT_POKEFANF_JAIME = 1474, + EVENT_BEAT_POKEFANM_ALLAN = 1480, + EVENT_BEAT_POKEFANM_REX = 1479, + EVENT_BEAT_POKEMANIAC_MILLER = 1476, + EVENT_BEAT_SAGE_GAKU = 1481, + EVENT_BEAT_SAGE_KOJI = 1483, + EVENT_BEAT_SAGE_MASA = 1482, + EVENT_BEAT_SUPER_NERD_HUGH = 1477, + EVENT_BEAT_SUPER_NERD_MARKUS = 1478, + EVENT_BEAT_SUPER_NERD_STAN = 1409, + EVENT_BEAT_TWINS_LEA_AND_PIA = 1471, + EVENT_BUENA_OFFERED_HER_PHONE_NUMBER = 828, + EVENT_BUENA_OFFERED_HER_PHONE_NUMBER_NO_BLUE_CARD = 670, + EVENT_BUGGING_KURT_TOO_MUCH = 187, + EVENT_BURNED_TOWER_1F_EUSINE = 1893, + EVENT_BURNED_TOWER_1F_HIDDEN_ULTRA_BALL = 255, + EVENT_BURNED_TOWER_1F_HP_UP = 1622, + EVENT_BURNED_TOWER_MORTY = 1892, + EVENT_CAN_GIVE_GS_BALL_TO_KURT = 190, + EVENT_CIANWOOD_CITY_EUSINE = 1965, + EVENT_COPYCAT_1 = 1774, + EVENT_COPYCAT_2 = 1775, + EVENT_DANA_GAVE_THUNDERSTONE = 258, + EVENT_DARK_CAVE_VIOLET_ENTRANCE_DIRE_HIT = 1998, + EVENT_DRAGONS_DEN_B1F_CALCIUM = 1983, + EVENT_DRAGONS_DEN_B1F_MAX_ELIXER = 1984, + EVENT_DRAGON_SHRINE_CLAIR = 1936, + EVENT_ECRUTEAK_CITY_GRAMPS = 1961, + EVENT_ECRUTEAK_GYM_GRAMPS = 1960, + EVENT_ECRUTEAK_TIN_TOWER_ENTRANCE_WANDERING_SAGE = 1969, + EVENT_ERIN_CALCIUM = 827, + EVENT_EUSINE_IN_BURNED_TOWER = 1962, + EVENT_FLORIA_AT_FLOWER_SHOP = 1896, + EVENT_FLORIA_AT_SUDOWOODO = 1897, + EVENT_FOREST_IS_RESTLESS = 192, + EVENT_FOUGHT_EUSINE = 819, + EVENT_FOUGHT_SUICUNE = 821, + EVENT_GAVE_GS_BALL_TO_KURT = 191, + EVENT_GINA_GAVE_LEAF_STONE = 256, + EVENT_GOLDENROD_CITY_MOVE_TUTOR = 1898, + EVENT_GOLDENROD_GAME_CORNER_MOVE_TUTOR = 1899, + EVENT_GOLDENROD_SALE_OFF = 1776, + EVENT_GOLDENROD_SALE_ON = 1777, + EVENT_GOLDENROD_UNDERGROUND_WAREHOUSE_ULTRA_BALL = 1621, + EVENT_GOT_CLEAR_BELL = 120, + EVENT_GOT_DRATINI = 189, + EVENT_GOT_GS_BALL_FROM_GOLDENROD_POKEMON_CENTER = 832, + EVENT_GOT_ODD_EGG = 830, + EVENT_GOT_RAINBOW_WING = 822, + EVENT_HOLE_IN_BURNED_TOWER = 818, + EVENT_HUEY_PROTEIN = 823, + EVENT_ICE_PATH_1F_PROTEIN = 1982, + EVENT_ILEX_FOREST_ANTIDOTE = 1978, + EVENT_ILEX_FOREST_ETHER = 1979, + EVENT_ILEX_FOREST_FARFETCHD = 1769, + EVENT_ILEX_FOREST_KURT = 1957, + EVENT_ILEX_FOREST_LASS = 1773, + EVENT_ILEX_FOREST_X_ATTACK = 1977, + EVENT_JOEY_HP_UP = 824, + EVENT_KOJI_ALLOWS_YOU_PASSAGE_TO_TIN_TOWER = 820, + EVENT_KURTS_HOUSE_GRANDDAUGHTER_1 = 1932, + EVENT_KURTS_HOUSE_GRANDDAUGHTER_2 = 1933, + EVENT_LAKE_OF_RAGE_ELIXER = 1605, + EVENT_LAKE_OF_RAGE_ELIXIR_ON_STANDBY = 58, + EVENT_MET_BUENA = 829, + EVENT_MET_FLORIA = 185, + EVENT_MOUNT_MORTAR_1F_INSIDE_IRON = 1992, + EVENT_MOUNT_MORTAR_1F_INSIDE_MAX_POTION = 1958, + EVENT_MOUNT_MORTAR_1F_INSIDE_NUGGET = 1959, + EVENT_MOUNT_MORTAR_1F_INSIDE_ULTRA_BALL = 1993, + EVENT_MOUNT_MORTAR_B1F_CARBOS = 1671, + EVENT_MOUNT_MORTAR_B1F_FULL_RESTORE = 1994, + EVENT_MOUNT_MORTAR_B1F_MAX_ETHER = 1995, + EVENT_MOUNT_MORTAR_B1F_PP_UP = 1996, + EVENT_OLIVINE_LIGHTHOUSE_5F_SUPER_REPEL = 1638, + EVENT_PARRY_IRON = 826, + EVENT_PICKED_UP_BERRY_FROM_KABUTO_ITEM_ROOM = 1944, + EVENT_PICKED_UP_CHARCOAL_FROM_HO_OH_ITEM_ROOM = 1943, + EVENT_PICKED_UP_ENERGYPOWDER_FROM_KABUTO_ITEM_ROOM = 1947, + EVENT_PICKED_UP_ENERGY_ROOT_FROM_AERODACTYL_ITEM_ROOM = 1955, + EVENT_PICKED_UP_GOLD_BERRY_FROM_AERODACTYL_ITEM_ROOM = 1952, + EVENT_PICKED_UP_GOLD_BERRY_FROM_HO_OH_ITEM_ROOM = 1940, + EVENT_PICKED_UP_HEAL_POWDER_FROM_AERODACTYL_ITEM_ROOM = 1954, + EVENT_PICKED_UP_HEAL_POWDER_FROM_KABUTO_ITEM_ROOM = 1946, + EVENT_PICKED_UP_MOON_STONE_FROM_AERODACTYL_ITEM_ROOM = 1953, + EVENT_PICKED_UP_MYSTERYBERRY_FROM_HO_OH_ITEM_ROOM = 1941, + EVENT_PICKED_UP_MYSTERYBERRY_FROM_OMANYTE_ITEM_ROOM = 1948, + EVENT_PICKED_UP_MYSTIC_WATER_FROM_OMANYTE_ITEM_ROOM = 1949, + EVENT_PICKED_UP_PSNCUREBERRY_FROM_KABUTO_ITEM_ROOM = 1945, + EVENT_PICKED_UP_REVIVAL_HERB_FROM_HO_OH_ITEM_ROOM = 1942, + EVENT_PICKED_UP_STARDUST_FROM_OMANYTE_ITEM_ROOM = 1950, + EVENT_PICKED_UP_STAR_PIECE_FROM_OMANYTE_ITEM_ROOM = 1951, + EVENT_PLAYERS_HOUSE_1F_NEIGHBOR = 1938, + EVENT_PLAYERS_NEIGHBORS_HOUSE_NEIGHBOR = 1939, + EVENT_RADIO_TOWER_5F_ULTRA_BALL = 1997, + EVENT_RANG_CLEAR_BELL_1 = 1894, + EVENT_RANG_CLEAR_BELL_2 = 1895, + EVENT_ROUTE_30_ANTIDOTE = 1976, + EVENT_ROUTE_31_POTION = 1710, + EVENT_ROUTE_32_REPEL = 1713, + EVENT_ROUTE_34_ILEX_FOREST_GATE_LASS = 1771, + EVENT_ROUTE_34_ILEX_FOREST_GATE_TEACHER_BEHIND_COUNTER = 1770, + EVENT_ROUTE_34_ILEX_FOREST_GATE_TEACHER_IN_WALKWAY = 1772, + EVENT_ROUTE_34_NUGGET = 1980, + EVENT_ROUTE_44_MAX_REPEL = 1981, + EVENT_ROUTE_45_NUGGET = 1720, + EVENT_ROUTE_46_X_SPEED = 1724, + EVENT_RUINS_OF_ALPH_OUTSIDE_TOURIST_FISHER = 1934, + EVENT_RUINS_OF_ALPH_OUTSIDE_TOURIST_YOUNGSTERS = 1935, + EVENT_SAW_SUICUNE_AT_CIANWOOD_CITY = 1966, + EVENT_SAW_SUICUNE_ON_ROUTE_36 = 1968, + EVENT_SAW_SUICUNE_ON_ROUTE_42 = 1967, + EVENT_SET_WHEN_FOUGHT_HO_OH = 1975, + EVENT_SILVER_CAVE_ROOM_1_PROTEIN = 1690, + EVENT_SILVER_CAVE_ROOM_1_ULTRA_BALL = 1985, + EVENT_SILVER_CAVE_ROOM_2_CALCIUM = 1986, + EVENT_SILVER_CAVE_ROOM_2_PP_UP = 1988, + EVENT_SILVER_CAVE_ROOM_2_ULTRA_BALL = 1987, + EVENT_SPROUT_TOWER_2F_X_ACCURACY = 1608, + EVENT_TALKED_TO_FLORIA_AT_FLOWER_SHOP = 186, + EVENT_TALKED_TO_RUINS_COWARD = 188, + EVENT_TEAM_ROCKET_BASE_B1F_GUARD_SPEC = 1643, + EVENT_TEAM_ROCKET_BASE_B3F_FULL_HEAL = 1647, + EVENT_TEAM_ROCKET_BASE_B3F_PROTEIN = 1645, + EVENT_TEAM_ROCKET_BASE_B3F_ULTRA_BALL = 1620, + EVENT_TEAM_ROCKET_BASE_B3F_X_SPECIAL = 1646, + EVENT_TIFFANY_GAVE_PINK_BOW = 260, + EVENT_TIN_TOWER_1F_ENTEI = 1971, + EVENT_TIN_TOWER_1F_EUSINE = 1973, + EVENT_TIN_TOWER_1F_RAIKOU = 1972, + EVENT_TIN_TOWER_1F_SUICUNE = 1970, + EVENT_TIN_TOWER_1F_WISE_TRIO_1 = 1974, + EVENT_TIN_TOWER_1F_WISE_TRIO_2 = 1989, + EVENT_TIN_TOWER_4F_PP_UP = 1613, + EVENT_TIN_TOWER_6F_MAX_POTION = 1990, + EVENT_TIN_TOWER_9F_HP_UP = 1991, + EVENT_TULLY_ASKED_FOR_PHONE_NUMBER = 655, + EVENT_TULLY_GAVE_WATER_STONE = 259, + EVENT_UNION_CAVE_1F_POTION = 1628, + EVENT_UNION_CAVE_1F_X_ATTACK = 1627, + EVENT_VANCE_CARBOS = 825, + EVENT_VICTORY_ROAD_HP_UP = 1703, + EVENT_WADE_HAS_BERRY = 811, + EVENT_WADE_HAS_BITTER_BERRY = 814, + EVENT_WADE_HAS_PRZCUREBERRY = 813, + EVENT_WADE_HAS_PSNCUREBERRY = 812, + EVENT_WALL_OPENED_IN_AERODACTYL_CHAMBER = 809, + EVENT_WALL_OPENED_IN_HO_OH_CHAMBER = 806, + EVENT_WALL_OPENED_IN_KABUTO_CHAMBER = 807, + EVENT_WALL_OPENED_IN_OMANYTE_CHAMBER = 808, + EVENT_WELCOMED_TO_POKECOM_CENTER = 810, + EVENT_WHIRL_ISLAND_SW_ULTRA_BALL = 1680, + EVENT_WILTON_HAS_GREAT_BALL = 816, + EVENT_WILTON_HAS_POKE_BALL = 817, + EVENT_WILTON_HAS_ULTRA_BALL = 815, + EVENT_WISE_TRIOS_ROOM_WISE_TRIO_1 = 1963, + EVENT_WISE_TRIOS_ROOM_WISE_TRIO_2 = 1964, +} + +Gen2Flags.CRYSTAL_REMOVED = { + EVENT_ALAN_READY_FOR_REMATCH = true, + EVENT_ANTHONY_READY_FOR_REMATCH = true, + EVENT_ARNIE_READY_FOR_REMATCH = true, + EVENT_BEAT_FISHER_CHRIS = true, + EVENT_BEAT_FISHER_CHRIS2 = true, + EVENT_BEAT_FISHER_CHRIS3 = true, + EVENT_BEAT_SUPER_NERD_ERIC_UNUSED = true, + EVENT_BETH_READY_FOR_REMATCH = true, + EVENT_BEVERLY_READY_FOR_REMATCH = true, + EVENT_BRENT_READY_FOR_REMATCH = true, + EVENT_BURNED_TOWER_1F_BURN_HEAL = true, + EVENT_BURNED_TOWER_1F_X_SPEED = true, + EVENT_BURNED_TOWER_B1F_HIDDEN_BURN_HEAL = true, + EVENT_BURNED_TOWER_B1F_HIDDEN_NUGGET = true, + EVENT_BURNED_TOWER_B1F_HIDDEN_ULTRA_BALL = true, + EVENT_BURNED_TOWER_B1F_HP_UP = true, + EVENT_BURNED_TOWER_FIREBREATHER_DICK_ASHES = true, + EVENT_BURNED_TOWER_FIREBREATHER_DICK_NORMAL = true, + EVENT_CHAD_READY_FOR_REMATCH = true, + EVENT_CHRIS_ASKED_FOR_PHONE_NUMBER = true, + EVENT_CHRIS_READY_FOR_REMATCH = true, + EVENT_DANA_READY_FOR_REMATCH = true, + EVENT_DEREK_READY_FOR_REMATCH = true, + EVENT_ECRUTEAK_TIN_TOWER_ENTRANCE_SAGE_LEFT = true, + EVENT_ECRUTEAK_TIN_TOWER_ENTRANCE_SAGE_RIGHT = true, + EVENT_ERIN_READY_FOR_REMATCH = true, + EVENT_GAVEN_READY_FOR_REMATCH = true, + EVENT_GINA_READY_FOR_REMATCH = true, + EVENT_HUEY_READY_FOR_REMATCH = true, + EVENT_ILEX_FOREST_FARFETCHD_1 = true, + EVENT_ILEX_FOREST_FARFETCHD_10 = true, + EVENT_ILEX_FOREST_FARFETCHD_2 = true, + EVENT_ILEX_FOREST_FARFETCHD_3 = true, + EVENT_ILEX_FOREST_FARFETCHD_4 = true, + EVENT_ILEX_FOREST_FARFETCHD_5 = true, + EVENT_ILEX_FOREST_FARFETCHD_6 = true, + EVENT_ILEX_FOREST_FARFETCHD_7 = true, + EVENT_ILEX_FOREST_FARFETCHD_8 = true, + EVENT_ILEX_FOREST_FARFETCHD_9 = true, + EVENT_IRWIN_READY_FOR_REMATCH = true, + EVENT_JACK_READY_FOR_REMATCH = true, + EVENT_JOEY_READY_FOR_REMATCH = true, + EVENT_JOSE_READY_FOR_REMATCH = true, + EVENT_KENJI_READY_FOR_REMATCH = true, + EVENT_LAKE_OF_RAGE_ETHER_ON_STANDBY = true, + EVENT_LAKE_OF_RAGE_MAX_ETHER = true, + EVENT_LIZ_READY_FOR_REMATCH = true, + EVENT_MOUNT_MORTAR_B1F_FULL_HEAL = true, + EVENT_OLIVINE_LIGHTHOUSE_5F_GREAT_BALL = true, + EVENT_PARRY_READY_FOR_REMATCH = true, + EVENT_RALPH_READY_FOR_REMATCH = true, + EVENT_REENA_READY_FOR_REMATCH = true, + EVENT_ROUTE_31_ANTIDOTE = true, + EVENT_ROUTE_32_POTION = true, + EVENT_ROUTE_45_X_SPECIAL = true, + EVENT_ROUTE_46_DIRE_HIT = true, + EVENT_SILVER_CAVE_ROOM_1_X_ACCURACY = true, + EVENT_SPROUT_TOWER_2F_X_DEFEND = true, + EVENT_TEAM_ROCKET_BASE_B1F_X_ACCURACY = true, + EVENT_TEAM_ROCKET_BASE_B3F_DIRE_HIT = true, + EVENT_TIFFANY_READY_FOR_REMATCH = true, + EVENT_TIN_TOWER_4F_SUPER_POTION = true, + EVENT_TODD_READY_FOR_REMATCH = true, + EVENT_VANCE_READY_FOR_REMATCH = true, + EVENT_VICTORY_ROAD_X_SPECIAL = true, + EVENT_WADE_READY_FOR_REMATCH = true, + EVENT_WHIRL_ISLAND_SW_GUARD_SPEC = true, + EVENT_WILTON_READY_FOR_REMATCH = true, +} + +local cache = {} + +function Gen2Flags.byName(engine) + engine = (engine == "crystal") and "crystal" or "gs" + if cache[engine] then return cache[engine] end + local ids = {} + local ok, flags = pcall(require, "src.core.gen2.FlagNames") + if ok and type(flags) == "table" and type(flags.events) == "table" then + for name, id in pairs(flags.events) do ids[name] = id end + end + if engine == "crystal" then + for name in pairs(Gen2Flags.CRYSTAL_REMOVED) do ids[name] = nil end + for name, id in pairs(Gen2Flags.CRYSTAL_ADDED) do ids[name] = id end + end + cache[engine] = ids + return ids +end + +function Gen2Flags.names(engine) + local names = {} + for name in pairs(Gen2Flags.byName(engine)) do names[#names + 1] = name end + table.sort(names) + return names +end + +return Gen2Flags diff --git a/tools/save-editor/Ops.lua b/tools/save-editor/Ops.lua index 86276d76..c5e2a33d 100644 --- a/tools/save-editor/Ops.lua +++ b/tools/save-editor/Ops.lua @@ -1141,4 +1141,74 @@ function Ops.setPokerus(S, mon, value) return Ops.mark(S, ("%s pokerus byte %d"):format(mon.species, want)) end +-- engine/pokemon/caught_data.asm:169-172 +Ops.CAUGHT_TIMES = { "UNKNOWN", "MORN", "DAY", "NITE" } + +local function caughtGuard(S, mon) + if not mon then return false end + if not Gen.hasCaughtData(S.save, S.version) then + return Ops.say(S, "This game has no caught data") + end + return true +end + +function Ops.setCaughtTime(S, mon, value) + if not caughtGuard(S, mon) then return false end + local want = clamp(math.floor(tonumber(value) or 0), 0, 3) + if want == (mon.caughtTime or 0) then + return Ops.say(S, ("Caught time is already %s"):format(Ops.CAUGHT_TIMES[want + 1])) + end + mon.caughtTime = want + return Ops.mark(S, ("%s caught time %s") + :format(mon.species, Ops.CAUGHT_TIMES[want + 1])) +end + +-- constants/pokemon_data_constants.asm:120-121 +function Ops.setCaughtLevel(S, mon, value) + if not caughtGuard(S, mon) then return false end + local Mon = require("src.battle.gen2.Mon") + local want = clamp(math.floor(tonumber(value) or 0), 0, Mon.CAUGHT_LEVEL_MASK) + if want == (mon.caughtLevel or 0) then + return Ops.say(S, ("Caught level is already %d"):format(want)) + end + mon.caughtLevel = want + return Ops.mark(S, ("%s caught level %d"):format(mon.species, want)) +end + +-- constants/landmark_constants.asm:111-113 +function Ops.setCaughtLocation(S, mon, value) + if not caughtGuard(S, mon) then return false end + local Mon = require("src.battle.gen2.Mon") + local span = Mon.CAUGHT_LOCATION_MASK + 1 + local want = math.floor(tonumber(value) or 0) % span + if want == (mon.caughtLocation or 0) then + return Ops.say(S, ("Caught location is already %s") + :format(Gen.landmarkName(S.data, want))) + end + mon.caughtLocation = want + return Ops.mark(S, ("%s caught at %s") + :format(mon.species, Gen.landmarkName(S.data, want))) +end + +function Ops.setCaughtByGender(S, mon, gender) + if not caughtGuard(S, mon) then return false end + local Mon = require("src.battle.gen2.Mon") + local want = Mon.caughtGenderOf(gender) + if want == mon.caughtByGender then + return Ops.say(S, ("Caught by is already %s"):format(tostring(want or "none"))) + end + mon.caughtByGender = want + return Ops.mark(S, ("%s caught by %s"):format(mon.species, tostring(want or "none"))) +end + +function Ops.setPlayerGender(S, gender) + if not Gen.hasPlayerGender(S.save, S.version) then + return Ops.say(S, "This game has no player gender") + end + if Gen.playerGender(S.save) == gender then + return Ops.say(S, ("Player is already %s"):format(tostring(gender))) + end + return Ops.mark(S, ("Player gender %s"):format(Gen.setPlayerGender(S.save, gender))) +end + return Ops diff --git a/tools/save-editor/State.lua b/tools/save-editor/State.lua index 258e32d2..534d5411 100644 --- a/tools/save-editor/State.lua +++ b/tools/save-editor/State.lua @@ -26,6 +26,7 @@ function State.new() -- App.load's opts; nil in a bare `love . --editor` run. version = nil, slotId = nil, + modRoots = nil, -- Hosted inside the launcher process (Edit on a save row) rather than a -- standalone `--editor` window: Close returns to the launcher instead of -- quitting, and App calls onClose() to do it. diff --git a/tools/save-editor/panels/Items.lua b/tools/save-editor/panels/Items.lua index e43a8282..94db78bb 100644 --- a/tools/save-editor/panels/Items.lua +++ b/tools/save-editor/panels/Items.lua @@ -101,6 +101,31 @@ local function drawMoney(S, Kit, x, y, w, h) end end +-- engine/menus/init_gender.asm:55-56 +local GENDERS = { { "BOY", "male" }, { "GIRL", "female" } } + +local function trainerHeight(Kit, s, pad) + return pad * 2 + Kit.textHeight("caption") + 10 * s + 28 * s +end + +local function drawTrainer(S, Kit, x, y, w, h) + local s = Kit.scale + local pad = 16 * s + Kit.card(x, y, w, h) + Kit.caption(x + pad, y + pad, "TRAINER") + Kit.textRight("mono", tostring((S.save.player and S.save.player.name) or "?"), + x + w - pad, y + pad, PAL.caption) + local cy = y + pad + Kit.textHeight("caption") + 10 * s + local chipW = (w - 2 * pad - 8 * s) / 2 + local gender = Gen.playerGender(S.save) + for i, pair in ipairs(GENDERS) do + if Kit.chip(x + pad + (i - 1) * (chipW + 8 * s), cy, chipW, 28 * s, + pair[1], gender == pair[2], PAL.green, PAL.steel) then + Ops.setPlayerGender(S, pair[2]) + end + end +end + local BADGE_COLS = 4 local function badgeHeight(S, Kit, s, pad) @@ -273,6 +298,10 @@ function M.draw(S, Kit, x, y, w, h) local listH = 300 * s Kit.pushClip(x, y, w, h) local cy = y - off + if Gen.hasPlayerGender(S.save, S.version) then + local trainerH = trainerHeight(Kit, s, pad) + drawTrainer(S, Kit, x, cy, w, trainerH); cy = cy + trainerH + gap + end drawMoney(S, Kit, x, cy, w, moneyH); cy = cy + moneyH + gap drawPicker(S, Kit, x, cy, w, pickH); cy = cy + pickH + gap drawBadges(S, Kit, x, cy, w, badgeH); cy = cy + badgeH + gap @@ -294,8 +323,14 @@ function M.draw(S, Kit, x, y, w, h) -- made the old panel unusable. local moneyH = moneyHeight(Kit, s, pad, S) local badgeH = badgeHeight(S, Kit, s, pad) - drawMoney(S, Kit, x, y, leftW, moneyH) - drawPicker(S, Kit, x, y + moneyH + gap, leftW, h - moneyH - badgeH - 2 * gap) + local topH = 0 + if Gen.hasPlayerGender(S.save, S.version) then + topH = trainerHeight(Kit, s, pad) + gap + drawTrainer(S, Kit, x, y, leftW, topH - gap) + end + drawMoney(S, Kit, x, y + topH, leftW, moneyH) + drawPicker(S, Kit, x, y + topH + moneyH + gap, leftW, + h - topH - moneyH - badgeH - 2 * gap) drawBadges(S, Kit, x, y + h - badgeH, leftW, badgeH) drawBag(S, Kit, bagX, y, listW, h) drawPc(S, Kit, pcX, y, listW, h) diff --git a/tools/save-editor/panels/MonEditor.lua b/tools/save-editor/panels/MonEditor.lua index b9286048..35757324 100644 --- a/tools/save-editor/panels/MonEditor.lua +++ b/tools/save-editor/panels/MonEditor.lua @@ -147,6 +147,66 @@ local function drawDvRows(S, Kit, mon, cx, rowY, colW, rowH, rowGap) end end +-- engine/pokemon/caught_data.asm:168-199 +local CAUGHT_BY = { { "-", "none" }, { "BOY", "boy" }, { "GIRL", "girl" } } + +local function drawCaughtRows(S, Kit, mon, cx, y, inner, row) + local s = Kit.scale + local chipH = 22 * s + local gap = 6 * s + local tinyH = Kit.textHeight("tiny") + + Kit.text("tiny", "CAUGHT", cx, y + (row - tinyH) / 2, PAL.caption) + local timeX = cx + 62 * s + local timeW = math.max(34 * s, (cx + inner - timeX - 3 * gap) / 4) + for i, label in ipairs(Ops.CAUGHT_TIMES) do + if Kit.chip(timeX + (i - 1) * (timeW + gap), y + (row - chipH) / 2, + timeW, chipH, label, (mon.caughtTime or 0) == i - 1, PAL.blue, PAL.steel) then + Ops.setCaughtTime(S, mon, i - 1) + end + end + y = y + row + gap + + local btn = 24 * s + local lvX = cx + inner - 2 * btn - gap + if Kit.stepper(lvX, y + (row - btn) / 2, btn, btn, "-", { font = "small" }) then + Ops.setCaughtLevel(S, mon, (mon.caughtLevel or 0) - 1) + end + if Kit.stepper(lvX + btn + gap, y + (row - btn) / 2, btn, btn, "+", + { font = "small" }) then + Ops.setCaughtLevel(S, mon, (mon.caughtLevel or 0) + 1) + end + Kit.textRight("tiny", ("MET LV %d"):format(mon.caughtLevel or 0), lvX - 10 * s, + y + (row - tinyH) / 2, PAL.text) + Kit.text("tiny", "OT", cx, y + (row - tinyH) / 2, PAL.caption) + local otX = cx + 26 * s + local otW = math.max(30 * s, (inner * 0.42 - 26 * s - 2 * gap) / 3) + for i, pair in ipairs(CAUGHT_BY) do + if Kit.chip(otX + (i - 1) * (otW + gap), y + (row - chipH) / 2, otW, chipH, + pair[1], (mon.caughtByGender or "none") == pair[2], PAL.blue, PAL.steel) then + Ops.setCaughtByGender(S, mon, pair[2]) + end + end + y = y + row + gap + + local whereX = cx + inner - 3 * btn - 2 * gap + if Kit.stepper(whereX, y + (row - btn) / 2, btn, btn, "-", { font = "small" }) then + Ops.setCaughtLocation(S, mon, (mon.caughtLocation or 0) - 1) + end + if Kit.stepper(whereX + btn + gap, y + (row - btn) / 2, btn, btn, "+", + { font = "small" }) then + Ops.setCaughtLocation(S, mon, (mon.caughtLocation or 0) + 1) + end + if Kit.button(whereX + 2 * (btn + gap), y + (row - btn) / 2, btn, btn, "0", + { kind = "danger", font = "micro", radius = 6 * s }) then + Ops.setCaughtLocation(S, mon, 0) + end + local where = ("WHERE %s"):format(Gen.landmarkName(S.data, mon.caughtLocation or 0)) + Kit.text("tiny", Kit.ellipsize("tiny", where, whereX - 10 * s - cx), cx, + y + (row - tinyH) / 2, PAL.text) + return y + row + gap +end + local function drawMoveRows(S, Kit, mon, rightX, rowY, colW, rowH, rowGap) local s = Kit.scale for slot = 1, 4 do @@ -231,6 +291,7 @@ function MonEditor.draw(S, Kit, x, y, w, h) -- the field + Set row local extraH = 0 if Gen.ofState(S) == 2 then extraH = 88 * s end + if Gen.hasCaughtData(S.save, S.version) then extraH = extraH + 102 * s end local nickFieldH = 30 * s local contentH = pad + headerH + 18 * s + capH + 10 * s + nickFieldH + 18 * s @@ -341,7 +402,7 @@ function MonEditor.draw(S, Kit, x, y, w, h) local colY = statsY + cellH + 18 * s if Gen.ofState(S) == 2 then local extraY = colY - Kit.caption(cx, extraY, "GOLD") + Kit.caption(cx, extraY, Gen.editionLabel(S.save, S.version)) extraY = extraY + capH + 8 * s local row = 28 * s Kit.text("tiny", "HELD " .. tostring(mon.item or "none"), cx, extraY, PAL.text) @@ -371,7 +432,11 @@ function MonEditor.draw(S, Kit, x, y, w, h) if mon.unownLetter then bits[#bits + 1] = "Unown " .. tostring(mon.unownLetter) end Kit.text("tiny", table.concat(bits, " ") ~= "" and table.concat(bits, " ") or "gender/shiny follow DVs", cx, extraY, PAL.caption) - colY = extraY + 22 * s + extraY = extraY + 22 * s + if Gen.hasCaughtData(S.save, S.version) then + extraY = drawCaughtRows(S, Kit, mon, cx, extraY, inner, row) + end + colY = extraY end if narrow then -- stacked: DVs first, then moves, then the two actions side by side at From ebf44f20d3e9983dd338cde4511ee0ba160e9c26 Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Sat, 22 Aug 2026 21:41:19 -0400 Subject: [PATCH 20/33] Add custom carts: named, version-pinned mod sets that play as their own game A custom cart pairs an identity (title, shell colour, label art) with a base game, a list of mods pinned to exact builds with their option values frozen, a load order, and a seal. It ships no code of its own: every mod it names is a separately published mod, which is what keeps a cart auditable before it runs and reproducible after an author's repo disappears. Format and storage: - src/carts/CartManifest.lua parses and validates cart.json, canonicalises it for hashing and reads/writes the .g1rcart bundle. The bundle is a data-only serialised table read through SaveSerializer, so an imported cart can never execute code. Canonical strings are length-prefixed because option keys and values are author-controlled and could otherwise forge a record boundary and collide two different carts onto one hash. - Pins name a public source: a GitHub release with its sha256, a GameBanana file id with its md5, or "local" for a capture that only exists on this install. A local pin is unpublishable by construction, which is what makes "build it here, publish later" possible without inventing a hash. - Label art rides alongside the manifest rather than inside its identity, so re-arting a cart does not tell every player their run is out of date. src/core/Base64.lua decodes it; strict, with no whitespace tolerance. Saves: - Cart playthroughs live in the cart's own slot namespace (saves/cart_/), so a cart's file never sits beside a vanilla one and uninstalling a cart never orphans a save. Every save records the cart build it was made under. The seal: - A sealed cart loads its pinned list, in its order, with its options, and nothing else. A pinned mod with no frozen options gets an empty bucket so unfrozen keys fall to schema defaults, identical for everyone; otherwise two players on one cart quietly run different games. - A sealed cart refuses to load when a pin is missing or installed at another version. Playing a subset of the cart is the exact dishonesty the seal exists to prevent, so the refusal loads nothing at all. - Breaking the seal is permanent, marked per save slot, and downgrades that playthrough to open behaviour. It cannot be cleared through any public API. Launcher: - A game's page carries a Custom Carts control and a picker; choosing a cart turns the page into that cart's page, with its own cartridge, title and save slots. The rail of five games never grows and a cart id never reaches imp.tab or imp.panelVersion. - Loader.planCart runs before boot so a refusal is visible on the page instead of being discovered as an error after launch. - Save as cart captures the enabled mods for a game and names, before the player confirms, every mod that could only be pinned to this install and whether the result can be shared at all. Authoring: - tools/cartkit.py scaffolds, validates, pins and packs a cart, and installs a release workflow. Its writer is byte-identical to the engine's serialiser. --- docs/new-features.md | 1 + main.lua | 16 +- src/carts/CartManifest.lua | 432 ++++++++ src/carts/CartStore.lua | 338 ++++++ src/core/Base64.lua | 75 ++ src/core/SaveData.lua | 507 +++++++-- src/import/LauncherView.lua | 444 +++++++- src/import/RomImporter.lua | 483 ++++++++- src/mods/Loader.lua | 145 ++- tests/engine/cart_launcher.lua | 600 +++++++++++ tests/engine/cart_manifest.lua | 413 ++++++++ tests/engine/cart_saves.lua | 269 +++++ tests/engine/cart_seal.lua | 470 +++++++++ tests/engine/cart_store.lua | 393 +++++++ tools/cart_release_workflow.yml | 122 +++ tools/cartkit.py | 1749 +++++++++++++++++++++++++++++++ 16 files changed, 6256 insertions(+), 201 deletions(-) create mode 100644 src/carts/CartManifest.lua create mode 100644 src/carts/CartStore.lua create mode 100644 src/core/Base64.lua create mode 100644 tests/engine/cart_launcher.lua create mode 100644 tests/engine/cart_manifest.lua create mode 100644 tests/engine/cart_saves.lua create mode 100644 tests/engine/cart_seal.lua create mode 100644 tests/engine/cart_store.lua create mode 100644 tools/cart_release_workflow.yml create mode 100644 tools/cartkit.py diff --git a/docs/new-features.md b/docs/new-features.md index dccc76ea..9e07ed9a 100644 --- a/docs/new-features.md +++ b/docs/new-features.md @@ -15,6 +15,7 @@ Features intentionally added beyond the original Pokémon Red, Blue, and Yellow * **Touch skins** in RetroArch overlay format and Delta `.deltaskin` (including PDF-wrapped bezel art), with per-button press states and Super Game Boy borders * **Pokédex diploma and printer image exports** * **Shareable mod lists** over save sync, optionally carrying the options set for those mods, which the receiving device is asked about before anything is changed +* **Custom carts**, a named mod set saved from the mods tab and picked from a game's page, with its own shell colour, label art, save slots and export file ## Gen 2 Specifics diff --git a/main.lua b/main.lua index 7b6fba4c..ee5b41f8 100644 --- a/main.lua +++ b/main.lua @@ -327,9 +327,9 @@ end local function makeLauncher() local RomImporter = require("src.import.RomImporter") local forceImport = os.getenv("POKEPORT_FORCE_IMPORT") == "1" - return RomImporter.new(function(version) + return RomImporter.new(function(version, cartId) Importer = nil - bootGame(version) + bootGame(version, cartId) end, { launcher = true, forceImport = forceImport, @@ -394,7 +394,7 @@ local function returnToLauncher() Importer = makeLauncher() end -function bootGame(version) +function bootGame(version, cartId) -- The launcher hands us the chosen game (Red / Blue / Yellow / Gold); -- scripted and headless runs fall back to POKEPORT_VERSION, then Red. -- Set the active version and overlay its extracted cache BEFORE anything @@ -407,6 +407,16 @@ function bootGame(version) -- (Blue/Yellow/Gold caches live under blue/ / yellow/ / gold/). CacheFs.prefix = GameVersion.cachePrefix() CacheFs.mountVersion(GameVersion.get()) + local cartHash + if cartId then + local ok, cart, hash = pcall(function() + return require("src.carts.CartStore").get(cartId) + end) + if ok and cart then cartHash = hash else cartId = nil end + end + local SaveData = require("src.core.SaveData") + SaveData.setCart(cartId, cartHash) + if cartId then SaveData.adoptCartSeal(cartId) end -- NX: always write nx-asset-probe.log so Yellow/Blue art failures are -- diagnosable from the SD without enabling switch-debug.txt. pcall(function() diff --git a/src/carts/CartManifest.lua b/src/carts/CartManifest.lua new file mode 100644 index 00000000..cb27e68a --- /dev/null +++ b/src/carts/CartManifest.lua @@ -0,0 +1,432 @@ +local Base64 = require("src.core.Base64") +local GameVersion = require("src.core.GameVersion") +local SafePath = require("src.mods.SafePath") +local SaveSerializer = require("src.core.SaveSerializer") +local Semver = require("src.mods.Semver") +local StreamMD5 = require("src.mods.StreamMD5") + +local CartManifest = {} + +CartManifest.SCHEMA = 1 +CartManifest.EXT = ".g1rcart" +CartManifest.FORMAT = "g1rcart" +CartManifest.DIR = "carts" +CartManifest.SEALS = { sealed = true, open = true } +CartManifest.SOURCES = { github = true, gamebanana = true, ["local"] = true } +CartManifest.ART_ENCODINGS = { base64 = true } +CartManifest.PNG_SIGNATURE = "\137PNG\r\n\26\10" + +CartManifest.MAX_ID = 64 +CartManifest.MAX_TITLE = 48 +CartManifest.MAX_AUTHOR = 64 +CartManifest.MAX_SUMMARY = 120 +CartManifest.MAX_LABEL = 128 +CartManifest.MAX_LABEL_ART = 1024 * 1024 +CartManifest.MAX_MODS = 64 +CartManifest.MAX_OPTIONS = 64 +CartManifest.MAX_OPTION_KEY = 64 +CartManifest.MAX_OPTION_TEXT = 256 + +local function trim(text) + return text:match("^%s*(.-)%s*$") +end + +local function isId(value) + return type(value) == "string" and value ~= "" and #value <= CartManifest.MAX_ID + and value:match("^[%w_%-]+$") ~= nil +end + +local function isRepo(value) + if type(value) ~= "string" then return false end + local owner, name = value:match("^([%w%._%-]+)/([%w%._%-]+)$") + return owner ~= nil and name ~= nil +end + +local function isHex(value, width) + return type(value) == "string" and #value == width + and value:match("^[0-9a-f]+$") ~= nil +end + +local function isCount(value) + return type(value) == "number" and value > 0 and value % 1 == 0 +end + +local function isSemver(value) + return type(value) == "string" and Semver.parse(value) ~= nil +end + +local function parseOptions(raw, label) + if raw == nil then return nil end + if type(raw) ~= "table" then + return nil, label .. " options must be a table" + end + local keys = {} + for key in pairs(raw) do + if type(key) ~= "string" then + return nil, label .. " option keys must be strings" + end + if key == "" or #key > CartManifest.MAX_OPTION_KEY then + return nil, ("%s option keys must be 1 to %d characters") + :format(label, CartManifest.MAX_OPTION_KEY) + end + keys[#keys + 1] = key + end + if #keys > CartManifest.MAX_OPTIONS then + return nil, ("%s carries more than %d options") + :format(label, CartManifest.MAX_OPTIONS) + end + local out = {} + for _, key in ipairs(keys) do + local value = raw[key] + local kind = type(value) + if kind == "string" then + if #value > CartManifest.MAX_OPTION_TEXT then + return nil, ("%s option %q must be %d characters or fewer") + :format(label, key, CartManifest.MAX_OPTION_TEXT) + end + elseif kind ~= "number" and kind ~= "boolean" then + return nil, ("%s option %q must be a string, number or boolean") + :format(label, key) + end + out[key] = value + end + return out +end + +local function parseMod(raw, index, seen) + local label = ("cart mod #%d"):format(index) + if type(raw) ~= "table" then return nil, label .. " must be a table" end + if not isId(raw.id) then + return nil, ("%s id must be 1 to %d characters of letters, numbers, _ or -") + :format(label, CartManifest.MAX_ID) + end + label = ("cart mod %q"):format(raw.id) + if seen[raw.id] then return nil, label .. " is pinned twice" end + seen[raw.id] = true + + local source = raw.source + if type(source) ~= "string" or not CartManifest.SOURCES[source] then + return nil, label .. " source must be github, gamebanana or local" + end + + local entry = { id = raw.id, source = source } + if source == "github" then + if not isRepo(raw.repo) then + return nil, label .. " repo must be owner/name" + end + if not isSemver(raw.version) then + return nil, label .. " version must be a semantic version" + end + if not isHex(raw.sha256, 64) then + return nil, label .. " sha256 must be 64 lowercase hex characters" + end + entry.repo = raw.repo + entry.version = trim(raw.version) + entry.sha256 = raw.sha256 + elseif source == "local" then + if not isSemver(raw.version) then + return nil, label .. " version must be a semantic version" + end + entry.version = trim(raw.version) + else + if not isCount(raw.mod) then + return nil, label .. " mod must be a positive integer" + end + if not isCount(raw.file) then + return nil, label .. " file must be a positive integer" + end + if not isHex(raw.md5, 32) then + return nil, label .. " md5 must be 32 lowercase hex characters" + end + entry.mod = raw.mod + entry.file = raw.file + entry.md5 = raw.md5 + end + + local options, err = parseOptions(raw.options, label) + if err then return nil, err end + entry.options = options + return entry +end + +local function parseOrder(raw, mods) + local out = {} + if raw == nil then + for i, entry in ipairs(mods) do out[i] = entry.id end + return out + end + if type(raw) ~= "table" then return nil, "cart load_order must be an array" end + if #raw ~= #mods then + return nil, "cart load_order must list every pinned mod exactly once" + end + local pinned, seen = {}, {} + for _, entry in ipairs(mods) do pinned[entry.id] = true end + for i = 1, #raw do + local id = raw[i] + if type(id) ~= "string" or not pinned[id] then + return nil, ("cart load_order names %s, which the cart does not pin") + :format(tostring(id)) + end + if seen[id] then + return nil, ("cart load_order names %s twice"):format(id) + end + seen[id] = true + out[i] = id + end + return out +end + +function CartManifest.parse(tbl) + if type(tbl) ~= "table" then return nil, "cart must be a table" end + + if not isId(tbl.id) then + return nil, ("cart id must be 1 to %d characters of letters, numbers, _ or -") + :format(CartManifest.MAX_ID) + end + + if type(tbl.title) ~= "string" then return nil, "cart title is required" end + local title = trim(tbl.title) + if title == "" or #title > CartManifest.MAX_TITLE then + return nil, ("cart title must be 1 to %d characters"):format(CartManifest.MAX_TITLE) + end + + if not isSemver(tbl.version) then + return nil, "cart version must be a semantic version" + end + + if type(tbl.author) ~= "string" then return nil, "cart author is required" end + local author = trim(tbl.author) + if author == "" or #author > CartManifest.MAX_AUTHOR then + return nil, ("cart author must be 1 to %d characters"):format(CartManifest.MAX_AUTHOR) + end + + local repo = nil + if tbl.repo ~= nil then + if not isRepo(tbl.repo) then return nil, "cart repo must be owner/name" end + repo = tbl.repo + end + + local summary = nil + if tbl.summary ~= nil then + if type(tbl.summary) ~= "string" then + return nil, "cart summary must be a string" + end + summary = trim(tbl.summary) + if #summary > CartManifest.MAX_SUMMARY then + return nil, ("cart summary must be %d characters or fewer") + :format(CartManifest.MAX_SUMMARY) + end + end + + local shell = type(tbl.shell) == "string" and tbl.shell:match("^#(%x%x%x%x%x%x)$") + if not shell then return nil, "cart shell must be a #RRGGBB colour" end + shell = "#" .. shell:lower() + + local label = nil + if tbl.label ~= nil then + if type(tbl.label) ~= "string" or #tbl.label > CartManifest.MAX_LABEL then + return nil, ("cart label must be a path of %d characters or fewer") + :format(CartManifest.MAX_LABEL) + end + label = SafePath.safe(tbl.label) + if not label then return nil, "cart label must stay inside the cart" end + end + + if type(tbl.base) ~= "string" or not GameVersion.VERSIONS[tbl.base] then + return nil, "cart base must name a game this engine knows" + end + + local engine = nil + if tbl.engine ~= nil then + if type(tbl.engine) ~= "string" or trim(tbl.engine) == "" then + return nil, "cart engine must be a non-empty version range" + end + engine = trim(tbl.engine) + end + + local seal = tbl.seal + if seal == nil then seal = "sealed" end + if type(seal) ~= "string" or not CartManifest.SEALS[seal] then + return nil, "cart seal must be sealed or open" + end + + if type(tbl.mods) ~= "table" then return nil, "cart mods must be an array" end + local count = #tbl.mods + if count < 1 or count > CartManifest.MAX_MODS then + return nil, ("cart must pin 1 to %d mods"):format(CartManifest.MAX_MODS) + end + local mods, seen = {}, {} + for i = 1, count do + local entry, err = parseMod(tbl.mods[i], i, seen) + if not entry then return nil, err end + mods[i] = entry + end + + local order, orderErr = parseOrder(tbl.load_order, mods) + if not order then return nil, orderErr end + + return { + id = tbl.id, + title = title, + version = trim(tbl.version), + author = author, + repo = repo, + summary = summary, + shell = shell, + label = label, + base = tbl.base, + engine = engine, + seal = seal, + mods = mods, + load_order = order, + } +end + +function CartManifest.parseLabelArt(raw) + if raw == nil then return nil, "cart carries no label art" end + if type(raw) ~= "table" then return nil, "cart label art must be a table" end + + if type(raw.encoding) ~= "string" or not CartManifest.ART_ENCODINGS[raw.encoding] then + return nil, "cart label art encoding must be base64" + end + if type(raw.data) ~= "string" or raw.data == "" then + return nil, "cart label art data must be a base64 string" + end + + local tooBig = ("cart label art must be %d bytes or fewer") + :format(CartManifest.MAX_LABEL_ART) + if #raw.data > math.ceil(CartManifest.MAX_LABEL_ART / 3) * 4 then + return nil, tooBig + end + + local bytes, err = Base64.decode(raw.data) + if not bytes then return nil, "cart label art " .. err end + if #bytes > CartManifest.MAX_LABEL_ART then return nil, tooBig end + if not isCount(raw.bytes) or raw.bytes ~= #bytes then + return nil, ("cart label art declares %s bytes but decodes to %d") + :format(tostring(raw.bytes), #bytes) + end + if bytes:sub(1, #CartManifest.PNG_SIGNATURE) ~= CartManifest.PNG_SIGNATURE then + return nil, "cart label art must be a PNG" + end + + local name = nil + if raw.name ~= nil then + if type(raw.name) ~= "string" or #raw.name > CartManifest.MAX_LABEL then + return nil, ("cart label art name must be a path of %d characters or fewer") + :format(CartManifest.MAX_LABEL) + end + name = SafePath.safe(raw.name) + if not name then return nil, "cart label art name must stay inside the cart" end + end + + return { name = name, encoding = raw.encoding, bytes = raw.bytes, data = raw.data }, + nil, bytes +end + +function CartManifest.labelArtBytes(cart) + if type(cart) ~= "table" then return nil, "cart must be a table" end + local art, err, bytes = CartManifest.parseLabelArt(cart.labelArt) + if not art then return nil, err end + return bytes, art.name +end + +function CartManifest.publishable(cart) + if type(cart) ~= "table" or type(cart.mods) ~= "table" then + return false, "a cart must be parsed before it can be published" + end + local unpinned = {} + for _, entry in ipairs(cart.mods) do + if type(entry) == "table" and entry.source == "local" then + unpinned[#unpinned + 1] = tostring(entry.id) + end + end + if #unpinned == 0 then return true end + table.sort(unpinned) + return false, ("%s %s pinned to this install only, so nobody else can fetch %s: publish needs a repo and an archive hash for %s") + :format(table.concat(unpinned, ", "), + #unpinned == 1 and "is" or "are", + #unpinned == 1 and "it" or "them", + #unpinned == 1 and "it" or "each") +end + +local function number(value) + return ("%.17g"):format(value) +end + +local function writeText(out, prefix, text) + out[#out + 1] = ("%s%d:%s"):format(prefix, #text, text) +end + +local function writeValue(out, value) + local kind = type(value) + if kind == "number" then + out[#out + 1] = "#" .. number(value) + elseif kind == "boolean" then + out[#out + 1] = value and "T" or "F" + else + writeText(out, "$", tostring(value)) + end +end + +local function writeField(out, name, value) + if value == nil then return end + writeText(out, ".", name) + writeValue(out, value) +end + +local CART_FIELDS = { "author", "base", "engine", "id", "label", "repo", + "seal", "shell", "summary", "title", "version" } +local MOD_FIELDS = { "file", "id", "md5", "mod", "repo", "sha256", + "source", "version" } + +function CartManifest.canonical(cart) + local out = { "[cart]" } + for _, field in ipairs(CART_FIELDS) do writeField(out, field, cart[field]) end + out[#out + 1] = "[mods]" + for _, entry in ipairs(cart.mods or {}) do + writeText(out, "@", tostring(entry.id)) + for _, field in ipairs(MOD_FIELDS) do writeField(out, field, entry[field]) end + out[#out + 1] = "[options]" + local keys = {} + for key in pairs(entry.options or {}) do keys[#keys + 1] = key end + table.sort(keys) + for _, key in ipairs(keys) do writeField(out, key, entry.options[key]) end + end + out[#out + 1] = "[order]" + for _, id in ipairs(cart.load_order or {}) do writeText(out, "@", tostring(id)) end + return table.concat(out) +end + +function CartManifest.hash(cart) + return StreamMD5.new():update(CartManifest.canonical(cart)):final() +end + +function CartManifest.encode(cart) + return SaveSerializer.encode({ + format = CartManifest.FORMAT, + formatVersion = CartManifest.SCHEMA, + labelArt = CartManifest.parseLabelArt(cart.labelArt), + cart = { id = cart.id, title = cart.title, version = cart.version, + author = cart.author, repo = cart.repo, summary = cart.summary, + shell = cart.shell, label = cart.label, base = cart.base, + engine = cart.engine, seal = cart.seal, mods = cart.mods, + load_order = cart.load_order }, + }) +end + +function CartManifest.decode(str) + if type(str) ~= "string" or str == "" then return nil, "EMPTY FILE" end + local data = SaveSerializer.decode(str) + if type(data) ~= "table" then return nil, "BAD FILE" end + if data.format ~= CartManifest.FORMAT then return nil, "NOT A CART" end + if data.formatVersion ~= CartManifest.SCHEMA then + return nil, ("unknown cart schema %s"):format(tostring(data.formatVersion)) + end + local cart, err = CartManifest.parse(data.cart) + if not cart then return nil, err end + cart.labelArt = CartManifest.parseLabelArt(data.labelArt) + return cart +end + +return CartManifest diff --git a/src/carts/CartStore.lua b/src/carts/CartStore.lua new file mode 100644 index 00000000..2516a6fd --- /dev/null +++ b/src/carts/CartStore.lua @@ -0,0 +1,338 @@ +local CartManifest = require("src.carts.CartManifest") +local SaveData = require("src.core.SaveData") +local Semver = require("src.mods.Semver") + +local CartStore = {} + +CartStore.DIR = CartManifest.DIR +CartStore.EXT = CartManifest.EXT +CartStore.OPTIONS_KEY = "carts" +CartStore.UNPINNED_VERSION = "0.0.0" + +local RECORD_FIELDS = { "id", "title", "version", "author", "base", "seal", + "shell", "summary", "hash", "file" } + +local function fsOr(fs) + return fs or (love and love.filesystem) or nil +end + +local function safeId(id) + return type(id) == "string" and id ~= "" and #id <= CartManifest.MAX_ID + and id:match("^[%w_%-]+$") ~= nil +end + +local function fileFor(id) + return CartStore.DIR .. "/" .. id .. CartStore.EXT +end +CartStore.fileFor = fileFor + +local function readOptions(fs) + local ok, opts = pcall(SaveData.loadOptions, fs) + if not ok or type(opts) ~= "table" then return {} end + return opts +end + +local function writeOptions(opts, fs) + local ok = pcall(SaveData.saveOptions, opts, fs) + return ok and true or false +end + +local function registry(opts) + local reg = opts[CartStore.OPTIONS_KEY] + return type(reg) == "table" and reg or nil +end + +local function ensureRegistry(opts) + if type(opts[CartStore.OPTIONS_KEY]) ~= "table" then + opts[CartStore.OPTIONS_KEY] = {} + end + return opts[CartStore.OPTIONS_KEY] +end + +local function recordFor(cart, hash) + return { id = cart.id, title = cart.title, version = cart.version, + author = cart.author, base = cart.base, seal = cart.seal, + shell = cart.shell, summary = cart.summary, + hash = hash, file = fileFor(cart.id) } +end + +local function sameRecord(a, b) + if type(a) ~= "table" or type(b) ~= "table" then return false end + for _, field in ipairs(RECORD_FIELDS) do + if a[field] ~= b[field] then return false end + end + return true +end + +local function entryFor(cart, hash) + return { id = cart.id, title = cart.title, version = cart.version, + author = cart.author, base = cart.base, seal = cart.seal, + shell = cart.shell, summary = cart.summary, label = cart.label, + cart = cart, cartHash = hash, file = fileFor(cart.id) } +end + +local function readCart(fs, id) + if not safeId(id) then return nil, "unknown cart id" end + if not (fs and fs.read) then return nil, "NO FILESYSTEM" end + local path = fileFor(id) + if fs.getInfo and not fs.getInfo(path) then + return nil, ("cart %q is not installed"):format(id) + end + local body = fs.read(path) + if type(body) ~= "string" or body == "" then + return nil, ("cart %q is not installed"):format(id) + end + local ok, cart, err = pcall(CartManifest.decode, body) + if not ok then return nil, "BAD CART" end + if not cart then return nil, err or "BAD CART" end + if cart.id ~= id then + return nil, ("cart file %s names %q"):format(path, tostring(cart.id)) + end + local hashed, hash = pcall(CartManifest.hash, cart) + if not hashed then return nil, "BAD CART" end + return cart, hash +end + +local function strayIds(fs, seen) + local out = {} + if not (fs and fs.getDirectoryItems) then return out end + if fs.getInfo and not fs.getInfo(CartStore.DIR) then return out end + local ok, items = pcall(fs.getDirectoryItems, CartStore.DIR) + if not ok then return out end + for _, name in ipairs(items or {}) do + if type(name) == "string" and name:sub(-#CartStore.EXT) == CartStore.EXT then + local id = name:sub(1, #name - #CartStore.EXT) + if safeId(id) and not seen[id] then + seen[id] = true + out[#out + 1] = id + end + end + end + table.sort(out) + return out +end + +function CartStore.index(fs) + local opts = readOptions(fsOr(fs)) + local reg = registry(opts) or {} + local out = {} + for id, record in pairs(reg) do + if safeId(id) and type(record) == "table" then + local row = { id = id, file = fileFor(id) } + for _, field in ipairs(RECORD_FIELDS) do + if record[field] ~= nil then row[field] = record[field] end + end + row.id, row.title = id, record.title or id + out[#out + 1] = row + end + end + table.sort(out, function(a, b) + local at, bt = tostring(a.title):lower(), tostring(b.title):lower() + if at ~= bt then return at < bt end + return a.id < b.id + end) + return out +end + +function CartStore.list(fs) + fs = fsOr(fs) + local rows = {} + if not fs then return rows end + local opts = readOptions(fs) + local reg = registry(opts) or {} + local ids, seen = {}, {} + for id in pairs(reg) do + if safeId(id) and not seen[id] then + seen[id] = true + ids[#ids + 1] = id + end + end + table.sort(ids) + for _, id in ipairs(strayIds(fs, seen)) do ids[#ids + 1] = id end + for _, id in ipairs(ids) do + local cart, hash = readCart(fs, id) + if cart then rows[#rows + 1] = entryFor(cart, hash) end + end + table.sort(rows, function(a, b) + local at, bt = tostring(a.title):lower(), tostring(b.title):lower() + if at ~= bt then return at < bt end + return a.id < b.id + end) + local healed, changed = {}, false + for _, row in ipairs(rows) do + healed[row.id] = recordFor(row.cart, row.cartHash) + if not sameRecord(reg[row.id], healed[row.id]) then changed = true end + end + for id in pairs(reg) do + if healed[id] == nil then changed = true end + end + if changed then + opts[CartStore.OPTIONS_KEY] = healed + writeOptions(opts, fs) + end + return rows +end + +function CartStore.listFor(version, fs) + local out = {} + for _, row in ipairs(CartStore.list(fs)) do + if row.base == version then out[#out + 1] = row end + end + return out +end + +function CartStore.get(id, fs) + return readCart(fsOr(fs), id) +end + +function CartStore.labelArt(id, fs) + local cart, err = readCart(fsOr(fs), id) + if not cart then return nil, err end + return CartManifest.labelArtBytes(cart) +end + +function CartStore.export(id, fs) + local cart, err = readCart(fsOr(fs), id) + if not cart then return nil, err end + return CartManifest.encode(cart), CartManifest.hash(cart) +end + +function CartStore.install(bytes, fs) + fs = fsOr(fs) + if not (fs and fs.write) then return nil, "NO FILESYSTEM" end + local ok, cart, err = pcall(CartManifest.decode, bytes) + if not ok then return nil, "BAD CART" end + if not cart then return nil, err or "BAD CART" end + local existing = readCart(fs, cart.id) + if existing then + local order = Semver.compare(cart.version, existing.version) + if order and order < 0 then + return nil, ("%s %s is older than the installed %s") + :format(cart.title, cart.version, existing.version) + end + end + if fs.createDirectory then fs.createDirectory(CartStore.DIR) end + local wrote, writeErr = fs.write(fileFor(cart.id), CartManifest.encode(cart)) + if not wrote then return nil, tostring(writeErr) end + local hash = CartManifest.hash(cart) + local opts = readOptions(fs) + ensureRegistry(opts)[cart.id] = recordFor(cart, hash) + writeOptions(opts, fs) + return cart, hash +end + +function CartStore.uninstall(id, fs) + fs = fsOr(fs) + if not safeId(id) then return nil, "unknown cart id" end + if not fs then return nil, "NO FILESYSTEM" end + local path = fileFor(id) + local present = not fs.getInfo or fs.getInfo(path) ~= nil + if present and fs.read and fs.read(path) == nil then present = false end + local opts = readOptions(fs) + local reg = registry(opts) + local known = reg ~= nil and reg[id] ~= nil + if not present and not known then + return nil, ("cart %q is not installed"):format(id) + end + if present and fs.remove then fs.remove(path) end + if known then + reg[id] = nil + writeOptions(opts, fs) + end + return true +end + +local function manifestOf(row) + return type(row.manifest) == "table" and row.manifest or nil +end + +local function textOf(...) + for i = 1, select("#", ...) do + local value = select(i, ...) + if type(value) == "string" and value ~= "" then return value end + end + return nil +end + +local function pinRepo(row) + local m = manifestOf(row) + return textOf(row.github, m and m.github) +end + +local function pinHash(row) + local m = manifestOf(row) + local hash = textOf(row.sha256, row.archiveSha256, + m and m.sha256, m and m.archiveSha256) + if hash and #hash == 64 and hash:match("^[0-9a-f]+$") then return hash end + return nil +end + +local function frozenOptions(bucket) + if type(bucket) ~= "table" then return nil end + local out, any = {}, false + for key, value in pairs(bucket) do + local kind = type(value) + if type(key) == "string" and key ~= "" + and (kind == "string" or kind == "number" or kind == "boolean") then + out[key] = value + any = true + end + end + return any and out or nil +end + +local function pinReason(repo, version, semver, hash) + local why = {} + if not repo then why[#why + 1] = "no GitHub repo is recorded" end + if not semver then + why[#why + 1] = ("version %s is not a semantic version, so it pins as %s") + :format(version and ("%q"):format(version) or "is missing", + CartStore.UNPINNED_VERSION) + end + if repo and semver and not hash then + why[#why + 1] = "no archive hash is known yet" + end + return table.concat(why, " and ") +end + +function CartStore.capture(identity, available, modOptions) + if type(identity) ~= "table" then return nil, "cart identity is required" end + local mods, order, unresolved = {}, {}, {} + for _, row in ipairs(available or {}) do + if type(row) == "table" and row.enabled and safeId(row.id) then + local m = manifestOf(row) + local version = textOf(row.version, m and m.version) + local semver = version and Semver.parse(version) and version or nil + local repo = pinRepo(row) + local hash = pinHash(row) + local entry + if repo and semver and hash then + entry = { id = row.id, source = "github", repo = repo, + version = semver, sha256 = hash } + else + entry = { id = row.id, source = "local", + version = semver or CartStore.UNPINNED_VERSION } + unresolved[#unresolved + 1] = { + id = row.id, + name = textOf(row.name, m and m.name) or row.id, + version = version, + reason = pinReason(repo, version, semver, hash), + } + end + entry.options = frozenOptions(modOptions and modOptions[row.id]) + mods[#mods + 1] = entry + order[#order + 1] = row.id + end + end + local cart, err = CartManifest.parse({ + id = identity.id, title = identity.title, version = identity.version, + author = identity.author, repo = identity.repo, summary = identity.summary, + shell = identity.shell, label = identity.label, base = identity.base, + engine = identity.engine, seal = identity.seal, + mods = mods, load_order = order, + }) + if not cart then return nil, err end + return cart, unresolved +end + +return CartStore diff --git a/src/core/Base64.lua b/src/core/Base64.lua new file mode 100644 index 00000000..1af84ac3 --- /dev/null +++ b/src/core/Base64.lua @@ -0,0 +1,75 @@ +local Base64 = {} + +local ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +local PAD = 61 + +local ENC, DEC = {}, {} +for i = 0, 63 do + local c = ALPHABET:sub(i + 1, i + 1) + ENC[i] = c + DEC[c:byte()] = i +end + +local floor = math.floor +local char = string.char +local concat = table.concat + +function Base64.encode(bytes) + if type(bytes) ~= "string" then return nil, "base64 input must be a string" end + local out, n, i = {}, #bytes, 1 + while i + 2 <= n do + local a, b, c = bytes:byte(i, i + 2) + local word = a * 65536 + b * 256 + c + out[#out + 1] = ENC[floor(word / 262144)] .. ENC[floor(word / 4096) % 64] + .. ENC[floor(word / 64) % 64] .. ENC[word % 64] + i = i + 3 + end + local rest = n - i + 1 + if rest == 1 then + local a = bytes:byte(i) + out[#out + 1] = ENC[floor(a / 4)] .. ENC[(a % 4) * 16] .. "==" + elseif rest == 2 then + local a, b = bytes:byte(i, i + 1) + local word = a * 256 + b + out[#out + 1] = ENC[floor(word / 1024)] .. ENC[floor(word / 16) % 64] + .. ENC[(word % 16) * 4] .. "=" + end + return concat(out) +end + +function Base64.decode(text) + if type(text) ~= "string" then return nil, "base64 input must be a string" end + local n = #text + if n % 4 ~= 0 then return nil, "base64 length must be a multiple of four" end + if n == 0 then return "" end + local out = {} + local last = n - 3 + for i = 1, n, 4 do + local b1, b2, b3, b4 = text:byte(i, i + 3) + local v1, v2 = DEC[b1], DEC[b2] + if not v1 or not v2 then + return nil, "base64 holds a character outside the alphabet" + end + if i == last and b3 == PAD then + if b4 ~= PAD then return nil, "base64 padding is malformed" end + if v2 % 16 ~= 0 then return nil, "base64 padding carries data bits" end + out[#out + 1] = char(v1 * 4 + floor(v2 / 16)) + elseif i == last and b4 == PAD then + local v3 = DEC[b3] + if not v3 then return nil, "base64 holds a character outside the alphabet" end + if v3 % 4 ~= 0 then return nil, "base64 padding carries data bits" end + local word = v1 * 1024 + v2 * 16 + floor(v3 / 4) + out[#out + 1] = char(floor(word / 256), word % 256) + else + local v3, v4 = DEC[b3], DEC[b4] + if not v3 or not v4 then + return nil, "base64 holds a character outside the alphabet" + end + local word = v1 * 262144 + v2 * 4096 + v3 * 64 + v4 + out[#out + 1] = char(floor(word / 65536), floor(word / 256) % 256, word % 256) + end + end + return concat(out) +end + +return Base64 diff --git a/src/core/SaveData.lua b/src/core/SaveData.lua index 514bd433..8d3d2fd0 100644 --- a/src/core/SaveData.lua +++ b/src/core/SaveData.lua @@ -759,25 +759,41 @@ end -- use" and the flat legacy path (save.lua / save_blue.lua / save_yellow.lua) -- is used, which keeps a brand-new install and every pre-slots caller -- working unchanged. -local activeSlotCache = {} -- version -> slotId in use, or false when none -local slotsChecked = {} -- version -> true once resolved this process +local activeSlotCache = {} -- scope key -> slotId in use, or false when none +local slotsChecked = {} -- scope key -> true once resolved this process -- At most one New Game can be the live candidate for a first public tool -- request. A single strong reference models that runtime fact without adding -- marker data to the save or retaining abandoned playthrough tables. local freshPlaythrough -local function slotDir(version) return "saves/" .. version end +local CART_PREFIX = "cart_" -local function slotNames(version, id) - local main = slotDir(version) .. "/" .. id .. ".lua" +local activeCart, activeCartHash +local sealBroken = false + +local function cartKey(cartId) + if type(cartId) ~= "string" or #cartId > 64 then return nil end + if not cartId:match("^%w[%w%._%-]*$") then return nil end + return CART_PREFIX .. cartId +end + +local function isCartKey(key) + return key:sub(1, #CART_PREFIX) == CART_PREFIX +end + +local function slotDir(key) return "saves/" .. key end + +local function slotNames(key, id) + local main = slotDir(key) .. "/" .. id .. ".lua" return main, main .. ".bak", main .. ".tmp" end --- the pre-slots flat names a version always used (save.lua for Red, --- save_blue.lua / save_yellow.lua for the others); still the destination --- before any slot exists -local function legacyNames(version) - local main = "save" .. GameVersion.saveSuffix(version) .. ".lua" +-- the pre-slots flat names a scope uses before any slot exists (save.lua for +-- Red, save_blue.lua / save_yellow.lua for the other versions, and +-- save_cart_.lua for a cart) +local function legacyNames(key) + local suffix = isCartKey(key) and ("_" .. key) or GameVersion.saveSuffix(key) + local main = "save" .. suffix .. ".lua" return main, main .. ".bak", main .. ".tmp" end @@ -790,6 +806,37 @@ local function knownVersion(version) return GameVersion.info(version) ~= nil end +local function knownScope(key) + if type(key) ~= "string" or key == "" then return false end + if isCartKey(key) then return true end + return knownVersion(key) +end + +local function activeScopeKey(version) + if activeCart then return CART_PREFIX .. activeCart end + return version or GameVersion.get() +end + +local function registryOf(opts, key) + local root, id = opts.saveSlots, key + if isCartKey(key) then + root, id = opts.cartSlots, key:sub(#CART_PREFIX + 1) + end + if type(root) ~= "table" then return nil end + local reg = root[id] + return type(reg) == "table" and reg or nil +end + +local function putRegistry(opts, key, reg) + if isCartKey(key) then + opts.cartSlots = type(opts.cartSlots) == "table" and opts.cartSlots or {} + opts.cartSlots[key:sub(#CART_PREFIX + 1)] = reg + else + opts.saveSlots = type(opts.saveSlots) == "table" and opts.saveSlots or {} + opts.saveSlots[key] = reg + end +end + -- Create the parent directory of a slot path when the fs supports it. -- love.filesystem.createDirectory makes the whole tree; the injected memfs -- stub keys files by full path and exposes no such method, so this is a @@ -802,8 +849,8 @@ end -- Decode a slot's save using the same recovery order load() uses -- main, -- then the .tmp write-witness, then the .bak -- so a slot mid-crash still -- summarizes. nil when nothing readable is present. -local function decodeSlot(fs, version, id) - local main, bak, tmp = slotNames(version, id) +local function decodeSlot(fs, key, id) + local main, bak, tmp = slotNames(key, id) local data = fs.getInfo(main) and SaveSerializer.decode(fs.read(main) or "") if data then return data end data = fs.getInfo(tmp) and SaveSerializer.decode(fs.read(tmp) or "") @@ -818,30 +865,29 @@ end -- active slot. Returns the new slot id, or nil when there is nothing to -- migrate or the copy could not be verified (originals left in place so no -- data is ever lost to a failed move). -local function tryMigrateLegacy(version, fs) - local lmain, lbak, ltmp = legacyNames(version) +local function tryMigrateLegacy(key, fs) + local lmain, lbak, ltmp = legacyNames(key) local mainBody = fs.getInfo(lmain) and fs.read(lmain) local bakBody = fs.getInfo(lbak) and fs.read(lbak) if not (mainBody or bakBody) then return nil end local id = "slot1" - local dmain, dbak = slotNames(version, id) + local dmain, dbak = slotNames(key, id) ensureParentDir(fs, dmain) if mainBody then fs.write(dmain, mainBody) end if bakBody then fs.write(dbak, bakBody) end -- refuse to delete the originals unless the new slot is loadable (from -- the main copy or, failing that, the backup) - if not decodeSlot(fs, version, id) then return nil end + if not decodeSlot(fs, key, id) then return nil end remove(fs, lmain) remove(fs, lbak) remove(fs, ltmp) local opts = SaveData.loadOptions(fs) - opts.saveSlots = opts.saveSlots or {} - opts.saveSlots[version] = { list = { id }, active = id } + putRegistry(opts, key, { list = { id }, active = id }) -- A tool may have allocated the legacy scope before the player made their -- first ordinary SAVE. Promoting that flat save into slot1 must preserve the -- same opaque identity; otherwise title-selected mod storage becomes -- unreachable after the migration even though every durable record exists. - local ids = opts.playthroughIds and opts.playthroughIds[version] + local ids = opts.playthroughIds and opts.playthroughIds[key] if type(ids) == "table" and type(ids.legacy) == "string" and ids.legacy ~= "" then if type(ids[id]) ~= "string" or ids[id] == "" then ids[id] = ids.legacy end ids.legacy = nil @@ -852,9 +898,9 @@ end -- Scan the filesystem for orphaned slot files under saves// when options.lua -- has no registered slots for this version (e.g. options.lua was reset or lost). -local function scanDiskSlots(version, fs) +local function scanDiskSlots(key, fs) if not fs then return nil end - local dir = "saves/" .. version + local dir = slotDir(key) local slots = {} if fs.getDirectoryItems and fs.getInfo and fs.getInfo(dir) then local items = pcall(fs.getDirectoryItems, dir) and fs.getDirectoryItems(dir) or {} @@ -882,49 +928,49 @@ local function scanDiskSlots(version, fs) return #slots > 0 and slots or nil end --- Resolve (once per version per process) which slot in-game saves use: an +-- Resolve (once per scope per process) which slot in-game saves use: an -- existing registry wins; otherwise a lazy legacy migration may create -- slot1; otherwise auto-recover disk slots; otherwise false (flat legacy path). -local function ensureVersionSlots(version, fs) - if slotsChecked[version] then return end - slotsChecked[version] = true - if not knownVersion(version) then - activeSlotCache[version] = false +local function ensureSlots(key, fs) + if slotsChecked[key] then return end + slotsChecked[key] = true + if not knownScope(key) then + activeSlotCache[key] = false return end local opts = SaveData.loadOptions(fs) - local reg = opts.saveSlots and opts.saveSlots[version] + local reg = registryOf(opts, key) if reg and type(reg.list) == "table" and #reg.list > 0 then - activeSlotCache[version] = reg.active or reg.list[1] + activeSlotCache[key] = reg.active or reg.list[1] return end - local migrated = tryMigrateLegacy(version, fs) + local migrated = tryMigrateLegacy(key, fs) if migrated then - activeSlotCache[version] = migrated + activeSlotCache[key] = migrated return end -- Auto-recovery: if options.lua lost its slot registry, scan disk for orphaned slot files - local recovered = scanDiskSlots(version, fs) + local recovered = scanDiskSlots(key, fs) if recovered and #recovered > 0 then - opts.saveSlots = opts.saveSlots or {} - opts.saveSlots[version] = { list = recovered, active = recovered[1] } + putRegistry(opts, key, { list = recovered, active = recovered[1] }) SaveData.saveOptions(opts, fs) - activeSlotCache[version] = recovered[1] - Logger.info("auto-recovered %d save slot(s) for %s from disk", #recovered, version) + activeSlotCache[key] = recovered[1] + Logger.info("auto-recovered %d save slot(s) for %s from disk", #recovered, key) return end - activeSlotCache[version] = false + activeSlotCache[key] = false end -- (body for the forward-declared saveNames.) Resolves the ACTIVE slot for --- the version, falling back to the flat legacy names when no slot is in use. +-- the scope -- the active cart when one is set, otherwise the version -- +-- falling back to the flat legacy names when no slot is in use. function saveNames(version, injectedFs) - version = version or GameVersion.get() + local key = activeScopeKey(version) local fs = persistFs(injectedFs) - ensureVersionSlots(version, fs) - local slot = activeSlotCache[version] - if slot then return slotNames(version, slot) end - return legacyNames(version) + ensureSlots(key, fs) + local slot = activeSlotCache[key] + if slot then return slotNames(key, slot) end + return legacyNames(key) end -- Pure extraction of the launcher's per-slot summary from a decoded save, @@ -1005,26 +1051,33 @@ function SaveData.slotDiskPath(version, slotId) return base .. sep .. rel:gsub("/", sep) end --- Slots visible to the launcher: every registered slot for a version, each +-- Slots visible to the launcher: every registered slot for a scope, each -- with whether it holds a save and the cheap summary above. A fresh -- install with nothing registered returns an empty array; a legacy install -- is migrated to slot1 first. +local function listSlotsIn(key) + local fs = persistFs(nil) + ensureSlots(key, fs) + local opts = SaveData.loadOptions(fs) + local reg = registryOf(opts, key) + local list = (reg and type(reg.list) == "table" and reg.list) or {} + local out = {} + for _, id in ipairs(list) do + local save = decodeSlot(fs, key, id) + local name, meta = SaveData.slotSummary(save) + out[#out + 1] = { id = id, exists = save ~= nil, name = name, meta = meta, + label = reg.names and reg.names[id] or nil, + cartHash = reg.hashes and reg.hashes[id] or nil, + sealBroken = (reg.broken and reg.broken[id] == true) + or false } + end + return out +end + function SaveData.listSlots(version) version = version or GameVersion.get() if not knownVersion(version) then return {} end - local fs = persistFs(nil) - ensureVersionSlots(version, fs) - local opts = SaveData.loadOptions(fs) - local reg = opts.saveSlots and opts.saveSlots[version] - local list = (reg and reg.list) or {} - local out = {} - for _, id in ipairs(list) do - local save = decodeSlot(fs, version, id) - local name, meta = SaveData.slotSummary(save) - out[#out + 1] = { id = id, exists = save ~= nil, name = name, meta = meta, - label = reg.names and reg.names[id] or nil } - end - return out + return listSlotsIn(version) end function SaveData.readSlotSource(version, slotId, injectedFs) @@ -1049,17 +1102,14 @@ end -- needs no save rewrite and an empty slot can be labeled too. The label is -- trimmed; an empty (or whitespace-only) one clears it. Returns true, or -- false + an error string when the id is not registered. -function SaveData.renameSlot(version, slotId, name) - version = version or GameVersion.get() - if not knownVersion(version) then return false, "unknown version" end +local function renameSlotIn(key, slotId, name) if type(slotId) ~= "string" or slotId == "" then return false, "missing slot id" end local fs = persistFs(nil) local opts = SaveData.loadOptions(fs) - opts.saveSlots = opts.saveSlots or {} - local reg = opts.saveSlots[version] - if not reg or not reg.list then return false, "slot not registered" end + local reg = registryOf(opts, key) + if not reg or type(reg.list) ~= "table" then return false, "slot not registered" end local found = false for _, id in ipairs(reg.list) do if id == slotId then found = true break end @@ -1070,47 +1120,55 @@ function SaveData.renameSlot(version, slotId, name) reg.names = reg.names or {} reg.names[slotId] = label if next(reg.names) == nil then reg.names = nil end - opts.saveSlots[version] = reg + putRegistry(opts, key, reg) SaveData.saveOptions(opts, fs) return true end +function SaveData.renameSlot(version, slotId, name) + version = version or GameVersion.get() + if not knownVersion(version) then return false, "unknown version" end + return renameSlotIn(version, slotId, name) +end + -- Point the active slot at slotId (registering it if new) and persist the -- choice to options.lua; also update the process-global cache so the very -- next save/load lands in the chosen slot. -function SaveData.setActiveSlot(version, slotId) - version = version or GameVersion.get() - if not knownVersion(version) then return nil end +local function setActiveSlotIn(key, slotId) local fs = persistFs(nil) local opts = SaveData.loadOptions(fs) - opts.saveSlots = opts.saveSlots or {} - local reg = opts.saveSlots[version] or { list = {}, active = nil } + local reg = registryOf(opts, key) or { list = {}, active = nil } + reg.list = type(reg.list) == "table" and reg.list or {} local found = false for _, id in ipairs(reg.list) do if id == slotId then found = true break end end if not found then reg.list[#reg.list + 1] = slotId end reg.active = slotId - opts.saveSlots[version] = reg + putRegistry(opts, key, reg) SaveData.saveOptions(opts, fs) - slotsChecked[version] = true - activeSlotCache[version] = slotId + slotsChecked[key] = true + activeSlotCache[key] = slotId return slotId end --- Register a new empty slot for the version and return its id. Does NOT +function SaveData.setActiveSlot(version, slotId) + version = version or GameVersion.get() + if not knownVersion(version) then return nil end + return setActiveSlotIn(version, slotId) +end + +-- Register a new empty slot for the scope and return its id. Does NOT -- write a save file and does NOT change the active slot: an empty slot -- means the title screen offers NEW GAME only. Ids are "slot%d+", -- allocated one past the highest existing number so a reused id can never -- collide with a lingering file. -function SaveData.createSlot(version) - version = version or GameVersion.get() - if not knownVersion(version) then return nil end +local function createSlotIn(key) local fs = persistFs(nil) - ensureVersionSlots(version, fs) + ensureSlots(key, fs) local opts = SaveData.loadOptions(fs) - opts.saveSlots = opts.saveSlots or {} - local reg = opts.saveSlots[version] or { list = {}, active = nil } + local reg = registryOf(opts, key) or { list = {}, active = nil } + reg.list = type(reg.list) == "table" and reg.list or {} local maxN = 0 for _, id in ipairs(reg.list) do local n = tonumber(tostring(id):match("^slot(%d+)$")) @@ -1118,21 +1176,31 @@ function SaveData.createSlot(version) end local id = "slot" .. (maxN + 1) reg.list[#reg.list + 1] = id - opts.saveSlots[version] = reg + putRegistry(opts, key, reg) SaveData.saveOptions(opts, fs) return id end --- The active slot id in use for a version (resolved once per process like +function SaveData.createSlot(version) + version = version or GameVersion.get() + if not knownVersion(version) then return nil end + return createSlotIn(version) +end + +-- The active slot id in use for a scope (resolved once per process like -- saveNames does), or nil when none is registered and the flat legacy path is -- in use. Public so the launcher's save Import/Export glue can name an export -- after the slot it came from without reaching into the private cache. +local function activeSlotIn(key) + local fs = persistFs(nil) + ensureSlots(key, fs) + return activeSlotCache[key] or nil +end + function SaveData.activeSlot(version) version = version or GameVersion.get() if not knownVersion(version) then return nil end - local fs = persistFs(nil) - ensureVersionSlots(version, fs) - return activeSlotCache[version] or nil + return activeSlotIn(version) end -- Write saveTable into an existing slot's file (SaveSerializer.encode), through @@ -1142,12 +1210,10 @@ end -- already registered the slot via createSlot but written no bytes yet; unlike -- SaveData.save this targets a specific slot and never rebuilds meta or touches -- options. Returns true, or false + an error string on a failed write. -function SaveData.writeSlot(version, slotId, saveTable) - version = version or GameVersion.get() - if not knownVersion(version) then return false, "unknown version" end +local function writeSlotIn(key, slotId, saveTable) if type(slotId) ~= "string" then return false, "missing slot id" end if type(saveTable) ~= "table" then return false, "missing save table" end - local main, bak, tmp = slotNames(version, slotId) + local main, bak, tmp = slotNames(key, slotId) local encoded = SaveSerializer.encode(saveTable) local fs = persistFs(nil) ensureParentDir(fs, main) @@ -1164,52 +1230,253 @@ function SaveData.writeSlot(version, slotId, saveTable) return true end +function SaveData.writeSlot(version, slotId, saveTable) + version = version or GameVersion.get() + if not knownVersion(version) then return false, "unknown version" end + return writeSlotIn(version, slotId, saveTable) +end + -- Delete a registered slot: remove its main/.bak/.tmp files, drop it from the -- options registry, and if it was active point active at another remaining -- slot (or clear active when the list is empty). Returns true, or false + -- an error string when the id is unknown / not registered. -function SaveData.deleteSlot(version, slotId) - version = version or GameVersion.get() - if not knownVersion(version) then return false, "unknown version" end +local function deleteSlotIn(key, slotId) if type(slotId) ~= "string" or slotId == "" then return false, "missing slot id" end local fs = persistFs(nil) - ensureVersionSlots(version, fs) + ensureSlots(key, fs) local opts = SaveData.loadOptions(fs) - opts.saveSlots = opts.saveSlots or {} - local reg = opts.saveSlots[version] - if not reg or not reg.list then return false, "slot not registered" end + local reg = registryOf(opts, key) + if not reg or type(reg.list) ~= "table" then return false, "slot not registered" end local found, idx = false, nil for i, id in ipairs(reg.list) do if id == slotId then found = true; idx = i; break end end if not found then return false, "slot not registered" end - local main, bak, tmp = slotNames(version, slotId) + local main, bak, tmp = slotNames(key, slotId) remove(fs, main) remove(fs, bak) remove(fs, tmp) table.remove(reg.list, idx) if reg.names then reg.names[slotId] = nil end + if reg.hashes then + reg.hashes[slotId] = nil + if next(reg.hashes) == nil then reg.hashes = nil end + end + if reg.broken then + reg.broken[slotId] = nil + if next(reg.broken) == nil then reg.broken = nil end + end if reg.active == slotId then reg.active = reg.list[1] -- may be nil when the list is now empty end - opts.saveSlots[version] = reg + putRegistry(opts, key, reg) SaveData.saveOptions(opts, fs) - slotsChecked[version] = true - activeSlotCache[version] = reg.active or false + slotsChecked[key] = true + activeSlotCache[key] = reg.active or false return true end --- Test seam: drop the process-global slot cache so a suite can exercise --- migration/resolution against a freshly injected filesystem. Unused by --- the game, which resolves each version exactly once per boot. +function SaveData.deleteSlot(version, slotId) + version = version or GameVersion.get() + if not knownVersion(version) then return false, "unknown version" end + return deleteSlotIn(version, slotId) +end + +-- Test seam: drop the process-global slot cache (and the active cart) so a +-- suite can exercise migration/resolution against a freshly injected +-- filesystem. Unused by the game, which resolves each scope exactly once per +-- boot. function SaveData.resetSlotState() for k in pairs(activeSlotCache) do activeSlotCache[k] = nil end for k in pairs(slotsChecked) do slotsChecked[k] = nil end freshPlaythrough = nil + activeCart, activeCartHash = nil, nil + sealBroken = false +end + +-- ------- custom carts + +function SaveData.setCart(cartId, cartHash) + if cartId ~= nil and cartKey(cartId) then + activeCart = cartId + activeCartHash = (type(cartHash) == "string" and cartHash ~= "") and cartHash or nil + else + activeCart, activeCartHash = nil, nil + end + return activeCart +end + +function SaveData.getCart() + return activeCart +end + +function SaveData.setCartHash(cartHash) + activeCartHash = (type(cartHash) == "string" and cartHash ~= "") and cartHash or nil + return activeCartHash +end + +function SaveData.getCartHash() + return activeCartHash +end + +function SaveData.breakSeal(save) + sealBroken = true + if type(save) == "table" then + save.meta = type(save.meta) == "table" and save.meta or {} + save.meta.sealBroken = true + end + return true +end + +function SaveData.isSealBroken(save) + if type(save) == "table" then + return type(save.meta) == "table" and save.meta.sealBroken == true + end + return sealBroken +end + +function SaveData.listCartSlots(cartId) + local key = cartKey(cartId or activeCart) + if not key then return {} end + return listSlotsIn(key) +end + +function SaveData.createCartSlot(cartId) + local key = cartKey(cartId or activeCart) + if not key then return nil end + return createSlotIn(key) +end + +function SaveData.setActiveCartSlot(cartId, slotId) + local key = cartKey(cartId or activeCart) + if not key then return nil end + if type(slotId) ~= "string" or slotId == "" then return nil end + return setActiveSlotIn(key, slotId) +end + +function SaveData.activeCartSlot(cartId) + local key = cartKey(cartId or activeCart) + if not key then return nil end + return activeSlotIn(key) +end + +function SaveData.renameCartSlot(cartId, slotId, name) + local key = cartKey(cartId or activeCart) + if not key then return false, "unknown cart" end + return renameSlotIn(key, slotId, name) +end + +function SaveData.deleteCartSlot(cartId, slotId) + local key = cartKey(cartId or activeCart) + if not key then return false, "unknown cart" end + return deleteSlotIn(key, slotId) +end + +function SaveData.writeCartSlot(cartId, slotId, saveTable) + local key = cartKey(cartId or activeCart) + if not key then return false, "unknown cart" end + local ok, err = writeSlotIn(key, slotId, saveTable) + if not ok then return ok, err end + local hash = type(saveTable.meta) == "table" and saveTable.meta.cartHash or nil + if type(hash) == "string" and hash ~= "" then + SaveData.setSlotCartHash(cartId or activeCart, slotId, hash) + end + return true +end + +function SaveData.slotCartHash(cartId, slotId) + local key = cartKey(cartId or activeCart) + if not key or type(slotId) ~= "string" then return nil end + local reg = registryOf(SaveData.loadOptions(persistFs(nil)), key) + local hash = reg and type(reg.hashes) == "table" and reg.hashes[slotId] or nil + if type(hash) ~= "string" or hash == "" then return nil end + return hash +end + +function SaveData.setSlotCartHash(cartId, slotId, cartHash) + local key = cartKey(cartId or activeCart) + if not key then return false, "unknown cart" end + if type(slotId) ~= "string" or slotId == "" then + return false, "missing slot id" + end + local fs = persistFs(nil) + local opts = SaveData.loadOptions(fs) + local reg = registryOf(opts, key) + if not reg or type(reg.list) ~= "table" then return false, "slot not registered" end + local found = false + for _, id in ipairs(reg.list) do + if id == slotId then found = true break end + end + if not found then return false, "slot not registered" end + local hash = (type(cartHash) == "string" and cartHash ~= "") and cartHash or nil + reg.hashes = type(reg.hashes) == "table" and reg.hashes or {} + if reg.hashes[slotId] == hash then return true end + reg.hashes[slotId] = hash + if next(reg.hashes) == nil then reg.hashes = nil end + putRegistry(opts, key, reg) + SaveData.saveOptions(opts, fs) + return true +end + +function SaveData.slotSealBroken(cartId, slotId) + local key = cartKey(cartId or activeCart) + if not key or type(slotId) ~= "string" then return false end + local reg = registryOf(SaveData.loadOptions(persistFs(nil)), key) + local broken = reg and type(reg.broken) == "table" and reg.broken[slotId] + return broken == true +end + +function SaveData.markSlotSealBroken(cartId, slotId) + local key = cartKey(cartId or activeCart) + if not key then return false, "unknown cart" end + if type(slotId) ~= "string" or slotId == "" then + return false, "missing slot id" + end + local fs = persistFs(nil) + local opts = SaveData.loadOptions(fs) + local reg = registryOf(opts, key) + if not reg or type(reg.list) ~= "table" then return false, "slot not registered" end + local found = false + for _, id in ipairs(reg.list) do + if id == slotId then found = true break end + end + if not found then return false, "slot not registered" end + reg.broken = type(reg.broken) == "table" and reg.broken or {} + if reg.broken[slotId] == true then return true end + reg.broken[slotId] = true + putRegistry(opts, key, reg) + SaveData.saveOptions(opts, fs) + return true +end + +function SaveData.adoptCartSeal(cartId) + local id = cartId or activeCart + if not cartKey(id) then return false end + local slot = SaveData.activeCartSlot(id) + if type(slot) ~= "string" or not SaveData.slotSealBroken(id, slot) then + return false + end + SaveData.breakSeal() + return true +end + +local function stampActiveCartHash(fs) + if not (activeCart and activeCartHash) then return end + local key = CART_PREFIX .. activeCart + local slot = activeSlotCache[key] + if type(slot) ~= "string" then return end + local opts = SaveData.loadOptions(fs) + local reg = registryOf(opts, key) + if not reg or type(reg.list) ~= "table" then return end + reg.hashes = type(reg.hashes) == "table" and reg.hashes or {} + if reg.hashes[slot] == activeCartHash then return end + reg.hashes[slot] = activeCartHash + putRegistry(opts, key, reg) + SaveData.saveOptions(opts, fs) end -- ------- opaque playthrough identity @@ -1235,10 +1502,10 @@ function SaveData.newPlaythroughId() end local function playthroughScope(version, injectedFs) - version = version or GameVersion.get() + local key = activeScopeKey(version) local fs = persistFs(injectedFs) - ensureVersionSlots(version, fs) - return activeSlotCache[version] or "legacy" + ensureSlots(key, fs) + return activeSlotCache[key] or "legacy", key end local function rememberPlaythroughId(save, opts, injectedFs) @@ -1246,7 +1513,7 @@ local function rememberPlaythroughId(save, opts, injectedFs) local id = type(meta) == "table" and meta.playthroughId if type(id) ~= "string" or id == "" then return opts, false end local version = save.version or GameVersion.get() - local scope = playthroughScope(version, injectedFs) + local scope, key = playthroughScope(version, injectedFs) local persisted = SaveData.loadOptions(injectedFs) if opts then -- Slot selection and opaque playthrough routing are engine-owned launcher @@ -1254,14 +1521,15 @@ local function rememberPlaythroughId(save, opts, injectedFs) -- save was promoted to slot1; writing that stale snapshot must not erase -- the freshly persisted routing and strand tool storage on next boot. opts.saveSlots = deepCopy(persisted.saveSlots) + opts.cartSlots = deepCopy(persisted.cartSlots) opts.playthroughIds = deepCopy(persisted.playthroughIds) else opts = persisted end opts.playthroughIds = opts.playthroughIds or {} - opts.playthroughIds[version] = opts.playthroughIds[version] or {} - local changed = opts.playthroughIds[version][scope] ~= id - opts.playthroughIds[version][scope] = id + opts.playthroughIds[key] = opts.playthroughIds[key] or {} + local changed = opts.playthroughIds[key][scope] ~= id + opts.playthroughIds[key][scope] = id return opts, changed end @@ -1275,11 +1543,11 @@ function SaveData.ensurePlaythroughId(save, injectedFs) if type(id) == "string" and id ~= "" then return id end local version = save.version or GameVersion.get() - local scope = playthroughScope(version, injectedFs) + local scope, key = playthroughScope(version, injectedFs) local opts = SaveData.loadOptions(injectedFs) local isFresh = save == freshPlaythrough if isFresh then freshPlaythrough = nil end - local byVersion = opts.playthroughIds and opts.playthroughIds[version] + local byVersion = opts.playthroughIds and opts.playthroughIds[key] local existing = byVersion and byVersion[scope] id = not isFresh and existing or nil if type(id) ~= "string" or id == "" then @@ -1296,8 +1564,8 @@ function SaveData.ensurePlaythroughId(save, injectedFs) -- storage and repeating on every launch. if not (isFresh and type(existing) == "string" and existing ~= "") then opts.playthroughIds = opts.playthroughIds or {} - opts.playthroughIds[version] = opts.playthroughIds[version] or {} - opts.playthroughIds[version][scope] = id + opts.playthroughIds[key] = opts.playthroughIds[key] or {} + opts.playthroughIds[key][scope] = id SaveData.saveOptions(opts, injectedFs) end end @@ -1325,9 +1593,9 @@ function SaveData.selectedPlaythroughId(save, injectedFs) -- Resolve the selected scope first. That may perform the one-time legacy -- save-to-slot migration, which also moves the opaque identity mapping; only -- then read options so this lookup never observes the pre-migration table. - local scope = playthroughScope(version, injectedFs) + local scope, key = playthroughScope(version, injectedFs) local opts = SaveData.loadOptions(injectedFs) - local byVersion = opts.playthroughIds and opts.playthroughIds[version] + local byVersion = opts.playthroughIds and opts.playthroughIds[key] id = byVersion and byVersion[scope] or nil if type(id) ~= "string" or id == "" then return nil, "no_selected_playthrough", @@ -1394,6 +1662,8 @@ function SaveData.buildMeta(mods, previous, sessionStart) savedAt = savedAt, sessionStart = started, playthroughId = type(previous) == "table" and previous.playthroughId or nil, + cartHash = type(previous) == "table" and previous.cartHash or nil, + sealBroken = (type(previous) == "table" and previous.sealBroken == true) or nil, mods = list, } end @@ -1619,6 +1889,12 @@ function SaveData.save(data, mods) if mods ~= nil or data.meta == nil then data.meta = SaveData.buildMeta(mods, data.meta) end + if activeCart and activeCartHash and type(data.meta) == "table" then + data.meta.cartHash = activeCartHash + end + if sealBroken and type(data.meta) == "table" then + data.meta.sealBroken = true + end local gameOnly = {} for k, v in pairs(data) do if k ~= "options" then gameOnly[k] = v end @@ -1646,6 +1922,7 @@ function SaveData.save(data, mods) return false end remove(fs, TMP_FILENAME) + stampActiveCartHash(fs) Logger.info("saved game") return true end diff --git a/src/import/LauncherView.lua b/src/import/LauncherView.lua index f88c6b11..fae3cfe4 100644 --- a/src/import/LauncherView.lua +++ b/src/import/LauncherView.lua @@ -411,32 +411,69 @@ local function cartColor(version) return CART_COLOR[version] or PAL.green end +local function shellColor(hex) + local r, g, b = tostring(hex):match("^#(%x%x)(%x%x)(%x%x)$") + if not r then return nil end + return { tonumber(r, 16), tonumber(g, 16), tonumber(b, 16) } +end + +local function cartSkin(imp, version) + local row = imp.activeCartRow and imp:activeCartRow(version) or nil + if not row then + return { cacheKey = version, color = cartColor(version), + labelPath = "assets/labels/" .. tostring(version) .. ".png" } + end + return { cacheKey = "cart:" .. tostring(row.id), + color = shellColor(row.shell) or cartColor(version), + name = row.title, cart = row, cartId = row.id } +end + local CART_DRAG_SLOP = 8 local TAU = math.pi * 2 -local function cartridgeState(imp, version) +local function cartridgeState(imp, key) imp._cartridge = imp._cartridge or {} - local state = imp._cartridge[version] + local state = imp._cartridge[key] if not state then state = { spin = 0, lastTime = Kit.time } - imp._cartridge[version] = state + imp._cartridge[key] = state end return state end -local function cartridgeLabel(imp, version) +local function cartLabelImage(cartId) + local CartStore = require("src.carts.CartStore") + local got, bytes = pcall(CartStore.labelArt, cartId) + if not got or type(bytes) ~= "string" or bytes == "" then return nil end + if not (love.filesystem and love.filesystem.newFileData) then return nil end + local made, image = pcall(function() + return love.graphics.newImage( + love.filesystem.newFileData(bytes, tostring(cartId) .. ".png")) + end) + if not made then return nil end + return image +end + +local function cartridgeLabel(imp, key, path, cartId) imp._cartridgeLabels = imp._cartridgeLabels or {} - local label = imp._cartridgeLabels[version] + local label = imp._cartridgeLabels[key] if label ~= nil then return label or nil end - local ok, image = pcall(love.graphics.newImage, - "assets/labels/" .. tostring(version) .. ".png") - if not ok then - imp._cartridgeLabels[version] = false + local image + if cartId then + image = cartLabelImage(cartId) + elseif path then + local ok, art = pcall(love.graphics.newImage, path) + if ok then image = art end + end + local sized, iw, ih = false, nil, nil + if image then sized, iw, ih = pcall(image.getDimensions, image) end + if not (sized and type(iw) == "number" and type(ih) == "number" + and iw > 0 and ih > 0) then + imp._cartridgeLabels[key] = false return nil end - local iw, ih = image:getDimensions() label = { image = image, width = iw, height = ih } - imp._cartridgeLabels[version] = label + imp._cartridgeLabels[key] = label return label end @@ -492,10 +529,10 @@ local function cartPill(project, x, y, w, h, z, color, alpha) cartPolygon(points, color, alpha) end -local function cartLabelMesh(imp, version, label, points) +local function cartLabelMesh(imp, key, label, points) if not love.graphics.newMesh then return nil end imp._cartridgeLabelMeshes = imp._cartridgeLabelMeshes or {} - local mesh = imp._cartridgeLabelMeshes[version] + local mesh = imp._cartridgeLabelMeshes[key] if not mesh then mesh = love.graphics.newMesh({ { 0, 0, 0, 0, 255, 255, 255, 255 }, @@ -504,7 +541,7 @@ local function cartLabelMesh(imp, version, label, points) { 0, 0, 0, 1, 255, 255, 255, 255 }, }, "fan", "dynamic") mesh:setTexture(label.image) - imp._cartridgeLabelMeshes[version] = mesh + imp._cartridgeLabelMeshes[key] = mesh end mesh:setVertices({ { points[1][1], points[1][2], 0, 0, 255, 255, 255, 255 }, @@ -564,8 +601,8 @@ local function cartSendHover(shader, mx, my, hovering, screenScale) return ok end -local function cartridgeButton(imp, x, y, w, h, key, version, gameName, action) - local state = cartridgeState(imp, version) +local function cartridgeButton(imp, x, y, w, h, key, skin, gameName, action) + local state = cartridgeState(imp, skin.cacheKey) markNoDrag(imp, x, y, w, h) local focused = Kit.focusable(key, x, y, w, h) local hot = Kit.hover(x, y, w, h) @@ -640,7 +677,7 @@ local function cartridgeButton(imp, x, y, w, h, key, version, gameName, action) local ease = math.exp(-60 * dt) state.visScale = ease * state.visScale + (1 - ease) * desScale if not state.animId then - local n, s = 0, tostring(version) + local n, s = 0, tostring(skin.cacheKey) for i = 1, #s do n = n + s:byte(i) * i end state.animId = n end @@ -696,7 +733,7 @@ local function cartridgeButton(imp, x, y, w, h, key, version, gameName, action) capRight + halfW, capH, depth) local capBack = cartQuad(project, -halfW, -halfH, capRight + halfW, capH, -depth) - local shell = cartColor(version) + local shell = skin.color local side = { math.floor(shell[1] * 0.54), math.floor(shell[2] * 0.54), math.floor(shell[3] * 0.54) } @@ -798,8 +835,8 @@ local function cartridgeButton(imp, x, y, w, h, key, version, gameName, action) local plate = cartQuad(project, labelX - 2, labelY - 2, labelW + 4, labelH + 4, faceZ + 0.8) cartPolygon(plate, side, 0.95) local labelPoints = cartQuad(project, labelX, labelY, labelW, labelH, faceZ + 1.2) - local label = cartridgeLabel(imp, version) - local mesh = label and cartLabelMesh(imp, version, label, labelPoints) + local label = cartridgeLabel(imp, skin.cacheKey, skin.labelPath, skin.cartId) + local mesh = label and cartLabelMesh(imp, skin.cacheKey, label, labelPoints) if mesh then love.graphics.setColor(1, 1, 1, 1) love.graphics.draw(mesh) @@ -934,6 +971,35 @@ local function buildModScopeRow(imp, x, y, w, m) return h + math.floor(8 * m.s) end +local function buildSaveCartRow(imp, x, y, w, m) + local version = imp.modScope + local h = m.btnH + local gap = math.floor(8 * m.s) + local label = Strings("Save as cart") + local bw = math.min(w, Kit.textWidth("small", label) + math.floor(28 * m.s)) + local enabled = version ~= nil and imp:_cartCaptureCount(version) > 0 + btn(imp, x, y, bw, h, "mods-save-cart", label, { + kind = "accent", font = "small", enabled = enabled, + action = enabled and function() imp:_beginCartSave(version) end or nil }) + local hint + if version == nil then + hint = Strings("Pick one game above to save its enabled mods as a cart.") + elseif not enabled then + hint = Strings("Enable a mod for this game first.") + else + local info = GameVersion.info(version) + hint = Strings("Freeze the mods enabled for %s into a cart.", + (info and (info.launcherName or info.displayName)) or tostring(version)) + end + local hx = x + bw + gap + local hw = math.max(0, x + w - hx) + if hw > 0 then + Kit.text("small", Kit.ellipsize("small", hint, hw), hx, + y + (h - Kit.textHeight("small")) / 2, PAL.muted) + end + return h + gap +end + local function findActionFor(entry, installedVersion) local ModIndex = require("src.mods.ModIndex") if not ModIndex.canInstall(entry) then @@ -1512,9 +1578,11 @@ local function chipWidth(label, m) end local function buildSlotCard(imp, x, y, w, availH, m, version, ready) - imp:_ensureSlots(version) - local slots = imp.slots[version] or {} - local active = imp.activeSlot[version] + local scope = imp.slotScope and imp:slotScope(version) or version + local onCart = scope ~= version + imp:_ensureSlots(scope) + local slots = imp.slots[scope] or {} + local active = imp.activeSlot[scope] local n = #slots local pad = math.floor(14 * m.s) local iw = w - 2 * pad @@ -1570,7 +1638,7 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) local headH = math.max(Kit.textHeight("caption"), m.btnH) + math.floor(8 * m.s) local pagerH = math.max(Kit.tapMin(), math.floor(30 * m.s)) local newBtnH = m.btnH - local sfNotice = imp.saveNotice[version] + local sfNotice = imp.saveNotice[scope] local hintText, hintCol if sfNotice then hintText, hintCol = sfNotice.text, (sfNotice.ok and PAL.green or PAL.red) @@ -1586,7 +1654,7 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) local listH = availH - (pad * 2 + headH + hintH + pagerH + gap + newBtnH + gap) local perPage = Kit.rowsThatFit(listH, rowH, gap, 1, 12) - local pageKey = "slots-" .. version + local pageKey = "slots-" .. scope local first, last, cur, pages = Kit.pageBounds(page(imp, pageKey), n, perPage) setPage(imp, pageKey, cur) @@ -1603,10 +1671,12 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) local savImportLabel = imp.isNX and Strings("Scan again") or Strings("Import save") local impW = chipWidth(savImportLabel, m) + math.floor(8 * m.s) - btn(imp, x + w - pad - impW, cy, impW, m.btnH, "sav-import-" .. version, + btn(imp, x + w - pad - impW, cy, impW, m.btnH, "sav-import-" .. scope, savImportLabel, { - kind = "accent", font = "small", enabled = ready and true or false, - action = ready and function() imp:chooseSaveImport(version) end or nil, + kind = "accent", font = "small", + enabled = (ready and not onCart) and true or false, + action = (ready and not onCart) + and function() imp:chooseSaveImport(version) end or nil, }) local countW = (x + w - pad - impW - math.floor(8 * m.s)) - (x + pad + Kit.captionWidth(Strings("SAVE SLOT")) + math.floor(8 * m.s)) @@ -1629,10 +1699,10 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) for i = first, last do local slot = slots[i] local selected = slot.id == active - local rowKey = "slot-" .. version .. "-" .. slot.id + local rowKey = "slot-" .. scope .. "-" .. slot.id local ry = cy + (i - first) * (rowH + gap) local ink = rowHit(imp, x + pad, ry, iw, rowH, selected, rowKey, - function() imp:_selectSlot(version, slot.id) end) + function() imp:_selectSlot(scope, slot.id) end) local px = x + pad + math.floor(10 * m.s) local inner = iw - math.floor(20 * m.s) @@ -1661,6 +1731,9 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) else metaTxt = Strings("empty slot") end + if slot.sealBroken then + metaTxt = Strings("%s - seal broken", metaTxt) + end Kit.text("small", Kit.ellipsize("small", metaTxt, textW), px, ly, selected and PAL.inverse or PAL.muted) -- Where the chip block starts: centred on the row beside the text, or @@ -1673,22 +1746,22 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) -- an export is a property of a slot, so the control belongs on the slot -- it exports (it selects the row first, since the exporter writes -- whichever slot is active). - local armed = deleteArmed(imp, "slot", slot.id, version) + local armed = deleteArmed(imp, "slot", slot.id, scope) local chips = {} - if slot.exists then + if slot.exists and not onCart then chips[#chips + 1] = { label = Strings("Export"), kind = "accent", key = rowKey .. "-export", action = function() - imp:_selectSlot(version, slot.id) + imp:_selectSlot(scope, slot.id) imp:exportSave(version) end } end if not imp.android then chips[#chips + 1] = { label = Strings("Rename"), kind = "accent", key = rowKey .. "-rename", - action = function() imp:_beginRename(version, slot.id) end } + action = function() imp:_beginRename(scope, slot.id) end } end - if imp.onEditSave and slot.exists then + if imp.onEditSave and slot.exists and not onCart then chips[#chips + 1] = { label = Strings("Edit"), kind = "accent", key = rowKey .. "-edit", action = function() imp.onEditSave(version, slot.id) end } @@ -1699,8 +1772,8 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) w = math.max(chipWidth(DELETE_LABEL(false), m), chipWidth(DELETE_LABEL(true), m)), action = function() - imp:pressDelete("slot", slot.id, version, function() - imp:_deleteSlot(version, slot.id) + imp:pressDelete("slot", slot.id, scope, function() + imp:_deleteSlot(scope, slot.id) end) end } for _, c in ipairs(chips) do c.w = c.w or chipWidth(c.label, m) end @@ -1729,7 +1802,7 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) cy = cy + Kit.textWrapped("small", hintText, x + pad, cy, iw, hintCol, 2) if folderRow then cy = cy + math.floor(4 * m.s) - local key = "sav-folder-" .. version + local key = "sav-folder-" .. scope local label = Strings("Open folder") local lw = Kit.textWidth("small", label) local lh = Kit.textHeight("small") @@ -1752,19 +1825,101 @@ local function buildSlotCard(imp, x, y, w, availH, m, version, ready) setPage(imp, pageKey, newPage) cy = cy + pagerH + gap end - btn(imp, x + pad, cy, iw, newBtnH, "slot-new-" .. version, + btn(imp, x + pad, cy, iw, newBtnH, "slot-new-" .. scope, Strings("+ New save slot"), { kind = "good", - action = function() imp:_newSlot(version) end, + action = function() imp:_newSlot(scope) end, }) return h end +local function SEAL_LABEL(armed) + return armed and Strings("Break it") or Strings("Break the seal") +end + +local function sealSlotName(slot) + if not slot then return nil end + if type(slot.label) == "string" and slot.label ~= "" then return slot.label end + return tostring(slot.id):match("^slot(%d+)$") or tostring(slot.id) +end + +local function buildCartCard(imp, x, y, w, m, version) + if not imp.cartPlan then return 0 end + local report, slot = imp:cartPlan(version) + if not report then return 0 end + local title = tostring(report.title or report.id or "") + local broken = (slot and slot.sealBroken == true) or false + local state, stateCol, body = nil, PAL.green, {} + if report.refused then + state, stateCol = Strings("This cart will not start"), PAL.red + body[#body + 1] = { report.message, PAL.detail } + body[#body + 1] = { Strings("Break the seal to play it with the mods you have."), + PAL.detail } + elseif broken then + state, stateCol = Strings("Seal broken"), PAL.yellow + body[#body + 1] = { Strings("This save loads the cart's pinned mods first, then your other enabled mods. It is marked modified."), + PAL.detail } + elseif report.sealed then + state = Strings("Sealed - ready to play") + body[#body + 1] = { Strings("This cart loads only the mods it pins."), + PAL.detail } + else + state = Strings("Open cart - ready to play") + body[#body + 1] = { Strings("This cart's pinned mods load first, then your other enabled mods."), + PAL.detail } + end + local scope = imp:slotScope(version) + local offer = report.sealed and not broken + local armed = offer and deleteArmed(imp, "seal", slot and slot.id or nil, scope) + if armed then + local name = sealSlotName(slot) + body[#body + 1] = { name + and Strings("Break the seal on %s, save slot %s?", title, name) + or Strings("Break the seal on %s, on a new save slot?", title), + PAL.yellow } + body[#body + 1] = { Strings("This is permanent and cannot be undone. That save is marked modified from then on."), + PAL.yellow } + body[#body + 1] = { Strings("%s still loads its pinned mods first, with your other enabled mods on top.", title), + PAL.yellow } + body[#body + 1] = { Strings("Press Break it again to do it."), PAL.yellow } + end + + local pad = math.floor(14 * m.s) + local iw = w - 2 * pad + local chipH = offer and math.max(Kit.tapMin(), math.floor(30 * m.s)) or 0 + local h = pad + Kit.textHeight("button") + math.floor(4 * m.s) + for _, line in ipairs(body) do + h = h + Kit.wrapHeight("small", line[1] or "", iw, 3) + end + if offer then h = h + math.floor(8 * m.s) + chipH end + h = h + pad + + Kit.card(x, y, w, h) + local cy = y + pad + Kit.text("button", Kit.ellipsize("button", state, iw), x + pad, cy, stateCol) + cy = cy + Kit.textHeight("button") + math.floor(4 * m.s) + for _, line in ipairs(body) do + cy = cy + Kit.textWrapped("small", line[1] or "", x + pad, cy, iw, + line[2], 3) + end + if offer then + cy = cy + math.floor(8 * m.s) + local cw = math.max(chipWidth(SEAL_LABEL(false), m), + chipWidth(SEAL_LABEL(true), m)) + btn(imp, x + pad, cy, cw, chipH, "seal-" .. scope, SEAL_LABEL(armed), { + kind = "danger", font = "small", keepArm = true, + action = function() imp:pressBreakSeal(version) end, + }) + end + return h +end + local function buildGamePanel(imp, x, y, w, availH, m, version, budgetH) imp.panelVersion = version local info = GameVersion.info(version) local locked = info == nil - local gameName = info and (info.launcherName or info.displayName) + local skin = cartSkin(imp, version) + local gameName = skin.name or (info and (info.launcherName or info.displayName)) or tostring(version) local ready = (not locked) and imp.ready[version] or false @@ -1842,7 +1997,7 @@ local function buildGamePanel(imp, x, y, w, availH, m, version, budgetH) local cartW = math.min(cartAreaW, math.floor(playH * 0.88)) local cartX = lx + math.floor((cartAreaW - cartW) / 2) cartridgeButton(imp, cartX, ly, cartW, playH, "play-" .. version, - version, gameName, function() imp:play(version, true) end) + skin, gameName, function() imp:play(version, true) end) imp._gearIcon = imp._gearIcon or love.graphics.newImage("assets/launcher/gear.png") btn(imp, lx + lw - mgW, ly, mgW, mgW, "manage-" .. version, "", { @@ -1850,6 +2005,17 @@ local function buildGamePanel(imp, x, y, w, availH, m, version, budgetH) action = function() imp._gameManage = version end, }) ly = ly + playH + gap + btn(imp, lx, ly, lw, m.btnH, "carts-" .. version, + Strings("Custom Carts"), { + kind = "accent", font = "small", + action = function() + imp._cartPopup = version + imp._cartNotice = nil + end, + }) + ly = ly + m.btnH + gap + local sealH = buildCartCard(imp, lx, ly, lw, m, version) + if sealH > 0 then ly = ly + sealH + gap end end -- The ROM card, which now only exists while there is something to report: @@ -2109,6 +2275,7 @@ local function buildModsPanel(imp, x, y, w, availH, m) + math.floor(8 * m.s) cy = cy + buildModScopeRow(imp, x, cy, w, m) + cy = cy + buildSaveCartRow(imp, x, cy, w, m) if #mods == 0 then Kit.emptyBox(x, cy, w, math.floor(110 * m.s), imp:_modsEmptyHint()) @@ -3593,6 +3760,195 @@ local function buildGameModal(imp, m) action = function() imp._gamePopup = nil end }) end +local function cartRowLabel(row) + local seal = (row.seal == "open") and Strings("open") or Strings("sealed") + return Strings("%s - v%s - %s", tostring(row.title or row.id), + tostring(row.version or "?"), seal) +end + +local function buildCartModal(imp, m) + local version = imp._cartPopup + local rows = imp:_ensureCarts(version) + local info = GameVersion.info(version) + local baseName = info and (info.displayName or info.launcherName) + or tostring(version) + local active = imp.activeCart[version] + local pad = math.floor(18 * m.s) + local gap = math.floor(8 * m.s) + local w = math.floor(420 * m.s) + local rowH = m.btnH + local pagerH = math.max(Kit.tapMin(), math.floor(30 * m.s)) + local notice = imp._cartNotice + local noticeH = notice + and (Kit.wrapHeight("small", notice, w - 2 * pad, 2) + gap) or 0 + local emptyH = (#rows == 0) and (Kit.textHeight("small") + gap) or 0 + local fixed = pad + Kit.textHeight("button") + math.floor(12 * m.s) + + noticeH + emptyH + 2 * (rowH + gap) + rowH + pad + local perPage = Kit.rowsThatFit(m.H - 2 * m.pad - fixed, rowH, gap, 1, 8) + local pageKey = "cartpop-" .. tostring(version) + local first, last, cur, pages = Kit.pageBounds(page(imp, pageKey), #rows, perPage) + setPage(imp, pageKey, cur) + local shown = math.max(0, last - first + 1) + local h = fixed + shown * (rowH + gap) + (pages > 1 and (pagerH + gap) or 0) + + local px, py, pw = modalPanel(m, w, h) + local cy = py + pad + Kit.text("button", Strings("Custom Carts"), px + pad, cy, PAL.heading) + cy = cy + Kit.textHeight("button") + math.floor(12 * m.s) + if notice then + cy = cy + Kit.textWrapped("small", notice, px + pad, cy, + pw - 2 * pad, PAL.detail, 2) + gap + end + btn(imp, px + pad, cy, pw - 2 * pad, rowH, "cartpop-vanilla", baseName, { + kind = (active == nil) and "primary" or "ghost", font = "small", + action = function() imp:_selectCart(version, nil) end }) + cy = cy + rowH + gap + if #rows == 0 then + Kit.text("small", Strings("No carts installed for this game yet."), + px + pad, cy, PAL.muted) + cy = cy + Kit.textHeight("small") + gap + end + local expGap = math.floor(6 * m.s) + local expW = math.min(chipWidth(Strings("Export"), m), + math.floor((pw - 2 * pad) * 0.35)) + for i = first, last do + local row = rows[i] + local rowKey = "cartpop-id-" .. tostring(row.id) + local pickW = pw - 2 * pad - expW - expGap + btn(imp, px + pad, cy, pickW, rowH, rowKey, cartRowLabel(row), { + kind = (active == row.id) and "primary" or "ghost", font = "small", + action = function() imp:_selectCart(version, row.id) end }) + btn(imp, px + pad + pickW + expGap, cy, expW, rowH, rowKey .. "-export", + Strings("Export"), { kind = "accent", font = "small", + action = function() imp:exportCart(row.id) end }) + cy = cy + rowH + gap + end + if pages > 1 then + setPage(imp, pageKey, + Kit.pager(px + pad, cy, pw - 2 * pad, cur, #rows, perPage, pageKey)) + cy = cy + pagerH + gap + end + btn(imp, px + pad, cy, pw - 2 * pad, rowH, "cartpop-more", + Strings("Get more carts"), { kind = "accent", font = "small", + action = function() + imp._cartNotice = Strings("Browsing for carts arrives in a later update.") + end }) + cy = cy + rowH + gap + btn(imp, px + pad, cy, pw - 2 * pad, rowH, "cartpop-close", + Strings("Close"), { font = "small", + action = function() + imp._cartPopup = nil + imp._cartNotice = nil + end }) +end + +local CART_PIN_LINES = 4 + +local function cartPinLines(pins) + local out = {} + for i = 1, math.min(#pins, CART_PIN_LINES) do + local pin = pins[i] + out[#out + 1] = Strings("%s - %s", tostring(pin.name or pin.id), + tostring(pin.reason or "")) + end + if #pins > CART_PIN_LINES then + out[#out + 1] = Strings("...and %d more.", #pins - CART_PIN_LINES) + end + return out +end + +local function buildCartSaveModal(imp, m) + local st = imp._cartSave + local info = GameVersion.info(st.version) + local gameName = (info and (info.launcherName or info.displayName)) + or tostring(st.version) + local pad = math.floor(18 * m.s) + local gap = math.floor(8 * m.s) + local w = math.floor(500 * m.s) + local inner = w - 2 * pad + local fieldH = math.max(Kit.tapMin(), math.floor(36 * m.s)) + + local hint = (st.count == 1) + and Strings("This freezes the 1 mod enabled for %s into a cart.", gameName) + or Strings("This freezes the %d mods enabled for %s into a cart.", + st.count, gameName) + local id = imp:_cartSaveId() + local meta = id + and Strings("id %s - v%s - by %s", id, st.cartVersion, st.author) + or Strings("Type a title - the cart id is built from it.") + + local pins = st.unresolved or {} + local pinHead = (#pins > 0) and ((#pins == 1) + and Strings("1 mod could only be pinned to this install:") + or Strings("%d mods could only be pinned to this install:", #pins)) or nil + local pinRows = pinHead and cartPinLines(pins) or {} + local share = st.publishable + and Strings("Every mod is pinned to a release, so this cart can be shared.") + or Strings("This cart can be saved and played here while those mods stay installed at these versions, and cannot be shared.") + local shareCol = st.publishable and PAL.green or PAL.yellow + + local pinIndent = math.floor(10 * m.s) + local hintH = Kit.wrapHeight("small", hint, inner, 3) + gap + local metaH = Kit.textHeight("micro") + gap + local errH = st.error + and (Kit.wrapHeight("small", st.error, inner, 2) + gap) or 0 + local pinH = 0 + if pinHead then + pinH = Kit.textHeight("small") + math.floor(4 * m.s) + for _, line in ipairs(pinRows) do + pinH = pinH + Kit.wrapHeight("small", line, inner - pinIndent, 2) + + math.floor(2 * m.s) + end + pinH = pinH + gap + end + local shareH = Kit.wrapHeight("small", share, inner, 2) + gap + local footH = Kit.textHeight("micro") + math.floor(8 * m.s) + local h = pad + Kit.textHeight("button") + math.floor(10 * m.s) + hintH + + fieldH + gap + metaH + errH + pinH + shareH + m.btnH + footH + pad + + local px, py, pw = modalPanel(m, w, h) + local cy = py + pad + Kit.text("button", Strings("Save as cart"), px + pad, cy, PAL.heading) + cy = cy + Kit.textHeight("button") + math.floor(10 * m.s) + cy = cy + Kit.textWrapped("small", hint, px + pad, cy, pw - 2 * pad, + PAL.detail, 3) + gap + textField(imp, px + pad, cy, pw - 2 * pad, fieldH, "cartsave-field", + st.text or "", Strings("Cart title"), true) + cy = cy + fieldH + gap + Kit.text("micro", Kit.ellipsize("micro", meta, pw - 2 * pad), px + pad, cy, + PAL.muted) + cy = cy + Kit.textHeight("micro") + gap + if st.error then + cy = cy + Kit.textWrapped("small", st.error, px + pad, cy, pw - 2 * pad, + PAL.red, 2) + gap + end + if pinHead then + Kit.text("small", Kit.ellipsize("small", pinHead, pw - 2 * pad), + px + pad, cy, PAL.yellow) + cy = cy + Kit.textHeight("small") + math.floor(4 * m.s) + for _, line in ipairs(pinRows) do + cy = cy + Kit.textWrapped("small", line, px + pad + pinIndent, cy, + pw - 2 * pad - pinIndent, PAL.detail, 2) + math.floor(2 * m.s) + end + cy = cy + gap + end + cy = cy + Kit.textWrapped("small", share, px + pad, cy, pw - 2 * pad, + shareCol, 2) + gap + + local place = Layout.rightCluster(px + pad, pw - 2 * pad, math.floor(8 * m.s)) + local okLabel = Strings("Save as cart") + local okW = Kit.textWidth("small", okLabel) + math.floor(28 * m.s) + btn(imp, place(okW), cy, okW, m.btnH, "cartsave-ok", okLabel, + { kind = "primary", font = "small", + action = function() imp:_commitCartSave() end }) + local cw = Kit.textWidth("small", Strings("Cancel")) + math.floor(28 * m.s) + btn(imp, place(cw), cy, cw, m.btnH, "cartsave-cancel", Strings("Cancel"), + { font = "small", action = function() imp:_cancelCartSave() end }) + cy = cy + m.btnH + math.floor(8 * m.s) + Kit.text("micro", Strings("Enter to save - Esc to cancel"), px + pad, cy, + PAL.muted) +end + -- Category filter for FIND MODS. Two columns, because an index can list -- enough categories to overflow a single stacked column on a short window. local function buildFilterModal(imp, m) @@ -4962,7 +5318,7 @@ local function modalUp(imp) or imp._appPatchNotes or imp._findDetails or imp._modVersions or imp._modDepResolver or imp._sortPopup or imp._filterPopup or imp._modScopePopup or imp._indexManage - or imp._gamePopup + or imp._gamePopup or imp._cartPopup or imp._cartSave or imp._modActions or imp._modImports or imp._skinActions or imp._syncModal or imp._modHeaderActionsPopup or imp._profilesPopup or imp._singleProfileActions or imp._profileSavePrompt or imp._profileRenamePrompt or imp._findEntry or imp._gameManage) ~= nil @@ -5030,6 +5386,7 @@ local function buildModals(imp, m) }) return true end + if imp._cartSave then buildCartSaveModal(imp, m) return true end if imp._settings then buildSettingsModal(imp, m) return true end if imp._rename then buildPrompt(imp, m, { @@ -5105,6 +5462,7 @@ local function buildModals(imp, m) if imp._modHeaderActionsPopup then buildModHeaderActionsModal(imp, m) return true end if imp._sortPopup then buildSortModal(imp, m) return true end if imp._gamePopup then buildGameModal(imp, m) return true end + if imp._cartPopup then buildCartModal(imp, m) return true end if imp._modScopePopup then buildModScopeModal(imp, m) return true end if imp._filterPopup then buildFilterModal(imp, m) return true end if imp._indexManage then buildIndexesModal(imp, m) return true end diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index 20b573dc..2b0097f7 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -28,6 +28,13 @@ local function pickFile(...) return fn(...) and true or false end +local CART_SCOPE = "cart_" + +local function cartOfScope(scope) + if type(scope) ~= "string" then return nil end + return scope:match("^cart_(.+)$") +end + -- Cache generation tag; bump to force every imported version to re-extract. -- v9: Yellow audio re-anchored on pokeyellow.sym (#522) -- stale caches -- carry Red's bank $1f header, wave-table, and CryData offsets. @@ -1492,12 +1499,13 @@ end -- column with no Play button would read as the launcher losing the import. -- Called from new() once self.ready is filled, which is what that check needs. function RomImporter:_applyLastVersionTab() - local okLO, LO = pcall(require, "src.core.LaunchOptions") - if okLO and LO.pendingTab then return end - if os.getenv("POKEPORT_LAUNCHER_TAB") then return end local okOpt, opts = pcall(function() return require("src.core.SaveData").loadOptions() end) + self:_restoreActiveCarts(okOpt and opts or nil) + local okLO, LO = pcall(require, "src.core.LaunchOptions") + if okLO and LO.pendingTab then return end + if os.getenv("POKEPORT_LAUNCHER_TAB") then return end local last = okOpt and opts and opts.lastVersion if last and GameVersion.VERSIONS[last] and self.ready[last] then self.tab = last @@ -1507,8 +1515,9 @@ end -- The launcher runs each GameVersion as an independent tab. Each dropped or -- chosen ROM is routed to its version by SHA-1, extracted into that version's -- own cache (Red at the root, Blue under blue/, Yellow under yellow/), so all --- can be imported and played side by side. onComplete(version) hands the --- chosen game off to boot. +-- can be imported and played side by side. onComplete(version, cartId) hands +-- the chosen game -- and the custom cart its page is showing, if any -- off to +-- boot. -- opts: launcher (a fresh import stays on the launcher instead of auto-booting), -- forceImport (treat every version as not-yet-imported, so re-import is forced), -- onEditSave(version, slotId) (host handler for the Edit affordance on a save @@ -1582,6 +1591,7 @@ function RomImporter.new(onComplete, opts) -- any slot mutation); activeSlot drives the LOADED pill; slotScroll is the -- per-version list scroll offset (px), clamped against content in draw. slots = {}, activeSlot = {}, slotScroll = {}, + carts = {}, activeCart = {}, -- SAVE FILES card state: the last import/export result per version, shown as -- a green/red notice line under the Import save / Export save buttons. A -- successful export carries { dir } so the notice can offer an open-folder @@ -1771,6 +1781,11 @@ function RomImporter:focus(f) if love.filesystem.getInfo("export_done.flag", "file") then love.filesystem.remove("export_done.flag") love.filesystem.remove("pending_export.sav") + if self.androidPendingCartExport then + self.androidPendingCartExport = nil + self._cartNotice = Strings("Cart exported.") + return + end local version = self.androidPendingExportVersion or self:_savedropTarget() self.androidPendingExportVersion = nil self.saveNotice[version] = { ok = true, text = "Save exported." } @@ -2605,15 +2620,21 @@ end -- Delete a save slot from the registry and disk, then refresh the panel. If the -- deleted slot was active, SaveData.deleteSlot points active at another slot. -function RomImporter:_deleteSlot(version, id) +function RomImporter:_deleteSlot(scope, id) if self.workState == "working" then return end local SaveData = require("src.core.SaveData") - local ok, err = SaveData.deleteSlot(version, id) - if ok then - self:_refreshSlots(version) - self.saveNotice[version] = { ok = true, text = "Deleted " .. tostring(id) .. "." } + local cart = cartOfScope(scope) + local ok, err + if cart then + ok, err = SaveData.deleteCartSlot(cart, id) else - self.saveNotice[version] = { ok = false, text = tostring(err) } + ok, err = SaveData.deleteSlot(scope, id) + end + if ok then + self:_refreshSlots(scope) + self.saveNotice[scope] = { ok = true, text = "Deleted " .. tostring(id) .. "." } + else + self.saveNotice[scope] = { ok = false, text = tostring(err) } end end @@ -3225,17 +3246,30 @@ function RomImporter:play(version, fade) -- of its own, so portable installs and POKEPORT_IDENTITY sandboxes keep it -- with the rest of the launcher's persisted state. A failed write only -- costs the memory of the choice, so it must never block the boot. + local cartId = self.activeCart and self.activeCart[version] or nil pcall(function() local SaveData = require("src.core.SaveData") local opts = SaveData.loadOptions() opts.lastVersion = version + local map = self:_activeCartMap() + opts.activeCart = next(map) ~= nil and map or nil SaveData.saveOptions(opts) end) resetPointerCursor(self) -- The game draws with raw love.graphics from here on; drop the view's -- element tree and canvases before the handoff. if self._flex then require("src.import.LauncherView").detach(self) end - if self.onComplete then self.onComplete(version) end + if self.onComplete then self.onComplete(version, cartId) end +end + +function RomImporter:_activeCartMap() + local out = {} + for version, id in pairs(self.activeCart or {}) do + if GameVersion.VERSIONS[version] and type(id) == "string" then + out[version] = id + end + end + return out end -- "re-import" a column: drop it back to the choose/drop state so a fresh ROM @@ -4083,6 +4117,17 @@ function RomImporter:keypressed(key) end return end + if self._cartSave then + if key == "backspace" then + self._cartSave.text = utf8Back(self._cartSave.text) + self._cartSave.error = nil + elseif key == "return" or key == "kpenter" then + self:_commitCartSave() + elseif key == "escape" then + self:_cancelCartSave() + end + return + end if self._settingsText then if key == "backspace" then self._settingsText.text = utf8Back(self._settingsText.text) @@ -4168,6 +4213,13 @@ function RomImporter:keypressed(key) end return end + if self._cartPopup then + if self._flex and require("src.import.LauncherView").keypressed(self, key) then + return + end + if key == "escape" then self._cartPopup = nil end + return + end if self._skinUrlFocus then if key == "backspace" then self.skinUrl = utf8Back(self.skinUrl or "") @@ -4209,21 +4261,349 @@ function RomImporter:keypressed(key) end end end --- Reload a version's slot list + active id from SaveData (the source of truth). --- Cheap enough to call on any mutation; the per-frame draw only calls it lazily --- through _ensureSlots so a still list costs nothing after the first paint. -function RomImporter:_refreshSlots(version) - local SaveData = require("src.core.SaveData") - self.slots[version] = SaveData.listSlots(version) or {} - local opts = SaveData.loadOptions() - local reg = opts.saveSlots and opts.saveSlots[version] - -- fall back to the first slot as the shown "loaded" one when the registry - -- has a list but no explicit active id (matches saveNames' own resolution) - self.activeSlot[version] = reg and (reg.active or reg.list[1]) or nil + +function RomImporter:_refreshCarts(version) + local out = {} + local ok, rows = pcall(function() + return require("src.carts.CartStore").index() + end) + if ok and type(rows) == "table" then + for _, row in ipairs(rows) do + if row.base == version then out[#out + 1] = row end + end + end + self.carts[version] = out + return out end -function RomImporter:_ensureSlots(version) - if not self.slots[version] then self:_refreshSlots(version) end +function RomImporter:_ensureCarts(version) + return self.carts[version] or self:_refreshCarts(version) +end + +function RomImporter:_cartById(version, id) + if type(id) ~= "string" then return nil end + for _, row in ipairs(self:_ensureCarts(version)) do + if row.id == id then return row end + end + return nil +end + +function RomImporter:activeCartRow(version) + local id = self.activeCart[version] + if not id then return nil end + return self:_cartById(version, id) +end + +function RomImporter:slotScope(version) + local id = self.activeCart[version] + if id then return CART_SCOPE .. id end + return version +end + +function RomImporter:_selectCart(version, id) + self._cartPopup = nil + self._cartNotice = nil + if id ~= nil and not self:_cartById(version, id) then return end + self.activeCart[version] = id + self._cartPlan = nil + local scope = self:slotScope(version) + self.slots[scope] = nil + self.slotScroll[scope] = nil + if self._pages then self._pages["slots-" .. scope] = 1 end +end + +function RomImporter:_cartSealSlot(version) + local id = self.activeCart and self.activeCart[version] or nil + if not id then return nil, nil end + local scope = self:slotScope(version) + self:_ensureSlots(scope) + local active = self.activeSlot[scope] + for _, slot in ipairs(self.slots[scope] or {}) do + if slot.id == active then return slot, scope end + end + return nil, scope +end + +function RomImporter:cartPlan(version) + local id = self.activeCart and self.activeCart[version] or nil + if not id then return nil, nil end + local slot = self:_cartSealSlot(version) + local broken = (slot and slot.sealBroken == true) or false + local key = table.concat( + { id, tostring(slot and slot.id), tostring(broken) }, "|") + local cached = self._cartPlan + if cached and cached.key == key then return cached.report, slot end + local installed = {} + pcall(function() + local rows = require("src.mods.LauncherMods").list(version) or {} + for _, row in ipairs(rows) do + local manifest = type(row.manifest) == "table" and row.manifest or row + if type(manifest.id) == "string" then + installed[manifest.id] = + { id = manifest.id, version = manifest.version } + end + end + end) + local ok, cart = pcall(function() + return require("src.carts.CartStore").get(id) + end) + if not ok or type(cart) ~= "table" then cart = nil end + local report = require("src.mods.Loader").planCart(cart, installed, broken) + report.id = id + self._cartPlan = { key = key, report = report } + return report, slot +end + +function RomImporter:pressBreakSeal(version) + local slot, scope = self:_cartSealSlot(version) + if not scope then return false end + return self:pressDelete("seal", slot and slot.id or nil, scope, function() + self:breakCartSeal(version) + end) +end + +function RomImporter:breakCartSeal(version) + local id = self.activeCart and self.activeCart[version] or nil + if not id then return false end + local SaveData = require("src.core.SaveData") + local scope = self:slotScope(version) + self:_ensureSlots(scope) + local slotId = self.activeSlot[scope] + if type(slotId) ~= "string" then + slotId = SaveData.createCartSlot(id) + if type(slotId) ~= "string" then return false end + SaveData.setActiveCartSlot(id, slotId) + end + local ok = SaveData.markSlotSealBroken(id, slotId) + self:_refreshSlots(scope) + self.activeSlot[scope] = slotId + self._cartPlan = nil + return ok and true or false +end + +function RomImporter:_restoreActiveCarts(opts) + local saved = opts and opts.activeCart + if type(saved) ~= "table" then return end + for version, id in pairs(saved) do + if GameVersion.VERSIONS[version] and type(id) == "string" + and self:_cartById(version, id) then + self.activeCart[version] = id + end + end +end + +local CART_RAIL = { red = "railRed", blue = "railBlue", yellow = "railGold", + gold = "railAmber", silver = "railSilver" } +local CART_START_VERSION = "1.0.0" + +local function cartShellHex(version) + local Theme = require("src.ui.kit.Theme") + local col = Theme.PAL[CART_RAIL[version] or ""] or Theme.PAL.green + return ("#%02x%02x%02x"):format(col[1] or 0, col[2] or 0, col[3] or 0) +end + +local function cartIdFromTitle(title) + local CartManifest = require("src.carts.CartManifest") + local id = tostring(title or ""):lower():gsub("[^%w]+", "_") + id = id:sub(1, CartManifest.MAX_ID):gsub("^_+", ""):gsub("_+$", "") + if id == "" then return nil end + return id +end + +local function cartModRows(imp, version) + local LauncherMods = require("src.mods.LauncherMods") + local rows, kept = LauncherMods.list(version) or {}, {} + for _, row in ipairs(rows) do + if row.targetsHere ~= false then kept[#kept + 1] = row end + end + return kept +end + +function RomImporter:_cartCaptureCount(version) + if not GameVersion.VERSIONS[version] then return 0 end + local n = 0 + for _, row in ipairs(cartModRows(self, version)) do + if row.enabled then n = n + 1 end + end + return n +end + +function RomImporter:_cartAuthor() + local SaveData = require("src.core.SaveData") + local ok, opts = pcall(SaveData.loadOptions) + local sync = ok and type(opts) == "table" and opts.saveSync or nil + local label = type(sync) == "table" and sync.deviceLabel or nil + if type(label) == "string" and label:match("%S") then return label end + return Strings("Unknown") +end + +function RomImporter:_cartSaveId() + local st = self._cartSave + if not st then return nil end + return cartIdFromTitle(st.text) +end + +local function cartIdentity(st, id, title) + return { id = id, title = title, version = st.cartVersion, + author = st.author, base = st.version, + shell = st.shell, seal = "sealed" } +end + +function RomImporter:_beginCartSave(version) + if not GameVersion.VERSIONS[version] then return end + local LauncherMods = require("src.mods.LauncherMods") + local CartStore = require("src.carts.CartStore") + local st = { + version = version, text = "", author = self:_cartAuthor(), + cartVersion = CART_START_VERSION, shell = cartShellHex(version), + mods = cartModRows(self, version), + modOptions = LauncherMods.modOptions(), + unresolved = {}, publishable = false, + } + st.count = 0 + for _, row in ipairs(st.mods) do + if row.enabled then st.count = st.count + 1 end + end + local cart, unresolved = CartStore.capture( + cartIdentity(st, "preview", "Preview"), st.mods, st.modOptions) + if cart then + st.unresolved = unresolved or {} + local CartManifest = require("src.carts.CartManifest") + st.publishable = CartManifest.publishable(cart) and true or false + else + st.error = tostring(unresolved) + end + self._cartSave = st + self:_armTextInput() +end + +function RomImporter:_cancelCartSave() + self._cartSave = nil + self:_disarmTextInput() +end + +function RomImporter:_commitCartSave() + local st = self._cartSave + if not st then return end + local CartManifest = require("src.carts.CartManifest") + local CartStore = require("src.carts.CartStore") + local title = tostring(st.text or ""):match("^%s*(.-)%s*$") + if title == "" then + st.error = Strings("Type a title for this cart.") + return + end + local id = cartIdFromTitle(title) + if not id then + st.error = Strings("That title has no letters or numbers to build an id from.") + return + end + local existing = CartStore.get(id) + if existing then + st.error = Strings("%s already uses the id %s. Pick a different title.", + tostring(existing.title), id) + return + end + local cart, unresolved = CartStore.capture( + cartIdentity(st, id, title), st.mods, st.modOptions) + if not cart then + st.error = tostring(unresolved) + return + end + st.unresolved = unresolved or {} + st.publishable = CartManifest.publishable(cart) and true or false + local ok, err = CartStore.install(CartManifest.encode(cart)) + if not ok then + st.error = tostring(err) + return + end + local version = st.version + self._cartSave = nil + self:_disarmTextInput() + self:_refreshCarts(version) + self._cartPopup = version + self._cartNotice = Strings("Saved %s. It is in this list now.", title) +end + +function RomImporter:exportCart(id) + if self.workState == "working" then return end + local CartStore = require("src.carts.CartStore") + local SaveData = require("src.core.SaveData") + local bytes, err = CartStore.export(id) + if type(bytes) ~= "string" then + self._cartNotice = tostring(err or "that cart could not be read") + return + end + local fs = SaveData.portableFs() or (love and love.filesystem) + if not (fs and fs.write) then + self._cartNotice = Strings("No filesystem available to export to.") + return + end + if fs.createDirectory then + fs.createDirectory("exports") + fs.createDirectory("exports/carts") + end + local rel = "exports/carts/" .. id .. CartStore.EXT + local wrote, writeErr = fs.write(rel, bytes) + if not wrote then + self._cartNotice = Strings("Could not write the export: %s", tostring(writeErr)) + return + end + local abs, portableBase = rel, SaveData.portableBaseDir() + if portableBase then + local sep = package.config:sub(1, 1) + abs = portableBase .. sep .. rel:gsub("/", sep) + else + local base = fs.getSaveDirectory and fs.getSaveDirectory() or "" + if base ~= "" then abs = base .. "/" .. rel end + end + if self.isNX then + local hint = RomImporter.mtpHintPath(love.filesystem.getSaveDirectory()) + if hint ~= "" and hint:sub(-1) ~= "/" then hint = hint .. "/" end + self._cartNotice = + Strings("Exported to %s\nDBI MTP → 1: SD Card/%sexports/carts/", abs, hint) + return + end + if self.android then + local suggested = id .. CartStore.EXT + local staged = love.filesystem.write("pending_export.sav", bytes) + if staged and love.system.createFile + and love.system.createFile(suggested, love.filesystem.getSaveDirectory()) then + self.pickPending = true + self.pickTimer = 0 + self.androidPendingCartExport = true + self._cartNotice = Strings("Pick where to save %s...", suggested) + else + self._cartNotice = Strings("Exported inside the app folder: %s", abs) + end + return + end + self._cartNotice = Strings("Exported to %s", abs) +end + +-- Reload a scope's slot list + active id from SaveData (the source of truth). +-- Cheap enough to call on any mutation; the per-frame draw only calls it lazily +-- through _ensureSlots so a still list costs nothing after the first paint. +function RomImporter:_refreshSlots(scope) + local SaveData = require("src.core.SaveData") + local cart = cartOfScope(scope) + if cart then + self.slots[scope] = SaveData.listCartSlots(cart) or {} + local opts = SaveData.loadOptions() + local reg = opts.cartSlots and opts.cartSlots[cart] + self.activeSlot[scope] = + reg and (reg.active or (reg.list and reg.list[1])) or nil + return + end + self.slots[scope] = SaveData.listSlots(scope) or {} + local opts = SaveData.loadOptions() + local reg = opts.saveSlots and opts.saveSlots[scope] + -- fall back to the first slot as the shown "loaded" one when the registry + -- has a list but no explicit active id (matches saveNames' own resolution) + self.activeSlot[scope] = reg and (reg.active or reg.list[1]) or nil +end + +function RomImporter:_ensureSlots(scope) + if not self.slots[scope] then self:_refreshSlots(scope) end end -- The host calls this when the save editor closes: the edited slot's player @@ -4235,9 +4615,15 @@ end -- Point the active slot at id (persisted immediately, per the contract) and -- reflect it in the LOADED pill without a full relist. -function RomImporter:_selectSlot(version, id) - require("src.core.SaveData").setActiveSlot(version, id) - self.activeSlot[version] = id +function RomImporter:_selectSlot(scope, id) + local SaveData = require("src.core.SaveData") + local cart = cartOfScope(scope) + if cart then + SaveData.setActiveCartSlot(cart, id) + else + SaveData.setActiveSlot(scope, id) + end + self.activeSlot[scope] = id end -- Inline slot rename (#205): right-click arms a modal text field; Enter @@ -4282,12 +4668,12 @@ function RomImporter:_blurPanelFields() self:_disarmTextInput() end -function RomImporter:_beginRename(version, id) +function RomImporter:_beginRename(scope, id) local label - for _, slot in ipairs(self.slots[version] or {}) do + for _, slot in ipairs(self.slots[scope] or {}) do if slot.id == id then label = slot.label break end end - self._rename = { version = version, id = id, text = label or "" } + self._rename = { version = scope, id = id, text = label or "" } self._slotPress = nil -- cancel any armed click/drag on the list self:_armTextInput() end @@ -4297,7 +4683,13 @@ function RomImporter:_commitRename() if not r then return end self._rename = nil self:_disarmTextInput() - require("src.core.SaveData").renameSlot(r.version, r.id, r.text) + local SaveData = require("src.core.SaveData") + local cart = cartOfScope(r.version) + if cart then + SaveData.renameCartSlot(cart, r.id, r.text) + else + SaveData.renameSlot(r.version, r.id, r.text) + end self:_refreshSlots(r.version) end @@ -4314,6 +4706,13 @@ function RomImporter:textinput(text) self._profileRenamePrompt.text = utf8Cap((self._profileRenamePrompt.text or "") .. text, MAX_SLOT_LABEL) return end + if self._cartSave then + local CartManifest = require("src.carts.CartManifest") + self._cartSave.text = + utf8Cap(self._cartSave.text .. text, CartManifest.MAX_TITLE) + self._cartSave.error = nil + return + end if self._settingsText then local st = self._settingsText st.text = utf8Cap(st.text .. text, st.maxLen or MAX_SLOT_LABEL) @@ -4355,13 +4754,20 @@ end -- "+ New save slot": register an empty slot, make it active, relist, and pin the -- scroll to the bottom (clamped next draw) so the new row is on screen. -function RomImporter:_newSlot(version) +function RomImporter:_newSlot(scope) local SaveData = require("src.core.SaveData") - local id = SaveData.createSlot(version) - SaveData.setActiveSlot(version, id) - self:_refreshSlots(version) - self.activeSlot[version] = id - self.slotScroll[version] = math.huge + local cart = cartOfScope(scope) + local id + if cart then + id = SaveData.createCartSlot(cart) + if id then SaveData.setActiveCartSlot(cart, id) end + else + id = SaveData.createSlot(scope) + SaveData.setActiveSlot(scope, id) + end + self:_refreshSlots(scope) + self.activeSlot[scope] = id + self.slotScroll[scope] = math.huge end -- Mouse wheel: forwarded into the FlexLove view (installed onto the global @@ -4379,6 +4785,7 @@ end function RomImporter:_refreshMods() local LauncherMods = require("src.mods.LauncherMods") local SaveData = require("src.core.SaveData") + self._cartPlan = nil self.safeMode = SaveData.isSafeMode(SaveData.loadOptions()) -- Once per session, ahead of the first listing: pull in any mod the player -- unzipped beside the executable, which an ordinary (non-portable) install diff --git a/src/mods/Loader.lua b/src/mods/Loader.lua index 84b087cd..0b298d20 100644 --- a/src/mods/Loader.lua +++ b/src/mods/Loader.lua @@ -1,6 +1,7 @@ local Json = require("src.link.Json") local Logger = require("src.core.Logger") local SaveData = require("src.core.SaveData") +local CartStore = require("src.carts.CartStore") local Data = require("src.core.Data") local GameVersion = require("src.core.GameVersion") local Version = require("src.core.Version") @@ -270,6 +271,7 @@ function Loader.new(opts) modSave = {}, modOptions = {}, optionSchemas = {}, imageCache = {}, modInput = {}, modEnv = {}, stepsQueues = {}, fs = (opts and opts.fs) or (love and love.filesystem), + cart = opts and opts.cart or nil, dev = dev, safeMode = false, -- Which generation this boot is (1 or 2). Fixed at construction: the @@ -488,6 +490,141 @@ function Loader:_discover() end end +-- ------- custom carts + +local function installedVersions(installed) + local out = {} + for key, entry in pairs(installed or {}) do + if type(entry) == "table" then + local manifest = type(entry.manifest) == "table" and entry.manifest or entry + local id = manifest.id or (type(key) == "string" and key or nil) + if type(id) == "string" then out[id] = manifest.version end + end + end + return out +end + +local function pinnedVersion(pin) + local version = pin.version + if type(version) ~= "string" or version == "" then return nil end + if pin.source == "local" and version == CartStore.UNPINNED_VERSION then return nil end + return version +end + +local function sameVersion(want, have) + local order = Semver.compare(want, have) + if order ~= nil then return order == 0 end + return want == have +end + +local function cartComplaints(report) + local parts = {} + for _, row in ipairs(report.missing) do + parts[#parts + 1] = ("%s %s is not installed") + :format(row.id, row.version or "(any version)") + end + for _, row in ipairs(report.mismatched) do + parts[#parts + 1] = ("%s is pinned at %s but %s is installed") + :format(row.id, row.version, row.installed) + end + return parts +end + +function Loader.planCart(cart, installed, broken) + local report = { seal = "sealed", sealed = true, broken = broken == true, + order = {}, rank = {}, pins = {}, missing = {}, mismatched = {}, + floor = 1, refused = false } + if type(cart) ~= "table" then + report.enforced = true + report.refused = true + report.message = "this cart is not installed" + return report + end + report.id, report.title = cart.id, cart.title + report.seal = cart.seal == "open" and "open" or "sealed" + report.sealed = report.seal == "sealed" + report.enforced = report.sealed and not report.broken + local have = installedVersions(installed) + local pins = {} + for _, pin in ipairs(cart.mods or {}) do + if type(pin) == "table" and type(pin.id) == "string" then pins[pin.id] = pin end + end + for _, id in ipairs(cart.load_order or {}) do + local pin = pins[id] + if pin and not report.pins[id] then + report.order[#report.order + 1] = id + report.rank[id] = #report.order + report.pins[id] = pin + local want, got = pinnedVersion(pin), have[id] + if got == nil then + report.missing[#report.missing + 1] = + { id = id, version = want, source = pin.source } + elseif want and not sameVersion(want, got) then + report.mismatched[#report.mismatched + 1] = + { id = id, version = want, installed = got } + end + end + end + report.floor = #report.order + 1 + local parts = cartComplaints(report) + if #parts > 0 then + report.message = ("%s: %s"):format(cart.title or cart.id or "cart", + table.concat(parts, "; ")) + report.refused = report.enforced + end + return report +end + +function Loader:cartStatus() + return self.cartReport +end + +function Loader:_applyCart() + local cartId = SaveData.getCart() + if not cartId or self.safeMode then return end + local cart, err = self.cart, nil + if not cart then cart, err = CartStore.get(cartId, self.fs) end + local report = Loader.planCart(cart, self.mods, SaveData.isSealBroken()) + report.id = cartId + if not cart then + report.message = ("%s: %s"):format(cartId, tostring(err or "this cart is not installed")) + end + self.cartReport = report + if report.refused then + for _, mod in pairs(self.mods) do + mod.enabled, mod.state = false, "disabled" + end + self.errors[#self.errors + 1] = report.message + Logger.error("cart %s refused: %s", cartId, report.message) + return + end + if report.message then Logger.warn("cart %s: %s", cartId, report.message) end + for id, mod in pairs(self.mods) do + if report.pins[id] then + mod.enabled, mod.state = true, "pending" + elseif report.enforced then + mod.enabled, mod.state = false, "disabled" + end + end + local merged = {} + for id, bucket in pairs(self.modOptions) do merged[id] = bucket end + for id, pin in pairs(report.pins) do + local bucket = {} + for key, value in pairs(pin.options or {}) do bucket[key] = value end + if not report.enforced then + for key, value in pairs(self.modOptions[id] or {}) do bucket[key] = value end + end + merged[id] = bucket + end + self.modOptions = merged +end + +function Loader:_cartRank(id) + local report = self.cartReport + if not report then return 0 end + return report.rank[id] or report.floor +end + -- ------- validate and resolve -- a failed mod keeps the user's enable flag (the manager still shows it as @@ -773,9 +910,12 @@ function Loader:_order() if not best then best = id else + local ra, rb = self:_cartRank(id), self:_cartRank(best) local pa, pb = self.mods[id].manifest.priority, self.mods[best].manifest.priority - if pa < pb or (pa == pb and id < best) then best = id end + if ra < rb or (ra == rb and (pa < pb or (pa == pb and id < best))) then + best = id + end end end end @@ -1610,6 +1750,7 @@ function Loader:load(data) mod.enabled = not self.disabled[id] mod.state = mod.enabled and "pending" or "disabled" end + self:_applyCart() -- engine call sites reach these buses -- and this error feed, for failures -- that only surface at play time -- through Runtime from here on Runtime.install(self.events, self.hooks, self.errors) @@ -1783,7 +1924,7 @@ function Loader:status() table.sort(available, function(a, b) return a.id < b.id end) table.sort(loaded, function(a, b) return a.id < b.id end) return { available = available, loaded = loaded, errors = self.errors, - order = self.order } + order = self.order, cart = self.cartReport } end return Loader diff --git a/tests/engine/cart_launcher.lua b/tests/engine/cart_launcher.lua new file mode 100644 index 00000000..7eeda51d --- /dev/null +++ b/tests/engine/cart_launcher.lua @@ -0,0 +1,600 @@ +-- Custom carts in the launcher. +-- luajit tests/engine/cart_launcher.lua + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +local check, eq = T.check, T.eq +love = love or require("tests.love_stub") + +love.graphics.setLineJoin = love.graphics.setLineJoin or function() end +love.graphics.newShader = love.graphics.newShader or function() return {} end +love.graphics.polygon = love.graphics.polygon or function() end + +local Kit = require("src.ui.kit.Kit") +local SaveData = require("src.core.SaveData") +local CartManifest = require("src.carts.CartManifest") +local CartStore = require("src.carts.CartStore") +local RomImporter = require("src.import.RomImporter") +local LauncherView = require("src.import.LauncherView") + +local SHA = ("a1b2c3d4"):rep(8) + +local function window(w, h) + love.graphics.getDimensions = function() return w, h end + love.graphics.getPixelDimensions = function() return w, h end +end + +local function freshLauncher(onComplete) + return RomImporter.new(onComplete or function() end, { launcher = true }) +end + +local realPrint = love.graphics.print +local function drawAndCapture(imp) + local seen = {} + love.graphics.print = function(str, ...) + seen[#seen + 1] = tostring(str) + return realPrint(str, ...) + end + local ok, err = pcall(LauncherView.draw, imp) + love.graphics.print = realPrint + check(ok, "the frame draws: " .. tostring(err)) + return table.concat(seen, "\n") +end + +local realSetColor = love.graphics.setColor +local function drawColors(imp) + local seen = {} + love.graphics.setColor = function(r, g, b, a) + if type(r) == "number" and type(g) == "number" and type(b) == "number" then + seen[("%d,%d,%d"):format(math.floor(r * 255 + 0.5), + math.floor(g * 255 + 0.5), math.floor(b * 255 + 0.5))] = true + end + return realSetColor(r, g, b, a) + end + local ok, err = pcall(LauncherView.draw, imp) + love.graphics.setColor = realSetColor + check(ok, "the frame draws: " .. tostring(err)) + return seen +end + +local function cartTable(over) + local tbl = { + id = "kanto_plus", title = "Kanto Plus", version = "1.2.0", + author = "Ren", shell = "#3fa9f5", base = "red", seal = "sealed", + mods = { { id = "rare_soda", source = "github", repo = "ren/rare-soda", + version = "0.4.1", sha256 = SHA } }, + } + for key, value in pairs(over or {}) do tbl[key] = value end + return tbl +end + +local function install(over) + over = over or {} + local cart, parseErr = CartManifest.parse(cartTable(over)) + check(cart ~= nil, "fixture parses: " .. tostring(parseErr)) + cart.labelArt = over.labelArt + local ok, err = CartStore.install(CartManifest.encode(cart)) + check(ok ~= nil, "fixture installs: " .. tostring(err)) + return cart +end + +install() +install({ id = "zeta_open", title = "Zeta Open", version = "0.9.0", + seal = "open", shell = "#112233" }) +install({ id = "johto_lite", title = "Johto Lite", base = "blue", + shell = "#7a5c2e" }) + +window(1280, 720) + +local imp = freshLauncher() +local red = imp:_ensureCarts("red") +eq(#red, 2, "red lists exactly the carts based on red") +eq(red[1].id, "kanto_plus", "the list is sorted by title") +eq(red[2].id, "zeta_open", "the list is sorted by title") +eq(#imp:_ensureCarts("blue"), 1, "blue lists only its own cart") +eq(imp:_ensureCarts("blue")[1].id, "johto_lite", "and that one is Johto Lite") +eq(#imp:_ensureCarts("yellow"), 0, "a game with no carts lists none") + +imp.tab = "red" +imp.ready.red = true +imp._cartPopup = "red" +local picker = drawAndCapture(imp) +check(picker:find("Pokemon Red", 1, true) ~= nil, + "the picker offers the base game as the first row") +check(picker:find("Kanto Plus", 1, true) ~= nil, "the picker lists Kanto Plus") +check(picker:find("Zeta Open", 1, true) ~= nil, "the picker lists Zeta Open") +check(picker:find("Johto Lite", 1, true) == nil, + "the picker does NOT list a cart based on another game") +check(picker:find("v1.2.0", 1, true) ~= nil, "a cart row carries its version") +check(picker:find("sealed", 1, true) ~= nil, "a cart row carries its seal state") +check(picker:find("open", 1, true) ~= nil, "including an open one") +check(picker:find("Get more carts", 1, true) ~= nil, + "the last row is the browse placeholder") + +imp._cartPopup = nil +local vanillaColors = drawColors(imp) +check(vanillaColors["63,169,245"] == nil, + "a vanilla page never paints the cart's shell colour") + +imp:_selectCart("red", "kanto_plus") +eq(imp.activeCart.red, "kanto_plus", "the pick lands on activeCart") +eq(imp._cartPopup, nil, "picking closes the picker") + +local titled = drawAndCapture(imp) +check(titled:find("Kanto Plus", 1, true) ~= nil, + "the panel title becomes the cart's title") + +local cartColors = drawColors(imp) +eq(cartColors["63,169,245"], true, + "the cartridge takes the cart's shell colour") + +eq(imp.tab, "red", "a cart id never reaches imp.tab") +eq(imp.panelVersion, "red", "a cart id never reaches imp.panelVersion") + +check(imp._cartridge["cart:kanto_plus"] ~= nil, + "the cart spins on its own cartridge state") +check(imp._cartridge["cart:kanto_plus"] ~= imp._cartridge.red, + "which is not the base game's") +eq(imp._cartridgeLabels["cart:kanto_plus"], false, + "a cart carrying no label art falls through to bare plastic") + +local scope = imp:slotScope("red") +eq(scope, "cart_kanto_plus", "an active cart scopes the panel's save slots") +imp:_newSlot(scope) +imp:_newSlot(scope) +eq(#SaveData.listCartSlots("kanto_plus"), 2, "both slots land in the cart") +eq(#SaveData.listSlots("red"), 0, "and none of them in the base game") +imp:_ensureSlots(scope) +eq(#imp.slots[scope], 2, "the panel reads the cart's slots back") + +imp:_beginRename(scope, "slot1") +imp._rename.text = "Nuzlocke" +imp:_commitRename() +eq(SaveData.listCartSlots("kanto_plus")[1].label, "Nuzlocke", + "a rename writes into the cart's registry") + +imp:_selectSlot(scope, "slot2") +eq(SaveData.activeCartSlot("kanto_plus"), "slot2", + "selecting a row moves the cart's active slot") +imp:_deleteSlot(scope, "slot2") +eq(#SaveData.listCartSlots("kanto_plus"), 1, "a delete removes the cart's slot") + +local withCart = drawAndCapture(imp) +check(withCart:find("Nuzlocke", 1, true) ~= nil, + "the slot card shows the cart's slots while the cart is active") + +imp:_selectCart("red", nil) +eq(imp.activeCart.red, nil, "choosing the base game clears the active cart") +eq(imp:slotScope("red"), "red", "and the slots go back to the version's own") +imp:_newSlot("red") +eq(#SaveData.listSlots("red"), 1, "a vanilla slot lands in the version") +eq(#SaveData.listCartSlots("kanto_plus"), 1, "and not in the cart") + +local backHome = drawAndCapture(imp) +check(backHome:find("Nuzlocke", 1, true) == nil, + "the slot card no longer shows the cart's slots") +check(backHome:find("Kanto Plus", 1, true) == nil, + "and the panel title is the base game's again") +local homeColors = drawColors(imp) +check(homeColors["63,169,245"] == nil, + "the cartridge is back to the base game's shell") + +local handed = {} +local player = freshLauncher(function(version, cartId) + handed.version, handed.cart = version, cartId +end) +player.ready.red = true +player:_selectCart("red", "kanto_plus") +player:play("red") +eq(handed.version, "red", "Play still boots the base game") +eq(handed.cart, "kanto_plus", "and names the cart it is running") + +local opts = SaveData.loadOptions() +eq(opts.lastVersion, "red", "play still remembers the version") +eq(type(opts.activeCart) == "table" and opts.activeCart.red or nil, "kanto_plus", + "play persists the active cart beside it") + +local restored = freshLauncher() +eq(restored.activeCart.red, "kanto_plus", + "a fresh launcher restores the cart its page was on") +eq(restored.tab, "red", "and a cart id still never reaches the tab") + +local uninstalled = freshLauncher() +uninstalled.activeCart.red = nil +uninstalled:_restoreActiveCarts({ activeCart = { red = "gone_forever" } }) +eq(uninstalled.activeCart.red, nil, + "a remembered cart that is no longer installed is dropped") + +local Base64 = require("src.core.Base64") +local PNG = CartManifest.PNG_SIGNATURE .. ("labelart"):rep(4) +local function artOf() + return { encoding = "base64", bytes = #PNG, data = Base64.encode(PNG) } +end + +install({ id = "art_cart", title = "Art Cart", base = "yellow", + shell = "#204060", labelArt = artOf() }) +install({ id = "bare_cart", title = "Bare Cart", base = "yellow", + shell = "#405060" }) +install({ id = "bad_cart", title = "Bad Cart", base = "yellow", + shell = "#605040", labelArt = artOf() }) + +check(CartStore.labelArt("art_cart") == PNG, + "the store hands back the cart's own PNG bytes") +check(CartStore.labelArt("bare_cart") == nil, + "and nothing for a cart that carries none") + +window(1280, 720) +local realNewImage = love.graphics.newImage +local madeImages = 0 +love.graphics.newImage = function(...) + madeImages = madeImages + 1 + return realNewImage(...) +end + +local art = freshLauncher() +art.tab = "yellow" +art.ready.yellow = true +art:_selectCart("yellow", "art_cart") +drawAndCapture(art) +local artLabel = art._cartridgeLabels["cart:art_cart"] +check(type(artLabel) == "table" and artLabel.image ~= nil, + "a cart's own label art becomes a cached cartridge image") +local afterFirst = madeImages +drawAndCapture(art) +eq(madeImages, afterFirst, "the decode happens once, not every frame") + +art:_selectCart("yellow", "bare_cart") +drawAndCapture(art) +eq(art._cartridgeLabels["cart:bare_cart"], false, + "a cart with no art renders as bare plastic") +check(art._cartridgeLabels["cart:art_cart"] ~= art._cartridgeLabels["cart:bare_cart"], + "and the two carts never share one label cache entry") + +love.graphics.newImage = function(a, ...) + if type(a) == "table" and a._fileData then error("not a PNG this engine reads") end + return realNewImage(a, ...) +end +local bad = freshLauncher() +bad.tab = "yellow" +bad.ready.yellow = true +bad:_selectCart("yellow", "bad_cart") +drawAndCapture(bad) +love.graphics.newImage = realNewImage +eq(bad._cartridgeLabels["cart:bad_cart"], false, + "art that will not decode leaves the cart bare instead of throwing") +drawAndCapture(bad) +eq(bad._cartridgeLabels["cart:bad_cart"], false, + "and it is not retried on the next frame") + +local LauncherMods = require("src.mods.LauncherMods") +local realModList = LauncherMods.list + +local function fakeRow(over) + local row = { id = "x", name = "X", version = "1.0.0", badge = "MOD", + description = "", enabled = true, status = "ok", + statusDetail = "", experimental = false, targetsHere = true, + targets = nil, safeMode = false, requiredImports = {}, + imports = {}, missingRequiredImports = 0, + missingOptionalImports = 0, + enabledByVersion = { red = true, blue = true, yellow = true, + gold = true, silver = true } } + for key, value in pairs(over) do row[key] = value end + row.manifest = row.manifest or { id = row.id, name = row.name, + version = row.version } + return row +end + +local FAKE_MODS = { + fakeRow({ id = "rare_soda", name = "Rare Soda", version = "0.4.1", + github = "ren/rare-soda", sha256 = SHA }), + fakeRow({ id = "wide_gym", name = "Wide Gym", version = "dev" }), + fakeRow({ id = "off_mod", name = "Off Mod", enabled = false, + enabledByVersion = { red = false } }), +} + +local modsView = freshLauncher() +modsView.tab = "mods" +local modsText = drawAndCapture(modsView) +check(modsText:find("Save as cart", 1, true) ~= nil, + "the mods tab carries the Save as cart control") + +LauncherMods.list = function() return FAKE_MODS end + +local maker = freshLauncher() +maker.tab = "red" +maker.ready.red = true +maker:_setModScope("red") +eq(maker:_cartCaptureCount("red"), 2, + "the control counts only the mods enabled for this game") + +maker:_beginCartSave("red") +check(maker._cartSave ~= nil, "Save as cart opens a form") +eq(maker._cartSave.count, 2, "the form reports the captured mod count") +eq(maker._cartSave.version, "red", "scoped to the game the panel is showing") +eq(#maker._cartSave.unresolved, 1, "capture reports one pin it could not resolve") +eq(maker._cartSave.unresolved[1].id, "wide_gym", "naming the mod it belongs to") +check(tostring(maker._cartSave.unresolved[1].reason):find("semantic", 1, true) ~= nil, + "and why it could only be pinned locally") +eq(maker._cartSave.publishable, false, "a local pin makes the cart unpublishable") + +local form = drawAndCapture(maker) +check(form:find("Save as cart", 1, true) ~= nil, "the form is titled") +check(form:find("Wide Gym", 1, true) ~= nil, + "the unresolved pin is named BEFORE the player confirms") +check(form:find("could only be pinned to this install", 1, true) ~= nil, + "under a heading that says what a local pin means") +check(form:find("cannot be shared", 1, true) ~= nil, + "and the form says plainly that the result cannot be shared") + +maker._cartSave.text = "Kanto Plus" +maker:_commitCartSave() +check(maker._cartSave ~= nil, "a title that collides with an installed cart refuses") +check(tostring(maker._cartSave.error):find("kanto_plus", 1, true) ~= nil, + "and names the id that is already taken") +eq(CartStore.get("kanto_plus").title, "Kanto Plus", + "the installed cart is untouched") + +maker._cartSave.text = "Soda Run" +maker:_commitCartSave() +eq(maker._cartSave, nil, "a free title saves the cart and closes the form") +eq(maker._cartPopup, "red", "and drops the player straight into the picker") +local made = CartStore.get("soda_run") +check(made ~= nil, "the cart is installed under the id derived from the title") +eq(made.base, "red", "based on the game the panel was showing") +eq(made.version, "1.0.0", "at the default cart version") +eq(made.seal, "sealed", "sealed by default") +eq(made.shell, "#ff3c48", "wearing the base game's rail colour") +eq(#made.mods, 2, "pinning exactly the enabled mods") + +local listedNow = false +for _, row in ipairs(maker:_ensureCarts("red")) do + if row.id == "soda_run" then listedNow = true end +end +check(listedNow, "and the picker lists it immediately") +local picked = drawAndCapture(maker) +check(picked:find("Soda Run", 1, true) ~= nil, "including on screen") + +LauncherMods.list = function() return { FAKE_MODS[1] } end +local pure = freshLauncher() +pure.tab = "red" +pure.ready.red = true +pure:_beginCartSave("red") +eq(#pure._cartSave.unresolved, 0, "a fully pinned capture has no local pins") +eq(pure._cartSave.publishable, true, "and it is publishable") +local pureForm = drawAndCapture(pure) +check(pureForm:find("can be shared", 1, true) ~= nil, + "which the form says before the player confirms") +check(pureForm:find("cannot be shared", 1, true) == nil, + "instead of the local-pin warning") +pure._cartSave.text = "Pure Soda" +pure:_commitCartSave() +eq(pure._cartSave, nil, "a fully pinned capture saves too") +local pureOk, pureWhy = CartManifest.publishable(CartStore.get("pure_soda")) +eq(pureOk, true, "and the saved cart really is publishable") +eq(pureWhy, nil, "with nothing holding it back") +LauncherMods.list = function() return FAKE_MODS end + +local blank = freshLauncher() +blank:_beginCartSave("red") +blank:_commitCartSave() +check(blank._cartSave ~= nil, "an empty title does not save") +check(tostring(blank._cartSave.error):find("title", 1, true) ~= nil, + "and asks for one") +blank:_cancelCartSave() +eq(blank._cartSave, nil, "Cancel closes the form") + +LauncherMods.list = realModList + +local exporter = freshLauncher() +exporter:exportCart("kanto_plus") +check(tostring(exporter._cartNotice):find("Exported", 1, true) ~= nil, + "Export reports where the cart file went: " .. tostring(exporter._cartNotice)) +local wroteBytes = love.filesystem.read("exports/carts/kanto_plus" .. CartStore.EXT) +check(type(wroteBytes) == "string" and wroteBytes ~= "", + "and the bytes land in the same exports tree a save export uses") +eq(wroteBytes, (CartStore.export("kanto_plus")), + "byte for byte what CartStore.export returned") +local roundTrip = CartManifest.decode(wroteBytes) +check(roundTrip ~= nil and roundTrip.id == "kanto_plus", + "and the file decodes back into the cart") + +exporter:exportCart("no_such_cart") +check(tostring(exporter._cartNotice):find("not installed", 1, true) ~= nil, + "exporting a cart that is not installed says so") + +window(1920, 1080) + +local FULL_MODS = { fakeRow({ id = "rare_soda", name = "Rare Soda", + version = "0.4.1", github = "ren/rare-soda", + sha256 = SHA }) } + +LauncherMods.list = function() return FULL_MODS end +local okCart = freshLauncher() +okCart.tab = "red" +okCart.ready.red = true +okCart:_selectCart("red", "kanto_plus") +local okPlan = okCart:cartPlan("red") +eq(okPlan.refused, false, "a cart whose pin is installed is playable") +eq(okPlan.sealed, true, "and is still sealed") +local okText = drawAndCapture(okCart) +check(okText:find("Sealed", 1, true) ~= nil, + "the verdict is on the page before the player commits") +check(okText:find("Break the seal", 1, true) ~= nil, + "and a sealed cart's page offers the escape hatch") + +LauncherMods.list = function() return {} end +local gapCart = freshLauncher() +gapCart.tab = "red" +gapCart.ready.red = true +gapCart:_selectCart("red", "kanto_plus") +local gapPlan = gapCart:cartPlan("red") +eq(gapPlan.refused, true, "a cart with an uninstalled pin refuses") +eq(gapPlan.missing[1].id, "rare_soda", "naming the pin it cannot find") +local gapText = drawAndCapture(gapCart) +check(gapText:find("will not start", 1, true) ~= nil, + "which the page says without the player booting into an error") +check(gapText:find("rare_soda", 1, true) ~= nil, "and names the pin") +check(gapText:find("Break the seal", 1, true) ~= nil, + "with the escape hatch beside the refusal") + +local sealScope = gapCart:slotScope("red") +gapCart:_ensureSlots(sealScope) +local sealSlot = gapCart.activeSlot[sealScope] +check(type(sealSlot) == "string", "the cart page has a loaded save slot") +eq(gapCart:pressBreakSeal("red"), false, "the first press only arms the confirm") +eq(SaveData.slotSealBroken("kanto_plus", sealSlot), false, + "so one press breaks nothing") +local armedText = drawAndCapture(gapCart) +check(armedText:find("Kanto Plus", 1, true) ~= nil, + "the armed confirm names the cart") +check(armedText:find("save slot", 1, true) ~= nil, "and the save slot") +check(armedText:find("cannot be undone", 1, true) ~= nil, + "says it is permanent") +check(armedText:find("marked modified", 1, true) ~= nil, + "says the file is marked modified from then on") +check(armedText:find("pinned mods first", 1, true) ~= nil, + "and that the cart's own list still loads first") +eq(gapCart:pressBreakSeal("red"), true, "a second press breaks the seal") +eq(SaveData.slotSealBroken("kanto_plus", sealSlot), true, + "which lands on that slot, durably") +eq(gapCart:cartPlan("red").refused, false, "and the cart is no longer refused") +local brokenText = drawAndCapture(gapCart) +check(brokenText:find("Seal broken", 1, true) ~= nil, + "the cart page shows the broken state afterwards") +check(brokenText:find("seal broken", 1, true) ~= nil, + "and so does the cart's slot row") + +gapCart:_newSlot(sealScope) +local freshSlot = gapCart.activeSlot[sealScope] +check(freshSlot ~= sealSlot, "a new save slot under the same cart") +eq(SaveData.slotSealBroken("kanto_plus", freshSlot), false, + "starts sealed again") +eq(gapCart:cartPlan("red").refused, true, "so the cart refuses that one") + +LauncherMods.list = realModList +window(1280, 720) + +local function clipped(r) + local x1, y1, x2, y2 = r.x, r.y, r.x + r.w, r.y + r.h + if r.clip then + x1 = math.max(x1, r.clip.x); y1 = math.max(y1, r.clip.y) + x2 = math.min(x2, r.clip.x + r.clip.w); y2 = math.min(y2, r.clip.y + r.clip.h) + end + if x2 - x1 <= 1 or y2 - y1 <= 1 then return nil end + return x1, y1, x2, y2 +end + +local function overlap(a, b) + local ax1, ay1, ax2, ay2 = clipped(a) + if not ax1 then return false end + local bx1, by1, bx2, by2 = clipped(b) + if not bx1 then return false end + return math.min(ax2, bx2) - math.max(ax1, bx1) > 1 + and math.min(ay2, by2) - math.max(ay1, by1) > 1 +end + +local function auditFrame(label, want) + local controls, found = {}, false + for _, r in ipairs(Kit.audit or {}) do + if r.class == "control" then + controls[#controls + 1] = r + if want and tostring(r.label):find(want, 1, true) then found = true end + end + end + check(#controls > 0, label .. ": the frame dispatched controls at all") + local collisions = 0 + for i = 1, #controls do + for j = i + 1, #controls do + if overlap(controls[i], controls[j]) then + collisions = collisions + 1 + print((" overlap: '%s' vs '%s' at (%.0f,%.0f) / (%.0f,%.0f)") + :format(tostring(controls[i].label), tostring(controls[j].label), + controls[i].x, controls[i].y, controls[j].x, controls[j].y)) + end + end + end + check(collisions == 0, label .. ": no two controls overlap") + if want then check(found, label .. ": drew " .. want) end +end + +local SIZES = { + { 360, 780 }, { 412, 915 }, { 480, 900 }, { 720, 1280 }, + { 1280, 720 }, { 1024, 768 }, { 900, 700 }, { 1920, 1080 }, +} + +for _, size in ipairs(SIZES) do + local W, H = size[1], size[2] + window(W, H) + for _, cart in ipairs({ false, true }) do + local page = freshLauncher() + page.tab = "red" + page.ready.red = true + page:_selectCart("red", cart and "kanto_plus" or nil) + LauncherView.draw(page) + Kit.audit = {} + local ok, err = pcall(LauncherView.draw, page) + Kit.audit = ok and Kit.audit or nil + check(ok, ("%dx%d %s draws: %s") + :format(W, H, cart and "cart" or "vanilla", tostring(err))) + if ok then + auditFrame(("%dx%d %s"):format(W, H, cart and "cart" or "vanilla"), + "Custom Carts") + end + Kit.audit = nil + + page._cartPopup = "red" + if cart then + page._cartNotice = "Browsing for carts arrives in a later update." + end + LauncherView.draw(page) + Kit.audit = {} + ok, err = pcall(LauncherView.draw, page) + Kit.audit = ok and Kit.audit or nil + check(ok, ("%dx%d picker draws: %s"):format(W, H, tostring(err))) + if ok then + auditFrame(("%dx%d picker"):format(W, H), "Kanto Plus") + for _, r in ipairs(Kit.audit or {}) do + local label = tostring(r.label) + if label == "Get more carts" or label == "Close" then + check(r.y >= -0.5 and r.y + r.h <= H + 0.5, + ("%dx%d picker: %q stays inside the window"):format(W, H, label)) + end + end + end + Kit.audit = nil + end +end + +LauncherMods.list = function() return FAKE_MODS end +for _, size in ipairs(SIZES) do + local W, H = size[1], size[2] + window(W, H) + local form = freshLauncher() + form.tab = "mods" + form.ready.red = true + form:_setModScope("red") + form:_beginCartSave("red") + form._cartSave.text = "Soda Run" + form:_commitCartSave() + check(form._cartSave ~= nil, + ("%dx%d save form stays open on a colliding title"):format(W, H)) + LauncherView.draw(form) + Kit.audit = {} + local ok, err = pcall(LauncherView.draw, form) + Kit.audit = ok and Kit.audit or nil + check(ok, ("%dx%d save form draws: %s"):format(W, H, tostring(err))) + if ok then + auditFrame(("%dx%d save form"):format(W, H), "Save as cart") + for _, r in ipairs(Kit.audit or {}) do + if tostring(r.label) == "Cancel" then + check(r.y >= -0.5 and r.y + r.h <= H + 0.5, + ("%dx%d save form: Cancel stays inside the window"):format(W, H)) + end + end + end + Kit.audit = nil +end +LauncherMods.list = realModList + +T.finish("cart launcher") diff --git a/tests/engine/cart_manifest.lua b/tests/engine/cart_manifest.lua new file mode 100644 index 00000000..37a4a197 --- /dev/null +++ b/tests/engine/cart_manifest.lua @@ -0,0 +1,413 @@ +package.path = "./?.lua;./?/init.lua;" .. package.path + +if not rawget(_G, "bit") and not rawget(_G, "bit32") then + local ok, bit32 = pcall(require, "bit32") + if ok then _G.bit32 = bit32 end +end + +local T = require("tests.harness") +local Base64 = require("src.core.Base64") +local CartManifest = require("src.carts.CartManifest") +local SaveSerializer = require("src.core.SaveSerializer") + +local SHA = ("a1b2c3d4"):rep(8) +local MD5 = ("0123456789abcdef"):rep(2) + +local function baseCart() + return { + id = "kanto_plus", + title = " Kanto Plus ", + version = "1.2.0", + author = "Ren", + repo = "ren/kanto-plus", + summary = "A sealed set of five", + shell = "#3FA9F5", + label = "./art/label.png", + base = "red", + engine = ">=1.4.0", + mods = { + { id = "rare_soda", source = "github", repo = "ren/rare-soda", + version = "0.4.1", sha256 = SHA, + options = { sweetness = 3, flavour = "grape", fizzy = true } }, + { id = "hard_mode", source = "gamebanana", mod = 4821, file = 99123, + md5 = MD5 }, + }, + } +end + +local function rejects(mutate, fragment, what) + local tbl = baseCart() + mutate(tbl) + local cart, err = CartManifest.parse(tbl) + T.eq(cart, nil, what .. " is rejected") + T.check(type(err) == "string" and err:find(fragment, 1, true) ~= nil, + ("%s says why (got %s)"):format(what, tostring(err))) +end + +local raw = baseCart() +local cart, err = CartManifest.parse(raw) +T.check(cart ~= nil, "a good manifest parses: " .. tostring(err)) +T.eq(cart.title, "Kanto Plus", "title is trimmed") +T.eq(cart.shell, "#3fa9f5", "shell normalises to lowercase") +T.eq(cart.label, "art/label.png", "label normalises through SafePath") +T.eq(cart.seal, "sealed", "seal defaults to sealed") +T.eq(cart.base, "red", "base survives") +T.eq(cart.engine, ">=1.4.0", "engine range is kept unevaluated") +T.eq(#cart.mods, 2, "both pins survive") +T.eq(cart.mods[1].sha256, SHA, "the github pin keeps its sha256") +T.eq(cart.mods[1].repo, "ren/rare-soda", "the github pin keeps its repo") +T.eq(cart.mods[1].version, "0.4.1", "the github pin keeps its version") +T.eq(cart.mods[1].options.flavour, "grape", "frozen option values survive") +T.eq(cart.mods[2].source, "gamebanana", "the gamebanana pin keeps its source") +T.eq(cart.mods[2].mod, 4821, "the gamebanana pin keeps its mod id") +T.eq(cart.mods[2].file, 99123, "the gamebanana pin keeps its file id") +T.eq(cart.mods[2].md5, MD5, "the gamebanana pin keeps its md5") +T.eq(cart.mods[2].sha256, nil, "a gamebanana pin carries no sha256") +T.eq(cart.load_order[1], "rare_soda", "load_order defaults to the mods order") +T.eq(cart.load_order[2], "hard_mode", "load_order defaults to the mods order") + +T.eq(raw.title, " Kanto Plus ", "parse does not trim the input in place") +T.eq(raw.shell, "#3FA9F5", "parse does not recolour the input in place") +T.eq(raw.load_order, nil, "parse does not add load_order to the input") +T.neq(cart.mods, raw.mods, "the parsed mods array is a fresh table") +T.neq(cart.mods[1].options, raw.mods[1].options, "options are copied") + +local again = CartManifest.parse(baseCart()) +T.eq(CartManifest.canonical(again), CartManifest.canonical(cart), + "two independent parses encode identically") +T.eq(CartManifest.hash(again), CartManifest.hash(cart), + "two independent parses hash identically") +T.eq(#CartManifest.hash(cart), 32, "the cart hash is an MD5 hex digest") + +local bumped = baseCart() +bumped.mods[1].version = "0.4.2" +T.neq(CartManifest.hash(CartManifest.parse(bumped)), CartManifest.hash(cart), + "a bumped mod version moves the cart hash") + +local retuned = baseCart() +retuned.mods[1].options.sweetness = 4 +T.neq(CartManifest.hash(CartManifest.parse(retuned)), CartManifest.hash(cart), + "a changed option value moves the cart hash") + +local reordered = baseCart() +reordered.load_order = { "hard_mode", "rare_soda" } +local reorderedCart = CartManifest.parse(reordered) +T.eq(reorderedCart.load_order[1], "hard_mode", "an explicit load_order is kept") +T.neq(CartManifest.hash(reorderedCart), CartManifest.hash(cart), + "a different load order moves the cart hash") + +local encoded = CartManifest.encode(cart) +local decoded, decodeErr = CartManifest.decode(encoded) +T.check(decoded ~= nil, "an encoded cart decodes: " .. tostring(decodeErr)) +T.same(decoded, cart, "the round trip is lossless") +T.eq(CartManifest.hash(decoded), CartManifest.hash(cart), + "the round trip keeps the cart hash") + +T.eq(CartManifest.decode(nil), nil, "decode refuses a non-string") +T.eq(CartManifest.decode(""), nil, "decode refuses an empty file") +T.eq(CartManifest.decode("return { }"), nil, "decode refuses an untagged file") +T.eq(CartManifest.decode('return { format = "g1rmodlist" }'), nil, + "decode refuses another format's file") +T.eq(CartManifest.decode( + ('return { format = "%s", formatVersion = 99, cart = {} }') + :format(CartManifest.FORMAT)), nil, "decode refuses an unknown schema") +T.eq(CartManifest.decode('return os.exit(1)'), nil, + "decode refuses a file that tries to call out") +T.eq(CartManifest.decode( + ('return { format = "%s", formatVersion = 1, cart = { id = "x" } }') + :format(CartManifest.FORMAT)), nil, "decode validates the cart it carries") + +rejects(function(c) c.id = nil end, "cart id", "a missing id") +rejects(function(c) c.id = "kanto plus" end, "cart id", "an id with a space") +rejects(function(c) c.id = ("k"):rep(65) end, "cart id", "a 65 character id") +rejects(function(c) c.title = nil end, "cart title", "a missing title") +rejects(function(c) c.title = " " end, "cart title", "a blank title") +rejects(function(c) c.title = ("T"):rep(49) end, "cart title", "a 49 character title") +rejects(function(c) c.version = nil end, "cart version", "a missing version") +rejects(function(c) c.version = "one" end, "cart version", "a non-semver version") +rejects(function(c) c.author = nil end, "cart author", "a missing author") +rejects(function(c) c.author = "" end, "cart author", "an empty author") +rejects(function(c) c.author = ("A"):rep(65) end, "cart author", "a 65 character author") +rejects(function(c) c.repo = "ren" end, "cart repo", "a repo with no owner") +rejects(function(c) c.repo = "ren/kanto/plus" end, "cart repo", "a three part repo") +rejects(function(c) c.summary = ("s"):rep(121) end, "cart summary", "a 121 character summary") +rejects(function(c) c.shell = nil end, "cart shell", "a missing shell colour") +rejects(function(c) c.shell = "3FA9F5" end, "cart shell", "a shell colour with no hash") +rejects(function(c) c.shell = "#3FA9F" end, "cart shell", "a five digit shell colour") +rejects(function(c) c.shell = "#gggggg" end, "cart shell", "a non-hex shell colour") +rejects(function(c) c.label = "../../etc/passwd" end, "cart label", "a climbing label path") +rejects(function(c) c.label = "/etc/passwd" end, "cart label", "an absolute label path") +rejects(function(c) c.label = ("a"):rep(129) end, "cart label", "a 129 character label path") +rejects(function(c) c.base = nil end, "cart base", "a missing base game") +rejects(function(c) c.base = "crystal" end, "cart base", "an unknown base game") +rejects(function(c) c.engine = "" end, "cart engine", "an empty engine range") +rejects(function(c) c.engine = 3 end, "cart engine", "a numeric engine range") +rejects(function(c) c.seal = "welded" end, "cart seal", "an unknown seal") +rejects(function(c) c.mods = nil end, "cart mods", "a cart with no mods array") +rejects(function(c) c.mods = {} end, "cart must pin", "a cart that pins nothing") +rejects(function(c) + for i = 1, 65 do + c.mods[i] = { id = "mod" .. i, source = "gamebanana", mod = i, file = i, md5 = MD5 } + end +end, "cart must pin", "a cart that pins 65 mods") + +rejects(function(c) c.mods[1] = "rare_soda" end, "must be a table", "a string mod entry") +rejects(function(c) c.mods[1].id = nil end, "id must be", "a pin with no id") +rejects(function(c) c.mods[1].id = "rare soda" end, "id must be", "a pin id with a space") +rejects(function(c) c.mods[2].id = "rare_soda" end, "pinned twice", "the same mod pinned twice") +rejects(function(c) c.mods[1].source = nil end, "source must be", "a pin with no source") +rejects(function(c) c.mods[1].source = "dropbox" end, "source must be", "a pin from an unknown source") +rejects(function(c) c.mods[1].repo = nil end, "repo must be", "a github pin with no repo") +rejects(function(c) c.mods[1].version = "latest" end, "version must be", "a github pin with no semver") +rejects(function(c) c.mods[1].sha256 = nil end, "sha256", "a github pin with no sha256") +rejects(function(c) c.mods[1].sha256 = SHA:upper() end, "sha256", "an uppercase sha256") +rejects(function(c) c.mods[1].sha256 = SHA:sub(1, 63) end, "sha256", "a short sha256") +rejects(function(c) c.mods[2].mod = nil end, "mod must be", "a gamebanana pin with no mod id") +rejects(function(c) c.mods[2].mod = 0 end, "mod must be", "a gamebanana mod id of zero") +rejects(function(c) c.mods[2].mod = 12.5 end, "mod must be", "a fractional gamebanana mod id") +rejects(function(c) c.mods[2].file = nil end, "file must be", "a gamebanana pin with no file id") +rejects(function(c) c.mods[2].file = -3 end, "file must be", "a negative gamebanana file id") +rejects(function(c) c.mods[2].md5 = nil end, "md5", "a gamebanana pin with no md5") +rejects(function(c) c.mods[2].md5 = MD5:upper() end, "md5", "an uppercase md5") +rejects(function(c) c.mods[2].md5 = MD5 .. "00" end, "md5", "an overlong md5") + +rejects(function(c) c.mods[1].options = "grape" end, "options must be a table", + "a non-table options block") +rejects(function(c) c.mods[1].options = { [("k"):rep(65)] = 1 } end, + "option keys", "a 65 character option key") +rejects(function(c) c.mods[1].options = { [1] = "grape" } end, + "option keys", "a numeric option key") +rejects(function(c) c.mods[1].options.nested = { 1, 2 } end, + "must be a string, number or boolean", "a table option value") +rejects(function(c) c.mods[1].options.flavour = ("g"):rep(257) end, + "characters or fewer", "a 257 character option value") +rejects(function(c) + local options = {} + for i = 1, 65 do options["opt" .. i] = i end + c.mods[1].options = options +end, "more than 64 options", "a pin with 65 options") + +rejects(function(c) c.load_order = "rare_soda" end, "load_order must be an array", + "a string load_order") +rejects(function(c) c.load_order = { "rare_soda" } end, "exactly once", + "a load_order that drops a mod") +rejects(function(c) c.load_order = { "rare_soda", "hard_mode", "hard_mode" } end, + "exactly once", "a load_order longer than the mods array") +rejects(function(c) c.load_order = { "rare_soda", "rare_soda" } end, "twice", + "a load_order that repeats a mod") +rejects(function(c) c.load_order = { "rare_soda", "master_ball" } end, + "does not pin", "a load_order naming an unpinned mod") + +T.eq(CartManifest.parse(nil), nil, "parse refuses a non-table") + +local open = baseCart() +open.seal = "open" +open.repo = nil +open.summary = nil +open.label = nil +open.engine = nil +local openCart = CartManifest.parse(open) +T.check(openCart ~= nil, "an open cart with no optional fields parses") +T.eq(openCart.seal, "open", "an open seal survives") +T.eq(openCart.label, nil, "an absent label stays absent") +T.same(CartManifest.decode(CartManifest.encode(openCart)), openCart, + "an open cart round trips") +T.neq(CartManifest.hash(openCart), CartManifest.hash(cart), + "the seal is part of the cart hash") + +T.eq(CartManifest.publishable(cart), true, + "a cart pinned entirely to github and gamebanana is publishable") +T.eq(CartManifest.publishable(nil), false, "publishable refuses a non-cart") +T.eq(CartManifest.publishable({}), false, "publishable refuses an unparsed cart") + +local localised = baseCart() +localised.mods[1] = { id = "rare_soda", source = "local", version = "0.4.1", + repo = "ren/rare-soda", sha256 = SHA, + options = { flavour = "grape" } } +local localCart, localErr = CartManifest.parse(localised) +T.check(localCart ~= nil, "a local pin parses: " .. tostring(localErr)) +T.eq(localCart.mods[1].source, "local", "the local pin keeps its source") +T.eq(localCart.mods[1].version, "0.4.1", "the local pin keeps its version") +T.eq(localCart.mods[1].repo, nil, "a local pin carries no repo") +T.eq(localCart.mods[1].sha256, nil, "a local pin carries no sha256") +T.eq(localCart.mods[1].md5, nil, "a local pin carries no md5") +T.eq(localCart.mods[1].options.flavour, "grape", "a local pin still freezes options") +T.eq(localCart.mods[2].source, "gamebanana", "the sibling pin is untouched") + +T.eq(CartManifest.canonical(CartManifest.parse(localised)), + CartManifest.canonical(localCart), "two parses of a local pin encode identically") +T.eq(CartManifest.hash(CartManifest.parse(localised)), CartManifest.hash(localCart), + "two parses of a local pin hash identically") +T.neq(CartManifest.hash(localCart), CartManifest.hash(cart), + "a local pin hashes differently from the github pin it replaced") + +local localBump = baseCart() +localBump.mods[1] = { id = "rare_soda", source = "local", version = "0.4.2", + options = { flavour = "grape" } } +T.neq(CartManifest.hash(CartManifest.parse(localBump)), CartManifest.hash(localCart), + "a bumped local pin version moves the cart hash") + +T.same(CartManifest.decode(CartManifest.encode(localCart)), localCart, + "a cart holding a local pin round trips") + +local publishableLocal, localWhy = CartManifest.publishable(localCart) +T.eq(publishableLocal, false, "a cart holding a local pin is not publishable") +T.check(type(localWhy) == "string" and localWhy:find("rare_soda", 1, true) ~= nil, + "the reason names the local pin (got " .. tostring(localWhy) .. ")") +T.check(localWhy:find("hard_mode", 1, true) == nil, + "the reason leaves the publishable pins out") + +local allLocal = baseCart() +allLocal.mods = { + { id = "rare_soda", source = "local", version = "0.4.1" }, + { id = "hard_mode", source = "local", version = "2.0.0" }, +} +local _, allWhy = CartManifest.publishable(CartManifest.parse(allLocal)) +T.check(allWhy:find("hard_mode", 1, true) ~= nil and allWhy:find("rare_soda", 1, true) ~= nil, + "the reason names every local pin (got " .. tostring(allWhy) .. ")") + +rejects(function(c) c.mods[1] = { id = "rare_soda", source = "local" } end, + "version must be", "a local pin with no version") +rejects(function(c) + c.mods[1] = { id = "rare_soda", source = "local", version = "latest" } +end, "version must be", "a local pin with a non-semver version") +rejects(function(c) c.mods[1].source = "localhost" end, "source must be", + "a source that merely starts like local") + +local VECTORS = { + { "", "" }, { "f", "Zg==" }, { "fo", "Zm8=" }, { "foo", "Zm9v" }, + { "foob", "Zm9vYg==" }, { "fooba", "Zm9vYmE=" }, { "foobar", "Zm9vYmFy" }, + { "\0\255\0", "AP8A" }, { "\255\255\255\255", "/////w==" }, +} +for _, row in ipairs(VECTORS) do + T.eq(Base64.encode(row[1]), row[2], + ("base64 encodes %q as %s"):format(row[1], row[2])) + T.eq(Base64.decode(row[2]), row[1], + ("base64 decodes %s back"):format(row[2] == "" and "an empty string" or row[2])) +end + +local seed = 7 +local function nextByte() + seed = (seed * 75 + 74) % 65537 + return seed % 256 +end +for n = 0, 24 do + local chunk = {} + for i = 1, n do chunk[i] = string.char(nextByte()) end + local raw = table.concat(chunk) + local text = Base64.encode(raw) + T.eq(#text % 4, 0, ("base64 pads %d bytes to a multiple of four"):format(n)) + T.eq(Base64.decode(text), raw, ("base64 round trips %d random bytes"):format(n)) +end + +T.eq(Base64.encode(nil), nil, "base64 encode refuses a non-string") +T.eq(Base64.decode(nil), nil, "base64 decode refuses a non-string") +T.eq(Base64.decode("TWF"), nil, "base64 refuses a length that is not a multiple of four") +T.eq(Base64.decode("TW*u"), nil, "base64 refuses a character outside the alphabet") +T.eq(Base64.decode("TWFu\n\n\n\n"), nil, "base64 refuses embedded whitespace") +T.eq(Base64.decode("TW=u"), nil, "base64 refuses padding inside a group") +T.eq(Base64.decode("=WFu"), nil, "base64 refuses a leading pad character") +T.eq(Base64.decode("TWFu===="), nil, "base64 refuses a group that is all padding") +T.eq(Base64.decode("TR=="), nil, "base64 refuses one-byte padding that carries data bits") +T.eq(Base64.decode("Zm9vYmF="), nil, "base64 refuses two-byte padding that carries data bits") +T.eq(Base64.decode("TWFu"), "Man", "base64 decodes a known vector") + +local PNG = CartManifest.PNG_SIGNATURE .. "\0\0\0\13IHDRtiny label art" +local ART_DATA = Base64.encode(PNG) + +local NONE = {} + +local function artTable(over) + local art = { name = "label.png", encoding = "base64", bytes = #PNG, + data = ART_DATA } + for key, value in pairs(over or {}) do + if value == NONE then art[key] = nil else art[key] = value end + end + return art +end + +local function bundle(body, art) + return SaveSerializer.encode({ format = CartManifest.FORMAT, + formatVersion = CartManifest.SCHEMA, cart = body, labelArt = art }) +end + +local arted = CartManifest.parse(baseCart()) +arted.labelArt = artTable() + +local artedBytes = CartManifest.encode(arted) +local artedRound, artedErr = CartManifest.decode(artedBytes) +T.check(artedRound ~= nil, "a cart with label art decodes: " .. tostring(artedErr)) +T.same(artedRound, arted, "the label art survives the encode and decode round trip") +T.eq(artedRound.labelArt.data, ART_DATA, "the base64 payload is preserved verbatim") +T.eq(artedRound.labelArt.bytes, #PNG, "the declared byte count is preserved") +T.eq(artedRound.labelArt.name, "label.png", "the art name is preserved") +T.eq(CartManifest.encode(artedRound), artedBytes, + "re-encoding a decoded cart writes the same bytes") + +local artBytes, artName = CartManifest.labelArtBytes(artedRound) +T.eq(artBytes, PNG, "labelArtBytes hands back the PNG that was packed") +T.eq(artName, "label.png", "labelArtBytes hands back the art name") +T.eq(CartManifest.labelArtBytes(cart), nil, "a cart with no art has no art bytes") + +T.eq(CartManifest.hash(arted), CartManifest.hash(cart), + "label art is not part of the cart hash") +T.check(CartManifest.canonical(arted):find(ART_DATA, 1, true) == nil, + "the canonical form leaves the art payload out") + +local repainted = CartManifest.parse(baseCart()) +local REPAINT = PNG .. "repainted" +repainted.labelArt = artTable({ data = Base64.encode(REPAINT), bytes = #REPAINT }) +T.eq(CartManifest.hash(repainted), CartManifest.hash(arted), + "changing only the art leaves the cart hash alone") +T.eq(CartManifest.labelArtBytes(CartManifest.decode(CartManifest.encode(repainted))), + REPAINT, "the repainted art round trips") + +local plain = CartManifest.decode(CartManifest.encode(cart)) +T.eq(plain.labelArt, nil, "a cart with no art still decodes without art") +T.check(CartManifest.encode(cart):find("labelArt", 1, true) == nil, + "a cart with no art writes no labelArt key") +T.same(plain, cart, "a cart with no art round trips exactly as before") + +local OVERSIZE = PNG .. string.rep("\0", CartManifest.MAX_LABEL_ART) +local OVERSIZE_DATA = Base64.encode(OVERSIZE) + +local function drops(art, what) + local decodedArt, dropErr = CartManifest.decode(bundle(cart, art)) + T.check(decodedArt ~= nil, what .. " still loads the cart: " .. tostring(dropErr)) + T.eq(decodedArt.labelArt, nil, what .. " drops the art") + T.same(decodedArt, cart, what .. " leaves the rest of the cart untouched") +end + +drops("label.png", "art that is not a table") +drops(artTable({ encoding = "hex" }), "art in an encoding we do not support") +drops(artTable({ encoding = NONE }), "art with no encoding") +drops(artTable({ data = "not base64!!" }), "art whose payload is not base64") +drops(artTable({ data = NONE }), "art with no payload") +drops(artTable({ data = "" }), "art with an empty payload") +drops(artTable({ bytes = #PNG + 1 }), "art whose byte count is too high") +drops(artTable({ bytes = #PNG - 1 }), "art whose byte count is too low") +drops(artTable({ bytes = NONE }), "art with no byte count") +drops(artTable({ bytes = tostring(#PNG) }), "art whose byte count is a string") +drops(artTable({ data = Base64.encode("GIF89a not a png at all"), + bytes = #"GIF89a not a png at all" }), "art that is not a PNG") +drops(artTable({ data = OVERSIZE_DATA, bytes = #OVERSIZE }), "art past the size cap") +drops(artTable({ name = "../../etc/passwd" }), "art whose name climbs out") +drops(artTable({ name = ("a"):rep(129) }), "art with a 129 character name") +drops(artTable({ name = 7 }), "art with a numeric name") + +local unnamed = CartManifest.decode(bundle(cart, artTable({ name = NONE }))) +T.check(unnamed ~= nil and unnamed.labelArt ~= nil, "art with no name is still kept") +T.eq(unnamed.labelArt.name, nil, "the missing art name stays missing") +T.eq(CartManifest.labelArtBytes(unnamed), PNG, "unnamed art still decodes") + +T.eq(CartManifest.parseLabelArt(nil), nil, "parseLabelArt refuses an absent payload") +local _, capErr = CartManifest.parseLabelArt( + artTable({ data = OVERSIZE_DATA, bytes = #OVERSIZE })) +T.check(type(capErr) == "string" and capErr:find("bytes or fewer", 1, true) ~= nil, + "the size cap says why (got " .. tostring(capErr) .. ")") +local _, pngErr = CartManifest.parseLabelArt( + artTable({ data = Base64.encode("nope"), bytes = 4 })) +T.check(type(pngErr) == "string" and pngErr:find("PNG", 1, true) ~= nil, + "a non-PNG payload says why (got " .. tostring(pngErr) .. ")") + +T.finish("cart_manifest") diff --git a/tests/engine/cart_saves.lua b/tests/engine/cart_saves.lua new file mode 100644 index 00000000..3b14225a --- /dev/null +++ b/tests/engine/cart_saves.lua @@ -0,0 +1,269 @@ + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +love = love or require("tests.love_stub") + +local SaveSerializer = require("src.core.SaveSerializer") +local SaveData = require("src.core.SaveData") +local GameVersion = require("src.core.GameVersion") + +local realFS = love.filesystem + +local function memfs(files) + return { + files = files, + write = function(path, content) files[path] = content return true end, + read = function(path) return files[path] end, + remove = function(path) files[path] = nil return true end, + getInfo = function(path) + if files[path] then return { type = "file" } end + return nil + end, + } +end + +local function fresh() + local files = {} + love.filesystem = memfs(files) + SaveData.resetSlotState() + GameVersion.set("red") + return files +end + +local function options(files) + return SaveSerializer.decode(files["options.lua"] or "") or {} +end + +local function plainSave(name, hash) + return { + version = "red", + meta = hash and { cartHash = hash } or nil, + player = { name = name, map = "PALLET_TOWN", x = 1, y = 1 }, + pokedex = { seen = {}, owned = {} }, + inventory = {}, + playTime = 0, + } +end + +do + fresh() + T.eq(SaveData.getCart(), nil, "no cart is active by default") + T.eq(SaveData.setCart("nuzlocke", "abc123"), "nuzlocke", "setCart returns the id") + T.eq(SaveData.getCart(), "nuzlocke", "getCart reads the active cart back") + T.eq(SaveData.getCartHash(), "abc123", "the build hash rides along") + T.eq(SaveData.setCart(nil), nil, "setCart(nil) returns to vanilla play") + T.eq(SaveData.getCart(), nil, "and getCart says so") + T.eq(SaveData.getCartHash(), nil, "clearing the cart clears its build hash") + + T.eq(SaveData.setCart("../evil"), nil, "a path-climbing cart id is refused") + T.eq(SaveData.setCart(".."), nil, "so is a bare parent reference") + T.eq(SaveData.setCart("has spaces"), nil, "so is a non-word id") + T.eq(SaveData.setCart(42), nil, "so is a non-string id") + T.eq(SaveData.getCart(), nil, "none of them become the active cart") +end + +do + local files = fresh() + T.eq(#SaveData.listCartSlots("nuzlocke"), 0, "a cart starts with no slots") + T.eq(SaveData.activeCartSlot("nuzlocke"), nil, "and no active slot") + T.eq(SaveData.slotCartHash("nuzlocke", "slot1"), nil, "and no stamped hash") + T.eq(files["options.lua"], nil, "listing an empty cart writes no options file") + + T.eq(#SaveData.listCartSlots("../evil"), 0, "an unusable cart id lists nothing") + T.eq(SaveData.createCartSlot("../evil"), nil, "and can allocate no slot") + local ok, err = SaveData.deleteCartSlot("../evil", "slot1") + T.check(not ok, "and deleting from it fails") + T.check(tostring(err):find("unknown cart", 1, true) ~= nil, + "with a user-presentable reason") +end + +do + local files = fresh() + T.eq(SaveData.createCartSlot("nuzlocke"), "slot1", "first cart slot is slot1") + T.eq(SaveData.createCartSlot("nuzlocke"), "slot2", "ids increment as they do per version") + T.eq(SaveData.setActiveCartSlot("nuzlocke", "slot2"), "slot2", + "setActiveCartSlot returns the chosen id") + T.eq(SaveData.activeCartSlot("nuzlocke"), "slot2", "and the choice is live") + + local opts = options(files) + T.eq(opts.cartSlots.nuzlocke.active, "slot2", "the active id persists in options.lua") + T.eq(opts.cartSlots.nuzlocke.list[1], "slot1", "the slot list persists with it") + T.eq(opts.cartSlots.nuzlocke.list[2], "slot2", "in allocation order") + T.eq(opts.saveSlots, nil, "no per-version registry is created by cart work") + + T.check(SaveData.renameCartSlot("nuzlocke", "slot1", " Hardcore "), + "renameCartSlot labels a registered slot") + T.eq(options(files).cartSlots.nuzlocke.names.slot1, "Hardcore", + "the label is trimmed and persisted") + T.eq(SaveData.listCartSlots("nuzlocke")[1].label, "Hardcore", + "listCartSlots carries the label") + T.check(SaveData.renameCartSlot("nuzlocke", "slot1", ""), "an empty name clears it") + T.eq(options(files).cartSlots.nuzlocke.names, nil, + "the names table leaves the registry once empty") + + local bad, badErr = SaveData.renameCartSlot("nuzlocke", "slot99", "x") + T.check(not bad, "renaming an unregistered cart slot fails") + T.check(tostring(badErr):find("not registered", 1, true) ~= nil, + "unknown-slot rename error is user-presentable") + + T.check(SaveData.writeCartSlot("nuzlocke", "slot2", plainSave("NUZ")), + "seed the active cart slot") + T.check(files["saves/cart_nuzlocke/slot2.lua"] ~= nil, + "the bytes land in the cart's own directory") + + T.check(SaveData.deleteCartSlot("nuzlocke", "slot2"), "deleteCartSlot removes it") + T.eq(files["saves/cart_nuzlocke/slot2.lua"], nil, "the slot file is gone") + opts = options(files) + T.eq(#opts.cartSlots.nuzlocke.list, 1, "the id is dropped from the registry") + T.eq(opts.cartSlots.nuzlocke.active, "slot1", + "active falls back to the remaining slot") + T.eq(SaveData.activeCartSlot("nuzlocke"), "slot1", "and the live cache follows") + + T.check(SaveData.deleteCartSlot("nuzlocke", "slot1"), "deleting the last slot works") + T.eq(#SaveData.listCartSlots("nuzlocke"), 0, "the cart is empty again") + T.eq(options(files).cartSlots.nuzlocke.active, nil, "active clears with the list") +end + +do + local files = fresh() + T.eq(SaveData.createCartSlot("alpha"), "slot1", "alpha allocates its own slot1") + T.eq(SaveData.createCartSlot("beta"), "slot1", "beta allocates its own slot1") + T.check(SaveData.writeCartSlot("alpha", "slot1", plainSave("AAA", "aaa111")), + "seed alpha's slot") + T.check(SaveData.writeCartSlot("beta", "slot1", plainSave("BBB", "bbb222")), + "seed beta's slot") + + T.eq(#SaveData.listCartSlots("alpha"), 1, "alpha lists only its own slot") + T.eq(#SaveData.listCartSlots("beta"), 1, "beta lists only its own slot") + T.eq(SaveData.listCartSlots("alpha")[1].name, "AAA", "alpha reads its own save") + T.eq(SaveData.listCartSlots("beta")[1].name, "BBB", "beta reads its own save") + T.check(files["saves/cart_alpha/slot1.lua"] ~= files["saves/cart_beta/slot1.lua"], + "two carts with the same slot id write different files") + T.eq(SaveData.slotCartHash("alpha", "slot1"), "aaa111", "alpha's build stamp") + T.eq(SaveData.slotCartHash("beta", "slot1"), "bbb222", "beta's build stamp") + + T.check(SaveData.deleteCartSlot("alpha", "slot1"), "delete alpha's only slot") + T.eq(#SaveData.listCartSlots("alpha"), 0, "alpha is empty") + T.eq(#SaveData.listCartSlots("beta"), 1, "beta is untouched") + T.check(files["saves/cart_beta/slot1.lua"] ~= nil, "beta's file survives") + T.eq(SaveData.slotCartHash("beta", "slot1"), "bbb222", "as does its stamp") +end + +do + local files = fresh() + T.eq(SaveData.createSlot("red"), "slot1", "red allocates a version slot") + T.eq(SaveData.createCartSlot("red"), "slot1", + "a cart may even be named after a version") + T.check(SaveData.writeSlot("red", "slot1", plainSave("VANILLA")), + "seed the version slot") + T.check(SaveData.writeCartSlot("red", "slot1", plainSave("CARTRED")), + "seed the cart slot") + + T.eq(#SaveData.listSlots("red"), 1, "the version lists only its own slot") + T.eq(SaveData.listSlots("red")[1].name, "VANILLA", "with the vanilla save in it") + T.eq(#SaveData.listCartSlots("red"), 1, "the cart lists only its own slot") + T.eq(SaveData.listCartSlots("red")[1].name, "CARTRED", "with the cart save in it") + T.check(files["saves/red/slot1.lua"] ~= nil, "the version path is saves/red/") + T.check(files["saves/cart_red/slot1.lua"] ~= nil, "the cart path is saves/cart_red/") + T.eq(SaveData.listSlots("red")[1].cartHash, nil, + "a version slot carries no cart hash") + + T.check(SaveData.deleteCartSlot("red", "slot1"), "uninstall-style cart slot delete") + T.eq(#SaveData.listSlots("red"), 1, "the vanilla slot is still registered") + T.check(files["saves/red/slot1.lua"] ~= nil, "and its file is not orphaned") + T.eq(options(files).saveSlots.red.list[1], "slot1", + "the version registry is independent of the cart one") +end + +do + local files = fresh() + SaveData.setCart("nuzlocke", "abc123") + T.eq(SaveData.saveFilename("red"), "save_cart_nuzlocke.lua", + "with no cart slot yet, the flat path follows the version suffix scheme") + + SaveData.createCartSlot("nuzlocke") + SaveData.setActiveCartSlot("nuzlocke", "slot1") + T.eq(SaveData.saveFilename("red"), "saves/cart_nuzlocke/slot1.lua", + "the active cart slot owns the save path") + + local save = SaveData.newGame() + save.player.name = "NUZ" + T.check(SaveData.save(save, {}), "an in-game save under a cart writes") + T.check(files["saves/cart_nuzlocke/slot1.lua"] ~= nil, "into the cart's slot") + T.eq(files["save.lua"], nil, "never into the base game's flat file") + T.eq(files["saves/red/slot1.lua"], nil, "never into the base game's slot") + T.eq(#SaveData.listSlots("red"), 0, "and the base game still has no slots") + + local loaded = SaveData.load("red") + T.check(loaded and loaded.player.name == "NUZ", "load reads the cart's slot back") + T.eq(loaded.meta.cartHash, "abc123", "the save records the build it was made under") + T.eq(SaveData.slotCartHash("nuzlocke", "slot1"), "abc123", + "and the registry mirrors it for a listing with no save decode") + T.eq(SaveData.listCartSlots("nuzlocke")[1].cartHash, "abc123", + "listCartSlots surfaces the stamp") +end + +do + fresh() + SaveData.setCart("nuzlocke", "abc123") + SaveData.createCartSlot("nuzlocke") + SaveData.setActiveCartSlot("nuzlocke", "slot1") + T.check(SaveData.save(SaveData.newGame(), {}), "first save under build abc123") + + local loaded = SaveData.load("red") + T.check(SaveData.save(loaded, {}), "a re-save rebuilds meta") + T.eq(SaveData.load("red").meta.cartHash, "abc123", + "buildMeta carries the stamp instead of dropping it") + + SaveData.setCartHash("def456") + T.eq(SaveData.slotCartHash("nuzlocke", "slot1"), "abc123", + "installing an update does not restamp the slot") + loaded = SaveData.load("red") + T.eq(loaded.meta.cartHash, "abc123", "nor the in-progress save") + T.check(SaveData.save(loaded, {}), "save under the new build") + T.eq(SaveData.load("red").meta.cartHash, "def456", "now the save carries it") + T.eq(SaveData.slotCartHash("nuzlocke", "slot1"), "def456", "and so does the registry") + + local ok, err = SaveData.setSlotCartHash("nuzlocke", "slot9", "zzz") + T.check(not ok, "an unregistered slot cannot be stamped") + T.check(tostring(err):find("not registered", 1, true) ~= nil, + "with a user-presentable reason") +end + +do + local files = fresh() + SaveData.createSlot("red") + SaveData.setActiveSlot("red", "slot1") + local save = SaveData.newGame() + save.player.name = "VANILLA" + T.check(SaveData.save(save, {}), "a vanilla save with no cart set") + + local bytes = files["saves/red/slot1.lua"] + T.check(bytes:find("cartHash", 1, true) == nil, "records no cartHash") + T.check(files["options.lua"]:find("cartSlots", 1, true) == nil, + "and options.lua grows no cart registry") + T.eq(options(files).cartSlots, nil, "which decodes as absent, not empty") + + local loaded = SaveData.load("red") + T.check(SaveData.save(loaded), "re-save the migrated shape once") + local before = files["saves/red/slot1.lua"] + SaveData.setCart("nuzlocke", "abc123") + T.eq(SaveData.saveFilename("red"), "save_cart_nuzlocke.lua", + "the cart takes over the path while it is active") + SaveData.setCart(nil) + T.eq(SaveData.saveFilename("red"), "saves/red/slot1.lua", + "and hands it straight back") + T.check(SaveData.save(loaded), "re-save after the cart round trip") + T.eq(files["saves/red/slot1.lua"], before, "the vanilla bytes are identical") + T.check(files["options.lua"]:find("cartSlots", 1, true) == nil, + "and options.lua still carries no cart registry") + + local again = SaveData.load("red") + T.check(again and again.player.name == "VANILLA", "the vanilla save still loads") + T.eq(again.meta.cartHash, nil, "with no cart stamp on it") +end + +love.filesystem = realFS + +T.finish("cart_saves") diff --git a/tests/engine/cart_seal.lua b/tests/engine/cart_seal.lua new file mode 100644 index 00000000..d0edfa0e --- /dev/null +++ b/tests/engine/cart_seal.lua @@ -0,0 +1,470 @@ +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +love = love or require("tests.love_stub") + +local Loader = require("src.mods.Loader") +local CartManifest = require("src.carts.CartManifest") +local SaveData = require("src.core.SaveData") +local SaveSerializer = require("src.core.SaveSerializer") +local GameVersion = require("src.core.GameVersion") + +local realFS = love.filesystem + +local function memfs(files) + local fs + fs = { + files = files, + read = function(path) return files[path] end, + write = function(path, content) files[path] = content return true end, + remove = function(path) files[path] = nil return true end, + getInfo = function(path) + if files[path] then return { type = "file" } end + local prefix = path .. "/" + for key in pairs(files) do + if key:sub(1, #prefix) == prefix then return { type = "directory" } end + end + return nil + end, + load = function(path) + if not files[path] then return nil, "no file: " .. path end + return load(files[path], path) + end, + createDirectory = function() return true end, + getDirectoryItems = function(path) + local seen, items = {}, {} + local prefix = path .. "/" + for key in pairs(files) do + if key:sub(1, #prefix) == prefix then + local child = key:sub(#prefix + 1):match("^[^/]+") + if child and not seen[child] then + seen[child] = true + items[#items + 1] = child + end + end + end + table.sort(items) + return items + end, + } + return fs +end + +local function manifestJson(id) + return ([[{"id":"%s","name":"%s","version":"1.0.0","entry":"main.lua"}]]) + :format(id, id) +end + +local function entry(record) + return ([[ +return function(mod) + mod.options:define({ { key = "tint", default = "base" } }) + mod.content.pokemon:register("%s", { name = tostring(mod.options:get("tint")) }) +end +]]):format(record) +end + +local function install() + local files = { + ["options.lua"] = SaveSerializer.encode({ + mods = { beta = false }, + modOptions = { alpha = { tint = "player" }, beta = { tint = "player" } }, + }), + } + for _, id in ipairs({ "alpha", "beta", "gamma" }) do + files["mods/" .. id .. "/manifest.json"] = manifestJson(id) + files["mods/" .. id .. "/main.lua"] = entry(id:upper()) + end + SaveData.resetSlotState() + GameVersion.set("red") + return files +end + +local function writeCart(files, tbl) + local cart, err = CartManifest.parse(tbl) + assert(cart, err) + files["carts/" .. tbl.id .. CartManifest.EXT] = CartManifest.encode(cart) + return cart +end + +local function cartTable(id, seal, mods, order) + return { id = id, title = id, version = "1.0.0", author = "tester", + shell = "#102030", base = "red", seal = seal, + mods = mods, load_order = order } +end + +local function pin(id, version, options) + return { id = id, source = "local", version = version or "1.0.0", + options = options } +end + +local function boot(files) + local data = { pokemon = {} } + local loader = Loader.new({ fs = memfs(files) }) + local ok = loader:load(data) + return loader, data, ok +end + +local function options(files) + return SaveSerializer.decode(files["options.lua"] or "") or {} +end + +local function names(list) + return table.concat(list, ",") +end + +-- ------- a sealed cart loads its pins, in its order, with its options + +do + local files = install() + writeCart(files, cartTable("sealed", "sealed", + { pin("alpha", "1.0.0", { tint = "cart" }), pin("beta") }, + { "beta", "alpha" })) + SaveData.setCart("sealed", "hash1") + + local loader, data, ok = boot(files) + T.check(ok, "a sealed cart whose pins are all installed loads cleanly") + T.eq(names(loader.order), "beta,alpha", + "the cart's load_order beats priority and the id tie-break") + T.eq(data.pokemon.ALPHA.name, "cart", + "a frozen option overrides the player's saved value") + T.eq(data.pokemon.BETA.name, "base", + "a pin that froze no options falls to the schema default, not the player's") + T.eq(data.pokemon.GAMMA, nil, "an enabled mod the cart does not pin never runs") + T.eq(loader.mods.gamma.enabled, false, "and is reported as inactive") + T.eq(loader.mods.gamma.state, "disabled", "with the disabled row state") + T.eq(loader.mods.beta.enabled, true, "a pin the player switched off still loads") + + local report = loader:cartStatus() + T.eq(report.id, "sealed", "the report names the cart") + T.eq(report.seal, "sealed", "and its seal") + T.eq(report.enforced, true, "which is enforced") + T.eq(report.refused, false, "and not refused") + T.eq(#report.missing, 0, "with no missing pins") + T.eq(#report.mismatched, 0, "and no version mismatches") + T.eq(loader:status().cart, report, "status() carries the same report") + + local opts = options(files) + T.eq(SaveData.modEnabled(opts, "beta", "red"), false, + "the player's disable flag is untouched on disk") + T.eq(SaveData.modEnabled(opts, "gamma", "red") == false, false, + "and so is the enable flag of the mod the seal left out") + T.eq(opts.modOptions.alpha.tint, "player", + "the frozen option never overwrote the player's saved value") + T.eq(opts.modOptions.beta.tint, "player", "for any pinned mod") +end + +-- ------- an open cart layers the player's mods on top + +do + local files = install() + writeCart(files, cartTable("open", "open", + { pin("beta", "1.0.0", { tint = "cart" }), pin("gamma", "1.0.0", { tint = "cart" }) }, + { "beta", "gamma" })) + SaveData.setCart("open", "hash2") + + local loader, data, ok = boot(files) + T.check(ok, "an open cart loads") + T.eq(names(loader.order), "beta,gamma,alpha", + "the cart's mods come first in its order, then the player's own") + T.eq(data.pokemon.BETA.name, "player", + "an open cart's option is a starting value the player's own setting beats") + T.eq(data.pokemon.GAMMA.name, "cart", + "and it stands where the player set nothing") + T.eq(data.pokemon.ALPHA.name, "player", "the player's extra mod loads normally") + T.eq(loader:cartStatus().enforced, false, "an open cart enforces nothing") +end + +-- ------- a missing pin: refusal when sealed, warning when open + +do + local files = install() + writeCart(files, cartTable("gap", "sealed", + { pin("alpha"), pin("delta", "2.0.0") }, { "alpha", "delta" })) + SaveData.setCart("gap", "hash3") + + local loader, data, ok = boot(files) + T.check(not ok, "a sealed cart with an uninstalled pin fails the load") + T.eq(#loader.order, 0, "and plays no subset of itself") + T.eq(data.pokemon.ALPHA, nil, "not even the pin that is installed") + T.eq(data.pokemon.GAMMA, nil, "and certainly not the player's own mods") + + local report = loader:cartStatus() + T.eq(report.refused, true, "the report refuses the cart") + T.eq(#report.missing, 1, "naming one missing pin") + T.eq(report.missing[1].id, "delta", "by id") + T.eq(report.missing[1].version, "2.0.0", "and by the version it pins") + T.eq(report.missing[1].source, "local", "with the source it would come from") + T.check(report.message:find("delta 2.0.0 is not installed", 1, true) ~= nil, + "and a message the launcher can show") + T.eq(loader.errors[1], report.message, "the refusal is on the boot error list") + + local opts = options(files) + T.eq(SaveData.modEnabled(opts, "beta", "red"), false, + "a refusal still leaves the player's flags alone") +end + +do + local files = install() + writeCart(files, cartTable("gap", "open", + { pin("alpha"), pin("delta", "2.0.0") }, { "alpha", "delta" })) + SaveData.setCart("gap", "hash4") + + local loader, data, ok = boot(files) + T.check(ok, "an open cart with an uninstalled pin still loads") + T.eq(names(loader.order), "alpha,gamma", "with the pins it does have, then the rest") + T.eq(data.pokemon.ALPHA.name, "player", "the surviving pin runs") + local report = loader:cartStatus() + T.eq(report.refused, false, "the missing pin is a warning, not a refusal") + T.eq(report.missing[1].id, "delta", "and is still reported by id") +end + +-- ------- a pin installed at another version + +do + local files = install() + writeCart(files, cartTable("skew", "sealed", + { pin("alpha", "2.0.0") }, { "alpha" })) + SaveData.setCart("skew", "hash5") + + local loader, _, ok = boot(files) + T.check(not ok, "a sealed cart refuses a pin installed at another version") + T.eq(#loader.order, 0, "and loads nothing") + local report = loader:cartStatus() + T.eq(report.mismatched[1].id, "alpha", "the mismatch names the mod") + T.eq(report.mismatched[1].version, "2.0.0", "the version the cart pins") + T.eq(report.mismatched[1].installed, "1.0.0", "and the version installed") + T.check(report.message:find("alpha is pinned at 2.0.0 but 1.0.0 is installed", + 1, true) ~= nil, "with a message the launcher can show") +end + +do + local files = install() + writeCart(files, cartTable("skew", "open", + { pin("alpha", "2.0.0") }, { "alpha" })) + SaveData.setCart("skew", "hash6") + + local loader, data, ok = boot(files) + T.check(ok, "an open cart warns about a version skew instead of refusing") + T.eq(data.pokemon.ALPHA.name, "player", "and loads the version that is there") + T.eq(loader:cartStatus().mismatched[1].installed, "1.0.0", "while reporting it") +end + +-- ------- an unreadable cart + +do + local files = install() + SaveData.setCart("ghost", "hash7") + local loader, data, ok = boot(files) + T.check(not ok, "a cart that is not installed cannot be played as that cart") + T.eq(data.pokemon.GAMMA, nil, "so nothing loads under its name") + T.check(loader:cartStatus().message:find("ghost", 1, true) ~= nil, + "and the report names the cart that went missing") +end + +-- ------- breaking the seal downgrades a sealed cart to the open answer + +do + local files = install() + writeCart(files, cartTable("sealed", "sealed", + { pin("beta", "1.0.0", { tint = "cart" }), pin("delta", "2.0.0") }, + { "beta", "delta" })) + SaveData.setCart("sealed", "hash8") + SaveData.breakSeal() + + local loader, data, ok = boot(files) + T.check(ok, "a broken seal no longer refuses over a missing pin") + T.eq(names(loader.order), "beta,alpha,gamma", + "the player's own mods load alongside the cart's") + T.eq(data.pokemon.BETA.name, "player", + "and the player's option values come back with them") + local report = loader:cartStatus() + T.eq(report.broken, true, "the report says the seal is broken") + T.eq(report.enforced, false, "so the seal enforces nothing") +end + +-- ------- vanilla is untouched when no cart is active + +do + local files = install() + SaveData.resetSlotState() + local loader, data, ok = boot(files) + T.check(ok, "a vanilla boot with no cart loads") + T.eq(loader:cartStatus(), nil, "and reports no cart at all") + T.eq(names(loader.order), "alpha,gamma", "with the player's enabled set, in id order") + T.eq(data.pokemon.ALPHA.name, "player", "and the player's option values") + T.eq(data.pokemon.BETA, nil, "the mod the player switched off stays off") +end + +-- ------- planCart on its own + +do + local report = Loader.planCart(nil, {}) + T.eq(report.refused, true, "planCart refuses a cart it was handed nothing for") + T.check(report.message:find("not installed", 1, true) ~= nil, + "with a presentable reason") + + local unpinned = Loader.planCart( + cartTable("c", "sealed", { pin("gamma", "0.0.0") }, { "gamma" }), + { { id = "gamma", version = "whatever" } }) + T.eq(#unpinned.mismatched, 0, + "a local pin captured with no semantic version makes no version claim") + T.eq(unpinned.refused, false, "so it cannot refuse over one") + + local skew = Loader.planCart( + cartTable("c", "sealed", { pin("gamma", "1.0.0") }, { "gamma" }), + { gamma = { manifest = { id = "gamma", version = "1.0.0-beta" } } }) + T.eq(skew.mismatched[1].installed, "1.0.0-beta", + "a prerelease is a different version to a sealed cart") + + local broken = Loader.planCart( + cartTable("c", "sealed", { pin("gamma", "1.0.0") }, { "gamma" }), {}, true) + T.eq(broken.refused, false, "a broken seal downgrades the refusal to a warning") + T.eq(broken.missing[1].id, "gamma", "while still reporting the missing pin") +end + +-- ------- the broken-seal stamp + +local function plainSave(name) + return { + version = "red", + player = { name = name, map = "PALLET_TOWN", x = 1, y = 1 }, + pokedex = { seen = {}, owned = {} }, + inventory = {}, + playTime = 0, + } +end + +do + local files = {} + love.filesystem = memfs(files) + SaveData.resetSlotState() + GameVersion.set("red") + + T.eq(SaveData.isSealBroken(), false, "a fresh session has no broken seal") + local save = plainSave("INTACT") + T.eq(SaveData.isSealBroken(save), false, "and neither does a fresh save") + T.check(SaveData.save(save, {}), "write a save under an intact seal") + T.eq(SaveData.load("red").meta.sealBroken, nil, "which carries no stamp") + + local loaded = SaveData.load("red") + T.check(SaveData.breakSeal(loaded), "breaking the seal stamps the save") + T.eq(SaveData.isSealBroken(loaded), true, "the save reads back as modified") + T.eq(SaveData.isSealBroken(), true, "and the session is armed") + T.check(SaveData.save(loaded, {}), "save the stamped file") + T.eq(SaveData.load("red").meta.sealBroken, true, + "the stamp survives a save/load round trip") + + local again = SaveData.load("red") + T.check(SaveData.save(again, {}), "re-save with a rebuilt meta stamp") + T.eq(SaveData.load("red").meta.sealBroken, true, "buildMeta carries the stamp") + + T.eq(SaveData.unbreakSeal, nil, "there is no public unset") + T.eq(SaveData.clearSeal, nil, "under any spelling") + T.eq(SaveData.setSealBroken, nil, "and no setter that takes a value") + T.check(SaveData.breakSeal(again, false), "the setter takes no argument that clears") + T.eq(SaveData.isSealBroken(again), true, "so the stamp is still there") + + SaveData.resetSlotState() + T.eq(SaveData.isSealBroken(), false, "a new session starts unarmed") + local reread = SaveData.load("red") + T.eq(reread.meta.sealBroken, true, "but the file it stamped is modified for good") + T.check(SaveData.save(reread, {}), "and re-saving it under a fresh session") + T.eq(SaveData.load("red").meta.sealBroken, true, "does not un-modify it") + + local fresh = plainSave("FRESH") + T.check(SaveData.save(fresh, {}), "a save written while the session is unarmed") + T.eq(SaveData.load("red").meta.sealBroken, nil, "carries no stamp of its own") +end + +-- ------- the durable per-slot broken mark + +do + local files = {} + love.filesystem = memfs(files) + SaveData.resetSlotState() + GameVersion.set("red") + + local first = SaveData.createCartSlot("kanto") + T.eq(first, "slot1", "a cart's first save slot") + T.eq(SaveData.slotSealBroken("kanto", first), false, "starts sealed") + T.eq(SaveData.listCartSlots("kanto")[1].sealBroken, false, + "which its launcher row reports without loading a save") + + T.check(SaveData.markSlotSealBroken("kanto", first), "break that slot's seal") + T.eq(SaveData.slotSealBroken("kanto", first), true, "the slot reads as broken") + T.eq(SaveData.listCartSlots("kanto")[1].sealBroken, true, + "and the launcher row carries it") + + SaveData.resetSlotState() + T.eq(SaveData.slotSealBroken("kanto", first), true, + "the mark survives a restart") + + local second = SaveData.createCartSlot("kanto") + T.eq(SaveData.slotSealBroken("kanto", second), false, + "a new slot under the same cart starts sealed again") + + T.eq(SaveData.clearSlotSealBroken, nil, "there is no public unset") + T.eq(SaveData.unmarkSlotSealBroken, nil, "under any spelling") + T.eq(SaveData.setSlotSealBroken, nil, "and no setter that takes a value") + T.check(SaveData.markSlotSealBroken("kanto", first, false), + "the setter takes no argument that clears") + T.eq(SaveData.slotSealBroken("kanto", first), true, "so the mark stands") + T.eq(SaveData.markSlotSealBroken("kanto", "slot9"), false, + "a slot that is not registered cannot be marked") + + SaveData.setCart("kanto", "hash9") + SaveData.setActiveCartSlot("kanto", second) + T.eq(SaveData.adoptCartSeal("kanto"), false, + "booting an unmarked slot leaves the session sealed") + T.eq(SaveData.isSealBroken(), false, "so the loader still enforces the cart") + SaveData.setActiveCartSlot("kanto", first) + T.eq(SaveData.adoptCartSeal("kanto"), true, + "booting the marked slot breaks the seal for the session") + T.eq(SaveData.isSealBroken(), true, "which is what the loader reads") + + SaveData.deleteCartSlot("kanto", first) + T.eq(SaveData.slotSealBroken("kanto", first), false, + "deleting the playthrough takes its mark with it") +end + +-- ------- a marked slot loads the cart's pins first, then the player's mods + +do + local files = install() + writeCart(files, cartTable("marked", "sealed", + { pin("beta", "1.0.0", { tint = "cart" }), pin("delta", "2.0.0") }, + { "beta", "delta" })) + love.filesystem = memfs(files) + SaveData.resetSlotState() + GameVersion.set("red") + SaveData.setCart("marked", "hash10") + local slot = SaveData.createCartSlot("marked") + SaveData.setActiveCartSlot("marked", slot) + + local intact, _, intactOk = boot(files) + T.check(not intactOk, "an unmarked slot still refuses the missing pin") + T.eq(intact:cartStatus().refused, true, "with the refusal on its report") + + SaveData.resetSlotState() + SaveData.setCart("marked", "hash10") + T.check(SaveData.markSlotSealBroken("marked", slot), "mark that slot broken") + T.check(SaveData.adoptCartSeal("marked"), "boot adopts the mark") + + local loader, data, ok = boot(files) + T.check(ok, "and the cart loads") + T.eq(names(loader.order), "beta,alpha,gamma", + "the cart's pins load first, then the player's own enabled mods") + T.eq(data.pokemon.BETA.name, "player", + "with the player's own option values back") + T.eq(loader:cartStatus().broken, true, "the report says the seal is broken") + + local stamped = plainSave("BROKEN") + T.check(SaveData.save(stamped, {}), "a save written under the adopted mark") + T.eq(SaveData.load("red").meta.sealBroken, true, + "carries the save's own permanent stamp") +end + +love.filesystem = realFS + +T.finish("cart_seal") diff --git a/tests/engine/cart_store.lua b/tests/engine/cart_store.lua new file mode 100644 index 00000000..6eea56b0 --- /dev/null +++ b/tests/engine/cart_store.lua @@ -0,0 +1,393 @@ +package.path = "./?.lua;./?/init.lua;" .. package.path + +if not rawget(_G, "bit") and not rawget(_G, "bit32") then + local ok, bit32 = pcall(require, "bit32") + if ok then _G.bit32 = bit32 end +end + +local T = require("tests.harness") +love = love or require("tests.love_stub") + +local Base64 = require("src.core.Base64") +local SaveData = require("src.core.SaveData") +local CartManifest = require("src.carts.CartManifest") +local CartStore = require("src.carts.CartStore") + +local SHA = ("a1b2c3d4"):rep(8) +local SHA2 = ("beefcafe"):rep(8) +local MD5 = ("0123456789abcdef"):rep(2) + +local function memfs() + local files, dirs = {}, {} + local fs + fs = { + files = files, + write = function(path, body) files[path] = body return true end, + read = function(path) return files[path] end, + remove = function(path) files[path] = nil return true end, + createDirectory = function(path) dirs[path] = true return true end, + getInfo = function(path) + if files[path] ~= nil then return { type = "file" } end + if dirs[path] then return { type = "directory" } end + for name in pairs(files) do + if name:sub(1, #path + 1) == path .. "/" then return { type = "directory" } end + end + return nil + end, + getDirectoryItems = function(path) + local prefix = (path == "" or path == nil) and "" or (path .. "/") + local out, seen = {}, {} + for name in pairs(files) do + if name:sub(1, #prefix) == prefix then + local child = name:sub(#prefix + 1):match("^([^/]+)") + if child and not seen[child] then + seen[child] = true + out[#out + 1] = child + end + end + end + table.sort(out) + return out + end, + } + return fs +end + +local function cartTable(over) + local tbl = { + id = "kanto_plus", + title = "Kanto Plus", + version = "1.2.0", + author = "Ren", + shell = "#3fa9f5", + base = "red", + seal = "sealed", + mods = { + { id = "rare_soda", source = "github", repo = "ren/rare-soda", + version = "0.4.1", sha256 = SHA, + options = { flavour = "grape", sweetness = 3 } }, + { id = "hard_mode", source = "gamebanana", mod = 4821, file = 99123, + md5 = MD5 }, + }, + } + for key, value in pairs(over or {}) do tbl[key] = value end + return tbl +end + +local function bytesOf(over) + local cart, err = CartManifest.parse(cartTable(over)) + if not cart then error("fixture does not parse: " .. tostring(err)) end + return CartManifest.encode(cart), cart +end + +local fs = memfs() +local bytes, fixture = bytesOf() +local installed, hash = CartStore.install(bytes, fs) +T.check(installed ~= nil, "a good cart installs: " .. tostring(hash)) +T.eq(installed.id, "kanto_plus", "install returns the parsed cart") +T.eq(hash, CartManifest.hash(fixture), "install returns the cart hash") +T.check(fs.files["carts/kanto_plus.g1rcart"] ~= nil, + "install writes carts/.g1rcart") + +local reg = SaveData.loadOptions(fs).carts +T.check(type(reg) == "table" and type(reg.kanto_plus) == "table", + "install registers the cart in options.carts") +T.eq(reg.kanto_plus.title, "Kanto Plus", "the registry carries the title") +T.eq(reg.kanto_plus.base, "red", "the registry carries the base game") +T.eq(reg.kanto_plus.version, "1.2.0", "the registry carries the cart version") +T.eq(reg.kanto_plus.hash, hash, "the registry carries the cart hash") +T.eq(reg.kanto_plus.file, "carts/kanto_plus.g1rcart", + "the registry names the cart file") + +local index = CartStore.index(fs) +T.eq(#index, 1, "index lists the registry without reading the files") +T.eq(index[1].base, "red", "an index row carries the base game") + +local rows = CartStore.list(fs) +T.eq(#rows, 1, "list returns the installed cart") +T.eq(rows[1].id, "kanto_plus", "the row names the cart") +T.eq(rows[1].base, "red", "the row carries the base") +T.eq(rows[1].cartHash, hash, "the row carries the cart hash") +T.check(type(rows[1].cart) == "table" and rows[1].cart.mods ~= nil, + "the row carries the parsed cart") +T.eq(rows[1].cart.mods[1].sha256, SHA, "the parsed cart keeps its pins") + +local got, gotHash = CartStore.get("kanto_plus", fs) +T.check(got ~= nil, "get returns the cart") +T.eq(gotHash, hash, "get returns the cart hash") +T.same(got, fixture, "get returns exactly what was installed") +T.eq(CartStore.get("nothing_here", fs), nil, "get refuses an unknown id") +T.eq(CartStore.get("../etc/passwd", fs), nil, "get refuses a climbing id") + +local exported, exportHash = CartStore.export("kanto_plus", fs) +T.check(type(exported) == "string", "export hands back bytes") +T.eq(exportHash, hash, "export reports the cart hash") +T.same(CartManifest.decode(exported), fixture, "the exported bytes decode back") +T.eq(CartStore.export("nothing_here", fs), nil, "export refuses an unknown id") + +local blueBytes = bytesOf({ id = "johto_lite", title = "Aaa Johto Lite", + base = "blue" }) +T.check(CartStore.install(blueBytes, fs) ~= nil, "a blue cart installs") +T.eq(#CartStore.list(fs), 2, "list returns both carts") +T.eq(CartStore.list(fs)[1].id, "johto_lite", "list sorts by title") +T.eq(#CartStore.listFor("red", fs), 1, "listFor red returns one cart") +T.eq(CartStore.listFor("red", fs)[1].id, "kanto_plus", "listFor red picks the red cart") +T.eq(#CartStore.listFor("blue", fs), 1, "listFor blue returns one cart") +T.eq(#CartStore.listFor("yellow", fs), 0, "listFor yellow returns nothing") + +local newer, newerErr = CartStore.install( + bytesOf({ version = "1.3.0", title = "Kanto Plus" }), fs) +T.check(newer ~= nil, "a newer cart replaces the installed one: " .. tostring(newerErr)) +T.eq(CartStore.get("kanto_plus", fs).version, "1.3.0", + "the newer version is what is installed") +T.eq(#CartStore.list(fs), 2, "replacing does not add a second row") +T.eq(SaveData.loadOptions(fs).carts.kanto_plus.version, "1.3.0", + "the registry follows the replacement") + +local same, sameErr = CartStore.install(bytesOf({ version = "1.3.0" }), fs) +T.check(same ~= nil, "the same version reinstalls: " .. tostring(sameErr)) + +local older, olderErr = CartStore.install(bytesOf({ version = "1.1.0" }), fs) +T.eq(older, nil, "an older cart is refused") +T.check(type(olderErr) == "string" and olderErr:find("older", 1, true) ~= nil, + "the refusal says why (got " .. tostring(olderErr) .. ")") +T.eq(CartStore.get("kanto_plus", fs).version, "1.3.0", + "the refused install leaves the newer cart in place") + +T.eq(CartStore.install("return { }", fs), nil, "install refuses an untagged file") +T.eq(CartStore.install(nil, fs), nil, "install refuses a non-string") +T.eq(CartStore.install("\1\2\3 not lua", fs), nil, "install refuses noise") + +fs.files["saves/cart_kanto_plus/slot1.lua"] = "return { player = { name = \"RED\" } }" +local opts = SaveData.loadOptions(fs) +opts.cartSlots = { kanto_plus = { list = { "slot1" }, active = "slot1" } } +SaveData.saveOptions(opts, fs) + +T.check(CartStore.uninstall("kanto_plus", fs), "uninstall reports success") +T.eq(fs.files["carts/kanto_plus.g1rcart"], nil, "uninstall removes the cart file") +T.eq(SaveData.loadOptions(fs).carts.kanto_plus, nil, + "uninstall clears the registry entry") +T.eq(#CartStore.list(fs), 1, "the uninstalled cart is gone from the list") +T.check(fs.files["saves/cart_kanto_plus/slot1.lua"] ~= nil, + "uninstall leaves the cart's save file alone") +local slots = SaveData.loadOptions(fs).cartSlots +T.check(type(slots) == "table" and type(slots.kanto_plus) == "table", + "uninstall leaves the cart's slot registry alone") +T.eq(slots.kanto_plus.active, "slot1", "the active slot survives an uninstall") + +local gone, goneErr = CartStore.uninstall("kanto_plus", fs) +T.eq(gone, nil, "uninstalling twice is refused") +T.check(type(goneErr) == "string" and goneErr:find("not installed", 1, true) ~= nil, + "the second uninstall says why (got " .. tostring(goneErr) .. ")") +T.eq(CartStore.uninstall("../etc/passwd", fs), nil, "uninstall refuses a climbing id") + +T.check(CartStore.install(bytes, fs) ~= nil, "the cart reinstalls after removal") +T.same(CartStore.get("kanto_plus", fs), fixture, "reinstalling restores the cart") +T.check(fs.files["saves/cart_kanto_plus/slot1.lua"] ~= nil, + "the old playthrough is still there for the reinstalled cart") + +fs.files["carts/kanto_plus.g1rcart"] = "return { format = \"nonsense\" }" +local damaged = CartStore.list(fs) +T.eq(#damaged, 1, "a corrupt cart file is skipped and the rest still list") +T.eq(damaged[1].id, "johto_lite", "the healthy cart survives a corrupt sibling") +T.check(fs.files["carts/kanto_plus.g1rcart"] ~= nil, + "listing never deletes the file it could not read") +T.eq(CartStore.get("kanto_plus", fs), nil, "get reports the corrupt cart as unreadable") +fs.files["carts/kanto_plus.g1rcart"] = nil + +opts = SaveData.loadOptions(fs) +opts.carts = opts.carts or {} +opts.carts.ghost = { id = "ghost", title = "Ghost", base = "red", + version = "1.0.0", file = "carts/ghost.g1rcart" } +SaveData.saveOptions(opts, fs) +local haunted = CartStore.list(fs) +T.eq(#haunted, 1, "a registry entry with no file is skipped") +T.eq(haunted[1].id, "johto_lite", "the rest of the list still comes back") +T.eq(SaveData.loadOptions(fs).carts.ghost, nil, + "listing prunes the registry entry whose file is gone") + +local strayCart = select(2, bytesOf({ id = "wanderer", title = "Zzz Wanderer" })) +fs.files["carts/wanderer.g1rcart"] = CartManifest.encode(strayCart) +local adopted = CartStore.list(fs) +T.eq(#adopted, 2, "a cart file with no registry entry is still listed") +T.eq(adopted[2].id, "wanderer", "the stray cart sorts in by title") +T.eq(adopted[2].cartHash, CartManifest.hash(strayCart), + "the stray cart is hashed from its own file") +T.check(SaveData.loadOptions(fs).carts.wanderer ~= nil, + "listing registers the stray cart it adopted") + +fs.files["carts/readme.txt"] = "hello" +fs.files["carts/half written.g1rcart"] = "return { }" +T.eq(#CartStore.list(fs), 2, "junk in carts/ is ignored") + +local empty = memfs() +T.eq(#CartStore.list(empty), 0, "a fresh install lists no carts") +T.eq(#CartStore.listFor("red", empty), 0, "listFor is empty on a fresh install") + +local function rowSet() + return { + { id = "hard_mode", name = "Hard Mode", version = "2.0.0", enabled = true, + github = "ren/hard-mode", + manifest = { id = "hard_mode", version = "2.0.0", + github = "ren/hard-mode", sha256 = SHA } }, + { id = "off_mode", name = "Off Mode", version = "1.0.0", enabled = false, + github = "ren/off-mode", + manifest = { id = "off_mode", version = "1.0.0", + github = "ren/off-mode", sha256 = SHA2 } }, + { id = "rare_soda", name = "Rare Soda", version = "0.4.1", enabled = true, + github = "ren/rare-soda", + manifest = { id = "rare_soda", version = "0.4.1", + github = "ren/rare-soda" } }, + { id = "sprite_pack", name = "Sprite Pack", version = "beta", enabled = true, + manifest = { id = "sprite_pack", version = "beta" } }, + } +end + +local identity = { id = "my_cart", title = "My Cart", version = "0.1.0", + author = "Ren", base = "red", shell = "#FF8800", + seal = "open", summary = "Built in the launcher" } +local modOptions = { + rare_soda = { flavour = "grape", sweetness = 3, nested = { 1, 2 } }, + off_mode = { unused = true }, +} + +local captured, unresolved = CartStore.capture(identity, rowSet(), modOptions) +T.check(captured ~= nil, "capture builds a cart: " .. tostring(unresolved)) +T.eq(captured.id, "my_cart", "the captured cart keeps the identity id") +T.eq(captured.title, "My Cart", "the captured cart keeps the title") +T.eq(captured.shell, "#ff8800", "the captured shell normalises") +T.eq(captured.seal, "open", "the captured seal is the author's choice") +T.eq(captured.base, "red", "the captured base is the identity's") +T.eq(#captured.mods, 3, "only the enabled mods are pinned") +T.eq(captured.load_order[1], "hard_mode", "load order follows the row order") +T.eq(captured.load_order[2], "rare_soda", "load order follows the row order") +T.eq(captured.load_order[3], "sprite_pack", "load order follows the row order") +for _, entry in ipairs(captured.mods) do + T.neq(entry.id, "off_mode", "a disabled mod is never pinned") +end + +T.eq(captured.mods[1].source, "github", "a mod with repo, version and hash pins to github") +T.eq(captured.mods[1].repo, "ren/hard-mode", "the github pin keeps the repo") +T.eq(captured.mods[1].sha256, SHA, "the github pin keeps the recorded hash") +T.eq(captured.mods[2].source, "local", "a mod with no archive hash pins locally") +T.eq(captured.mods[2].version, "0.4.1", "the local pin keeps the installed version") +T.eq(captured.mods[2].repo, nil, "a local pin carries no repo") +T.eq(captured.mods[2].sha256, nil, "a local pin carries no hash") +T.eq(captured.mods[2].options.flavour, "grape", "the author's option values are frozen in") +T.eq(captured.mods[2].options.sweetness, 3, "every scalar option is frozen in") +T.eq(captured.mods[2].options.nested, nil, "a table option value is dropped") +T.eq(captured.mods[3].source, "local", "a mod with no repo pins locally") +T.eq(captured.mods[3].version, "0.0.0", "an unparsable version pins as 0.0.0") +T.eq(captured.mods[1].options, nil, "a mod with no options freezes none") + +T.eq(#unresolved, 2, "capture reports every locally pinned mod") +T.eq(unresolved[1].id, "rare_soda", "the first unresolved mod is named") +T.eq(unresolved[1].name, "Rare Soda", "the unresolved row carries the mod name") +T.check(unresolved[1].reason:find("archive hash", 1, true) ~= nil, + "a missing hash is the reason (got " .. tostring(unresolved[1].reason) .. ")") +T.eq(unresolved[2].id, "sprite_pack", "the second unresolved mod is named") +T.check(unresolved[2].reason:find("GitHub repo", 1, true) ~= nil, + "a missing repo is a reason (got " .. tostring(unresolved[2].reason) .. ")") +T.check(unresolved[2].reason:find("semantic version", 1, true) ~= nil, + "an unpinnable version is a reason (got " .. tostring(unresolved[2].reason) .. ")") + +local publishable, why = CartManifest.publishable(captured) +T.eq(publishable, false, "a captured cart with local pins cannot be published") +T.check(why:find("rare_soda", 1, true) ~= nil, "the reason names rare_soda") +T.check(why:find("sprite_pack", 1, true) ~= nil, "the reason names sprite_pack") +T.check(why:find("hard_mode", 1, true) == nil, "the reason leaves the pinned mod out") + +local storeFs = memfs() +local roundTrip, roundHash = CartStore.install(CartManifest.encode(captured), storeFs) +T.check(roundTrip ~= nil, "a captured cart installs: " .. tostring(roundHash)) +T.same(roundTrip, captured, "a captured cart survives the file round trip") +T.eq(roundHash, CartManifest.hash(captured), "a captured cart hashes the same on disk") + +local pinned = rowSet() +pinned[3].manifest.sha256 = SHA2 +pinned[4] = nil +local full, fullUnresolved = CartStore.capture(identity, pinned, modOptions) +T.check(full ~= nil, "a fully pinned capture builds a cart") +T.eq(#fullUnresolved, 0, "a fully pinned capture reports nothing unresolved") +T.eq(full.mods[2].source, "github", "a recorded hash promotes the pin to github") +T.eq(full.mods[2].sha256, SHA2, "the promoted pin uses the recorded hash") +T.eq(CartManifest.publishable(full), true, "a fully pinned cart is publishable") + +local noMods, noModsErr = CartStore.capture(identity, { rowSet()[2] }, modOptions) +T.eq(noMods, nil, "a capture with nothing enabled is refused") +T.check(type(noModsErr) == "string" and noModsErr:find("cart must pin", 1, true) ~= nil, + "the empty capture says why (got " .. tostring(noModsErr) .. ")") +T.eq(CartStore.capture({ id = "bad id" }, rowSet(), modOptions), nil, + "a capture with a bad identity is refused") +T.eq(CartStore.capture(nil, rowSet(), modOptions), nil, + "a capture with no identity is refused") + +local PNG = CartManifest.PNG_SIGNATURE .. "\0\0\0\13IHDRa cart label" +local ART_DATA = Base64.encode(PNG) + +local function artedCart() + local plain = select(2, bytesOf({ id = "art_cart", title = "Art Cart", + label = "label.png" })) + plain.labelArt = { name = "label.png", encoding = "base64", bytes = #PNG, + data = ART_DATA } + return plain +end + +local artFs = memfs() +local artFixture = artedCart() +local packed = CartManifest.encode(artFixture) +local artInstalled, artHash = CartStore.install(packed, artFs) +T.check(artInstalled ~= nil, "a cart with label art installs: " .. tostring(artHash)) +T.eq(artInstalled.labelArt.data, ART_DATA, "install returns the cart with its art") +T.check(artFs.files["carts/art_cart.g1rcart"]:find(ART_DATA, 1, true) ~= nil, + "install writes the art payload to the cart file") +T.same(CartStore.get("art_cart", artFs), artFixture, + "the installed cart reads back with its art") + +local artless = select(2, bytesOf({ id = "art_cart", title = "Art Cart", + label = "label.png" })) +T.eq(artHash, CartManifest.hash(artless), + "the art is not part of the hash a save pins itself to") + +local artExported, artExportHash = CartStore.export("art_cart", artFs) +T.eq(artExportHash, artHash, "export reports the same hash for an arted cart") +T.eq(artExported, packed, "export hands back the bytes that were packed") +local reread = CartManifest.decode(artExported) +T.same(reread, artFixture, "the exported bytes decode to the same cart and art") +T.eq(reread.labelArt.data, ART_DATA, "the exported payload is byte identical") + +local sharedFs = memfs() +T.check(CartStore.install(artExported, sharedFs) ~= nil, + "an exported cart installs somewhere else") +T.same(CartStore.get("art_cart", sharedFs), artFixture, + "pack, install, export and install again leaves the cart unchanged") + +local shownBytes, shownName = CartStore.labelArt("art_cart", sharedFs) +T.eq(shownBytes, PNG, "labelArt hands back the decoded PNG") +T.eq(shownName, "label.png", "labelArt hands back the art name") +T.eq(CartStore.labelArt("nothing_here", sharedFs), nil, + "labelArt refuses an unknown id") +T.eq(CartStore.labelArt("../etc/passwd", sharedFs), nil, + "labelArt refuses a climbing id") + +local plainFs = memfs() +T.check(CartStore.install(CartManifest.encode(artless), plainFs) ~= nil, + "a cart with no art still installs") +T.eq(CartStore.labelArt("art_cart", plainFs), nil, + "a cart with no art has no label art") +T.same(CartStore.get("art_cart", plainFs), artless, + "a cart with no art round trips exactly as before") + +local tamperedBytes = (packed:gsub("bytes = " .. #PNG, "bytes = " .. (#PNG + 1), 1)) +T.neq(tamperedBytes, packed, "the tampered bundle really changed") +local tamperedFs = memfs() +local tampered, tamperedErr = CartStore.install(tamperedBytes, tamperedFs) +T.check(tampered ~= nil, "bad art never fails the install: " .. tostring(tamperedErr)) +T.eq(tampered.labelArt, nil, "the bad art is dropped") +T.eq(CartStore.labelArt("art_cart", tamperedFs), nil, + "the installed cart shows no art") +T.eq(tamperedFs.files["carts/art_cart.g1rcart"], CartManifest.encode(artless), + "the bad art is not written back to disk") +T.eq(#CartStore.list(tamperedFs), 1, "the cart still lists without its art") + +T.finish("cart_store") diff --git a/tools/cart_release_workflow.yml b/tools/cart_release_workflow.yml new file mode 100644 index 00000000..b08d1ad6 --- /dev/null +++ b/tools/cart_release_workflow.yml @@ -0,0 +1,122 @@ +name: Release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + tag: + description: "Existing v tag to build and publish." + required: true + +permissions: + contents: write + +concurrency: + group: release + cancel-in-progress: false + +env: + CART_ID: "{{CART_ID}}" + CARTKIT_REPO: bryanthaboi/gen1recomp + CARTKIT_REF: dev + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.tag || github.ref }} + fetch-depth: 0 + + - name: Fetch cartkit + run: | + set -euo pipefail + curl -fsSL --retry 3 -o "$RUNNER_TEMP/cartkit.py" \ + "https://raw.githubusercontent.com/${CARTKIT_REPO}/${CARTKIT_REF}/tools/cartkit.py" + python3 "$RUNNER_TEMP/cartkit.py" selftest --quiet + + - name: Check the tag against cart.json + id: cart + env: + TAG: ${{ github.event.inputs.tag || github.ref_name }} + run: | + set -euo pipefail + python3 - <<'PY' >> "$GITHUB_OUTPUT" + import json, os, sys + + with open("cart.json", encoding="utf-8") as fh: + cart = json.load(fh) + version = str(cart.get("version", "")) + cart_id = str(cart.get("id", "")) + tag = os.environ["TAG"] + if tag != f"v{version}": + print(f"::error::tag {tag} does not match cart.json version " + f"{version} (expected v{version})", file=sys.stderr) + raise SystemExit(1) + stamped = os.environ["CART_ID"] + if cart_id != stamped: + print(f"::error::cart.json id is {cart_id}, but this workflow " + f"was stamped for {stamped}; rerun cartkit " + "add-release-workflow", file=sys.stderr) + raise SystemExit(1) + print(f"version={version}") + print(f"id={cart_id}") + print(f"tag={tag}") + PY + + - name: Validate every pin + env: + GITHUB_TOKEN: ${{ github.token }} + run: python3 "$RUNNER_TEMP/cartkit.py" validate . --online --strict + + - name: Pack the cart + env: + CART_VERSION: ${{ steps.cart.outputs.version }} + CART_NAME: ${{ steps.cart.outputs.id }} + run: | + set -euo pipefail + out="$GITHUB_WORKSPACE/dist" + rm -rf "$out" + mkdir -p "$out" + python3 "$RUNNER_TEMP/cartkit.py" pack . \ + -o "$out/${CART_NAME}-${CART_VERSION}.g1rcart" + (cd "$out" && sha256sum ./*.g1rcart > sha256sums.txt) + cat "$out/sha256sums.txt" + + - name: Publish GitHub Release + env: + GH_TOKEN: ${{ github.token }} + CART_VERSION: ${{ steps.cart.outputs.version }} + CART_NAME: ${{ steps.cart.outputs.id }} + TAG: ${{ steps.cart.outputs.tag }} + run: | + set -euo pipefail + + prev="$(git tag -l 'v*' --sort=-v:refname | grep -v "^${TAG}$" | head -1 || true)" + range="${prev:+${prev}..}${TAG}" + changes="$(git log --no-merges --pretty='- %s' "$range" | head -50 || true)" + + notes=$'Download the .g1rcart and open it from the game to install this cart.' + notes+=$'\n\nThe cart is a manifest: it pins each mod to the exact build listed in cart.json and ships no code of its own.' + if [ -n "$changes" ]; then + notes+=$'\n\n## Changes\n\n'"$changes" + fi + + asset="dist/${CART_NAME}-${CART_VERSION}.g1rcart" + if gh release view "$TAG" >/dev/null 2>&1; then + gh release upload "$TAG" "$asset" "dist/sha256sums.txt" --clobber + else + gh release create "$TAG" \ + --target "$GITHUB_SHA" \ + --title "$CART_VERSION" \ + --notes "$notes" \ + "$asset" \ + "dist/sha256sums.txt" + fi + + echo "Published $TAG" diff --git a/tools/cartkit.py b/tools/cartkit.py new file mode 100644 index 00000000..4852eba9 --- /dev/null +++ b/tools/cartkit.py @@ -0,0 +1,1749 @@ +#!/usr/bin/env python3 +"""cartkit: the custom-cart authoring CLI. + + python3 tools/cartkit.py [args] + +Subcommands: + scaffold [--title T] [--author A] [--base red|blue|yellow|gold|silver] + [--shell "#rrggbb"] [--seal sealed|open] [--summary S] + [--github owner/repo] [--into DIR] [--force] + validate [--online] [--no-download] [--strict] + pin [--id ID] [--option k=v]... [--file N] + [--clear-options] + pack [-o out.g1rcart] [--online] [--no-download] + add-release-workflow [--force] + selftest + +A cart is a manifest, not code: cart.json names a base game and a list of mods +pinned to exact published builds. for pin is "owner/repo@1.2.3", a +GameBanana mod URL, or a GameBanana mod id. + +Global flags: --repo PATH, --json, --quiet. +Exit codes: 0 success, 1 validation/pack failure, 2 usage error. + +validate is offline by default and checks the manifest alone; --online also +resolves every pin against GitHub and GameBanana and compares the published +hash. A pin that a reachable API says does not exist is a finding; an API +that could not be reached is a note, so a rate limit or a dropped connection +never fails a cart that is fine. pack runs validate --strict, so a warning +refuses the bundle too. +""" + +import argparse +import base64 +import contextlib +import hashlib +import io +import json +import os +import re +import shutil +import struct +import sys +import tempfile +import time +import urllib.error +import urllib.parse +import urllib.request +import zlib + +CARTKIT_VERSION = "1.0.0" +USER_AGENT = ("cartkit/%s (gen1recomp custom carts; " + "+https://github.com/bryanthaboi/gen1recomp)" % CARTKIT_VERSION) + +CART_FILE = "cart.json" +CART_EXT = ".g1rcart" +BUNDLE_FORMAT = "g1rcart" +BUNDLE_VERSION = 1 +CART_SCHEMA = 1 + +BASES = ("red", "blue", "yellow", "gold", "silver") +SEALS = ("sealed", "open") +SOURCES = ("github", "gamebanana") +MAX_MODS = 64 +MAX_OPTIONS = 64 +MAX_LABEL_PATH = 128 +LABEL_WARN_BYTES = 256 * 1024 +LABEL_MAX_BYTES = 1024 * 1024 + +CART_KEYS = ("schema", "id", "title", "version", "author", "repo", "summary", + "shell", "label", "base", "engine", "seal", "mods", "load_order") +MOD_KEYS = ("id", "source", "repo", "version", "sha256", "mod", "file", "md5", + "options") + +ID_RE = re.compile(r"[A-Za-z0-9_-]{1,64}") +SEMVER_RE = re.compile( + r"(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)" + r"(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?" + r"(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?") +SHELL_RE = re.compile(r"#[0-9a-fA-F]{6}") +SHA256_RE = re.compile(r"[0-9a-f]{64}") +MD5_RE = re.compile(r"[0-9a-f]{32}") +REPO_RE = re.compile(r"[A-Za-z0-9][\w.\-]*/[A-Za-z0-9][\w.\-]*") +LABEL_RE = re.compile(r"[A-Za-z0-9_][A-Za-z0-9_.\-]*") +CONTROL_RE = re.compile(r"[\x00-\x1f\x7f]") +LUA_NAME_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*") + +GITHUB_SPEC = re.compile( + r"^(?:https?://github\.com/)?([\w.\-]+)/([\w.\-]+?)(?:\.git)?@(.+)$") +GITHUB_SLUG = re.compile( + r"^(?:https?://github\.com/)?([\w.\-]+)/([\w.\-]+?)(?:\.git)?/?$") +GAMEBANANA_SPEC = re.compile( + r"^(?:gamebanana:|(?:https?://)?(?:www\.)?gamebanana\.com/mods/)?(\d+)/?$") + +PLACEHOLDER_REPO = "owner/example-mod" +PLACEHOLDER_SHA = "0" * 64 + + +# ---------------------------------------------------------------- findings + +class Finding: + def __init__(self, rule, severity, message, path=None): + self.rule = rule + self.severity = severity + self.message = message + self.path = path + + def as_dict(self): + return {"rule": self.rule, "severity": self.severity, + "message": self.message, "path": self.path} + + def line(self): + where = f"{self.path}: " if self.path else "" + return f"{self.rule} {self.severity.upper():5} {where}{self.message}" + + +def err(rule, message, path=CART_FILE): + return Finding(rule, "error", message, path) + + +def warn(rule, message, path=CART_FILE): + return Finding(rule, "warn", message, path) + + +def report(findings, args, summary_ok, summary_fail, notes=None): + notes = notes or [] + errors = [f for f in findings if f.severity == "error"] + if getattr(args, "strict", False): + errors = list(findings) + if args.json: + print(json.dumps({"ok": not errors, + "findings": [f.as_dict() for f in findings], + "notes": notes})) + else: + for f in findings: + print(f.line()) + if not args.quiet: + for note in notes: + print(f"cartkit: {note}") + print(summary_fail if errors else summary_ok) + return 1 if errors else 0 + + +# ---------------------------------------------------------------- repo/root + +def find_repo(start): + node = os.path.abspath(start) + while True: + if os.path.isfile(os.path.join(node, "tools", "rom_manifest.json")): + return node + parent = os.path.dirname(node) + if parent == node: + return None + node = parent + + +def engine_version(repo): + try: + src = open(os.path.join(repo, "src", "core", "Version.lua"), + encoding="utf-8").read() + except OSError: + return "0.0.0-dev" + match = re.search(r'engine\s*=\s*"([^"]+)"', src) + return match.group(1) if match else "0.0.0-dev" + + +def resolve_cart_dir(repo, arg): + path = os.path.abspath(arg) + if os.path.isfile(path) and os.path.basename(path) == CART_FILE: + return os.path.dirname(path) + if os.path.isdir(path): + return path + if repo: + candidate = os.path.join(repo, "carts", arg) + if os.path.isdir(candidate): + return candidate + return None + + +def read_cart(cart_dir): + path = os.path.join(cart_dir, CART_FILE) + if not os.path.isfile(path): + return None, err("CK001", f"{CART_FILE} missing; run " + "cartkit scaffold to make one") + try: + cart = json.load(open(path, encoding="utf-8")) + except ValueError as problem: + return None, err("CK001", f"{CART_FILE} unparseable: {problem}") + if not isinstance(cart, dict): + return None, err("CK001", f"{CART_FILE} must be a JSON object") + return cart, None + + +def write_cart(cart_dir, cart): + ordered = {key: cart[key] for key in CART_KEYS if key in cart} + for key in cart: + if key not in ordered: + ordered[key] = cart[key] + with open(os.path.join(cart_dir, CART_FILE), "w", encoding="utf-8") as fh: + json.dump(ordered, fh, indent=2, ensure_ascii=False) + fh.write("\n") + + +# ---------------------------------------------------------------- schema + +def text_problem(value, low, high): + if not isinstance(value, str): + return "must be a string" + if CONTROL_RE.search(value): + return "must not contain control characters" + if len(value) < low: + return f"must be at least {low} character(s)" + if len(value) > high: + return f"must be at most {high} characters (got {len(value)})" + return None + + +def full_match(pattern, value): + return isinstance(value, str) and pattern.fullmatch(value) is not None + + +RANGE_OPS = {"", "=", "==", ">", ">=", "<", "<=", "^"} +RANGE_CORE = re.compile(r"[vV]?\d+(?:\.\d+){0,2}(?:-[0-9A-Za-z.\-]+)?" + r"(?:\+[0-9A-Za-z.\-]+)?") + + +def range_problem(text): + if not isinstance(text, str) or not text.strip(): + return "must be a non-empty semver range string" + for alternative in text.split("||"): + tokens = alternative.split() + if not tokens: + return "has an empty alternative around '||'" + for token in tokens: + head = re.match(r"^[=<>^]*", token).group(0) + if head not in RANGE_OPS: + return f"has an unknown comparator {head!r}" + if not RANGE_CORE.fullmatch(token[len(head):]): + return f"has an unparsable version in {token!r}" + return None + + +def label_problem(value): + if not isinstance(value, str) or not value: + return "must be a non-empty string" + if len(value) > MAX_LABEL_PATH: + return f"must be at most {MAX_LABEL_PATH} characters" + if value.startswith("/") or "\\" in value \ + or re.match(r"^[A-Za-z]:", value): + return "must be a relative path inside the cart" + segments = [s for s in value.split("/") if s and s != "."] + if not segments or any(s == ".." for s in segments): + return "must not leave the cart directory" + if not all(LABEL_RE.fullmatch(s) for s in segments): + return ("must be a plain relative path " + "(letters, digits, . _ - and /)") + return None + + +def option_problems(options, label): + problems = [] + if not isinstance(options, dict): + return [f"{label} options must be an object"] + if len(options) > MAX_OPTIONS: + problems.append(f"{label} has {len(options)} options (max " + f"{MAX_OPTIONS})") + for key, value in sorted(options.items()): + if not isinstance(key, str) or CONTROL_RE.search(key): + problems.append(f"{label} option key {key!r} must be plain text") + continue + if not 1 <= len(key) <= 64: + problems.append(f"{label} option key {key!r} must be 1..64 " + "characters") + if isinstance(value, bool): + continue + if isinstance(value, str): + if CONTROL_RE.search(value): + problems.append(f"{label} option {key!r} must not contain " + "control characters") + elif len(value) > 256: + problems.append(f"{label} option {key!r} is {len(value)} " + "characters (max 256)") + elif isinstance(value, (int, float)): + if isinstance(value, float) and (value != value or + value in (float("inf"), + float("-inf"))): + problems.append(f"{label} option {key!r} must be a finite " + "number") + else: + problems.append(f"{label} option {key!r} must be a string, " + "number or boolean") + return problems + + +def check_identity(cart, findings): + schema = cart.get("schema") + if schema is None: + findings.append(err("CK002", '"schema" is missing; add "schema": 1')) + elif isinstance(schema, bool) or not isinstance(schema, int): + findings.append(err("CK002", '"schema" must be the number 1')) + elif schema != CART_SCHEMA: + findings.append(err("CK002", f'"schema" is {schema}; this cartkit ' + f"writes and reads schema {CART_SCHEMA}")) + + if not full_match(ID_RE, cart.get("id")): + findings.append(err("CK002", '"id" must be 1..64 characters of ' + "letters, digits, _ or -")) + + for key, low, high in (("title", 1, 48), ("author", 1, 64)): + problem = text_problem(cart.get(key), low, high) + if problem: + findings.append(err("CK002", f'"{key}" {problem}')) + + if not full_match(SEMVER_RE, cart.get("version")): + findings.append(err("CK002", '"version" must be semver, e.g. 1.0.0')) + + if "repo" in cart and cart["repo"] is not None: + if not full_match(REPO_RE, cart["repo"]): + findings.append(err("CK002", '"repo" must be owner/name')) + + if "summary" in cart and cart["summary"] is not None: + problem = text_problem(cart["summary"], 0, 120) + if problem: + findings.append(err("CK002", f'"summary" {problem}')) + + if not full_match(SHELL_RE, cart.get("shell")): + findings.append(err("CK002", '"shell" must be "#rrggbb", e.g. ' + '"#8b1a1a"')) + + if cart.get("base") not in BASES: + findings.append(err("CK002", '"base" must be one of ' + + ", ".join(BASES))) + + if "engine" in cart and cart["engine"] is not None: + problem = range_problem(cart["engine"]) + if problem: + findings.append(err("CK002", f'"engine" {problem}; write it like ' + '">=1.0.0 <2.0.0"')) + + seal = cart.get("seal", "sealed") + if seal not in SEALS: + findings.append(err("CK002", '"seal" must be "sealed" or "open"')) + + for key in cart: + if key not in CART_KEYS: + findings.append(warn("CK001", f"unknown field {key!r}; cartkit " + "packs only the documented fields")) + + +def check_label(cart, cart_dir, findings): + label = cart.get("label") + if label is None: + return + problem = label_problem(label) + if problem: + findings.append(err("CK003", f'"label" {problem}')) + return + if cart_dir is None: + return + path = os.path.join(cart_dir, label) + if not os.path.isfile(path): + findings.append(err("CK003", f"label art {label!r} is missing from " + "the cart directory", label)) + return + if not os.path.realpath(path).startswith( + os.path.realpath(cart_dir) + os.sep): + findings.append(err("CK003", f"label art {label!r} resolves outside " + "the cart directory", label)) + return + if not label.lower().endswith(".png"): + findings.append(warn("CK003", "label art should be a .png; the game " + "draws nothing else", label)) + size = os.path.getsize(path) + if size > LABEL_MAX_BYTES: + findings.append(err("CK003", f"label art is {size} bytes; keep it " + f"under {LABEL_MAX_BYTES} so the bundle " + "stays small", label)) + elif size > LABEL_WARN_BYTES: + findings.append(warn("CK003", f"label art is {size} bytes; a cart " + "label wants a few KB, not a photo", + label)) + + +def check_mods(cart, findings): + mods = cart.get("mods") + if not isinstance(mods, list) or not mods: + findings.append(err("CK004", '"mods" must list 1..64 pinned mods; a ' + "cart with no mods is just the base " + "game")) + return [] + if len(mods) > MAX_MODS: + findings.append(err("CK004", f'"mods" has {len(mods)} entries (max ' + f"{MAX_MODS})")) + seen = {} + ids = [] + for index, entry in enumerate(mods): + label = f"mods[{index + 1}]" + if not isinstance(entry, dict): + findings.append(err("CK004", f"{label} must be an object")) + continue + mod_id = entry.get("id") + if not full_match(ID_RE, mod_id): + findings.append(err("CK004", f"{label} id must be 1..64 " + "characters of letters, digits, _ " + "or -")) + else: + label = f"mods[{index + 1}] {mod_id}" + if mod_id in seen: + findings.append(err("CK004", f"{label} repeats the id pinned " + f"at mods[{seen[mod_id] + 1}]; " + "one pin per mod")) + else: + seen[mod_id] = index + ids.append(mod_id) + source = entry.get("source") + if source == "local": + findings.append(err("CK004", f"{label} is pinned to one install; " + "a published cart needs a github or " + "gamebanana pin nobody else has to " + "guess at")) + elif source not in SOURCES: + findings.append(err("CK004", f"{label} source must be " + + " or ".join(SOURCES))) + elif source == "github": + check_github_pin(entry, label, findings) + else: + check_gamebanana_pin(entry, label, findings) + if "options" in entry and entry["options"] is not None: + for problem in option_problems(entry["options"], label): + findings.append(err("CK004", problem)) + for key in entry: + if key not in MOD_KEYS: + findings.append(warn("CK004", f"{label} has unknown field " + f"{key!r}")) + return ids + + +def check_github_pin(entry, label, findings): + if not full_match(REPO_RE, entry.get("repo")): + findings.append(err("CK004", f"{label} repo must be owner/name")) + elif str(entry["repo"]).lower() == PLACEHOLDER_REPO: + findings.append(warn("CK004", f"{label} still points at the scaffold " + "placeholder; pin a real release with " + "cartkit pin owner/repo@X.Y.Z")) + if not full_match(SEMVER_RE, entry.get("version")): + findings.append(err("CK004", f"{label} version must be semver, e.g. " + "1.2.3")) + sha = entry.get("sha256") + if not full_match(SHA256_RE, sha): + findings.append(err("CK004", f"{label} sha256 must be 64 lowercase " + "hex characters; cartkit pin resolves it " + "for you")) + elif sha == PLACEHOLDER_SHA: + findings.append(warn("CK004", f"{label} carries the scaffold " + "placeholder hash; resolve it with " + "cartkit pin")) + for key in ("mod", "file", "md5"): + if key in entry: + findings.append(warn("CK004", f"{label} has {key!r}, which " + "belongs to a gamebanana pin")) + + +def check_gamebanana_pin(entry, label, findings): + for key in ("mod", "file"): + value = entry.get(key) + if isinstance(value, bool) or not isinstance(value, int) or value <= 0: + findings.append(err("CK004", f"{label} {key} must be a positive " + "integer id")) + if not full_match(MD5_RE, entry.get("md5")): + findings.append(err("CK004", f"{label} md5 must be 32 lowercase hex " + "characters; cartkit pin resolves it for " + "you")) + for key in ("repo", "version", "sha256"): + if key in entry: + findings.append(warn("CK004", f"{label} has {key!r}, which " + "belongs to a github pin")) + + +def check_load_order(cart, ids, findings): + order = cart.get("load_order") + if order is None: + return + if not isinstance(order, list) or any(not isinstance(x, str) + for x in order): + findings.append(err("CK005", '"load_order" must be an array of the ' + "mod ids")) + return + if not ids: + return + missing = [x for x in ids if x not in order] + extra = [x for x in order if x not in ids] + if len(order) != len(set(order)): + findings.append(err("CK005", '"load_order" repeats an id; it is a ' + "permutation of the mods, not a list of " + "passes")) + if missing: + findings.append(err("CK005", '"load_order" leaves out ' + + ", ".join(missing) + + "; name every pinned mod or drop the field")) + if extra: + findings.append(err("CK005", '"load_order" names ' + ", ".join(extra) + + ", which is not pinned in mods")) + + +def schema_findings(cart, cart_dir=None): + findings = [] + check_identity(cart, findings) + check_label(cart, cart_dir, findings) + ids = check_mods(cart, findings) + check_load_order(cart, ids, findings) + return findings + + +# ------------------------------------------------------------------- http + +class Unreachable(Exception): + pass + + +class NotFound(Exception): + pass + + +_LAST_REQUEST = [0.0] +MIN_INTERVAL = 0.4 +MAX_BACKOFF = 30.0 + + +def github_token(): + for name in ("CARTKIT_GITHUB_TOKEN", "GITHUB_TOKEN", "GH_TOKEN"): + value = os.environ.get(name, "").strip() + if value: + return value + return None + + +def _pause(): + wait = MIN_INTERVAL - (time.monotonic() - _LAST_REQUEST[0]) + if wait > 0: + time.sleep(wait) + + +def _retry_after(response): + raw = response.headers.get("Retry-After") if response.headers else None + try: + return min(float(raw), MAX_BACKOFF) if raw else None + except ValueError: + return None + + +def open_url(url, accept=None, token=None, timeout=30, attempts=3): + headers = {"User-Agent": USER_AGENT} + if accept: + headers["Accept"] = accept + if token: + headers["Authorization"] = "Bearer " + token + request = urllib.request.Request(url, headers=headers) + for attempt in range(attempts): + _pause() + try: + response = urllib.request.urlopen(request, timeout=timeout) + _LAST_REQUEST[0] = time.monotonic() + return response + except urllib.error.HTTPError as problem: + _LAST_REQUEST[0] = time.monotonic() + if problem.code in (404, 410): + raise NotFound(url) + if problem.code == 403 and \ + problem.headers.get("X-RateLimit-Remaining") == "0": + raise Unreachable( + "GitHub rate limit reached; set GITHUB_TOKEN to a token " + "with public read and try again") + retriable = problem.code in (403, 429) or 500 <= problem.code < 600 + if retriable and attempt + 1 < attempts: + time.sleep(_retry_after(problem) or min(2 ** attempt * 2, + MAX_BACKOFF)) + continue + raise Unreachable(f"{url}: HTTP {problem.code} {problem.reason}") + except Exception as problem: + _LAST_REQUEST[0] = time.monotonic() + if attempt + 1 < attempts: + time.sleep(min(2 ** attempt, MAX_BACKOFF)) + continue + raise Unreachable(f"{url}: {problem}") + raise Unreachable(url) + + +def get_json(url, accept=None, token=None): + with open_url(url, accept, token) as response: + body = response.read() + try: + return json.loads(body.decode("utf-8")) + except ValueError as problem: + raise Unreachable(f"{url}: response was not JSON ({problem})") + + +def get_text(url, token=None): + with open_url(url, None, token) as response: + return response.read().decode("utf-8", "replace") + + +def stream_digest(url, algorithm="sha256"): + digest = hashlib.new(algorithm) + total = 0 + with open_url(url, timeout=120) as response: + while True: + chunk = response.read(262144) + if not chunk: + break + total += len(chunk) + digest.update(chunk) + return digest.hexdigest(), total + + +# --------------------------------------------------------------- resolvers + +def github_release(slug, version, token): + tags = [f"v{version}", version] + for tag in tags: + url = (f"https://api.github.com/repos/{slug}/releases/tags/" + + urllib.parse.quote(tag)) + try: + return get_json(url, "application/vnd.github+json", token), tag + except NotFound: + continue + raise NotFound(f"{slug} has no release tagged " + + " or ".join(tags)) + + +def pick_asset(release, mod_id, version): + assets = [a for a in release.get("assets", []) + if isinstance(a, dict) and a.get("name")] + wanted = f"{mod_id}-{version}.zip" + for asset in assets: + if asset["name"] == wanted: + return asset + zips = [a for a in assets if a["name"].lower().endswith(".zip")] + if len(zips) == 1: + return zips[0] + if not zips: + raise NotFound(f"release {release.get('tag_name')} has no .zip asset; " + "publish the mod archive on the release") + names = ", ".join(sorted(a["name"] for a in zips)) + raise NotFound(f"release {release.get('tag_name')} has {len(zips)} .zip " + f"assets ({names}); the game picks {wanted}, so name the " + "mod archive that way") + + +def sums_digest(release, asset_name, token): + for asset in release.get("assets", []): + if asset.get("name") == "sha256sums.txt": + body = get_text(asset["browser_download_url"], None) + for line in body.splitlines(): + parts = line.split() + if len(parts) == 2 and os.path.basename( + parts[1].lstrip("*")) == asset_name: + return parts[0].lower() + return None + + +def resolve_github(slug, version, mod_id, token, download=True): + release, tag = github_release(slug, version, token) + asset = pick_asset(release, mod_id, version) + digest = sums_digest(release, asset["name"], token) + how = "sha256sums.txt" + if digest is None: + if not download: + return {"tag": tag, "asset": asset["name"], + "size": asset.get("size", 0), "sha256": None, + "how": "not published"} + digest, size = stream_digest(asset["browser_download_url"]) + how = f"downloading {size} bytes" + return {"tag": tag, "asset": asset["name"], "size": asset.get("size", 0), + "sha256": digest, "how": how} + + +def gamebanana_files(mod_id): + url = f"https://gamebanana.com/apiv11/Mod/{int(mod_id)}/DownloadPage" + payload = get_json(url) + if not isinstance(payload, dict): + raise Unreachable(f"{url}: unexpected response") + if payload.get("_bIsTrashed") or payload.get("_bIsWithheld"): + raise NotFound(f"GameBanana mod {mod_id} is trashed or withheld") + files = payload.get("_aFiles") + if not isinstance(files, list) or not files: + raise NotFound(f"GameBanana mod {mod_id} publishes no files") + return files + + +def gamebanana_file(files, file_id): + for entry in files: + if isinstance(entry, dict) and entry.get("_idRow") == int(file_id): + return entry + return None + + +# ------------------------------------------------------------ online rules + +def online_findings(cart, findings, notes, download=True): + token = github_token() + if not token: + notes.append("no GITHUB_TOKEN in the environment; GitHub allows 60 " + "anonymous API calls an hour") + for index, entry in enumerate(cart.get("mods") or []): + if not isinstance(entry, dict): + continue + mod_id = entry.get("id") + label = f"mods[{index + 1}] {mod_id}" + if entry.get("source") == "github": + resolve_github_pin(entry, label, findings, notes, token, download) + elif entry.get("source") == "gamebanana": + resolve_gamebanana_pin(entry, label, findings, notes) + + +def resolve_github_pin(entry, label, findings, notes, token, download): + slug, version = entry.get("repo"), entry.get("version") + if not (full_match(REPO_RE, slug) and full_match(SEMVER_RE, version)): + return + try: + found = resolve_github(slug, version, entry.get("id") or "", + token, download) + except NotFound as problem: + findings.append(err("CK100", f"{label} does not resolve: {problem}")) + return + except Unreachable as problem: + notes.append(f"{label} not resolved: {problem}") + return + if found["sha256"] is None: + notes.append(f"{label} hash not checked: the release publishes no " + "sha256sums.txt and --no-download was given") + return + if found["sha256"] != entry.get("sha256"): + findings.append(err("CK101", f"{label} pins sha256 " + f"{entry.get('sha256')} but " + f"{found['asset']} on {slug} " + f"{found['tag']} hashes to " + f"{found['sha256']}; re-pin it")) + + +def resolve_gamebanana_pin(entry, label, findings, notes): + mod, file_id = entry.get("mod"), entry.get("file") + if isinstance(mod, bool) or not isinstance(mod, int) or mod <= 0: + return + if isinstance(file_id, bool) or not isinstance(file_id, int) \ + or file_id <= 0: + return + try: + files = gamebanana_files(mod) + except NotFound as problem: + findings.append(err("CK110", f"{label} does not resolve: {problem}")) + return + except Unreachable as problem: + notes.append(f"{label} not resolved: {problem}") + return + found = gamebanana_file(files, file_id) + if found is None: + have = ", ".join(str(f.get("_idRow")) for f in files + if isinstance(f, dict)) + findings.append(err("CK110", f"{label} pins file {file_id}, which is " + f"not on GameBanana mod {mod} " + f"(it publishes {have})")) + return + published = str(found.get("_sMd5Checksum") or "").lower() + if published != entry.get("md5"): + findings.append(err("CK111", f"{label} pins md5 {entry.get('md5')} " + f"but file {file_id} " + f"({found.get('_sFile')}) publishes " + f"{published or 'no checksum'}; " + "re-pin it")) + + +# -------------------------------------------------------------- lua bundle + +def lua_string(text): + out = ['"'] + for position, ch in enumerate(text): + code = ord(ch) + if ch in '"\\\n': + out.append("\\" + ch) + elif code < 32 or code == 127: + following = text[position + 1:position + 2] + out.append("\\%03d" % code if following.isdigit() + else "\\%d" % code) + else: + out.append(ch) + out.append('"') + return "".join(out) + + +def lua_number(value): + if isinstance(value, int): + return str(value) + if value != value or value in (float("inf"), float("-inf")): + raise ValueError(f"cannot serialize {value!r}") + text = "%.14g" % value + return text + + +def lua_value(value, indent=0): + pad = " " * indent + if isinstance(value, bool): + return "true" if value else "false" + if isinstance(value, (int, float)): + return lua_number(value) + if isinstance(value, str): + return lua_string(value) + if isinstance(value, (list, tuple)): + pairs = [(position + 1, item) for position, item in enumerate(value)] + elif isinstance(value, dict): + pairs = sorted(value.items(), key=lambda kv: kv[0].encode("utf-8")) + else: + raise ValueError(f"cannot serialize {type(value).__name__}") + if not pairs: + return "{}" + lines = [] + for key, item in pairs: + if isinstance(key, str) and LUA_NAME_RE.fullmatch(key): + rendered = key + elif isinstance(key, str): + rendered = "[" + lua_string(key) + "]" + else: + rendered = "[" + lua_number(key) + "]" + lines.append(pad + " " + rendered + " = " + + lua_value(item, indent + 1)) + return "{\n" + ",\n".join(lines) + ",\n" + pad + "}" + + +def lua_encode(data): + return "return " + lua_value(data, 0) + "\n" + + +def packed_cart(cart): + out = {} + for key in CART_KEYS: + if key in cart and cart[key] is not None: + out[key] = cart[key] + out.pop("schema", None) + out["shell"] = str(cart.get("shell", "")).lower() + out["seal"] = cart.get("seal", "sealed") + mods = [] + for entry in cart.get("mods") or []: + pin = {key: entry[key] for key in MOD_KEYS + if key in entry and entry[key] is not None} + if not pin.get("options"): + pin.pop("options", None) + mods.append(pin) + out["mods"] = mods + out["load_order"] = list(cart.get("load_order") + or [entry.get("id") for entry in mods]) + return out + + +def bundle_table(cart, label_bytes=None, label_name=None): + root = {"format": BUNDLE_FORMAT, "formatVersion": BUNDLE_VERSION, + "cart": packed_cart(cart)} + if label_bytes: + root["labelArt"] = { + "name": label_name, + "encoding": "base64", + "bytes": len(label_bytes), + "data": base64.b64encode(label_bytes).decode("ascii"), + } + return root + + +def bundle_bytes(cart, cart_dir=None): + label_bytes, label_name = None, None + label = cart.get("label") + if label and cart_dir: + path = os.path.join(cart_dir, label) + if os.path.isfile(path): + label_bytes = open(path, "rb").read() + label_name = os.path.basename(label) + return lua_encode(bundle_table(cart, label_bytes, + label_name)).encode("utf-8") + + +# ------------------------------------------------------------------ label + +def png_bytes(width, height, rows): + raw = bytearray() + for row in rows: + raw.append(0) + for pixel in row: + raw += bytes(pixel) + + def chunk(tag, body): + return (struct.pack(">I", len(body)) + tag + body + + struct.pack(">I", zlib.crc32(tag + body) & 0xffffffff)) + + header = struct.pack(">IIBBBBB", width, height, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + chunk(b"IHDR", header) + + chunk(b"IDAT", zlib.compress(bytes(raw), 9)) + + chunk(b"IEND", b"")) + + +def shell_rgb(shell): + value = shell.lstrip("#") + return tuple(int(value[i:i + 2], 16) for i in (0, 2, 4)) + + +def mix(colour, target, amount): + return tuple(int(round(c + (t - c) * amount)) + for c, t in zip(colour, target)) + + +def label_art(shell): + size = 96 + face = shell_rgb(shell) + edge = mix(face, (0, 0, 0), 0.55) + sticker = mix(face, (255, 255, 255), 0.78) + ink = mix(face, (0, 0, 0), 0.35) + rows = [] + for y in range(size): + row = [] + for x in range(size): + inset = min(x, y, size - 1 - x, size - 1 - y) + if inset < 5: + row.append(edge) + elif 12 <= x < size - 12 and 16 <= y < size - 28: + row.append(sticker if (x + y) % 16 else ink) + else: + row.append(face) + rows.append(row) + return png_bytes(size, size, rows) + + +# --------------------------------------------------------------- templates + +README_TEMPLATE = """# {{title}} + +A custom cart for the LOVE2D Pokemon engine: a pinned mod setup that plays as +its own game on top of `{{base}}`. It ships no code -- every mod named here is +published separately, and the cart pins each one to an exact build. + +## Files + +- `cart.json` - identity, base game, seal, and one pin per mod +- `{{label}}` - the cart label art the launcher draws +- `.github/workflows/release.yml` - packs and publishes on a `v*` tag + +## Loop + +Every command below is `tools/cartkit.py` from a gen1recomp checkout, pointed +at this directory. + +1. pin a mod: + + ```sh + python3 tools/cartkit.py pin . owner/repo@1.2.3 + python3 tools/cartkit.py pin . https://gamebanana.com/mods/546899 + ``` + +2. freeze an option the player inherits: + + ```sh + python3 tools/cartkit.py pin . owner/repo@1.2.3 --option difficulty=hard + ``` + +3. check it, hashes and all: + + ```sh + python3 tools/cartkit.py validate . --online + ``` + +4. build the bundle players load: + + ```sh + python3 tools/cartkit.py pack . + ``` + +`seal` is `{{seal}}`. A sealed cart loads exactly the mods listed below and +nothing else; an open cart lets the player add more on top. + +## Releasing + +Bump `version` in `cart.json`, tag it `v`, and push the tag. The +workflow validates, packs, and attaches `{{id}}-.g1rcart` to the +release. +""" + +CHANGELOG_TEMPLATE = """# Changelog + +All notable changes to this cart are recorded here, newest first. + +## [0.1.0] - unreleased + +### Added + +- First cut of {{title}}. +""" + + +def cmd_scaffold(args, repo): + if not ID_RE.fullmatch(args.id): + print(f"cartkit: bad id {args.id!r} (letters, digits, _ or -, " + "1..64 characters)") + return 2 + if args.shell and not SHELL_RE.fullmatch(args.shell): + print(f"cartkit: bad shell {args.shell!r} (expected #rrggbb)") + return 2 + github = "" + if args.github: + match = GITHUB_SLUG.fullmatch(args.github.strip()) + if not match: + print(f"cartkit: bad --github {args.github!r} " + "(expected owner/name or a github.com URL)") + return 2 + github = f"{match.group(1)}/{match.group(2)}" + + dest_root = args.into or args.dest or (os.path.join(repo, "carts") + if repo else os.getcwd()) + dest = os.path.join(dest_root, args.id) + if os.path.exists(dest) and not args.force: + print(f"cartkit: {dest} exists (use --force to overwrite)") + return 2 + + title = args.title or args.id.replace("_", " ").replace("-", " ").title() + if text_problem(title, 1, 48): + print(f"cartkit: bad title {title!r} (1..48 characters)") + return 2 + shell = (args.shell or "#8b1a1a").lower() + engine = engine_version(repo) if repo else "0.0.0" + engine_range = ">=%s <%d.0.0" % (engine, int(engine.split(".")[0]) + 1) + + cart = { + "schema": CART_SCHEMA, + "id": args.id, + "title": title, + "version": "0.1.0", + "author": args.author or "TODO your handle", + "summary": args.summary or "", + "shell": shell, + "label": "label.png", + "base": args.base, + "engine": engine_range, + "seal": args.seal, + "mods": [{ + "id": "example-mod", + "source": "github", + "repo": PLACEHOLDER_REPO, + "version": "0.1.0", + "sha256": PLACEHOLDER_SHA, + }], + } + if github: + cart["repo"] = github + if not cart["summary"]: + del cart["summary"] + + os.makedirs(dest, exist_ok=True) + write_cart(dest, cart) + with open(os.path.join(dest, "label.png"), "wb") as fh: + fh.write(label_art(shell)) + subst = {"{{id}}": args.id, "{{title}}": title, "{{base}}": args.base, + "{{seal}}": args.seal, "{{label}}": "label.png"} + for name, template in (("README.md", README_TEMPLATE), + ("CHANGELOG.md", CHANGELOG_TEMPLATE)): + body = template + for key, value in subst.items(): + body = body.replace(key, value) + with open(os.path.join(dest, name), "w", encoding="utf-8") as fh: + fh.write(body) + install_workflow(repo, dest, args.id, force=True) + + if not args.quiet: + print(f"created {dest} ({args.base} base, {args.seal})") + print("next: python3 tools/cartkit.py pin " + f"{dest} owner/repo@1.2.3 (replaces the placeholder pin)") + print(f"then: python3 tools/cartkit.py validate {dest} --online") + return 0 + + +# ---------------------------------------------------------------- workflow + +def install_workflow(repo, cart_dir, cart_id, force=False): + template = os.path.join(repo or "", "tools", "cart_release_workflow.yml") + if not os.path.isfile(template): + return f"missing template {template}" + dest_dir = os.path.join(cart_dir, ".github", "workflows") + dest = os.path.join(dest_dir, "release.yml") + if os.path.exists(dest) and not force: + return f"{dest} exists (use --force to overwrite)" + body = open(template, encoding="utf-8").read().replace("{{CART_ID}}", + cart_id) + os.makedirs(dest_dir, exist_ok=True) + with open(dest, "w", encoding="utf-8") as fh: + fh.write(body) + return None + + +def cmd_add_release_workflow(args, repo): + cart_dir = resolve_cart_dir(repo, args.cart) + if not cart_dir: + print(f"cartkit: no cart at {args.cart!r}") + return 2 + cart, problem = read_cart(cart_dir) + if problem: + print(problem.line()) + return 1 + cart_id = cart.get("id") or os.path.basename(cart_dir) + trouble = install_workflow(repo, cart_dir, cart_id, args.force) + if trouble: + print(f"cartkit: {trouble}") + return 2 + if not args.quiet: + dest = os.path.join(cart_dir, ".github", "workflows", "release.yml") + print(f"wrote {dest}") + print("push the cart as its own GitHub repo and tag v to " + f"publish {cart_id}-{CART_EXT}") + return 0 + + +# ---------------------------------------------------------------- validate + +def cmd_validate(args, repo): + cart_dir = resolve_cart_dir(repo, args.cart) + if not cart_dir: + print(f"cartkit: no cart at {args.cart!r} (expected a directory " + f"holding {CART_FILE})") + return 2 + cart, problem = read_cart(cart_dir) + findings, notes = [], [] + if problem: + findings.append(problem) + name = os.path.basename(cart_dir) + else: + findings.extend(schema_findings(cart, cart_dir)) + name = cart.get("id") or os.path.basename(cart_dir) + if args.online: + online_findings(cart, findings, notes, not args.no_download) + else: + notes.append("pins not resolved; rerun with --online to check " + "every release, file id and hash") + return report(findings, args, f"ok {name} valid", f"FAIL {name} invalid", + notes) + + +# -------------------------------------------------------------------- pack + +def cmd_pack(args, repo): + cart_dir = resolve_cart_dir(repo, args.cart) + if not cart_dir: + print(f"cartkit: no cart at {args.cart!r}") + return 2 + cart, problem = read_cart(cart_dir) + if problem: + print(problem.line()) + return 1 + findings = schema_findings(cart, cart_dir) + notes = [] + if args.online: + online_findings(cart, findings, notes, not args.no_download) + for finding in findings: + print(finding.line()) + if not args.quiet: + for note in notes: + print(f"cartkit: {note}") + if findings: + print("cartkit: pack refused (pack runs validate --strict, so the " + "warnings above are fatal too)") + return 1 + + out = args.output or f"{cart['id']}-{cart['version']}{CART_EXT}" + body = bundle_bytes(cart, cart_dir) + with open(out, "wb") as fh: + fh.write(body) + if not args.quiet: + mods = len(cart.get("mods") or []) + label = " + label art" if cart.get("label") else "" + plural = "" if mods == 1 else "s" + print(f"wrote {out} ({len(body)} bytes, {mods} pinned " + f"mod{plural}{label})") + return 0 + + +# --------------------------------------------------------------------- pin + +def parse_spec(spec): + match = GITHUB_SPEC.fullmatch(spec.strip()) + if match: + return ("github", f"{match.group(1)}/{match.group(2)}", + match.group(3).lstrip("vV")) + match = GAMEBANANA_SPEC.fullmatch(spec.strip()) + if match: + return ("gamebanana", int(match.group(1)), None) + return (None, None, None) + + +def parse_option(text): + key, sep, raw = text.partition("=") + if not sep or not key: + raise ValueError(f"--option wants key=value (got {text!r})") + lowered = raw.strip().lower() + if lowered in ("true", "false"): + return key, lowered == "true" + try: + return key, int(raw) + except ValueError: + pass + try: + return key, float(raw) + except ValueError: + pass + return key, raw + + +def is_placeholder(entry): + return (isinstance(entry, dict) + and str(entry.get("repo", "")).lower() == PLACEHOLDER_REPO + and entry.get("sha256") == PLACEHOLDER_SHA) + + +def derive_id(text): + cleaned = re.sub(r"[^A-Za-z0-9_-]+", "-", text.strip()).strip("-") + return (cleaned or "mod")[:64].lower() + + +def cmd_pin(args, repo): + cart_dir = resolve_cart_dir(repo, args.cart) + if not cart_dir: + print(f"cartkit: no cart at {args.cart!r}") + return 2 + cart, problem = read_cart(cart_dir) + if problem: + print(problem.line()) + return 1 + source, target, version = parse_spec(args.spec) + if not source: + print(f"cartkit: cannot read {args.spec!r}; write owner/repo@1.2.3, a " + "gamebanana mod url, or a gamebanana mod id") + return 2 + if source == "github" and not SEMVER_RE.fullmatch(version): + print(f"cartkit: {version!r} is not semver; pin an exact release like " + "owner/repo@1.2.3") + return 2 + options = {} + try: + for text in args.option or []: + key, value = parse_option(text) + options[key] = value + except ValueError as problem: + print(f"cartkit: {problem}") + return 2 + + try: + if source == "github": + entry, note = pin_github(target, version, args, options) + else: + entry, note = pin_gamebanana(target, args, options) + except NotFound as problem: + print(f"cartkit: {problem}") + return 1 + except Unreachable as problem: + print(f"cartkit: {problem}") + return 1 + if entry is None: + return 2 + + mods = cart.setdefault("mods", []) + replaced = False + for index, existing in enumerate(mods): + if isinstance(existing, dict) and existing.get("id") == entry["id"]: + keep = existing.get("options") or {} + if args.clear_options: + keep = {} + keep.update(entry.get("options") or {}) + if keep: + entry["options"] = keep + mods[index] = entry + replaced = True + break + dropped = [] + if not replaced: + for existing in list(mods): + if is_placeholder(existing): + mods.remove(existing) + dropped.append(existing.get("id")) + mods.append(entry) + order = cart.get("load_order") + if isinstance(order, list): + cart["load_order"] = [x for x in order if x not in dropped] + cart["load_order"].append(entry["id"]) + write_cart(cart_dir, cart) + + if not args.quiet: + verb = "updated" if replaced else "added" + print(f"{verb} pin {entry['id']} ({note})") + for name in dropped: + print(f"dropped the scaffold placeholder pin {name}") + print(f"wrote {os.path.join(cart_dir, CART_FILE)}") + return 0 + + +def pin_github(slug, version, args, options): + mod_id = args.id or derive_id(slug.split("/")[1]) + found = resolve_github(slug, version, mod_id, github_token(), True) + if found["sha256"] is None: + raise NotFound(f"{slug} {found['tag']} publishes no hash for " + f"{found['asset']}") + entry = {"id": mod_id, "source": "github", "repo": slug, + "version": version, "sha256": found["sha256"]} + if options: + entry["options"] = options + return entry, (f"{slug} {found['tag']} -> {found['asset']}, sha256 from " + f"{found['how']}") + + +def pin_gamebanana(mod_id, args, options): + files = gamebanana_files(mod_id) + chosen = None + if args.file: + chosen = gamebanana_file(files, args.file) + if chosen is None: + have = ", ".join(f"{f.get('_idRow')} ({f.get('_sFile')})" + for f in files if isinstance(f, dict)) + raise NotFound(f"GameBanana mod {mod_id} has no file " + f"{args.file}; it publishes {have}") + elif len(files) == 1: + chosen = files[0] + else: + have = "\n".join(f" --file {f.get('_idRow')} {f.get('_sFile')}" + for f in files if isinstance(f, dict)) + print(f"cartkit: GameBanana mod {mod_id} publishes {len(files)} " + f"files; pick one:\n{have}") + return None, None + md5 = str(chosen.get("_sMd5Checksum") or "").lower() + if not MD5_RE.fullmatch(md5): + raise NotFound(f"GameBanana file {chosen.get('_idRow')} publishes no " + "md5; a cart cannot pin it") + name = args.id or derive_id(os.path.splitext( + str(chosen.get("_sFile") or ""))[0]) or f"gb{mod_id}" + entry = {"id": name, "source": "gamebanana", "mod": int(mod_id), + "file": int(chosen["_idRow"]), "md5": md5} + if options: + entry["options"] = options + return entry, (f"gamebanana {mod_id} -> file {chosen['_idRow']} " + f"({chosen.get('_sFile')}), md5 from the v11 API") + + +# ---------------------------------------------------------------- selftest + +def good_cart(): + return { + "schema": 1, + "id": "kanto-hard", + "title": "Kanto Hard Mode", + "version": "1.0.0", + "author": "someone", + "repo": "someone/kanto-hard", + "summary": "Every trainer bites back.", + "shell": "#8b1a1a", + "label": "label.png", + "base": "red", + "engine": ">=1.0.0 <2.0.0", + "seal": "sealed", + "mods": [ + {"id": "harder-trainers", "source": "github", + "repo": "someone/harder-trainers", "version": "2.1.0", + "sha256": "a" * 64, + "options": {"difficulty": "brutal", "levelCap": 100, + "nuzlocke": True}}, + {"id": "new-music", "source": "gamebanana", "mod": 546899, + "file": 1294214, "md5": "b" * 32}, + ], + "load_order": ["new-music", "harder-trainers"], + } + + +def rules(findings): + return sorted({f.rule for f in findings if f.severity == "error"}) + + +def t_good(): + found = schema_findings(good_cart()) + assert not found, rules(found) + + +def t_identity(): + for key, value in (("id", "no spaces here"), ("id", "x" * 65), + ("title", ""), ("title", "t" * 49), + ("version", "1.0"), ("version", "v1.0.0"), + ("author", ""), ("shell", "8b1a1a"), + ("shell", "#8b1a1"), ("base", "crystal"), + ("seal", "welded"), ("schema", 2), + ("summary", "s" * 121), ("repo", "someone"), + ("engine", ">=1.0.0 <<2.0.0")): + cart = good_cart() + cart[key] = value + assert "CK002" in rules(schema_findings(cart)), (key, value) + + +def t_optional_fields(): + for key in ("repo", "summary", "engine", "label", "load_order", "seal"): + cart = good_cart() + del cart[key] + assert not schema_findings(cart), key + + +def t_unknown_field(): + cart = good_cart() + cart["colour"] = "red" + assert any(f.rule == "CK001" and f.severity == "warn" + for f in schema_findings(cart)) + + +def t_label(): + for value in ("/etc/passwd", "../out.png", "a/../../b.png", "x" * 129, + "C:\\art.png"): + cart = good_cart() + cart["label"] = value + assert "CK003" in rules(schema_findings(cart)), value + + +def t_mods(): + cart = good_cart() + cart["mods"] = [] + assert "CK004" in rules(schema_findings(cart)) + cart = good_cart() + cart["mods"] = [dict(cart["mods"][0]) for _ in range(65)] + assert "CK004" in rules(schema_findings(cart)) + cart = good_cart() + cart["mods"][1] = dict(cart["mods"][0]) + cart["load_order"] = ["harder-trainers", "harder-trainers"] + assert "CK004" in rules(schema_findings(cart)) + + +def t_pins(): + cases = [ + {"source": "torrent"}, + {"repo": "nope"}, + {"version": "1.0"}, + {"sha256": "A" * 64}, + {"sha256": "a" * 63}, + ] + for patch in cases: + cart = good_cart() + cart["mods"][0].update(patch) + assert "CK004" in rules(schema_findings(cart)), patch + for patch in [{"mod": 0}, {"mod": "546899"}, {"file": -1}, + {"md5": "B" * 32}, {"md5": "b" * 31}]: + cart = good_cart() + cart["mods"][1].update(patch) + assert "CK004" in rules(schema_findings(cart)), patch + + +def t_placeholder_warns(): + cart = good_cart() + cart["mods"][0]["repo"] = PLACEHOLDER_REPO + cart["mods"][0]["sha256"] = PLACEHOLDER_SHA + found = schema_findings(cart) + assert not rules(found) + assert sum(1 for f in found if f.severity == "warn") == 2 + + +def t_options(): + for value in ({"a": {"nested": 1}}, {"a": None}, {"a": ["list"]}, + {"k" * 65: 1}, {"a": "x" * 257}, + dict((str(n), n) for n in range(65))): + cart = good_cart() + cart["mods"][0]["options"] = value + assert "CK004" in rules(schema_findings(cart)), value + + +def t_load_order(): + for value in (["harder-trainers"], ["harder-trainers", "ghost"], + ["harder-trainers", "harder-trainers"], "harder-trainers", + [1, 2]): + cart = good_cart() + cart["load_order"] = value + assert "CK005" in rules(schema_findings(cart)), value + + +def t_lua_strings(): + assert lua_string('a"b') == '"a\\"b"' + assert lua_string("a\\b") == '"a\\\\b"' + assert lua_string("a\nb") == '"a\\\nb"' + assert lua_string("a\tb") == '"a\\9b"' + assert lua_string("a\t1") == '"a\\0091"' + assert lua_string("a\rb") == '"a\\13b"' + assert lua_string("Pokémon") == '"Pokémon"' + + +def t_lua_numbers(): + assert lua_value(3) == "3" + assert lua_value(-2) == "-2" + assert lua_value(0.5) == "0.5" + assert lua_value(True) == "true" + assert lua_value([]) == "{}" + assert lua_value({}) == "{}" + + +def t_bundle_shape(): + body = lua_encode(bundle_table(good_cart())) + assert body.startswith("return {\n") + assert body.endswith("}\n") + assert ' format = "g1rcart",' in body + assert " formatVersion = 1,\n" in body + assert body.index("cart =") < body.index("format =") < \ + body.index("formatVersion =") + assert '[1] = {' in body + + +def t_bundle_defaults(): + cart = good_cart() + del cart["seal"] + del cart["load_order"] + packed = packed_cart(cart) + assert packed["seal"] == "sealed" + assert packed["load_order"] == ["harder-trainers", "new-music"] + + +def t_bundle_deterministic(): + cart = good_cart() + shuffled = {key: cart[key] for key in reversed(list(cart))} + assert lua_encode(bundle_table(cart)) == lua_encode(bundle_table(shuffled)) + + +def t_bundle_label(): + art = label_art("#8b1a1a") + table = bundle_table(good_cart(), art, "label.png") + assert table["labelArt"]["bytes"] == len(art) + assert base64.b64decode(table["labelArt"]["data"]) == art + + +def t_specs(): + assert parse_spec("owner/repo@1.2.3") == ("github", "owner/repo", "1.2.3") + assert parse_spec("https://github.com/owner/repo@1.2.3") == \ + ("github", "owner/repo", "1.2.3") + assert parse_spec("owner/repo.git@v1.2.3") == \ + ("github", "owner/repo", "1.2.3") + assert parse_spec("https://gamebanana.com/mods/546899") == \ + ("gamebanana", 546899, None) + assert parse_spec("gamebanana:546899") == ("gamebanana", 546899, None) + assert parse_spec("546899") == ("gamebanana", 546899, None) + assert parse_spec("not a spec")[0] is None + + +def t_options_parse(): + assert parse_option("a=true") == ("a", True) + assert parse_option("a=3") == ("a", 3) + assert parse_option("a=1.5") == ("a", 1.5) + assert parse_option("a=hard") == ("a", "hard") + try: + parse_option("nope") + except ValueError: + return + raise AssertionError("--option without = must be rejected") + + +def t_ranges(): + for text in (">=1.0.0 <2.0.0", "^1.2", "1.2.3", ">1 || <0.9", "<=2"): + assert range_problem(text) is None, text + for text in ("", ">=x", ">>1.0.0", "1.0.0 || "): + assert range_problem(text) is not None, text + + +def t_png(): + art = label_art("#123456") + assert art.startswith(b"\x89PNG\r\n\x1a\n") + assert art[12:16] == b"IHDR" and art.endswith(b"IEND\xae\x42\x60\x82") + assert label_art("#123456") == art + + +def t_roundtrip(): + root = tempfile.mkdtemp(prefix="cartkit-selftest-") + repo = find_repo(os.path.dirname(os.path.abspath(__file__))) + try: + with contextlib.redirect_stdout(io.StringIO()): + _roundtrip(root, repo) + finally: + shutil.rmtree(root, ignore_errors=True) + + +def _roundtrip(root, repo): + assert main(["scaffold", "demo_cart", "--into", root, + "--quiet"]) == 0, "scaffold failed" + cart_dir = os.path.join(root, "demo_cart") + assert os.path.isfile(os.path.join(cart_dir, CART_FILE)) + assert os.path.isfile(os.path.join(cart_dir, "label.png")) + assert os.path.isfile(os.path.join(cart_dir, "README.md")) + assert os.path.isfile(os.path.join(cart_dir, "CHANGELOG.md")) + assert os.path.isfile(os.path.join(cart_dir, ".github", "workflows", + "release.yml")) or not repo + assert main(["validate", cart_dir, "--quiet"]) == 0, "validate failed" + assert main(["validate", cart_dir, "--quiet", "--strict"]) == 1, \ + "the placeholder pin must fail --strict" + cart, problem = read_cart(cart_dir) + assert problem is None + cart["mods"][0] = {"id": "harder-trainers", "source": "github", + "repo": "someone/harder-trainers", + "version": "2.1.0", "sha256": "c" * 64} + write_cart(cart_dir, cart) + assert main(["pack", cart_dir, "-o", + os.path.join(root, "out" + CART_EXT), "--quiet"]) == 0 + first = open(os.path.join(root, "out" + CART_EXT), "rb").read() + assert main(["pack", cart_dir, "-o", + os.path.join(root, "again" + CART_EXT), "--quiet"]) == 0 + again = open(os.path.join(root, "again" + CART_EXT), "rb").read() + assert first == again, "pack is not byte-identical twice" + assert first.startswith(b"return {\n") + assert b'id = "demo_cart"' in first + assert b'labelArt' in first + + +CHECKS = [ + ("schema accepts a full cart", t_good), + ("identity fields are checked", t_identity), + ("optional fields stay optional", t_optional_fields), + ("unknown top-level fields warn", t_unknown_field), + ("label paths cannot escape", t_label), + ("mods list bounds", t_mods), + ("pin fields per source", t_pins), + ("scaffold placeholders warn", t_placeholder_warns), + ("frozen options are scalars", t_options), + ("load_order is a permutation", t_load_order), + ("lua string escapes", t_lua_strings), + ("lua scalars and empty tables", t_lua_numbers), + ("bundle shape and key order", t_bundle_shape), + ("bundle materializes defaults", t_bundle_defaults), + ("bundle is order-independent", t_bundle_deterministic), + ("bundle carries the label art", t_bundle_label), + ("pin specs", t_specs), + ("option parsing", t_options_parse), + ("engine ranges", t_ranges), + ("label png is deterministic", t_png), + ("scaffold validate pack round trip", t_roundtrip), +] + + +def cmd_selftest(args, repo): + failures = [] + for name, check in CHECKS: + try: + check() + except Exception as problem: + failures.append((name, problem)) + if not args.quiet: + print(f"FAIL {name}: {problem!r}") + else: + if not args.quiet: + print(f"ok {name}") + if failures: + print(f"FAIL {len(failures)} of {len(CHECKS)} checks") + return 1 + if not args.quiet: + print(f"ok {len(CHECKS)} checks") + return 0 + + +# -------------------------------------------------------------------- main + +def main(argv): + shared = argparse.ArgumentParser(add_help=False) + shared.add_argument("--repo", default=argparse.SUPPRESS, + help="repo root override") + shared.add_argument("--json", action="store_true", + default=argparse.SUPPRESS) + shared.add_argument("--quiet", action="store_true", + default=argparse.SUPPRESS) + + parser = argparse.ArgumentParser(prog="cartkit", parents=[shared], + description="author, check and pack " + "custom carts") + sub = parser.add_subparsers(dest="command") + + p = sub.add_parser("scaffold", parents=[shared], + help="write a new cart repo") + p.add_argument("id") + p.add_argument("--title", help="shown on the cart, 1..48 characters") + p.add_argument("--author") + p.add_argument("--summary", help="one line, <=120 characters") + p.add_argument("--base", default="red", choices=list(BASES)) + p.add_argument("--shell", help="cart shell colour as #rrggbb") + p.add_argument("--seal", default="sealed", choices=list(SEALS), + help="sealed loads only the pinned mods; open lets the " + "player add more") + p.add_argument("--github", help="owner/repo this cart is published from") + p.add_argument("--into", help="parent directory for the new cart") + p.add_argument("--dest", help=argparse.SUPPRESS) + p.add_argument("--force", action="store_true") + + p = sub.add_parser("validate", parents=[shared], + help="check cart.json, offline unless --online") + p.add_argument("cart") + p.add_argument("--online", action="store_true", + help="resolve every pin against GitHub and GameBanana") + p.add_argument("--no-download", action="store_true", + help="never fetch a release asset just to hash it") + p.add_argument("--strict", action="store_true") + + p = sub.add_parser("pin", parents=[shared], + help="add or update one pin, resolving its hash") + p.add_argument("cart") + p.add_argument("spec", help="owner/repo@1.2.3, a gamebanana mod url, or " + "a gamebanana mod id") + p.add_argument("--id", help="mod id in the cart (default: derived)") + p.add_argument("--file", type=int, + help="gamebanana file id when the mod publishes several") + p.add_argument("--option", action="append", metavar="KEY=VALUE", + help="freeze an option value; true/false and numbers are " + "stored as such") + p.add_argument("--clear-options", action="store_true", + help="drop option values already frozen on this pin") + + p = sub.add_parser("pack", parents=[shared], + help="write -" + CART_EXT) + p.add_argument("cart") + p.add_argument("-o", "--output") + p.add_argument("--online", action="store_true") + p.add_argument("--no-download", action="store_true") + + p = sub.add_parser("add-release-workflow", parents=[shared], + help="copy the GitHub Actions release workflow in") + p.add_argument("cart") + p.add_argument("--force", action="store_true") + + sub.add_parser("selftest", parents=[shared], + help="run cartkit's own checks") + + args = parser.parse_args(argv) + for dest, fallback in (("repo", None), ("json", False), ("quiet", False)): + if not hasattr(args, dest): + setattr(args, dest, fallback) + if not args.command: + parser.print_help() + return 2 + + repo = args.repo or find_repo(os.getcwd()) or find_repo( + os.path.dirname(os.path.abspath(__file__))) + if repo: + repo = os.path.abspath(repo) + elif args.command in ("scaffold", "add-release-workflow"): + print("cartkit: cannot find the repo root " + "(looked for tools/rom_manifest.json); pass --repo PATH") + return 2 + + handler = { + "scaffold": cmd_scaffold, + "validate": cmd_validate, + "pin": cmd_pin, + "pack": cmd_pack, + "add-release-workflow": cmd_add_release_workflow, + "selftest": cmd_selftest, + }[args.command] + return handler(args, repo) + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From f895293217dc085f52f7edd4465bc9ee65ab14f6 Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Sun, 23 Aug 2026 12:21:50 -0400 Subject: [PATCH 21/33] Teach custom carts about Crystal Both features landed independently and each was green on its own, so the gap only appears in the combination. - tools/cartkit.py BASES did not list crystal, so cartkit rejected a Crystal cart as an unknown base game. The Lua validator never had this problem: it asks GameVersion.VERSIONS, so it accepted Crystal the moment the row existed. - Two self-tests used the literal "crystal" as their never-a-game sentinel and invert now that Crystal is real: tests/engine/cart_manifest.lua and cartkit's own t_identity. Both re-pointed at "nonesuch", the token the rest of the suite already uses for this. --- tests/engine/cart_manifest.lua | 2 +- tools/cartkit.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/engine/cart_manifest.lua b/tests/engine/cart_manifest.lua index 37a4a197..493fdc9a 100644 --- a/tests/engine/cart_manifest.lua +++ b/tests/engine/cart_manifest.lua @@ -139,7 +139,7 @@ rejects(function(c) c.label = "../../etc/passwd" end, "cart label", "a climbing rejects(function(c) c.label = "/etc/passwd" end, "cart label", "an absolute label path") rejects(function(c) c.label = ("a"):rep(129) end, "cart label", "a 129 character label path") rejects(function(c) c.base = nil end, "cart base", "a missing base game") -rejects(function(c) c.base = "crystal" end, "cart base", "an unknown base game") +rejects(function(c) c.base = "nonesuch" end, "cart base", "an unknown base game") rejects(function(c) c.engine = "" end, "cart engine", "an empty engine range") rejects(function(c) c.engine = 3 end, "cart engine", "a numeric engine range") rejects(function(c) c.seal = "welded" end, "cart seal", "an unknown seal") diff --git a/tools/cartkit.py b/tools/cartkit.py index 4852eba9..b1febf74 100644 --- a/tools/cartkit.py +++ b/tools/cartkit.py @@ -57,7 +57,7 @@ BUNDLE_FORMAT = "g1rcart" BUNDLE_VERSION = 1 CART_SCHEMA = 1 -BASES = ("red", "blue", "yellow", "gold", "silver") +BASES = ("red", "blue", "yellow", "gold", "silver", "crystal") SEALS = ("sealed", "open") SOURCES = ("github", "gamebanana") MAX_MODS = 64 @@ -1380,7 +1380,7 @@ def t_identity(): ("title", ""), ("title", "t" * 49), ("version", "1.0"), ("version", "v1.0.0"), ("author", ""), ("shell", "8b1a1a"), - ("shell", "#8b1a1"), ("base", "crystal"), + ("shell", "#8b1a1"), ("base", "nonesuch"), ("seal", "welded"), ("schema", 2), ("summary", "s" * 121), ("repo", "someone"), ("engine", ">=1.0.0 <<2.0.0")): From fad7443f944c475f1b97e5134d2b3d4c91cf6054 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sun, 23 Aug 2026 17:57:10 +0200 Subject: [PATCH 22/33] Route Gold's title menu and SAVE screen through Strings() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MainMenu.lua's row labels (CONTINUE/NEW GAME/OPTION/EXIT GAME), its clock box's AM/PM half, and its CONTINUE save-summary panel (PLAYER / BADGES/POKéDEX/TIME, or NO SAVE FILE) were bare literals, invisible to a translation mod's strings registry. SaveMenu.lua's confirm/overwrite/ saving/saved prompts, its YES/NO choice, and its own copy of the same summary panel had the same gap. Both mirror the Gen 1 port's already- translated equivalents (src/ui/TitleState.lua, src/ui/StartMenu.lua), which route every one of these rows through Strings(). SaveMenu's two-line prompts (module-level OVERWRITE_PROMPT/SAVING_PROMPT, plus the dynamically-built "%s saved\nthe game." and the confirm/failed messages) are now single Strings()-resolved strings with an embedded "\n", matching the Gen 1 port's own single-call convention for two-line messages, split into the two-slot table drawPanel's fixed-position Chrome.print calls expect only at draw time -- so a translation sees one whole sentence to reorder, not two independently-translated fragments. Added tests/engine/gen2_main_menu_translation_test.lua and gen2_save_menu_translation_test.lua: drive both screens' drawPanel()/ drawSavePanel() with a mod-loaded Strings catalog and check the translated text reaches Font.draw, plus a vanilla no-mod case proving the fallback is unchanged. Confirmed both catch the regression: reverting either file to its pre-fix content fails the corresponding suite (7 and 15 checks respectively). --- src/ui/gen2/MainMenu.lua | 21 +-- src/ui/gen2/SaveMenu.lua | 58 ++++-- .../gen2_main_menu_translation_test.lua | 119 +++++++++++++ .../gen2_save_menu_translation_test.lua | 167 ++++++++++++++++++ 4 files changed, 343 insertions(+), 22 deletions(-) create mode 100644 tests/engine/gen2_main_menu_translation_test.lua create mode 100644 tests/engine/gen2_save_menu_translation_test.lua diff --git a/src/ui/gen2/MainMenu.lua b/src/ui/gen2/MainMenu.lua index 15d653ec..da0d42e9 100644 --- a/src/ui/gen2/MainMenu.lua +++ b/src/ui/gen2/MainMenu.lua @@ -24,6 +24,7 @@ local Logger = require("src.core.Logger") local Music = require("src.core.Music") local Runtime = require("src.mods.Runtime") local Save = require("src.core.gen2.Save") +local Strings = require("src.core.Strings") local MainMenu = {} MainMenu.__index = MainMenu @@ -73,14 +74,14 @@ local function sameItems(_, items) return items end function MainMenu:buildList() local items = {} if self.hasSave then - items[#items + 1] = { label = "CONTINUE", value = "continue" } + items[#items + 1] = { label = Strings("CONTINUE"), value = "continue" } end - items[#items + 1] = { label = "NEW GAME", value = "new" } - items[#items + 1] = { label = "OPTION", value = "option" } + items[#items + 1] = { label = Strings("NEW GAME"), value = "new" } + items[#items + 1] = { label = Strings("OPTION"), value = "option" } -- Not on the cart: a cartridge is left by switching the console off, and -- there is no console here. Mirrors the Gen 1 port's title menu -- (src/ui/TitleState.lua), which adds the same row for the same reason. - items[#items + 1] = { label = "EXIT GAME", value = "exit" } + items[#items + 1] = { label = Strings("EXIT GAME"), value = "exit" } -- The same hook name and the same (game, items) payload the Gen 1 title -- menu raises (src/ui/TitleState.lua:openMenu), so one mod's title rows -- serve both games; only the row shape differs, because Chrome.List reads @@ -170,7 +171,7 @@ function MainMenu:drawClockBox() -- minutes; the AM/PM half is drawn by PrintHour itself. local display = hour % 12 if display == 0 then display = 12 end - local half = hour < 12 and "AM" or "PM" + local half = Strings(hour < 12 and "AM" or "PM") Chrome.print(("%s:%s %s"):format( Chrome.number(display, 2), Chrome.number(minute, 2, true), half), 4, 16) end @@ -180,15 +181,15 @@ function MainMenu:drawSavePanel() -- DisplaySaveInfoOnContinue: a box down the right side listing the trainer. Chrome.textbox(4, 0, 14, 9) if not summary then - Chrome.print("NO SAVE FILE", 5, 2) + Chrome.print(Strings("NO SAVE FILE"), 5, 2) return end - Chrome.print("PLAYER " .. summary.name, 5, 2) - Chrome.print("BADGES", 5, 4) + Chrome.print(Strings("PLAYER %s", summary.name), 5, 2) + Chrome.print(Strings("BADGES"), 5, 4) Chrome.printRight(tostring(summary.badges), 17, 4) - Chrome.print("POKéDEX", 5, 6) + Chrome.print(Strings("POKéDEX"), 5, 6) Chrome.printRight(tostring(summary.caught), 17, 6) - Chrome.print("TIME", 5, 8) + Chrome.print(Strings("TIME"), 5, 8) Chrome.printRight(("%d:%s"):format( summary.hours, Chrome.number(summary.minutes, 2, true)), 17, 8) end diff --git a/src/ui/gen2/SaveMenu.lua b/src/ui/gen2/SaveMenu.lua index c0eeb47b..17bdea32 100644 --- a/src/ui/gen2/SaveMenu.lua +++ b/src/ui/gen2/SaveMenu.lua @@ -26,6 +26,7 @@ local Chrome = require("src.ui.gen2.Chrome") local Save = require("src.core.gen2.Save") local Sound = require("src.core.Sound") +local Strings = require("src.core.Strings") local SaveMenu = {} SaveMenu.__index = SaveMenu @@ -55,10 +56,43 @@ local TIME_X, TIME_Y = 13, 8 local YESNO_X, YESNO_Y, YESNO_W, YESNO_H = 0, 7, 6, 5 -- AlreadyASaveFileText (AskOverwriteSaveFile, engine/menus/save.asm:47) and --- SavingDontTurnOffThePower's own line, shared with the PC's CHANGE BOX save. +-- SavingDontTurnOffThePower's own line, shared with the PC's CHANGE BOX save +-- (src/ui/gen2/PcMenu.lua:savePrompt(), which returns this two-slot table +-- straight through to its own lines[1]/lines[2] Chrome.print calls, so the +-- table shape here is a cross-file contract that must not change). local OVERWRITE_PROMPT = { "There is already a", "save file. Is it" } local SAVING_PROMPT = { "SAVING… DON'T TURN", "OFF THE POWER." } +-- The same two prompts as a single \n-joined Strings.source() key, used only +-- by this screen's own prompt() below (PcMenu keeps reading the untranslated +-- table above unchanged). One key lets a translation reorder the whole +-- sentence rather than two independently-translated fragments, and lets a +-- cart whose own translation shows it on ONE line (German's SAVING prompt +-- has no second line at all) say so directly -- the per-line "{RAM:...}"- +-- style split load_engine_overrides uses elsewhere requires a non-empty +-- override for every line, so it cannot express "this line is blank" the +-- way an embedded "\n"-less string can. +-- +-- Written as literals, not `table.concat(OVERWRITE_PROMPT, "\n")`: tools/ +-- modkit.py's STRINGS_CALL harvester matches a quoted string literal +-- immediately inside Strings.source(...)/Strings(...), not an arbitrary +-- expression, so a computed argument here would be invisible to every +-- translator's `modkit.py translation ... --refresh` scaffold despite the +-- runtime lookup working fine -- caught by an independent review. Keep +-- these two byte-for-byte in sync with OVERWRITE_PROMPT/SAVING_PROMPT +-- above (checked by tests/engine/gen2_save_menu_translation_test.lua). +local OVERWRITE_PROMPT_SOURCE = Strings.source("There is already a\nsave file. Is it") +local SAVING_PROMPT_SOURCE = Strings.source("SAVING… DON'T TURN\nOFF THE POWER.") + +-- Splits a Strings()-resolved "line one\nline two" into the two-slot table +-- drawPanel's fixed-position Chrome.print calls expect; a translation with no +-- "\n" at all (single-line messages like "Could not save.") lands whole on +-- the first slot, matching the untranslated code's own { text, "" } shape. +local function twoLines(text) + local first, second = text:match("^(.-)\n(.*)$") + return { first or text, second or "" } +end + function SaveMenu:wantsFillScale() return true end function SaveMenu:drawsWidescreen() return true end @@ -171,18 +205,18 @@ function SaveMenu:prompt() if self.phase == "overwrite" then -- AlreadyASaveFileText when the file is this player's; AnotherSaveFileText -- when the ID differs. Only the first can happen here. - return OVERWRITE_PROMPT + return twoLines(Strings(OVERWRITE_PROMPT_SOURCE)) end if self.phase == "saving" then - return SAVING_PROMPT + return twoLines(Strings(SAVING_PROMPT_SOURCE)) end if self.phase == "done" then if self.saved then - return { self:playerName() .. " saved", "the game." } + return twoLines(Strings("%s saved\nthe game.", self:playerName())) end - return { "Could not save.", "" } + return twoLines(Strings("Could not save.")) end - return { "Would you like to", "save the game?" } + return twoLines(Strings("Would you like to\nsave the game?")) end function SaveMenu:drawPanel() @@ -190,10 +224,10 @@ function SaveMenu:drawPanel() local summary = Save.summary(self.save) Chrome.box(PANEL_X, PANEL_Y, PANEL_W, PANEL_H) if summary then - Chrome.print("PLAYER " .. summary.name, LABEL_X, LABEL_Y) - Chrome.print("BADGES", LABEL_X, LABEL_Y + 2) - Chrome.print("POKéDEX", LABEL_X, LABEL_Y + 4) - Chrome.print("TIME", LABEL_X, LABEL_Y + 6) + Chrome.print(Strings("PLAYER %s", summary.name), LABEL_X, LABEL_Y) + Chrome.print(Strings("BADGES"), LABEL_X, LABEL_Y + 2) + Chrome.print(Strings("POKéDEX"), LABEL_X, LABEL_Y + 4) + Chrome.print(Strings("TIME"), LABEL_X, LABEL_Y + 6) -- PrintNum fills its field from the left, space padded. Chrome.print(Chrome.number(summary.badges, 2), BADGES_X, BADGES_Y) Chrome.print(Chrome.number(summary.caught, 3), DEX_X, DEX_Y) @@ -211,8 +245,8 @@ function SaveMenu:drawPanel() if self.phase == "confirm" or self.phase == "overwrite" then Chrome.box(YESNO_X, YESNO_Y, YESNO_W, YESNO_H) - Chrome.print("YES", YESNO_X + 2, YESNO_Y + 1) - Chrome.print("NO", YESNO_X + 2, YESNO_Y + 3) + Chrome.print(Strings("YES"), YESNO_X + 2, YESNO_Y + 1) + Chrome.print(Strings("NO"), YESNO_X + 2, YESNO_Y + 3) Chrome.cursor(YESNO_X + 1, YESNO_Y + (self.choice == 1 and 1 or 3)) end love.graphics.setColor(1, 1, 1, 1) diff --git a/tests/engine/gen2_main_menu_translation_test.lua b/tests/engine/gen2_main_menu_translation_test.lua new file mode 100644 index 00000000..e5c7152a --- /dev/null +++ b/tests/engine/gen2_main_menu_translation_test.lua @@ -0,0 +1,119 @@ +-- Gold's title/main menu (src/ui/gen2/MainMenu.lua) drew every row label +-- (CONTINUE/NEW GAME/OPTION/EXIT GAME), the clock box's AM/PM half, and the +-- CONTINUE save-summary panel's labels (PLAYER /BADGES/POKéDEX/TIME, +-- or NO SAVE FILE) as bare literals, invisible to a translation mod's +-- `strings` registry -- unlike the Gen 1 port's own title menu +-- (src/ui/TitleState.lua/StartMenu.lua), which already routes the same rows +-- through Strings(). Drives MainMenu:drawPanel()/:drawSavePanel() with a +-- mod-loaded Strings catalog and checks the translated text reaches +-- Font.draw, same technique as +-- tests/engine/gen2_naming_screen_translation_test.lua. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") + +love = require("tests.love_stub") + +require("src.core.Logger").warn = function() end + +local drawn +package.loaded["src.render.Font"] = { + draw = function(text, x, y) + drawn[#drawn + 1] = { text = text, x = x, y = y } + end, + drawCode = function() end, + drawBox = function() end, + width = function() return 0 end, +} + +local MainMenu = require("src.ui.gen2.MainMenu") +local Strings = require("src.core.Strings") + +local function drawnAt(x, y) + for _, d in ipairs(drawn) do + if d.x == x and d.y == y then return d.text end + end + return nil +end + +-- Chrome.print multiplies tile coordinates by 8 (src/ui/gen2/Chrome.lua). +-- List item 1 lands at (self.x, self.y) = (2, 2); the clock box's day name +-- at (1, 14) and the hour:minute half at (4, 16); the save panel's PLAYER +-- row at (5, 2). +local FIRST_ITEM_X, FIRST_ITEM_Y = 2 * 8, 2 * 8 +local CLOCK_HALF_X, CLOCK_HALF_Y = 4 * 8, 16 * 8 +local PANEL_PLAYER_X, PANEL_PLAYER_Y = 5 * 8, 2 * 8 + +local SAVE = { player = { name = "GOLD" } } +local CLOCK = { hour = 13, minute = 5, weekday = 1 } -- 1 PM, SUNDAY + +-- ---------------------------------------------- vanilla: no mod catalog +do + local menu = MainMenu.new({}, { hasSave = true, save = SAVE, clock = CLOCK }) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(FIRST_ITEM_X, FIRST_ITEM_Y), "CONTINUE", + "the title menu's first row draws in English with no mod loaded") + T.eq(drawnAt(CLOCK_HALF_X, CLOCK_HALF_Y), " 1:05 PM", + "and the clock box's AM/PM half") + + drawn = {} + menu:drawSavePanel() + T.eq(drawnAt(PANEL_PLAYER_X, PANEL_PLAYER_Y), "PLAYER GOLD", + "the CONTINUE save-summary panel too") + + local noSaveMenu = MainMenu.new({}, { hasSave = false, save = false, clock = CLOCK }) + drawn = {} + noSaveMenu:drawSavePanel() + T.eq(drawnAt(PANEL_PLAYER_X, PANEL_PLAYER_Y), "NO SAVE FILE", + "and its no-summary fallback") +end + +-- ------------------------------------------------- a translation mod's turn +do + Strings.load({ + strings = { + ["CONTINUE"] = "CONTINUAR", + ["NEW GAME"] = "NUEVA PARTIDA", + ["OPTION"] = "OPCIÓN", + ["EXIT GAME"] = "SALIR", + ["PM"] = "PM_ES", + ["PLAYER %s"] = "JUGADOR %s", + ["BADGES"] = "MEDALLAS", + ["POKéDEX"] = "POKéDEX_ES", + ["TIME"] = "TIEMPO", + ["NO SAVE FILE"] = "SIN PARTIDA", + }, + }) + + local menu = MainMenu.new({}, { hasSave = true, save = SAVE, clock = CLOCK }) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(FIRST_ITEM_X, FIRST_ITEM_Y), "CONTINUAR", + "a mod catalog reaches the title menu's first row") + T.eq(drawnAt(CLOCK_HALF_X, CLOCK_HALF_Y), " 1:05 PM_ES", + "and the clock box's AM/PM half") + + drawn = {} + menu:drawSavePanel() + T.eq(drawnAt(PANEL_PLAYER_X, PANEL_PLAYER_Y), "JUGADOR GOLD", + "the save-summary panel's PLAYER row takes the mod's own word order") + T.eq(drawnAt(5 * 8, 4 * 8), "MEDALLAS", "and BADGES") + T.eq(drawnAt(5 * 8, 6 * 8), "POKéDEX_ES", "and POKéDEX") + T.eq(drawnAt(5 * 8, 8 * 8), "TIEMPO", "and TIME") + + local noSaveMenu = MainMenu.new({}, { hasSave = false, save = false, clock = CLOCK }) + drawn = {} + noSaveMenu:drawSavePanel() + T.eq(drawnAt(PANEL_PLAYER_X, PANEL_PLAYER_Y), "SIN PARTIDA", + "and the no-summary fallback") + + -- Module state is process-global (see tests/gen2_clock_test.lua's own + -- note); this suite gets its own process from tests/tier_runner.lua, but + -- leaving the catalog loaded past this point would still mistranslate + -- every check below it in this file. + Strings.load({}) + T.check(not Strings.active(), "the catalog is unloaded for the checks after this one") +end + +T.finish("gen2_main_menu_translation_test") diff --git a/tests/engine/gen2_save_menu_translation_test.lua b/tests/engine/gen2_save_menu_translation_test.lua new file mode 100644 index 00000000..e74a9072 --- /dev/null +++ b/tests/engine/gen2_save_menu_translation_test.lua @@ -0,0 +1,167 @@ +-- Gold's SAVE screen (src/ui/gen2/SaveMenu.lua) drew every prompt ("Would +-- you like to save the game?", the overwrite/saving/saved messages), the +-- YES/NO choice, and the summary panel's labels (PLAYER /BADGES/ +-- POKéDEX/TIME) as bare literals, invisible to a translation mod's +-- `strings` registry -- unlike the Gen 1 port's own SAVE screen +-- (src/ui/StartMenu.lua), which already routes the same rows through +-- Strings(). Drives SaveMenu:drawPanel() directly at each phase with a +-- mod-loaded Strings catalog and checks the translated text reaches +-- Font.draw, same technique as +-- tests/engine/gen2_naming_screen_translation_test.lua. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") + +love = require("tests.love_stub") + +require("src.core.Logger").warn = function() end + +local drawn +package.loaded["src.render.Font"] = { + draw = function(text, x, y) + drawn[#drawn + 1] = { text = text, x = x, y = y } + end, + drawCode = function() end, + drawBox = function() end, + width = function() return 0 end, +} + +local SaveMenu = require("src.ui.gen2.SaveMenu") +local Strings = require("src.core.Strings") + +local function drawnAt(x, y) + for _, d in ipairs(drawn) do + if d.x == x and d.y == y then return d.text end + end + return nil +end + +-- Chrome.print multiplies tile coordinates by 8 (src/ui/gen2/Chrome.lua). +-- PLAYER row at (5, 2); the two prompt lines at (1, 14)/(1, 16); YES/NO at +-- (2, 8)/(2, 10) (YESNO_X + 2, YESNO_Y + 1 / + 3). +local PANEL_PLAYER_X, PANEL_PLAYER_Y = 5 * 8, 2 * 8 +local PROMPT1_X, PROMPT1_Y = 1 * 8, 14 * 8 +local PROMPT2_X, PROMPT2_Y = 1 * 8, 16 * 8 +local YES_X, YES_Y = 2 * 8, 8 * 8 +local NO_X, NO_Y = 2 * 8, 10 * 8 + +local SAVE = { player = { name = "GOLD" } } + +-- ---------------------------------------------- vanilla: no mod catalog +do + local menu = SaveMenu.new({}, { save = SAVE, existed = false }) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PANEL_PLAYER_X, PANEL_PLAYER_Y), "PLAYER GOLD", + "the summary panel draws in English with no mod loaded") + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "Would you like to", + "and the confirm prompt's first line") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "save the game?", "and its second line") + T.eq(drawnAt(YES_X, YES_Y), "YES", "and YES") + T.eq(drawnAt(NO_X, NO_Y), "NO", "and NO") + + menu.phase = "overwrite" + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "There is already a", "the overwrite prompt") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "save file. Is it", "its second line") + + menu.phase = "saving" + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "SAVING… DON'T TURN", "the saving message") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "OFF THE POWER.", "its second line") + + menu.phase, menu.saved = "done", true + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "GOLD saved", "the saved message") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "the game.", "its second line") + + menu.phase, menu.saved = "done", false + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "Could not save.", "the failed-save message") +end + +-- ------------------------------------------------- a translation mod's turn +do + Strings.load({ + strings = { + ["PLAYER %s"] = "JOUEUR %s", + ["BADGES"] = "BADGES_FR", + ["POKéDEX"] = "POKéDEX_FR", + ["TIME"] = "TEMPS", + ["YES"] = "OUI", + ["NO"] = "NON", + ["Would you like to\nsave the game?"] = "Voulez-vous\nsauvegarder ?", + ["There is already a\nsave file. Is it"] = "Un fichier existe\ndeja. Est-ce", + ["SAVING… DON'T TURN\nOFF THE POWER."] = "SAUVEGARDE...\nN'ETEIGNEZ PAS.", + ["%s saved\nthe game."] = "%s a sauvegarde\nla partie.", + ["Could not save."] = "Echec de sauvegarde.", + }, + }) + + local menu = SaveMenu.new({}, { save = SAVE, existed = false }) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PANEL_PLAYER_X, PANEL_PLAYER_Y), "JOUEUR GOLD", + "the summary panel's PLAYER row takes the mod's own word order") + T.eq(drawnAt(5 * 8, 4 * 8), "BADGES_FR", "and BADGES") + T.eq(drawnAt(5 * 8, 6 * 8), "POKéDEX_FR", "and POKéDEX") + T.eq(drawnAt(5 * 8, 8 * 8), "TEMPS", "and TIME") + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "Voulez-vous", "the confirm prompt") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "sauvegarder ?", "its second line") + T.eq(drawnAt(YES_X, YES_Y), "OUI", "and YES") + T.eq(drawnAt(NO_X, NO_Y), "NON", "and NO") + + menu.phase = "overwrite" + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "Un fichier existe", "the overwrite prompt") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "deja. Est-ce", "its second line") + + menu.phase = "saving" + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "SAUVEGARDE...", "the saving message") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "N'ETEIGNEZ PAS.", "its second line") + + menu.phase, menu.saved = "done", true + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "GOLD a sauvegarde", + "the saved message folds the player name into the mod's own word order") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "la partie.", "its second line") + + menu.phase, menu.saved = "done", false + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "Echec de sauvegarde.", "the failed-save message") + + -- Module state is process-global (see tests/gen2_clock_test.lua's own + -- note); this suite gets its own process from tests/tier_runner.lua, but + -- leaving the catalog loaded past this point would still mistranslate + -- every check below it in this file. + Strings.load({}) + T.check(not Strings.active(), "the catalog is unloaded for the checks after this one") +end + +-- src/ui/gen2/PcMenu.lua:savePrompt() returns SaveMenu.OVERWRITE_PROMPT/ +-- SAVING_PROMPT straight through to its own `lines[1]`/`lines[2]` +-- Chrome.print calls (the PC's CHANGE BOX save uses the same two prompts). +-- Indexing a plain string with [1]/[2] returns nil, not characters, so this +-- shape is a cross-file contract: it caught a real regression during review, +-- where routing these through a single Strings.source()-wrapped string (to +-- translate SaveMenu's own screen) silently turned them into non-table +-- values and left PcMenu's overwrite/saving prompt blank. +do + T.eq(type(SaveMenu.OVERWRITE_PROMPT), "table", "OVERWRITE_PROMPT stays a table for PcMenu.lua") + T.eq(SaveMenu.OVERWRITE_PROMPT[1], "There is already a", "and its first line stays indexable") + T.eq(SaveMenu.OVERWRITE_PROMPT[2], "save file. Is it", "and its second line") + T.eq(type(SaveMenu.SAVING_PROMPT), "table", "SAVING_PROMPT stays a table for PcMenu.lua") + T.eq(SaveMenu.SAVING_PROMPT[1], "SAVING… DON'T TURN", "and its first line stays indexable") + T.eq(SaveMenu.SAVING_PROMPT[2], "OFF THE POWER.", "and its second line") +end + +T.finish("gen2_save_menu_translation_test") From 654650e3ffac90a1650124d50aa10d70d33b8122 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Sun, 23 Aug 2026 19:31:38 +0200 Subject: [PATCH 23/33] Translate Pokegear's AM/PM too, and warn instead of corrupting a 3rd line An independent review flagged two gaps: Pokegear.lua's clock card (drawClock and the card-list clock view) prints the same AM/PM information MainMenu's clock box does, but was left as bare literals -- so a mod translating AM/PM would now show it correctly on the title screen and in English on the Pokegear for the exact same hour. Both call sites now go through Strings("AM")/Strings("PM"), the same source key MainMenu.lua already added, so no new corpus entry is needed on the translation-mods side. SaveMenu.lua's twoLines() only ever split on the first "\n": drawPanel's box has room for exactly two Chrome.print calls, so a translation needing a third line (nothing in the current fr/de/es/it overrides does, but nothing stopped one from trying) had nowhere on screen to go, and the extra "\n" landed as a literal newline byte drawn as glyph garbage on the second line with no indication anything was wrong. It now warns once per source text instead. Added a gen2_save_menu_translation_test.lua case driving drawPanel() with a three-line mod translation: confirms only the first two lines render, the warning fires exactly once (not once per frame), and drawing does not crash. Pokegear.lua has no engine-tier test suite to extend for the AM/PM change; verified by direct inspection and a syntax check instead. --- src/ui/gen2/Pokegear.lua | 5 +- src/ui/gen2/SaveMenu.lua | 54 +++++++++++-------- .../gen2_save_menu_translation_test.lua | 32 +++++++++++ 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/ui/gen2/Pokegear.lua b/src/ui/gen2/Pokegear.lua index 4d94027e..14c54177 100644 --- a/src/ui/gen2/Pokegear.lua +++ b/src/ui/gen2/Pokegear.lua @@ -26,6 +26,7 @@ local Font = require("src.render.Font") local Palettes = require("src.world.gen2.Palettes") local Phone = require("src.core.gen2.Phone") local SpriteRenderer = require("src.render.SpriteRenderer") +local Strings = require("src.core.Strings") local TileSheet = require("src.ui.gen2.TileSheet") local Pokegear = {} @@ -1881,7 +1882,7 @@ function Pokegear:drawClock() self:text(Chrome.number(display, 2), 6, 8) self:text(":", 8, 8) self:text(Chrome.number(minute, 2, true), 9, 8) - self:text(hour < 12 and "AM" or "PM", 12, 8) + self:text(Strings(hour < 12 and "AM" or "PM"), 12, 8) -- The bottom Textbox is part of the card (lb bc, 4, 18 at (0,12)), and -- PokegearClock_Init prints PokegearPressButtonText straight into it @@ -2218,7 +2219,7 @@ function Pokegear:drawPlain() if display == 0 then display = 12 end Chrome.print(("%s:%s %s"):format( Chrome.number(display, 2), Chrome.number(minute, 2, true), - hour < 12 and "AM" or "PM"), 5, 9) + Strings(hour < 12 and "AM" or "PM")), 5, 9) Chrome.print(Clock.daytimeLabel(hour), 5, 11) elseif id == "radio" then -- Without the gear sheet there is no dial art, so the frequencies go down diff --git a/src/ui/gen2/SaveMenu.lua b/src/ui/gen2/SaveMenu.lua index 17bdea32..d3e0eacc 100644 --- a/src/ui/gen2/SaveMenu.lua +++ b/src/ui/gen2/SaveMenu.lua @@ -24,6 +24,7 @@ -- one-line call. local Chrome = require("src.ui.gen2.Chrome") +local Logger = require("src.core.Logger") local Save = require("src.core.gen2.Save") local Sound = require("src.core.Sound") local Strings = require("src.core.Strings") @@ -57,39 +58,46 @@ local YESNO_X, YESNO_Y, YESNO_W, YESNO_H = 0, 7, 6, 5 -- AlreadyASaveFileText (AskOverwriteSaveFile, engine/menus/save.asm:47) and -- SavingDontTurnOffThePower's own line, shared with the PC's CHANGE BOX save --- (src/ui/gen2/PcMenu.lua:savePrompt(), which returns this two-slot table --- straight through to its own lines[1]/lines[2] Chrome.print calls, so the --- table shape here is a cross-file contract that must not change). +-- (src/ui/gen2/PcMenu.lua:savePrompt() reads these two tables' lines[1]/ +-- lines[2] directly, so their shape is a cross-file contract: keep them +-- plain, untranslated tables). local OVERWRITE_PROMPT = { "There is already a", "save file. Is it" } local SAVING_PROMPT = { "SAVING… DON'T TURN", "OFF THE POWER." } --- The same two prompts as a single \n-joined Strings.source() key, used only --- by this screen's own prompt() below (PcMenu keeps reading the untranslated --- table above unchanged). One key lets a translation reorder the whole --- sentence rather than two independently-translated fragments, and lets a --- cart whose own translation shows it on ONE line (German's SAVING prompt --- has no second line at all) say so directly -- the per-line "{RAM:...}"- --- style split load_engine_overrides uses elsewhere requires a non-empty --- override for every line, so it cannot express "this line is blank" the --- way an embedded "\n"-less string can. +-- Translatable copies of the two prompts above, one \n-joined key each, used +-- only by this screen's own prompt() below. One key per prompt lets a +-- translation write one whole, freely reordered sentence instead of two +-- fragments translated in isolation, and lets a cart whose own text is a +-- single line (German's SAVING prompt) say so directly by simply omitting +-- the "\n" -- the per-line override style used elsewhere requires a +-- non-empty value for every line, so it can't express "this line is blank". -- --- Written as literals, not `table.concat(OVERWRITE_PROMPT, "\n")`: tools/ --- modkit.py's STRINGS_CALL harvester matches a quoted string literal --- immediately inside Strings.source(...)/Strings(...), not an arbitrary --- expression, so a computed argument here would be invisible to every --- translator's `modkit.py translation ... --refresh` scaffold despite the --- runtime lookup working fine -- caught by an independent review. Keep --- these two byte-for-byte in sync with OVERWRITE_PROMPT/SAVING_PROMPT --- above (checked by tests/engine/gen2_save_menu_translation_test.lua). +-- Written as literals, not `table.concat(OVERWRITE_PROMPT, "\n")`: the +-- translation tooling's string harvester only recognizes a literal inside +-- Strings.source(...), not a computed expression, so a concat call here +-- would quietly never reach a translator. Keep byte-for-byte in sync with +-- OVERWRITE_PROMPT/SAVING_PROMPT above (checked by +-- tests/engine/gen2_save_menu_translation_test.lua). local OVERWRITE_PROMPT_SOURCE = Strings.source("There is already a\nsave file. Is it") local SAVING_PROMPT_SOURCE = Strings.source("SAVING… DON'T TURN\nOFF THE POWER.") --- Splits a Strings()-resolved "line one\nline two" into the two-slot table --- drawPanel's fixed-position Chrome.print calls expect; a translation with no --- "\n" at all (single-line messages like "Could not save.") lands whole on +-- Splits a translated "line one\nline two" string back into the two-slot +-- table drawPanel's fixed Chrome.print calls expect. No "\n" at all (a +-- single-line message, or German's one-line SAVING prompt) lands whole on -- the first slot, matching the untranslated code's own { text, "" } shape. +-- +-- Only the first "\n" splits, since this box has room for exactly two +-- lines. A third line would otherwise draw as a raw newline byte -- garbage +-- glyph data -- with no other sign anything went wrong, so this warns once +-- per string instead. +local warnedTooManyLines = {} local function twoLines(text) local first, second = text:match("^(.-)\n(.*)$") + if second and second:find("\n", 1, true) and not warnedTooManyLines[text] then + warnedTooManyLines[text] = true + Logger.warn("SaveMenu: translation of %q has more than two lines; " .. + "only the first two fit this box", text) + end return { first or text, second or "" } end diff --git a/tests/engine/gen2_save_menu_translation_test.lua b/tests/engine/gen2_save_menu_translation_test.lua index e74a9072..c560d0bf 100644 --- a/tests/engine/gen2_save_menu_translation_test.lua +++ b/tests/engine/gen2_save_menu_translation_test.lua @@ -164,4 +164,36 @@ do T.eq(SaveMenu.SAVING_PROMPT[2], "OFF THE POWER.", "and its second line") end +-- A translation with a THIRD line (a second embedded "\n") has nowhere on +-- screen to go -- drawPanel's box has room for exactly two Chrome.print +-- calls -- so it must not silently draw the literal newline byte as glyph +-- garbage on the second line, and should warn so a translator notices. +do + Strings.load({ + strings = { + ["Would you like to\nsave the game?"] = "Ligne un\nLigne deux\nLigne trois", + }, + }) + + local warned = {} + require("src.core.Logger").warn = function(fmt, ...) + warned[#warned + 1] = select("#", ...) > 0 and fmt:format(...) or fmt + end + + local menu = SaveMenu.new({}, { save = SAVE, existed = false }) + drawn = {} + menu:drawPanel() + T.eq(drawnAt(PROMPT1_X, PROMPT1_Y), "Ligne un", "only the first line reaches the box") + T.eq(drawnAt(PROMPT2_X, PROMPT2_Y), "Ligne deux\nLigne trois", + "the rest lands in the second slot rather than vanishing") + T.check(#warned == 1, "and a single warning is logged") + + drawn = {} + menu:drawPanel() + T.check(#warned == 1, "the warning does not repeat for the same text") + + require("src.core.Logger").warn = function() end + Strings.load({}) +end + T.finish("gen2_save_menu_translation_test") From 2ad2e028d10abec839ee06990f660d881d4ab379 Mon Sep 17 00:00:00 2001 From: MaxTomahawk Date: Mon, 24 Aug 2026 09:32:34 +0200 Subject: [PATCH 24/33] feat(mod-api): expose field residual descriptors --- docs/mod-api-gen2-compat.md | 3 + docs/modding.md | 41 +++ docs/rfcs/0016-battle-field-residual.md | 123 +++++++ src/battle/BattleState.lua | 106 ++++++ .../battle_field_residual_validation.lua | 336 ++++++++++++++++++ tests/modkit/cases/battle_field_residual.lua | 145 ++++++++ tests/parity_double_faint.lua | 18 + 7 files changed, 772 insertions(+) create mode 100644 docs/rfcs/0016-battle-field-residual.md create mode 100644 tests/engine/battle_field_residual_validation.lua create mode 100644 tests/modkit/cases/battle_field_residual.lua diff --git a/docs/mod-api-gen2-compat.md b/docs/mod-api-gen2-compat.md index 716a2607..92cc0839 100644 --- a/docs/mod-api-gen2-compat.md +++ b/docs/mod-api-gen2-compat.md @@ -783,6 +783,9 @@ name and the existing payload, plus fields where Gen 2 genuinely carries more The list is much shorter than it was. What is outstanding, in descending value: +- `battle.field_residual`: the first guarded call site is in Gen 1 end-of-round + processing. Gold already has a native weather/between-turn pipeline but does + not yet expose the shared data-only descriptor hook. - `trainer.before_battle`: Gold constructs and pushes its trainer battle in `src/world/gen2/World.lua:startBattle`, which does not yet expose a deferred preparation boundary or a battle-local player-party view. Gen 1 mods can use diff --git a/docs/modding.md b/docs/modding.md index 7c724404..50ac2ad8 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -857,6 +857,47 @@ which stay unconditional and are never visible to a subscriber. Developer mode also arms the mod loader's dev tripwire, which flags mods that reach outside their permission set. +## Battle field residual hook + +`battle.field_residual` lets a Gen 1 battle-rule mod request end-of-round +damage without mutating live battlers. It is guarded and runs after vanilla +status residuals, before field-token expiry and `battle.turn_ended`. The +wrapper receives `(next, context)`, calls `next(context)` for the existing +descriptor list, and appends data-only rows: + +```lua +mod.hooks:wrap("battle.field_residual", function(next, context) + local rows = next(context) + rows[#rows + 1] = { + side = "enemy", amount = 7, + message = context.battlers.enemy.name .. " is buffeted!", + } + return rows +end) +``` + +`context.field` is a detached, data-only view with the same +`{ weather, tokens }` shape that battle checkpoints capture; it does not expose +`field.sides` or any live battler aliases. The projection recursively retains +raw tables and finite numbers, strings, and booleans under scalar keys. It +strips metatables and omits functions, userdata, threads, unsupported keys, and +cyclic edges. Consequently a wrapper cannot obtain or invoke an engine callback +even if a live field token uses one internally, and changing any nested view +value cannot change live field state. `context.battlers.player` and `.enemy` are +detached `{ side, name, hp, maxHp, types, vanished }` views, and `context.turn` +is the current turn number. A descriptor accepts `side` +(`player` or `enemy`), a positive, finite integer number `amount`, and an +optional string `message`. +Numeric strings and invalid rows are ignored; damage is clamped to current HP. +The engine retains HP-bar, faint, experience, and replacement authority. If +both active battlers take terminal residual damage together and the player has +no healthy reserve, this hook batch queues only the player faint authority and +resolves as a blackout loss without an enemy-faint EXP award or replacement. +That precedence is local to accepted rows from this hook; native faint paths +are unchanged when no hook is active. Hook callbacks remain process-local; +checkpoints serialize only field data. Gold does not yet raise this hook; its +native weather pipeline is documented in `docs/mod-api-gen2-compat.md`. + ## Process-lifecycle hooks These exist so a platform-specific launcher integration (a native shell diff --git a/docs/rfcs/0016-battle-field-residual.md b/docs/rfcs/0016-battle-field-residual.md new file mode 100644 index 00000000..07eba812 --- /dev/null +++ b/docs/rfcs/0016-battle-field-residual.md @@ -0,0 +1,123 @@ +# RFC 0016: Engine-owned field residual descriptors + +## Status + +Proposed. + +## Motivation + +Battle-rule mods can keep deterministic data-only state in the public battle +field and observe `battle.turn_ended`, but that event fires after the engine's +residual and faint pipeline. A listener cannot safely deal end-of-round field +damage: directly changing live HP bypasses bar drains, faint messages, +experience, replacements, double-faint resolution, and checkpoint continuation. +Putting callbacks into `battle.field` is also rejected by the checkpoint +serializer, correctly, because executable state is not save-safe. + +## Decision and plan extended + +This implements **D-AT-004: public engine-owned field residual execution**, the +consuming decision required by Adaptive Trainers capability `ENGINE-FIELD- +RESIDUALS`. The plan is +[`docs/superpowers/plans/2026-08-14-adaptive-trainers.md`](https://github.com/MaxTomahawk/gen1recomp-adaptive-trainers/blob/main/docs/superpowers/plans/2026-08-14-adaptive-trainers.md), +Task 8. The engine delta defines only a generic end-of-round extension point; +it contains no weather names, immunities, damage formula, trainer identity, or +Adaptive Trainers policy. + +## Exact API delta + +Add the guarded Gen 1 hook: + +```lua +mod.hooks:wrap("battle.field_residual", function(next, context) + local rows = next(context) + rows[#rows + 1] = { + side = "enemy", + amount = 7, + message = context.battlers.enemy.name .. " is buffeted!", + } + return rows +end) +``` + +The hook runs once during an undecided battle's end-of-round processing, after +vanilla status residuals and before field/side token expiry and +`battle.turn_ended`. With no subscriber, the guarded site builds no context and +changes nothing. Vanilla contributes an empty list. + +`context` is `{ field, battlers, turn }`. `field` is a strictly data-only view +with the same `{ weather, tokens }` shape captured by battle checkpoints. Its +recursive projection retains raw tables and finite numbers, strings, and +booleans under scalar keys. It strips metatables and omits functions, userdata, +threads, unsupported keys, and cyclic edges. Thus it exposes neither +`field.sides` nor a graph or executable callback back into live engine state. +`battlers.player` and `battlers.enemy` are detached snapshots with `{ side, +name, hp, maxHp, types, vanished }`. Changing either detached view cannot +change the live battle. `turn` is the current Gen 1 turn counter. + +A result row is `{ side = "player"|"enemy", amount = +positive_finite_integer_number, message = optional_string }`. Numeric strings, +zero, negatives, fractions, NaN, infinities, malformed sides, and non-string +messages fail closed. Damage is clamped to current HP. The engine owns +mutation, HP-bar drain rows, and its existing faint pipeline. It applies every +accepted row before scheduling newly fainted battlers. If this hook batch +terminally faints the player with no healthy reserve, it queues only the player +faint authority, so descriptor order cannot race a blackout against an enemy +EXP/replacement path. Otherwise it schedules newly fainted battlers in fixed +player/enemy order. This precedence is scoped to this hook response; native +faint paths, including `enemyMonFainted`, keep their existing no-hook behavior. +Wrappers compose by calling `next(context)` and appending their own rows. +Callbacks are not part of the descriptor contract and hook functions are never +stored in the battle. + +Gold already owns native weather and a generation-specific between-turn order; +this first additive call site is Gen 1-only. A future Gold site must keep the +same context and descriptor contract and choose its native ordering explicitly. + +## Migration and compatibility + +Existing mods change nothing. No hook name or payload changes. With no wrapper, +Gen 1 performs the same residual, token, event, and faint work as before, +including native simultaneous-faint resolution, and allocates no context. Gen +2 is unchanged. Existing and new checkpoints keep +serializing only the data stored in `battle.field`; hook callbacks remain +process-local loader state and are never serialized. + +The v1 surface remains unchanged: `content.X:register/override/get`, +`events:on`, `hooks:wrap`, `mod.log`, `mod:read`, manifest v1 fields, and +`pokemon.before_give` keep their existing behavior. + +## Verification + +- The catalog hook parity gate proves null and live-empty buses return the + vanilla list unchanged. +- A sandboxed fixture mod exercises the seam through `mod.hooks`, verifies the + detached checkpoint-shaped context, applies damage, and reaches the engine + faint pipeline. +- Engine validation tests cover strict number validation (including numeric + strings, NaN, infinities, zero, and negatives), nested mutation isolation, + omission of functions/userdata/threads/cycles and metatables from the public + field projection, optional messages, non-table results, clamping, and + settled-battle suppression. +- Both descriptor orders are driven through queue completion for a simultaneous + terminal residual. Each proves player blackout loss with no EXP event, + enemy replacement, or replacement UI. +- A disabled-bus sentinel proves the guard performs no `Runtime.call` or field + context construction. An ordering probe proves the enabled hook runs after + vanilla status residuals and before token expiry and `battle.turn_ended`. +- A no-hook native regression proves a simultaneous zero-HP state still enters + the pre-existing enemy-faint EXP and win authority outside this hook batch. +- Capture/restore/capture evidence proves checkpointed field state round-trips + while the enabled process-local hook remains installed and callable. + +## Docs with the change + +`docs/modding.md` documents the Gen 1 timing, detached payload, descriptor +validation, simultaneous-terminal result, and checkpoint boundary. +`docs/mod-api-gen2-compat.md` records that Gold does not yet expose the hook. +No registry or schema changes are involved, so generated registry docs do not +change. + +## Deprecation etiquette + +Nothing is deprecated. The hook is additive. diff --git a/src/battle/BattleState.lua b/src/battle/BattleState.lua index bae8aaa7..c4e50160 100644 --- a/src/battle/BattleState.lua +++ b/src/battle/BattleState.lua @@ -2792,6 +2792,111 @@ function BattleState:queueResidual(b, opp) end end +local function fieldBattlerView(battler, side) + local types = {} + for index, typeId in ipairs(battler.curTypes or {}) do + types[index] = typeId + end + local mon = battler.mon or {} + return { + side = side, + name = battler.name, + hp = tonumber(mon.hp) or 0, + maxHp = tonumber(mon.stats and mon.stats.hp) or tonumber(mon.hp) or 0, + types = types, + vanished = battler.invulnerable and true or false, + } +end + +local function publicScalar(value) + local kind = type(value) + if kind == "string" or kind == "boolean" then return value, true end + if kind == "number" and value == value + and value < math.huge and value > -math.huge then + return value, true + end + return nil, false +end + +local function publicDataCopy(value, visiting) + local scalar, ok = publicScalar(value) + if ok then return scalar, true end + if type(value) ~= "table" then return nil, false end + + visiting = visiting or {} + if visiting[value] then return nil, false end + visiting[value] = true + + local copy = {} + for key, child in next, value do + local copiedKey, keyOk = publicScalar(key) + local copiedChild, childOk = publicDataCopy(child, visiting) + if keyOk and childOk then copy[copiedKey] = copiedChild end + end + visiting[value] = nil + return copy, true +end + +local function checkpointFieldView(field) + field = field or {} + local view = publicDataCopy({ + weather = field.weather, + tokens = field.tokens or {}, + }) + return view +end + +-- Public field residuals are data-only requests. Mods can inspect a detached +-- checkpoint-shaped field view and detached battler views, but only the engine +-- mutates HP, animates the bar, or enters the faint pipeline. +function BattleState:applyFieldResiduals() + if not Runtime.wantsHook("battle.field_residual") then return end + local views = { + player = fieldBattlerView(self.player, "player"), + enemy = fieldBattlerView(self.enemy, "enemy"), + } + local rows = Runtime.call("battle.field_residual", function() return {} end, { + field = checkpointFieldView(self.field), + battlers = views, + turn = self.turnCount or 0, + }) + if type(rows) ~= "table" then return end + + local fainted = {} + for _, row in ipairs(rows) do + local battler = type(row) == "table" and row.side == "player" + and self.player or type(row) == "table" and row.side == "enemy" + and self.enemy or nil + local amount = type(row) == "table" and row.amount or nil + if battler and battler.mon.hp > 0 and type(amount) == "number" + and amount > 0 + and amount < math.huge and amount == math.floor(amount) + and (row.message == nil or type(row.message) == "string") then + amount = math.min(amount, battler.mon.hp) + if type(row.message) == "string" and row.message ~= "" then + self:sayNext(row.message) + end + battler.mon.hp = battler.mon.hp - amount + self:drainNext(battler, battler.mon.hp) + if battler.mon.hp <= 0 then fainted[battler] = true end + end + end + -- A terminal player faint owns a simultaneous field-residual batch. Queue + -- only that authority so its blackout cannot race an enemy EXP/replacement + -- path from the same hook response. Native faint paths remain untouched. + if fainted[self.player] + and not Party.firstHealthy(self:playerPartyView()) then + self:onFaint(self.player) + return + end + + -- Otherwise resolve the two sides in engine order after every accepted + -- descriptor has landed. Descriptor order must not decide resolution. + for _, battler in ipairs({ self.player, self.enemy }) do + if fainted[battler] then self:onFaint(battler) end + end +end + function BattleState:endOfTurn() -- the same ret: a decided battle never reaches HandlePoisonBurnLeechSeed -- or CheckNumAttacksLeft (core.asm:417-421, 456-460), so the residual @@ -2845,6 +2950,7 @@ function BattleState:endOfTurn() b.trappingTurns = nil end end + self:applyFieldResiduals() self:tickTokens() Runtime.emit("battle.turn_ended", { battle = self, turn = self.turnCount or 0 }) end diff --git a/tests/engine/battle_field_residual_validation.lua b/tests/engine/battle_field_residual_validation.lua new file mode 100644 index 00000000..a61c589b --- /dev/null +++ b/tests/engine/battle_field_residual_validation.lua @@ -0,0 +1,336 @@ +-- Validation and fail-closed behavior for battle.field_residual descriptors. + +package.path = "./?.lua;./?/init.lua;" .. package.path +love = love or require("tests.love_stub") + +local T = require("tests.modkit") +local BattleState = require("src.battle.BattleState") +local Checkpoint = require("src.core.Checkpoint") +local Events = require("src.mods.Events") +local GameMethods = require("src.core.Game") +local Hooks = require("src.mods.Hooks") +local Pokemon = require("src.pokemon.Pokemon") +local Runtime = require("src.mods.Runtime") +local SaveData = require("src.core.SaveData") +local StateStack = require("src.core.StateStack") +local TypeChart = require("src.battle.TypeChart") + +local data = T.fixtures.fresh() +TypeChart.load(data) + +local function newBattle() + local save = SaveData.newGame() + save.party = { Pokemon.new(data, "FIXMON_A", 30) } + local game = { + data = data, + save = save, + stack = { top = function() return nil end, push = function() end }, + } + local battle = BattleState.newWild(game, "FIXMON_C", 30) + battle.phase, battle.queue = "menu", {} + return battle +end + +local savedEvents, savedHooks, savedErrors = Runtime.events, Runtime.hooks, + Runtime.errors +local hooks = Hooks.new() +Runtime.install(savedEvents, hooks, {}) + +local battle = newBattle() +local playerHp, enemyHp = battle.player.mon.hp, battle.enemy.mon.hp +local playerType = battle.player.curTypes[1] +local cyclic = { label = "cycle-data" } +cyclic.self = cyclic +local metatableData = setmetatable({ label = "plain-data" }, { + __index = { hidden = "metatable-data" }, +}) +battle.field.weather = { + id = "probe", turns = 3, + callback = function() end, + handle = io.stdout, + worker = coroutine.create(function() end), + cyclic = cyclic, + metatableData = metatableData, +} +battle.field.tokens[1] = { id = "nested", turns = 2, + state = { intensity = 4 } } +battle:enter() +hooks:wrap("battle.field_residual", function(next, context) + local vanilla = next(context) + T.same(vanilla, {}, "the vanilla contribution is an empty descriptor list") + context.battlers.player.hp = 0 + context.battlers.player.types[1] = "MUTATED" + T.eq(context.field.sides, nil, + "the field view has the checkpoint shape and no live side graph") + T.eq(context.field.weather.callback, nil, + "the field view omits executable values") + T.eq(context.field.weather.handle, nil, + "the field view omits userdata") + T.eq(context.field.weather.worker, nil, + "the field view omits threads") + T.eq(context.field.weather.cyclic.label, "cycle-data", + "the field view retains scalar data around a cycle") + T.eq(context.field.weather.cyclic.self, nil, + "the field view omits cyclic edges") + T.eq(getmetatable(context.field.weather.metatableData), nil, + "the field view carries no metatable") + T.eq(context.field.weather.metatableData.label, "plain-data", + "the field view retains raw data from a metatable-bearing table") + T.eq(context.field.weather.metatableData.hidden, nil, + "the field view does not expose metatable-provided values") + context.field.weather.turns = 0 + context.field.tokens[1].state.intensity = 99 + return { + false, + { side = "unknown", amount = 20, message = "invalid side" }, + { side = "player", amount = "3", message = "numeric string" }, + { side = "player", amount = 0, message = "zero" }, + { side = "player", amount = -2, message = "negative" }, + { side = "player", amount = 1.5, message = "fractional" }, + { side = "player", amount = "not a number", message = "bad amount" }, + { side = "player", amount = 0 / 0, message = "not finite" }, + { side = "player", amount = math.huge, message = "non-finite" }, + { side = "player", amount = 2, message = function() end }, + { side = "enemy", amount = 3 }, + } +end, 0, "validation_probe") + +battle:applyFieldResiduals() +T.eq(battle.player.mon.hp, playerHp, + "a descriptor with a non-string message fails closed") +T.eq(battle.enemy.mon.hp, enemyHp - 3, + "a valid descriptor may omit its message") +T.eq(battle.player.curTypes[1], playerType, + "mutating the detached type view cannot mutate the live battler") +T.check(battle.player.mon.hp ~= 0, + "mutating detached HP cannot replace engine damage authority") +T.eq(battle.field.weather.turns, 3, + "mutating the detached weather view cannot mutate live field state") +T.eq(battle.field.tokens[1].state.intensity, 4, + "mutating nested detached token state cannot mutate live field state") + +local guarded = newBattle() +local fieldReads, runtimeCalls = 0, 0 +guarded.field = setmetatable({}, { __index = function() + fieldReads = fieldReads + 1 + return nil +end }) +local realRuntimeCall = Runtime.call +Runtime.call = function(...) + runtimeCalls = runtimeCalls + 1 + return realRuntimeCall(...) +end +Runtime.install(savedEvents, Hooks.new(), {}) +guarded:applyFieldResiduals() +Runtime.call = realRuntimeCall +T.eq(runtimeCalls, 0, + "a disabled field hook never enters Runtime.call") +T.eq(fieldReads, 0, + "a disabled field hook does not construct its field context") + +local nilBattle = newBattle() +local nilHp = nilBattle.player.mon.hp +local nilHooks = Hooks.new() +Runtime.install(savedEvents, nilHooks, {}) +nilHooks:wrap("battle.field_residual", function() return nil end, + 0, "nil_probe") +nilBattle:applyFieldResiduals() +T.eq(nilBattle.player.mon.hp, nilHp, + "a non-table hook result fails closed") + +local settled = newBattle() +local settledCalls = 0 +local settledHooks = Hooks.new() +Runtime.install(savedEvents, settledHooks, {}) +settledHooks:wrap("battle.field_residual", function(next, context) + settledCalls = settledCalls + 1 + return next(context) +end, 0, "settled_probe") +settled.result = "win" +settled:endOfTurn() +T.eq(settledCalls, 0, + "a settled battle never invokes field residual policy") + +local function drainQueue(battle) + local rows, guard = {}, 0 + while battle.queue[1] and guard < 1000 do + guard = guard + 1 + local row = table.remove(battle.queue, 1) + rows[#rows + 1] = row + if row.fn then + battle.nextInsert = 0 + row.fn() + end + end + T.check(guard < 1000, "the simultaneous-faint queue completes") + return rows +end + +local function simultaneousTerminal(order) + local save = SaveData.newGame() + save.party = { Pokemon.new(data, "FIXMON_A", 30) } + local game = { + data = data, + save = save, + stack = { top = function() return nil end, push = function() end }, + } + local double = BattleState.newTrainer(game, "OPP_FIX_YOUNGSTER", 1) + double.phase, double.queue = "menu", {} + local originalEnemy, originalEnemyIndex = double.enemy, double.enemyIndex + local startingExp = double.player.mon.exp + local events, doubleHooks = Events.new(), Hooks.new() + local awardCalls, expEvents, switches = 0, 0, 0 + events:on("battle.exp_gained", function() expEvents = expEvents + 1 end, + 0, "double_probe") + events:on("battle.battler_switched", function() switches = switches + 1 end, + 0, "double_probe") + Runtime.install(events, doubleHooks, {}) + doubleHooks:wrap("battle.field_residual", function(next, context) + local rows = next(context) + for _, side in ipairs(order) do + rows[#rows + 1] = { + side = side, + amount = context.battlers[side].hp, + } + end + return rows + end, 0, "double_probe") + doubleHooks:wrap("battle.exp_award", function(next, context) + awardCalls = awardCalls + 1 + return next(context) + end, 0, "double_probe") + double:endOfTurn() + local queued = drainQueue(double) + T.eq(double.player.mon.hp, 0, + "simultaneous residuals settle the player side") + T.eq(double.enemy.mon.hp, 0, + "simultaneous residuals settle the enemy side") + T.eq(double.result, "lose", + "a simultaneous terminal residual resolves as player blackout") + T.eq(double.afterQueue, "finish", + "the completed simultaneous-faint queue closes the battle") + T.eq(double.player.faintQueued, true, + "the terminal hook batch queues player faint authority") + T.eq(double.enemy.faintQueued, nil, + "the terminal hook batch suppresses only its enemy faint authority") + T.eq(double.player.mon.exp, startingExp, + "a blackout does not award contradictory enemy-faint EXP") + T.eq(awardCalls, 0, + "a blackout never enters the enemy EXP-award policy") + T.eq(expEvents, 0, + "a blackout emits no contradictory EXP event") + T.eq(switches, 0, + "a blackout does not send the trainer's reserve into battle") + T.eq(double.enemyIndex, originalEnemyIndex, + "a blackout leaves the enemy roster position unchanged") + T.check(double.enemy == originalEnemy, + "a blackout queues no contradictory enemy replacement") + for _, row in ipairs(queued) do + T.eq(row.ui, nil, + "a simultaneous terminal residual queues no replacement UI") + end +end + +simultaneousTerminal({ "player", "enemy" }) +simultaneousTerminal({ "enemy", "player" }) + +local timing = newBattle() +local timingOrder = {} +timing.ruleset = require("src.battle.rulesets.modern_clean") +timing.player.mon.status = "PSN" +timing.field.tokens[1] = { id = "expires", turns = 1, + onExpire = function() timingOrder[#timingOrder + 1] = "token_expired" end } +local timingEvents, timingHooks = Events.new(), Hooks.new() +timingEvents:on("battle.turn_ended", function() + timingOrder[#timingOrder + 1] = "turn_ended" +end, 0, "timing_probe") +Runtime.install(timingEvents, timingHooks, {}) +local preStatusHp = timing.player.mon.hp +timingHooks:wrap("battle.field_residual", function(next, context) + timingOrder[#timingOrder + 1] = "field_residual" + T.check(context.battlers.player.hp < preStatusHp, + "the hook snapshot observes completed vanilla status residuals") + return next(context) +end, 0, "timing_probe") +timing:endOfTurn() +T.same(timingOrder, + { "field_residual", "token_expired", "turn_ended" }, + "the hook runs before token expiry and battle.turn_ended") + +local oldGetState, oldSetState = love.math.getRandomState, + love.math.setRandomState +local checkpointRng = "field-residual-rng" +love.math.getRandomState = function() return checkpointRng end +love.math.setRandomState = function(state) checkpointRng = state end + +local function checkpointBattle() + local save = SaveData.newGame() + save.meta.playthroughId = "field-residual-checkpoint" + save.party = { Pokemon.new(data, "FIXMON_A", 30) } + SaveData.validate(save, data) + save.player.map, save.player.x, save.player.y = "FIX_TOWN", 2, 3 + save.player.facing, save.player.surfing = "left", false + local stack = setmetatable({ states = {} }, { __index = StateStack }) + local overworld = { + map = { id = "FIX_TOWN" }, + player = { cellX = 2, cellY = 3, facing = "left", surfing = false }, + runner = { isRunning = function() return false end }, + parallelRunners = {}, pendingScripts = {}, parallelQueue = {}, + scriptMoves = {}, + } + function overworld:captureSave(target) + target.player.map = self.map.id + target.player.x, target.player.y = self.player.cellX, self.player.cellY + target.player.facing = self.player.facing + target.player.surfing = self.player.surfing and true or false + end + function overworld:restoreBattleContinuation(restored, origin) + restored.onFinish = function() end + return origin.kind == "wild_encounter" and origin.map == self.map.id + end + local game = setmetatable({ data = data, save = save, stack = stack, + overworld = overworld }, { __index = GameMethods }) + stack.states[1] = overworld + local battle = BattleState.newWild(game, "FIXMON_C", 30) + battle.phase, battle.queue = "menu", {} + battle.checkpointOrigin = { kind = "wild_encounter", map = "FIX_TOWN" } + battle.musicKind = battle:computeMusicKind() + battle.onFinish = function() end + battle.field.weather = { id = "checkpoint-weather", turns = 5 } + stack.states[2] = battle + return game, battle +end + +local checkpointGame = checkpointBattle() +local checkpointHooks, restoredCalls = Hooks.new(), 0 +Runtime.install(Events.new(), checkpointHooks, {}) +checkpointHooks:wrap("battle.field_residual", function(next, context) + restoredCalls = restoredCalls + 1 + T.same(context.field.weather, + { id = "checkpoint-weather", turns = 5 }, + "the enabled hook observes checkpointed field state after restore") + return next(context) +end, 0, "checkpoint_probe") +local snapshot, captureCode = Checkpoint.capture(checkpointGame) +T.check(snapshot ~= nil, + "an enabled process-local hook does not enter the checkpoint: " + .. tostring(captureCode)) +if snapshot then + checkpointGame.stack:top().field.weather.turns = 1 + local restored, restoreCode, restoreMessage = + Checkpoint.restore(checkpointGame, snapshot) + T.check(restored == true, + "field state reconstructs while the hook remains enabled: " + .. tostring(restoreCode or restoreMessage)) + if restored then checkpointGame.stack:top():applyFieldResiduals() end + if restored then + T.same(Checkpoint.capture(checkpointGame), snapshot, + "enabled-hook field state completes capture/restore/capture round-trip") + end +end +T.eq(restoredCalls, 1, + "the process-local hook still runs after checkpoint reconstruction") +love.math.getRandomState, love.math.setRandomState = oldGetState, oldSetState + +Runtime.install(savedEvents, savedHooks, savedErrors) +T.finish("battle.field_residual validation") diff --git a/tests/modkit/cases/battle_field_residual.lua b/tests/modkit/cases/battle_field_residual.lua new file mode 100644 index 00000000..72097f19 --- /dev/null +++ b/tests/modkit/cases/battle_field_residual.lua @@ -0,0 +1,145 @@ +-- A sandboxed mod can contribute data-only field residual damage while the +-- engine retains HP, queue, and faint authority. The case also proves that +-- no-mod battles allocate no hook context and remain byte-equivalent. + +package.path = "./?.lua;./?/init.lua;" .. package.path +love = love or require("tests.love_stub") + +local T = require("tests.modkit") +local BattleState = require("src.battle.BattleState") +local Pokemon = require("src.pokemon.Pokemon") +local SaveData = require("src.core.SaveData") +local TypeChart = require("src.battle.TypeChart") + +local FIXTURE = { + ["mods/field_residual_probe/manifest.json"] = [[{ + "id": "field_residual_probe", + "name": "Field Residual Probe", + "version": "1.0.0", + "entry": "main.lua", + "api": 2 + }]], + ["mods/field_residual_probe/main.lua"] = [[ + local mod = ... + mod.hooks:wrap("battle.field_residual", function(next, context) + mod.exports.calls = (mod.exports.calls or 0) + 1 + mod.exports.context = context + local callback = context.field.tokens[1] + and context.field.tokens[1].onExpire + mod.exports.callbackType = type(callback) + if callback then callback() end + local rows = next(context) + rows[#rows + 1] = { + side = "player", amount = 7, + message = context.battlers.player.name .. " is buffeted!", + } + rows[#rows + 1] = { + side = "enemy", amount = 999, + message = context.battlers.enemy.name .. " is buffeted!", + } + return rows + end) + ]], +} + +local function newBattle(data) + TypeChart.load(data) + local save = SaveData.newGame() + save.party = { Pokemon.new(data, "FIXMON_A", 30) } + local game = { + data = data, + save = save, + stack = { top = function() return nil end, push = function() end }, + } + local battle = BattleState.newWild(game, "FIXMON_C", 30) + battle.phase, battle.queue = "menu", {} + battle.field.weather = { id = "sand", turns = 4, source = "probe" } + return battle +end + +local vanilla = T.sdk.loadNone({}) +local plain = newBattle(vanilla.data) +local plainPlayerHp, plainEnemyHp = plain.player.mon.hp, plain.enemy.mon.hp +plain:endOfTurn() +T.eq(plain.player.mon.hp, plainPlayerHp, + "no-mod end of turn preserves player HP") +T.eq(plain.enemy.mon.hp, plainEnemyHp, + "no-mod end of turn preserves enemy HP") +T.eq(plain.field.weather.turns, 4, + "no-mod path does not reinterpret an unknown data-only field extension") +vanilla.release() + +local run = T.sdk.loadMods({ "mods/field_residual_probe" }, { + fs = T.sdk.memfs(FIXTURE), +}) +T.eq(#run.errors, 0, + "the public field-residual probe loads cleanly") +local battle = newBattle(run.data) +local playerHp, enemyHp = battle.player.mon.hp, battle.enemy.mon.hp +local callbackInvocations = 0 +battle.field.tokens[1] = { + id = "callback-bearing", turns = 2, + state = { intensity = 4 }, + onExpire = function() callbackInvocations = callbackInvocations + 1 end, +} +battle.player.invulnerable = true +battle:endOfTurn() + +local out = run.loader.exports.field_residual_probe or {} +T.eq(out.calls, 1, "the public hook runs exactly once at round end") +T.check(out.context.field ~= battle.field, + "the hook receives a detached checkpoint-shaped field view") +T.same(out.context.field.weather, + { id = "sand", turns = 4, source = "probe" }, + "the detached field view carries checkpointed weather state") +T.eq(out.context.field.sides, nil, + "the detached field view exposes no live battler aliases") +T.eq(out.callbackType, "nil", + "the sandboxed wrapper cannot obtain a live field callback") +T.eq(callbackInvocations, 0, + "the sandboxed wrapper cannot invoke the engine-owned callback") +T.same(out.context.field.tokens[1], { + id = "callback-bearing", turns = 2, state = { intensity = 4 }, +}, "the public field view retains data while omitting the callback") +T.eq(out.context.turn, battle.turnCount or 0, + "the hook receives the current turn counter") +T.eq(out.context.battle, nil, + "the hook does not expose the live engine battle object") +T.eq(out.context.battlers.player.side, "player", + "the detached player snapshot identifies its side") +T.eq(out.context.battlers.enemy.side, "enemy", + "the detached enemy snapshot identifies its side") +T.eq(out.context.battlers.player.vanished, true, + "the detached view reports Gen1 semi-invulnerability") +T.eq(out.context.battlers.player.hp, playerHp, + "the player snapshot carries pre-residual HP") +T.eq(out.context.battlers.enemy.hp, enemyHp, + "the enemy snapshot carries pre-residual HP") +T.check(out.context.battlers.player ~= battle.player, + "the public battler view is detached from the engine wrapper") +T.check(out.context.battlers.player.types ~= battle.player.curTypes, + "the public type list is detached") + +T.eq(battle.player.mon.hp, playerHp - 7, + "the engine applies the validated player residual amount") +T.eq(battle.enemy.mon.hp, 0, + "the engine clamps residual damage to current HP") +T.eq(battle.enemy.faintQueued, true, + "the engine, not the mod, owns residual faint orchestration") + +local sawPlayerMessage, sawEnemyMessage, drains = false, false, 0 +for _, row in ipairs(battle.queue) do + local text = row.text and tostring(row.text) or "" + if text:find("buffeted", 1, true) then + if text:find(battle.player.name, 1, true) then sawPlayerMessage = true end + if text:find(battle.enemy.name, 1, true) then sawEnemyMessage = true end + end + if row.drain then drains = drains + 1 end +end +T.check(sawPlayerMessage and sawEnemyMessage, + "validated public messages enter the normal battle queue") +T.check(drains >= 2, + "residual HP changes use normal engine drain rows") +run.release() + +T.finish("battle.field_residual public seam") diff --git a/tests/parity_double_faint.lua b/tests/parity_double_faint.lua index cb136229..01844892 100644 --- a/tests/parity_double_faint.lua +++ b/tests/parity_double_faint.lua @@ -22,6 +22,7 @@ package.path = "./?.lua;./?/init.lua;" .. package.path if not _G.love then _G.love = require("tests.love_stub") end local BattleState = require("src.battle.BattleState") +local Runtime = require("src.mods.Runtime") local S = require("tests.harness").suite("parity double faint") local check, eq = S.check, S.eq @@ -107,4 +108,21 @@ do check(not saidBlackout(b), "and does not black out") end +-- enemyMonFainted is also a native authority path used by move effects. A +-- field-residual hook must not change what that path does when no hook is +-- installed, even if both active mons are already at zero HP. +do + Runtime.reset() + local b = battleWith({ 0 }, nil) + b.player = { mon = b.game.save.party[1] } + b.enemy = { mon = { hp = 0 } } + b.awards = 0 + b.awardExp = function(self) self.awards = self.awards + 1 end + BattleState.enemyMonFainted(b) + eq(b.awards, 1, + "no-hook simultaneous faint still enters native enemy EXP authority") + eq(b.result, "win", + "no-hook simultaneous faint preserves native enemy-faint resolution") +end + S.finish() From 58681fe62e6ef6a03850fdff9bdf587eccd8dc58 Mon Sep 17 00:00:00 2001 From: MaxTomahawk Date: Mon, 24 Aug 2026 10:37:10 +0200 Subject: [PATCH 25/33] feat(mod-api): expose developer mode --- docs/mod-api-gen2-compat.md | 6 +- docs/modding.md | 19 ++++ docs/rfcs/0017-mod-developer-mode.md | 99 +++++++++++++++++++ src/mods/Loader.lua | 4 + .../engine/mod_developer_mode_parity_test.lua | 66 +++++++++++++ tests/engine/mod_developer_mode_test.lua | 86 ++++++++++++++++ 6 files changed, 278 insertions(+), 2 deletions(-) create mode 100644 docs/rfcs/0017-mod-developer-mode.md create mode 100644 tests/engine/mod_developer_mode_parity_test.lua create mode 100644 tests/engine/mod_developer_mode_test.lua diff --git a/docs/mod-api-gen2-compat.md b/docs/mod-api-gen2-compat.md index 716a2607..9bda0c10 100644 --- a/docs/mod-api-gen2-compat.md +++ b/docs/mod-api-gen2-compat.md @@ -469,8 +469,10 @@ is warned once per name and the rest of the list still runs. The engine's own Gen 1 verbs are **not** seeded on Gold: a row-list verb handed Gold's ctx would find no runner on it, so `data.commands` under Gen 2 is the mod verbs alone. -**`mod.save`, `mod.options`, `mod.log`, `mod.assets`, `mod.find`, exports.** -Generation-agnostic; nothing to adapt. +**`mod.save`, `mod.options`, `mod.log`, `mod.assets`, `mod.find`, +`mod.developer`, exports.** Generation-agnostic; nothing to adapt. +`mod.developer` is the same fixed boot-time boolean on both generations and is +available while the entry chunk runs. **`mod.world`.** Same method set, resolved against Gold's world (`src/world/gen2/WorldAPI.lua`). Two differences show through and are diff --git a/docs/modding.md b/docs/modding.md index 7c724404..45577b62 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -695,6 +695,25 @@ hotkeys. Either set `POKEPORT_DEV=1` in the environment or pass love . --developer ``` +Every sandboxed entry chunk receives the same boot decision as the boolean +`mod.developer`. It is available while the entry file is loading, so a mod can +keep diagnostic commands, screens, and verbose tracing out of player builds: + +```lua +if mod.developer then + mod.commands:register("my_mod:diagnostics", function(ctx) + -- open or print this mod's diagnostic view + end) +end +``` + +`mod.developer` is a plain boolean snapshot for this boot. It grants no +permission and exposes neither the process environment nor the loader. In a +normal player boot it is `false`; `POKEPORT_DEV=1` and `--developer` make it +`true` through the same engine-owned decision that enables the console and hot +reload. Use a mod option for player-facing feature toggles rather than treating +developer mode as configuration. + While developer mode is active: - `` ` `` (backtick) opens the console overlay — a Lua REPL with `game`, diff --git a/docs/rfcs/0017-mod-developer-mode.md b/docs/rfcs/0017-mod-developer-mode.md new file mode 100644 index 00000000..a717f8db --- /dev/null +++ b/docs/rfcs/0017-mod-developer-mode.md @@ -0,0 +1,99 @@ +# RFC 0017: Public mod developer-mode signal + +## Status + +Proposed. + +## Motivation + +The loader already has one boot-time developer-mode decision. It enables the +console and hot reload and can be forced in headless tests, but a sandboxed mod +cannot read it. `mod.commands` can register a diagnostic command but cannot say +whether the current boot is a developer boot. `mod.exports` only publishes +values to other mods. `game.ready` fires after entry registration and carries +only the game. `mod.options` is player configuration, not engine mode, and +`mod.log` logs unconditionally. The pre-sandbox compatibility +`os.getenv("POKEPORT_DEV")` deliberately returns `nil`, because the process +environment is hidden from mods. + +The concrete consumer is **Adaptive Trainers**. Its approved Chapter 30 and +Phase H require trainer, boss, Rival, and League diagnostic views plus +seed-label tracing to exist only when `POKEPORT_DEV` is active. Without a +public signal, the mod must either ship those registrations in production, +misuse a player option, or import loader/Logger internals. All three violate +the approved observability boundary or the sandbox/public-API policy. + +## Decision and plan extended + +This implements **D-AT-005: diagnostics and seed tracing are admitted only by +the engine's developer-mode decision**. The consuming design is tracked in the +Adaptive Trainers implementation plan, +[`docs/superpowers/plans/2026-08-14-adaptive-trainers.md`](https://github.com/MaxTomahawk/gen1recomp-adaptive-trainers/blob/main/docs/superpowers/plans/2026-08-14-adaptive-trainers.md), +Task 9. The engine delta is generic and contains no trainer, balancing, +diagnostic-layout, seed-label, or Adaptive Trainers policy. + +## Exact API delta + +Every sandboxed mod object adds one field: + +```lua +mod.developer -- boolean +``` + +The loader copies its existing `dev` decision into this field before invoking +the mod's entry chunk. It is therefore available for load-time registration: + +```lua +if mod.developer then + mod.commands:register("my_mod:diagnostics", diagnostics_command) +end +``` + +The value is a plain boolean snapshot, not a loader reference or environment +facade. `false` is the normal player-build answer. `POKEPORT_DEV=1`, the +`--developer` command-line path, and the loader's existing injected `opts.dev` +test seam produce `true` through the same decision that already controls the +developer console, hot reload, and loader diagnostics. It grants no permission +and does not expose environment variables. The answer is fixed for the life of +that loader; changing a field on a mod's own table cannot change engine mode. + +The field is generation-independent and has identical semantics on Red, Blue, +Yellow, Gold, and Silver. + +## Migration and compatibility + +Existing mods change nothing. `mod.developer` is additive, requires no +permission, and does not bump the integer mod API. Existing API-v1 and API-v2 +entry chunks receive one extra scalar field and retain all prior fields and +methods unchanged. No name is removed or shadowed. + +With no mods installed, `Loader:_api` is never called, so the delta allocates no +mod object and changes no data, save, options, event, hook, command, or file. +With mods installed in a normal boot, the new field is `false` unless an author +explicitly reads it. Existing registration and logging behavior is unchanged. + +An adopting mod should gate developer-only registrations and verbose logging +directly on `mod.developer`. Player-facing behavior belongs behind +`mod.options`, not this signal. + +## Verification + +- `tests/engine/mod_developer_mode_test.lua` loads a real sandboxed mod through + the public SDK with developer mode both on and off. It proves the boolean is + available during entry execution and that the same source registers its + diagnostic command only for the developer load. It also covers the + command-line global path and a Gen 2 load. +- `tests/engine/mod_developer_mode_parity_test.lua` is the separate no-mod + parity suite. It proves both developer answers discover no mods, create no + files, and leave injected vanilla data unchanged. It also loads an unchanged + API-v1 probe and verifies identity, `mod:read`, exports, and options behavior. +- The full ROM-free engine and modkit tiers remain the compatibility proof for + `content.X:register/override/get`, `events:on`, `hooks:wrap`, `mod.log`, + `mod:read`, manifest v1 fields, and `pokemon.before_give`. + +No registry or schema changes are involved, so generated registry documentation +is unaffected. + +## Deprecation etiquette + +Nothing is removed, renamed, superseded, or deprecated. diff --git a/src/mods/Loader.lua b/src/mods/Loader.lua index 84b087cd..aaa2b7b7 100644 --- a/src/mods/Loader.lua +++ b/src/mods/Loader.lua @@ -980,6 +980,10 @@ function Loader:_api(mod) id = modId, version = mod.manifest.version, path = mod.path, + -- Fixed at Loader construction and copied as plain data: a sandboxed + -- entry chunk can decide whether to register developer-only diagnostics + -- without receiving the process environment or the loader itself. + developer = loader.dev == true, -- a deep copy: what a mod does to its own view never reaches the loader manifest = Merge.deepCopy(mod.manifest), content = {}, diff --git a/tests/engine/mod_developer_mode_parity_test.lua b/tests/engine/mod_developer_mode_parity_test.lua new file mode 100644 index 00000000..7876d93c --- /dev/null +++ b/tests/engine/mod_developer_mode_parity_test.lua @@ -0,0 +1,66 @@ +-- No-mod and API-v1 parity for the additive mod.developer surface. +-- +-- The production break this catches is a developer-mode loader path that +-- mutates vanilla data, creates mod state, or changes existing API-v1 +-- behavior merely because the new public signal exists. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.modkit") + +local function pristine() + return { + pokemon = { KEEP = { hp = 7 } }, + moves = {}, + } +end + +for _, dev in ipairs({ false, true }) do + local data = pristine() + local files = {} + local run = T.sdk.loadNone({ + data = data, + fs = T.sdk.memfs(files), + dev = dev, + }) + T.eq(#run.errors, 0, + "no-mod load stays clean with developer=" .. tostring(dev)) + T.eq(next(run.loader.mods), nil, + "no-mod load discovers nothing with developer=" .. tostring(dev)) + T.eq(data.pokemon.KEEP.hp, 7, + "no-mod load preserves vanilla data with developer=" .. tostring(dev)) + T.eq(next(files), nil, + "no-mod load creates no files with developer=" .. tostring(dev)) + run.release() +end + +local V1 = { + ["mods/v1_probe/manifest.json"] = [[{ + "id": "v1_probe", + "name": "V1 Probe", + "version": "1.0.0", + "entry": "main.lua", + "api": 1 + }]], + ["mods/v1_probe/main.lua"] = [[ + local mod = ... + mod.exports.identity = mod.id .. "@" .. mod.version + mod.exports.payload = mod:read("payload.txt") + mod.options:define({ { key = "enabled", type = "toggle", default = true } }) + mod.exports.defaultOption = mod.options:get("enabled") + ]], + ["mods/v1_probe/payload.txt"] = "unchanged-v1", +} + +local legacy = T.sdk.loadMods({ "mods/v1_probe" }, { + fs = T.sdk.memfs(V1), + dev = false, +}) +T.eq(#legacy.errors, 0, "existing API-v1 mod loads unchanged") +local out = legacy.loader.exports.v1_probe +T.eq(out.identity, "v1_probe@1.0.0", "API-v1 identity stays unchanged") +T.eq(out.payload, "unchanged-v1", "API-v1 mod:read stays unchanged") +T.eq(out.defaultOption, true, "API-v1 options stay unchanged") +legacy.release() + +T.finish("mod developer mode parity") diff --git a/tests/engine/mod_developer_mode_test.lua b/tests/engine/mod_developer_mode_test.lua new file mode 100644 index 00000000..638d0771 --- /dev/null +++ b/tests/engine/mod_developer_mode_test.lua @@ -0,0 +1,86 @@ +-- Public load-time developer-mode signal for sandboxed mods. +-- +-- The production break this catches is a loader that computes dev mode but +-- does not expose the same fixed answer to the public mod object before the +-- entry chunk runs. It also protects the data-only contract: the public +-- value is a boolean snapshot, not a live loader or environment handle. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.modkit") + +local FILES = { + ["mods/dev_probe/manifest.json"] = [[{ + "id": "dev_probe", + "name": "Developer Mode Probe", + "version": "1.0.0", + "entry": "main.lua", + "api": 2, + "games": ["all"] + }]], + ["mods/dev_probe/main.lua"] = [[ + local mod = ... + mod.exports.seenAtLoad = mod.developer + mod.exports.kind = type(mod.developer) + if mod.developer then + mod.commands:register("dev_probe:diagnostics", function() return true end) + end + ]], +} + +local function load(dev, generation) + return T.sdk.loadMods({ "mods/dev_probe" }, { + fs = T.sdk.memfs(FILES), + dev = dev, + generation = generation, + }) +end + +do + local run = load(true) + T.eq(#run.errors, 0, "developer-mode public probe loads clean") + local out = run.loader.exports.dev_probe + T.eq(out.seenAtLoad, true, + "sandboxed entry code sees developer mode at load time") + T.eq(out.kind, "boolean", "developer mode is exposed as plain data") + T.check(run.loader.content.commands:get("dev_probe:diagnostics") ~= nil, + "entry code can register diagnostics only in developer mode") + run.release() +end + +do + local run = load(false) + T.eq(#run.errors, 0, "production-mode public probe loads clean") + local out = run.loader.exports.dev_probe + T.eq(out.seenAtLoad, false, + "sandboxed entry code sees production mode at load time") + T.eq(out.kind, "boolean", "production mode is exposed as plain data") + T.eq(run.loader.content.commands:get("dev_probe:diagnostics"), nil, + "production load does not register developer diagnostics") + run.release() +end + +do + local run = load(true, 2) + T.eq(#run.errors, 0, "Gen 2 developer-mode public probe loads clean") + local out = run.loader.exports.dev_probe + T.eq(out.seenAtLoad, true, + "Gen 2 entry code sees the same developer-mode answer") + T.check(run.loader.content.commands:get("dev_probe:diagnostics") ~= nil, + "Gen 2 entry code can gate diagnostics on the same signal") + run.release() +end + +do + local saved = _G.POKEPORT_DEV_MODE + _G.POKEPORT_DEV_MODE = true + local ok, run = pcall(load, nil) + _G.POKEPORT_DEV_MODE = saved + if not ok then error(run, 0) end + T.eq(#run.errors, 0, "command-line developer-mode probe loads clean") + T.eq(run.loader.exports.dev_probe.seenAtLoad, true, + "the --developer boot decision reaches the public signal") + run.release() +end + +T.finish("mod developer mode public API") From 96ed862b50b6c8ad0f751f6a6a47e26a276be14d Mon Sep 17 00:00:00 2001 From: MaxTomahawk Date: Mon, 24 Aug 2026 10:51:09 +0200 Subject: [PATCH 26/33] docs(mod-api): clarify developer mode sources --- docs/mod-api-gen2-compat.md | 3 ++- docs/modding.md | 24 ++++++++++++++---------- docs/rfcs/0017-mod-developer-mode.md | 21 ++++++++++++--------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/docs/mod-api-gen2-compat.md b/docs/mod-api-gen2-compat.md index 9bda0c10..999eb583 100644 --- a/docs/mod-api-gen2-compat.md +++ b/docs/mod-api-gen2-compat.md @@ -472,7 +472,8 @@ find no runner on it, so `data.commands` under Gen 2 is the mod verbs alone. **`mod.save`, `mod.options`, `mod.log`, `mod.assets`, `mod.find`, `mod.developer`, exports.** Generation-agnostic; nothing to adapt. `mod.developer` is the same fixed boot-time boolean on both generations and is -available while the entry chunk runs. +available while the entry chunk runs. Gold does not gain Gen 1's developer +console or F5 hot-reload hotkey; the field reports the loader's mode only. **`mod.world`.** Same method set, resolved against Gold's world (`src/world/gen2/WorldAPI.lua`). Two differences show through and are diff --git a/docs/modding.md b/docs/modding.md index 45577b62..3b14d17a 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -687,17 +687,18 @@ the hook context. ## Developer console -Boot with developer mode on to unlock the in-game console and hot-reload -hotkeys. Either set `POKEPORT_DEV=1` in the environment or pass -`--developer` on the command line: +On a Gen 1 boot, developer mode unlocks the in-game console and hot-reload +hotkeys. Either set `POKEPORT_DEV=1` in the environment or pass `--developer` +on the command line: ```sh love . --developer ``` -Every sandboxed entry chunk receives the same boot decision as the boolean -`mod.developer`. It is available while the entry file is loading, so a mod can -keep diagnostic commands, screens, and verbose tracing out of player builds: +The mod loader independently derives a matching boolean for every sandboxed +entry chunk as `mod.developer`. It is available while the entry file is +loading, so a mod can keep diagnostic commands, screens, and verbose tracing +out of player builds: ```lua if mod.developer then @@ -710,11 +711,14 @@ end `mod.developer` is a plain boolean snapshot for this boot. It grants no permission and exposes neither the process environment nor the loader. In a normal player boot it is `false`; `POKEPORT_DEV=1` and `--developer` make it -`true` through the same engine-owned decision that enables the console and hot -reload. Use a mod option for player-facing feature toggles rather than treating -developer mode as configuration. +`true`. On Gen 1 those inputs separately enable the console and hot-reload +hotkeys. The headless loader's `opts.dev` test seam changes only the loader +signal and diagnostics; it does not enable the game's console or hot reload. +Gold exposes the same `mod.developer` boolean but does not implement the Gen 1 +console or hotkeys. Use a mod option for player-facing feature toggles rather +than treating developer mode as configuration. -While developer mode is active: +While developer mode is active on Gen 1: - `` ` `` (backtick) opens the console overlay — a Lua REPL with `game`, `data` and `mods` in scope. Press `` ` `` again to close it. diff --git a/docs/rfcs/0017-mod-developer-mode.md b/docs/rfcs/0017-mod-developer-mode.md index a717f8db..7d564648 100644 --- a/docs/rfcs/0017-mod-developer-mode.md +++ b/docs/rfcs/0017-mod-developer-mode.md @@ -6,10 +6,11 @@ Proposed. ## Motivation -The loader already has one boot-time developer-mode decision. It enables the -console and hot reload and can be forced in headless tests, but a sandboxed mod -cannot read it. `mod.commands` can register a diagnostic command but cannot say -whether the current boot is a developer boot. `mod.exports` only publishes +The loader already derives a boot-time developer-mode flag for its permission +diagnostics and headless test seam. Gen 1's `Game` independently derives a +similarly sourced flag for its console and hot reload. A sandboxed mod cannot +read either one. `mod.commands` can register a diagnostic command but cannot +say whether the current boot is a developer boot. `mod.exports` only publishes values to other mods. `game.ready` fires after entry registration and carries only the game. `mod.options` is player configuration, not engine mode, and `mod.log` logs unconditionally. The pre-sandbox compatibility @@ -50,15 +51,17 @@ end ``` The value is a plain boolean snapshot, not a loader reference or environment -facade. `false` is the normal player-build answer. `POKEPORT_DEV=1`, the -`--developer` command-line path, and the loader's existing injected `opts.dev` -test seam produce `true` through the same decision that already controls the -developer console, hot reload, and loader diagnostics. It grants no permission +facade. `false` is the normal player-build answer. `POKEPORT_DEV=1` and the +`--developer` command-line path make the loader flag true; on Gen 1 those inputs +separately make `Game`'s own developer flag true for its console and hot +reload. The loader's existing injected `opts.dev` test seam changes only the +loader flag and diagnostics, not `Game` or its hotkeys. It grants no permission and does not expose environment variables. The answer is fixed for the life of that loader; changing a field on a mod's own table cannot change engine mode. The field is generation-independent and has identical semantics on Red, Blue, -Yellow, Gold, and Silver. +Yellow, Gold, and Silver. Gold and Silver do not gain Gen 1's developer console +or hot-reload hotkeys from this field. ## Migration and compatibility From fb95dc5b6a7e1ac6eef36782ffa831844e31a6cb Mon Sep 17 00:00:00 2001 From: MaxTomahawk Date: Mon, 24 Aug 2026 10:56:05 +0200 Subject: [PATCH 27/33] docs(gen2): correct developer mode guidance --- docs/preparing-your-mod-for-gen2.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/preparing-your-mod-for-gen2.md b/docs/preparing-your-mod-for-gen2.md index 382a3d21..70a63db1 100644 --- a/docs/preparing-your-mod-for-gen2.md +++ b/docs/preparing-your-mod-for-gen2.md @@ -768,7 +768,8 @@ the same: So: read the log for coverage problems, and the manager for load problems. `POKEPORT_IDENTITY=` sandboxes the save directory if you want a clean -profile to test in, and `POKEPORT_DEV=1` adds the console and `F5` hot reload. +profile to test in. `POKEPORT_DEV=1` makes `mod.developer` true for loader-gated +diagnostics; Gold does not add Gen 1's console or `F5` hot reload. ## What this guide does not promise From 333949ce0d1a739209c0ea51b3063339287d9a3b Mon Sep 17 00:00:00 2001 From: MaxTomahawk Date: Mon, 24 Aug 2026 11:13:30 +0200 Subject: [PATCH 28/33] fix(mods): normalize developer mode option --- src/mods/Loader.lua | 2 +- tests/engine/mod_developer_mode_test.lua | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mods/Loader.lua b/src/mods/Loader.lua index aaa2b7b7..5a060b4f 100644 --- a/src/mods/Loader.lua +++ b/src/mods/Loader.lua @@ -270,7 +270,7 @@ function Loader.new(opts) modSave = {}, modOptions = {}, optionSchemas = {}, imageCache = {}, modInput = {}, modEnv = {}, stepsQueues = {}, fs = (opts and opts.fs) or (love and love.filesystem), - dev = dev, + dev = dev == true, safeMode = false, -- Which generation this boot is (1 or 2). Fixed at construction: the -- active version is set once in main.lua's bootGame before anything diff --git a/tests/engine/mod_developer_mode_test.lua b/tests/engine/mod_developer_mode_test.lua index 638d0771..982f9237 100644 --- a/tests/engine/mod_developer_mode_test.lua +++ b/tests/engine/mod_developer_mode_test.lua @@ -60,6 +60,22 @@ do run.release() end +for _, provided in ipairs({ "yes", 1 }) do + local run = load(provided) + T.eq(#run.errors, 0, + "non-boolean developer-mode probe loads clean: " .. tostring(provided)) + local out = run.loader.exports.dev_probe + T.eq(out.seenAtLoad, false, + "non-boolean opts.dev is false in mod.developer: " .. tostring(provided)) + T.eq(out.kind, "boolean", + "non-boolean opts.dev stays a strict public boolean: " .. tostring(provided)) + T.eq(run.loader.dev, false, + "non-boolean opts.dev is false in loader.dev: " .. tostring(provided)) + T.eq(run.loader.content.commands:get("dev_probe:diagnostics"), nil, + "non-boolean opts.dev cannot register developer diagnostics: " .. tostring(provided)) + run.release() +end + do local run = load(true, 2) T.eq(#run.errors, 0, "Gen 2 developer-mode public probe loads clean") From 1905261c5b416a45c2b199f1e8350eab803fbffb Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 07:52:05 -0400 Subject: [PATCH 29/33] Spider Car Unleashed CLOSES #1483, CLOSES #1610, CLOSES #1615, CLOSES #1646, CLOSES #1649, CLOSES #1651, CLOSES #1653, CLOSES #1656, CLOSES #1683, CLOSES #1685, CLOSES #1686, CLOSES #1687, CLOSES #1688, CLOSES #1689, CLOSES #1690, CLOSES #1693, CLOSES #1694, CLOSES #1695, CLOSES #1696, CLOSES #1702, CLOSES #1704, CLOSES #1705, CLOSES #1706, CLOSES #1707, CLOSES #1708, CLOSES #1710, CLOSES #1711, CLOSES #1712, CLOSES #1713, CLOSES #1716, CLOSES #1717, CLOSES #1718, CLOSES #1719, CLOSES #1720, CLOSES #1721, CLOSES #1725, CLOSES #1732, CLOSES #1745, CLOSES #1748, CLOSES #1749, CLOSES #1751, CLOSES #1754 --- README.md | 7 +- build-rg34xxsp.sh | 12 - conf.lua | 6 + data/scripts/flavor/pokemon_fan_club.lua | 24 +- data/scripts/flavor/ss_anne_1f_rooms.lua | 5 +- data/scripts/flavor/ss_anne_b1f_rooms.lua | 7 +- data/scripts/flavor/vermilion_city.lua | 7 +- .../scripts/flavor/vermilion_pidgey_house.lua | 8 +- data/scripts/story.lua | 58 +- data/scripts/story2.lua | 23 + data/scripts/story3.lua | 120 +- data/scripts/story5.lua | 10 +- docs/anbernic-rg34xxsp.md | 10 - docs/mod-api-gen2-compat.md | 2 +- docs/modding.md | 2 +- docs/new-features.md | 2 + docs/shaderfx.md | 673 +++++++++++ docs/switch-install.md | 1 - main.lua | 18 +- .../android/app/src/main/AndroidManifest.xml | 4 + scripts/build.sh | 31 +- scripts/build_android.sh | 33 +- src/battle/AnimPlayer.lua | 11 + src/battle/BattleState.lua | 46 +- src/battle/EffectRegistry.lua | 18 +- src/battle/MoveEffects.lua | 2 + src/battle/WideBattle.lua | 4 +- src/battle/gen2/Battle.lua | 18 +- src/battle/gen2/Effects.lua | 41 +- src/carts/CartManifest.lua | 95 +- src/carts/CartStore.lua | 31 +- src/core/ChipSynth.lua | 1 + src/core/Game.lua | 21 +- src/core/Game2.lua | 175 ++- src/core/GameSpeed.lua | 35 +- src/core/GameVersion.lua | 8 +- src/core/HostShell.lua | 25 +- src/core/Performance.lua | 41 +- src/core/SaveData.lua | 136 ++- src/core/Sensors.lua | 178 +++ src/core/Sound.lua | 8 + src/core/gen2/Boxes.lua | 13 +- src/core/gen2/BugContest.lua | 4 +- src/core/gen2/Save.lua | 6 +- src/import/LauncherSettings.lua | 27 +- src/import/LauncherView.lua | 375 +++++- src/import/RomExtractorGen2.lua | 31 +- src/import/RomImporter.lua | 773 +++++++++++- src/mods/Gen2Compat.lua | 12 +- src/mods/Loader.lua | 40 +- src/mods/ModIndex.lua | 149 ++- src/net/Fetch.lua | 9 +- src/net/fetch_worker.lua | 15 +- src/render/GBCFX.lua | 310 ----- src/render/Renderer.lua | 76 +- src/render/ShaderFX.lua | 1053 +++++++++++++++++ src/render/ShaderFixup.lua | 295 +++++ src/render/ShaderSourcePatches.lua | 67 ++ src/render/Zoom.lua | 27 + src/save_convert/SaveConvert.lua | 2 +- src/script/Commands.lua | 21 +- src/script/gen2/CallAsm.lua | 7 +- src/script/gen2/Movement.lua | 25 +- src/script/gen2/Specials.lua | 7 + src/ui/BagMenu.lua | 110 +- src/ui/ListMenu.lua | 50 +- src/ui/MoveLearnMenu.lua | 45 +- src/ui/OptionsMenu.lua | 59 +- src/ui/PartyMenu.lua | 54 +- src/ui/Screens.lua | 3 + src/ui/ShaderFXParamsScreen.lua | 161 +++ src/ui/ShaderFXScreen.lua | 159 +++ src/ui/ShopMenu.lua | 107 +- src/ui/StartMenu.lua | 11 +- src/ui/gen2/BattleHud.lua | 24 +- src/ui/gen2/BattleState.lua | 31 +- src/ui/gen2/BoxMenu.lua | 13 +- src/ui/gen2/CrystalIntro.lua | 10 +- src/ui/gen2/CrystalSplash.lua | 423 +++++++ src/ui/gen2/GameFreakPresents.lua | 9 +- src/ui/gen2/OptionsMenu.lua | 62 +- src/ui/gen2/PackGfx.lua | 5 +- src/ui/gen2/PackMenu.lua | 80 +- src/ui/gen2/Pokegear.lua | 52 +- src/ui/gen2/SummaryMenu.lua | 51 +- src/ui/kit/Theme.lua | 2 +- src/world/NPC.lua | 17 + src/world/OverworldController.lua | 256 +++- src/world/Player.lua | 37 +- src/world/gen2/FieldMoves.lua | 8 +- src/world/gen2/Npc.lua | 23 +- src/world/gen2/Player.lua | 96 +- src/world/gen2/StepEvents.lua | 6 +- src/world/gen2/World.lua | 355 +++++- tests/drivers/bag_cancel_row_bug1685_test.lua | 174 +++ tests/drivers/bike_dismount_bug513_test.lua | 5 +- .../drivers/bike_option_box_bug1705_test.lua | 342 ++++++ tests/drivers/crystal_shaderfx_shots.lua | 94 ++ tests/drivers/crystal_splash_shots.lua | 86 ++ tests/drivers/gold_battle_bg_bug1709_test.lua | 278 +++++ .../gold_cycling_road_bug1718_1749_test.lua | 274 +++++ tests/drivers/gold_field_anim_shots.lua | 31 +- .../drivers/gold_fishing_rod_bug1708_test.lua | 369 ++++++ tests/drivers/gold_fly_anim_bug1711_test.lua | 305 +++++ .../gold_flymap_cursor_bug1712_test.lua | 234 ++++ tests/drivers/gold_frame_seams.lua | 36 +- tests/drivers/gold_ledge_hop_bug1713_test.lua | 272 +++++ tests/drivers/gold_ow_bounce_bug1748_test.lua | 328 +++++ tests/drivers/gold_pack_rows_bug1695_test.lua | 243 ++++ .../gold_shaderfx_menu_black_crop_test.lua | 90 ++ .../gold_shaderfx_zoom_sizing_test.lua | 73 ++ tests/drivers/gold_splash_skip.lua | 42 + .../gold_stats_page_tint_bug1693_test.lua | 279 +++++ .../drivers/gold_tm_fanfare_bug1483_test.lua | 338 ++++++ .../gold_whirlpool_forceturn_bug1716_test.lua | 213 ++++ .../gold_whirlpool_sound_bug1717_test.lua | 240 ++++ .../museum_back_entrance_bug1690_test.lua | 211 ++++ tests/drivers/pet_cries_bug1687_1649_test.lua | 303 +++++ .../drivers/ss_anne_departure_bug360_test.lua | 20 +- tests/drivers/wrap_anim_bug1653_test.lua | 404 +++++++ .../engine/bag_bicycle_no_options_bug1705.lua | 244 ++++ tests/engine/bag_cancel_row_bug1685.lua | 253 ++++ tests/engine/cart_launcher.lua | 870 +++++++++++++- tests/engine/cart_manifest.lua | 94 ++ tests/engine/cart_saves.lua | 84 ++ tests/engine/cart_seal.lua | 171 +++ tests/engine/cart_store.lua | 78 +- tests/engine/game_speed_categories_test.lua | 27 + tests/engine/gen2_stats_tiles_bug1558.lua | 17 +- tests/engine/launcher_skins_ux.lua | 28 + tests/engine/mod_index_tests.lua | 148 +++ .../museum_clerk_back_entrance_bug1690.lua | 222 ++++ tests/engine/performance_tiers.lua | 10 +- tests/gen2_audio_test.lua | 6 + tests/gen2_battle_cursor_test.lua | 200 ++++ tests/gen2_battle_options_test.lua | 262 ++++ tests/gen2_battle_test.lua | 36 +- tests/gen2_billspc_dpad_test.lua | 171 +++ tests/gen2_box_intake_test.lua | 280 +++++ tests/gen2_contest_test.lua | 2 +- tests/gen2_cycling_road_test.lua | 279 +++++ tests/gen2_dex_gift_test.lua | 152 +++ tests/gen2_field_anim_test.lua | 11 +- tests/gen2_ledge_hop_test.lua | 270 +++++ tests/gen2_menus_test.lua | 23 +- tests/gen2_obedience_test.lua | 2 +- tests/gen2_ow_bounce_test.lua | 311 +++++ tests/gen2_pack_rows_test.lua | 404 +++++++ tests/gen2_sleep_counter_test.lua | 213 ++++ tests/gen2_sprites_test.lua | 11 +- tests/gen2_timed_heal_test.lua | 315 +++++ tests/gen2_vm_test.lua | 5 + tests/gen2_whirlpool_test.lua | 229 ++++ tests/mod_graphics_tests.lua | 6 +- tests/mod_ui_tests.lua | 41 +- tests/mod_world_tests.lua | 6 +- tests/modkit/record.lua | 4 +- tests/parity_cycling_road_brake.lua | 3 + tests/parity_escort_lockstep.lua | 4 +- tests/parity_gbcfx.lua | 171 --- tests/parity_rare_candy_menu.lua | 2 +- tests/parity_ss_anne_departure.lua | 80 +- tests/parity_ss_anne_guard.lua | 62 +- tests/parity_trainer_evolution_order.lua | 17 +- tests/parity_trashcans.lua | 1 + tests/pet_cries_test.lua | 157 +++ tests/run_tests.lua | 72 +- tests/switch_transfer_docs_test.lua | 1 - tools/cartkit.py | 29 +- tools/crystal_movie_symbols.py | 4 +- tools/crystal_symbol_deltas.py | 4 +- tools/make_gold_manifest.py | 3 + tools/rom_manifest_crystal.json | 12 + tools/rom_manifest_gold.json | 4 + tools/rom_manifest_silver.json | 4 + tools/shaderfx-bridge/.gitignore | 1 + tools/shaderfx-bridge/Cargo.lock | 955 +++++++++++++++ tools/shaderfx-bridge/Cargo.toml | 16 + tools/shaderfx-bridge/src/lib.rs | 1009 ++++++++++++++++ tools/shaderfx-bridge/src/main.rs | 123 ++ 180 files changed, 19567 insertions(+), 1556 deletions(-) create mode 100644 docs/shaderfx.md create mode 100644 src/core/Sensors.lua delete mode 100644 src/render/GBCFX.lua create mode 100644 src/render/ShaderFX.lua create mode 100644 src/render/ShaderFixup.lua create mode 100644 src/render/ShaderSourcePatches.lua create mode 100644 src/ui/ShaderFXParamsScreen.lua create mode 100644 src/ui/ShaderFXScreen.lua create mode 100644 src/ui/gen2/CrystalSplash.lua create mode 100644 tests/drivers/bag_cancel_row_bug1685_test.lua create mode 100644 tests/drivers/bike_option_box_bug1705_test.lua create mode 100644 tests/drivers/crystal_shaderfx_shots.lua create mode 100644 tests/drivers/crystal_splash_shots.lua create mode 100644 tests/drivers/gold_battle_bg_bug1709_test.lua create mode 100644 tests/drivers/gold_cycling_road_bug1718_1749_test.lua create mode 100644 tests/drivers/gold_fishing_rod_bug1708_test.lua create mode 100644 tests/drivers/gold_fly_anim_bug1711_test.lua create mode 100644 tests/drivers/gold_flymap_cursor_bug1712_test.lua create mode 100644 tests/drivers/gold_ledge_hop_bug1713_test.lua create mode 100644 tests/drivers/gold_ow_bounce_bug1748_test.lua create mode 100644 tests/drivers/gold_pack_rows_bug1695_test.lua create mode 100644 tests/drivers/gold_shaderfx_menu_black_crop_test.lua create mode 100644 tests/drivers/gold_shaderfx_zoom_sizing_test.lua create mode 100644 tests/drivers/gold_splash_skip.lua create mode 100644 tests/drivers/gold_stats_page_tint_bug1693_test.lua create mode 100644 tests/drivers/gold_tm_fanfare_bug1483_test.lua create mode 100644 tests/drivers/gold_whirlpool_forceturn_bug1716_test.lua create mode 100644 tests/drivers/gold_whirlpool_sound_bug1717_test.lua create mode 100644 tests/drivers/museum_back_entrance_bug1690_test.lua create mode 100644 tests/drivers/pet_cries_bug1687_1649_test.lua create mode 100644 tests/drivers/wrap_anim_bug1653_test.lua create mode 100644 tests/engine/bag_bicycle_no_options_bug1705.lua create mode 100644 tests/engine/bag_cancel_row_bug1685.lua create mode 100644 tests/engine/museum_clerk_back_entrance_bug1690.lua create mode 100644 tests/gen2_battle_cursor_test.lua create mode 100644 tests/gen2_battle_options_test.lua create mode 100644 tests/gen2_billspc_dpad_test.lua create mode 100644 tests/gen2_box_intake_test.lua create mode 100644 tests/gen2_cycling_road_test.lua create mode 100644 tests/gen2_dex_gift_test.lua create mode 100644 tests/gen2_ledge_hop_test.lua create mode 100644 tests/gen2_ow_bounce_test.lua create mode 100644 tests/gen2_pack_rows_test.lua create mode 100644 tests/gen2_sleep_counter_test.lua create mode 100644 tests/gen2_timed_heal_test.lua create mode 100644 tests/gen2_whirlpool_test.lua delete mode 100644 tests/parity_gbcfx.lua create mode 100644 tests/pet_cries_test.lua create mode 100644 tools/shaderfx-bridge/.gitignore create mode 100644 tools/shaderfx-bridge/Cargo.lock create mode 100644 tools/shaderfx-bridge/Cargo.toml create mode 100644 tools/shaderfx-bridge/src/lib.rs create mode 100644 tools/shaderfx-bridge/src/main.rs diff --git a/README.md b/README.md index d769fb0d..897a2874 100644 --- a/README.md +++ b/README.md @@ -126,24 +126,23 @@ supported out of the box. | `2` | Cycle COLORS | | `3` | Cycle TILT (free-roam overworld) | | `4` | Cycle ZOOM through every level (free-roam overworld) | -| `5` | Cycle GBC FX | | `F1` | Save | | `F2` | Load | | `F10` | Open / close the mod manager | -COLORS, TILT, ZOOM, GBC FX, GAME SPEED, and VOID FILL are also in the +COLORS, TILT, ZOOM, SHADER FX, GAME SPEED, and VOID FILL are also in the Options menu and persist in `options.lua`. ### Low-end devices **OPTIONS → PERFORMANCE** scales the port's optional extras for weaker -hardware: **HIGH** (everything on), **BALANCED** (no 3D tilt or GBC FX), +hardware: **HIGH** (everything on), **BALANCED** (no 3D tilt), **LOW** (also no survey zoom, FPS capped), or **AUTO** — the default, which picks a tier from your device (ARM handhelds → LOW, phones → BALANCED, normal desktops → HIGH, unchanged). It only scales presentation; the fixed-step game logic is identical on every tier, and a lower tier hides -your tilt/zoom/GBC-FX preferences without forgetting them. Details in +your tilt/zoom preferences without forgetting them. Details in [docs/new-features.md](docs/new-features.md#performance-tier-low-end-devices). ### Rulesets diff --git a/build-rg34xxsp.sh b/build-rg34xxsp.sh index bfa0f8c4..85c2bcfb 100755 --- a/build-rg34xxsp.sh +++ b/build-rg34xxsp.sh @@ -230,11 +230,6 @@ export LD_LIBRARY_PATH="$GAMEDIR/libs.aarch64:${LD_LIBRARY_PATH:-}" export SDL_GAMECONTROLLERCONFIG="${sdl_controllerconfig:-}" # Mali / H700: prefer GLES where available export LOVE_GRAPHICS_USE_OPENGLES="${LOVE_GRAPHICS_USE_OPENGLES:-1}" -# Same GPU class as a phone, but getOS() here says "Linux", so the Android -# gate (issue #136) would not fire on its own: refuse GBC FX explicitly. -# Hides the OPTIONS row, pins the level to OFF, and heals a level already -# persisted in options.lua. -export POKEPORT_GBCFX="${POKEPORT_GBCFX:-0}" $ESUDO chmod a+x ./bin/love.aarch64 2>/dev/null || chmod a+x ./bin/love.aarch64 $ESUDO chmod 666 /dev/uinput 2>/dev/null || true @@ -325,13 +320,6 @@ Native LÖVE 11.5 port of gen1recomp for Anbernic RG34XXSP on In-game controls use the normal PortMaster / SDL pad map (rebind under OPTIONS → CONTROLS). -### Display options - -GBC FX is disabled on this device (the H700's Mali GPU compiles that present -pass and then shows a black frame), so the OPTIONS row is hidden. COLORS, -TILT, ZOOM, VOID FILL and MAX FPS all work. To try it anyway, launch with -`POKEPORT_GBCFX=1`. - ### First run Stock OS has no zenity file picker. Put the `.gb` in `lovegame/`, then press diff --git a/conf.lua b/conf.lua index 1fe4d5da..974a9c86 100644 --- a/conf.lua +++ b/conf.lua @@ -66,6 +66,12 @@ function love.conf(t) t.modules.audio = not companion t.modules.joystick = not companion t.modules.physics = false + -- love.sensor exposes raw accelerometer/gyroscope data (love.sensor.getData), + -- independent of t.accelerometerjoystick below (which instead maps the + -- accelerometer onto joystick axes and stays off -- see that flag's + -- comment for why). Explicit here so a future effect (e.g. a tilt-driven + -- reflective-screen look) has sensor data available without reviving #468. + t.modules.sensor = true -- love.system is not loaded during love.conf; love._os is set by the -- engine before conf runs (LÖVE 11.x / 11.5). diff --git a/data/scripts/flavor/pokemon_fan_club.lua b/data/scripts/flavor/pokemon_fan_club.lua index 1efd93dd..f91866cc 100644 --- a/data/scripts/flavor/pokemon_fan_club.lua +++ b/data/scripts/flavor/pokemon_fan_club.lua @@ -36,19 +36,29 @@ M.POKEMON_FAN_CLUB = { { "clear_flag", "EVENT_SEEL_FAN_BOAST" }, -- 8 }, - -- PokemonFanClubPikachuText (scripts/PokemonFanClub.asm): the - -- PIKACHU itself, just a flavor line (its cry isn't playable in the - -- port's talk pipeline, so it's dropped like other cry-only lines). + -- PokemonFanClubPikachuText (scripts/PokemonFanClub.asm:71): PrintText, + -- then ld a, PIKACHU / call PlayCry (:76) / call WaitForSoundToFinish. TEXT_POKEMONFANCLUB_PIKACHU = { - { "show_text", "_PokemonFanClubPikachuText" }, + { "play_cry", "PIKACHU", true }, -- 1 PlayCry (#1649) + { "show_text", "_PokemonFanClubPikachuText" }, -- 2 PrintText }, - -- PokemonFanClubSeelText (scripts/PokemonFanClub.asm): the SEEL - -- itself, flavor line only. + -- PokemonFanClubSeelText (scripts/PokemonFanClub.asm:84): the same + -- shape with SEEL, PlayCry at :89. TEXT_POKEMONFANCLUB_SEEL = { - { "show_text", "_PokemonFanClubSeelText" }, + { "play_cry", "SEEL", true }, -- 1 PlayCry (#1649) + { "show_text", "_PokemonFanClubSeelText" }, -- 2 PrintText }, }, } +-- pokeyellow/scripts/PokemonFanClub.asm:149 PokemonFanClubClefairyText: Yellow's +-- pet is a CLEFAIRY on its own TEXT_POKEMONFANCLUB_CLEFAIRY, PlayCry at :154. +if require("src.core.GameVersion").isYellow() then + M.POKEMON_FAN_CLUB.talk.TEXT_POKEMONFANCLUB_CLEFAIRY = { + { "play_cry", "CLEFAIRY", true }, -- 1 PlayCry + { "show_text", "_PokemonFanClubClefairyText" }, -- 2 PrintText + } +end + return M diff --git a/data/scripts/flavor/ss_anne_1f_rooms.lua b/data/scripts/flavor/ss_anne_1f_rooms.lua index bde124b5..5d2fab56 100644 --- a/data/scripts/flavor/ss_anne_1f_rooms.lua +++ b/data/scripts/flavor/ss_anne_1f_rooms.lua @@ -1,10 +1,11 @@ --- pokered/scripts/SSAnne1FRooms.asm: SSAnne1FRoomsWigglytuffText --- text_far _SSAnne1FRoomsWigglytuffText; then ld a, WIGGLYTUFF / call PlayCry (cosmetic cry sound, not ported) +-- pokered/scripts/SSAnne1FRooms.asm:66 SSAnne1FRoomsWigglytuffText +-- text_far _SSAnne1FRoomsWigglytuffText, then ld a, WIGGLYTUFF / call PlayCry (:70) return { SS_ANNE_1F_ROOMS = { talk = { TEXT_SSANNE1FROOMS_WIGGLYTUFF = { {"face_player"}, + {"play_cry", "WIGGLYTUFF", true}, -- 1 PlayCry (#1687) {"show_text", "_SSAnne1FRoomsWigglytuffText"}, }, }, diff --git a/data/scripts/flavor/ss_anne_b1f_rooms.lua b/data/scripts/flavor/ss_anne_b1f_rooms.lua index 76f5bc3c..1c1038c3 100644 --- a/data/scripts/flavor/ss_anne_b1f_rooms.lua +++ b/data/scripts/flavor/ss_anne_b1f_rooms.lua @@ -1,12 +1,11 @@ --- pokered/scripts/SSAnneB1FRooms.asm: SSAnneB1FRoomsMachokeText --- text_far _SSAnneB1FRoomsMachokeText, then `ld a, MACHOKE / call PlayCry` --- (cry playback has no equivalent Commands.lua verb in this port, so only --- the flavor text is ported). +-- pokered/scripts/SSAnneB1FRooms.asm:82 SSAnneB1FRoomsMachokeText +-- text_far _SSAnneB1FRoomsMachokeText, then ld a, MACHOKE / call PlayCry (:86) return { SS_ANNE_B1F_ROOMS = { talk = { TEXT_SSANNEB1FROOMS_MACHOKE = { { "face_player" }, + { "play_cry", "MACHOKE", true }, -- 1 PlayCry (#1687) { "show_text", "_SSAnneB1FRoomsMachokeText" }, }, }, diff --git a/data/scripts/flavor/vermilion_city.lua b/data/scripts/flavor/vermilion_city.lua index c31d36fd..7c1bc24d 100644 --- a/data/scripts/flavor/vermilion_city.lua +++ b/data/scripts/flavor/vermilion_city.lua @@ -18,10 +18,11 @@ return { -- VermilionCityMachopText: cries out, then follows up with a -- second line about stomping the land flat. - -- (pokered/scripts/VermilionCity.asm) + -- (pokered/scripts/VermilionCity.asm:224, PlayCry at :228) TEXT_VERMILIONCITY_MACHOP = { - { "show_text", "_VermilionCityMachopText" }, -- 1 - { "show_text", "_VermilionCityMachopStompingTheLandFlatText" }, -- 2 + { "play_cry", "MACHOP", true }, -- 1 PlayCry (#1649) + { "show_text", "_VermilionCityMachopText" }, -- 2 + { "show_text", "_VermilionCityMachopStompingTheLandFlatText" }, -- 3 }, }, }, diff --git a/data/scripts/flavor/vermilion_pidgey_house.lua b/data/scripts/flavor/vermilion_pidgey_house.lua index 043c2c6b..29023bb5 100644 --- a/data/scripts/flavor/vermilion_pidgey_house.lua +++ b/data/scripts/flavor/vermilion_pidgey_house.lua @@ -1,14 +1,12 @@ --- pokered/scripts/VermilionPidgeyHouse.asm: VermilionPidgeyHousePidgeyText --- text_far _VermilionPidgeyHousePidgeyText, then text_asm plays the PIDGEY --- cry (ld a, PIDGEY / call PlayCry / call WaitForSoundToFinish) before --- TextScriptEnd. This port has no cry-playback command, so only the --- flavor line is ported. +-- pokered/scripts/VermilionPidgeyHouse.asm:15 VermilionPidgeyHousePidgeyText +-- text_far, then ld a, PIDGEY / call PlayCry (:19) / call WaitForSoundToFinish return { VERMILION_PIDGEY_HOUSE = { talk = { TEXT_VERMILIONPIDGEYHOUSE_PIDGEY = { {"face_player"}, + {"play_cry", "PIDGEY", true}, -- 1 PlayCry (#1649) {"show_text", "_VermilionPidgeyHousePidgeyText"}, }, }, diff --git a/data/scripts/story.lua b/data/scripts/story.lua index 4dc2507e..372a1836 100644 --- a/data/scripts/story.lua +++ b/data/scripts/story.lua @@ -381,22 +381,35 @@ M.VERMILION_CITY = { return true end, talk = { - -- the sailor guarding the dock gangway (VermilionCitySailor1Text): - -- flashing the ticket just lets you through -- he never hides, and - -- once the ship has sailed he only reports it gone - TEXT_VERMILIONCITY_SAILOR1 = { - { "face_player" }, -- 1 - { "check_flag", "EVENT_SS_ANNE_LEFT" }, -- 2 - { "jump_if_true", 11 }, -- 3 - { "show_text", "_VermilionCitySailor1DoYouHaveATicketText" }, -- 4 - { "check_item", "S_S_TICKET" }, -- 5 - { "jump_if_false", 9 }, -- 6 - { "show_text", "_VermilionCitySailor1FlashedTicketText" }, -- 7 - { "jump", 12 }, -- 8 - { "show_text", "_VermilionCitySailor1YouNeedATicketText" }, -- 9 - { "jump", 12 }, -- 10 - { "show_text", "_VermilionCitySailor1ShipSetSailText" }, -- 11 - }, + -- scripts/VermilionCity.asm:158 (#1651) + TEXT_VERMILIONCITY_SAILOR1 = function(game, ow, npc, done) + local Flags = require("src.script.Flags") + local TextBox = require("src.render.TextBox") + local t = game.data.text + if Flags.get(game.save, "EVENT_SS_ANNE_LEFT") then + game.stack:push(TextBox.new(game, + t._VermilionCitySailor1ShipSetSailText or "The ship set sail.", + done)) + return + end + -- scripts/VermilionCity.asm:195 + local p = ow and ow.player + if not p or p.facing == "right" + or (p.cellX == 19 and (p.cellY == 29 or p.cellY == 31)) then + game.stack:push(TextBox.new(game, + t._VermilionCitySailor1WelcomeToSSAnneText + or "Welcome to S.S.\nANNE!", done)) + return + end + local ask = t._VermilionCitySailor1DoYouHaveATicketText + or "Welcome to S.S.\nANNE!\fExcuse me, do you\nhave a ticket?" + local tail = ((game.save.inventory.S_S_TICKET or 0) > 0) + and (t._VermilionCitySailor1FlashedTicketText + or "{PLAYER} flashed\nthe S.S.TICKET!") + or (t._VermilionCitySailor1YouNeedATicketText + or "You need a ticket\nto get aboard.") + game.stack:push(TextBox.new(game, ask .. "\f" .. tail, done)) + end, }, } @@ -405,13 +418,14 @@ M.SS_ANNE_2F = { TEXT_SSANNE2F_RIVAL = { { "face_player" }, -- 1 { "check_flag", "EVENT_BEAT_SS_ANNE_RIVAL" }, -- 2 - { "jump_if_true", 9 }, -- 3 + { "jump_if_true", 9 }, -- 3 (beaten: silent) { "show_text", "_SSAnne2FRivalText" }, -- 4 - { "rival_battle", "OPP_RIVAL2", 1 }, -- 5 - { "jump_if_false", 10 }, -- 6 - { "set_flag", "EVENT_BEAT_SS_ANNE_RIVAL" }, -- 7 - { "show_text", "_SSAnne2FRivalDefeatedText" }, -- 8 - { "jump", 10 }, -- 9 (already beaten: silent) + -- SSAnne2FRivalText's text_asm arms SaveEndBattleTextPointers + -- (scripts/SSAnne2F.asm:199), so the line prints in battle (#1688) + { "save_end_battle_text", "_SSAnne2FRivalDefeatedText" }, -- 5 + { "rival_battle", "OPP_RIVAL2", 1 }, -- 6 + { "jump_if_false", 9 }, -- 7 + { "set_flag", "EVENT_BEAT_SS_ANNE_RIVAL" }, -- 8 }, }, } diff --git a/data/scripts/story2.lua b/data/scripts/story2.lua index 09fea14d..a28ae8a9 100644 --- a/data/scripts/story2.lua +++ b/data/scripts/story2.lua @@ -731,12 +731,35 @@ M.MT_MOON_B2F = { local function museumClerk(game, ow, done, onDecline) local TextBox = require("src.render.TextBox") local t = game.data.text or {} + local p = ow and ow.player + -- scripts/Museum1F.asm:45 (#1690) + if p and ((p.cellY == 4 and p.cellX == 13) + or (p.cellY == 3 and p.cellX == 12)) then + game.stack:push(TextBox.new(game, + t._Museum1FScientist1DoYouKnowWhatAmberIsText + or "You can't sneak\nin the back way!\fOh, whatever!\nDo you know what\vAMBER is?", + nil, { choice = function(yes) + game.stack:push(TextBox.new(game, yes + and (t._Museum1FScientist1TheresALabSomewhereText + or "There's a lab\nsomewhere trying\vto resurrect\vancient POKéMON\vfrom AMBER.") + or (t._Museum1FScientist1AmberIsFossilizedTreeSapText + or "AMBER is fossil-\nized tree sap."), done)) + end })) + return + end if game.save.flags.EVENT_BOUGHT_MUSEUM_TICKET then game.stack:push(TextBox.new(game, t._Museum1FScientist1TakePlentyOfTimeText or "Take your time,\nand enjoy it all!", done)) return end + -- scripts/Museum1F.asm:58 + if p and p.cellY ~= 4 then + game.stack:push(TextBox.new(game, + t._Museum1FScientist1GoToOtherSideText + or "Please go to the\nother side!", done)) + return + end -- scripts/Museum1F.asm:72 local money = function() return game.save.money end game.stack:push(TextBox.new(game, diff --git a/data/scripts/story3.lua b/data/scripts/story3.lua index d2d4dbd5..b84aa405 100644 --- a/data/scripts/story3.lua +++ b/data/scripts/story3.lua @@ -9,20 +9,30 @@ local M = {} -- FuchsiaGoodRodHouse.asm, Route12SuperRodHouse.asm) -- ------------------------------------------------------------------- -local function rodGiver(askText, receivedText, afterText, rodItem, flag) - return { - { "face_player" }, -- 1 - { "check_flag", flag }, -- 2 - { "jump_if_true", 9 }, -- 3 - { "ask", askText }, -- 4 - { "jump_if_false", 10 }, -- 5 +-- refusedText is the .ThatsSoDisappointingText tail on NO; followText is +-- the second half of the received chain (scripts/VermilionOldRodHouse.asm:45) +local function rodGiver(askText, receivedText, afterText, rodItem, flag, + refusedText, followText) + local rows = { + { "face_player" }, + { "check_flag", flag }, + { "jump_if_true", "already_got" }, + { "ask", askText }, + { "jump_if_false", "refused" }, -- give-then-print like the three rod-house scripts (GiveItem fills -- wStringBuffer; the received texts read OLD/GOOD/SUPER ROD from it) - { "give_item", rodItem, 1, false }, -- 6 - { "show_text", receivedText }, -- 7 - { "set_flag", flag }, -- 8 - { "jump", 10 }, -- 9 is below + { "give_item", rodItem, 1, false }, + { "set_flag", flag }, + { "show_text", receivedText }, } + if followText then rows[#rows + 1] = { "show_text", followText } end + rows[#rows + 1] = { "jump", "end" } + rows[#rows + 1] = { "label", "refused" } + rows[#rows + 1] = { "show_text", refusedText } + rows[#rows + 1] = { "jump", "end" } + rows[#rows + 1] = { "label", "already_got" } + rows[#rows + 1] = { "show_text", afterText } + return rows end M.VERMILION_OLD_ROD_HOUSE = { @@ -31,11 +41,11 @@ M.VERMILION_OLD_ROD_HOUSE = { "_VermilionOldRodHouseFishingGuruDoYouLikeToFishText", "_VermilionOldRodHouseFishingGuruTakeThisText", "_VermilionOldRodHouseFishingGuruHowAreTheFishBitingText", - "OLD_ROD", "EVENT_GOT_OLD_ROD"), + "OLD_ROD", "EVENT_GOT_OLD_ROD", + "_VermilionOldRodHouseFishingGuruThatsSoDisappointingText", + "_VermilionOldRodHouseFishingGuruFishingIsAWayOfLifeText"), }, } -M.VERMILION_OLD_ROD_HOUSE.talk.TEXT_VERMILIONOLDRODHOUSE_FISHING_GURU[9] = - { "show_text", "_VermilionOldRodHouseFishingGuruHowAreTheFishBitingText" } M.FUCHSIA_GOOD_ROD_HOUSE = { talk = { @@ -43,11 +53,10 @@ M.FUCHSIA_GOOD_ROD_HOUSE = { "_FuchsiaGoodRodHouseFishingGuruText", "_FuchsiaGoodRodHouseFishingGuruReceivedGoodRodText", "_FuchsiaGoodRodHouseFishingGuruHowAreTheFishText", - "GOOD_ROD", "EVENT_GOT_GOOD_ROD"), + "GOOD_ROD", "EVENT_GOT_GOOD_ROD", + "_FuchsiaGoodRodHouseFishingGuruThatsSoDisappointingText"), }, } -M.FUCHSIA_GOOD_ROD_HOUSE.talk.TEXT_FUCHSIAGOODRODHOUSE_FISHING_GURU[9] = - { "show_text", "_FuchsiaGoodRodHouseFishingGuruHowAreTheFishText" } M.ROUTE_12_SUPER_ROD_HOUSE = { talk = { @@ -55,11 +64,11 @@ M.ROUTE_12_SUPER_ROD_HOUSE = { "_Route12SuperRodHouseFishingGuruDoYouLikeToFishText", "_Route12SuperRodHouseFishingGuruReceivedSuperRodText", "_Route12SuperRodHouseFishingGuruTryFishingText", - "SUPER_ROD", "EVENT_GOT_SUPER_ROD"), + "SUPER_ROD", "EVENT_GOT_SUPER_ROD", + "_Route12SuperRodHouseFishingGuruThatsDisappointingText", + "_Route12SuperRodHouseFishingGuruFishingWayOfLifeText"), }, } -M.ROUTE_12_SUPER_ROD_HOUSE.talk.TEXT_ROUTE12SUPERRODHOUSE_FISHING_GURU[9] = - { "show_text", "_Route12SuperRodHouseFishingGuruTryFishingText" } -- ------------------------------------------------------------------- -- Pokemon Tower 5F purified zone (scripts/PokemonTower5F.asm @@ -893,16 +902,6 @@ local DOCK_SHIP_BLOCKS = { { bx = 7, by = 2, water = 13 }, { bx = 8, by = 2, water = 13 }, } --- her four hull columns bow-to-stern (upper-half / lower-half block ids) --- and the open-water ids of the rows she sits in -local DOCK_SHIP_COLUMNS = { - { bx = 5, top = 4, bottom = 8 }, - { bx = 6, top = 5, bottom = 9 }, - { bx = 7, top = 6, bottom = 10 }, - { bx = 8, top = 7, bottom = 11 }, -} -local DOCK_WATER_TOP, DOCK_WATER_BOTTOM = 1, 13 - M.VERMILION_DOCK = { onEnter = function(game, ow) local Flags = require("src.script.Flags") @@ -922,52 +921,29 @@ M.VERMILION_DOCK = { end)) elseif f.EVENT_GOT_HM01 and ow.player.cellY == 2 then -- VermilionDockSSAnneLeavesScript: only stepping OFF the ship - -- triggers the departure (wDestinationWarpID == 1 in pokered) -- - -- Music_Surfing plays for the sail-away cutscene, smoke puffs - -- drift off the funnel, the horn blows, the ship is erased to - -- open water, and the player is walked off the dock into the - -- city past the guard (VermilionCity's - -- SCRIPT_VERMILIONCITY_PLAYER_EXIT_SHIP walk) + -- triggers the departure (wDestinationWarpID == 1 in pokered) Flags.set(game.save, "EVENT_SS_ANNE_LEFT") local Music = require("src.core.Music") Music.stop() Music.play(game.data, "Music_Surfing") - local function puff(n, cx) - if n <= 0 then return end - ow:startDustAnim(cx, 1, function() puff(n - 1, cx + 2) end) - end - puff(3, 15) - -- scripts/VermilionDock.asm:182-203 - local rows = {} - local function setBlock(bx, by, block) - if bx < 1 or bx > 8 then return end - rows[#rows + 1] = { "replace_block", bx, by, block } - end - rows[#rows + 1] = { "wait", 120 } - rows[#rows + 1] = { "play_sound", "SS_Anne_Horn" } - -- .shift_columns_up slides her tile columns west behind a mid-frame - -- rSCX split; with no split scroll here she sails one block per beat - -- and the water closes in astern (#360) - for step = 1, 8 do - for _, col in ipairs(DOCK_SHIP_COLUMNS) do - setBlock(col.bx - step, 1, col.top) - setBlock(col.bx - step, 2, col.bottom) - end - setBlock(9 - step, 1, DOCK_WATER_TOP) - setBlock(9 - step, 2, DOCK_WATER_BOTTOM) - rows[#rows + 1] = { "wait", 20 } - end - -- the second horn as she clears the dock, then EraseSSAnne's 120 - -- frames before the walk out - rows[#rows + 1] = { "play_sound", "SS_Anne_Horn" } - rows[#rows + 1] = { "wait", 120 } - rows[#rows + 1] = { "move_player", "up", 2 } - -- no keepMusic on this warp: Music_Surfing belongs to the dock's - -- cutscene, and VERMILION_CITY's own theme has to take over as the - -- player crosses in (EnterMap's PlayDefaultMusic) - rows[#rows + 1] = { "warp", "VERMILION_CITY", 18, 31, "up" } - rows[#rows + 1] = { "move_player", "up", 2 } - ow:queueScript(rows) + ow:queueScript({ + -- scripts/VermilionDock.asm:50 zeroes the player image index and + -- :77 freezes sprite updates, so he faces DOWN throughout (#1689) + { "face_player_dir", "down" }, + { "wait", 120 }, + { "play_sound", "SS_Anne_Horn" }, + -- scripts/VermilionDock.asm:80 .shift_columns_up + { "ss_anne_departs" }, + -- scripts/VermilionDock.asm:205 VermilionDock_EraseSSAnne + { "play_sound", "SS_Anne_Horn" }, + { "wait", 120 }, + { "move_player", "up", 2 }, + -- no keepMusic on this warp: Music_Surfing belongs to the dock's + -- cutscene, and VERMILION_CITY's own theme has to take over as the + -- player crosses in (EnterMap's PlayDefaultMusic) + { "warp", "VERMILION_CITY", 18, 31, "up" }, + { "move_player", "up", 2 }, + }) end end, } diff --git a/data/scripts/story5.lua b/data/scripts/story5.lua index 98016848..87a4a4ff 100644 --- a/data/scripts/story5.lua +++ b/data/scripts/story5.lua @@ -922,10 +922,12 @@ M.SS_ANNE_2F = { { "move_npc_to", 2, 36, onLeft and 7 or 8 }, -- 2 { "face_object", 2, onLeft and "down" or "right" }, -- 3 { "show_text", "_SSAnne2FRivalText" }, -- 4 - { "rival_battle", "OPP_RIVAL2", 1 }, -- 5 - { "jump_if_false", 13 }, -- 6 - { "set_flag", "EVENT_BEAT_SS_ANNE_RIVAL" }, -- 7 - { "show_text", "_SSAnne2FRivalDefeatedText" }, -- 8 + -- SSAnne2FRivalText's text_asm arms SaveEndBattleTextPointers + -- (scripts/SSAnne2F.asm:199), so the line prints in battle (#1688) + { "save_end_battle_text", "_SSAnne2FRivalDefeatedText" }, -- 5 + { "rival_battle", "OPP_RIVAL2", 1 }, -- 6 + { "jump_if_false", 13 }, -- 7 + { "set_flag", "EVENT_BEAT_SS_ANNE_RIVAL" }, -- 8 { "show_text", "_SSAnne2FRivalCutMasterText" }, -- 9 { "play_music", "Music_MeetRival", { start = "rival" } }, -- 10 { "walk_npc", 2, ssAnne2FRivalExitDirs(onLeft) }, -- 11 diff --git a/docs/anbernic-rg34xxsp.md b/docs/anbernic-rg34xxsp.md index 441090ab..916aa25d 100644 --- a/docs/anbernic-rg34xxsp.md +++ b/docs/anbernic-rg34xxsp.md @@ -55,16 +55,6 @@ In-game controls use the normal PortMaster / SDL pad map, rebindable under ## Notes -**GBC FX is off on this device.** The launcher exports `POKEPORT_GBCFX=0`, -which hides the GBC FX row from OPTIONS, pins the level to OFF, and clears a -level carried over in an `options.lua` from another machine. The H700's Mali -GPU is in the same class as the phone GPUs that compile that present pass and -then show a black frame (issue #136), and `love.system.getOS()` reports -`"Linux"` here, so the Android gate would not have caught it. Every other -display option — COLORS, TILT, ZOOM, VOID FILL, MAX FPS — works normally. If -your device turns out to handle the pass, launch with `POKEPORT_GBCFX=1` to -put the row back. - **PERFORMANCE defaults to LOW here.** The OPTIONS → PERFORMANCE tier defaults to AUTO, which reads this device as an ARM Linux handheld and resolves to **LOW**: the 3D tilt and survey zoom stay off and the frame rate is capped, diff --git a/docs/mod-api-gen2-compat.md b/docs/mod-api-gen2-compat.md index 54f94243..1e42c91f 100644 --- a/docs/mod-api-gen2-compat.md +++ b/docs/mod-api-gen2-compat.md @@ -573,7 +573,7 @@ gains a field instead of the name gaining a prefix. at the same moment `src/core/Game.lua` and `src/render/Renderer.lua` raise it -- the logic tick before the pad is read, a pointer the touch overlay gets first refusal on, the palette zone list handed to the present pass, the - composed frame before GBCFX, the letterbox, and the finished playfield rect + composed frame before ShaderFX, the letterbox, and the finished playfield rect -- and carries the same payload. `render.hud`'s `gameX` / `gameY` really is where Gold's dialogue boxes and menus land, because `Chrome.fitScale` / `fitOrigin` and `World:fitScale` diff --git a/docs/modding.md b/docs/modding.md index 7c724404..587b1fc4 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -806,7 +806,7 @@ contract, so a mod does not need a desktop-specific rendering path. `render.output_enabled` and `render.output` are the later, whole-window seam for mods that need the engine's normal composite rather than its separate -layers. It runs after registered present pipelines and before GBCFX, +layers. It runs after registered present pipelines and before ShaderFX, `render.hud`, and touch controls. A mod wraps both hooks: the first returns `true` only while output ownership is needed, and the second receives `(next, ctx)` with `canvas`, `width`, `height`, `gameX`, `gameY`, `gameWidth`, diff --git a/docs/new-features.md b/docs/new-features.md index 9e07ed9a..f58475cc 100644 --- a/docs/new-features.md +++ b/docs/new-features.md @@ -16,6 +16,8 @@ Features intentionally added beyond the original Pokémon Red, Blue, and Yellow * **Pokédex diploma and printer image exports** * **Shareable mod lists** over save sync, optionally carrying the options set for those mods, which the receiving device is asked about before anything is changed * **Custom carts**, a named mod set saved from the mods tab and picked from a game's page, with its own shell colour, label art, save slots and export file +* **Install required mods**, one press on a cart that will not start, fetching every pinned mod at the pinned version and refusing any archive whose hash is not the one the cart recorded +* **Browse carts in Find mods**, a Mods / Carts switch on the same community index, searched and filtered by base game, installing the cart file straight into that game's cart list ## Gen 2 Specifics diff --git a/docs/shaderfx.md b/docs/shaderfx.md new file mode 100644 index 00000000..03e34c5b --- /dev/null +++ b/docs/shaderfx.md @@ -0,0 +1,673 @@ +# ShaderFX: runtime slang shader presets + +ShaderFX plays real libretro `.slangp` shader presets over the finished frame. +It replaced `src/render/GBCFX.lua`, a hand-ported fixed four-level effect, with +a picker: any preset the player drops in a folder, or any preset pulled from +the RetroArch buildbot, can be selected and run. Engine: +`src/render/ShaderFX.lua` (discovery, download, translation call, pass-graph +runtime, render entry point), `src/render/ShaderFixup.lua` (GLSL rewrites), +`src/render/ShaderSourcePatches.lua` (pre-translation source patches), +`src/core/Sensors.lua` (accelerometer and gyroscope), `src/ui/ShaderFXScreen.lua` +(the picker), `src/ui/ShaderFXParamsScreen.lua` (per-preset parameter editor), +`tools/shaderfx-bridge/` (the Rust translator). Call sites: +`src/render/Renderer.lua` (Gen 1) and `src/core/Game2.lua` (Gen 2), both at the +end of the frame. Drivers: `tests/drivers/gold_shaderfx_zoom_sizing_test.lua`, +`tests/drivers/gold_shaderfx_menu_black_crop_test.lua`. + +This is first-party engine code, not a mod. It calls the native translator +directly through `ffi.load`, with no `Sandbox.lua`, no `native` permission +declaration, and no mod boundary. Mods do not get that, and the distinction is +deliberate: the upstream maintainer will not accept `native` in mods. + +## What a player sees + +**OPTIONS** carries two rows, `SHADER FX` and `SHADER FX 2`. Each opens the +same pushed list screen (`ShaderFXScreen`) on a different slot. The list is +`OFF`, then every `.slangp` found on disk, then a permanent `DOWNLOAD SHADERS` +action row at the bottom. + +A preset that has never been translated draws muted with a `CONVERT` hint on +the right. `A` on that row translates it in place and stays open: converting is +a preparation step, not a selection. `A` on a converted row activates it, +persists the choice, and closes. `SELECT` on a converted row opens +`ShaderFXParamsScreen`, which lists every `#pragma parameter` the preset +declares and lets the player step each one (`A` wraps, Left/Right clamp, +`SELECT` resets one row, `START` resets all behind a confirm). + +Presets live in a plain OS folder, `shaders/` under the portable base directory +when running portable (`SaveData.portableBaseDir()`, the SD-card convention the +Anbernic pack uses, see `docs/anbernic-rg34xxsp.md`) and otherwise under LOVE's +save directory. `ShaderFX.list()` scans it recursively, so a shader pack keeps +whatever nested layout it shipped with. These are real filesystem paths rather +than `love.filesystem` virtual paths on purpose: the native translator does +plain `std::fs` reads and knows nothing about LOVE's mounts, and neither do the +LUT loads. + +Persisted state, all in `save.options`: + +| Key | Meaning | +| --- | --- | +| `shaderfx` | main slot's preset name, or absent for OFF | +| `shaderfxSecondary` | secondary slot's preset name | +| `shaderfxParams[name][paramId]` | one preset's edited pragma values | + +`POKEPORT_SHADERFX=` activates a preset in the main slot for scratch +harnesses that never call `ShaderFX.applyOptions`. It is a stand-in that +predates the real OPTIONS row; `applyOptions` marks itself as having run so the +env var can never later override a real player choice, including a real choice +of OFF. + +One quiet behavior worth knowing about: if a slot wants a real preset while +PERFORMANCE is still on AUTO, and AUTO would resolve to a tier that caps +ShaderFX off, `ShaderFX.applyOptions` pins PERFORMANCE to `HIGH`. Without it +the saved choice was force-deactivated a few lines later on every boot, which +looks identical to "the setting does not save" from the player's side. On +Android and iOS that is the common case, because AUTO always resolves to +`balanced` there. It never touches an already-explicit performance choice and +never un-escalates. + +## The five stages + +| Stage | Owner | +| --- | --- | +| Fetch | `ShaderFX.list`, `ShaderFX.downloadPresets`, `ShaderFX.installDownloaded` | +| Translate | `tools/shaderfx-bridge/` via `ShaderFX.translate` | +| Fixup | `src/render/ShaderFixup.lua` | +| Cache | `ShaderFX.convert` writes, `ShaderFX.load` reads | +| Run | `ShaderFX.runChain` / `runPass` / `ShaderFX.render` | + +### Fetch + +Two acquisition paths, and they land in the same place. A player can copy a +shader pack into `shaders/` by hand, or press `DOWNLOAD SHADERS`, which fetches +`https://buildbot.libretro.com/assets/frontend/shaders_slang.zip` (the same +~54 MB archive RetroArch's own "Update Shaders" entry pulls) through +`src/net/Fetch.lua`, the curl-on-a-`love.thread` transport the self-updater and +mod index already use. + +Downloaded presets are *not* pre-converted. The buildbot is RetroArch's asset +mirror and has no notion of this project's cache format, so a downloaded preset +goes through the same `CONVERT` row a hand-copied one does. Every platform +ships both convert and use; there is no asymmetry to work around. + +Repeat downloads are conditional. The zip itself is deleted right after +extraction, so what is cached instead is the buildbot's own ETag +(`shaderfx_buildbot.etag`), replayed as `If-None-Match`. The server answers a +match with 304 and no body, and curl writes no file at all in that case, so +`installDownloaded(notModified)` short-circuits before touching the filesystem +and reports "already up to date" rather than "FAILED". + +The interesting part is what gets extracted. `handheld/` is not self-contained: +its 78 presets carry 101 references that escape the folder (color-mod LUTs +into `../shaders/color/`, console-border helpers into `../../reshade/`, shared +motion-blur and misc helpers, a shared `stock.slang`) across roughly 40 of +them. Extracting `handheld/` alone silently breaks about a third of its own +list; extracting the whole zip drags in ~5600 files of CRT, arcade and console +content nobody asked for. So `extractClosure` walks the real file-level +dependency closure in Lua before a single file is copied, the same +`#reference`-closure idea librashader applies internally, done up front because +deciding what to copy has to happen before the translator ever sees these +files. Against this zip that is 207 files and about 9.5 MB with zero broken +references. The closure seeds from `KEPT_PRESETS`, a curated shortlist rather +than all 78, after most of `color-mod/` and `console-border/` turned out either +irrelevant (color-only, no LCD effect) or broken for this project. That list +is a temporary trim pending wider testing and is expected to change. + +Two mechanical details in that walk that are easy to get wrong a second time. +`extractRefs` tries a quoted `key = "path"` match per line first, with an +unrestricted `[^"]+` capture, because the closing quote is an unambiguous +delimiter and real packs ship paths with spaces and parentheses in them +(`"shaders/handheld/color-mod/Game Boy (Color).slang"`); only a line with no +quoted match falls back to a conservative character class, since an unquoted +path has no delimiter to trust past. And `love.filesystem.write` does not +create intermediate directories, so each destination directory is created once +before anything is written into it; without that, every file under a subfolder +`handheld/` never had before was silently dropped while flat writes succeeded. +Cleanup is equally literal: `love.filesystem.unmount()` takes the archive path +originally passed to `mount()`, not the mountpoint. Called with the mountpoint +it returns false, leaves the zip's handle open, and the following `remove()` +silently fails too, so every download used to leave 54 MB on disk forever. + +### Translate: the native bridge + +`tools/shaderfx-bridge/` is a small Rust crate (`spike`) that builds a cdylib +named `librashader_bridge`. It wraps `librashader-presets`, +`librashader-preprocess` and `librashader-reflect` behind a two-function C ABI: + +``` +char* librashader_translate_preset(const char* preset_path, int es); +void librashader_free_string(char* s); +``` + +It returns a JSON `TranslateResult`: `pass_count`, a `passes` array (each with +its emitted `vertex`/`fragment` GLSL, `filter`, `wrap_mode`, `scale_x`/ +`scale_y`, its own `#pragma parameter` declarations, a classified `samplers` +list and a classified `size_uniforms` list), the preset's `textures` (LUTs, +with resolved absolute paths and filter/wrap settings), its +`parameter_overrides`, and an `error` field. + +**What the bridge is not.** No librashader runtime backend is linked in, for +any API: no GL, Vulkan, D3D or Metal crate is a dependency, and no live +graphics context is ever touched. It is the translation step only. LOVE still +owns every draw call, every canvas and every shader object. The bridge hands +back text and metadata and nothing else. + +**When it is called.** Only from `ShaderFX.convert()`. Translation is ahead of +time, not just in time. `ShaderFX.load()`, `ShaderFX.activate()`, boot-time +reactivation of a saved choice and every frame of `ShaderFX.render()` read the +cached artifact and never call the library. An entry with no cached artifact +fails `activate()` loudly instead of silently live-translating. + +The classification is done with librashader's real semantics resolution rather +than name matching on the Lua side, and that matters for correctness, not just +tidiness. Sampler classification uses `ShaderSemantics::create_pass_semantics` +plus the `TextureSemanticMap` lookup (explicit alias and LUT-name entries +first, then the built-in `Source`/`Original`/`OriginalHistoryN`/`PassOutputN`/ +`PassFeedbackN` conventions), so a pass reachable only by its real `.slangp` +alias resolves. The per-pass convenience API only registers the alias of the +pass being compiled, so the bridge mirrors upstream's `insert_pass_semantics` +loop and builds a preset-wide alias map first; without that, +`ds-hybrid-scalefx.slangp`'s pass 2 sampling `scalefx_pass0` by alias, with no +`PassOutput1`-shaped name anywhere, can never resolve. Size-uniform +classification runs the same resolution over the pass's `uniform_semantics` +map, which also covers shapes (`PassFeedbackSizeN`, `UserSizeN`) that no +present preset uses but that the convention allows. + +The `es` flag picks the emitted dialect: 1 for GLSL ES 1.00 (mobile, LOVE's ES +dialect), 0 for GLSL 1.20 (LOVE's desktop dialect). `ShaderFX` picks it from +`love.system.getOS()`, and the same function decides which dialect +`validateShader` is asked about at run time, so the two always agree. Convert +and render always happen on the same device; **artifacts are not portable +across platforms**. + +One class of fixup has to happen in the bridge rather than in `ShaderFixup.lua`, +on the raw `.slang` text before SPIR-V compilation: `textureSize`, +`texelFetchOffset` and `textureOffset` are all ES 3.00+ only, and spirv-cross +refuses to *emit* them for an ES 1.00 target, failing the whole pass with +`UnsupportedSpirv("textureSize is not supported in ESSL 100.")`. No GLSL text +is ever produced for a later pass to patch, so `rewrite_essl100_gaps` rewrites +the source first, and only for the ES target: + +- `textureSize(Tex, lod)` becomes a literal `ivec2(w, h)` when `Tex` is one of + the preset's declared static textures, with dimensions read straight out of + each PNG's IHDR chunk. A texture that is not one of those, or a non-literal + `lod`, is left alone so it fails as loudly as before instead of guessing. +- `texelFetchOffset` and `textureOffset` become ordinary `texture()` calls at + the equivalent texel-centre UV, using the texture's own `Size.zw` + reciprocal-size uniform. The containing block instance (`params`, `global`, + whatever) is discovered by scanning the source's own uniform block bodies, + never assumed. When a pass samples another pass purely through these calls it + may never declare that `Size` uniform at all, so one is injected first, + before any byte offsets are computed. + +That last rewrite has an honest limit: `texture()` honours the sampler's wrap +mode at out-of-range coordinates, which is not necessarily identical to +`texelFetch`'s implementation-defined out-of-bounds behavior. Any edge-of-image +discrepancy for passes whose offsets can leave the image is unmeasured. + +**Building it.** `cargo build --release` inside `tools/shaderfx-bridge/`. +`ShaderFX` looks for the library, most specific first: the +`LIBRASHADER_BRIDGE_DLL` environment variable, the source directory, +`/tools/shaderfx-bridge/target/release/`, the save directory, and +finally the bare name handed to the system loader. Per-OS names are +`librashader_bridge.dll` (Windows), `liblibrashader_bridge.dylib` or +`librashader_bridge.dylib` (macOS), and `liblibrashader_bridge.so` or +`librashader_bridge.so` (Linux and Android). Android resolves the bare name +because the `.so` ships as an ordinary `jniLibs` entry, so `dlopen` finds it +without a path. The desktop path is still a developer build sitting in cargo's +output directory; nothing packages it next to a shipped game yet. +`ShaderFX.canConvert()` reports whether the library resolved on this machine, +and `ShaderFX.bridgeError()` says why not. Activating an already-converted +preset never needs any of this. + +### Fixup + +`ShaderFixup.lua` mechanically rewrites the emitted GLSL into something LOVE +will accept. librashader emits a standalone `void main()` /`gl_FragData[0]` / +`gl_Position` shape (translated Vulkan GLSL); LOVE requires the `effect()` and +`position()` convention and refuses a raw `main()`-shaped source outright. This +is a targeted rewriter, not a GLSL parser, and every rule below exists because a +real preset in the corpus failed without it. This list is the least guessable +part of the whole feature. + +**`#version` line.** Stripped; LOVE prepends its own. + +**Array constructors.** SPIR-V Cross emits ES 3.0 array-constructor syntax +(`const float _17[5] = float[](0.0, 1.0, ...)`) for compile-time array +literals, which validation rejects with "arrayed constructor: not supported for +this version". GLSL ES 1.00 has no array-constructor syntax at all. There are +three real shapes in the corpus and each is handled: a `const` global (declared +without an initializer at global scope, with per-element assignments relocated +to the top of `main()`), a non-const local declaration with initializer +(rewritten in place, since a function body can hold assignment statements where +the literal was), and a bare reassignment of an array declared elsewhere (also +in place). Splitting the element list needs `splitTopLevelCommas`, because a +naive comma split breaks on any element containing its own parentheses +(`vec2(-1.0, 0.0)`), and the outer capture needs `%b()` rather than a +`[^%)]-` class for the same reason: the class stops at the first inner `)`, the +whole match fails, and the literal passes through completely untouched. + +**Whole-array copies.** `float param_1[7] = coeffs;` is how SPIR-V Cross clones +a function-parameter array before passing it on, since GLSL array arguments are +by value. ES 1.00 has no whole-array assignment either, so it becomes a bare +declaration plus an element-by-element copy. The size is known from the +declaration, so no comma splitting is involved. This one only became reachable +once the other array shapes stopped masking it in the same file. + +**Integer modulo.** ES 1.00 has no `%` operator, and SPIR-V Cross emits it +anyway for an upstream integer-modulo op. `%` in GLSL is only defined for +integer operands, so routing through float `mod()` and back is exact for the +non-negative operands this shader family uses (rotation and orientation enum +indices). Four patterns are tried in order (paren/paren, paren/bare, +bare/paren, bare/bare) because SPIR-V Cross fully parenthesizes a compound +operand and leaves a simple one bare, and the balanced form must be tried +before a plain identifier can partially match. Seen live on +`authentic_gbc`'s subpixel-rotation math. + +**Precision.** SPIR-V Cross hardcodes an unguarded `precision highp float;` / +`precision highp int;` pair with no toggle. That is removed and replaced with +the same guard the old hand-written `DotMatrix` port used: claim `highp` only +where `GL_FRAGMENT_PRECISION_HIGH` says the driver actually offers fragment +highp, and fall through to the stage default otherwise. + +**Struct flattening.** This is the big one. LOVE's `Shader:send` cannot address +a member of a custom struct-typed uniform: neither an `INSTANCE.member` dot path +nor sending the whole struct as a table works, both raise "Shader uniform '...' +does not exist." librashader emits every pass's `#pragma parameter`s and size +uniforms as exactly that kind of struct, so as shipped the output is unusable +from LOVE, not merely inefficient. `flattenStruct` deletes the struct and its +instance uniform and re-declares the members at top level. Scalar members are +*packed* four at a time into synthetic `uniform vec4 LIBRA_PACKED_N;` slots, +because GLSL ES 1.00 guarantees only 16 fragment uniform *vectors* and every +scalar costs a whole one; `gb-pass4`'s pass 0 alone has 14 scalars, already over +budget unpacked. Non-scalar members keep their own uniform, since packing an +existing `vec4` saves nothing. Every `instance.member` reference is rewritten to +`LIBRA_PACKED_N.x` (or `.y`/`.z`/`.w`), and a member whose original declared +type was `int` or `bool` gets an explicit cast back on every read, since a +packed slot only stores floats. Vertex and fragment declare identically ordered +structs for the same parameters, so packing both with the same prefix assigns +the same slot and component to the same parameter in both stages, and one +`shader:send` reaches whichever stage uses it. + +Two ordering constraints inside that function are load bearing and look +arbitrary from the outside. Packing must walk the members in the struct's own +declaration order, because that order is what keeps the scalars in one +contiguous run; an earlier version sorted them longest-name-first before +packing and produced six packed vec4s instead of four on `gb-pass4`, blowing the +budget. Substitution, separately, must go longest-name-first, so a replacement +can never land as a substring inside a still-pending member name that shares a +prefix. The two orders are separate copies of the list for exactly that reason. + +`Fixup.packValues` turns a flat `{name = value}` table back into the +`{uniform = value_or_vec4}` shape the packed shader expects, per the manifest +`flattenStruct` returned. `Fixup.countUniformSlots` counts declared uniform +slots against that same 16-vector budget, samplers excluded. Its pattern uses +`[%w_]+` rather than `%w+` because Lua's `%w` does not include underscore +unlike regex `\w`, and every generated name here is full of underscores. + +**UBO blocks.** `LIBRA_UBO_FRAGMENT` and `LIBRA_UBO_VERTEX` have the identical +problem and are flattened the same way, under a distinct `LIBRA_UBO_PACKED_` +prefix so their groups cannot collide with the push block's numbering. `MVP` is +the one special member: it is substituted directly to `transform_projection` +instead of becoming a uniform, because "multiply the incoming vertex by it" is +exactly what LOVE's `transform_projection` already is on a full-screen draw, and +nothing would ever supply a value for it. An earlier version assumed the UBO +block only ever carried `MVP` and deleted the whole declaration after +substituting it. That is true only for presets that declare their parameters in +a push-constant block; presets that use a UBO instead (many real handheld and +console-border presets do) had every other member reference left dangling, and +the driver then read `INSTANCE.PAR` as a swizzle, which is where the "undeclared +identifier" and "unknown swizzle selection" errors on real Android hardware came +from. + +**Fragment entry point.** `void main()` becomes LOVE's `effect()` signature. +The parameter list is qualified by an `EFFECT_PREC` define rather than a literal +precision, because LOVE forward-declares `effect()`'s prototype under its own +header's precision default before this source runs, which can mismatch whatever +the precision guard above raises the default to. `Fixup.PREC_HEADS` holds the +two variants (`mediump`, then unqualified) and the caller tries them in order +against `validateShader`, taking the first that passes. + +**Fragment output.** `gl_FragData` does not exist in LOVE's `effect()` +convention, so every `gl_FragData[0]` occurrence is rewritten to a local +`gbFragColor`, declared at the top of the function, with a single `return` +appended before the closing brace. Rewriting *every* occurrence regardless of +the operator that follows is necessary, not just symmetric with the vertex side: +an earlier assign-then-return pair assumed one write at the very end of +`main()`, which holds for most presets but not for ones like `ds-hybrid-sabr` +that write once with `=` and later accumulate with `+=`. The `+=` statement +passed through unconverted and collided with LOVE's own `gl_FragColor` write +("Cannot use both gl_FragColor and gl_FragData"). A bare early `return;` is +rewritten to `return gbFragColor;`, which holds the value assigned just before +it on every real shape seen. + +**Vertex entry point.** `void main()` becomes `position(mat4 +transform_projection, vec4 vertex_position)`, the source's own `attribute` +redeclarations of `Position`/`TexCoord` are dropped since LOVE supplies them, +`gl_Position = X;` becomes `gbClipPos = X;` (named to share no substring with +`Position`, or the next step would mangle it), and a `return gbClipPos;` is +appended. The `Position` and `TexCoord` substitutions are frontier-matched +whole identifiers (`%f[%w]...%f[%W]`), not blind substring replacements: real +presets declare their own unrelated locals such as `vec2 vTexCoord;`, and a +blind `gsub` turned that declaration into the invalid `vec2 vVertexTexCoord.xy;` +(`dot.slangp` pass 0, a real driver "unexpected DOT" error). + +### Cache + +`ShaderFX.convert(entry)` is the only path that calls the bridge. It runs +`ShaderSourcePatches.apply` first, translates, then serializes the decoded +result to `ShaderFX.artifactPath(entry)`: the source `.slangp`'s own absolute +path with the extension swapped to `.lua`, so the artifact sits next to the +preset it came from. The file is a plain `return { ... }` chunk written by +`serializeLua`, which handles the string/number/boolean/nested-table shape +`Json.decode` produces. Array detection walks every key rather than trusting +`#t`, since `#t` counts a trailing nil as absent and a sparse table can pass a +naive length check by accident. + +`ShaderFX.load(entry)` `loadfile`s that chunk and builds a chain state. On +failure it says "convert this preset first" rather than falling back to a live +translation. + +**AOT rather than JIT** is the whole point of this stage. Translation is a rare, +explicit, user-initiated action whose result is stable for a given preset and +dialect, so paying for it once and writing the answer to disk keeps `ffi.load` +and the native call off every activation, every boot and every frame. The cost +is a staleness gap: `ShaderFX.isConverted()` is a plain "does the artifact file +exist" check with no version or content stamp, and there is no explicit +"reconvert" action in the UI. A preset converted by an older build never picks +up a later translator fix on its own. This was seen on a real device, where +`sunlight_shimmer.slangp`'s `Accelerometer` uniform never reached the shader +because that device's cache predated the fix while `pixel_transparency`'s +happened to be fresher. Two places compensate by reconverting unconditionally: +`ShaderFXScreen`'s explicit selection of an already-converted row, and +`ShaderFX.applyOptions` on every boot and options save. Both are human-paced, +CPU-only work with no GPU compile, and neither is on the per-frame path. + +`ShaderSourcePatches.lua` sits just before translation and patches the raw +`.slang`/`.inc` files *on disk*, because only librashader's own preset parser, +reading the real files, discovers `#pragma parameter` lines and struct members; +nothing downstream can add one. Patches are small, explicit, per-preset literal +find/replace pairs (plain `find`, not `gsub`, since GLSL source is full of Lua +pattern magic), re-applied idempotently on every convert so a buildbot +re-download that replaces the upstream file wholesale does not quietly undo +them. **The patch table ships empty on purpose and nothing registers one.** Its +original use case, wiring gyroscope yaw into `sunlight_shimmer.slangp` as new +`PT_YAW_*` pragma parameters, was reverted precisely because of the staleness +gap above: a new pragma can only reach an artifact that gets reconverted, and at +the time nothing forced one. The mechanism is kept for a future preset that +genuinely needs a new declaration, but an already-wired engine-side channel is +preferred whenever one exists. + +### Run: the pass graph + +`ShaderFX.activate(slot, entry, paramOverrides)` loads the artifact, layers the +player's edited parameters over the artifact's own defaults, loads the preset's +LUTs once, and snapshots the accelerometer rest pose. `ShaderFX.render` then +runs the chain each frame. + +`newChainState` builds one instance of chain-local state per loaded preset, +never module-global, so switching presets cannot leak a previous preset's +canvases or dimensions. `ALL_DEFAULTS` is built in layers: each pass's declared +`initial`, then the preset's own `parameter_overrides`, then (in `activate`) the +player's `shaderfxParams` edits. + +Sizes resolve through `resolveScale`, which handles all four slang scale types +(`absolute`, `viewport`, `source`, `original`) against the viewport, the pass's +input dimensions and the original frame. Size uniforms are packed as +`{w, h, 1/w, 1/h}`, the slang convention. + +`runPass` caches two things per `(state, pass index)`. The **shader** is +compiled once for the state's lifetime, along with the fragment manifest it was +compiled against, since a pass's GLSL depends only on the preset and never on +per-frame input. The **canvas** is reallocated only when the pass's resolved +size actually changes, a window resize or a different preset. Every harness this +runtime was ported from ran the chain once and quit, so allocating a fresh +canvas and compiling a fresh shader on every call was invisible there. On a real +per-frame render path it is one GPU allocation per pass per frame, and a shader +recompile on top. The same discipline applies to the crop canvas in +`cropToGbSource`, which is called once per frame and whose size grows with the +world canvas as the player zooms out; leaving it uncached was a real cost that +scaled with zoom level even with a single preset active. + +Sampler binding is by semantic, from the bridge's classification, never by a +hardcoded per-preset name check: `Source` is the previous pass's output (or the +input frame for pass 0), `Original` and `OriginalHistory` are the input frame, +`PassOutput` indexes an earlier pass's canvas, and `User` resolves a LUT by the +real name the translation reported. A sampler that resolves to nothing asserts +rather than drawing garbage. + +**LUTs** are loaded once per `activate`. `ShaderFX.loadImageFromPath` reads the +bytes with plain `io.open` and goes through `love.data.newByteData` and +`love.image.newImageData`, because a preset's texture paths are arbitrary +absolute OS paths outside any LOVE mount and `love.graphics.newImage` refuses +those outright ("Could not open file ... Does not exist") even when the file is +real. Wrap modes are mapped from librashader's names to LOVE's +(`clamp_to_border` to `clampzero`, `clamp_to_edge` to `clamp`, `repeat`, +`mirrored_repeat` to `mirroredrepeat`). A LUT that fails to load is logged and +left nil; the fail-loud point is the sampler assertion in `runPass` that +actually needed it, not the loader. + +**History ring.** `OriginalHistoryN` currently resolves to a steady state: every +history slot reads the current frame, both for the sampler binding and for the +size uniform. Real per-frame history rotation has been proven out in a desktop +harness but is not wired into this path. + +**Feedback.** `PassFeedback` is not implemented. A `PassFeedback` or `User` size +uniform raises an explicit "not yet supported" error, and a `PassFeedback` +sampler resolves to nothing and trips the binding assertion. No preset in the +shipped shortlist uses it. + +**Blending.** Every pass draws with `replace`, and the chain's final pass uses +`replace, premultiplied`. Intermediate canvases are `nearest` filtered. + +`ShaderFX.render(canvas, rect, source, dpiX, dpiY)` is the entry point +`Renderer:endFrame` and `Game2` call. `canvas` is the finished window-sized +composite (world, UI, and any post-process pipeline that already ran); `rect` is +this frame's real playfield rectangle in physical framebuffer pixels and +`source` is the real pixel size of the content it frames. The sequence is: crop +`rect` out of the composite, run whichever slots are active over that crop, draw +the untouched composite, then stretch the chain output back over `rect`. UI and +letterbox bars outside the playfield pass through untouched. If the chain throws, +the frame still shows the unprocessed composite; a broken preset degrades to +"shader off", never to a crash or a blank frame. + +Three details in that path are non-obvious: + +- **DPI.** `love.graphics.newCanvas` and `draw` work in LOVE's DPI-aware + logical units, not raw pixels, so the viewport handed to the pass graph and + the final draw-back position are both converted from `rect`'s physical pixels + first. On a `dpiscale = 1` desktop the two are numerically identical and the + bug is invisible; at dpiscale 3 on real Android hardware the chain output + rendered about three times too large and at a pixel-valued offset in unit + space. +- **Draw color.** `cropToGbSource` sets `setColor(1, 1, 1, 1)` explicitly. The + caller can leave the draw color dirty (a menu's black text leaves it at + `(0,0,0,x)`), the crop draw multiplies the canvas texels by the active color, + and `push("all")` saves state for `pop()` without resetting it. That was the + root cause of the Gen 2 blank-menu bug, confirmed on a desktop repro where + `getColor()` read `0,0,0,1` here exactly when a menu was on the stack. + `flushBatch()` on the line above is cheap insurance against a read-after-write + ordering hazard between this draw and whatever last rendered into the canvas; + it was never confirmed to fix anything on its own. +- **The final blit stretches.** A slang chain's last pass is not required to + land on the viewport size, and most presets (21 of the 78 in the corpus) + declare their last pass `scale_type = "source"` and stay at native Game Boy + resolution, relying on the frontend's blit exactly as RetroArch does. + Requiring an exact size match here used to skip the draw outright for every + such preset on every frame, which is a silent total no-op rather than a sizing + quirk. The stretch uses the last-run chain's own final-pass `filter` to pick + nearest or linear. + +### What this engine feeds shaders that a libretro core does not + +A stock libretro core hands its frontend a raw framebuffer and a frame count. +This engine has more context available and passes some of it through. + +| Context | How it reaches the shader | +| --- | --- | +| Playfield rect and true source size | `rect`/`source` per frame from `Renderer:endFrame` or `Game2`, so the chain sees real on-screen geometry at any survey zoom or Faithful Ratio state rather than a fixed 160x144 assumption that then gets stretched | +| Blit scale | `rect.scale`, the crisp integer scale the composite was built at, used to derive the crop's own draw scale | +| SGB zone coloring and palette | Baked into the input frame. `PaletteFX` zone passes run before the composite reaches ShaderFX, so a preset shades an already-zone-tinted image | +| Performance tier | `chainRenderScale()` reads `Performance.CAPS[tier].shaderfx`, a chain-resolution multiplier; the viewport and the cropped source both shrink by it and the final blit upscales | +| Accelerometer | `Sensors.read("accelerometer")`, bound to the `Accelerometer` unique semantic | +| Gyroscope | `Sensors.read("gyroscope")`, bound to `Gyroscope`, plus the integrated yaw twist below | + +Two motion semantics are deliberately pinned rather than guessed. `Rotation` is +bound to 0 because librashader's own documentation is explicit that it is +`retroarch_get_rotation()`, the *content's* requested rotation (a vertically +oriented arcade core, say), not device orientation. Nothing here ever rotates +Game Boy content, so 0 is the correct answer, not a placeholder. +`AccelerometerRest` is bound to `{0, 0, 0}`: it is librashader's "reading at +rest" calibration reference, no preset in the corpus reads it, and a fixed +placeholder beats an invented value. + +`src/core/Sensors.lua` is what makes the two real motion semantics work. +`love.sensor` does not exist in LOVE 11.5, the version this project ships, on +any platform including Android; it is a LOVE 12 addition. The working path is +raw FFI into the SDL2 that LOVE already links, the same technique +`src/core/Orientation.lua` uses, opening the first `SDL_SENSOR_ACCEL` or +`SDL_SENSOR_GYRO` device via `SDL_NumSensors`/`SDL_SensorGetDeviceType`/ +`SDL_SensorOpen`. The `love.sensor` path is kept above it and simply stops being +dead code after a future LOVE 12 upgrade. Loading order matters: +`ffi.load("SDL2")` first, needed on desktop where SDL2 is a separate DLL, then +bare `ffi.C`, needed on Android where love-android links SDL2 statically into +`libmain.so` and there is no `libSDL2.so` for `ffi.load` to find by name. A +device with no sensor is probed once and then permanently reports zeros, so a +desktop run does not pay for it every frame. + +SDL keeps sensor readings in the device's fixed chassis frame regardless of +screen orientation, so `rotateForScreen` remaps x and y into +"as currently displayed" terms using `SDL_GetDisplayOrientation`. That +compensation is mobile-only: a desktop monitor is legitimately and permanently +"landscape" to that query, which says something about the monitor's shape and +nothing about how a player is holding anything. + +The accelerometer path in `sizeTable` does three things to the raw reading +before it becomes a uniform, all of them driven by real on-device data: + +1. **Rest-pose subtraction.** `activate()` snapshots whatever pose the player is + actually holding the device in and every later reading is measured relative + to that, rather than to an assumed idealized vertical. The shipped tilt maths + (`pt_base.inc`'s `getOrientedTilt`) was authored assuming gravity sits almost + entirely on one axis at rest; a natural, comfortable hold already puts 56 to + 66 percent of gravity's magnitude on the axis the shader reads as tilt, so + the effect sat near-saturated all the time instead of starting near neutral. +2. **Axis swap.** The tilt maths assumes a device resting flat, with gravity + dominant on Z, the one axis it never reads. This engine's rest pose is + upright portrait, where Y is gravity-dominant, so y and z are swapped to put + gravity back on the ignored axis. +3. **Denominator stabilization.** `getOrientedTilt` normalizes by the full + vector's magnitude. Before calibration that magnitude was a stable ~9.8 that + quietly damped tilt and noise alike by the same factor; calibration correctly + zeroes x and y at neutral but also shrinks the magnitude near rest, and real + logs showed it swinging between 0.65 and 11.4 second to second on ordinary + hand jitter, which reads as wildly bouncing. A fixed constant is re-injected + on the ignored axis to keep the denominator stable, but only when there is a + genuine live reading to calibrate against. An all-zero raw read is + `Sensors.lua`'s explicit "no hardware at all" sentinel, never a real value on + Earth, and injecting into that case would make the shader believe it had + sensor data and silently replace its own static fallback with fake motion. + +Yaw is a separate mechanism. A raw gyroscope reading is angular velocity, not an +angle, so it only becomes a usable on-screen offset by integrating over time, +and only the per-slot state persists frame to frame to do that. `updateYawTwist` +is deliberately a decaying spring rather than a true integrated heading: +gyro-only integration drifts without a magnetometer to correct it, so this +settles back toward neutral and stays bounded by construction. It is folded onto +the accelerometer's x component before the shader's own normalize and clamp, +because that is the only already-compiled channel the stock upstream maths +reads, and reaching an already-converted artifact with no reconvert was worth +the tradeoff that the twist reads as an added simulated tilt rather than a +cleanly separate motion. It applies to `sunlight_shimmer.slangp` only, the one +preset in the shortlist with a twist-reactive channel. `YAW_GAIN = 0.6` and a +clamp of +/-2 were tuned against real device data (a moderate real yaw turn +peaks around 1.5 to 1.7 rad/s); a much larger gain was tried on-device and +looked worse, because overshooting a comfortable range reads worse than being +subtle. Retune in small steps with real device checks, not big jumps. + +## Two slots + +`ShaderFX.SLOTS` is `{"main", "secondary"}` and `ShaderFX.OPTION_KEY` maps each +to its save key. The slots are activated and persisted independently, and the +same `ShaderFXScreen` serves both, opened with the slot as its argument. Pragma +parameter edits are keyed by *preset name*, not by slot, because a preset's +values are a property of the preset the same way its cached artifact is; +editing them re-activates every slot currently showing that preset and persists +for the next load in either. + +When both slots are active, `render` runs main's chain first and hands its +finished output to secondary as secondary's own input frame, along with its +dimensions, so a secondary preset that scales off its input sees main's real +output size rather than the original crop. Either slot alone behaves exactly as +a single-preset path; neither active is a plain passthrough. + +**This is not how RetroArch composes multiple presets.** RetroArch merges +presets into a *single* pass list through `#reference` and `Append`, producing +one pass graph with one shared semantics map, where a later pass can reference +an earlier one's output by alias and the whole thing resolves as one unit. Two +slots here are two independent librashader chains run back to back, which is +what stacking two separate preset chains would give you, not what merging them +gives you. Presets that assume merged semantics will not behave the same way. + +## Test seams + +`ShaderFX` exposes a few fields purely so a headless harness can assert on real +per-frame values without taking a screenshot: `_lastRect` and `_lastSource` +(the rect and source dimensions a caller handed in), `_lastCrop` (the exact crop +canvas, which the later unconditional draw-back would otherwise mask), +`_lastYawTwist` and `_lastAccelPacked` (the integrated twist and the values that +actually reached the packed uniform, per slot). `Sensors.setOverride`, +`Sensors.clearOverride` and `Sensors.setOrientationOverride` inject synthetic +readings on a machine with no hardware. + +## Limitations + +None of these are theoretical. + +- **Tested on very little real hardware.** Essentially one Android phone, one + desktop, and the automated harnesses. Anything about how a preset actually + looks or performs elsewhere is unverified. +- **No performance tier is actually tuned.** The chain-resolution multiplier in + `Performance.CAPS` is a working mechanism, but every tier that permits + ShaderFX at all sets it to 1.0. Nothing runs at reduced chain resolution + today. Picking a real value for weak hardware needs a device this project does + not have. +- **The dual-slot design does not match RetroArch.** See above. Two chains in + sequence is not one merged pass list. +- **`OriginalHistoryN` is a steady state.** Real per-frame history rotation + falls back to "every slot is the current frame" in the live render path, and + is unverified there. +- **`PassFeedback` is unimplemented.** Its size uniform raises an explicit + error and its sampler trips an assertion. +- **`ShaderFXScreen` has a known text-overlap bug on long preset names.** + `ListMenu`'s `fitLabel` truncation covers the ordinary case, but a long enough + player-supplied filename still collides with the row's right-hand hint. +- **`ShaderSourcePatches` ships with an empty patch table and nothing uses it.** + Intentional, for the reason given above, but it means the mechanism has no + live coverage. +- **Cached artifacts have no staleness detection.** Existence is the only check. + The two unconditional reconvert points paper over it; anything that does not + go through them can be running a stale translation. +- **Artifacts are per-device.** The GLSL dialect is baked in at convert time. + Copying a converted preset folder between a phone and a desktop copies a + wrong artifact along with it. +- **The bundled bridge is only as good as the build machine.** + `scripts/build.sh` bundles the cdylib for mac, win and linux via + `bundle_shader_bridge`, building it with cargo when a prebuilt one is not + supplied through `SHADERFX_BRIDGE`. A build host without cargo produces a + package that can run converted presets but cannot CONVERT new ones, and says + so rather than failing. Android ships the `.so` via `jniLibs`. +- **The buildbot shortlist is a temporary trim.** `KEPT_PRESETS` reflects one + manual pass over `handheld/` and is expected to change, most likely to shrink. +- **Tilt direction is unverified.** Which way forward and back rocking moves the + effect was never confirmed on a device; if it feels backwards the fix is a + sign flip on the swapped axis, not a deeper bug. Likewise, whether the + landscape rotation compensation matches real RetroArch is genuinely unknown: + RetroArch's Android input driver computes a screen rotation but does not + visibly apply it to the accelerometer values that reach shader uniforms, so + this project's compensation may be an improvement over upstream rather than a + match to it. +- **`texelFetch` wrap behavior at image edges may differ.** The ES 1.00 rewrite + in the bridge turns those calls into `texture()`, which honours the sampler's + wrap mode out of range where `texelFetch`'s out-of-bounds behavior is + implementation defined. Unmeasured. diff --git a/docs/switch-install.md b/docs/switch-install.md index a9ad0ade..282d5cc3 100644 --- a/docs/switch-install.md +++ b/docs/switch-install.md @@ -183,7 +183,6 @@ hotkeys (`2`/`3`/`5` are claimed before any mod pipeline hotkey runs). | ----- | -------------- | ------------------- | | Select + **A** | `2` | COLORS | | Select + **B** | `3` | TILT | -| Select + **Y** | `5` | GBC FX | | Select + **X** | `6` | Mod pipeline hotkey (if a mod registers `6`) | | Select + **L** | `7` | Mod pipeline hotkey (if a mod registers `7`) | diff --git a/main.lua b/main.lua index ee5b41f8..8880c075 100644 --- a/main.lua +++ b/main.lua @@ -374,6 +374,11 @@ local function returnToLauncher() Game = nil autopilot = nil driverCo = nil + -- Leave the cart's scope behind: the launcher's own settings and slots are + -- the base game's, not the cart's. The speed ladder is cart state too, so + -- a 1x/2x cart must not pin the launcher or the next game. + require("src.core.SaveData").setCart(nil) + require("src.core.GameSpeed").setAllowed(nil) local Input = require("src.core.Input") local TouchControls = require("src.core.TouchControls") @@ -407,15 +412,24 @@ function bootGame(version, cartId) -- (Blue/Yellow/Gold caches live under blue/ / yellow/ / gold/). CacheFs.prefix = GameVersion.cachePrefix() CacheFs.mountVersion(GameVersion.get()) - local cartHash + local cartHash, cartSpeeds, cartOptions if cartId then local ok, cart, hash = pcall(function() return require("src.carts.CartStore").get(cartId) end) - if ok and cart then cartHash = hash else cartId = nil end + if ok and cart then + cartHash, cartSpeeds, cartOptions = hash, cart.speeds, cart.options + else + cartId = nil + end end local SaveData = require("src.core.SaveData") SaveData.setCart(cartId, cartHash) + -- The author's settings land in the cart's own scope the first time only; + -- after that the player owns them. + if cartOptions then SaveData.seedCartOptions(cartOptions) end + -- A cart may narrow or pin the speed ladder; nil restores the full one. + require("src.core.GameSpeed").setAllowed(cartSpeeds) if cartId then SaveData.adoptCartSeal(cartId) end -- NX: always write nx-asset-probe.log so Yellow/Blue art failures are -- diagnosable from the SD without enabling switch-debug.txt. diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index 2c7d8798..6c8010de 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -30,6 +30,10 @@ + + /dev/null 2>&1; then + say "building the ShaderFX bridge with cargo" + if (cd "$crate" && cargo build --release >/dev/null 2>&1); then + src="$crate/target/release/$name" + fi + fi + if [ -n "$src" ] && [ -f "$src" ]; then + mkdir -p "$dest" + cp "$src" "$dest/$name" + say "bundled $name for SHADER FX preset conversion" + else + warn "$name not found: this build can run converted presets but not CONVERT new ones (set SHADERFX_BRIDGE or install cargo)" + fi +} + build_mac() { say "building macOS app" local love_app="${LOVE_APP:-/Applications/love.app}" @@ -180,6 +205,7 @@ build_mac() { # drop any bundled placeholder .love and fuse ours in find "$out_app/Contents/Resources" -maxdepth 1 -name '*.love' -delete cp "$LOVE_FILE" "$out_app/Contents/Resources/game.love" + bundle_shader_bridge "$out_app/Contents/MacOS" "liblibrashader_bridge.dylib" local plist="$out_app/Contents/Info.plist" /usr/libexec/PlistBuddy -c "Set :CFBundleName $APP_NAME" "$plist" 2>/dev/null \ @@ -293,9 +319,11 @@ build_win() { cp "$tls_dll" "$out_dir/gen1tls.dll" say "bundled gen1tls.dll for Windows TLS (wss://)" else - warn "gen1tls.dll not found — Windows zip will not support wss:// (set GEN1TLS_DLL or build native/tls_dial)" + warn "gen1tls.dll not found: Windows zip will not support wss:// (set GEN1TLS_DLL or build native/tls_dial)" fi + bundle_shader_bridge "$out_dir" "librashader_bridge.dll" + # The exe's icon lives in love.exe's PE resources, so it must be patched # BEFORE the .love is appended: peresed rewrites the whole file and would # drop the fused bytes. peresed (pipx install pe_tools) has no .ico input, @@ -391,6 +419,7 @@ build_linux() { unsquashfs -q -no-xattrs -o "$sfs_offset" -d "$appdir" "$love_appimage" >/dev/null cp "$LOVE_FILE" "$appdir/game.love" + bundle_shader_bridge "$appdir" "liblibrashader_bridge.so" # Replace LÖVE's own desktop entry rather than keeping it: it says # Name=LÖVE / Icon=love, which is what appimaged, app menus and file diff --git a/scripts/build_android.sh b/scripts/build_android.sh index 4389548f..7451e87a 100755 --- a/scripts/build_android.sh +++ b/scripts/build_android.sh @@ -2,11 +2,22 @@ # Packages the LÖVE2D Pokémon Red port into an Android APK via love-android 11.5a. # # Usage: scripts/build_android.sh [--version X.Y.Z] [--release] [--package-only] +# [--test-application-id ID] # -# --version X.Y.Z set app.version_name / app.version_code (else left as-is) -# --release build the production-signed release APK (requires the -# GEN1RECOMP_ANDROID_* signing environment variables) -# --package-only zip game.love + apply branding; skip gradle +# --version X.Y.Z set app.version_name / app.version_code (else left as-is) +# --release build the production-signed release APK (requires the +# GEN1RECOMP_ANDROID_* signing environment variables) +# --package-only zip game.love + apply branding; skip gradle +# --test-application-id ID install under a distinct application id (e.g. +# com.theboisclub.pokemonred.shaderfxtest) so a +# test build installs side by side with a real +# played copy instead of overwriting it. App name +# gets a " (test)" suffix so it's distinguishable +# in the launcher too. Without this flag, +# apply_android_branding always writes back the +# real shipping identity, which previously had to +# be restored by hand in gradle.properties after +# every test build. # # Prerequisites: # - mobile/android vendored love-android tree at tag 11.5a (in-repo; see mobile/ANDROID.md) @@ -40,6 +51,7 @@ CRYSTAL_MANIFEST_URL="${CRYSTAL_MANIFEST_URL:-https://raw.githubusercontent.com/ VERSION="" PACKAGE_ONLY=false RELEASE=false +TEST_APPLICATION_ID="" say() { printf '\033[1;32m==>\033[0m %s\n' "$*"; } warn() { printf '\033[1;33mwarn:\033[0m %s\n' "$*" >&2; } @@ -50,11 +62,12 @@ while [ $# -gt 0 ]; do --version) VERSION="$2"; shift ;; --package-only) PACKAGE_ONLY=true ;; --release) RELEASE=true ;; + --test-application-id) TEST_APPLICATION_ID="$2"; shift ;; -h|--help) - sed -n '2,20p' "$0" + sed -n '2,28p' "$0" exit 0 ;; - *) fail "unknown argument: $1 (try --version X.Y.Z, --release, or --package-only)" ;; + *) fail "unknown argument: $1 (try --version X.Y.Z, --release, --package-only, or --test-application-id ID)" ;; esac shift done @@ -86,6 +99,14 @@ if $RELEASE; then || fail "Android signing keystore does not exist: $GEN1RECOMP_ANDROID_KEYSTORE" fi +if [ -n "$TEST_APPLICATION_ID" ]; then + if ! printf '%s' "$TEST_APPLICATION_ID" | grep -Eq '^[A-Za-z][A-Za-z0-9_]*(\.[A-Za-z][A-Za-z0-9_]*)+$'; then + fail "invalid --test-application-id '$TEST_APPLICATION_ID' (expected a dotted package id, e.g. com.theboisclub.pokemonred.shaderfxtest)" + fi + APPLICATION_ID="$TEST_APPLICATION_ID" + APP_NAME="$APP_NAME (test)" +fi + # --------------------------------------------------------------- preconditions if [ ! -f "$ANDROID_DIR/settings.gradle" ] || [ ! -f "$ANDROID_DIR/gradlew" ]; then fail "love-android not found at mobile/android/. diff --git a/src/battle/AnimPlayer.lua b/src/battle/AnimPlayer.lua index ef2b9b00..7f305432 100644 --- a/src/battle/AnimPlayer.lua +++ b/src/battle/AnimPlayer.lua @@ -348,6 +348,12 @@ local EMITTERS = { SE_PETALS_FALLING = function() return fallingObjectSteps(20, PETAL_TILE, "e4") end, } +-- home/copy2.asm:62 CopyVideoData -- 8 tiles a frame plus the tail frame +local function tilesetLoadFrames(data, ts) + local sheet = data and data.tilesheets and data.tilesheets[ts or 0] + return math.floor((sheet and sheet.tiles or 79) / 8) + 1 +end + -- One OAM entry for tile `t` of a frame block anchored at base coord `bc`, -- with the subanimation transform applied (DrawFrameBlock). local function placeTile(transform, bc, t, tileset) @@ -456,6 +462,11 @@ function AnimPlayer:start(moveId, attackerIsPlayer, opts) local obp0Flip = false for _, row in ipairs(anim.seq) do + -- engine/battle/animations.asm:252 LoadMoveAnimationTiles, before the + -- row's sound and its first frame block (#1653) + if not row.effect then + emit(tilesetLoadFrames(self.data, row.tileset)) + end -- PlayAnimation/PlaySubanimation: each row's sound byte is a move id -- whose MoveSoundTable entry (sfx + pitch/tempo modifiers) plays as -- the row starts (GetMoveSound) diff --git a/src/battle/BattleState.lua b/src/battle/BattleState.lua index bae8aaa7..b47abf01 100644 --- a/src/battle/BattleState.lua +++ b/src/battle/BattleState.lua @@ -638,6 +638,9 @@ local function newBattle(game) -- wPartyAndBillsPCSavedMenuItem, so entering a battle drops the party -- cursor the field menu has been carrying (src/ui/PartyMenu.lua). #768 game.partyMenuSavedIndex = nil + -- the same run covers wBagSavedMenuItem, and wListScrollOffset follows it + -- (init_battle_variables.asm:7-12) #1732 + game.bagSavedMenuItem, game.bagListScrollOffset = nil, nil self.data = game.data -- ruleset from the merged registry (the requires above are the same -- records on a mod-free boot); an unknown save value falls back to the @@ -1918,6 +1921,8 @@ function BattleState:exit() -- end_of_battle.asm clears wPartyAndBillsPCSavedMenuItem as well, so the -- field party menu comes back on slot 1 after a battle. #768 self.game.partyMenuSavedIndex = nil + -- and wBagSavedMenuItem / wListScrollOffset (end_of_battle.asm:57-62) #1732 + self.game.bagSavedMenuItem, self.game.bagListScrollOffset = nil, nil -- Free this battle's own GPU objects now rather than waiting on a GC -- finalizer: the two full-screen wavy-effect canvases (colorMode) and -- the AnimPlayer's per-instance tilesheet images/quads. The shared @@ -1942,6 +1947,7 @@ local function clearTrapping(battler) battler.trappingTurns = nil battler.trapMove = nil battler.trapDamage = nil + battler.trapHitSfx = nil end -- SendOutMon (core.asm:1733-1735) clears both battle cursors, though the @@ -4070,12 +4076,15 @@ function BattleState:continueTrapping(user, target) -- .MultiturnMoveCheck (core.asm:3554-3566) prints AttackContinuesText -- then jumps to GetPlayerAnimationType, so the trapping move's full -- animation replays each locked turn (same damage, animation shown). - -- Mirror performMove's anim row (BattleState.lua ~1307), gated on the - -- OPTIONS animation toggle. - if user.trapMove and self:animationsOn() then + -- Mirror performMove's anim row (BattleState.lua ~1307), with the + -- applying-attack shake GetPlayerAnimationType picks (core.asm:3159 / + -- :5555 -- a trapping move's effect is nonzero, so type 5 / 2) (#1653). + if user.trapMove then self.nextInsert = (self.nextInsert or 0) + 1 table.insert(self.queue, self.nextInsert, - { anim = user.trapMove, attackerIsPlayer = user.isPlayer }) + { anim = user.trapMove, attackerIsPlayer = user.isPlayer, + hit = { animType = user.isPlayer and 5 or 2, + sfx = user.trapHitSfx } }) end -- the counter can sit at 0 until the END of the turn: the trapping -- bit is only cleared by CheckNumAttacksLeft (core.asm:439/467) @@ -4250,7 +4259,7 @@ function BattleState:awardExp() local levels, gained = Experience.apply(self.data, mon, self.enemy.def, self.enemy.mon.level, self.kind == "trainer", split, traded) - -- Track level-ups for EvolveAfterBattle (OverworldState:afterBattle -> + -- Track level-ups for EvolveAfterBattle (BattleState:finish -> -- Evolution.checkParty). B-cancel leaves the mon at/above threshold; -- without this gate it re-triggers after every later fight (#213). if #levels > 0 then @@ -4627,6 +4636,14 @@ function BattleState:playerMonFainted() -- Exception: the Oak's Lab starter rival (HandlePlayerBlackOut). if not nextMon and self.result ~= "lose" then if self.oppClass == "OPP_RIVAL1" then + -- HandlePlayerBlackOut (core.asm:1139-1146): ClearScreenArea, the pic + -- scroll-in and DelayFrames 40 all run before Rival1WinText (#1721) + self:actNext(function() + self.showEnemyTrainer = self.trainerPic ~= nil + if self.showEnemyTrainer then self:slidePic("foe", 64, 16, 2) end + end) + self.nextInsert = (self.nextInsert or 0) + 1 + table.insert(self.queue, self.nextInsert, { wait = 64 }) local TextBox = require("src.render.TextBox") local raw = (self.data.text and self.data.text._Rival1WinText) or Strings("{RIVAL}: Yeah! Am\nI great or what?") @@ -5216,6 +5233,14 @@ function BattleState:finish() self.phase = "messages" return end + -- EndOfBattle runs EvolutionAfterBattle on the battle screen, before the + -- GBPalWhiteOut back to the map (end_of_battle.asm:42-45) (#1656, #213) + if not self.evolutionsChecked then + self.evolutionsChecked = true + require("src.pokemon.Evolution").checkParty(self.game, + function() self:finish() end, self.leveledUp) + return + end -- Invariant: a battle can never hand the overworld a party with nothing -- healthy in it -- except the Oak's Lab starter rival, where pret skips -- the blackout and OaksLabRivalEndBattleScript HealParty's immediately. @@ -5256,6 +5281,13 @@ function BattleState:finish() local result = self.result or "run" local onFinish = self.onFinish if result == "lose" then + -- .battleOccurred skips the faint check in OAKS_LAB and re-enters the map + -- through MapEntryAfterBattle (home/overworld.asm:343-352) (#1721) + if BattleState.isOaksLabStarterRival(self) then + self.game.stack:push(require("src.render.Transition").battleReturn( + self.game, function() if onFinish then onFinish(result) end end)) + return + end -- the blackout path warps to the heal point with its own transition if onFinish then onFinish(result) end return @@ -6120,8 +6152,10 @@ function BattleState:drawHUDs(slide) self:drawBallRow(self:playerPartyView(), 88, 80, 8) end local hidePlayer = self.safari or self.demo + -- RemoveFaintedPlayerMon clears the player HUD (core.asm:1024-1026) and + -- nothing redraws it until the next SendOutMon (#1721) if showStatus and self.player and not hidePlayer and not self.showPlayerBack - and slide == 0 then + and slide == 0 and not self.player.fainted then -- player HUD (DrawPlayerHUDAndHPBar): name (10,7), +level -- (14,8), HP bar (10,9), HP numbers row 10, underline row 11 with -- the tick at (18,10) and the triangle at (9,11) diff --git a/src/battle/EffectRegistry.lua b/src/battle/EffectRegistry.lua index 525a6c58..999a6637 100644 --- a/src/battle/EffectRegistry.lua +++ b/src/battle/EffectRegistry.lua @@ -260,6 +260,7 @@ function EffectRegistry.runDamaging(battle, ctx, record) local totalDealt = 0 local landed, brokeSub = 0, false + local critPending, ohkoPending = info.crit, info.ohko for h = 1, hits do if target.mon.hp <= 0 then break end local hitRow @@ -280,12 +281,16 @@ function EffectRegistry.runDamaging(battle, ctx, record) totalDealt = totalDealt + dealt landed = h if dealt > 0 then hitRow.hit = hitFx end - -- PrintCriticalOHKOText + DisplayEffectiveness run inside the - -- multi-hit loop (core.asm .moveDidNotMiss before the jump back - -- to GetPlayerAnimationType), so crit/effectiveness reprint on - -- every strike -- damage was only rolled once - if info.crit then battle:sayNext(romText(battle.data, "_CriticalHitText", "Critical hit!")) end - if info.ohko then battle:sayNext(romText(battle.data, "_OHKOText", "One-hit KO!")) end + -- PrintCriticalOHKOText zeroes wCriticalHitOrOHKO after printing + -- (core.asm:3809-3811); DisplayEffectiveness re-reads its own flag (#1720) + if critPending then + battle:sayNext(romText(battle.data, "_CriticalHitText", "Critical hit!")) + critPending = false + end + if ohkoPending then + battle:sayNext(romText(battle.data, "_OHKOText", "One-hit KO!")) + ohkoPending = false + end -- PrintCriticalOHKOText closes with `ld c, 20 / jp DelayFrames` at its -- .done label (core.asm:3812-3814) -- and the no-crit path jumps to that -- same label (:3799), so this hold is paid on EVERY landed hit, not just @@ -323,6 +328,7 @@ function EffectRegistry.runDamaging(battle, ctx, record) -- post-damage effect bookkeeping (recoil/drain/trap/thrash/...) ctx.rawDamage, ctx.totalDealt = dmg, totalDealt ctx.brokeSub, ctx.hits = brokeSub, hits + ctx.hitSfx = hitSfx if record and record.afterDamage then record.afterDamage(ctx, totalDealt) elseif moveInst.struggle then diff --git a/src/battle/MoveEffects.lua b/src/battle/MoveEffects.lua index 2dfdc191..39d96387 100644 --- a/src/battle/MoveEffects.lua +++ b/src/battle/MoveEffects.lua @@ -574,6 +574,8 @@ MoveEffects.full = { local r = ctx.rng(0, 7) user.trappingTurns = ({ 1, 1, 1, 2, 2, 2, 3, 4 })[r + 1] user.trapDamage = ctx.rawDamage + -- PlayApplyingAttackSound (animations.asm:2639) replays it each turn + user.trapHitSfx = ctx.hitSfx -- remember the move so its animation can replay on each locked -- continuation (core.asm:3554-3566 -> GetPlayerAnimationType) user.trapMove = ctx.move.id diff --git a/src/battle/WideBattle.lua b/src/battle/WideBattle.lua index 75df4b6f..ad459574 100644 --- a/src/battle/WideBattle.lua +++ b/src/battle/WideBattle.lua @@ -161,8 +161,10 @@ local function drawHUDs(battle, slide) -- item, not a HUD element (DisplayBattleMenu prints wNumSafariBalls inside -- the battle menu box, engine/battle/core.asm:2074-2079), so it rides in -- drawCommandMenu below like the classic layout's (#540). + -- RemoveFaintedPlayerMon clears the player HUD (core.asm:1024-1026) (#1721) if showStatus and not battle.safari and battle.player and not battle.demo - and not battle.showPlayerBack and slide == 0 then + and not battle.showPlayerBack and slide == 0 + and not battle.player.fainted then drawStatusPanel(battle, battle.player, 184, 56, true) end end diff --git a/src/battle/gen2/Battle.lua b/src/battle/gen2/Battle.lua index 2cc93065..2b0b0543 100644 --- a/src/battle/gen2/Battle.lua +++ b/src/battle/gen2/Battle.lua @@ -16,7 +16,7 @@ -- -- Status handling follows Gen 2's rules rather than Gen 1's: burn is 1/8 max HP -- (not 1/16) and halves physical Attack, poison is 1/8, and sleep counts down --- from 1-7 turns. +-- from 2-7 turns. local Damage = require("src.battle.gen2.Damage") local Ai = require("src.battle.gen2.Ai") @@ -254,6 +254,9 @@ function Battle.new(opts) -- around the Tower's own StartBattle (engine/events/battle_tower/ -- battle_tower.asm:220-223) and cleared again at :253-254. self.inBattleTowerBattle = opts.battleTower and true or false + -- wTimeOfDay: only BattleCommand_TimeBasedHealContinue reads it in battle + -- (engine/battle/effect_commands.asm:6401-6404). + self.timeOfDay = opts.timeOfDay self.events = {} self.turn = 0 self.over = false @@ -2469,7 +2472,7 @@ end -- BattleCommand_TimeBasedHealContinue (effect_commands.asm:6374) answers the -- same two lines BattleCommand_Heal does: HPIsFullText (:6447) and -- RegainedHealthText (:6440). -for effect in pairs(Effects.SUN_HEAL) do +for effect, wants in pairs(Effects.SUN_HEAL) do Battle.MOVE_EFFECTS[effect] = function(self, attacker) local maxHp = attacker.maxHp or (attacker.stats and attacker.stats.hp) or 1 if (attacker.hp or 0) >= maxHp then @@ -2478,7 +2481,9 @@ for effect in pairs(Effects.SUN_HEAL) do text = self:monName(attacker) .. "'s HP is full!" }) return end - local fraction = Effects.weatherHealFraction(self.weather) + -- effect_commands.asm:6396-6417, the time of day and the weather (#1751). + local fraction = Effects.timeBasedHealFraction(self.weather, wants, + self.timeOfDay) self:heal(attacker, math.max(1, math.floor(maxHp * fraction))) self:emit({ kind = "message", text = self:monName(attacker) .. " regained health!" }) @@ -2925,9 +2930,12 @@ Battle.STATUSES = { id = "sleep", label = "SLP", hudLabel = "SLP", healClass = "slp", inflictText = " fell asleep!", catchBonus = 10, catchBonusIntended = 10, - -- BattleCommand_Sleep rolls a 3-bit value, retried until nonzero. + -- BattleCommand_SleepTarget's .random_loop rerolls 0 and SLP_MASK before + -- `inc a`, so sleep opens at 2 (effect_commands.asm:3591-3598, #1707). + -- Crystal masks the roll to %011 in the Battle Tower, capping it at 4 + -- (../pokecrystal/engine/battle/effect_commands.asm:3609-3613). onInflict = function(battle, mon) - mon.statusTurns = rand(battle.random, 7) + 1 + mon.statusTurns = rand(battle.random, battle.inBattleTowerBattle and 3 or 6) + 2 end, beforeMovePriority = 40, beforeMove = function(battle, mon, name) diff --git a/src/battle/gen2/Effects.lua b/src/battle/gen2/Effects.lua index 00dc8c13..a36f8ea3 100644 --- a/src/battle/gen2/Effects.lua +++ b/src/battle/gen2/Effects.lua @@ -267,7 +267,7 @@ Effects.MAGNITUDE_POWER = { -- power and the magnitude number the text prints. -- -- `random` is BattleRandom (0..n-1). If none is supplied, roll via love.math --- / math.random — never hard-code 0 (that always yields Magnitude 4). +-- / math.random -- never hard-code 0 (that always yields Magnitude 4). function Effects.magnitudePower(random) local roll if type(random) == "function" then @@ -356,19 +356,38 @@ function Effects.sandstormHits(types) return true end --- Morning Sun / Synthesis / Moonlight heal a HALF normally, and the weather --- shifts that one step either way: x2 in sun, /2 in rain or sandstorm --- (BattleCommand_Heal's .Weather block walks a multiplier index). +-- BattleCommand_TimeBasedHealContinue's .Multipliers +-- (engine/battle/effect_commands.asm:6450-6454). +Effects.HEAL_MULTIPLIERS = { 1 / 8, 1 / 4, 1 / 2, 1 } + +-- wTimeOfDay (constants/ram_constants.asm:134-139): MORN_F 0, DAY_F 1, +-- NITE_F 2, DARKNESS_F 3. +Effects.TIME_OF_DAY_ID = { MORN = 0, DAY = 1, NITE = 2, DARK = 3 } + +-- Morning Sun / Synthesis / Moonlight and the wTimeOfDay each one wants +-- (engine/battle/effect_commands.asm:6362-6371). Effects.SUN_HEAL = { - EFFECT_MORNING_SUN = true, - EFFECT_SYNTHESIS = true, - EFFECT_MOONLIGHT = true, + EFFECT_MORNING_SUN = 0, + EFFECT_SYNTHESIS = 1, + EFFECT_MOONLIGHT = 2, } -function Effects.weatherHealFraction(weather) - if weather == "sun" then return 2 / 3 end - if weather == "rain" or weather == "sandstorm" then return 1 / 4 end - return 1 / 2 +function Effects.timeOfDayIndex(timeOfDay) + if type(timeOfDay) == "number" then return math.floor(timeOfDay) end + return Effects.TIME_OF_DAY_ID[timeOfDay] +end + +-- engine/battle/effect_commands.asm:6388-6417: the index opens at a half, the +-- wrong time of day steps it down, sun steps it up, rain and sandstorm down. +function Effects.timeBasedHealFraction(weather, wants, timeOfDay) + local index = 3 + local now = Effects.timeOfDayIndex(timeOfDay) + if wants ~= nil and now ~= nil and now ~= wants then index = index - 1 end + if weather then + index = index + 1 + if weather ~= "sun" then index = index - 2 end + end + return Effects.HEAL_MULTIPLIERS[math.max(1, math.min(4, index))] end -- ---------------------------------------------------------------- Perish Song diff --git a/src/carts/CartManifest.lua b/src/carts/CartManifest.lua index cb27e68a..40c91d5b 100644 --- a/src/carts/CartManifest.lua +++ b/src/carts/CartManifest.lua @@ -11,7 +11,13 @@ CartManifest.SCHEMA = 1 CartManifest.EXT = ".g1rcart" CartManifest.FORMAT = "g1rcart" CartManifest.DIR = "carts" -CartManifest.SEALS = { sealed = true, open = true } +-- sealed: the pinned set runs exactly as pinned. sealed+: the same fixed set, +-- but the player may switch any pinned mod on or off. open: additive. +CartManifest.SEALS = { sealed = true, ["sealed+"] = true, open = true } +-- Shell and label finishes the launcher cartridge can render. +CartManifest.FINISHES = { + sparkle = true, holo = true, ["sparkle+holo"] = true, +} CartManifest.SOURCES = { github = true, gamebanana = true, ["local"] = true } CartManifest.ART_ENCODINGS = { base64 = true } CartManifest.PNG_SIGNATURE = "\137PNG\r\n\26\10" @@ -143,12 +149,24 @@ local function parseMod(raw, index, seen) entry.md5 = raw.md5 end + if raw.enabled ~= nil and type(raw.enabled) ~= "boolean" then + return nil, label .. " enabled must be true or false" + end + -- Only a declared OFF is carried: an absent or explicit true is the default, + -- so a cart that says nothing serializes exactly as it did before this field. + if raw.enabled == false then entry.enabled = false end + local options, err = parseOptions(raw.options, label) if err then return nil, err end entry.options = options return entry end +-- A pin the cart ships switched off is installed and configured but not run. +function CartManifest.modEnabled(entry) + return type(entry) == "table" and entry.enabled ~= false +end + local function parseOrder(raw, mods) local out = {} if raw == nil then @@ -244,12 +262,45 @@ function CartManifest.parse(tbl) engine = trim(tbl.engine) end + local speeds + if tbl.speeds ~= nil then + if type(tbl.speeds) ~= "table" or #tbl.speeds == 0 then + return nil, "cart speeds must be a non-empty array of multipliers" + end + local GameSpeed = require("src.core.GameSpeed") + local valid, seen = {}, {} + for _, want in ipairs(GameSpeed.LEVELS) do + for _, have in ipairs(tbl.speeds) do + if have == want and not seen[want] then + seen[want] = true + valid[#valid + 1] = want + end + end + end + if #valid ~= #tbl.speeds then + return nil, "cart speeds must all be GameSpeed levels" + end + speeds = valid + end + + local finish = tbl.finish + if finish ~= nil then + if type(finish) ~= "string" or not CartManifest.FINISHES[finish] then + return nil, "cart finish must be sparkle, holo or sparkle+holo" + end + end + local seal = tbl.seal if seal == nil then seal = "sealed" end if type(seal) ~= "string" or not CartManifest.SEALS[seal] then - return nil, "cart seal must be sealed or open" + return nil, "cart seal must be sealed, sealed+ or open" end + -- The author's preferred game settings, seeded once per cart + -- (SaveData.CART_OPTION_KEYS); unknown keys are kept but ignored. + local cartOptions, cartOptErr = parseOptions(tbl.options, "cart") + if cartOptErr then return nil, cartOptErr end + if type(tbl.mods) ~= "table" then return nil, "cart mods must be an array" end local count = #tbl.mods if count < 1 or count > CartManifest.MAX_MODS then @@ -273,10 +324,13 @@ function CartManifest.parse(tbl) repo = repo, summary = summary, shell = shell, + finish = finish, + speeds = speeds, label = label, base = tbl.base, engine = engine, seal = seal, + options = cartOptions, mods = mods, load_order = order, } @@ -364,6 +418,10 @@ local function writeValue(out, value) out[#out + 1] = "#" .. number(value) elseif kind == "boolean" then out[#out + 1] = value and "T" or "F" + elseif kind == "table" then + -- Length-prefixed so a list can never collide with another field's text. + out[#out + 1] = "*" .. tostring(#value) + for _, item in ipairs(value) do writeValue(out, item) end else writeText(out, "$", tostring(value)) end @@ -375,23 +433,31 @@ local function writeField(out, name, value) writeValue(out, value) end -local CART_FIELDS = { "author", "base", "engine", "id", "label", "repo", - "seal", "shell", "summary", "title", "version" } -local MOD_FIELDS = { "file", "id", "md5", "mod", "repo", "sha256", +local CART_FIELDS = { "author", "base", "engine", "finish", "id", "label", + "repo", "seal", "shell", "speeds", "summary", "title", + "version" } +local MOD_FIELDS = { "enabled", "file", "id", "md5", "mod", "repo", "sha256", "source", "version" } +local function writeOptions(out, marker, options) + out[#out + 1] = marker + local keys = {} + for key in pairs(options or {}) do keys[#keys + 1] = key end + table.sort(keys) + for _, key in ipairs(keys) do writeField(out, key, options[key]) end +end + function CartManifest.canonical(cart) local out = { "[cart]" } for _, field in ipairs(CART_FIELDS) do writeField(out, field, cart[field]) end + -- Absent when the cart ships no settings, so a cart written before this + -- field hashes byte for byte as it did. + if cart.options ~= nil then writeOptions(out, "[cart_options]", cart.options) end out[#out + 1] = "[mods]" for _, entry in ipairs(cart.mods or {}) do writeText(out, "@", tostring(entry.id)) for _, field in ipairs(MOD_FIELDS) do writeField(out, field, entry[field]) end - out[#out + 1] = "[options]" - local keys = {} - for key in pairs(entry.options or {}) do keys[#keys + 1] = key end - table.sort(keys) - for _, key in ipairs(keys) do writeField(out, key, entry.options[key]) end + writeOptions(out, "[options]", entry.options) end out[#out + 1] = "[order]" for _, id in ipairs(cart.load_order or {}) do writeText(out, "@", tostring(id)) end @@ -407,11 +473,14 @@ function CartManifest.encode(cart) format = CartManifest.FORMAT, formatVersion = CartManifest.SCHEMA, labelArt = CartManifest.parseLabelArt(cart.labelArt), + -- Every field parse() keeps: a name missing here is a field the file + -- round trip silently drops, as finish and speeds were. cart = { id = cart.id, title = cart.title, version = cart.version, author = cart.author, repo = cart.repo, summary = cart.summary, - shell = cart.shell, label = cart.label, base = cart.base, - engine = cart.engine, seal = cart.seal, mods = cart.mods, - load_order = cart.load_order }, + shell = cart.shell, finish = cart.finish, speeds = cart.speeds, + label = cart.label, base = cart.base, + engine = cart.engine, seal = cart.seal, options = cart.options, + mods = cart.mods, load_order = cart.load_order }, }) end diff --git a/src/carts/CartStore.lua b/src/carts/CartStore.lua index 2516a6fd..7d2c1d81 100644 --- a/src/carts/CartStore.lua +++ b/src/carts/CartStore.lua @@ -10,7 +10,7 @@ CartStore.OPTIONS_KEY = "carts" CartStore.UNPINNED_VERSION = "0.0.0" local RECORD_FIELDS = { "id", "title", "version", "author", "base", "seal", - "shell", "summary", "hash", "file" } + "shell", "finish", "speeds", "summary", "hash", "file" } local function fsOr(fs) return fs or (love and love.filesystem) or nil @@ -52,14 +52,26 @@ end local function recordFor(cart, hash) return { id = cart.id, title = cart.title, version = cart.version, author = cart.author, base = cart.base, seal = cart.seal, - shell = cart.shell, summary = cart.summary, + shell = cart.shell, finish = cart.finish, speeds = cart.speeds, + summary = cart.summary, hash = hash, file = fileFor(cart.id) } end +local function sameValue(a, b) + if type(a) == "table" and type(b) == "table" then + if #a ~= #b then return false end + for i = 1, #a do + if a[i] ~= b[i] then return false end + end + return true + end + return a == b +end + local function sameRecord(a, b) if type(a) ~= "table" or type(b) ~= "table" then return false end for _, field in ipairs(RECORD_FIELDS) do - if a[field] ~= b[field] then return false end + if not sameValue(a[field], b[field]) then return false end end return true end @@ -67,7 +79,8 @@ end local function entryFor(cart, hash) return { id = cart.id, title = cart.title, version = cart.version, author = cart.author, base = cart.base, seal = cart.seal, - shell = cart.shell, summary = cart.summary, label = cart.label, + shell = cart.shell, finish = cart.finish, speeds = cart.speeds, + summary = cart.summary, label = cart.label, cart = cart, cartHash = hash, file = fileFor(cart.id) } end @@ -299,7 +312,7 @@ function CartStore.capture(identity, available, modOptions) if type(identity) ~= "table" then return nil, "cart identity is required" end local mods, order, unresolved = {}, {}, {} for _, row in ipairs(available or {}) do - if type(row) == "table" and row.enabled and safeId(row.id) then + if type(row) == "table" and safeId(row.id) then local m = manifestOf(row) local version = textOf(row.version, m and m.version) local semver = version and Semver.parse(version) and version or nil @@ -319,6 +332,9 @@ function CartStore.capture(identity, available, modOptions) reason = pinReason(repo, version, semver, hash), } end + -- A switched-off mod is pinned OFF rather than dropped, so the cart + -- still ships it with the author's settings. + if not row.enabled then entry.enabled = false end entry.options = frozenOptions(modOptions and modOptions[row.id]) mods[#mods + 1] = entry order[#order + 1] = row.id @@ -327,8 +343,9 @@ function CartStore.capture(identity, available, modOptions) local cart, err = CartManifest.parse({ id = identity.id, title = identity.title, version = identity.version, author = identity.author, repo = identity.repo, summary = identity.summary, - shell = identity.shell, label = identity.label, base = identity.base, - engine = identity.engine, seal = identity.seal, + shell = identity.shell, finish = identity.finish, speeds = identity.speeds, + label = identity.label, base = identity.base, + engine = identity.engine, seal = identity.seal, options = identity.options, mods = mods, load_order = order, }) if not cart then return nil, err end diff --git a/src/core/ChipSynth.lua b/src/core/ChipSynth.lua index df9173b5..382e8e82 100644 --- a/src/core/ChipSynth.lua +++ b/src/core/ChipSynth.lua @@ -1147,6 +1147,7 @@ function Engine:drumInstrumentGen2(kit, pitch) ticks = ticks + duration end end + extendDrumEnvelope(segments) self.noiseInstruments[key] = segments return segments end diff --git a/src/core/Game.lua b/src/core/Game.lua index b1b730b9..3137193a 100644 --- a/src/core/Game.lua +++ b/src/core/Game.lua @@ -817,14 +817,6 @@ function Game:keypressed(key) self:writeOptions() end return - elseif key == "5" then - -- cycle GBC FX OFF → 1 → 2 → 3 → 4 (unlit-GBC ladder); always on - -- desktop. Mobile refuses the present shader (issue #136). - local GBCFX = require("src.render.GBCFX") - if not GBCFX.isSupported() then return end - self.save.options.gbcfx = GBCFX.cycle() - self:writeOptions() - return end -- Mod render pipelines claim their hotkeys last, so one can never shadow -- an engine display key however a mod declares it (12 §rendering @@ -1258,8 +1250,10 @@ function Game:applyOptions(opts) require("src.render.Pipelines").applyOptions(opts) require("src.render.Zoom").applyOptions(opts) require("src.render.TileRenderer").applyOptions(opts) - -- returns true when a persisted GBC FX level was cleared on mobile - local gbcCleared = require("src.render.GBCFX").applyOptions(opts) + -- returns true when a persisted preset name no longer resolves (deleted + -- from the drop-in folder, or failed to (re)translate) and had to be + -- cleared back to OFF -- "sanitized, please persist" contract + local shaderfxCleared = require("src.render.ShaderFX").applyOptions(opts) require("src.core.VideoMode").applyOptions(opts) -- Android orientation lock (#592); no-op everywhere else require("src.core.Orientation").applyOptions(opts) @@ -1274,12 +1268,12 @@ function Game:applyOptions(opts) -- tier. Every heavy feature was just applied from the stored options -- above; here we clamp the *live* state down for a weaker device without -- rewriting what the player saved, so raising the tier later restores - -- their exact TILT / GBC FX / ZOOM / MAX FPS choices. A HIGH tier (the + -- their exact TILT / ZOOM / MAX FPS choices. A HIGH tier (the -- default on a normal desktop, and every options.lua predating this -- option) clamps nothing, so it is a no-op for the common case. local caps = require("src.core.Performance").applyOptions(opts) if not caps.tilt then require("src.render.Tilt").setLevel(0) end - if not caps.gbcfx then require("src.render.GBCFX").setLevel(0) end + if not caps.shaderfx then require("src.render.ShaderFX").deactivate() end local Zoom = require("src.render.Zoom") Zoom.allowSurvey = caps.survey if not caps.survey and Zoom.offset < 0 then Zoom.offset = 0 end @@ -1289,8 +1283,7 @@ function Game:applyOptions(opts) end Input:applyBindings(opts.bindings) TouchControls:applyOptions(opts) - -- heal soft-bricked APK installs that already saved gbcfx > 0 (#136) - if gbcCleared then self:writeOptions() end + if shaderfxCleared then self:writeOptions() end end function Game:restoreSave(loaded, recovered, opts) diff --git a/src/core/Game2.lua b/src/core/Game2.lua index 176ee13f..db6f54b9 100644 --- a/src/core/Game2.lua +++ b/src/core/Game2.lua @@ -367,14 +367,22 @@ function Game2:showIntro() }) end +-- ../pokegold/engine/menus/intro_menu.asm:848-851 IntroSequence, and Crystal's +-- at ../pokecrystal/engine/menus/intro_menu.asm:964-967: a skip means the title. function Game2:showGameFreak() self.stack:clear() self.phase = "boot" - Screens.push(self, "Gen2GameFreakPresents", { + local id = (GameVersion.engine() == "crystal") + and "Gen2CrystalSplash" or "Gen2GameFreakPresents" + Screens.push(self, id, { title = self.titleData or {}, oakSpeech = self.oakSpeechData or {}, - onDone = function() - self:showIntro() + onDone = function(skipped) + if skipped then + self:showTitle() + else + self:showIntro() + end end, }) end @@ -1098,18 +1106,26 @@ function Game2:load() -- The play clock only runs in the overworld, the way wGameTimerPaused is -- set while the intro menu is up. Save.tickPlayTime(self.save) - -- START and SELECT are read only at the tail of OWPlayerInput, which - -- PlayerEvents never reaches while a script is running or the player is - -- mid-step (World:acceptsMenuInput transcribes the three gates). A press - -- that arrives under one of them is dropped, not queued -- and the frame - -- still runs, so world:step must not be skipped on the swallowed press. - if self.input:wasPressed("start") and self.world:acceptsMenuInput() then - self:openStartMenu() - return - end - if self.input:wasPressed("select") and self.world:acceptsMenuInput() then - self:useSelectItem() - return + -- MAPEVENTS_OFF skips GetJoypad for the whole of a step, so the hJoyDown + -- mirror is frozen -- events.asm:190-198, :211-227 (#525, #1718) + local accepts = self.world:acceptsMenuInput() + local latch = self.joyLatch + if accepts then + self.joyLatch = nil + if self.input:wasPressed("start") + or (latch and latch.start and self.input:isDown("start")) then + self:openStartMenu() + return + end + if self.input:wasPressed("select") + or (latch and latch.select and self.input:isDown("select")) then + self:useSelectItem() + return + end + else + if not latch then latch = {}; self.joyLatch = latch end + if self.input:wasPressed("start") then latch.start = true end + if self.input:wasPressed("select") then latch.select = true end end self.world:pollInput(self.input) if self.input:wasPressed("a") then @@ -1161,8 +1177,8 @@ end -- The screen-pixels-per-GB-pixel scale the post passes need so their grid and -- shadow offsets stay window-size independent. Always the plain letterbox --- fit, never the survey zoom: GBC FX is simulating the PANEL the picture is --- being shown on, and the panel does not resize when the player zooms the map +-- fit, never the survey zoom: SHADER FX is simulating the PANEL the picture +-- is being shown on, and the panel does not resize when the player zooms the map -- -- Gen 1 hands the same pass its `Renderer:fitScale()` for that reason -- (Renderer:endFrame's Sp). Following the zoom used to shrink the LCD grid to -- one screen pixel a cell out at survey range. @@ -1359,25 +1375,29 @@ end -- Gold's frame, and then the passes that run over it. -- -- The Gen 1 path gets these for free because everything it draws goes through --- src/render/Renderer.lua, which owns a present canvas and calls GBCFX there. --- Gold draws straight to the screen instead, which is why its GBC FX row used --- to change a number and nothing else: nothing ever presented a canvas for the --- shader to read. So compose into one here when a pass wants it, and skip the --- canvas entirely when none does -- the common case, and one less full-screen --- blit than the old path would have paid. +-- src/render/Renderer.lua, which owns a present canvas and calls ShaderFX +-- there. Gold draws straight to the screen instead, which is why its SHADER +-- FX row used to change a number and nothing else (back when it was GBC FX): +-- nothing ever presented a canvas for the shader to read. So compose into +-- one here when a pass wants it, and skip the canvas entirely when none does +-- -- the common case, and one less full-screen blit than the old path would +-- have paid. -- --- CLASSIC runs first and GBC FX second, matching the Gen 1 order: the palette --- IS the picture, and the screen effects are simulating the panel that picture --- is being shown on. Mod post-processes fold in between the two, where --- Renderer.lua:1058 folds them -- a blur or a colour grade is what the LCD grid --- is then drawn over, rather than something that smears the grid itself. +-- CLASSIC runs first and SHADER FX second, matching the Gen 1 order: the +-- palette IS the picture, and the screen effects are simulating the panel +-- that picture is being shown on. Mod post-processes fold in between the +-- two, where Renderer.lua:1058 folds them -- a blur or a colour grade is +-- what the LCD grid is then drawn over, rather than something that smears +-- the grid itself. function Game2:drawViewportFrame() local G = love.graphics local w, h = GameViewport.dimensions() - local GBCFX = require("src.render.GBCFX") + local ShaderFX = require("src.render.ShaderFX") local GbcPalette = require("src.render.GbcPalette") local Pipelines = require("src.render.Pipelines") - local fx = GBCFX.active() + -- Same dispatch src/render/Renderer.lua:1185 already uses for Gen 1 + -- (ShaderFX replaced GBCFX's slot; GBCFX.lua itself is removed). + local shaderfx = ShaderFX.active() -- render.zones, at the instant Gen 1 raises it: the palette list is settled -- and the blit has not happened yet. Gen 1's list is the SGB packet zones @@ -1400,14 +1420,14 @@ function Game2:drawViewportFrame() local zoned = type(zones) == "table" and zones[1] ~= nil -- A present canvas is paid for only when something reads it: the zone pass, - -- GBC FX, a mod post-process, render.compose, or an enabled render.output + -- SHADER FX, a mod post-process, render.compose, or an enabled render.output -- subscriber. With none of them the frame draws straight to the screen -- exactly as it always did. local composing = ModRuntime.wantsHook("render.compose") local hasOutputHook = ModRuntime.wantsHook("render.output") and ModRuntime.call("render.output_enabled", function() return false end) == true local scene = nil - if zoned or fx or composing or Pipelines.wantsPresent() or hasOutputHook then + if zoned or shaderfx or composing or Pipelines.wantsPresent() or hasOutputHook then scene = self:presentCanvas(1, w, h) end if not scene then @@ -1435,11 +1455,11 @@ function Game2:drawViewportFrame() end -- The zone pass has to land in a texture whenever anything still reads one - -- after it: GBC FX and a post-process both sample the tinted image, not the - -- untinted one. On its own the tint rides the final blit and no second + -- after it: SHADER FX and a post-process both sample the tinted image, not + -- the untinted one. On its own the tint rides the final blit and no second -- canvas is paid for. local source = scene - local reread = fx or Pipelines.wantsPresent() or hasOutputHook + local reread = shaderfx or Pipelines.wantsPresent() or hasOutputHook if zoned and reread then local tinted = self:presentCanvas(2, w, h) if tinted then @@ -1459,7 +1479,7 @@ function Game2:drawViewportFrame() -- Post-process pipelines run over the finished composite and before GBC -- FX. Each hands back a canvas; with none registered this returns `source` -- unchanged and the frame is byte-identical (Renderer.lua:1058). - local scale, ox, oy, dpi = self:frameFit(w, h) + local scale, ox, oy, dpi, pw, ph = self:frameFit(w, h) source = Pipelines.present(source, { width = w, height = h, scale = scale, dpi = dpi, dpiX = dpi, dpiY = dpi }) or source local outputHandled = hasOutputHook @@ -1473,8 +1493,30 @@ function Game2:drawViewportFrame() if not outputHandled then local cx, cy, cw, ch = Playfield.cutout(w, h) if cx then G.setScissor(cx, cy, cw, ch) end - if fx then - GBCFX.present(source, self:pixelScale(w, h)) + if shaderfx then + -- rect is physical framebuffer pixels and source is the un-scaled + -- size, matching Renderer.lua's fxRectPx / fxSrc contract. + -- A live overworld draws edge to edge at World:zoomScale, so the + -- faithful 160*scale box would leave the rest of the map unshaded. + local rect, srcW, srcH + if self.frameWorldActive and self.world then + local s = self.world:zoomScale() * dpi + srcW = self.world.viewW or 160 + srcH = self.world.viewH or 144 + local rw, rh = srcW * s, srcH * s + rect = { + x = math.floor((pw - rw) / 2), y = math.floor((ph - rh) / 2), + w = rw, h = rh, scale = s, + } + else + srcW, srcH = 160, 144 + rect = { + x = ox * dpi, y = oy * dpi, + w = 160 * scale * dpi, h = 144 * scale * dpi, + scale = scale * dpi, + } + end + ShaderFX.render(source, rect, { w = srcW, h = srcH }, dpi, dpi) else G.setColor(1, 1, 1, 1) G.draw(source, 0, 0) @@ -1518,6 +1560,28 @@ function Game2:drawContained(w, h) if not ok then error(err, 0) end end +-- BATTLE BG (#1709): the surround around the centred GB screen, taken from +-- whichever state in the stack owns a battle. +function Game2:paintBattleSurround(w, h) + local states = self.stack and self.stack.states or {} + local mode + for i = #states, 1, -1 do + local state = states[i] + if state and state.bgMode then mode = state:bgMode() break end + end + if mode ~= "black" then return end + local G = love.graphics + local scale = Chrome.fitScale(w, h) + local ox, oy = Chrome.fitOrigin(w, h, scale) + local pw, ph = 160 * scale, 144 * scale + G.setColor(0, 0, 0, 1) + if oy > 0 then G.rectangle("fill", 0, 0, w, oy) end + if oy + ph < h then G.rectangle("fill", 0, oy + ph, w, h - oy - ph) end + if ox > 0 then G.rectangle("fill", 0, oy, ox, ph) end + if ox + pw < w then G.rectangle("fill", ox + pw, oy, w - ox - pw, ph) end + G.setColor(1, 1, 1, 1) +end + function Game2:drawScene(w, h) local G = love.graphics -- render.compose reads this after the scene is drawn; the plain overworld @@ -1587,6 +1651,7 @@ function Game2:drawScene(w, h) and base.drawWidescreen and base) if wide then wide:drawWidescreen(w, h) + self:paintBattleSurround(w, h) self:letterbox(w, h, false) if wide ~= top then -- The pushed box blits at the same integer fit the widescreen layer @@ -1691,7 +1756,6 @@ end -- F1/F2 write / reload the save 1 GAME SPEED -- - = zoom one step out / in 2 COLOR -- 4 cycle ZOOM 3 TILT (mnemonic: 3D) --- 5 GBC FX -- -- `2` is COLOR here rather than Gen 1's COLORS. The Gen 1 row cycles SGB -- palette packs, which a CGB-native game has no use for; what it cycles here @@ -1726,13 +1790,6 @@ function Game2:hotkey(key) options.tilt = Tilt.cycle() persist() return true - elseif key == "5" then - local GBCFX = require("src.render.GBCFX") - if GBCFX.isSupported() then - options.gbcfx = GBCFX.cycle() - persist() - end - return true end if not (self.world and self.world.map) then return self:pipelineHotkey(key, options, persist) @@ -1967,7 +2024,8 @@ end -- Push the saved display options into the modules that own them. Called -- whenever the options table changes hands (boot, CONTINUE, the OPTION --- screen), so a reload comes back at the zoom, tilt and GBC FX the player left. +-- screen), so a reload comes back at the zoom, tilt and SHADER FX the player +-- left. function Game2:applyOptions() local options = self.options or {} Music.applyOptions(options) @@ -1994,9 +2052,26 @@ function Game2:applyOptions() require("src.core.ScreenPosition").applyOptions(options) require("src.core.FrameCap").applyOptions(options) require("src.world.gen2.BorderFill").applyOptions(options) - local GBCFX = require("src.render.GBCFX") - if GBCFX.applyOptions(options) and self.save then - -- applyOptions returns true when it had to clear an unsupported level. + -- returns true when a persisted preset name no longer resolves (deleted + -- from the drop-in folder, or failed to (re)translate) and had to be + -- cleared back to OFF -- src\core\Game.lua:1215 mirrors this call for + -- Gen 1 (SHADER FX reaches Gen 2 too) + local shaderfxCleared = require("src.render.ShaderFX").applyOptions(options) + -- Scale the optional presentation extras to the device's performance + -- tier, same clamp src/core/Game.lua:1222-1230 applies for Gen 1 -- see + -- that site's comment for the full rationale. + local caps = require("src.core.Performance").applyOptions(options) + if not caps.tilt then require("src.render.Tilt").setLevel(0) end + if not caps.shaderfx then require("src.render.ShaderFX").deactivate() end + local Zoom = require("src.render.Zoom") + Zoom.allowSurvey = caps.survey + if not caps.survey and Zoom.offset < 0 then Zoom.offset = 0 end + if caps.fpsMax then + local FrameCap = require("src.core.FrameCap") + if FrameCap.current > caps.fpsMax then FrameCap.apply(caps.fpsMax) end + end + if shaderfxCleared and self.save then + -- applyOptions returns true when it had to clear an unresolved preset. self.save.options = options end end diff --git a/src/core/GameSpeed.lua b/src/core/GameSpeed.lua index 96f08815..495bd27f 100644 --- a/src/core/GameSpeed.lua +++ b/src/core/GameSpeed.lua @@ -29,11 +29,38 @@ end -- nearest valid level for an arbitrary value (a hand-edited options.lua or -- a --speed argument), so a bad number degrades to something sane +-- A cart may narrow the levels a player can reach (CartManifest's `speeds`). +-- nil restores the full ladder; a one-entry list pins the speed outright. +local allowed + +function GameSpeed.setAllowed(levels) + if type(levels) ~= "table" or #levels == 0 then allowed = nil; return end + local valid, seen = {}, {} + for _, want in ipairs(GameSpeed.LEVELS) do + for _, have in ipairs(levels) do + if have == want and not seen[want] then + seen[want] = true + valid[#valid + 1] = want + end + end + end + allowed = (#valid > 0) and valid or nil +end + +function GameSpeed.allowed() + return allowed or GameSpeed.LEVELS +end + +function GameSpeed.isLocked() + return allowed ~= nil and #allowed <= 1 +end + function GameSpeed.clamp(v) v = tonumber(v) - if not v then return GameSpeed.DEFAULT end - local best, bestDiff = GameSpeed.DEFAULT, math.huge - for _, level in ipairs(GameSpeed.LEVELS) do + local levels = GameSpeed.allowed() + if not v then return levels[1] or GameSpeed.DEFAULT end + local best, bestDiff = levels[1] or GameSpeed.DEFAULT, math.huge + for _, level in ipairs(levels) do local diff = math.abs(level - v) if diff < bestDiff then best, bestDiff = level, diff end end @@ -42,7 +69,7 @@ end -- cycle to the next/previous level, wrapping (the options row idiom) function GameSpeed.cycle(v, dir) - local levels = GameSpeed.LEVELS + local levels = GameSpeed.allowed() local cur = 1 for i, level in ipairs(levels) do if level == GameSpeed.clamp(v) then cur = i break end diff --git a/src/core/GameVersion.lua b/src/core/GameVersion.lua index e9b57cc7..3e39ced9 100644 --- a/src/core/GameVersion.lua +++ b/src/core/GameVersion.lua @@ -60,9 +60,7 @@ GameVersion.VERSIONS = { id = "gold", label = "Gold", displayName = "Pokemon Gold", - -- Still Gen 2 Phase work; the launcher panel / Play button say Beta so - -- players do not treat it like the shipped Gen 1 columns. - launcherName = "Gold (Beta)", + launcherName = "Gold", sha1 = "d8b8a3600a465308c9953dfa04f0081c05bdcb94", manifest = "tools/rom_manifest_gold.json", cachePrefix = "gold/", -- gold/data/generated, gold/assets/generated @@ -77,7 +75,7 @@ GameVersion.VERSIONS = { id = "silver", label = "Silver", displayName = "Pokemon Silver", - launcherName = "Silver (Beta)", + launcherName = "Silver", sha1 = "49b163f7e57702bc939d642a18f591de55d92dae", manifest = "tools/rom_manifest_silver.json", cachePrefix = "silver/", -- silver/data/generated, silver/assets/generated @@ -89,6 +87,8 @@ GameVersion.VERSIONS = { id = "crystal", label = "Crystal", displayName = "Pokemon Crystal", + -- Still Gen 2 Phase work; the launcher panel / Play button say Beta so + -- players do not treat it like the shipped Gold and Silver columns. launcherName = "Crystal (Beta)", sha1 = "f4cd194bdee0d04ca4eac29e09b8e4e9d818c133", manifest = "tools/rom_manifest_crystal.json", diff --git a/src/core/HostShell.lua b/src/core/HostShell.lua index 82a42bfb..cb6d1082 100644 --- a/src/core/HostShell.lua +++ b/src/core/HostShell.lua @@ -376,7 +376,19 @@ end -- notice a quit command until curl returns. With the launcher's default 300s -- ceiling, closing the window during a mod download hung the process for -- minutes. Callers on the interactive fetch pool pass something short. -function HostShell.httpDownload(url, absPath, userAgent, accept, maxTime) +-- +-- `etagPath` (optional, absolute host path) turns this into a conditional +-- GET: curl sends `If-None-Match` from whatever ETag is already saved there +-- (`--etag-compare`) and overwrites it with the response's own ETag on +-- success (`--etag-save`), same file for both so a first call with no prior +-- ETag degrades to a plain unconditional download. A server that replies 304 +-- Not Modified is reported as a third return value (`notModified`), and -- +-- confirmed empirically against the real buildbot.libretro.com endpoint +-- (TrueFX/etag-cache-repro/) before this was wired in here -- curl does NOT +-- write `absPath` at all in that case (not even an empty file), matching +-- HTTP: a 304 carries no body. A caller must not treat a missing file as an +-- error when `notModified` comes back true. +function HostShell.httpDownload(url, absPath, userAgent, accept, maxTime, etagPath) if type(url) ~= "string" or url == "" then return nil, "missing url" end if type(absPath) ~= "string" or absPath == "" then return nil, "missing path" end userAgent = userAgent or "gen1recomp" @@ -388,6 +400,10 @@ function HostShell.httpDownload(url, absPath, userAgent, accept, maxTime) if accept then cmd = cmd .. "-H " .. HostShell.quote("Accept: " .. accept) .. " " end + if type(etagPath) == "string" and etagPath ~= "" then + cmd = cmd .. "--etag-compare " .. HostShell.quote(etagPath) .. " " + .. "--etag-save " .. HostShell.quote(etagPath) .. " " + end cmd = cmd .. "-o " .. HostShell.quote(absPath) .. " " .. "-w " .. HostShell.quote(HTTP_MARK_FMT) .. " " .. HostShell.quote(url) .. " 2>&1" @@ -400,6 +416,9 @@ function HostShell.httpDownload(url, absPath, userAgent, accept, maxTime) -- status is here purely so the failure can NAME itself: "download failed" -- with no URL and no code is the report this whole change exists to fix. local body, status, noise = splitCurlOutput(readOk and out or "") + if status == 304 then + return true, nil, true + end if status and (status < 200 or status >= 300) then return nil, fetchError(url, status, body) end @@ -411,6 +430,10 @@ function HostShell.httpDownload(url, absPath, userAgent, accept, maxTime) if not haveBridge() then return nil, "no network transport on this platform" end + -- The Android/iOS bridge has no conditional-GET support -- etagPath is + -- silently ignored here, so a downloaded preset re-fetches in full every + -- time on those platforms. No transport-level ETag/If-None-Match hook + -- exists on the bridge to hang one off, and it's low-priority for now. local ok, done = pcall(love.system.httpDownload, url, absPath, userAgent, accept) if ok and done then return true end return nil, "download failed for " .. url diff --git a/src/core/Performance.lua b/src/core/Performance.lua index b15b520e..4d61b65f 100644 --- a/src/core/Performance.lua +++ b/src/core/Performance.lua @@ -3,9 +3,12 @@ -- -- The heavy extras are all things the Game Boy never had and this port -- adds on top: the whole-screen 3D TILT (transforms the entire map as a --- ground plane), the GBC FX post-process shader (a fullscreen pass), and --- survey ZOOM (zooming out renders the connected neighbor maps -- a lot of --- extra overdraw). A hard FPS ceiling caps present cost on top of that. +-- ground plane), survey ZOOM (zooming out renders the connected +-- neighbor maps -- a lot of extra overdraw), and SHADER FX (a live- +-- translated libretro slang-shader chain, reasoned -- not yet measured -- +-- to be heavier per-frame than GBCFX.lua's old fixed shader it replaced). +-- A hard FPS ceiling caps present cost on +-- top of that. -- None of this touches game logic, which is fixed-step off dt -- (src/core/FixedStep.lua), so every tier plays identically; they differ -- only in how much optional eye-candy the renderer is allowed to do. @@ -13,14 +16,15 @@ -- The tier is persisted as save.options.performance: -- auto pick a default from the device (see detect()) -- high everything on -- the historical behavior --- balanced no TILT, no GBC FX (kept: survey zoom, colors, uncapped FPS) --- low no TILT, no GBC FX, no survey zoom, FPS capped +-- balanced no TILT, no SHADER FX (kept: survey zoom, colors, uncapped FPS) +-- low no TILT, no survey zoom, no SHADER FX, FPS capped -- -- AUTO only chooses the *default* for the current device; every tier is -- selectable in OPTIONS, so a heuristic that guesses wrong is one row away -- from being overridden. The clamps are applied live in Game:applyOptions --- against the stored options without rewriting them, so raising the tier --- restores exactly the TILT / GBC FX / ZOOM / FPS the player had. +-- (Gen 1) / Game2:applyOptions (Gen 2) against the stored options without +-- rewriting them, so raising the tier restores exactly the TILT / SHADER FX +-- / ZOOM / FPS the player had. Wired into both generations. -- -- Zero requires: loads during love.conf and under plain Lua for tools and -- tests, the same way src/core/GameVersion.lua does. @@ -40,10 +44,24 @@ Performance.LABELS = { -- What each concrete tier permits. `auto` is resolved to one of these -- before caps are read, so it has no row here. fpsMax = false means no -- extra ceiling (the player's own MAX FPS still applies). +-- +-- `shaderfx` is `false` (fully off) or a positive number: an internal +-- chain-resolution multiplier (1.0 = native, e.g. 0.5 = render the whole +-- SHADER FX pass chain at half resolution, then stretch up for display -- +-- src/render/ShaderFX.lua's ShaderFX.render already stretch-blits its +-- final output to the real display rect regardless of the chain's own +-- internal size, so shrinking the chain's working +-- resolution costs nothing extra at that final blit). Every existing +-- truthy/falsy call site (`if not caps.shaderfx then ... end`) still works +-- unchanged: `false` stays falsy, any positive number stays truthy -- only +-- `ShaderFX.render` itself reads the actual number. No tier is +-- set below 1.0 yet -- tuning the actual per-tier value for real low-end +-- hardware needs a device this project doesn't have to hand right now; this +-- is the mechanism, not the tuning. Performance.CAPS = { - high = { tilt = true, gbcfx = true, survey = true, fpsMax = false }, - balanced = { tilt = false, gbcfx = false, survey = true, fpsMax = false }, - low = { tilt = false, gbcfx = false, survey = false, fpsMax = 60 }, + high = { tilt = true, survey = true, shaderfx = 1.0, fpsMax = false }, + balanced = { tilt = false, survey = true, shaderfx = false, fpsMax = false }, + low = { tilt = false, survey = false, shaderfx = false, fpsMax = 60 }, } -- Live resolved tier (never "auto"); Game:applyOptions sets it and the @@ -93,8 +111,7 @@ function Performance.detect() if isArm and os == "Linux" then return "low" end - -- Phones and tablets: GBC FX is already force-disabled here (issue #136); - -- balanced additionally drops the 3D tilt, the heaviest remaining extra. + -- Phones and tablets: balanced drops the 3D tilt, the heaviest extra. if os == "Android" or os == "iOS" then return "balanced" end diff --git a/src/core/SaveData.lua b/src/core/SaveData.lua index 8d3d2fd0..7263d2b0 100644 --- a/src/core/SaveData.lua +++ b/src/core/SaveData.lua @@ -272,10 +272,9 @@ function SaveData.defaultOptions() speedOverworld = 1, speedBattle = 1, speedMenu = 1, - -- port display options (OptionsMenu / hotkeys 2/3/4/5) + -- port display options (OptionsMenu / hotkeys 2/3/4) colors = "gbc", tilt = 0, - gbcfx = 0, -- survey zoom offset from window fit scale (0 = FIT); see Zoom.lua zoom = 0, -- OVERWORLD beyond-edge fill: trees | water | black @@ -290,8 +289,8 @@ function SaveData.defaultOptions() fpsCap = 60, -- graphics performance tier: auto | high | balanced | low. "auto" -- picks a default from the device (ARM handhelds/phones drop the heavy - -- extras); scales TILT / GBC FX / survey ZOOM / FPS but never game - -- logic. See src/core/Performance.lua. + -- extras); scales TILT / survey ZOOM / FPS but never game logic. See + -- src/core/Performance.lua. performance = "auto", -- Per-pipeline display levels, keyed by render_pipelines id (see -- src/render/Pipelines.lua). A level for a mod that is not installed @@ -360,9 +359,24 @@ function SaveData.defaultOptions() timeFormat = "device", -- device | 24h | 12h saveSync = { enabled = false, lastSyncAt = 0, revs = {}, stamps = {}, pendingConflicts = {} }, + -- Cart-scoped settings, beside cartSlots: cartOptions[cartId][key] layers + -- over the global value for CART_OPTION_KEYS while that cart is playing. + cartOptions = {}, + -- The player's own answer for a mod a cart pins, kept out of the per-game + -- flags: cartMods[cartId][modId], absent while the cart's switch stands. + cartMods = {}, + -- The carts whose shipped defaults were already seeded, so a player's + -- later change is never overwritten (compare modProfilesSeeded). + cartOptionsSeeded = {}, } end +-- Settings that belong to a playthrough and follow the cart: pacing and the +-- battle rules. Everything else -- audio, video, bindings, touch, language, +-- launcher state -- belongs to the machine and stays global. +SaveData.CART_OPTION_KEYS = { "animations", "battleStyle", "ruleset", + "speedBattle", "speedMenu", "speedOverworld", "textSpeed" } + -- Merge loaded keys over defaults (shallow). Unknown keys are kept so -- future options aren't dropped by older builds writing the file back. function SaveData.mergeOptions(loaded) @@ -437,6 +451,60 @@ end -- ------- options +-- The cart being played, if any; SaveData.setCart owns it. Declared here +-- because the options overlay below reads it. +local activeCart, activeCartHash + +local function cartBucket(opts, cartId) + local root = type(opts) == "table" and opts.cartOptions or nil + local bucket = type(root) == "table" and root[cartId] or nil + return type(bucket) == "table" and bucket or nil +end + +-- Lay the active cart's values over the globals for the cart-scoped keys; a +-- key the cart never set falls through to the global value. +local function applyCartOverlay(opts) + if not (activeCart and type(opts) == "table") then return opts end + local bucket = cartBucket(opts, activeCart) + if not bucket then return opts end + for _, key in ipairs(SaveData.CART_OPTION_KEYS) do + if bucket[key] ~= nil then opts[key] = bucket[key] end + end + return opts +end + +local function cartGlobals(onDisk) + local out = {} + if type(onDisk) ~= "table" then return out end + for _, key in ipairs(SaveData.CART_OPTION_KEYS) do out[key] = onDisk[key] end + return out +end + +-- The inverse, run just before a write: the cart-scoped keys go into the +-- active cart's bucket and the globals keep whatever the file already held. +local function splitCartOverlay(opts, globals, onDisk) + if not (activeCart and type(opts) == "table") then return opts end + local root = {} + local prior = type(onDisk) == "table" and onDisk.cartOptions or nil + if type(prior) == "table" then + for id, bucket in pairs(prior) do root[id] = deepCopy(bucket) end + end + for id, bucket in pairs(type(opts.cartOptions) == "table" and opts.cartOptions or {}) do + root[id] = bucket + end + local bucket = type(root[activeCart]) == "table" and root[activeCart] or {} + local defaults = SaveData.defaultOptions() + for _, key in ipairs(SaveData.CART_OPTION_KEYS) do + if opts[key] ~= nil then bucket[key] = opts[key] end + local global = globals and globals[key] + if global == nil then global = defaults[key] end + opts[key] = global + end + root[activeCart] = bucket + opts.cartOptions = root + return opts +end + -- Both take an optional fs (write/getInfo/read) defaulting to -- love.filesystem, so the mod loader's injected filesystem can carry the -- options round-trip headless (no love global). @@ -458,6 +526,10 @@ function SaveData.saveOptions(opts, fs) -- activeProfile -- not defaultOptions members -- can be deleted by their -- sites precisely because those sites always write full tables. local onDisk = readTable(fs, OPTIONS_FILENAME) + -- Fold from the cart's view of the file, not the globals underneath it, or + -- a partial write would push the global value into the cart's bucket. + local cartGlobalValues = cartGlobals(onDisk) + applyCartOverlay(onDisk) local isFull = type(opts) == "table" if isFull then for k in pairs(SaveData.defaultOptions()) do @@ -497,6 +569,7 @@ function SaveData.saveOptions(opts, fs) end opts.modOptions = merged end + splitCartOverlay(opts, cartGlobalValues, onDisk) local encoded = SaveSerializer.encode(opts) -- Stage the new bytes and roll the last good file aside BEFORE the main -- write truncates it, the same tmp/bak dance SaveData.save uses for @@ -544,7 +617,8 @@ function SaveData.saveOptions(opts, fs) fs.write(OPTIONS_BACKUP_FILENAME, encoded) -- the staged witness has served its purpose; the main file is verified remove(fs, OPTIONS_TMP_FILENAME) - return opts + -- hand back the cart's view, matching what loadOptions would answer + return applyCartOverlay(opts) end function SaveData.loadOptions(fs) @@ -572,11 +646,11 @@ function SaveData.loadOptions(fs) if fs.write then fs.write(OPTIONS_FILENAME, SaveSerializer.encode(recovered)) end - return SaveData.mergeOptions(recovered) + return applyCartOverlay(SaveData.mergeOptions(recovered)) end return SaveData.defaultOptions() end - return SaveData.mergeOptions(data) + return applyCartOverlay(SaveData.mergeOptions(data)) end -- ------- per-game mod enablement @@ -768,7 +842,6 @@ local freshPlaythrough local CART_PREFIX = "cart_" -local activeCart, activeCartHash local sealBroken = false local function cartKey(cartId) @@ -1314,6 +1387,53 @@ function SaveData.getCart() return activeCart end +-- The player's answer for one mod a cart pins, or nil while they have not +-- given one and the cart's own switch stands. +function SaveData.cartModEnabled(options, cartId, modId) + if not cartKey(cartId) or type(modId) ~= "string" then return nil end + local root = type(options) == "table" and options.cartMods or nil + local bucket = type(root) == "table" and root[cartId] or nil + if type(bucket) == "table" and type(bucket[modId]) == "boolean" then + return bucket[modId] + end + return nil +end + +-- Kept apart from options.mods so switching a cart's mod never changes what +-- the base game runs, and vice versa. +function SaveData.setCartModEnabled(cartId, modId, enabled, fs) + if not cartKey(cartId) or type(modId) ~= "string" or modId == "" then + return false + end + local opts = SaveData.loadOptions(fs) + local root = type(opts.cartMods) == "table" and opts.cartMods or {} + local bucket = type(root[cartId]) == "table" and root[cartId] or {} + bucket[modId] = enabled and true or false + root[cartId], opts.cartMods = bucket, root + return SaveData.saveOptions(opts, fs) ~= nil +end + +-- Seed the active cart's shipped settings into its overlay, once ever. Keys +-- outside CART_OPTION_KEYS are ignored; a later player change is never redone. +function SaveData.seedCartOptions(defaults, fs) + if not (activeCart and type(defaults) == "table") then return false end + local opts = SaveData.loadOptions(fs) + local seeded = type(opts.cartOptionsSeeded) == "table" + and opts.cartOptionsSeeded or {} + if seeded[activeCart] then return false end + local root = type(opts.cartOptions) == "table" and opts.cartOptions or {} + local bucket = type(root[activeCart]) == "table" and root[activeCart] or {} + for _, key in ipairs(SaveData.CART_OPTION_KEYS) do + if defaults[key] ~= nil and bucket[key] == nil then + bucket[key] = defaults[key] + opts[key] = defaults[key] + end + end + root[activeCart], opts.cartOptions = bucket, root + seeded[activeCart], opts.cartOptionsSeeded = true, seeded + return SaveData.saveOptions(opts, fs) ~= nil +end + function SaveData.setCartHash(cartHash) activeCartHash = (type(cartHash) == "string" and cartHash ~= "") and cartHash or nil return activeCartHash diff --git a/src/core/Sensors.lua b/src/core/Sensors.lua new file mode 100644 index 00000000..446eb283 --- /dev/null +++ b/src/core/Sensors.lua @@ -0,0 +1,178 @@ +-- Accelerometer and gyroscope reads for the tilt-driven shader presets, plus +-- screen-rotation compensation. love.sensor does not exist in LOVE 11.5 on any +-- platform, so the working path is raw FFI into the SDL2 LOVE already links, +-- the same technique src/core/Orientation.lua uses. What is and is not verified +-- on real hardware is written down in docs/shaderfx.md. + +local Sensors = {} + +-- Test seams: a no-device harness injects synthetic readings. +local overrides = {} +local orientationOverride = nil + +function Sensors.setOverride(kind, x, y, z) + overrides[kind] = { x, y, z } +end + +function Sensors.clearOverride(kind) + overrides[kind] = nil +end + +function Sensors.clearAllOverrides() + overrides = {} + orientationOverride = nil +end + +-- "landscape" | "landscapeFlipped" | "portrait" | "portraitFlipped" | nil +-- (nil = ask SDL for real). Test seam for rotateForScreen below. +function Sensors.setOrientationOverride(o) + orientationOverride = o +end + +-- ---- love.sensor path (kept for a future LOVE 12 upgrade; always nil today). +local function safeHasSensor(kind) + if not love or not love.sensor then return false end + local ok, has = pcall(love.sensor.hasSensor, kind) + return ok and has == true +end + +local function loveSensorRead(kind) + if not safeHasSensor(kind) then return nil end + local ok, x, y, z = pcall(love.sensor.getData, kind) + if not ok then return nil end + return x or 0, y or 0, z or 0 +end + +-- ---- raw SDL2 FFI path (the one that actually works on LÖVE 11.5). +local SDL_SENSOR_ACCEL, SDL_SENSOR_GYRO = 1, 2 +local SDL_INIT_SENSOR = 0x00008000 +local KIND_TO_SDL_TYPE = { accelerometer = SDL_SENSOR_ACCEL, gyroscope = SDL_SENSOR_GYRO } + +local sdlCdefOk = nil +local sdlSensorHandles = {} -- kind -> SDL_Sensor* (nil once confirmed absent) +local sdlSensorTried = {} + +-- ffi.load("SDL2") first, needed on desktop where SDL2 is a separate library, +-- then bare ffi.C, needed on Android where love-android links SDL2 statically +-- into libmain.so and there is no standalone libSDL2.so to attach to by name +-- (Orientation.lua's own sdlFfi resolves the same way on real hardware, #592/#716). +local sdlLib = nil +local function sdlFfi() + local okFfi, ffi = pcall(require, "ffi") + if not okFfi then return nil end + if sdlCdefOk == nil then + sdlCdefOk = pcall(ffi.cdef, [[ + typedef struct SDL_Window SDL_Window; + typedef struct SDL_Sensor SDL_Sensor; + int SDL_InitSubSystem(unsigned int flags); + int SDL_NumSensors(void); + int SDL_SensorGetDeviceType(int device_index); + SDL_Sensor *SDL_SensorOpen(int device_index); + void SDL_SensorUpdate(void); + int SDL_SensorGetData(SDL_Sensor *sensor, float *data, int num_values); + SDL_Window *SDL_GL_GetCurrentWindow(void); + int SDL_GetWindowDisplayIndex(SDL_Window *window); + int SDL_GetDisplayOrientation(int displayIndex); + ]]) + if sdlCdefOk then + local okLoad, lib = pcall(ffi.load, "SDL2") + sdlLib = okLoad and lib or ffi.C + end + end + if not sdlCdefOk or not sdlLib then return nil end + return sdlLib +end + +-- Opens and caches once, and returns nil permanently once a real attempt finds +-- none, so a no-hardware desktop run pays this cost once rather than per frame. +local function sdlSensorHandle(lib, kind) + if sdlSensorTried[kind] then return sdlSensorHandles[kind] end + sdlSensorTried[kind] = true + local wantType = KIND_TO_SDL_TYPE[kind] + if not wantType then return nil end + local okInit = pcall(lib.SDL_InitSubSystem, SDL_INIT_SENSOR) + if not okInit then return nil end + local okCount, count = pcall(lib.SDL_NumSensors) + if not okCount or count <= 0 then return nil end + for i = 0, count - 1 do + local okType, t = pcall(lib.SDL_SensorGetDeviceType, i) + if okType and t == wantType then + local okOpen, handle = pcall(lib.SDL_SensorOpen, i) + if okOpen and handle ~= nil then + sdlSensorHandles[kind] = handle + return handle + end + end + end + return nil +end + +local function sdlSensorRead(kind) + local lib = sdlFfi() + if not lib then return nil end + local handle = sdlSensorHandle(lib, kind) + if not handle then return nil end + pcall(lib.SDL_SensorUpdate) + local data = require("ffi").new("float[3]") + local okGet, n = pcall(lib.SDL_SensorGetData, handle, data, 3) + if not okGet or n ~= 0 then return nil end + return data[0], data[1], data[2] +end + +-- ---- screen-rotation compensation (x/y only; z is perpendicular to the screen +-- and unaffected by an in-plane rotation). Mobile-only: a desktop monitor is +-- legitimately, permanently "landscape" to SDL_GetDisplayOrientation. +local function isMobile() + if not love or not love.system or not love.system.getOS then return false end + local os = love.system.getOS() + return os == "Android" or os == "iOS" +end + +local function sdlOrientation() + if not isMobile() then return nil end + local lib = sdlFfi() + if not lib then return nil end + local okWin, win = pcall(lib.SDL_GL_GetCurrentWindow) + if not okWin or win == nil then return nil end + local okIdx, idx = pcall(lib.SDL_GetWindowDisplayIndex, win) + if not okIdx or idx < 0 then return nil end + local okOr, o = pcall(lib.SDL_GetDisplayOrientation, idx) + if not okOr then return nil end + -- SDL_DisplayOrientation: 0=UNKNOWN, 1=LANDSCAPE, 2=LANDSCAPE_FLIPPED, + -- 3=PORTRAIT, 4=PORTRAIT_FLIPPED. + if o == 1 then return "landscape" + elseif o == 2 then return "landscapeFlipped" + elseif o == 3 then return "portrait" + elseif o == 4 then return "portraitFlipped" + else return nil end +end + +-- Remaps raw device-frame (x,y) into "as currently displayed" (x,y). portrait, +-- and unknown/undetectable (desktop always lands here), is a no-op. +local function rotateForScreen(x, y) + local o = orientationOverride or sdlOrientation() + if o == "landscape" then return -y, x + elseif o == "landscapeFlipped" then return y, -x + elseif o == "portraitFlipped" then return -x, -y + else return x, y end +end + +-- Returns x, y, z for "accelerometer" | "gyroscope". {0,0,0} when overridden +-- that way, no hardware/module is available, or an underlying call errors. +-- x/y are rotated to be screen-relative; z passes through unchanged. +function Sensors.read(kind) + local override = overrides[kind] + if override then + local x, y = rotateForScreen(override[1], override[2]) + return x, y, override[3] + end + + local x, y, z = loveSensorRead(kind) + if not x then x, y, z = sdlSensorRead(kind) end + if not x then return 0, 0, 0 end + + x, y = rotateForScreen(x, y) + return x, y, z +end + +return Sensors diff --git a/src/core/Sound.lua b/src/core/Sound.lua index f2982353..01a82299 100644 --- a/src/core/Sound.lua +++ b/src/core/Sound.lua @@ -363,6 +363,14 @@ function Sound.sfxBusy() return true end +-- WaitSFX (home/audio.asm), the drain above GiveItemScript's `specialsound` +-- (engine/overworld/scripting.asm:445), so ch5-ch8 are free for it (#1483). +function Sound.waitSfxDone() + if not curSfx then return end + pcall(curSfx.src.stop, curSfx.src) + curSfx = nil +end + local function startSfx(data, name, def) local src = playPath(data, name, def) if not src then return end diff --git a/src/core/gen2/Boxes.lua b/src/core/gen2/Boxes.lua index 7a87bd93..fa5a702d 100644 --- a/src/core/gen2/Boxes.lua +++ b/src/core/gen2/Boxes.lua @@ -109,6 +109,17 @@ function Boxes.restorePP(mon) end end +-- box_struct has no MON_STATUS and no MON_HP (macros/ram.asm:7-26), so +-- CalcTempmonStats refills a BOXMON from MAXHP (engine/pokemon/tempmon.asm:56-83). +function Boxes.enterBox(mon) + if not mon then return mon end + Boxes.restorePP(mon) + mon.status = nil + mon.statusTurns = nil + mon.hp = mon.isEgg and 0 or (mon.maxHp or mon.hp) + return mon +end + function Boxes.deposit(save, partyIndex, boxIndex) local ok, reason = Boxes.canDeposit(save, partyIndex, boxIndex) if not ok then return false, reason end @@ -122,7 +133,7 @@ function Boxes.deposit(save, partyIndex, boxIndex) box[#box + 1] = mon -- SendGetMonIntoFromBox's PC_DEPOSIT arm ends in RestorePPOfDepositedPokemon -- (engine/pokemon/move_mon.asm:633-635, :696-700). - Boxes.restorePP(mon) + Boxes.enterBox(mon) return true, mon end diff --git a/src/core/gen2/BugContest.lua b/src/core/gen2/BugContest.lua index ffd332d5..6dc1521b 100644 --- a/src/core/gen2/BugContest.lua +++ b/src/core/gen2/BugContest.lua @@ -803,7 +803,9 @@ function BugContest.collectCaughtMon(save, partySize, boxes) end boxes = boxes or require("src.core.gen2.Boxes") local box = boxes.box(save, save.currentBox or 1) - if box then box[#box + 1] = mon end + -- .TryAddToBox copies BOXMON_STRUCT_LENGTH and tails into + -- RestorePPOfDepositedPokemon (engine/pokemon/caught_nickname.asm:72-90). + if box then box[#box + 1] = boxes.enterBox(mon) end return BugContest.BOXED_MON, mon end diff --git a/src/core/gen2/Save.lua b/src/core/gen2/Save.lua index b9faa345..dd10851c 100644 --- a/src/core/gen2/Save.lua +++ b/src/core/gen2/Save.lua @@ -298,9 +298,11 @@ Save.DEFAULT_OPTIONS = { -- uses (src/core/SaveData.lua) and they drive the same shared modules, so -- a player's display and speed choices mean the same thing in both games. speed = 1, -- GameSpeed.LEVELS multiplier, logic only + -- graphics performance tier: auto | high | balanced | low. "auto" is the + -- Gen 1 save's own default (src/core/SaveData.lua); same key, same module. + performance = "auto", zoom = 0, -- Zoom offset from the window's fit scale tilt = 0, -- Tilt.LEVELS degrees, 0 = off - gbcfx = 0, -- GBCFX ladder, 0 = off -- COLOR: GbcPalette.MODES. "gbc" is the cart's own palettes and the -- default -- this is a Game Boy Color game, so colour is ON out of the box -- and the other two rungs are the deliberate step DOWN to a grey or green @@ -309,6 +311,8 @@ Save.DEFAULT_OPTIONS = { color = "gbc", videoMode = "windowed", fpsCap = 60, + -- BATTLE BG (#1709): white | black, the surround around the battle screen. + battleBg = "white", -- VOID FILL: fade | water | trees | black. fade is each map header's own -- border block with the dissolve across a boundary (#1418). voidFill = "fade", diff --git a/src/import/LauncherSettings.lua b/src/import/LauncherSettings.lua index 7d828cab..3739dd8a 100644 --- a/src/import/LauncherSettings.lua +++ b/src/import/LauncherSettings.lua @@ -266,18 +266,6 @@ local function coreRows(opts, hooks) end) end - -- issue #136: GBC FX soft-bricks the mobile present shader; same gate as - -- the in-game row. - local okFx, GBCFX = pcall(require, "src.render.GBCFX") - if okFx and GBCFX.isSupported() then - add(Strings("GBC FX"), - function() return GBCFX.levelLabel(opts.gbcfx or 0) end, - function(dir) - opts.gbcfx = wrapIndex((opts.gbcfx or 0) + dir, 5) - return true - end) - end - local okZ, Zoom = pcall(require, "src.render.Zoom") if okZ then add(Strings("ZOOM"), @@ -678,17 +666,6 @@ local function gen2Rows(opts, hooks) end) end - -- Same #136 gate as the Gen 1 row and the in-game one. - local okFx, GBCFX = pcall(require, "src.render.GBCFX") - if okFx and GBCFX.isSupported() then - add(Strings("GBC FX"), - function() return GBCFX.levelLabel(opts.gbcfx or 0) end, - function(dir) - opts.gbcfx = wrapIndex((opts.gbcfx or 0) + dir, 5) - return true - end) - end - local okVm, VideoMode = pcall(require, "src.core.VideoMode") if okVm then add(Strings("VIDEO MODE"), @@ -709,6 +686,10 @@ local function gen2Rows(opts, hooks) end) end + -- BATTLE BG (#1709): the WHITE/BLACK pair Gold's battle screen honours. + add(Strings("BATTLE BG"), ladder(opts, "battleBg", + { { "white", "WHITE" }, { "black", "BLACK" } }, "white")) + addTouchRows(rows, add, opts, hooks) return rows diff --git a/src/import/LauncherView.lua b/src/import/LauncherView.lua index fae3cfe4..fe8b77e9 100644 --- a/src/import/LauncherView.lua +++ b/src/import/LauncherView.lua @@ -417,14 +417,27 @@ local function shellColor(hex) return { tonumber(r, 16), tonumber(g, 16), tonumber(b, 16) } end +-- The real Crystal shell is glitter-flecked translucent plastic over a foil +-- label, so it is the one stock cart that ships with a finish. +local STOCK_FINISH = { crystal = "sparkle+holo" } + +local function finishFlags(name) + name = tostring(name or "") + return name:find("sparkle", 1, true) ~= nil, name:find("holo", 1, true) ~= nil +end + local function cartSkin(imp, version) local row = imp.activeCartRow and imp:activeCartRow(version) or nil if not row then + local sparkle, holo = finishFlags(STOCK_FINISH[version]) return { cacheKey = version, color = cartColor(version), + sparkle = sparkle, holo = holo, labelPath = "assets/labels/" .. tostring(version) .. ".png" } end + local sparkle, holo = finishFlags(row.finish) return { cacheKey = "cart:" .. tostring(row.id), color = shellColor(row.shell) or cartColor(version), + sparkle = sparkle, holo = holo, name = row.title, cart = row, cartId = row.id } end @@ -572,8 +585,56 @@ vec4 position(mat4 transform_projection, vec4 vertex_position) { #endif #ifdef PIXEL +// finish: 0 plain, 1 sparkle (glitter suspended in the shell), 2 holographic +// label sweep. Both are ours, not ported from anywhere. +extern float finish; +extern float finish_time; +extern float finish_spin; + +float sparkHash(vec2 p) { + return fract(sin(dot(p, vec2(41.7321, 289.113))) * 43758.5453); +} + +// Flecks live on a jittered lattice so they read as suspended grains rather +// than a regular grid, and each one twinkles on its own phase. +vec3 sparkle(vec2 screen_coords) { + vec2 cell = screen_coords / 19.0; + vec2 id = floor(cell); + vec2 f = fract(cell); + float peak = 0.0; + for (int oy = -1; oy <= 1; oy++) { + for (int ox = -1; ox <= 1; ox++) { + vec2 n = vec2(float(ox), float(oy)); + vec2 h = vec2(sparkHash(id + n), sparkHash(id + n + 17.0)); + float phase = sparkHash(id + n + 71.0) * 6.2831; + float tw = sin(finish_time * 2.6 + phase + finish_spin * 3.0) * 0.5 + 0.5; + float d = length(f - (n + h)); + peak = max(peak, smoothstep(0.13, 0.0, d) * pow(tw, 16.0)); + } + } + return vec3(peak); +} + +// Angle-dependent spectral sweep: a diagonal band whose hue walks with view +// angle, so tilting the cart moves the rainbow the way real foil does. +vec3 holo(vec2 uv) { + float band = uv.x * 0.9 + uv.y * 0.6 + finish_spin * 0.55 + finish_time * 0.06; + vec3 hue = 0.5 + 0.5 * cos(6.2831 * (band + vec3(0.0, 0.33, 0.67))); + float interference = 0.5 + 0.5 * sin((uv.x - uv.y) * 62.0 + finish_time * 0.9); + return hue * (0.55 + 0.45 * interference); +} + vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) { - return Texel(tex, texture_coords) * color; + vec4 px = Texel(tex, texture_coords) * color; + if (finish > 1.5) { + vec3 sheen = holo(texture_coords); + float lum = dot(px.rgb, vec3(0.299, 0.587, 0.114)); + px.rgb = mix(px.rgb, px.rgb * (0.65 + sheen), 0.30 * (0.35 + 0.65 * lum)); + px.rgb += sheen * 0.05 * px.a; + } else if (finish > 0.5) { + px.rgb += sparkle(screen_coords) * 0.70 * px.a; + } + return px; } #endif ]] @@ -601,6 +662,18 @@ local function cartSendHover(shader, mx, my, hovering, screenScale) return ok end +-- FINISH_* match the shader's `finish` uniform. +local FINISH_NONE, FINISH_SPARKLE, FINISH_HOLO = 0, 1, 2 + +local function cartSendFinish(shader, mode, spin) + if not shader or not shader.send then return end + pcall(function() + shader:send("finish", mode) + shader:send("finish_time", Kit.time or 0) + shader:send("finish_spin", spin or 0) + end) +end + local function cartridgeButton(imp, x, y, w, h, key, skin, gameName, action) local state = cartridgeState(imp, skin.cacheKey) markNoDrag(imp, x, y, w, h) @@ -723,6 +796,10 @@ local function cartridgeButton(imp, x, y, w, h, key, skin, gameName, action) love.graphics.rotate(juiceR * 2) love.graphics.translate(-cx, -cy) if useHover then love.graphics.setShader(shader) end + if useHover then + cartSendFinish(shader, skin.sparkle and FINISH_SPARKLE or FINISH_NONE, + state.spin) + end local capH = h * 3 / 65 local mainTop = -halfH + capH @@ -837,6 +914,9 @@ local function cartridgeButton(imp, x, y, w, h, key, skin, gameName, action) local labelPoints = cartQuad(project, labelX, labelY, labelW, labelH, faceZ + 1.2) local label = cartridgeLabel(imp, skin.cacheKey, skin.labelPath, skin.cartId) local mesh = label and cartLabelMesh(imp, skin.cacheKey, label, labelPoints) + if useHover and skin.holo then + cartSendFinish(shader, FINISH_HOLO, state.spin) + end if mesh then love.graphics.setColor(1, 1, 1, 1) love.graphics.draw(mesh) @@ -845,6 +925,10 @@ local function cartridgeButton(imp, x, y, w, h, key, skin, gameName, action) love.graphics.draw(label.image, labelPoints[1][1], labelPoints[1][2], 0, artScale, artScale) end + if useHover and skin.holo then + cartSendFinish(shader, skin.sparkle and FINISH_SPARKLE or FINISH_NONE, + state.spin) + end cartPolygon({ { project(-w * 0.07, h * 0.37, faceZ + 1) }, { project(w * 0.07, h * 0.37, faceZ + 1) }, @@ -863,6 +947,8 @@ local function modStatusColor(status) if status == "safe_mode" then return Strings("Safe mode"), PAL.yellow end if status == "needs_import" then return Strings("Import required"), PAL.yellow end if status == "conflict" then return Strings("Conflict"), PAL.red end + -- a cart pins it, but nothing on this install provides it + if status == "missing" then return Strings("Not installed"), PAL.red end -- not a fault: the mod is intact, this is simply not a game it is for -- (src/mods/ModTargets.lua) if status == "other_game" then return Strings("Not for this game"), PAL.muted end @@ -971,6 +1057,28 @@ local function buildModScopeRow(imp, x, y, w, m) return h + math.floor(8 * m.s) end +-- Says whose mod list is on screen when a cart owns it, and what its seal +-- lets the player do with it. +local function buildModCartRow(imp, x, y, w, m, cartId, report) + if not cartId then return 0 end + local title = (report and report.title) or cartId + local seal = (report and report.seal) or "sealed" + local line + if seal == "sealed+" then + line = Strings("%s pins these mods. You may switch any of them on or off, but not add or remove any.", + title) + elseif seal == "open" then + line = Strings("%s pins these mods. Anything it ships switched off is yours to switch on.", + title) + else + line = Strings("%s is sealed: these are its mods, and they run exactly as pinned. Break the seal on the cart's own page to change that.", + title) + end + local h = Kit.textWrapped("small", line, x, y, w, + seal == "sealed" and PAL.yellow or PAL.blue, 3) + return h + math.floor(8 * m.s) +end + local function buildSaveCartRow(imp, x, y, w, m) local version = imp.modScope local h = m.btnH @@ -1000,6 +1108,12 @@ local function buildSaveCartRow(imp, x, y, w, m) return h + gap end +-- The launcher's name for a game id, where all a row has is the id. +local function gameLabel(version) + local info = GameVersion.info(version) + return (info and (info.launcherName or info.displayName)) or tostring(version) +end + local function findActionFor(entry, installedVersion) local ModIndex = require("src.mods.ModIndex") if not ModIndex.canInstall(entry) then @@ -1837,6 +1951,11 @@ local function SEAL_LABEL(armed) return armed and Strings("Break it") or Strings("Break the seal") end +local function FILL_LABEL(count) + if count > 1 then return Strings("Install %d required mods", count) end + return Strings("Install required mods") +end + local function sealSlotName(slot) if not slot then return nil end if type(slot.label) == "string" and slot.label ~= "" then return slot.label end @@ -1849,16 +1968,25 @@ local function buildCartCard(imp, x, y, w, m, version) if not report then return 0 end local title = tostring(report.title or report.id or "") local broken = (slot and slot.sealBroken == true) or false + local fillCount = imp.cartFillRows and #imp:cartFillRows(version) or 0 local state, stateCol, body = nil, PAL.green, {} if report.refused then state, stateCol = Strings("This cart will not start"), PAL.red body[#body + 1] = { report.message, PAL.detail } + if fillCount > 0 then + body[#body + 1] = { Strings("Install the mods it pins to play it the way its author built it."), + PAL.detail } + end body[#body + 1] = { Strings("Break the seal to play it with the mods you have."), PAL.detail } elseif broken then state, stateCol = Strings("Seal broken"), PAL.yellow body[#body + 1] = { Strings("This save loads the cart's pinned mods first, then your other enabled mods. It is marked modified."), PAL.detail } + elseif report.seal == "sealed+" then + state = Strings("Sealed - ready to play") + body[#body + 1] = { Strings("This cart loads only the mods it pins. You can switch any of them on or off."), + PAL.detail } elseif report.sealed then state = Strings("Sealed - ready to play") body[#body + 1] = { Strings("This cart loads only the mods it pins."), @@ -1883,15 +2011,41 @@ local function buildCartCard(imp, x, y, w, m, version) PAL.yellow } body[#body + 1] = { Strings("Press Break it again to do it."), PAL.yellow } end + -- What the last install run managed, and per mod what it could not. + local fillNotice = imp.cartFillNotice + if fillNotice then + body[#body + 1] = { fillNotice.text, + fillNotice.ok and PAL.green or PAL.red } + for _, line in ipairs(fillNotice.failures or {}) do + body[#body + 1] = { line, PAL.red } + end + end local pad = math.floor(14 * m.s) local iw = w - 2 * pad - local chipH = offer and math.max(Kit.tapMin(), math.floor(30 * m.s)) or 0 + local fillLabel = FILL_LABEL(fillCount) + local chipGap = math.floor(8 * m.s) + local chipH = math.max(Kit.tapMin(), math.floor(30 * m.s)) + local fillW = fillCount > 0 + and math.min(iw, chipWidth(fillLabel, m)) or 0 + local sealW = offer and math.min(iw, math.max(chipWidth(SEAL_LABEL(false), m), + chipWidth(SEAL_LABEL(true), m))) or 0 + -- Both chips share a row when they fit; a narrow card stacks them instead. + local sideBySide = fillW > 0 and sealW > 0 + and (fillW + chipGap + sealW) <= iw + local chipRows = 0 + if fillW > 0 then chipRows = chipRows + 1 end + if sealW > 0 then chipRows = chipRows + 1 end + if sideBySide then chipRows = 1 end + if chipRows == 0 then chipH = 0 end + local h = pad + Kit.textHeight("button") + math.floor(4 * m.s) for _, line in ipairs(body) do h = h + Kit.wrapHeight("small", line[1] or "", iw, 3) end - if offer then h = h + math.floor(8 * m.s) + chipH end + if chipRows > 0 then + h = h + math.floor(8 * m.s) + chipRows * chipH + (chipRows - 1) * chipGap + end h = h + pad Kit.card(x, y, w, h) @@ -1902,14 +2056,23 @@ local function buildCartCard(imp, x, y, w, m, version) cy = cy + Kit.textWrapped("small", line[1] or "", x + pad, cy, iw, line[2], 3) end - if offer then + if chipRows > 0 then cy = cy + math.floor(8 * m.s) - local cw = math.max(chipWidth(SEAL_LABEL(false), m), - chipWidth(SEAL_LABEL(true), m)) - btn(imp, x + pad, cy, cw, chipH, "seal-" .. scope, SEAL_LABEL(armed), { - kind = "danger", font = "small", keepArm = true, - action = function() imp:pressBreakSeal(version) end, - }) + local bx = x + pad + if fillW > 0 then + btn(imp, bx, cy, fillW, chipH, "cart-fill-" .. scope, fillLabel, { + kind = "primary", font = "small", + action = function() imp:pressInstallCartMods(version) end, + }) + if sideBySide then bx = bx + fillW + chipGap + else cy = cy + chipH + chipGap end + end + if sealW > 0 then + btn(imp, bx, cy, sealW, chipH, "seal-" .. scope, SEAL_LABEL(armed), { + kind = "danger", font = "small", keepArm = true, + action = function() imp:pressBreakSeal(version) end, + }) + end end return h end @@ -2182,6 +2345,10 @@ local function buildModsPanel(imp, x, y, w, availH, m) local mods = imp.mods or {} local gap = m.gap local cy = y + local cartId, cartReport + if imp.modCartPlan then cartId, cartReport = imp:modCartPlan() end + -- a cart owns its mod set: only the pins it already ships may be switched + local bulkOk = not safeMode and cartId == nil -- header: progressive action cluster. Surfaces primary/frequent actions -- (Import, Updates, Sort) directly on the bar across screen sizes, placing @@ -2210,11 +2377,11 @@ local function buildModsPanel(imp, x, y, w, availH, m) action = function() imp:chooseMod() end }) btn(imp, place(disableW), cy, disableW, bh, "mods-disable-all", Strings("Disable all"), { kind = "warn", font = "small", - enabled = not safeMode, + enabled = bulkOk, action = function() imp:_setAllMods(false) end }) btn(imp, place(enableW), cy, enableW, bh, "mods-enable-all", Strings("Enable all"), { kind = "good", font = "small", - enabled = not safeMode, + enabled = bulkOk, action = function() imp:_setAllMods(true) end }) btn(imp, place(checkFullW), cy, checkFullW, bh, "mods-check-updates", Strings("Check for updates"), { font = "small", @@ -2275,6 +2442,7 @@ local function buildModsPanel(imp, x, y, w, availH, m) + math.floor(8 * m.s) cy = cy + buildModScopeRow(imp, x, cy, w, m) + cy = cy + buildModCartRow(imp, x, cy, w, m, cartId, cartReport) cy = cy + buildSaveCartRow(imp, x, cy, w, m) if #mods == 0 then @@ -2368,22 +2536,40 @@ local function buildModsPanel(imp, x, y, w, availH, m) -- These answer separate games, not a single shared install flag. The -- importer receives the game id so an experimental confirmation also - -- applies only to the checkbox the player pressed. + -- applies only to the checkbox the player pressed. A cart's pin answers + -- one game -- the cart's -- so it gets one switch instead of the row. local flipped = false local gamesY = ry + math.floor(8 * m.s) + textH + math.floor(8 * m.s) - Kit.text("micro", gamesLabel, px, - gamesY + (togH - Kit.textHeight("micro")) / 2, PAL.muted) - local tx = px + Kit.textWidth("micro", gamesLabel) + math.floor(10 * m.s) - for _, game in ipairs(GameVersion.ORDER) do - local togKey = "mod-toggle-" .. mod.id .. "-" .. game - if modGameCheckbox(tx, gamesY, togH, - mod.enabledByVersion and mod.enabledByVersion[game] == true, - game, togKey, not safeMode) then - local version = game - queueAction(imp, togKey, function() imp:_toggleMod(mod.id, nil, version) end) + local rowLabel = gamesLabel + if mod.cartPin then + rowLabel = mod.cartTogglable and Strings("In this cart:") + or Strings("Pinned, sealed:") + end + Kit.text("micro", rowLabel, px, + gamesY + (togH - Kit.textHeight("micro")) / 2, + mod.cartPin and not mod.cartTogglable and PAL.yellow or PAL.muted) + local tx = px + Kit.textWidth("micro", rowLabel) + math.floor(10 * m.s) + if mod.cartPin then + local togKey = "mod-toggle-" .. mod.id .. "-cart" + -- pressable even when the seal refuses it, so the panel can say why + if modGameCheckbox(tx, gamesY, togH, mod.enabled == true, + mod.cartBase or "red", togKey, not safeMode) then + queueAction(imp, togKey, function() imp:_toggleMod(mod.id, nil, nil) end) flipped = true end tx = tx + togH + togGap + else + for _, game in ipairs(GameVersion.ORDER) do + local togKey = "mod-toggle-" .. mod.id .. "-" .. game + if modGameCheckbox(tx, gamesY, togH, + mod.enabledByVersion and mod.enabledByVersion[game] == true, + game, togKey, not safeMode) then + local version = game + queueAction(imp, togKey, function() imp:_toggleMod(mod.id, nil, version) end) + flipped = true + end + tx = tx + togH + togGap + end end -- The checkboxes sit inside the row's rect, so their press also passes the -- row hit test; `flipped` gates the row action to everywhere else. @@ -2399,17 +2585,27 @@ local function buildModsPanel(imp, x, y, w, availH, m) -- in-game manager shows (src/mods/ModTargets.lua) local gamesW = mod.targets and Kit.textWidth("micro", mod.targets) + math.floor(12 * m.s) or 0 + -- the cart's own list, not the player's: every row says so + local pinLabel = mod.cartPin and Strings("PINNED") or nil + local pinW = pinLabel + and Kit.textWidth("micro", pinLabel) + math.floor(12 * m.s) or 0 local nameShown = Kit.ellipsize("button", mod.name, - textW - badgeW - gamesW - math.floor(12 * m.s)) + textW - badgeW - gamesW - pinW - math.floor(12 * m.s)) local headingCol = isFullyDisabled and PAL.muted or PAL.heading Kit.text("button", nameShown, px, ly, headingCol) local tagX = px + Kit.textWidth("button", nameShown) + math.floor(8 * m.s) Kit.tag(tagX, ly, badgeW, Kit.textHeight("button"), mod.badge, mod.experimental and PAL.yellow or PAL.muted) + tagX = tagX + badgeW + math.floor(4 * m.s) if mod.targets then - Kit.tag(tagX + badgeW + math.floor(4 * m.s), ly, gamesW, + Kit.tag(tagX, ly, gamesW, Kit.textHeight("button"), mod.targets, mod.targetsHere == false and PAL.steel or PAL.blue) + tagX = tagX + gamesW + math.floor(4 * m.s) + end + if pinLabel then + Kit.tag(tagX, ly, pinW, Kit.textHeight("button"), pinLabel, + mod.cartTogglable and PAL.blue or PAL.yellow) end ly = ly + Kit.textHeight("button") + math.floor(4 * m.s) @@ -2830,14 +3026,45 @@ local function buildBugPanel(imp, x, y, w, availH, m) end }) end +-- FIND tab: which half of the feed is on screen, in the same chip idiom the +-- MODS tab's scope row uses. The counts say which half is worth pressing. +local function buildFindKindRow(imp, x, y, w, m) + local h = math.max(Kit.tapMin(), math.floor(26 * m.s)) + local gap = math.floor(6 * m.s) + local label = Strings("Browse:") + Kit.text("small", label, x, y + (h - Kit.textHeight("small")) / 2, PAL.muted) + local cx = x + Kit.textWidth("small", label) + math.floor(10 * m.s) + local options = { + { id = "mods", label = Strings("Mods"), + n = #((imp.findIndex and imp.findIndex.mods) or {}) }, + { id = "carts", label = Strings("Carts"), + n = #((imp.findIndex and imp.findIndex.carts) or {}) }, + } + for _, opt in ipairs(options) do + local text = ("%s (%d)"):format(opt.label, opt.n) + local cw = Kit.textWidth("micro", text) + math.floor(18 * m.s) + if cx + cw > x + w then break end + if Kit.chip(cx, y, cw, h, text, imp.findKind == opt.id, PAL.lineStrong, + "find-kind-" .. opt.id) then + local want = opt.id + queueAction(imp, "find-kind-" .. want, + function() imp:_setFindKind(want) end) + end + cx = cx + cw + gap + end + return h + math.floor(8 * m.s) +end + local function buildFindPanel(imp, x, y, w, availH, m) imp:_ensureFind() imp:_ensureMods() local ModIndex = require("src.mods.ModIndex") local ModUpdate = require("src.mods.ModUpdate") local sources = imp.findSources or {} + local carts = imp.findKind == "carts" local rows = imp:_findRows() - local total = #((imp.findIndex and imp.findIndex.mods) or {}) + local total = #((imp.findIndex + and (carts and imp.findIndex.carts or imp.findIndex.mods)) or {}) local gap = m.gap local cy = y @@ -2868,6 +3095,8 @@ local function buildFindPanel(imp, x, y, w, availH, m) return (cy - y) + h end + cy = cy + buildFindKindRow(imp, x, cy, w, m) + -- One row: the search field, then Filter / Sort / Indexes popup buttons. local fieldH = math.max(Kit.tapMin(), math.floor(36 * m.s)) local bgap = math.floor(6 * m.s) @@ -2880,22 +3109,31 @@ local function buildFindPanel(imp, x, y, w, availH, m) btn(imp, place(sw), cy, sw, fieldH, "find-sort", Strings("Sort"), { font = "small", action = function() imp._sortPopup = "find" end }) - -- The Filter button carries its state: blue while a category is active, - -- so a filtered-down list never reads as "the index shrank". + -- The Filter button carries its state: blue while a category (mods) or a + -- base game (carts) is active, so a filtered-down list never reads as "the + -- index shrank". + local activeFilter = carts and imp.findBase or imp.findCategory local fw = Kit.textWidth("small", Strings("Filter")) + math.floor(20 * m.s) btn(imp, place(fw), cy, fw, fieldH, "find-filter", Strings("Filter"), { - kind = imp.findCategory and "accent" or "ghost", font = "small", + kind = activeFilter and "accent" or "ghost", font = "small", action = function() imp._filterPopup = true end }) local searchW = place(0) - x - bgap textField(imp, x, cy, searchW, fieldH, "find-search", imp.findQuery or "", - Strings("Search mods"), imp._findSearchFocus == true, + carts and Strings("Search carts") or Strings("Search mods"), + imp._findSearchFocus == true, function() imp:_toggleFindSearchFocus() end) cy = cy + fieldH + math.floor(8 * m.s) if #rows == 0 then - Kit.emptyBox(x, cy, w, math.floor(110 * m.s), - (total == 0) and Strings("This index lists no mods yet.") - or Strings("No mods match that search.")) + local empty + if carts then + empty = (total == 0) and Strings("This index lists no carts yet.") + or Strings("No carts match that search.") + else + empty = (total == 0) and Strings("This index lists no mods yet.") + or Strings("No mods match that search.") + end + Kit.emptyBox(x, cy, w, math.floor(110 * m.s), empty) return (cy - y) + math.floor(110 * m.s) end @@ -2995,7 +3233,7 @@ local function buildFindPanel(imp, x, y, w, availH, m) if imp:_findThumbPending(entry.id) then Kit.spinner(px + thumb / 2, ly + thumb / 2, thumb * 0.28) else - Kit.textCenter("micro", "MOD", px, + Kit.textCenter("micro", carts and "CART" or "MOD", px, ly + (thumb - Kit.textHeight("micro")) / 2, thumb, PAL.faint) end end @@ -3018,7 +3256,12 @@ local function buildFindPanel(imp, x, y, w, availH, m) or nil local rest = {} if entry.author then rest[#rest + 1] = entry.author end - if entry.categories and entry.categories[1] then + if carts then + -- A cart has no categories; the game it plays as and its seal are what + -- a reader is actually choosing between. + rest[#rest + 1] = gameLabel(entry.base) + if entry.seal then rest[#rest + 1] = entry.seal end + elseif entry.categories and entry.categories[1] then rest[#rest + 1] = entry.categories[1] end if dates then @@ -3300,6 +3543,8 @@ local function buildConfirmModal(imp, m) imp._modConfirm = nil if c.indexEntry then imp:_findInstall(c.indexEntry) + elseif c.kind == "cartPins" then + imp:_installCartPins(c.version, c.id) elseif c.kind == "update" then imp:_confirmModUpdate(c.id, c.release) elseif c.kind == "enableAll" then @@ -3624,12 +3869,15 @@ local function buildModHeaderActionsModal(imp, m) local pad = math.floor(18 * m.s) local w = math.floor(380 * m.s) local gap = math.floor(8 * m.s) + -- same gate as the header cluster: a cart's mod set is not bulk-editable + local bulkOk = not imp.safeMode + and not (imp.modCartPlan and imp:modCartPlan()) local btns = { { label = Strings("Mod profiles..."), action = function() imp._profilesPopup = true end }, { label = Strings("Check for updates"), action = function() imp:_syncModUpdateInfo(true) end }, - { label = Strings("Enable all mods"), kind = "good", enabled = not imp.safeMode, + { label = Strings("Enable all mods"), kind = "good", enabled = bulkOk, action = function() imp:_setAllMods(true) end }, - { label = Strings("Disable all mods"), kind = "warn", enabled = not imp.safeMode, + { label = Strings("Disable all mods"), kind = "warn", enabled = bulkOk, action = function() imp:_setAllMods(false) end }, { label = Strings("Sort mods..."), action = function() imp._sortPopup = "mods" end }, } @@ -3760,8 +4008,10 @@ local function buildGameModal(imp, m) action = function() imp._gamePopup = nil end }) end +local SEAL_WORD = { open = "open", ["sealed+"] = "sealed+" } + local function cartRowLabel(row) - local seal = (row.seal == "open") and Strings("open") or Strings("sealed") + local seal = Strings(SEAL_WORD[row.seal] or "sealed") return Strings("%s - v%s - %s", tostring(row.title or row.id), tostring(row.version or "?"), seal) end @@ -3828,11 +4078,12 @@ local function buildCartModal(imp, m) Kit.pager(px + pad, cy, pw - 2 * pad, cur, #rows, perPage, pageKey)) cy = cy + pagerH + gap end + local FilePicker = require("src.core.FilePicker") btn(imp, px + pad, cy, pw - 2 * pad, rowH, "cartpop-more", - Strings("Get more carts"), { kind = "accent", font = "small", - action = function() - imp._cartNotice = Strings("Browsing for carts arrives in a later update.") - end }) + FilePicker.available() and Strings("Import a cart") + or Strings("Get more carts"), + { kind = "accent", font = "small", + action = function() imp:importCartFile(version) end }) cy = cy + rowH + gap btn(imp, px + pad, cy, pw - 2 * pad, rowH, "cartpop-close", Strings("Close"), { font = "small", @@ -3949,12 +4200,17 @@ local function buildCartSaveModal(imp, m) PAL.muted) end --- Category filter for FIND MODS. Two columns, because an index can list --- enough categories to overflow a single stacked column on a short window. +-- Category filter for FIND MODS, base-game filter for FIND CARTS (a cart has +-- no categories). Two columns, because an index can list enough categories +-- to overflow a single stacked column on a short window. local function buildFilterModal(imp, m) - local cats = (imp.findIndex and imp.findIndex.categories) or {} + local carts = imp.findKind == "carts" + local keys = (imp.findIndex + and (carts and imp.findIndex.baseGames or imp.findIndex.categories)) or {} local items = { { key = nil, label = Strings("All") } } - for _, c in ipairs(cats) do items[#items + 1] = { key = c, label = c } end + for _, c in ipairs(keys) do + items[#items + 1] = { key = c, label = carts and gameLabel(c) or c } + end local pad = math.floor(18 * m.s) local w = math.floor(440 * m.s) local gap = math.floor(8 * m.s) @@ -3963,18 +4219,20 @@ local function buildFilterModal(imp, m) + nrows * (m.btnH + gap) + m.btnH + pad local px, py, pw = modalPanel(m, w, h) local cy = py + pad - Kit.text("button", Strings("Filter by category"), px + pad, cy, PAL.heading) + Kit.text("button", carts and Strings("Filter by base game") + or Strings("Filter by category"), px + pad, cy, PAL.heading) cy = cy + Kit.textHeight("button") + math.floor(12 * m.s) local colW = math.floor((pw - 2 * pad - gap) / 2) + local active = carts and imp.findBase or imp.findCategory for i, it in ipairs(items) do local bx = px + pad + ((i - 1) % 2) * (colW + gap) local by = cy + math.floor((i - 1) / 2) * (m.btnH + gap) local key = it.key btn(imp, bx, by, colW, m.btnH, "filterpop-" .. (key or "all"), it.label, { - kind = (imp.findCategory == key) and "primary" or "ghost", + kind = (active == key) and "primary" or "ghost", font = "small", action = function() - imp.findCategory = key + if carts then imp.findBase = key else imp.findCategory = key end setPage(imp, "find", 1) imp._filterPopup = nil end }) @@ -4332,8 +4590,14 @@ local function buildFindEntryModal(imp, m) end trend = (#trend > 0) and table.concat(trend, " - ") or nil local trendH = trend and (Kit.textHeight("small") + math.floor(2 * m.s)) or 0 + -- What a cart actually is: a pinned mod list. Its own page installs them; + -- this popup only ever installs the cart file. + local pins = ModIndex.isCart(entry) + and Strings("Pins %d mod(s) - install them from the cart's own page", + #(entry.mods or {})) or nil + local pinsH = pins and (Kit.textHeight("small") + math.floor(2 * m.s)) or 0 local h = pad + Kit.textHeight("button") + math.floor(4 * m.s) - + Kit.textHeight("small") + trendH + noteH + math.floor(12 * m.s) + + Kit.textHeight("small") + trendH + pinsH + noteH + math.floor(12 * m.s) + nBtns * (m.btnH + gap) - gap + pad local px, py, pw = modalPanel(m, w, h) local cy = py + pad @@ -4342,7 +4606,10 @@ local function buildFindEntryModal(imp, m) cy = cy + Kit.textHeight("button") + math.floor(4 * m.s) local lead = "v" .. tostring(ModIndex.displayVersion(entry)) if entry.author then lead = lead .. " - " .. entry.author end - if entry.categories and entry.categories[1] then + if ModIndex.isCart(entry) then + lead = lead .. " - " .. gameLabel(entry.base) + if entry.seal then lead = lead .. " - " .. entry.seal end + elseif entry.categories and entry.categories[1] then lead = lead .. " - " .. entry.categories[1] end local dl = stats and ModUpdate.downloadsShort(stats.total) or nil @@ -4359,6 +4626,12 @@ local function buildFindEntryModal(imp, m) px + pad, cy, PAL.muted) cy = cy + Kit.textHeight("small") end + if pins then + cy = cy + math.floor(2 * m.s) + Kit.text("small", Kit.ellipsize("small", pins, pw - 2 * pad), + px + pad, cy, PAL.muted) + cy = cy + Kit.textHeight("small") + end if note then cy = cy + math.floor(4 * m.s) Kit.text("small", note, px + pad, cy, PAL.green) diff --git a/src/import/RomExtractorGen2.lua b/src/import/RomExtractorGen2.lua index 0de65b5d..9584a9b6 100644 --- a/src/import/RomExtractorGen2.lua +++ b/src/import/RomExtractorGen2.lua @@ -1386,11 +1386,9 @@ end -- tiles, no sheet of its own. So the rows here point at the icon sheets -- extractIcons already writes rather than at a second copy of them. -- --- One frame, not two. _DoesSpriteHaveFacings sends everything from --- SPRITE_POKEMON up to .only_down, and a doll is a still object that never --- steps, so the only OAM set it ever uses is FacingStepDown0 -- tiles $00..$03, --- the icon's FIRST frame (data/sprites/facings.asm). The second frame is the --- party menu's bob and never reaches the map. +-- Two frames: SPRITEMOVEDATA_POKEMON's OBJECT_ACTION_BOUNCE swaps +-- FacingStepDown0's tiles $00..$03 for FacingStepUp0's $04..$07 (#1748). +-- data/sprites/map_objects.asm:181-187, engine/overworld/map_object_action.asm:184 -- -- Palette 0 because _GetSpritePalette answers `xor a` for every mon sprite, -- which is PAL_OW_RED in the MapObjectPals set. @@ -1418,7 +1416,7 @@ function RomExtractorGen2:extractMonSprites(out) id = constName, source = ("ROM:SpriteMons[%d]"):format(row), image = "assets/generated/icons/gen2/" .. base .. ".png", - frames = 1, + frames = 2, walker = false, spriteType = "POKEMON_SPRITE", palette = SPRITE_PALETTE_NAME[0], @@ -4039,6 +4037,12 @@ function RomExtractorGen2:splashGfx() local fade = self:symbol("GameFreakDittoPaletteFade") out.dittoFade = self:colors(fade.bank, fade.address, 16) end + -- gfx/splash/ditto.pal, the OBJ palette _CGB_GamefreakLogo loads + -- (../pokecrystal/engine/gfx/cgb_layouts.asm:876-893). + if self.symbols["_CGB_GamefreakLogo.GamefreakDittoPalette"] then + local pal = self:symbol("_CGB_GamefreakLogo.GamefreakDittoPalette") + out.dittoPalette = self:colors(pal.bank, pal.address, 4) + end return out end @@ -5844,6 +5848,21 @@ function RomExtractorGen2:extractMenuGfx() 8, 8, "emotes/grass_rustle.png", true) emotes.grassRustle = "assets/generated/emotes/grass_rustle.png" end + -- LoadFishingGFX (engine/events/fishing_gfx.asm:1-21): three 16x8 pose rows + -- over the standing frames' bottom tiles, then the rod tiles $fc/$fd (#1708). + local fishing = self.symbols["FishingGFX"] + if fishing then + self:write2bpp(self.rom:bytes(fishing[1], fishing[2], 8 * 16), + 16, 32, "emotes/fishing.png", true) + emotes.fishing = "assets/generated/emotes/fishing.png" + end + -- ../pokecrystal/engine/events/fishing_gfx.asm:41, Kris' half of that art. + local krisFishing = self.symbols["KrisFishingGFX"] + if krisFishing then + self:write2bpp(self.rom:bytes(krisFishing[1], krisFishing[2], 8 * 16), + 16, 32, "emotes/fishing_female.png", true) + emotes.fishingFemale = "assets/generated/emotes/fishing_female.png" + end out.emotes = emotes -- The Pokecenter heal machine's OBJ art (engine/events/heal_machine_anim diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index 2b0097f7..0c7074f6 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -161,6 +161,9 @@ local VERSION_REQUIRED_FILES_OVERRIDE = { "assets/generated/card_flip/card_flip_1.png", -- PCMailGFX (engine/pokemon/bills_pc.asm:2170-2173) "assets/generated/pc/mail_item.png", + -- FishingGFX (engine/events/fishing_gfx.asm:23): the pose rows and the rod + -- tiles, which a cache built before #1708 has none of. + "assets/generated/emotes/fishing.png", }, crystal = { "data/generated/constants.lua", @@ -208,6 +211,8 @@ local VERSION_REQUIRED_FILES_OVERRIDE = { "assets/generated/battle/player_back_female.png", "assets/generated/battle/trainers/kris.png", "assets/generated/battle/trainers/chris.png", + -- ../pokecrystal/engine/events/fishing_gfx.asm:38-42 + "assets/generated/emotes/fishing.png", }, } -- Same Gen 2 extract, so a Silver cache is complete when the same files exist. @@ -709,7 +714,7 @@ function RomImporter:ensureImportsDir() return false end --- NX mod zip inbox (separate from ROM imports/). Parent imports/ first — +-- NX mod zip inbox (separate from ROM imports/). Parent imports/ first -- -- love.filesystem.createDirectory does not create nested parents. function RomImporter:ensureModsInboxDir() self:ensureImportsDir() @@ -723,7 +728,7 @@ function RomImporter:ensureModsInboxDir() end -- NX raw .sav inbox per game: imports/saves/{red,blue,yellow}/. --- Parent imports/ then imports/saves/ first — createDirectory is not nested. +-- Parent imports/ then imports/saves/ first -- createDirectory is not nested. -- Creates all three version folders so MTP browsing shows where each game goes. function RomImporter:ensureSavesInboxDir(version) self:ensureImportsDir() @@ -797,7 +802,7 @@ local function listRomPaths(dir) local paths = {} for _, name in ipairs(love.filesystem.getDirectoryItems(dir) or {}) do -- Skip AppleDouble / hidden junk from Mac MTP (._cart.gb ends in .gb - -- but is not a ROM — rescan would try it first and block the real dump). + -- but is not a ROM -- rescan would try it first and block the real dump). if name:sub(1, 1) ~= "." then local path = (dir == "" or dir == "/") and name or (dir .. "/" .. name) if name:lower():match("%.gbc?$") @@ -872,7 +877,7 @@ local function listZipPaths(dir) local paths = {} for _, name in ipairs(love.filesystem.getDirectoryItems(dir) or {}) do -- Skip AppleDouble / hidden junk from Mac MTP (._foo.zip ends in .zip - -- but is not a PhysFS archive — mount fails with "could not be opened"). + -- but is not a PhysFS archive -- mount fails with "could not be opened"). if name:sub(1, 1) ~= "." then local path = (dir == "" or dir == "/") and name or (dir .. "/" .. name) if name:lower():match("%.zip$") @@ -888,7 +893,7 @@ local function listSavPaths(dir) local paths = {} for _, name in ipairs(love.filesystem.getDirectoryItems(dir) or {}) do -- Skip AppleDouble / hidden junk from Mac MTP (._foo.sav ends in .sav - -- but is not a real battery save — import would fail and invent noise). + -- but is not a real battery save -- import would fail and invent noise). if name:sub(1, 1) ~= "." then local path = (dir == "" or dir == "/") and name or (dir .. "/" .. name) if name:lower():match("%.sav$") @@ -1064,7 +1069,7 @@ function RomImporter:rescanSavesAction(version) elseif skipCount > 0 then self.saveNotice[version] = { ok = true, - text = Strings("Already imported — %d file(s) skipped. Check SAVE SLOT.", + text = Strings("Already imported: %d file(s) skipped. Check SAVE SLOT.", skipCount), } end @@ -1075,7 +1080,7 @@ end -- picking the first pending file would jump Yellow → Red (and switch the -- launcher tab via startData). Other known dumps stay for their own tabs. -- Junk (wrong size / unknown hash) still surfaces when nothing matches the --- tab and no other known dump is present — same feedback as before for a +-- tab and no other known dump is present -- same feedback as before for a -- lone bad file. function RomImporter:rescanAction(version) if self.workState == "working" then return end @@ -1130,7 +1135,7 @@ function RomImporter:rescanAction(version) status = Strings("No matching ROM found."), detail = Strings( "%s is matched by SHA-1 on this tab. Other dumps in imports/ stay " - .. "for their own tabs — open that game and Scan again.", label), + .. "for their own tabs; open that game and Scan again.", label), } return end @@ -1617,6 +1622,9 @@ function RomImporter.new(onComplete, opts) findLoaded = false, findSources = nil, findIndex = nil, findScroll = 0, findNotice = nil, findQuery = "", findCategory = nil, _findSearchFocus = false, _findThumbs = nil, + -- Which half of the feed the panel is browsing. Mods by default: carts + -- are the newer, much shorter list, and a feed may carry none at all. + findKind = "mods", findBase = nil, skinUrl = "", _skinUrlFocus = false, -- Page scroll offset (px) for the column under the tab bar -- panel, updater -- banner and footer -- used only while that column is taller than the window @@ -2223,7 +2231,7 @@ end -- Android mirrors ROM import: scan for a pending .zip in the save dir (USB -- or a fresh SAF drop), else love.system.pickFile("mod") -> picked_mod.zip -- which focus/Choose consumes on return. --- NX: no HostShell/desktop picker — rescan imports/mods/ inbox instead. +-- NX: no HostShell/desktop picker -- rescan imports/mods/ inbox instead. function RomImporter:chooseMod() if self.workState == "working" then return end if self.isNX then @@ -2517,7 +2525,7 @@ end -- "Import save" button: open a native .sav picker and import the pick. -- Android mirrors ROM / mod import via love.system.pickFile("sav"). --- NX: no HostShell/desktop picker — rescan imports/saves/ inbox instead. +-- NX: no HostShell/desktop picker -- rescan imports/saves/ inbox instead. function RomImporter:chooseSaveImport(version) if self.workState == "working" then return end version = self:_resolveSaveVersion(version) @@ -2820,6 +2828,8 @@ function RomImporter:update(dt) self:_pumpSync(dt) self:_pumpModCheck() self:_pumpModInstall() + self:_pumpCartInstall() + self:_pumpCartFill() self:_pumpExtract() -- Dev harness: POKEPORT_LAUNCHER_SHOT=/path.png resizes the window from -- POKEPORT_WIN=WxH, lets the view settle, then captures one frame and @@ -2854,6 +2864,10 @@ function RomImporter:update(dt) if os.getenv("POKEPORT_LAUNCHER_SETTINGS") == "1" then self:_openSettings() end + -- POKEPORT_LAUNCHER_FIND_KIND=mods|carts picks which half of the feed + -- the FIND tab is browsing; the switch is otherwise only a click. + local findKind = os.getenv("POKEPORT_LAUNCHER_FIND_KIND") + if findKind and findKind ~= "" then self:_setFindKind(findKind) end local query = os.getenv("POKEPORT_LAUNCHER_QUERY") if query and query ~= "" then self.findQuery = query @@ -3124,7 +3138,7 @@ function RomImporter:_updatePadCursor(dt) require("src.import.LauncherView").wheelmoved(self, 0, -overY / 48) end -- Desktop: FlexLove polls the real mouse, so warp it with the pad pointer. - -- NX: the getPosition bridge already returns pad coords — skip setPosition. + -- NX: the getPosition bridge already returns pad coords -- skip setPosition. if not self.isNX and love.mouse.setPosition then pcall(love.mouse.setPosition, self._padCursor.x, self._padCursor.y) self._lastMouseX, self._lastMouseY = self._padCursor.x, self._padCursor.y @@ -3512,7 +3526,11 @@ function RomImporter:_disableSkins() local SaveData = require("src.core.SaveData") local opts = SaveData.loadOptions() local tc = type(opts.touchControls) == "table" and opts.touchControls or {} - tc.enabled, tc.skin = false, nil + -- `enabled` is the pad's own switch, not a skins switch: turning a skin off + -- has to leave the built-in pad on, which is what the notice promises. A + -- skin can only be active while the pad is enabled, so this never overrides + -- a player who turned the pad off deliberately. + tc.enabled, tc.skin = true, nil opts.touchControls = tc SaveData.saveOptions(opts) self._skinNotice = { ok = true, text = "Skins are off. Mobile will use the built-in pad when needed." } @@ -4075,6 +4093,50 @@ end -- The view's open-folder affordance needs the same file:// encoding the old -- notice line used. +-- Desktop picks a .cart file; everywhere else CartStore's stray scan already +-- adopts anything dropped in the folder, so we just point at it. +function RomImporter:importCartFile(version) + local CartStore = require("src.carts.CartStore") + local FilePicker = require("src.core.FilePicker") + if not FilePicker.available() then + local dir = self:cartsDir() + self._cartNotice = dir + and Strings("Drop .cart files in %s, then reopen this list.", dir) + or Strings("No filesystem available to import from.") + return false + end + local path = FilePicker.open("Choose a cart", + { label = "Cart", exts = { CartStore.EXT:gsub("^%.", "") } }) + if not path then return false end + local bytes = FilePicker.read(path) + if not bytes then + self._cartNotice = Strings("Could not read %s", FilePicker.basename(path)) + return false + end + local cart, err = CartStore.install(bytes) + if not cart then + self._cartNotice = Strings("That cart could not be imported: %s", + tostring(err)) + return false + end + self:_refreshCarts(version) + self._cartNotice = Strings("Imported %s. It is in this list now.", + tostring(cart.title or cart.id)) + return true +end + +-- The real OS path of the cart folder, so the launcher can open it and so a +-- player can drop a .cart in by hand. +function RomImporter:cartsDir() + local CartStore = require("src.carts.CartStore") + local fs = love and love.filesystem + if not fs then return nil end + if fs.createDirectory then pcall(fs.createDirectory, CartStore.DIR) end + local base = fs.getSaveDirectory and fs.getSaveDirectory() + if not base or base == "" then return nil end + return base .. "/" .. CartStore.DIR +end + function RomImporter:fileUrl(path) return fileUrl(path) end @@ -4262,17 +4324,21 @@ function RomImporter:keypressed(key) end end +-- list, not index: index reads only the registry, so a .g1rcart dropped into +-- the carts folder by hand would never appear. list adopts strays and heals +-- the registry, and this is cached per version so it parses once. function RomImporter:_refreshCarts(version) local out = {} local ok, rows = pcall(function() - return require("src.carts.CartStore").index() + return require("src.carts.CartStore").listFor(version) end) if ok and type(rows) == "table" then - for _, row in ipairs(rows) do - if row.base == version then out[#out + 1] = row end - end + for _, row in ipairs(rows) do out[#out + 1] = row end end self.carts[version] = out + -- The FIND panel's installed-cart map spans every game, so it goes stale + -- on any cart change, not just this version's. + self._findCartMap = nil return out end @@ -4303,9 +4369,12 @@ end function RomImporter:_selectCart(version, id) self._cartPopup = nil self._cartNotice = nil + self.cartFillNotice = nil if id ~= nil and not self:_cartById(version, id) then return end self.activeCart[version] = id self._cartPlan = nil + -- the MODS panel answers for the cart now, so its cached rows are stale + self.mods, self._modSortCache = nil, nil local scope = self:slotScope(version) self.slots[scope] = nil self.slotScroll[scope] = nil @@ -4381,6 +4450,187 @@ function RomImporter:breakCartSeal(version) return ok and true or false end +-- ------- installing the mods a cart pins +-- +-- The other way out of a refusal: fetch every pin at the version the cart +-- names, verified against the sha256 it recorded, instead of breaking the seal. + +local function pinSameVersion(want, have) + local Semver = require("src.mods.Semver") + local order = Semver.compare(want, have) + if order ~= nil then return order == 0 end + return want == have +end + +-- Why a pin cannot be fetched. Only a github pin carries a repo, a version +-- and an archive hash, which is all three things an install needs. +local function pinUnresolvable(pin) + local source = type(pin) == "table" and pin.source or nil + if source == "gamebanana" then + return "is pinned to a GameBanana file, which the launcher cannot download" + end + if source == "local" then + return "is pinned to a copy on the machine that built the cart, so there is nothing to download" + end + if source ~= "github" then + return "carries no source the launcher can install from" + end + if type(pin.repo) ~= "string" or pin.repo == "" then + return "names no GitHub repository" + end + if type(pin.version) ~= "string" or pin.version == "" then + return "names no version to install" + end + if type(pin.sha256) ~= "string" or #pin.sha256 ~= 64 then + return "records no sha256, so its archive could not be verified" + end + return nil +end + +-- The pins the player cannot satisfy: absent, or installed at some other +-- version. A mismatch needs the PINNED version, so it queues like a gap. +function RomImporter:cartFillRows(version) + local report = self:cartPlan(version) + if type(report) ~= "table" then return {} end + local rows = {} + for _, row in ipairs(report.missing or {}) do + rows[#rows + 1] = { id = row.id, version = row.version, + pin = (report.pins or {})[row.id] } + end + for _, row in ipairs(report.mismatched or {}) do + rows[#rows + 1] = { id = row.id, version = row.version, + installed = row.installed, pin = (report.pins or {})[row.id] } + end + return rows +end + +-- A configured index already knows where a mod's archive lives, so it saves a +-- round trip -- but only when it points at exactly the pinned version. +function RomImporter:_cartPinIndexRelease(row) + local mods = self.findIndex and self.findIndex.mods or nil + if type(mods) ~= "table" then return nil end + local ModIndex = require("src.mods.ModIndex") + for _, entry in ipairs(mods) do + if type(entry) == "table" and entry.id == row.id + and pinSameVersion(row.version, ModIndex.displayVersion(entry)) then + local release = ModIndex.releaseFor(entry) + if type(release) == "table" and release.zip and release.zip.url then + return release + end + end + end + return nil +end + +function RomImporter:pressInstallCartMods(version) + if self._cartFill or self._modInstall or self._cartInstall then return false end + local rows = self:cartFillRows(version) + if #rows == 0 then return false end + self.cartFillNotice = nil + self._cartFill = { version = version, rows = rows, index = 0, + installed = 0, failures = {}, stage = "next" } + self:_pumpCartFill() + return true +end + +function RomImporter:_cartFillFailed(msg) + local job = self._cartFill + if not job then return end + local row = job.row + job.failures[#job.failures + 1] = + ("%s %s"):format(tostring(row and row.id or "?"), tostring(msg)) + job.stage = "next" +end + +function RomImporter:_finishCartFill() + local job = self._cartFill + self._cartFill = nil + self:_clearBusy() + -- Re-plan against what is on disk now, so the card answers for itself. + self._cartPlan = nil + pcall(self._refreshMods, self) + if not job then return end + if #job.failures == 0 then + self.cartFillNotice = { ok = true, + text = Strings("Installed %d of the mods this cart pins.", job.installed) } + return + end + self.cartFillNotice = { ok = false, failures = job.failures, + text = Strings("Installed %d of %d. %d could not be installed:", + job.installed, #job.rows, #job.failures) } +end + +function RomImporter:_pumpCartFill() + local job = self._cartFill + if not job then return end + local ModUpdate = require("src.mods.ModUpdate") + + if job.stage == "next" then + job.index = job.index + 1 + job.row = job.rows[job.index] + if not job.row then return self:_finishCartFill() end + local pin = job.row.pin + local why = pinUnresolvable(pin) + if why then return self:_cartFillFailed(why) end + local release = self:_cartPinIndexRelease(job.row) + if release then + job.release, job.stage = release, "install" + return + end + job.fetch = ModUpdate.beginFetchReleases(pin.repo, job.row.id, + { force = true }) + job.stage = "fetch" + self:_setBusy(Strings("Finding %s v%s", tostring(job.row.id), + tostring(job.row.version))) + return + end + + if job.stage == "fetch" then + local done, releases, err = ModUpdate.pumpFetchReleases(job.fetch) + if not done then return end + job.fetch = nil + if type(releases) ~= "table" then + return self:_cartFillFailed("could not be looked up: " + .. tostring(err or "release check failed")) + end + local pick + for _, rel in ipairs(releases) do + if type(rel) == "table" and pinSameVersion(job.row.version, rel.version) then + pick = rel + break + end + end + if not pick then + return self:_cartFillFailed(("has no release tagged v%s") + :format(tostring(job.row.version))) + end + if not (pick.zip and pick.zip.url) then + return self:_cartFillFailed(("v%s has no .zip asset") + :format(tostring(job.row.version))) + end + job.release, job.stage = pick, "install" + return + end + + if job.stage == "install" then + if self._modInstall then return end + local row = job.row + job.stage = "installing" + self:_beginModInstall({ + modId = row.id, name = row.id, release = job.release, + verb = "Installed", notice = "cart", sha256 = row.pin.sha256, + done = function(ok, text) + if ok then + job.installed = job.installed + 1 + job.stage = "next" + else + self:_cartFillFailed(text) + end + end, + }) + end +end + function RomImporter:_restoreActiveCarts(opts) local saved = opts and opts.activeCart if type(saved) ~= "table" then return end @@ -4419,13 +4669,11 @@ local function cartModRows(imp, version) return kept end +-- Every mod that targets this game, switched on or off: CartStore.capture +-- pins the off ones too, so they are part of the cart it would write. function RomImporter:_cartCaptureCount(version) if not GameVersion.VERSIONS[version] then return 0 end - local n = 0 - for _, row in ipairs(cartModRows(self, version)) do - if row.enabled then n = n + 1 end - end - return n + return #cartModRows(self, version) end function RomImporter:_cartAuthor() @@ -4460,10 +4708,7 @@ function RomImporter:_beginCartSave(version) modOptions = LauncherMods.modOptions(), unresolved = {}, publishable = false, } - st.count = 0 - for _, row in ipairs(st.mods) do - if row.enabled then st.count = st.count + 1 end - end + st.count = #st.mods local cart, unresolved = CartStore.capture( cartIdentity(st, "preview", "Preview"), st.mods, st.modOptions) if cart then @@ -4811,14 +5056,84 @@ function RomImporter:_refreshMods() .. table.concat(failed, ", ") } end end - self.mods = LauncherMods.list(self.modScope) or {} + local listed = LauncherMods.list(self.modScope) or {} + self.mods = listed if self.modScope then local kept = {} - for _, m in ipairs(self.mods) do + for _, m in ipairs(listed) do if m.targetsHere ~= false then kept[#kept + 1] = m end end self.mods = kept end + -- a pin is judged against the whole listing: the cart named it, so it is + -- listed even where the game filter above would have dropped it + local cartId, report = self:modCartPlan() + if cartId then self.mods = self:_cartPinRows(cartId, report, listed) end +end + +-- The cart the MODS panel is answering for, with the plan that resolves its +-- pins, or nil when the panel is on a base game. +function RomImporter:modCartPlan() + local version = self.modScope + if not version then return nil end + local id = self.activeCart and self.activeCart[version] or nil + if not id then return nil end + local report = self:cartPlan(version) + if type(report) ~= "table" or type(report.pins) ~= "table" then return nil end + return id, report, version +end + +local function missingPinRow(imp, id, pin) + local version = type(pin) == "table" and pin.version or nil + return { id = id, name = id, version = version, badge = "MOD", + description = "", enabled = false, status = "missing", + statusDetail = Strings("Pinned by this cart but not installed"), + experimental = false, targetsHere = true, + manifest = { id = id, version = version }, + dependencySpecs = {}, requiredImports = {}, imports = {}, + missingRequiredImports = 0, missingOptionalImports = 0, + safeMode = imp.safeMode == true, cartMissing = true } +end + +-- The pinned set, resolved exactly as Loader:_applyCart resolves it: the +-- cart's own switch, overridden by the player's answer only where the seal +-- hands that switch over (Loader.pinTogglable). +function RomImporter:_cartPinRows(cartId, report, rows) + local CartManifest = require("src.carts.CartManifest") + local Loader = require("src.mods.Loader") + local SaveData = require("src.core.SaveData") + local byId = {} + for _, row in ipairs(rows or {}) do byId[row.id] = row end + local options = SaveData.loadOptions() + local out = {} + for _, id in ipairs(report.order or {}) do + local pin = report.pins[id] + local source = byId[id] + -- a copy: the listing's own row still answers for the base game + local row = {} + if source then + for key, value in pairs(source) do row[key] = value end + row.cartMissing = nil + else + row = missingPinRow(self, id, pin) + end + local togglable = Loader.pinTogglable(report, pin) + local on = CartManifest.modEnabled(pin) + if togglable then + local chosen = SaveData.cartModEnabled(options, cartId, id) + if type(chosen) == "boolean" then on = chosen end + end + row.cartId, row.cartSeal = cartId, report.seal + row.cartTitle = report.title or cartId + row.cartPin, row.cartTogglable = true, togglable and not row.cartMissing + row.cartBase = self.modScope + -- a pin nothing provides cannot run, whatever the cart asked for + row.enabled = on and not self.safeMode and not row.cartMissing + -- one cart, one game: the per-game checkbox row is not this row's answer + row.enabledByVersion = nil + out[#out + 1] = row + end + return out end -- Point the MODS panel at one game (or nil for all of them) and relist, so @@ -4926,6 +5241,11 @@ function RomImporter:_toggleMod(id, confirmed, version) self.modNotice = { ok = false, text = "Safe mode is active. Turn it off in the Bug tab to change mods." } return end + local cartId, cartReport = self:modCartPlan() + if cartId then + self:_toggleCartMod(cartId, cartReport, id, confirmed) + return + end local LauncherMods = require("src.mods.LauncherMods") local cur, experimental = false, false for _, m in ipairs(self.mods or {}) do @@ -4958,6 +5278,62 @@ function RomImporter:_toggleMod(id, confirmed, version) self:_refreshMods() end +-- A cart's pin is switched in the cart's own scope, never in the per-game +-- flags, and only where the seal hands that switch over. Loader.pinTogglable +-- is the single authority on that, in the launcher as in the game. +function RomImporter:_toggleCartMod(cartId, report, id, confirmed) + local CartManifest = require("src.carts.CartManifest") + local Loader = require("src.mods.Loader") + local SaveData = require("src.core.SaveData") + local title = (report and report.title) or cartId + local pin = report and report.pins and report.pins[id] or nil + if not pin then + self.modNotice = { ok = false, text = Strings( + "%s decides which mods run. A cart's mod set cannot be added to or taken from.", + title) } + return + end + local row + for _, m in ipairs(self.mods or {}) do + if m.id == id then row = m break end + end + if row and row.cartMissing then + self.modNotice = { ok = false, text = Strings( + "%s pins %s, but it is not installed.", title, id) } + return + end + if not Loader.pinTogglable(report, pin) then + self.modNotice = { ok = false, text = Strings( + "%s is sealed: its mods run exactly as pinned. Break the seal on the cart's own page to change that.", + title) } + return + end + local on = CartManifest.modEnabled(pin) + local chosen = SaveData.cartModEnabled(SaveData.loadOptions(), cartId, id) + if type(chosen) == "boolean" then on = chosen end + local want = not on + if want and row and row.experimental and not confirmed then + self._modConfirm = { + kind = "experimental", id = id, version = self.modScope, + title = "Experimental mod", + yesLabel = "Enable", + lines = { + "This mod is marked experimental.", + "It may be unfinished or unstable.", + "Enable it anyway?", + }, + } + return + end + self._modConfirm = nil + SaveData.setCartModEnabled(cartId, id, want) + self:_refreshMods() + local name = (row and row.name) or id + self.modNotice = { ok = true, text = want + and Strings("Switched %s on for %s.", name, title) + or Strings("Switched %s off for %s.", name, title) } +end + -- Enable all / Disable all (#647). One options write for the whole list -- (LauncherMods.setAllEnabled) and one relist afterwards, so the count, the -- switches and every status chip resolve together instead of per mod. @@ -4965,11 +5341,20 @@ end -- opt-in is the only warning an experimental mod ever gets, and a bulk button -- must not be the way around it. Disabling needs no confirm -- it is the -- recovery action, and Delete is the only destructive one on this panel. +-- An active cart owns its mod set, so the bulk buttons are refused there +-- rather than becoming a way to add to it or empty it. function RomImporter:_setAllMods(want, confirmed) if self.safeMode then self.modNotice = { ok = false, text = "Safe mode is active. Turn it off in the Bug tab to change mods." } return end + local cartId, cartReport = self:modCartPlan() + if cartId then + self.modNotice = { ok = false, text = Strings( + "%s decides which mods run. Switch its pins one at a time, or pick the base game above.", + (cartReport and cartReport.title) or cartId) } + return + end local LauncherMods = require("src.mods.LauncherMods") local ids, experimental = {}, false for _, m in ipairs(self.mods or {}) do @@ -5143,9 +5528,12 @@ end -- (update a mod, install a specific version, install from an index) funnel -- into one in-flight job, so two installs can never race for the same id. -- --- `spec` = { modId, name, release, notice = "mod"|"find", verb, entry } +-- `spec` = { modId, name, release, notice = "mod"|"find"|"cart", verb, entry, +-- sha256, done } +-- `sha256` gates the unzip; `done(ok, text)` fires on either outcome so a +-- queue can drive one install at a time. function RomImporter:_beginModInstall(spec) - if self._modInstall then return end + if self._modInstall or self._cartInstall then return end local ModIndex = require("src.mods.ModIndex") local release = spec.release -- An index entry only tells us WHERE the zip is; resolving that is @@ -5178,8 +5566,39 @@ end function RomImporter:_modInstallFailed(spec, msg) local notice = { ok = false, text = tostring(msg) } if spec.notice == "find" then self.findNotice = notice - else self.modNotice = notice end + elseif spec.notice ~= "cart" then self.modNotice = notice end self:_clearBusy() + if spec.done then spec.done(false, tostring(msg)) end +end + +local function sha256hex(data) + local digest = love.data.hash("sha256", data) + if type(digest) == "userdata" and digest.getString then + digest = digest:getString() + end + return love.data.encode("string", "hex", digest) +end + +-- A cart pin records the sha256 of the archive it was built against. A hash +-- that does not match is a different build, so nothing is installed. +function RomImporter.verifyArchiveSha256(path, want) + if type(want) ~= "string" or not want:lower():match("^%x+$") + or #want ~= 64 then + return false, "the cart records no usable sha256 for this mod" + end + local ok, data = pcall(love.filesystem.read, path) + if not ok or type(data) ~= "string" or data == "" then + return false, "the downloaded archive could not be read back" + end + local hashed, got = pcall(sha256hex, data) + if not hashed or type(got) ~= "string" then + return false, "this platform cannot hash the archive, so it was not installed" + end + if got:lower() ~= want:lower() then + return false, ("archive sha256 %s does not match the pinned %s") + :format(got:sub(1, 12), want:sub(1, 12)) + end + return true end function RomImporter:_pumpModInstall() @@ -5202,6 +5621,16 @@ function RomImporter:_pumpModInstall() self:_modInstallFailed(spec, err or "download failed") return end + -- Hash gate before the unzip: a pinned archive that does not match the cart + -- is thrown away rather than installed. + if spec.sha256 then + local verified, why = RomImporter.verifyArchiveSha256(path, spec.sha256) + if not verified then + pcall(love.filesystem.remove, path) + self:_modInstallFailed(spec, why) + return + end + end -- Unzip + manifest check. Fast, and it must run here: love.filesystem -- writes are main-thread only. self:_setBusy(Strings("Installing %s", tostring(spec.name or spec.modId))) @@ -5225,14 +5654,138 @@ function RomImporter:_pumpModInstall() tostring(spec.name or spec.modId), shown) if spec.notice == "find" then self.findNotice = { ok = true, text = text } - else + elseif spec.notice ~= "cart" then self.modNotice = { ok = true, text = text } end - local LauncherMods = require("src.mods.LauncherMods") - local depCheck = LauncherMods.checkDependencies({ id = spec.modId }) - if depCheck and depCheck.hasIssues then - self._modDepResolver = depCheck + -- A cart pins its whole load order, so the dependency modal would only + -- interrupt the queue that is already installing the rest of it. + if spec.notice ~= "cart" then + local depCheck = LauncherMods.checkDependencies({ id = spec.modId }) + if depCheck and depCheck.hasIssues then + self._modDepResolver = depCheck + end end + if spec.done then spec.done(true, text) end +end + +-- ------- cart install from an index listing +-- +-- A cart is one .g1rcart file, so the bytes go whole to CartStore.install and +-- never through the mod installer. Shares the mod job's single-in-flight +-- rule: either entry point refuses while the other is running. +function RomImporter:_beginCartInstall(entry) + if self._modInstall or self._cartInstall then return end + local ModIndex = require("src.mods.ModIndex") + local release, why = ModIndex.releaseFor(entry) + if type(release) ~= "table" or not (release.zip and release.zip.url) then + self.findNotice = { ok = false, + text = ("%s: %s"):format(tostring(entry.title or entry.id), + tostring(why or "this cart has no downloadable release")) } + return + end + local ModUpdate = require("src.mods.ModUpdate") + local version = release.version or entry.version or os.time() + local tmpName = ("cart_install_%s_%s%s"):format( + tostring(entry.id):gsub("[^%w%-_]", "_"), tostring(version), + require("src.carts.CartStore").EXT) + self._cartInstall = { + entry = entry, version = release.version or entry.version, + h = ModUpdate.beginDownloadZip(release.zip.url, tmpName, release.zip.size), + } + self:_setBusy(Strings("Downloading %s", tostring(entry.title or entry.id)), + "v" .. tostring(release.version or entry.version or "?")) +end + +function RomImporter:_cartInstallFailed(msg) + self._cartInstall = nil + self:_clearBusy() + self.findNotice = { ok = false, text = tostring(msg) } +end + +function RomImporter:_pumpCartInstall() + local job = self._cartInstall + if not job then return end + local ModUpdate = require("src.mods.ModUpdate") + local ok, done, path, err, progress = pcall(ModUpdate.pumpDownloadZip, job.h) + if ok and not done then + if progress and self._busy then self._busy.progress = progress end + return + end + local entry = job.entry + local name = tostring(entry.title or entry.id) + if not ok then + return self:_cartInstallFailed(name .. ": download failed: " .. tostring(done)) + end + if not path then + return self:_cartInstallFailed(name .. ": " .. tostring(err or "download failed")) + end + self._cartInstall = nil + local read, bytes = pcall(love.filesystem.read, path) + pcall(love.filesystem.remove, path) + if not read or type(bytes) ~= "string" or bytes == "" then + return self:_cartInstallFailed(name .. ": the download could not be read back") + end + self:_setBusy(Strings("Installing %s", name)) + local CartStore = require("src.carts.CartStore") + local ran, cart, installErr = pcall(CartStore.install, bytes) + self:_clearBusy() + if not ran then + return self:_cartInstallFailed(name .. ": install failed: " .. tostring(cart)) + end + if not cart then + return self:_cartInstallFailed(name .. ": " .. tostring(installErr)) + end + -- _refreshCarts caches per version, so the Custom Carts list for the game + -- this cart plays as would keep its pre-install copy until a relaunch. + -- The label art is cached per cart too, and a reinstall can repaint it. + self:_refreshCarts(cart.base) + self._cartPlan = nil + self._cartridgeLabels = nil + self.findNotice = { ok = true, + text = Strings("Installed %s v%s. It is in this game's cart list now.", + tostring(cart.title or cart.id), tostring(cart.version or "?")) } + self:_offerCartPins(cart) +end + +-- The pins a cart is missing, answered without disturbing whichever cart the +-- player currently has selected for that game. +function RomImporter:_cartPinsMissing(version, id) + local wasCart = self.activeCart[version] + local wasPlan = self._cartPlan + self.activeCart[version] = id + self._cartPlan = nil + local ok, rows = pcall(self.cartFillRows, self, version) + self.activeCart[version] = wasCart + self._cartPlan = wasPlan + return (ok and type(rows) == "table") and rows or {} +end + +-- A cart whose pins are missing will not start, so ask once rather than +-- dead-end, and route a yes at the existing hash-verified fill queue. +function RomImporter:_offerCartPins(cart) + local rows = self:_cartPinsMissing(cart.base, cart.id) + if #rows == 0 then return end + local info = GameVersion.info(cart.base) + local title = tostring(cart.title or cart.id) + self._modConfirm = { + kind = "cartPins", version = cart.base, id = cart.id, + title = "Install this cart's mods", + yesLabel = "Install", + lines = { + ("%s pins %d mod(s) you do not have."):format(title, #rows), + "Install them now? Each one is checked against the cart's own hash.", + ("This selects %s as the cart for %s."):format(title, + tostring((info and (info.launcherName or info.displayName)) + or cart.base)), + }, + } +end + +-- The confirm's yes. The cart being filled has to be the selected one, which +-- is what cartFillRows and pressInstallCartMods both answer for. +function RomImporter:_installCartPins(version, id) + self:_selectCart(version, id) + self:pressInstallCartMods(version) end -- Start an async pull for a single dependency @@ -5409,7 +5962,7 @@ function RomImporter:_refreshFind(force) -- the index looks empty. if not Platform.canFetchRemote() then self.findLoaded = true - self.findIndex = { mods = {}, categories = {} } + self.findIndex = { mods = {}, carts = {}, categories = {}, baseGames = {} } self.findNotice = { ok = false, text = "Mod indexes cannot be fetched on this platform. Install a mod .zip from storage instead." } return @@ -5418,7 +5971,7 @@ function RomImporter:_refreshFind(force) self:_refreshFindSources() local sources = self.findSources or {} if #sources == 0 then - self.findIndex = { mods = {}, categories = {} } + self.findIndex = { mods = {}, carts = {}, categories = {}, baseGames = {} } self.findLoaded = true return end @@ -5433,6 +5986,7 @@ function RomImporter:_refreshFind(force) self._findFetch = { handles = handles, force = force == true, mods = {}, seen = {}, cats = {}, catSeen = {}, errs = {}, + carts = {}, cartSeen = {}, bases = {}, baseSeen = {}, stale = false, oldest = nil, at = 1, } self:_setBusy(Strings("Fetching mod index"), @@ -5489,29 +6043,51 @@ function RomImporter:_pumpFindFetch() f.mods[#f.mods + 1] = entry end end + -- Carts merge on the same first-source-wins rule, in their own id + -- space: a cart and a mod may share an id without shadowing each other. + for _, entry in ipairs(index.carts or {}) do + if not f.cartSeen[entry.id] then + f.cartSeen[entry.id] = true + entry._source = source.label or source.feed + entry._base = source.base + f.carts[#f.carts + 1] = entry + end + end for _, c in ipairs(ModIndex.categoriesIn(index)) do if not f.catSeen[c] then f.catSeen[c] = true f.cats[#f.cats + 1] = c end end + for _, b in ipairs(ModIndex.baseGamesIn(index)) do + if not f.baseSeen[b] then + f.baseSeen[b] = true + f.bases[#f.bases + 1] = b + end + end end end - self.findIndex = { mods = f.mods, categories = f.cats, stale = f.stale, + self.findIndex = { mods = f.mods, carts = f.carts, categories = f.cats, + baseGames = f.bases, stale = f.stale, checkedAt = f.oldest } self.findLoaded = true if #f.errs > 0 then self.findNotice = { ok = false, text = table.concat(f.errs, " - ") } elseif f.force then self.findNotice = { ok = true, - text = Strings("Refreshed - %d mods listed", #f.mods) } + text = (#f.carts > 0) + and Strings("Refreshed - %d mods and %d carts listed", #f.mods, #f.carts) + or Strings("Refreshed - %d mods listed", #f.mods) } end -- A category that no longer exists after a refresh would filter everything - -- away with no way back except guessing. + -- away with no way back except guessing. Same for a base game. if self.findCategory and not f.catSeen[self.findCategory] then self.findCategory = nil end + if self.findBase and not f.baseSeen[self.findBase] then + self.findBase = nil + end self.findPage = 1 self._findFetch = nil self:_clearBusy() @@ -5540,7 +6116,7 @@ function RomImporter:_ensureFind() if #(self.findSources or {}) == 0 then -- Nothing to fetch, but the panel is loaded: the empty state is the -- answer, not a pending request. - self.findIndex = { mods = {}, categories = {} } + self.findIndex = { mods = {}, carts = {}, categories = {}, baseGames = {} } self.findLoaded = true else self:_refreshFind(false) @@ -5548,45 +6124,93 @@ function RomImporter:_ensureFind() end end +-- Whether the FIND panel is browsing carts rather than mods. +function RomImporter:findingCarts() + return self.findKind == "carts" +end + +-- The switch itself. Query survives the flip; the category / base filter +-- does not, because neither vocabulary applies to the other list. +function RomImporter:_setFindKind(kind) + kind = (kind == "carts") and "carts" or "mods" + if self.findKind == kind then return end + self.findKind = kind + self._findRowsCache = nil + self._findSortCache = nil + if self._pages then self._pages["find"] = 1 end + self.findPage = 1 +end + -- The rows the filters leave, and the installed-mod context the compatibility -- warnings are judged against. function RomImporter:_findRows() - local all = (self.findIndex and self.findIndex.mods) or {} + local carts = self:findingCarts() + local all = (self.findIndex + and (carts and self.findIndex.carts or self.findIndex.mods)) or {} -- The view asks every frame (immediate mode); only re-filter when the - -- index, query, or category actually changed. + -- index, query, or filter actually changed. local c = self._findRowsCache if c and c.src == all and c.query == self.findQuery - and c.category == self.findCategory and c.scope == self.modScope then + and c.category == self.findCategory and c.base == self.findBase + and c.scope == self.modScope then return c.rows end local ModIndex = require("src.mods.ModIndex") local rows = ModIndex.filter(all, { query = self.findQuery, - category = self.findCategory, + category = (not carts) and self.findCategory or nil, + base = carts and self.findBase or nil, }) if self.modScope then - local ModTargets = require("src.mods.ModTargets") - local gen = GameVersion.generation(self.modScope) - local kept = {} - for _, entry in ipairs(rows) do - local versions = ModTargets.normalize(entry.games) - if #versions == 0 or ModTargets.covers(versions, gen) then - kept[#kept + 1] = entry + if carts then + -- A cart plays as exactly one game, so the scope is a plain match on + -- the base rather than a ModTargets coverage question. + local kept = {} + for _, entry in ipairs(rows) do + if entry.base == self.modScope then kept[#kept + 1] = entry end end + rows = kept + else + local ModTargets = require("src.mods.ModTargets") + local gen = GameVersion.generation(self.modScope) + local kept = {} + for _, entry in ipairs(rows) do + local versions = ModTargets.normalize(entry.games) + if #versions == 0 or ModTargets.covers(versions, gen) then + kept[#kept + 1] = entry + end + end + rows = kept end - rows = kept end self._findRowsCache = { src = all, query = self.findQuery, - category = self.findCategory, scope = self.modScope, rows = rows } + category = self.findCategory, base = self.findBase, + scope = self.modScope, rows = rows } return rows end function RomImporter:_findInstalledMap() + if self:findingCarts() then return self:_findInstalledCarts() end local map = {} for _, m in ipairs(self.mods or {}) do map[m.id] = m.version or true end return map end +-- id -> installed version for every cart on disk, whatever game it plays as. +-- Cached because the row loop asks once per frame. +function RomImporter:_findInstalledCarts() + if self._findCartMap then return self._findCartMap end + local map = {} + local ok, rows = pcall(function() + return require("src.carts.CartStore").index() + end) + if ok and type(rows) == "table" then + for _, row in ipairs(rows) do map[row.id] = row.version or true end + end + self._findCartMap = map + return map +end + -- One thumbnail per frame, and only for a card actually on screen: the fetch -- is a blocking curl, so downloading a whole listing's worth on open would -- stall the launcher for as many seconds as there are mods. A failure is @@ -5843,6 +6467,9 @@ function RomImporter:_findConfirmInstall(entry) text = (entry.title or entry.id) .. ": " .. tostring(why) } return end + if ModIndex.isCart(entry) then + return self:_findConfirmCartInstall(entry) + end local installed = self:_findInstalledMap() local issues = ModIndex.compatIssues(entry, { modApi = Version.modApi, @@ -5869,7 +6496,45 @@ function RomImporter:_findConfirmInstall(entry) } end +-- The cart twin of the confirm above. The pinned list is what the player is +-- agreeing to; installing the cart installs none of it. +function RomImporter:_findConfirmCartInstall(entry) + local ModIndex = require("src.mods.ModIndex") + local Version = require("src.core.Version") + local issues = ModIndex.compatIssues(entry, { + modApi = Version.modApi, + engineVersion = Version.engine, + installed = self:_findInstalledMap(), + }) + local version = ModIndex.displayVersion(entry) + local info = GameVersion.info(entry.base) + local lines = { (entry.title or entry.id) .. " v" .. tostring(version) } + if entry.author then lines[#lines + 1] = "by " .. entry.author end + lines[#lines + 1] = "Plays as " + .. tostring((info and (info.launcherName or info.displayName)) or entry.base) + .. " - " .. tostring(entry.seal) + lines[#lines + 1] = ("Pins %d mod(s), installed separately from its page") + :format(#(entry.mods or {})) + local have = self:_findInstalledCarts()[entry.id] + if have then + lines[#lines + 1] = "Replaces installed v" .. tostring(have) + end + for _, issue in ipairs(issues) do + lines[#lines + 1] = "! " .. issue.text + end + lines[#lines + 1] = "Carts are not reviewed - trust the author." + self._modConfirm = { + kind = (#issues > 0) and "warn" or "update", + indexEntry = entry, + title = have and "Reinstall cart" or "Install cart", + yesLabel = have and "Reinstall" or "Install", + lines = lines, + } +end + function RomImporter:_findInstall(entry) + local ModIndex = require("src.mods.ModIndex") + if ModIndex.isCart(entry) then return self:_beginCartInstall(entry) end self:_beginModInstall({ modId = entry.id, name = entry.title or entry.id, entry = entry, verb = "Installed", notice = "find", diff --git a/src/mods/Gen2Compat.lua b/src/mods/Gen2Compat.lua index 2594e8b6..b2a6c789 100644 --- a/src/mods/Gen2Compat.lua +++ b/src/mods/Gen2Compat.lua @@ -1582,7 +1582,7 @@ local function buildPartyMenu() elseif opts.battle and opts.onSwitch then prompt, battleSubmenu = "choose", true elseif opts.pickOnly then - prompt = "useItem" + prompt = opts.itemUse and "useItem" or "choose" elseif opts.onSwitch then -- src/ui/PartyMenu.lua:569: onSwitch OUTSIDE battle fires on A itself, -- so the field submenu must not swallow the press @@ -1647,7 +1647,7 @@ COVERAGE["src.ui.PartyMenu"] = { warned = "keepOpen tmhm", absent = "drawIcon frameFor mirrorsIcon iconFrames sgbPalettes animateTo " .. "heal softboiledFrom battle subItems subIndex swapFrom blink onSwitch " - .. "pickOnly forceSwitch", + .. "pickOnly itemUse forceSwitch", notes = { new = "onSwitch(mon, menu) is wrapped onto onChoose(index, mon); opts." .. "battle carries only its BOOLEAN sense and self.battle is left nil " @@ -1663,7 +1663,7 @@ COVERAGE["src.ui.PartyMenu"] = { onSwitch = "replacing menu.onSwitch on a LIVE instance writes a field " .. "Gen 2 never reads; pass it to .new instead", bottomMessage = "returns Gold's strings with / charmap glyphs, so " - .. "a compare against \"Use on which one?\" will not match", + .. "a compare against \"Use item on which\\nPOKéMON?\" will not match", ["hook ui.party.submenu"] = "same name and arity; rows carry `id` on Gold " .. "where Gen 1 carries `action`, and ctx.battle is a BOOLEAN, not a " .. "BattleState", @@ -1838,7 +1838,7 @@ local function buildBattleState() "syncSides", "playerHasPP", "lockedAction", "computeMusicKind", "throwBall", "ballChain", "tossAnimFor", "ballFlicker", "ballMissMessage", "storeCaughtMon", "safariAction", "safariEnemyTurn", "drawBallRow", - "drawClassic", "isWideBattleLayout", "wideLayout", "bgMode", "uiSize", + "drawClassic", "isWideBattleLayout", "wideLayout", "uiSize", "sgbPalettes", "trainerPalette", "trainerPicPath", "trainerTrueColor", "trainerSprite", "invalidate", "imageBattleScale", "resolveBattleScale", "backPlacement", @@ -1922,11 +1922,11 @@ COVERAGE["src.battle.BattleState"] = { backed = "update draw __index isOpaque openParty swapMoves " .. "lowHealthAlarmActive playVictoryMusic say sayAuto openItems " .. "openReplacementMenu finish askNicknameUI playEntranceCry stampOT " - .. "tryRun wantsFillScale", + .. "tryRun wantsFillScale bgMode", warned = "tryRun askNicknameUI", absent = "newWild newTrainer makeSafari makeGhost makeBattler resolveTurn " .. "computeDamage catchAttempt runRoll enter exit sgbPalettes " - .. "isWideBattleLayout wideLayout bgMode uiSize letterboxWhite " + .. "isWideBattleLayout wideLayout uiSize letterboxWhite " .. "holdsUIAnchors BG_WORLD_DIM trainerPalette trainerPicPath " .. "trainerTrueColor trainerSprite invalidate " .. "backPlacement frontPlacement StatBox drawClassic drawBallRow " diff --git a/src/mods/Loader.lua b/src/mods/Loader.lua index 0b298d20..6ae33583 100644 --- a/src/mods/Loader.lua +++ b/src/mods/Loader.lua @@ -1,6 +1,7 @@ local Json = require("src.link.Json") local Logger = require("src.core.Logger") local SaveData = require("src.core.SaveData") +local CartManifest = require("src.carts.CartManifest") local CartStore = require("src.carts.CartStore") local Data = require("src.core.Data") local GameVersion = require("src.core.GameVersion") @@ -269,7 +270,7 @@ function Loader.new(opts) events = Events.new(), hooks = Hooks.new(), content = {}, assets = {}, exports = {}, migrations = {}, order = {}, modSave = {}, modOptions = {}, optionSchemas = {}, imageCache = {}, - modInput = {}, modEnv = {}, stepsQueues = {}, + modInput = {}, modEnv = {}, stepsQueues = {}, cartSwitches = {}, fs = (opts and opts.fs) or (love and love.filesystem), cart = opts and opts.cart or nil, dev = dev, @@ -369,7 +370,11 @@ function Loader:_saveState() local scope = self:_enableScope() local version = self:_targetVersion() for id in pairs(self.mods) do - SaveData.setModEnabled(options, id, not self.disabled[id], scope) + -- a switch the cart owns is answered in the cart's scope by setEnabled, + -- so it never rewrites what the base game runs + if not self.cartSwitches[id] then + SaveData.setModEnabled(options, id, not self.disabled[id], scope) + end -- only the games this boot can answer for: another version's overrides -- are not this run's to rewrite. With no version (an injected-generation -- harness) the override stays in memory for this boot only. @@ -436,6 +441,9 @@ function Loader:setEnabled(id, enabled) if not self.mods[id] then return false end self.disabled[id] = not enabled self.mods[id].enabled = enabled + if self.cartSwitches[id] and self.cartReport then + SaveData.setCartModEnabled(self.cartReport.id, id, enabled, self.fs) + end self:_saveState() return true end @@ -530,6 +538,15 @@ local function cartComplaints(report) return parts end +-- Whether the player's own enable flag decides a pinned mod. "sealed+" hands +-- every pin over; any other seal hands over only the pins the cart ships off. +function Loader.pinTogglable(report, pin) + if type(report) ~= "table" or type(pin) ~= "table" then return false end + if report.seal == "sealed+" then return true end + if pin.enabled ~= false then return false end + return not (report.seal == "sealed" and not report.broken) +end + function Loader.planCart(cart, installed, broken) local report = { seal = "sealed", sealed = true, broken = broken == true, order = {}, rank = {}, pins = {}, missing = {}, mismatched = {}, @@ -541,8 +558,8 @@ function Loader.planCart(cart, installed, broken) return report end report.id, report.title = cart.id, cart.title - report.seal = cart.seal == "open" and "open" or "sealed" - report.sealed = report.seal == "sealed" + report.seal = CartManifest.SEALS[cart.seal] and cart.seal or "sealed" + report.sealed = report.seal ~= "open" report.enforced = report.sealed and not report.broken local have = installedVersions(installed) local pins = {} @@ -599,9 +616,20 @@ function Loader:_applyCart() return end if report.message then Logger.warn("cart %s: %s", cartId, report.message) end + -- the pins whose switch the cart hands to the player: their answer lives in + -- the cart's own scope, never in the per-game flags + self.cartSwitches = {} + local options = SaveData.loadOptions(self.fs) for id, mod in pairs(self.mods) do - if report.pins[id] then - mod.enabled, mod.state = true, "pending" + local pin = report.pins[id] + if pin then + local on = CartManifest.modEnabled(pin) + if Loader.pinTogglable(report, pin) then + local chosen = SaveData.cartModEnabled(options, cartId, id) + if type(chosen) == "boolean" then on = chosen end + self.cartSwitches[id] = true + end + mod.enabled, mod.state = on, on and "pending" or "disabled" elseif report.enforced then mod.enabled, mod.state = false, "disabled" end diff --git a/src/mods/ModIndex.lua b/src/mods/ModIndex.lua index b136297d..78618e49 100644 --- a/src/mods/ModIndex.lua +++ b/src/mods/ModIndex.lua @@ -18,6 +18,9 @@ -- schema_version is a hard gate, not a hint: a bumped feed may reuse a field -- name for something else, so an unknown version is refused outright rather -- than parsed hopefully. +-- +-- Carts ride the same feed additively at schema_version 1: `doc.carts` is a +-- second array beside `doc.mods`, and a feed without it lists no carts. local ModIndex = {} @@ -26,7 +29,7 @@ local ModIndex = {} -- single repo's releases; a whole index is heavier and changes more slowly. ModIndex.CACHE_TTL = 24 * 60 * 60 ModIndex.SCHEMA_VERSION = 1 -ModIndex.CACHE_VERSION = 2 +ModIndex.CACHE_VERSION = 3 -- ------- pure: source resolution @@ -225,8 +228,95 @@ local function parseEntry(raw) } end --- parse(jsonText [, Json]) -> { schemaVersion, generatedAt, categories, mods } --- | nil, err +local function numArray(v) + local out = {} + if type(v) == "table" then + for _, entry in ipairs(v) do + local n = tonumber(entry) + if n then out[#out + 1] = n end + end + end + return out +end + +-- One pinned mod out of a cart's `mods` array, in the bundle's own cart.json +-- shape: github pins carry repo/version/sha256, gamebanana pins mod/file/md5. +local function parseCartPin(raw) + if type(raw) ~= "table" or not str(raw.id) then return nil end + local source = str(raw.source) + if source ~= "github" and source ~= "gamebanana" then return nil end + local pin = { + id = raw.id, + source = source, + repo = str(raw.repo), + version = str(raw.version), + sha256 = str(raw.sha256), + mod = tonumber(raw.mod), + file = tonumber(raw.file), + md5 = str(raw.md5), + options = type(raw.options) == "table" and raw.options or nil, + } + if raw.enabled == false then pin.enabled = false end + return pin +end + +-- One cart listing. The eight fields the cart schema marks required are the +-- gate: a row missing any of them is dropped rather than half-listed, because +-- every one of them is load bearing for installing or naming the cart. +local function parseCartEntry(raw) + if type(raw) ~= "table" then return nil end + if not (str(raw.id) and str(raw.title) and str(raw.author) + and str(raw.version) and str(raw.base) and str(raw.seal) + and str(raw.repo) and type(raw.mods) == "table") then + return nil + end + local pins = {} + for _, pin in ipairs(raw.mods) do + local parsed = parseCartPin(pin) + if parsed then pins[#pins + 1] = parsed end + end + if #pins == 0 then return nil end + return { + kind = "cart", + folder = str(raw.folder), + id = raw.id, + title = raw.title, + author = raw.author, + version = raw.version, + base = raw.base, + seal = raw.seal, + summary = str(raw.summary) or "", + shell = str(raw.shell), + finish = str(raw.finish), + speeds = numArray(raw.speeds), + tags = strArray(raw.tags), + repo = raw.repo, + github = str(raw.github), + downloadURL = str(raw.downloadURL), + automatic_version_check = raw.automatic_version_check ~= false, + fixed_release_tag = str(raw.fixed_release_tag), + game_version = str(raw.game_version), + license = str(raw.license), + mods = pins, + load_order = strArray(raw.load_order), + thumbnail = str(raw.thumbnail), + description_url = str(raw.description_url), + downloads = parseDownloads(raw.downloads), + first_release = str(raw.first_release), + last_release = str(raw.last_release), + latest = parseLatest(raw.latest), + update_check = str(raw.update_check) or "pending", + } +end + +-- True for a listing that installs through CartStore, not the mod installer. +function ModIndex.isCart(entry) + return type(entry) == "table" and entry.kind == "cart" +end + +-- parse(jsonText [, Json]) +-- -> { schemaVersion, generatedAt, categories, baseGames, mods, carts } +-- | nil, err -- Never throws: a truncated download, an HTML error page, or a feed from a -- future schema all come back as a message the panel can print. function ModIndex.parse(jsonText, Json) @@ -254,11 +344,21 @@ function ModIndex.parse(jsonText, Json) local entry = parseEntry(raw) if entry then mods[#mods + 1] = entry end end + -- Absent carts is the old-feed case, not an error. + local carts = {} + if type(doc.carts) == "table" then + for _, raw in ipairs(doc.carts) do + local entry = parseCartEntry(raw) + if entry then carts[#carts + 1] = entry end + end + end return { schemaVersion = schema, generatedAt = str(doc.generated_at), categories = strArray(doc.categories), + baseGames = strArray(doc.base_games), mods = mods, + carts = carts, } end) if not ok then return nil, "could not read the index: " .. tostring(result) end @@ -421,12 +521,14 @@ function ModIndex.matches(entry, query) return true end --- filter(mods, opts) -> a new array. opts = { query, category, tag }. --- Category and tag compare case-insensitively; feed order (already sorted by --- title) is preserved. +-- filter(entries, opts) -> a new array. opts = { query, category, base, tag }. +-- Category, base and tag compare case-insensitively; feed order (already +-- sorted by title) is preserved. `base` is the cart-side equivalent of a +-- mod's category: a cart plays as exactly one game and has no categories. function ModIndex.filter(mods, opts) opts = opts or {} local want = opts.category and tostring(opts.category):lower() or nil + local wantBase = opts.base and tostring(opts.base):lower() or nil local wantTag = opts.tag and tostring(opts.tag):lower() or nil local out = {} for _, entry in ipairs(mods or {}) do @@ -437,6 +539,9 @@ function ModIndex.filter(mods, opts) if tostring(c):lower() == want then keep = true; break end end end + if keep and wantBase then + keep = tostring(entry.base or ""):lower() == wantBase + end if keep and wantTag then keep = false for _, t in ipairs(entry.tags or {}) do @@ -469,6 +574,32 @@ function ModIndex.categoriesIn(index) return out end +-- Every base game the feed's carts actually play as, in the feed's declared +-- base_games order, with anything a cart names that the header forgot +-- appended. The cart-side twin of categoriesIn. +function ModIndex.baseGamesIn(index) + local out, seen = {}, {} + if type(index) ~= "table" then return out end + local used = {} + for _, entry in ipairs(index.carts or {}) do + if entry.base then used[entry.base] = true end + end + for _, base in ipairs(index.baseGames or {}) do + if used[base] and not seen[base] then + seen[base] = true + out[#out + 1] = base + end + end + for _, entry in ipairs(index.carts or {}) do + local base = entry.base + if base and not seen[base] then + seen[base] = true + out[#out + 1] = base + end + end + return out +end + -- ------- sources (options.modIndexes) local function loadOptions() @@ -569,7 +700,9 @@ function ModIndex.writeCache(feed, index) version = ModIndex.CACHE_VERSION, generatedAt = index.generatedAt, categories = index.categories, + baseGames = index.baseGames, mods = index.mods, + carts = index.carts, } SaveData.saveOptions(opts) end) @@ -609,7 +742,9 @@ function ModIndex.fetch(source, opts) schemaVersion = ModIndex.SCHEMA_VERSION, generatedAt = entry.generatedAt, categories = entry.categories or {}, + baseGames = entry.baseGames or {}, mods = entry.mods or {}, + carts = entry.carts or {}, }, nil, { fromCache = true, stale = stale, checkedAt = entry.checkedAt } end @@ -674,7 +809,9 @@ local function cachedIndex(feed, stale) schemaVersion = ModIndex.SCHEMA_VERSION, generatedAt = entry.generatedAt, categories = entry.categories or {}, + baseGames = entry.baseGames or {}, mods = entry.mods or {}, + carts = entry.carts or {}, }, nil, { fromCache = true, stale = stale, checkedAt = entry.checkedAt } end diff --git a/src/net/Fetch.lua b/src/net/Fetch.lua index 2a987125..b7955bc8 100644 --- a/src/net/Fetch.lua +++ b/src/net/Fetch.lua @@ -87,6 +87,7 @@ local function drain() j.status = msg.ok and "ok" or "error" j.body, j.err, j.path = msg.body, msg.err, msg.path j.code = msg.code + j.notModified = msg.notModified j.progress = msg.ok and 1 or j.progress end end @@ -154,12 +155,18 @@ end -- Download a URL to `saveRel`, a path relative to the LOVE save directory. -- Progress is reported as a 0..1 fraction when `size` is known. +-- opts.etagRel (optional, relative to the save directory like saveRel itself) +-- turns this into a conditional GET against a cached ETag at that path -- +-- see HostShell.httpDownload's own comment for the 304/notModified contract. +-- A caller checks Fetch.poll(job).notModified once status is "ok" to tell a +-- real download apart from a no-op cache hit (no file was written for the +-- latter). function Fetch.download(url, saveRel, opts) opts = opts or {} return submit({ kind = "download", url = url, dest = saveRel, size = opts.size, userAgent = opts.userAgent or "gen1recomp", - accept = opts.accept, maxSeconds = opts.maxSeconds }) + accept = opts.accept, maxSeconds = opts.maxSeconds, etagRel = opts.etagRel }) end -- Non-blocking status. Returns a table; never nil, even for an unknown id diff --git a/src/net/fetch_worker.lua b/src/net/fetch_worker.lua index 79006d62..def8d1fb 100644 --- a/src/net/fetch_worker.lua +++ b/src/net/fetch_worker.lua @@ -73,6 +73,12 @@ end -- inside the call. Where the caller knows the expected size we poll the -- growing file from a second pass instead; where it does not, the job simply -- reports indeterminate progress and the UI shows a spinner. +-- +-- job.etagRel (optional, relative to saveDir like job.dest) turns this into +-- a conditional GET -- see HostShell.httpDownload's own comment for the +-- 304/notModified contract. A notModified result never writes `rel` at all +-- (confirmed empirically, not assumed -- see TrueFX/etag-cache-repro/), so +-- the usual "did a file actually land" check below is skipped for it. local function doDownload(job) if not HostShell then post({ id = job.id, ok = false, err = "no transport" }) @@ -84,12 +90,17 @@ local function doDownload(job) if dir then love.filesystem.createDirectory(dir) end love.filesystem.remove(rel) - local ok, err = HostShell.httpDownload(job.url, abs, job.userAgent, - job.accept, tonumber(job.maxSeconds) or DOWNLOAD_MAX_SECONDS) + local etagAbs = job.etagRel and (saveDir .. "/" .. job.etagRel) or nil + local ok, err, notModified = HostShell.httpDownload(job.url, abs, job.userAgent, + job.accept, tonumber(job.maxSeconds) or DOWNLOAD_MAX_SECONDS, etagAbs) if not ok then post({ id = job.id, ok = false, err = err or "download failed" }) return end + if notModified then + post({ id = job.id, ok = true, path = rel, done = true, notModified = true }) + return + end local info = love.filesystem.getInfo(rel) if not info or (info.size or 0) == 0 then love.filesystem.remove(rel) diff --git a/src/render/GBCFX.lua b/src/render/GBCFX.lua deleted file mode 100644 index c2788a2a..00000000 --- a/src/render/GBCFX.lua +++ /dev/null @@ -1,310 +0,0 @@ --- GBC Effects post-process ("Pixel Transparency" style, see --- github.com/mattakins/Pixel_Transparency). A cumulative 4-level ladder --- applied after palette colorization and before the CRT pass: --- 1 reflective screen: bright pixels blend toward a procedurally --- grained warm backing (the unlit-GBC "transparent whites" look) --- 2 + LCD subpixel grid --- 3 + drop shadows (dark pixels float above the backing) --- 4 + sunlight: specular glare + rainbow QWP shimmer with a slowly --- drifting light source --- Levels OFF/1/2/3/4 persist as save.options.gbcfx; hotkey 5 cycles. --- Spec: docs/new-features.md (Custom Options / GBC FX) --- --- One shader for all levels: features are gated by the `level` uniform --- (float comparisons), so cycling never recompiles. All spatial effects --- key off `pixelScale` (screen pixels per GB pixel) so grid pitch, --- shadow offsets and grain stay window-size independent. - -local GBCFX = {} - -GBCFX.LABELS = { "OFF", "1", "2", "3", "4" } -GBCFX.level = 0 - -local shader -- false = unavailable (headless / no shader support) - --- Mobile GPUs often compile this pass but present a black frame, and the --- level persists in options.lua -- soft-bricking the APK until a manual --- edit (issue #136). Desktop is unchanged; Android/iOS refuse the effect. --- --- POKEPORT_GBCFX overrides the platform default either way ("1" force on, --- "0" force off), same tri-state as POKEPORT_TOUCH. Handheld packs whose --- GPU is in the same class as a phone's but whose getOS() says "Linux" set --- it to 0 in their launcher (build-rg34xxsp.sh); it also lets a desktop --- checkout exercise the unsupported path without stubbing love.system. -function GBCFX.isSupported() - local env = os.getenv("POKEPORT_GBCFX") - if env == "1" then return true end - if env == "0" then return false end - if not love or not love.system or not love.system.getOS then return true end - local osName = love.system.getOS() - return osName ~= "Android" and osName ~= "iOS" -end - --- GLSL 1.20-compatible (no array initializers; wavelength terms and the --- shadow blur are unrolled by hand). -local SHADER_SRC = [[ -extern number level; -extern number time; -extern number pixelScale; // screen pixels per GB pixel (integer fit scale) - -#define PI 3.14159265359 - -// ---- level thresholds (cumulative ladder) ---- -#define L_GRID 1.5 -#define L_SHADOW 2.5 -#define L_SUN 3.5 - -// ---- level 1: reflective backing ---- -#define BACK_BRIGHTNESS 0.48 -#define GRAIN_INTENSITY 0.065 -// #A6AC84 "Pocket" backing tint, normalized to unit mean brightness -#define POCKET_TINT vec3(1.0596, 1.0979, 0.8424) -#define BASE_ALPHA 0.20 -#define WHITE_EXTRA 0.75 -// front polarizer film tint -#define POLARIZER vec3(0.94, 1.0, 0.865) - -// ---- level 2: LCD grid (lcd1x style) ---- -#define BRIGHTEN_SCANLINES 16.0 -#define BRIGHTEN_LCD 4.0 - -// ---- level 3: drop shadow ---- -#define SHADOW_OFFSET 3.0 -#define SHADOW_OPACITY 0.5 - -// ---- level 4: sunlight ---- -#define GLARE_INTENSITY 0.15 -#define GLARE_SIGMA 0.25 -#define SHIMMER_INTENSITY 0.25 -// chroma amplification so the bands read on the already-desaturated, -// backing-blended image (reference applies 0.25 to raw film reflectance) -#define SHIMMER_CHROMA_GAIN 3.0 -#define SHIMMER_SPREAD 1.8 -#define LIGHT_RANGE 0.6 -#define FILM_NOISE_AMOUNT 0.5 -#define REFLECT_FLOOR 0.03 - -float hash21(vec2 p) -{ - return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); -} - -// smooth value noise, ~[0,1] -float vnoise(vec2 p) -{ - vec2 i = floor(p); - vec2 f = fract(p); - vec2 u = f * f * (3.0 - 2.0 * f); - float a = hash21(i); - float b = hash21(i + vec2(1.0, 0.0)); - float c = hash21(i + vec2(0.0, 1.0)); - float d = hash21(i + vec2(1.0, 1.0)); - return mix(mix(a, b, u.x), mix(c, d, u.x), u.y); -} - -float luma(vec3 c) -{ - return dot(c, vec3(0.2126, 0.7152, 0.0722)); -} - -vec4 effect(vec4 color, Image tex, vec2 tc, vec2 pc) -{ - vec4 src = Texel(tex, tc); - if (level < 0.5) { - return src * color; - } - - float ps = max(pixelScale, 1.0); - vec2 gbPix = pc / ps; // GB-pixel coordinates - vec2 texel = 1.0 / love_ScreenSize.xy; // one screen pixel in tc - vec2 gbTexel = texel * ps; // one GB pixel in tc - - // Drifting light position (normalized screen coords, upper area). - // Computed unconditionally: level 3 borrows it for shadow drift. - vec2 lightPos = vec2(0.5 + 0.35 * sin(time * 0.13), - 0.3 + 0.2 * sin(time * 0.07)); - - // ---- level 1: procedural backing material ---- - // flat gray + 3-octave paper grain, tinted warm - float grain = vnoise(gbPix * 0.9) * 0.5 - + vnoise(gbPix * 2.1 + vec2(17.0, 5.0)) * 0.3 - + vnoise(gbPix * 4.3 + vec2(3.0, 29.0)) * 0.2; - float backLum = BACK_BRIGHTNESS + (grain - 0.5) * (GRAIN_INTENSITY * 2.0); - vec3 back = backLum * POCKET_TINT; - - // ---- level 3: dark pixels cast a soft shadow onto the backing ---- - if (level >= L_SHADOW) { - vec2 shOff = vec2(SHADOW_OFFSET); - if (level >= L_SUN) { - // subtle drift opposite the light's wander - shOff += vec2((0.5 - lightPos.x) * 3.0, (0.3 - lightPos.y) * 3.0); - } - vec2 so = tc - shOff * gbTexel; - vec2 e = gbTexel; - // 9-tap gaussian blur of the offset sample's brightness (unrolled) - float s = 0.0; - s += luma(Texel(tex, so).rgb) * 4.0; - s += luma(Texel(tex, so + vec2( e.x, 0.0)).rgb) * 2.0; - s += luma(Texel(tex, so + vec2(-e.x, 0.0)).rgb) * 2.0; - s += luma(Texel(tex, so + vec2(0.0, e.y)).rgb) * 2.0; - s += luma(Texel(tex, so + vec2(0.0, -e.y)).rgb) * 2.0; - s += luma(Texel(tex, so + vec2( e.x, e.y)).rgb) * 1.0; - s += luma(Texel(tex, so + vec2( e.x, -e.y)).rgb) * 1.0; - s += luma(Texel(tex, so + vec2(-e.x, e.y)).rgb) * 1.0; - s += luma(Texel(tex, so + vec2(-e.x, -e.y)).rgb) * 1.0; - s /= 16.0; - float dark = 1.0 - s; - // deadzone: near-white pixels (dark ~ 0) cast no shadow at all - float shadow = dark * smoothstep(0.08, 0.30, dark) * SHADOW_OPACITY; - back = mix(back, back * 0.2, shadow); - } - - // ---- level 2: LCD subpixel grid on the lit image only ---- - vec3 lit = src.rgb; - if (level >= L_GRID) { - vec2 angle = 2.0 * PI * (gbPix - 0.25); - float yfac = (BRIGHTEN_SCANLINES + sin(angle.y)) - / (BRIGHTEN_SCANLINES + 1.0); - float xfac = (BRIGHTEN_LCD + sin(angle.x)) / (BRIGHTEN_LCD + 1.0); - lit *= yfac * xfac; - } - - // ---- level 1: brightness-proportional pixel transparency ---- - float lum = luma(src.rgb); - float a = BASE_ALPHA * lum; - // near-white pixels (luma > 0.90 AND min channel > 0.81) are nearly - // fully transparent -- narrow smoothsteps stand in for the hard AND - float mn = min(src.r, min(src.g, src.b)); - a += WHITE_EXTRA * smoothstep(0.88, 0.92, lum) * smoothstep(0.79, 0.83, mn); - vec3 col = mix(lit, back, clamp(a, 0.0, 1.0)); - - // ---- level 4: sunlight (glare + rainbow QWP shimmer) ---- - float glare = 0.0; - if (level >= L_SUN) { - float aspect = love_ScreenSize.x / love_ScreenSize.y; - vec2 p = vec2(tc.x * aspect, tc.y); - vec2 lp = vec2(lightPos.x * aspect, lightPos.y); - float d = distance(p, lp); - - // specular gaussian hotspot (added after the polarizer tint: - // it reflects off the front glass, not the LCD) - glare = GLARE_INTENSITY * exp(-d * d / (2.0 * GLARE_SIGMA * GLARE_SIGMA)); - - // quarter-wave-plate film: effective retardance (nm) grows with - // distance from the light point -> concentric interference bands; - // smooth "film thickness" noise makes the bands splotchy - float film = vnoise(gbPix * 0.06 + vec2(7.3, 2.9) + time * 0.01); - float gammaEff = (260.0 + 620.0 * SHIMMER_SPREAD * (d / LIGHT_RANGE)) - * (1.0 + FILM_NOISE_AMOUNT * (film - 0.5)); - float ph = 4.0 * PI * gammaEff; - - // 7 wavelength samples 400..700nm with approximate spectral RGB, - // unrolled (no const arrays in GLSL 1.20) - vec3 rb = vec3(0.0); - float cw; - cw = cos(ph / 400.0); rb += cw * cw * vec3(0.15, 0.00, 0.50); - cw = cos(ph / 450.0); rb += cw * cw * vec3(0.00, 0.10, 1.00); - cw = cos(ph / 500.0); rb += cw * cw * vec3(0.00, 0.80, 0.40); - cw = cos(ph / 550.0); rb += cw * cw * vec3(0.20, 1.00, 0.00); - cw = cos(ph / 600.0); rb += cw * cw * vec3(1.00, 0.60, 0.00); - cw = cos(ph / 650.0); rb += cw * cw * vec3(1.00, 0.10, 0.00); - cw = cos(ph / 700.0); rb += cw * cw * vec3(0.70, 0.00, 0.00); - rb /= vec3(3.05, 2.60, 1.90); // per-channel weight sums -> peak 1.0 - - // fade with distance from the light, kill on dark pixels, - // weight by pixel color squared - float att = 1.0 - smoothstep(0.0, LIGHT_RANGE, d); - float refl = max(lum, REFLECT_FLOOR); - // luminance-preserving tint: add only the chroma of the rainbow - vec3 shimmer = (rb - vec3(luma(rb))) * SHIMMER_CHROMA_GAIN - * src.rgb * src.rgb * refl * att; - col += shimmer * SHIMMER_INTENSITY; - } - - // front polarizer tint, then front-surface glare on top - col *= POLARIZER; - col += vec3(glare); - - return vec4(col, src.a) * color; -} -]] - -GBCFX.SHADER_SRC = SHADER_SRC -- exposed for the standalone compile check - -function GBCFX.shader() - if not GBCFX.isSupported() then return nil end - if shader == nil then - local ok, sh = pcall(love.graphics.newShader, SHADER_SRC) - shader = ok and sh or false - end - return shader or nil -end - -function GBCFX.setLevel(level) - if not GBCFX.isSupported() then - GBCFX.level = 0 - return - end - level = math.floor(tonumber(level) or 0) - if level < 0 then level = 0 end - if level > 4 then level = 4 end - GBCFX.level = level -end - --- Advance OFF → 1 → 2 → 3 → 4 → OFF. Returns the new level. -function GBCFX.cycle() - if not GBCFX.isSupported() then - GBCFX.level = 0 - return 0 - end - GBCFX.setLevel((GBCFX.level + 1) % 5) - return GBCFX.level -end - --- Apply opts.gbcfx. On unsupported platforms force OFF and clear a --- persisted non-zero value so boot recovers from a soft-brick. Returns --- true when opts was sanitized (caller should persist options.lua). -function GBCFX.applyOptions(opts) - if not GBCFX.isSupported() then - local had = opts and (tonumber(opts.gbcfx) or 0) ~= 0 - if opts then opts.gbcfx = 0 end - GBCFX.level = 0 - return had and true or false - end - GBCFX.setLevel(opts and opts.gbcfx or 0) - return false -end - -function GBCFX.levelLabel(level) - return GBCFX.LABELS[(level or GBCFX.level) + 1] or "OFF" -end - -function GBCFX.active() - return GBCFX.isSupported() and GBCFX.level > 0 and GBCFX.shader() ~= nil -end - --- Draw `canvas` fullscreen through the GBC FX shader into the current --- render target (or plain if the shader is unavailable). pixelScale is --- the integer screen-pixels-per-GB-pixel scale so grid/shadow offsets --- stay window-size independent. -function GBCFX.present(canvas, pixelScale) - local sh = GBCFX.shader() - if not sh or GBCFX.level <= 0 then - love.graphics.setColor(1, 1, 1, 1) - love.graphics.draw(canvas, 0, 0) - return - end - local t = 0 - if love.timer and love.timer.getTime then - t = love.timer.getTime() - end - sh:send("level", GBCFX.level) - sh:send("time", t) - sh:send("pixelScale", math.max(1, math.floor(tonumber(pixelScale) or 1))) - love.graphics.setShader(sh) - love.graphics.setColor(1, 1, 1, 1) - love.graphics.draw(canvas, 0, 0) - love.graphics.setShader() -end - -return GBCFX diff --git a/src/render/Renderer.lua b/src/render/Renderer.lua index 5ed14d47..c9da8b27 100644 --- a/src/render/Renderer.lua +++ b/src/render/Renderer.lua @@ -154,8 +154,8 @@ function Renderer:setWorldOverride(canvas) end -- Integer framebuffer pixels per GB pixel that fit the window. Zoom / --- GBCFX / callers treat this as the crisp scale; endFrame converts to LOVE --- units via / dpiX and / dpiY when drawing. +-- ShaderFX / callers treat this as the crisp scale; endFrame converts to +-- LOVE units via / dpiX and / dpiY when drawing. function Renderer:fitScale() local _, _, pw, ph = displayMetrics() local w, h = self:uiSize() @@ -594,7 +594,7 @@ function Renderer:drawTiltedWorld(zoneList, sx, sy, wox, woy, target, local zoneShader = zoneList and zoneList[1] and PaletteFX.shader() or nil if zoneShader then love.graphics.setShader(zoneShader) - -- same trueColor sentinel the flat blit honors (14 §trueColor) + -- same trueColor sentinel the flat blit below honors local bare = false for _, z in ipairs(zoneList) do local plain = z.colors == false @@ -785,8 +785,8 @@ end -- visible map area separately), applied to the world pass; the world -- pass falls back to the UI zones when absent. Each zone is drawn -- scissored through the shade-remap shader, later zones on top. --- When GBC FX is active the composite is drawn into presentCanvas and --- presented through the GBC FX shader as a final pass. +-- When ShaderFX is active the composite is drawn into presentCanvas and +-- presented through the shader chain as a final pass. function Renderer:frameRects() local ww, wh, pw, ph, dpiX, dpiY, vx, vy, cut = displayMetrics() local r = { @@ -850,7 +850,11 @@ function Renderer:endFrame(zones, worldZones) local vpw, vph, ox, oy = R.vpw, R.vph, R.ox, R.oy local Ux, Uy = R.Ux, R.Uy local uvpw, uvph, uox, uoy = R.uvpw, R.uvph, R.uox, R.uoy - local GBCFX = require("src.render.GBCFX") + local Up = R.Up + -- Physical-pixel numerators for ShaderFX's per-frame rect; derived from + -- the unit rects frameRects already lifted so both agree. + local uoxPx, uoyPx = uox * dpiX, uoy * dpiY + local ShaderFX = require("src.render.ShaderFX") -- Forced mono/Classic modes still need a whole-screen zone when a state -- exposes no SGB packets (raw DMG canvas), so sendColors can remap. zones = PaletteFX.ensureZones(zones) @@ -893,12 +897,12 @@ function Renderer:endFrame(zones, worldZones) end end - -- Post-process pipelines, GBC FX and an enabled final-output owner need the + -- Post-process pipelines, ShaderFX and an enabled final-output owner need the -- whole composite in a canvas. With none of them, the frame draws straight -- to the screen exactly as it always did. local hasOutputHook = Runtime.wantsHook("render.output") and Runtime.call("render.output_enabled", function() return false end) == true - local needPresent = GBCFX.active() or Pipelines.wantsPresent() or hasOutputHook + local needPresent = ShaderFX.active() or Pipelines.wantsPresent() or hasOutputHook local present = nil if needPresent then if not self.presentCanvas or self.presentCanvas:getWidth() ~= ww @@ -1003,6 +1007,17 @@ function Renderer:endFrame(zones, worldZones) return Renderer.clipToView(R, x, y, w, h) end + -- Real per-frame ShaderFX game rect + source content size, in PHYSICAL + -- framebuffer pixels -- what ShaderFX.render below actually draws through + -- the chain, instead of it reconstructing a fixed 160x144-at-base-Sp + -- approximation of its own. Defaults to this frame's real UI rect, which + -- is already correct whenever neither branch below overrides it + -- (title/menu/credits, no world active) -- uiFill is already folded into + -- Up above, so that case needs no extra handling here. + local fxRectPxX, fxRectPxY, fxRectPxW, fxRectPxH, fxScale = + uoxPx, uoyPx, uiw * Up, uih * Up, Up + local fxSrcW, fxSrcH = uiw, uih + if self.worldOverride then -- A render pipeline already produced the whole world -- terrain, -- characters and its own FX overlay -- as one window-resolution image, @@ -1010,6 +1025,13 @@ function Renderer:endFrame(zones, worldZones) -- skipped entirely (nothing drew into it). The UI blit below still -- runs, so dialogs, menus and the HUD sit on top as usual. love.graphics.setColor(1, 1, 1, 1) + -- worldOverride is already a window-resolution image drawn 1:1 at the + -- origin -- ShaderFX's real rect degenerates to the whole image, no + -- crop needed (source size == rect size). + fxRectPxX, fxRectPxY = 0, 0 + fxRectPxW, fxRectPxH = self.worldOverride:getPixelWidth(), self.worldOverride:getPixelHeight() + fxScale = 1 + fxSrcW, fxSrcH = fxRectPxW, fxRectPxH love.graphics.setScissor(vux, vuy, vuw, vuh) local loveMajor = love.getVersion() if love.system and love.system.getOS and love.system.getOS() == "iOS" and loveMajor >= 12 then @@ -1030,8 +1052,20 @@ function Renderer:endFrame(zones, worldZones) local sx, sy = sp / dpiX, sp / dpiY local wvw = self.worldCanvas:getWidth() local wvh = self.worldCanvas:getHeight() - local wox = (vx + math.floor((pw - wvw * sp) / 2)) / dpiX - local woy = (vy + math.floor((ph - wvh * sp) / 2) - R.lift) / dpiY + local woxPx = vx + math.floor((pw - wvw * sp) / 2) + local woyPx = vy + math.floor((ph - wvh * sp) / 2) - R.lift + local wox, woy = woxPx / dpiX, woyPx / dpiY + -- The real on-screen world rect at the CURRENT survey zoom -- can be + -- larger (zoomed out, more map revealed) or smaller than the UI's own + -- default rect above. ShaderFX.render below now shades this real rect + -- against this real wvw x wvh source, not a fixed 160x144 box, so a + -- grid/LCD-style effect's own math lines up with true on-screen pixels + -- at any zoom level. Covers both the flat blit below and the + -- Tilt-projected blit -- both share this wox/woy/sp/wvw/wvh. + fxRectPxX, fxRectPxY = woxPx, woyPx + fxRectPxW, fxRectPxH = wvw * sp, wvh * sp + fxScale = sp + fxSrcW, fxSrcH = wvw, wvh -- Tilt mode projects the ground world pass through the perspective mesh -- (SGB zones baked in beforehand -- see drawTiltedWorld -- so no zone -- scissoring here). drawTiltedWorld returns false when tilt is off or @@ -1243,9 +1277,9 @@ function Renderer:endFrame(zones, worldZones) if present then GameViewport.setTarget() -- Post-process pipelines run over the finished composite -- world, UI - -- and all -- and before GBC FX, so a blur or colour grade is what the - -- LCD grid is then drawn over rather than something that smears the - -- grid itself. Each pass hands back a canvas; with none registered + -- and all -- and before ShaderFX, so a blur or colour grade is what a + -- shader preset is then drawn over rather than something that smears + -- it. Each pass hands back a canvas; with none registered -- this returns `present` unchanged and the frame is byte-identical. local composed = Pipelines.present(present, { width = ww, height = wh, scale = Sp, dpi = dpiY, dpiX = dpiX, dpiY = dpiY }) or present @@ -1260,9 +1294,19 @@ function Renderer:endFrame(zones, worldZones) }) == true if not outputHandled then if cut then love.graphics.setScissor(vux, vuy, vuw, vuh) end - if GBCFX.active() then - -- shader grid/shadow math is in framebuffer pixels - GBCFX.present(composed, Sp) + if ShaderFX.active() then + -- The ShaderFX feature replaced GBCFX.lua's fixed level ladder + -- with a preset picker (GBCFX.lua itself removed). fxRectPx*/fxScale/fxSrc* + -- are this frame's REAL game rect + source size, set above by + -- whichever branch actually ran (worldOverride, worldActive at the + -- current survey zoom, or the UI-rect default for no-world/uiFill + -- states) -- not a fixed 160x144-at-base-Sp reconstruction, so the + -- chain sees true on-screen pixel geometry at any zoom/Faithful + -- Ratio state. + ShaderFX.render(composed, + { x = fxRectPxX, y = fxRectPxY, w = fxRectPxW, h = fxRectPxH, scale = fxScale }, + { w = fxSrcW, h = fxSrcH }, + dpiX, dpiY) else -- the present canvas only existed for the post-process, so put the -- result on the screen at the same 1:1 unit mapping it was built at diff --git a/src/render/ShaderFX.lua b/src/render/ShaderFX.lua new file mode 100644 index 00000000..9d41b833 --- /dev/null +++ b/src/render/ShaderFX.lua @@ -0,0 +1,1053 @@ +-- ShaderFX: runtime libretro slang-shader presets. Translated ahead of time +-- into a cached Lua artifact, then run as a LOVE canvas pass-graph over the +-- finished frame. Two independent slots, "main" and "secondary", chain in +-- that order. See docs/shaderfx.md. + +local ShaderFX = {} + +local Json = require("src.link.Json") +local SaveData = require("src.core.SaveData") +local Performance = require("src.core.Performance") + +-- ------- preset discovery: the local drop-in folder + +-- A real OS path, not a love.filesystem mount: the native bridge and the LUT +-- loads both read it directly. +function ShaderFX.presetDir() + local base = (SaveData.portableBaseDir and SaveData.portableBaseDir()) + or (love.filesystem and love.filesystem.getSaveDirectory and love.filesystem.getSaveDirectory()) + if not base then return nil end + local sep = package.config:sub(1, 1) + return base .. sep .. "shaders" +end + +function ShaderFX.list() + local dir = ShaderFX.presetDir() + if not dir then return {} end + love.filesystem.createDirectory("shaders") + local out = {} + local function scan(relPath) + local items = love.filesystem.getDirectoryItems(relPath) + for _, name in ipairs(items) do + local rel = relPath .. "/" .. name + local info = love.filesystem.getInfo(rel) + if info and info.type == "directory" then + scan(rel) + elseif name:match("%.slangp$") then + local entry = { name = name, relPath = rel, fullPath = dir .. rel:gsub("^shaders", "") } + entry.converted = ShaderFX.isConverted(entry) + out[#out + 1] = entry + end + end + end + local ok, err = pcall(scan, "shaders") + if not ok then + require("src.core.Logger").error("ShaderFX.list: scan failed: %s", tostring(err)) + return {} + end + table.sort(out, function(a, b) return a.name < b.name end) + return out +end + +function ShaderFX.artifactPath(entry) + return (entry.fullPath:gsub("%.slangp$", ".lua")) +end + +-- A real OS path outside any love.filesystem mount, so io.open, not getInfo. +function ShaderFX.isConverted(entry) + local f = io.open(ShaderFX.artifactPath(entry), "rb") + if not f then return false end + f:close() + return true +end + +-- ------- buildbot download: the second acquisition path, alongside the +-- local drop-in folder above. Downloaded presets arrive unconverted. +ShaderFX.BUILDBOT_URL = "https://buildbot.libretro.com/assets/frontend/shaders_slang.zip" + +local DOWNLOAD_ZIP_REL = "shaderfx_buildbot.zip" +local DOWNLOAD_MOUNT = "shaderfx_buildbot_mount" +-- The buildbot's own ETag, replayed as If-None-Match so a repeat download +-- that changed nothing costs one small request instead of the full transfer. +local DOWNLOAD_ETAG_REL = "shaderfx_buildbot.etag" + +-- Returns a Fetch job id; poll it with ShaderFX.downloadStatus(). A status of +-- "ok" with .notModified true means nothing was re-downloaded. +function ShaderFX.downloadPresets() + return require("src.net.Fetch").download(ShaderFX.BUILDBOT_URL, DOWNLOAD_ZIP_REL, + { etagRel = DOWNLOAD_ETAG_REL }) +end + +function ShaderFX.downloadStatus(jobId) + return require("src.net.Fetch").poll(jobId) +end + +-- Collapses "." and ".." segments; Lua has no stdlib equivalent. +local function normalizePath(path) + local parts = {} + for part in path:gmatch("[^/]+") do + if part == ".." then + if #parts > 0 and parts[#parts] ~= ".." then + parts[#parts] = nil + else + parts[#parts + 1] = ".." + end + elseif part ~= "." and part ~= "" then + parts[#parts + 1] = part + end + end + return table.concat(parts, "/") +end + +local function dirname(path) + return path:match("^(.*)/[^/]+$") or "" +end + +-- .png (a LUT) is a real dependency but never itself a source of references. +local TEXT_EXT = { slang = true, slangp = true, inc = true, h = true } +local REF_EXT = { slang = true, slangp = true, inc = true, h = true, png = true } + +-- Quoted assignments are matched first: the closing quote is an unambiguous +-- delimiter, so a path with spaces or parens survives (real packs ship them). +local function extractRefs(text) + local refs, seen = {}, {} + local function addPathRef(path) + local ext = path:match("%.(%a+)$") + if ext and REF_EXT[ext:lower()] and not seen[path] then + seen[path] = true + refs[#refs + 1] = path + end + end + for line in text:gmatch("[^\r\n]+") do + local quoted = line:match('=%s*"([^"]+)"') + if quoted then + addPathRef(quoted) + else + local bare = line:match('=%s*([%.%w/_%-]+)') + if bare then addPathRef(bare) end + end + end + for path in text:gmatch('#include%s+"([^"]+)"') do + if not seen[path] then seen[path] = true; refs[#refs + 1] = path end + end + for path in text:gmatch('#reference%s+"([^"]+)"') do + if not seen[path] then seen[path] = true; refs[#refs + 1] = path end + end + return refs +end + +local function findAll(dir, pattern) + local out = {} + local function scan(rel) + for _, name in ipairs(love.filesystem.getDirectoryItems(rel)) do + local sub = rel .. "/" .. name + local info = love.filesystem.getInfo(sub) + if info and info.type == "directory" then + scan(sub) + elseif name:match(pattern) then + out[#out + 1] = sub + end + end + end + scan(dir) + return out +end + +-- Curated shortlist of handheld/'s own 78 presets -- a temporary trim, expect +-- this list to change (see docs/shaderfx.md). +local KEPT_PRESETS = { + ["gameboy.slangp"] = true, + ["gameboy-advance-dot-matrix.slangp"] = true, + ["gameboy-color-dot-matrix.slangp"] = true, + ["gameboy-color-dot-matrix-white-bg.slangp"] = true, + ["gameboy-dark-mode.slangp"] = true, + ["gameboy-light.slangp"] = true, + ["gameboy-light-mode.slangp"] = true, + ["gameboy-pocket.slangp"] = true, + ["gameboy-pocket-high-contrast.slangp"] = true, + ["gb-palette-dmg.slangp"] = true, + ["gb-palette-light.slangp"] = true, + ["gb-palette-pocket.slangp"] = true, + ["sameboy-lcd.slangp"] = true, + ["dot.slangp"] = true, + ["lcd1x.slangp"] = true, + ["lcd1x_nds.slangp"] = true, + ["lcd1x_psp.slangp"] = true, + ["lcd3x.slangp"] = true, + ["simpletex_lcd.slangp"] = true, + ["simpletex_lcd_720p.slangp"] = true, + ["simpletex_lcd-4k.slangp"] = true, + ["zfast-lcd.slangp"] = true, + ["bevel.slangp"] = true, + ["sunlight_shimmer.slangp"] = true, + ["pixel_transparency.slangp"] = true, + ["retro-v3.slangp"] = true, +} + +-- BFS over the real file-level dependency closure of every KEPT_PRESETS entry +-- inside the mounted zip, copied preserving each file's zip-relative path. +local function extractClosure(mountRoot) + local queue = {} + for _, s in ipairs(findAll(mountRoot .. "/handheld", "%.slangp$")) do + if KEPT_PRESETS[s:match("([^/]+)$")] then queue[#queue + 1] = s end + end + local closure = {} + for _, s in ipairs(queue) do closure[s] = true end + + local head = 1 + while queue[head] do + local rel = queue[head] + head = head + 1 + local zipRel = rel:sub(#mountRoot + 2) -- strip "/" + local ext = zipRel:match("%.(%a+)$") + if ext and TEXT_EXT[ext:lower()] then + local text = love.filesystem.read(rel) + if text then + local base = dirname(zipRel) + for _, ref in ipairs(extractRefs(text)) do + local resolved = normalizePath(base == "" and ref or (base .. "/" .. ref)) + local mounted = mountRoot .. "/" .. resolved + if not closure[mounted] and love.filesystem.getInfo(mounted) then + closure[mounted] = true + queue[#queue + 1] = mounted + end + end + end + end + end + + -- love.filesystem.write does not create intermediate directories. + local madeDirs = {} + local function ensureDir(destPath) + local dir = dirname(destPath) + if dir == "" or madeDirs[dir] then return end + madeDirs[dir] = true + love.filesystem.createDirectory(dir) + end + + local copied = 0 + for rel in pairs(closure) do + local destPath = "shaders/" .. rel:sub(#mountRoot + 2) + local bytes = love.filesystem.read(rel) + if bytes then + ensureDir(destPath) + if love.filesystem.write(destPath, bytes) then copied = copied + 1 end + end + end + return copied +end + +-- Returns the number of files copied, or nil + an error string; a third +-- `unchanged` return means the ETag matched and no zip was ever written. +function ShaderFX.installDownloaded(notModified) + if notModified then + return 0, nil, true + end + love.filesystem.createDirectory("shaders") + if not love.filesystem.mount(DOWNLOAD_ZIP_REL, DOWNLOAD_MOUNT) then + return nil, "could not open the downloaded archive" + end + local ok, copiedOrErr = pcall(extractClosure, DOWNLOAD_MOUNT) + -- unmount() takes the ARCHIVE path passed to mount(), not the mountpoint. + love.filesystem.unmount(DOWNLOAD_ZIP_REL) + love.filesystem.remove(DOWNLOAD_ZIP_REL) + if not ok then return nil, tostring(copiedOrErr) end + return copiedOrErr +end + +-- ------- the native bridge (translation only, called by convert()) + +-- Where the vendored Rust bridge crate builds to, relative to the source dir. +ShaderFX.BRIDGE_DIR = "tools/shaderfx-bridge" + +-- Candidate names per OS, same shape as src/net/Gen1Tls.lua's libNames. +local function libNames() + local osName = (love and love.system and love.system.getOS + and love.system.getOS()) or "" + if osName == "Windows" then + return { "librashader_bridge.dll" } + elseif osName == "OS X" then + return { "liblibrashader_bridge.dylib", "librashader_bridge.dylib" } + end + -- Android resolves the bare name through jniLibs, so try it last. + return { "liblibrashader_bridge.so", "librashader_bridge.so" } +end + +-- getSource is the game directory (where the vendored crate sits); the base +-- directory is its parent (where a packaged build puts the library). +local function sourceDirs() + local out, seen = {}, {} + local function add(dir) + if type(dir) == "string" and dir ~= "" and not seen[dir] then + seen[dir] = true + out[#out + 1] = dir + end + end + local fs = love and love.filesystem + if fs then + if fs.getSource then add(fs.getSource()) end + if fs.getSourceBaseDirectory then add(fs.getSourceBaseDirectory()) end + if fs.getWorkingDirectory then add(fs.getWorkingDirectory()) end + end + if type(arg) == "table" and type(arg[0]) == "string" then + add(arg[0]:match("^(.*)[/\\]")) + end + add(".") + return out +end + +local function saveDir() + if love and love.filesystem and love.filesystem.getSaveDirectory then + local dir = love.filesystem.getSaveDirectory() + if type(dir) == "string" and dir ~= "" then return dir end + end + return nil +end + +local function fileReadable(path) + local f = io.open(path, "rb") + if not f then return false end + f:close() + return true +end + +-- Every place the bridge may sit, most specific first. +local function libCandidates() + local out = {} + local override = os.getenv("LIBRASHADER_BRIDGE_DLL") + if override and override ~= "" then out[#out + 1] = override end + local dirs, save = sourceDirs(), saveDir() + for _, name in ipairs(libNames()) do + for _, dir in ipairs(dirs) do + out[#out + 1] = dir .. "/" .. name + out[#out + 1] = dir .. "/" .. ShaderFX.BRIDGE_DIR .. "/target/release/" .. name + end + if save then out[#out + 1] = save .. "/" .. name end + out[#out + 1] = name + end + return out +end + +local lib +local libError + +local function ensureLib() + if lib then return lib end + if libError then return nil, libError end + local okFfi, ffi = pcall(require, "ffi") + if not okFfi or type(ffi) ~= "table" then + libError = "this build has no ffi, so presets cannot be converted here" + return nil, libError + end + pcall(ffi.cdef, [[ + char* librashader_translate_preset(const char* preset_path, int es); + void librashader_free_string(char* s); + ]]) + local tried = {} + for _, path in ipairs(libCandidates()) do + -- A bare name goes to the system loader; a path only when a file is there. + local bare = not path:find("[/\\]") + if bare or fileReadable(path) then + local ok, loaded = pcall(ffi.load, path) + if ok then lib = loaded; return lib end + end + tried[#tried + 1] = path + end + libError = "librashader bridge not found; looked in " .. table.concat(tried, ", ") + return nil, libError +end + +-- True when a preset can be converted on this machine. Activating an +-- already-converted preset never needs the bridge. +function ShaderFX.canConvert() + local l = ensureLib() + return l ~= nil +end + +function ShaderFX.bridgeError() + return libError +end + +-- `es`: true for GLSL ES 1.00 (mobile), false for GLSL 1.20 (desktop). Only +-- ever called from ShaderFX.convert(). +function ShaderFX.translate(fullPath, es) + local ffi = require("ffi") + local ok, l = pcall(ensureLib) + if not ok then return nil, "ffi.load failed: " .. tostring(l) end + local ptr = l.librashader_translate_preset(fullPath, es and 1 or 0) + if ptr == nil then return nil, "librashader_translate_preset returned NULL" end + local json = ffi.string(ptr) + l.librashader_free_string(ptr) + local preset, decodeErr = Json.decode(json) + if not preset then return nil, "JSON decode failed: " .. tostring(decodeErr) end + if preset.error then return nil, "translate_preset reported an error: " .. tostring(preset.error) end + if preset.pass_count ~= #preset.passes then + return nil, ("pass_count metadata (%s) disagrees with passes array length (%d)") + :format(tostring(preset.pass_count), #preset.passes) + end + return preset +end + +-- love.graphics.newImage cannot open an absolute path outside LOVE's own +-- mounts, which is where a preset's LUTs live, so read the bytes by hand. +function ShaderFX.loadImageFromPath(path) + local f, err = io.open(path, "rb") + if not f then return nil, "io.open failed: " .. tostring(err) end + local bytes = f:read("*a") + f:close() + local byteData = love.data.newByteData(bytes) + local imgData = love.image.newImageData(byteData) + return love.graphics.newImage(imgData) +end + +-- librashader's wrap_mode names are not LOVE's; ES3-legal set only. +local function loveWrapMode(w) + if w == "clamp_to_border" then return "clampzero" + elseif w == "clamp_to_edge" then return "clamp" + elseif w == "repeat" then return "repeat" + elseif w == "mirrored_repeat" then return "mirroredrepeat" + else error("loveWrapMode: unknown wrap_mode " .. tostring(w)) end +end + +-- Called once per activate(). A LUT that fails to load is logged and left nil; +-- runPass's own sampler assert is the fail-loud point, not this. +local function loadLuts(preset) + local byName = {} + for _, t in ipairs(preset.textures) do + local img, err = ShaderFX.loadImageFromPath(t.path) + if img then + img:setFilter(t.filter_mode, t.filter_mode) + img:setWrap(loveWrapMode(t.wrap_mode)) + else + require("src.core.Logger").error("ShaderFX: LUT %s (%s) failed to load: %s", + t.name, tostring(t.path), tostring(err)) + end + byName[t.name] = img + end + return byName +end + +-- ------- the pass-graph runtime + +local Fixup = require("src.render.ShaderFixup") +local Sensors = require("src.core.Sensors") +local ShaderSourcePatches = require("src.render.ShaderSourcePatches") + +-- Glsl100Es (mobile) vs Glsl120 (desktop). Convert and render always run on +-- the same device, so the dialect emitted and the one validated always agree. +local function defaultEs() + if not love or not love.system or not love.system.getOS then return false end + local osName = love.system.getOS() + return osName == "Android" or osName == "iOS" +end + +local function roundDim(x) return math.max(1, math.floor(x + 0.5)) end + +local function resolveScale(scaling, viewportDim, inputDim, originalDim) + local st = scaling.scale_type + if st == "absolute" then return roundDim(scaling.factor) + elseif st == "viewport" then return roundDim(viewportDim * scaling.factor) + elseif st == "source" then return roundDim(inputDim * scaling.factor) + elseif st == "original" then return roundDim(originalDim * scaling.factor) + else error("resolveScale: unknown scale_type " .. tostring(st)) end +end + +local function sizeVec(dims) return { dims.w, dims.h, 1 / dims.w, 1 / dims.h } end + +-- One instance per loaded preset, never module-global, so switching presets +-- cannot leak a previous preset's canvases or dims. +local function newChainState(preset) + local state = { preset = preset, outputDims = {}, ALL_DEFAULTS = {}, + shaderCache = {}, canvasCache = {} } + for _, pass in ipairs(preset.passes) do + for _, p in ipairs(pass.parameters) do state.ALL_DEFAULTS[p.id] = p.initial end + end + for _, o in ipairs(preset.parameter_overrides) do state.ALL_DEFAULTS[o.name] = o.value end + return state +end + +local function passInputDims(state, i, original) + return (i == 0) and original or assert(state.outputDims[i - 1], + ("pass%d: input dims requested before pass%d ran"):format(i, i - 1)) +end + +local function computePassDims(state, i, pass, viewport, original) + local inputDims = passInputDims(state, i, original) + return { + w = resolveScale(pass.scale_x, viewport.w, inputDims.w, original.w), + h = resolveScale(pass.scale_y, viewport.h, inputDims.h, original.h), + } +end + +-- love.sensor.SensorType each built-in motion semantic reads from. +-- AccelerometerRest is librashader's calibration reference, not a real kind. +local SENSOR_KIND = { Accelerometer = "accelerometer", Gyroscope = "gyroscope" } + +-- Yaw integration: deliberately a decaying spring, not a true heading -- +-- gyro-only integration drifts without a magnetometer. Tuned on-device. +local YAW_SHADER_NAME = "sunlight_shimmer.slangp" -- the only twist-reactive preset +local YAW_GAIN = 0.6 +local YAW_TWIST_CLAMP = 2 +local YAW_DECAY_PER_SEC = 2.0 -- higher = snaps back to neutral faster + +-- Throttled on-device diagnostic (~1/sec per slot), tagged for logcat. +local debugLastLog = {} +local function debugThrottle(key) + local now = love.timer and love.timer.getTime() or os.clock() + if not debugLastLog[key] or now - debugLastLog[key] >= 1.0 then + debugLastLog[key] = now + return true + end + return false +end + +local function updateYawTwist(state, dt) + if not state or state.entryName ~= YAW_SHADER_NAME then return end + local gx, yawRate, gz = Sensors.read("gyroscope") + local twist = (state.yawTwist or 0) + yawRate * dt * YAW_GAIN + twist = twist * math.exp(-YAW_DECAY_PER_SEC * dt) + twist = math.max(-YAW_TWIST_CLAMP, math.min(YAW_TWIST_CLAMP, twist)) + state.yawTwist = twist + if debugThrottle("yaw:" .. tostring(state.entryName)) then + require("src.core.Logger").info( + "[DEBUG-tfxsns2] yaw entry=%s gyro=(%.3f,%.3f,%.3f) dt=%.4f twist=%.4f", + tostring(state.entryName), gx, yawRate, gz, dt, twist) + end +end + +local function sizeTable(state, i, dims, sizeUniforms, viewport, original) + local values = { + OutputSize = sizeVec(dims), + SourceSize = sizeVec(passInputDims(state, i, original)), + OriginalSize = sizeVec(original), + } + for _, entry in ipairs(sizeUniforms) do + if entry.kind == "unique" and entry.semantic == "Output" then + values[entry.name] = sizeVec(dims) + elseif entry.kind == "unique" and SENSOR_KIND[entry.semantic] then + local x, y, z = Sensors.read(SENSOR_KIND[entry.semantic]) + local dbgRawX, dbgRawY, dbgRawZ = x, y, z + if entry.semantic == "Accelerometer" then + -- Calibrate against the pose captured at activate(), then swap gravity + -- onto the axis getOrientedTilt ignores (this engine rests upright). + if state.accelRest then + x = x - state.accelRest[1] + y = y - state.accelRest[2] + z = z - state.accelRest[3] + end + y, z = z, y + -- Keep getOrientedTilt's normalize denominator stable, but only against + -- a live reading: an all-zero raw read is Sensors.lua's no-hardware sentinel. + if state.accelRest and (dbgRawX ~= 0 or dbgRawY ~= 0 or dbgRawZ ~= 0) then + z = 9.8 + end + if state.entryName == YAW_SHADER_NAME and state.yawTwist then + -- The only already-compiled channel this preset's stock math reads. + x = x + state.yawTwist + end + end + values[entry.name] = { x, y, z } + if entry.semantic == "Accelerometer" then + -- Test seam: the values that actually reached the packed uniform. + state.lastAccelPacked = { x, y, z } + if debugThrottle("accel:" .. tostring(state.entryName)) then + local d = state.ALL_DEFAULTS or {} + require("src.core.Logger").info( + "[DEBUG-tfxsns2] accel entry=%s raw=(%.3f,%.3f,%.3f) packed=(%.3f,%.3f,%.3f) mag=%.3f twist=%s " .. + "ACCEL_ENABLE=%s SHADOW_MOTION=%s YAW_ENABLE=%s SENSITIVITY=%s", + tostring(state.entryName), dbgRawX, dbgRawY, dbgRawZ, x, y, z, + math.sqrt(x * x + y * y + z * z), tostring(state.yawTwist), + tostring(d.PT_ACCEL_ENABLE), tostring(d.PT_SHADOW_MOTION), + tostring(d.PT_YAW_ENABLE), tostring(d.PT_ACCEL_SENSITIVITY)) + end + end + elseif entry.kind == "unique" and entry.semantic == "AccelerometerRest" then + values[entry.name] = { 0, 0, 0 } + elseif entry.kind == "unique" and entry.semantic == "Rotation" then + -- retroarch_get_rotation(): the CONTENT's rotation, not the device's. + -- Nothing here rotates GB content, so 0 is correct, not a placeholder. + values[entry.name] = 0 + elseif entry.kind == "texture" then + if entry.semantic == "Original" then + values[entry.name] = sizeVec(original) + elseif entry.semantic == "Source" then + values[entry.name] = sizeVec(passInputDims(state, i, original)) + elseif entry.semantic == "OriginalHistory" then + -- Steady-state fallback: every history slot reads the current frame. + values[entry.name] = sizeVec(original) + elseif entry.semantic == "PassOutput" then + values[entry.name] = sizeVec(assert(state.outputDims[entry.index], + ("pass%d: %s references pass%d's output, not yet computed") + :format(i, entry.name, entry.index))) + elseif entry.semantic == "PassFeedback" or entry.semantic == "User" then + error(("pass%d: %s is a %s size uniform -- not yet supported") + :format(i, entry.name, entry.semantic)) + end + end + end + return values +end + +-- Runs pass `i`, drawing `srcImg` into a freshly sized canvas. `lutByName` +-- resolves a User-semantic sampler by the name the translation reported. +local function runPass(state, i, pass, outputs, frameSource, lutByName, viewport, original) + local dims = computePassDims(state, i, pass, viewport, original) + state.outputDims[i] = dims + + -- Compiled once per (state, pass): a pass's GLSL and manifest depend only on + -- the preset, never on per-frame input. fragManifest is cached alongside it. + local cached = state.shaderCache[i] + local shader, fragManifest + if cached then + shader, fragManifest = cached.shader, cached.fragManifest + else + local fixedFragBody + fixedFragBody, fragManifest = Fixup.fragment(pass.fragment) + local fixedVert, vertManifest = Fixup.vertex(pass.vertex) + assert(#fragManifest == #vertManifest, ("pass%d: PUSH struct member count differs"):format(i)) + + local validateErrs = {} + local isEs = defaultEs() + for headIdx, head in ipairs(Fixup.PREC_HEADS) do + local fixedFrag = head .. fixedFragBody + local okShader, err = love.graphics.validateShader(isEs, fixedFrag, fixedVert) + if okShader then + shader = love.graphics.newShader(fixedFrag, fixedVert) + break + else + validateErrs[#validateErrs + 1] = ("variant %d: %s"):format(headIdx, tostring(err)) + end + end + if not shader then + require("src.core.Logger").error("ShaderFX: pass%d shader failed to validate -- %s", + i, table.concat(validateErrs, " | ")) + end + assert(shader, ("pass%d: no PREC_HEADS variant validated (%s)") + :format(i, table.concat(validateErrs, " | "))) + state.shaderCache[i] = { shader = shader, fragManifest = fragManifest } + end + + for _, s in ipairs(pass.samplers) do + local img + if s.semantic == "Source" then img = (i == 0) and frameSource or outputs[i - 1] + elseif s.semantic == "Original" then img = frameSource + elseif s.semantic == "OriginalHistory" then img = frameSource + elseif s.semantic == "PassOutput" then img = outputs[s.index] + elseif s.semantic == "User" then img = lutByName and lutByName[s.user_name] end + assert(img, ("pass%d: no binding resolved for sampler %s (semantic=%s)") + :format(i, s.name, tostring(s.semantic))) + pcall(shader.send, shader, "LIBRA_TEXTURE_" .. s.name, img) + end + + local values = sizeTable(state, i, dims, pass.size_uniforms, viewport, original) + for name, value in pairs(state.ALL_DEFAULTS) do values[name] = value end + local packed = Fixup.packValues(fragManifest, values) + for name, value in pairs(packed) do pcall(shader.send, shader, name, value) end + + local srcImg = (i == 0) and frameSource or outputs[i - 1] + local srcDims = passInputDims(state, i, original) + local drawScaleX, drawScaleY = dims.w / srcDims.w, dims.h / srcDims.h + + -- Reallocated only when this pass's resolved size actually changes. + local cc = state.canvasCache[i] + local canvas + if cc and cc.w == dims.w and cc.h == dims.h then + canvas = cc.canvas + else + canvas = love.graphics.newCanvas(dims.w, dims.h) + canvas:setFilter("nearest", "nearest") + state.canvasCache[i] = { canvas = canvas, w = dims.w, h = dims.h } + end + + love.graphics.push("all") + love.graphics.setCanvas(canvas) + love.graphics.clear(0, 0, 0, 0) + love.graphics.setShader(shader) + if i == state.preset.pass_count - 1 then + love.graphics.setBlendMode("replace", "premultiplied") + else + love.graphics.setBlendMode("replace") + end + love.graphics.draw(srcImg, 0, 0, 0, drawScaleX, drawScaleY) + love.graphics.pop() + + outputs[i] = canvas +end + +-- Runs the whole chain once over `frameSource` (sized `original`), with +-- `viewport` the size "viewport" scale_type passes resolve against. +function ShaderFX.runChain(state, frameSource, lutByName, viewport, original) + local outputs = {} + state.outputDims = {} + for i = 0, state.preset.pass_count - 1 do + runPass(state, i, state.preset.passes[i + 1], outputs, frameSource, lutByName, viewport, original) + end + return outputs[state.preset.pass_count - 1] +end + +-- ------- public, minimal load/render entry points + +-- Loads one entry from its cached Lua artifact; never calls the bridge. +-- Returns a chain state, or nil + an error when it has not been converted. +function ShaderFX.load(entry) + local path = ShaderFX.artifactPath(entry) + local chunk, err = loadfile(path) + if not chunk then + return nil, "no cached artifact, convert this preset first: " .. tostring(err) + end + local ok, preset = pcall(chunk) + if not ok then return nil, "cached artifact failed to run: " .. tostring(preset) end + if type(preset) ~= "table" then return nil, "cached artifact did not return a table" end + local state = newChainState(preset) + state.entryName = entry.name -- see updateYawTwist/sizeTable's Accelerometer branch + return state +end + +-- Every #pragma parameter the entry's artifact declares, deduped by id, each +-- with its currently-effective default. Reads the artifact only. +function ShaderFX.listParams(entry) + local state, err = ShaderFX.load(entry) + if not state then return nil, err end + local order, byId = {}, {} + for _, pass in ipairs(state.preset.passes) do + for _, p in ipairs(pass.parameters) do + if not byId[p.id] then + byId[p.id] = p + order[#order + 1] = p.id + end + end + end + local out = {} + for _, id in ipairs(order) do + local p = byId[id] + -- "!"-prefixed descriptions are engine-owned, not a player preference, so + -- they never become an editable row. No preset uses this today. + if not (p.description and p.description:sub(1, 1) == "!") then + out[#out + 1] = { + id = p.id, description = p.description, + minimum = p.minimum, maximum = p.maximum, step = p.step, + initial = state.ALL_DEFAULTS[p.id], + } + end + end + return out +end + +-- ------- active-preset tracking and the real endFrame render entry point + +-- ------- AOT convert: the one function that calls the bridge, writing its +-- decoded result to disk as a plain Lua artifact. + +-- #t counts a trailing nil as absent, so walk every key instead. +local function arrayLen(t) + local n = 0 + for _ in pairs(t) do n = n + 1 end + for i = 1, n do + if t[i] == nil then return nil end + end + return n +end + +-- Serializes the string/number/boolean/nested-table shape Json.decode +-- produces; array-shaped tables (arrayLen) serialize positionally. +local function serializeLua(v, buf) + local t = type(v) + if t == "string" then + buf[#buf + 1] = string.format("%q", v) + elseif t == "number" or t == "boolean" then + buf[#buf + 1] = tostring(v) + elseif t == "table" then + buf[#buf + 1] = "{" + local n = arrayLen(v) + if n then + for i = 1, n do + serializeLua(v[i], buf) + buf[#buf + 1] = "," + end + else + for k, item in pairs(v) do + assert(type(k) == "string", "serializeLua: non-string, non-array-index table key") + buf[#buf + 1] = "[" .. string.format("%q", k) .. "]=" + serializeLua(item, buf) + buf[#buf + 1] = "," + end + end + buf[#buf + 1] = "}" + else + error("serializeLua: unsupported value type " .. t) + end +end + +-- Translates `entry` via the bridge and writes ShaderFX.artifactPath(entry). +-- Sets entry.converted on success; an existing artifact survives a failure. +function ShaderFX.convert(entry, es) + ShaderSourcePatches.apply(entry) + local preset, err = ShaderFX.translate(entry.fullPath, es == nil and defaultEs() or es) + if not preset then return false, err end + local buf = {} + serializeLua(preset, buf) + local path = ShaderFX.artifactPath(entry) + local f, ferr = io.open(path, "wb") + if not f then return false, "io.open failed: " .. tostring(ferr) end + f:write("return ") + f:write(table.concat(buf)) + f:write("\n") + f:close() + entry.converted = true + return true +end + +-- Two independent slots. "shaderfx" stays main's option key, so existing +-- saves keep meaning what they already meant. +ShaderFX.SLOTS = { "main", "secondary" } +ShaderFX.OPTION_KEY = { main = "shaderfx", secondary = "shaderfxSecondary" } + +local slots = { main = {}, secondary = {} } -- slots[s] = { state=, entry= } +local autoActivateTried = false -- see applyOptions()/tryAutoActivateFromEnv() below + +-- Loads `entry`'s cached artifact into `slot` and makes it that slot's active +-- preset. `paramOverrides` layers a player's pragma edits over ALL_DEFAULTS. +function ShaderFX.activate(slot, entry, paramOverrides) + assert(slots[slot], "ShaderFX.activate: unknown slot " .. tostring(slot)) + local state, err = ShaderFX.load(entry) + if not state then return false, err end + if paramOverrides then + for id, value in pairs(paramOverrides) do state.ALL_DEFAULTS[id] = value end + end + state.luts = loadLuts(state.preset) + -- Snapshot whatever pose the player is actually holding right now as neutral, + -- subtracted from every later reading. Recalibrates on every activate(). + state.accelRest = { Sensors.read("accelerometer") } + require("src.core.Logger").info( + "[DEBUG-tfxsns2] activate entry=%s accelRest=(%.3f,%.3f,%.3f)", + tostring(entry and entry.name), state.accelRest[1], state.accelRest[2], state.accelRest[3]) + slots[slot].state, slots[slot].entry = state, entry + return true +end + +-- `slot` nil deactivates both. +function ShaderFX.deactivate(slot) + if slot then + slots[slot].state, slots[slot].entry = nil, nil + else + for _, s in pairs(slots) do s.state, s.entry = nil, nil end + end +end + +-- `slot` nil answers "is anything active". +function ShaderFX.active(slot) + if slot then return slots[slot].state ~= nil end + return slots.main.state ~= nil or slots.secondary.state ~= nil +end + +function ShaderFX.activeEntry(slot) + return slots[slot] and slots[slot].entry +end + +-- Finds a ShaderFX.list() entry by its `name` field, or nil (e.g. the preset +-- was deleted from the drop-in folder since it was selected). +function ShaderFX.findEntry(name) + if not name or name == "" then return nil end + for _, entry in ipairs(ShaderFX.list()) do + if entry.name == name then return entry end + end + return nil +end + +-- Under AUTO, a tier that caps shaderfx off would force-deactivate a persisted +-- preset choice every boot; pin "high" instead. Never touches an explicit +-- performance choice, and never un-escalates on deactivate. +local function escalatePerformanceIfNeeded(opts) + if not opts then return false end + local wantsShaderfx = false + for _, slot in ipairs(ShaderFX.SLOTS) do + local want = opts[ShaderFX.OPTION_KEY[slot]] + if want and want ~= "" then wantsShaderfx = true end + end + if not wantsShaderfx then return false end + if opts.performance ~= nil and opts.performance ~= "auto" then return false end + local Performance = require("src.core.Performance") + if Performance.caps("auto").shaderfx then return false end + opts.performance = "high" + return true +end + +function ShaderFX.applyOptions(opts) + autoActivateTried = true + local cleared = false + for _, slot in ipairs(ShaderFX.SLOTS) do + local key = ShaderFX.OPTION_KEY[slot] + local want = opts and opts[key] + if not want or want == "" then + ShaderFX.deactivate(slot) + else + local entry = ShaderFX.findEntry(want) + if not entry then + if opts then opts[key] = nil end + ShaderFX.deactivate(slot) + cleared = true + else + -- isConverted() is existence-only with no staleness check, so a saved + -- choice reconverts here too -- at boot/options-save, never per frame. + local convOk, convErr = ShaderFX.convert(entry) + if not convOk then + require("src.core.Logger").error("ShaderFX.applyOptions: reconvert failed for %s (%s): %s", + want, slot, tostring(convErr)) + end + local paramOverrides = opts.shaderfxParams and opts.shaderfxParams[entry.name] + local ok, err = ShaderFX.activate(slot, entry, paramOverrides) + if not ok then + require("src.core.Logger").error("ShaderFX.applyOptions: %s (%s) failed to activate: %s", + want, slot, tostring(err)) + if opts then opts[key] = nil end + ShaderFX.deactivate(slot) + cleared = true + end + end + end + end + if escalatePerformanceIfNeeded(opts) then cleared = true end + return cleared +end + +-- Stand-in from before the real OPTIONS row existed; only still fires for +-- harnesses that call ShaderFX.render() without ever calling applyOptions(). +local function tryAutoActivateFromEnv() + autoActivateTried = true + local want = os.getenv("POKEPORT_SHADERFX") + if not want or want == "" then return end + local entry = ShaderFX.findEntry(want) + if not entry then + require("src.core.Logger").error("ShaderFX: POKEPORT_SHADERFX=%s not found under %s", + want, tostring(ShaderFX.presetDir())) + return + end + local ok, err = ShaderFX.activate("main", entry) + if not ok then + require("src.core.Logger").error("ShaderFX: POKEPORT_SHADERFX=%s failed to activate: %s", + want, tostring(err)) + end +end + +-- Crops the playfield rect out of `canvas` at `renderScale`. The output canvas +-- is cached module-wide and reallocated only on a real size change. +local cropCanvasCache +local function cropToGbSource(canvas, rect, srcW, srcH, renderScale) + -- Cheap insurance against a read-after-write hazard between this draw and + -- whatever last rendered into `canvas`. + love.graphics.flushBatch() + local outW, outH = roundDim(srcW * renderScale), roundDim(srcH * renderScale) + local quad = love.graphics.newQuad(rect.x, rect.y, rect.w, rect.h, + canvas:getPixelWidth(), canvas:getPixelHeight()) + local out + if cropCanvasCache and cropCanvasCache.w == outW and cropCanvasCache.h == outH then + out = cropCanvasCache.canvas + else + out = love.graphics.newCanvas(outW, outH) + out:setFilter("nearest", "nearest") + cropCanvasCache = { canvas = out, w = outW, h = outH } + end + local invScale = renderScale / rect.scale + love.graphics.push("all") + love.graphics.setCanvas(out) + love.graphics.clear(0, 0, 0, 0) + love.graphics.setBlendMode("replace") + -- push("all") saves the caller's draw color but does not reset it: a menu can + -- leave it black, which would multiply the whole crop to black. + love.graphics.setColor(1, 1, 1, 1) + love.graphics.draw(canvas, quad, 0, 0, 0, invScale, invScale) + love.graphics.pop() + return out +end + +-- The tier's SHADER FX chain-resolution multiplier; 1.0 when the tier's cap is +-- not a number. +local function chainRenderScale() + local caps = Performance.CAPS[Performance.tier] + return (caps and tonumber(caps.shaderfx)) or 1.0 +end + +-- Renderer.lua's endFrame entry point. `canvas` is the finished window-size +-- composite; `rect` is this frame's real game rect in PHYSICAL framebuffer +-- pixels and `source` the content size it frames. See docs/shaderfx.md. +function ShaderFX.render(canvas, rect, source, dpiX, dpiY) + if not autoActivateTried then tryAutoActivateFromEnv() end + if not slots.main.state and not slots.secondary.state then + love.graphics.setColor(1, 1, 1, 1) + love.graphics.draw(canvas, 0, 0) + return + end + + dpiX, dpiY = tonumber(dpiX) or 1, tonumber(dpiY) or 1 + -- Same physical location as `rect`, in the logical units LOVE draws in. + local uRect = { + x = math.floor(rect.x / dpiX), y = math.floor(rect.y / dpiY), + w = math.floor(rect.w / dpiX), h = math.floor(rect.h / dpiY), + } + -- Runs the chain at a reduced internal resolution on tiers that ask for one. + local scale = chainRenderScale() + local viewport = { w = roundDim(uRect.w * scale), h = roundDim(uRect.h * scale) } + + -- exposed for tests only (tests/drivers/gold_shaderfx_zoom_sizing_test.lua) + ShaderFX._lastRect, ShaderFX._lastSource = rect, source + + local dt = love.timer and love.timer.getDelta() or 0 + updateYawTwist(slots.main.state, dt) + updateYawTwist(slots.secondary.state, dt) + -- Test seam: the live per-frame integration, before it rides into the shader. + ShaderFX._lastYawTwist = { + main = slots.main.state and slots.main.state.yawTwist, + secondary = slots.secondary.state and slots.secondary.state.yawTwist, + } + + local ok, chainOut, chainPreset = pcall(function() + local frameSource = cropToGbSource(canvas, rect, source.w, source.h, scale) + -- exposed for tests only (gold_shaderfx_menu_black_crop_test.lua) + ShaderFX._lastCrop = frameSource + local dims = { w = frameSource:getWidth(), h = frameSource:getHeight() } + local img, preset = frameSource, nil + if slots.main.state then + img = ShaderFX.runChain(slots.main.state, img, slots.main.state.luts, viewport, dims) + dims = { w = img:getWidth(), h = img:getHeight() } + preset = slots.main.state.preset + end + if slots.secondary.state then + img = ShaderFX.runChain(slots.secondary.state, img, slots.secondary.state.luts, viewport, dims) + dims = { w = img:getWidth(), h = img:getHeight() } + preset = slots.secondary.state.preset + end + return img, preset + end) + + if not ok or not chainOut then + require("src.core.Logger").error( + "ShaderFX.render chain failed ok=%s chainOut=%s err=%s", + tostring(ok), tostring(chainOut), tostring(not ok and chainOut or nil)) + end + + love.graphics.setColor(1, 1, 1, 1) + love.graphics.setBlendMode("replace") + love.graphics.draw(canvas, 0, 0) + if ok and chainOut then + -- A chain's final pass need not land on the viewport size (most presets end + -- at scale_type="source"), so stretch, using that pass's own filter. + local cw, ch = chainOut:getWidth(), chainOut:getHeight() + local lastPass = chainPreset.passes[chainPreset.pass_count] + local mode = (lastPass.filter == "linear") and "linear" or "nearest" + chainOut:setFilter(mode, mode) + love.graphics.setColor(1, 1, 1, 1) + love.graphics.setBlendMode("alpha") + love.graphics.draw(chainOut, uRect.x, uRect.y, 0, uRect.w / cw, uRect.h / ch) + elseif not ok then + require("src.core.Logger").error("ShaderFX.render: chain failed, showing unprocessed frame: %s", + tostring(chainOut)) + end + love.graphics.setBlendMode("alpha") + -- Test seam; set only after the real chain ran. + ShaderFX._lastAccelPacked = { + main = slots.main.state and slots.main.state.lastAccelPacked, + secondary = slots.secondary.state and slots.secondary.state.lastAccelPacked, + } +end + +return ShaderFX diff --git a/src/render/ShaderFixup.lua b/src/render/ShaderFixup.lua new file mode 100644 index 00000000..ff0293db --- /dev/null +++ b/src/render/ShaderFixup.lua @@ -0,0 +1,295 @@ +-- Mechanical GLSL rewrites over librashader's emitted output: it emits a +-- standalone void main()/gl_FragData[0]/gl_Position shape, LOVE requires the +-- effect()/position() convention. Not a GLSL parser -- every rule here exists +-- because a real preset failed without it. See docs/shaderfx.md. +local Fixup = {} + +local function stripVersion(src) + return (src:gsub("#version%s+%d+%s*\n", "")) +end + +-- ES 1.00 has no array-constructor syntax at all; SPIRV-Cross emits it anyway. +-- Splitting needs paren-depth awareness, since an element can be vec2(a, b). +local function splitTopLevelCommas(s) + local parts, depth, start = {}, 0, 1 + for i = 1, #s do + local c = s:sub(i, i) + if c == "(" then + depth = depth + 1 + elseif c == ")" then + depth = depth - 1 + elseif c == "," and depth == 0 then + parts[#parts + 1] = s:sub(start, i - 1) + start = i + 1 + end + end + parts[#parts + 1] = s:sub(start) + return parts +end + +local function elementAssignLines(name, elemsStr) + local lines = {} + for i, elem in ipairs(splitTopLevelCommas(elemsStr)) do + lines[#lines + 1] = ("%s[%d] = %s;"):format(name, i - 1, elem:match("^%s*(.-)%s*$")) + end + return lines +end + +local function rewriteArrayLiterals(src) + local injections = {} + -- const, global scope: relocate the per-element assignments into main(). + src = src:gsub( + "const%s+([%w_]+)%s+([%w_]+)%s*%[%s*(%d+)%s*%]%s*=%s*[%w_]+%s*%[%s*%]%s*(%b())%s*;", + function(typ, name, size, parenElems) + for _, line in ipairs(elementAssignLines(name, parenElems:sub(2, -2))) do + injections[#injections + 1] = " " .. line + end + return ("%s %s[%s];"):format(typ, name, size) + end) + if #injections > 0 then + src = src:gsub("(void%s+main%s*%(%s*%)%s*{)", + "%1\n" .. table.concat(injections, "\n"), 1) + end + -- non-const, local declaration+initializer: rewrite in place. + src = src:gsub( + "([%w_]+)%s+([%w_]+)%s*%[%s*(%d+)%s*%]%s*=%s*[%w_]+%s*%[%s*%]%s*(%b())%s*;", + function(typ, name, size, parenElems) + local lines = elementAssignLines(name, parenElems:sub(2, -2)) + return ("%s %s[%s];\n "):format(typ, name, size) .. table.concat(lines, "\n ") + end) + -- bare reassignment of an already-declared array: rewrite in place. + src = src:gsub( + "([%w_]+)%s*=%s*[%w_]+%s*%[%s*%]%s*(%b())%s*;", + function(name, parenElems) + return table.concat(elementAssignLines(name, parenElems:sub(2, -2)), "\n ") + end) + -- array-to-array copy (`float param_1[7] = coeffs;`): ES 1.00 has no + -- whole-array assignment either, so copy element by element. + src = src:gsub( + "([%w_]+)%s+([%w_]+)%s*%[%s*(%d+)%s*%]%s*=%s*([%w_]+)%s*;", + function(typ, name, size, srcName) + local lines = {} + for i = 0, tonumber(size) - 1 do + lines[#lines + 1] = ("%s[%d] = %s[%d];"):format(name, i, srcName, i) + end + return ("%s %s[%s];\n "):format(typ, name, size) .. table.concat(lines, "\n ") + end) + return src +end +Fixup.rewriteArrayLiterals = rewriteArrayLiterals + +-- ES 1.00 has no `%` operator. `%` is only ever defined for integer operands, +-- so float mod() is exact here; balanced-paren operand shapes are tried first. +local function rewriteIntegerModulo(src) + local function convert(l, r) + return ("int(mod(float(%s), float(%s)))"):format(l, r) + end + src = src:gsub("(%b())%s*%%%s*(%b())", convert) + src = src:gsub("(%b())%s*%%%s*([%w_]+)", convert) + src = src:gsub("([%w_]+)%s*%%%s*(%b())", convert) + src = src:gsub("([%w_]+)%s*%%%s*([%w_]+)", convert) + return src +end +Fixup.rewriteIntegerModulo = rewriteIntegerModulo + +-- SPIRV-Cross hardcodes an unguarded `precision highp` pair with no toggle; +-- claim highp only where the driver actually offers fragment highp. +local function guardPrecision(src) + src = src:gsub("precision%s+highp%s+float%s*;%s*\nprecision%s+highp%s+int%s*;%s*\n", "") + local guard = [[ +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +precision highp int; +#endif +#endif +]] + return guard .. src +end + +-- LOVE's Shader:send cannot address a member of a struct-typed uniform, so the +-- struct is deleted and its members re-declared: scalars packed 4-at-a-time +-- into vec4 slots (ES 1.00 guarantees only 16 fragment uniform vectors), +-- vectors kept whole. `specialMembers` substitutes a member to fixed text +-- instead of declaring it at all (see UBO_SPECIAL_MEMBERS). +local SCALAR_TYPES = { float = true, int = true, bool = true } +local COMPONENTS = { "x", "y", "z", "w" } + +local function flattenStruct(src, structName, packedPrefix, specialMembers) + packedPrefix = packedPrefix or "LIBRA_PACKED_" + specialMembers = specialMembers or {} + local body = src:match("struct%s+" .. structName .. "%s*{(.-)}%s*;") + if not body then return src, {} end + local instance = src:match("uniform%s+" .. structName .. "%s+([%w_]+)%s*;") + assert(instance, "flattenStruct: found struct " .. structName .. " but no instance uniform") + + src = src:gsub("struct%s+" .. structName .. "%s*{.-}%s*;%s*\n", "") + src = src:gsub("uniform%s+" .. structName .. "%s+" .. instance .. "%s*;%s*\n", "") + + local members = {} + for typ, name in body:gmatch("([%w_]+)%s+([%w_]+)%s*;") do + members[#members + 1] = { type = typ, name = name } + end + -- Declaration order matters here: packing scalars 4-at-a-time only minimizes + -- group count against the struct's own vec4-then-scalars layout. + + local decls, manifest, specialSubs = {}, {}, {} + local scalarGroup, packIndex = {}, 0 + + local function flushGroup() + if #scalarGroup == 0 then return end + local uniformName = packedPrefix .. packIndex + decls[#decls + 1] = ("uniform vec4 %s;"):format(uniformName) + for i, m in ipairs(scalarGroup) do + manifest[#manifest + 1] = { name = m.name, uniform = uniformName, component = COMPONENTS[i], type = m.type } + end + packIndex, scalarGroup = packIndex + 1, {} + end + + for _, m in ipairs(members) do + if specialMembers[m.name] then + specialSubs[#specialSubs + 1] = { name = m.name, replacement = specialMembers[m.name] } + elseif SCALAR_TYPES[m.type] then + scalarGroup[#scalarGroup + 1] = m + if #scalarGroup == 4 then flushGroup() end + else + flushGroup() + decls[#decls + 1] = ("uniform %s %s;"):format(m.type, m.name) + manifest[#manifest + 1] = { name = m.name, uniform = m.name } + end + end + flushGroup() + + -- longest-name-first so a substitution can't land inside a longer member name + -- sharing a prefix; a separate order from the packing above. A packed slot + -- only stores floats, so an int/bool member needs a cast back on every read. + local subs = {} + for _, entry in ipairs(manifest) do + local replacement = entry.component and (entry.uniform .. "." .. entry.component) or entry.uniform + if entry.component and (entry.type == "int" or entry.type == "bool") then + replacement = ("%s(%s)"):format(entry.type, replacement) + end + subs[#subs + 1] = { name = entry.name, replacement = replacement } + end + for _, entry in ipairs(specialSubs) do subs[#subs + 1] = entry end + table.sort(subs, function(a, b) return #a.name > #b.name end) + for _, entry in ipairs(subs) do + src = src:gsub(instance .. "%." .. entry.name, entry.replacement) + end + + return table.concat(decls, "\n") .. "\n" .. src, manifest +end +Fixup.flattenStruct = flattenStruct + +-- Turns a flat {member = value} table into the {uniform = value_or_vec4} shape +-- the packed shader expects. A missing value packs as 0 in its component. +function Fixup.packValues(manifest, values) + local packed = {} + local slot = { x = 1, y = 2, z = 3, w = 4 } + for _, entry in ipairs(manifest) do + if entry.component then + packed[entry.uniform] = packed[entry.uniform] or { 0, 0, 0, 0 } + packed[entry.uniform][slot[entry.component]] = values[entry.name] or 0 + else + packed[entry.uniform] = values[entry.name] + end + end + return packed +end + +-- GLSL ES 1.00 guarantees only 16 fragment uniform *vectors* and every scalar +-- costs a whole one; samplers do not come out of that budget. +Fixup.SLOTS = { float = 1, int = 1, bool = 1, vec2 = 1, vec3 = 1, vec4 = 1, mat3 = 3, mat4 = 4 } + +function Fixup.countUniformSlots(src) + -- Lua's %w does NOT match underscore, unlike regex \w, and every name here is + -- full of them, so this must be [%w_]+ or whole declarations go uncounted. + local total = 0 + for typ in src:gmatch("uniform%s+([%w_]+)%s+[%w_]+%s*;") do + if typ ~= "sampler2D" and typ ~= "Image" then + total = total + (Fixup.SLOTS[typ] or 1) + end + end + return total +end + +-- LIBRA_UBO_* (the uniform-buffer block) has the same +-- LOVE-can't-address-a-struct-member problem as LIBRA_PUSH_*, so it is +-- flattened the same way, with MVP alone special-cased. Deleting the block +-- outright instead left every other member reference dangling. + +-- LOVE forward-declares effect()'s prototype under its own header's precision +-- default, which can mismatch guardPrecision's; pin the parameter list to a +-- #define so the caller can try each variant in order. +Fixup.PREC_HEADS = { "#define EFFECT_PREC mediump\n", "#define EFFECT_PREC\n" } + +-- MVP is meaningless in the fragment stage but gets declared anyway; special- +-- casing it keeps a dead field from becoming a uniform nothing would send. +local UBO_SPECIAL_MEMBERS = { MVP = "transform_projection" } + +function Fixup.fragment(src) + src = stripVersion(src) + src = rewriteArrayLiterals(src) + src = rewriteIntegerModulo(src) + local pushManifest, uboManifest + src, pushManifest = flattenStruct(src, "LIBRA_PUSH_FRAGMENT") + src, uboManifest = flattenStruct(src, "LIBRA_UBO_FRAGMENT", "LIBRA_UBO_PACKED_", UBO_SPECIAL_MEMBERS) + local manifest = pushManifest + for _, entry in ipairs(uboManifest) do manifest[#manifest + 1] = entry end + src = guardPrecision(src) + src = src:gsub("void%s+main%s*%(%s*%)", + "vec4 effect(EFFECT_PREC vec4 love_UnusedColor, Image love_UnusedTex, " + .. "EFFECT_PREC vec2 love_UnusedTc, EFFECT_PREC vec2 love_UnusedSc)") + -- gl_FragData isn't available in LOVE's effect() convention. Rewrite EVERY + -- occurrence, whatever operator follows: real presets (ds-hybrid-sabr) write + -- it once with `=` and later accumulate with `+=`. + src = src:gsub("gl_FragData%[0%]", "gbFragColor") + src = src:gsub( + "(vec4 effect%(EFFECT_PREC vec4 love_UnusedColor, Image love_UnusedTex, " + .. "EFFECT_PREC vec2 love_UnusedTc, EFFECT_PREC vec2 love_UnusedSc%)%s*\n{)", + "%1\n vec4 gbFragColor;") + -- a bare early-exit `return;` needs a value now -- gbFragColor already + -- holds whatever was assigned just before it on every real shape seen. + src = src:gsub("return%s*;", "return gbFragColor;") + local lastBrace = src:match("()}%s*$") + assert(lastBrace, "fragment fixup: could not find effect()'s closing brace") + src = src:sub(1, lastBrace - 1) .. " return gbFragColor;\n" .. src:sub(lastBrace) + return src, manifest +end + +function Fixup.vertex(src) + src = stripVersion(src) + src = rewriteArrayLiterals(src) + src = rewriteIntegerModulo(src) + local pushManifest, uboManifest + src, pushManifest = flattenStruct(src, "LIBRA_PUSH_VERTEX") + -- MVP means "multiply the incoming vertex by it", which on an ordinary + -- full-screen LOVE draw is transform_projection, so it substitutes rather + -- than being packed. A distinct prefix keeps the UBO's packed groups off + -- LIBRA_PUSH_*'s own numbering. + src, uboManifest = flattenStruct(src, "LIBRA_UBO_VERTEX", "LIBRA_UBO_PACKED_", UBO_SPECIAL_MEMBERS) + local manifest = pushManifest + for _, entry in ipairs(uboManifest) do manifest[#manifest + 1] = entry end + -- LOVE supplies VertexPosition/VertexTexCoord itself. + src = src:gsub("attribute%s+vec4%s+Position%s*;%s*\n", "") + src = src:gsub("attribute%s+vec2%s+TexCoord%s*;%s*\n", "") + src = src:gsub("void%s+main%s*%(%s*%)", + "vec4 position(mat4 transform_projection, vec4 vertex_position)") + -- gl_Position isn't available in LOVE's position() convention; carry it in a + -- local named to share no substring with "Position". + src = src:gsub("gl_Position%s*=%s*([^;]+);", "gbClipPos = %1;") + -- Whole-identifier frontier match, not a blind gsub: a preset's own local + -- `vec2 vTexCoord;` would otherwise be mangled (dot.slangp pass0). + src = src:gsub("%f[%w]Position%f[%W]", "vertex_position") + src = src:gsub("%f[%w]TexCoord%f[%W]", "VertexTexCoord%.xy") + src = src:gsub( + "(vec4 position%(mat4 transform_projection, vec4 vertex_position%)%s*\n{)", + "%1\n vec4 gbClipPos;") + -- append the return just before the function's final closing brace + local lastBrace = src:match("()}%s*$") + assert(lastBrace, "vertex fixup: could not find main()'s closing brace") + src = src:sub(1, lastBrace - 1) .. " return gbClipPos;\n" .. src:sub(lastBrace) + return src, manifest +end + +return Fixup diff --git a/src/render/ShaderSourcePatches.lua b/src/render/ShaderSourcePatches.lua new file mode 100644 index 00000000..e5b10337 --- /dev/null +++ b/src/render/ShaderSourcePatches.lua @@ -0,0 +1,67 @@ +-- Local find/replace patches applied to a preset's raw .slang/.inc source on +-- disk, before ShaderFX.convert() hands it to the bridge -- only librashader's +-- own parser can discover a new #pragma parameter, so nothing downstream can +-- add one. Ships with an empty table on purpose; see docs/shaderfx.md. + +local Logger = require("src.core.Logger") + +local M = {} + +-- entry.name -> { { relPath = , +-- patches = { { old = , new = }, ... } } } +M.PATCHES = {} + +local function dirname(path) + return path:match("^(.*)[/\\][^/\\]*$") or "." +end + +-- Plain (non-pattern) substring replace: GLSL source is full of Lua pattern +-- magic characters, so gsub on literal source text is not safe here. +local function replaceOnce(text, old, new) + local s, e = text:find(old, 1, true) + if not s then return text, false end + return text:sub(1, s - 1) .. new .. text:sub(e + 1), true +end + +-- Applies every registered patch for `entry` to the real files on disk. A patch +-- whose anchor is gone (already applied, or upstream changed) is skipped. +function M.apply(entry) + local list = M.PATCHES[entry.name] + if not list then return end + local base = dirname(entry.fullPath) + for _, file in ipairs(list) do + local path = base .. "/" .. file.relPath + local f = io.open(path, "rb") + if not f then + Logger.warn("ShaderSourcePatches: %s: cannot open %s", entry.name, path) + else + local text = f:read("*a") + f:close() + local changed = false + for _, p in ipairs(file.patches) do + local already = text:find(p.new, 1, true) ~= nil + if not already then + local newText, ok = replaceOnce(text, p.old, p.new) + if ok then + text = newText + changed = true + else + Logger.warn("ShaderSourcePatches: %s: patch anchor not found in %s (upstream changed?)", + entry.name, file.relPath) + end + end + end + if changed then + local wf, werr = io.open(path, "wb") + if not wf then + Logger.warn("ShaderSourcePatches: %s: cannot write %s: %s", entry.name, path, tostring(werr)) + else + wf:write(text) + wf:close() + end + end + end + end +end + +return M diff --git a/src/render/Zoom.lua b/src/render/Zoom.lua index 00484251..a448870f 100644 --- a/src/render/Zoom.lua +++ b/src/render/Zoom.lua @@ -17,6 +17,25 @@ Zoom.offset = 0 -- close-up. Nil/true keeps the historical full range. Zoom.allowSurvey = true +-- The deepest legal survey step (offset = 1-S, effective scale s' = S+lo = +-- 1 px/world px) plus an active SHADER FX chain crashes the app on real +-- hardware (Pixel 10 Pro XL, "OUT7" == this exact step at that device's own +-- fit scale of 8 -- reported by the user, 2026-08-21). A quantifying repro +-- (TrueFX/zoom-mem-scan/) ruled out ShaderFX's own per-pass canvases as the +-- driver (worst real-corpus case at that step: ~31MB, not crash-sized) -- +-- the actual cost is almost certainly the world canvas/tile-render path +-- itself at that resolution (a preexisting cost of deep survey zoom, +-- unrelated to ShaderFX), which a shader chain reading that same +-- full-resolution canvas as its own input then pushes over some real +-- device/driver ceiling this project cannot measure without the device +-- in hand. Removing just the single deepest step while a preset is active +-- is the smallest change that directly targets what was actually reported +-- ("OUT7 + any shader", not "OUT7 alone" and not "OUT6 or shallower") -- +-- not a guessed-at general zoom restriction. Needs the user's own on-device +-- confirmation; extend the margin (currently 1 step) if OUT6 turns out to +-- be risky too. +local ShaderFX + -- legal offset range for a given fit scale (vanilla: survey at 1 px/world -- through 2× fit). zoom.range may widen or shrink the window. -- When the window only fits 1×, 1-S is 0 and there would be no OUT @@ -37,6 +56,14 @@ function Zoom.offsetRange(S) elseif lo > -3 then lo = -3 end + -- SHADER FX + the single deepest survey step: see the comment above. + -- The floor is one step above the deepest this call would otherwise + -- allow, so the three-step minimum above still keeps a zoom-out. + ShaderFX = ShaderFX or require("src.render.ShaderFX") + if ShaderFX.active() then + local floor = math.min(2 - S, lo + 1) + if lo < floor then lo = floor end + end return lo, hi end diff --git a/src/save_convert/SaveConvert.lua b/src/save_convert/SaveConvert.lua index 8181e048..e9d11bd0 100644 --- a/src/save_convert/SaveConvert.lua +++ b/src/save_convert/SaveConvert.lua @@ -193,7 +193,7 @@ local function defaultsSave() battleLayout = "og", ruleset = "gen1_faithful", musicVol = 7, sfxVol = 7, pikaVol = 7, musicFilter = 0, - speed = 1, colors = "gbc", tilt = 0, gbcfx = 0, + speed = 1, colors = "gbc", tilt = 0, videoMode = "windowed", mods = {}, }, } diff --git a/src/script/Commands.lua b/src/script/Commands.lua index c3520a34..3646939a 100644 --- a/src/script/Commands.lua +++ b/src/script/Commands.lua @@ -340,10 +340,8 @@ function Commands.start_battle(ctx, kind, a, b) ctx.lastBattleResult = result ctx.lastCheck = result == "win" if ctx.overworld then - -- A map script often follows a trainer battle with its own text. - -- Keep a level evolution behind that text: otherwise afterBattle - -- pushes the evolution screen, then this runner resumes and pushes - -- the trainer's text on top of it. + -- The map-side follow-up (stampClosedDoors, #372) rides behind the + -- script's own text; the evolution now runs in BattleState:finish. if result == "win" then ctx.afterScript = ctx.afterScript or {} table.insert(ctx.afterScript, function() @@ -1211,6 +1209,16 @@ function Commands.replace_block(ctx, bx, by, blockId) if ctx.overworld then ctx.overworld:replaceBlock(bx, by, blockId) end end +-- ss_anne_departs: scripts/VermilionDock.asm:80 .shift_columns_up, blocking +-- until she has cleared her own width +function Commands.ss_anne_departs(ctx) + local ow = ctx.overworld + if not ow or not ow.startSsAnneDeparture then return end + local runner = ctx.runner + ow:startSsAnneDeparture(function() runner:resume() end) + runner:yield() +end + -- set_tile_anim : override the current tileset's animation -- ("TILEANIM_WATER"; false stops it) until the next map change restores -- the record (setMap) @@ -1422,7 +1430,7 @@ Commands.meta = {} for _, verb in ipairs({ "show_text", "ask", "choice", "start_battle", "warp", "open_mart", "trade", "push_screen", "record_hall_of_fame", "old_man_demo", "static_battle", "rival_battle", "give_item", - "give_pokemon", "fade", "pan_camera" }) do + "give_pokemon", "fade", "pan_camera", "ss_anne_departs" }) do Commands.meta[verb] = { foreground = true } end for _, verb in ipairs({ "show_text", "ask", "choice", "start_battle", "warp", @@ -1430,7 +1438,8 @@ for _, verb in ipairs({ "show_text", "ask", "choice", "start_battle", "warp", "old_man_demo", "static_battle", "rival_battle", "give_item", "give_pokemon", "wait", "wait_flag", "move_player", "move_npc", "move_npc_to", "walk_npc", - "emote", "fade", "pan_camera", "play_once", "pikachu_make_way" }) do + "emote", "fade", "pan_camera", "play_once", "pikachu_make_way", + "ss_anne_departs" }) do local meta = Commands.meta[verb] or {} Commands.meta[verb] = meta meta.blocking = true diff --git a/src/script/gen2/CallAsm.lua b/src/script/gen2/CallAsm.lua index d2f9f7fd..4feb0155 100644 --- a/src/script/gen2/CallAsm.lua +++ b/src/script/gen2/CallAsm.lua @@ -390,9 +390,12 @@ function H.CutDownTreeOrGrass(ctx) end -- DisappearWhirlpool is CutDownTreeOrGrass with PlayWhirlpoolSound in place of --- OWCutAnimation: the same block write, the same redraw. +-- OWCutAnimation: the same block write, the same redraw, then the surf wash the +-- port owns as World:playWhirlpoolSound. #1717 function H.DisappearWhirlpool(ctx) - return H.CutDownTreeOrGrass(ctx) + local ret = H.CutDownTreeOrGrass(ctx) + call(ctx, "playWhirlpoolSound") + return ret end -- BlindingFlash sets STATUSFLAGS_FLASH_F and reloads the palettes. Setting diff --git a/src/script/gen2/Movement.lua b/src/script/gen2/Movement.lua index 24cece57..413d5390 100644 --- a/src/script/gen2/Movement.lua +++ b/src/script/gen2/Movement.lua @@ -32,6 +32,12 @@ local FIX_FACING = 0x3b -- STEP_TYPE_SLEEP with OBJECT_ACTION set to OBJECT_ACTION_WEIRD_TREE. local TREE_SHAKE = 0x56 local TREE_SHAKE_FRAMES = 24 +-- engine/events/forced_movement.asm:25-51; step_dig's frame count is the +-- byte after it (macros/scripts/movement.asm:163-167) +local TURN_HEAD = 0x00 +local TURN_IN = 0x24 +local STEP_DIG = 0x4f +local STEP_DIG_FRAMES = 16 function Movement.dir(nibble) return DIR[nibble % 4] or "down" @@ -57,8 +63,10 @@ function Movement.decodeByte(b) return { kind = "step", dir = dir } elseif family == 0x14 or family == 0x18 or family == 0x1c then -- slides return { kind = "step", dir = dir } - elseif family == 0x20 or family == 0x24 or family == 0x28 then -- turn_away/in/waterfall - return { kind = "turn", dir = dir } + elseif family == 0x20 or family == 0x24 or family == 0x28 then + -- turn_away / turn_in / turn_waterfall all `jp TurningStep`, which steps a + -- cell under OBJECT_ACTION_SPIN -- movement.asm:483-513, :693-715 (#1716) + return { kind = "step", dir = dir, spin = true } elseif family == 0x2c or family == 0x30 or family == 0x34 then -- slow_jump_step / jump_step / fast_jump_step, all of which reach -- JumpStep (engine/overworld/movement.asm:741) and so run under @@ -141,6 +149,8 @@ Movement.REMOVE_FIXED_FACING = REMOVE_FIXED_FACING Movement.FIX_FACING = FIX_FACING Movement.TREE_SHAKE = TREE_SHAKE Movement.TREE_SHAKE_FRAMES = TREE_SHAKE_FRAMES +Movement.STEP_DIG = STEP_DIG +Movement.STEP_DIG_FRAMES = STEP_DIG_FRAMES -- SetFacingWeirdTree's own index: it increments OBJECT_STEP_FRAME BEFORE -- masking (`inc a / maskbits NUM_DIRECTIONS, 2 / rrca / rrca`), so the count @@ -177,4 +187,15 @@ function Movement.stepByte(dir) return 0x0c + (DIR_BYTE[dir] or 0) end +-- Script_ForcedMovement's stream, `back` being the direction thrown in +-- -- engine/events/forced_movement.asm:25-51 +function Movement.forcedMovementBytes(back) + local d = DIR_BYTE[back] or 0 + return { + STEP_DIG, STEP_DIG_FRAMES, TURN_IN + d, + STEP_DIG, STEP_DIG_FRAMES, TURN_HEAD + d, + STEP_END, + } +end + return Movement diff --git a/src/script/gen2/Specials.lua b/src/script/gen2/Specials.lua index b45b4065..c0240a48 100644 --- a/src/script/gen2/Specials.lua +++ b/src/script/gen2/Specials.lua @@ -1375,6 +1375,13 @@ H.GiveShuckle = function(vm) mon.ot = Specials.MANIA_OT mon.otId = Specials.MANIA_OT_ID list[#list + 1] = mon + -- TryAddMonToParty's .registerpokedex (engine/pokemon/move_mon.asm:188-196) #1719 + local record = save(vm) + if record then + record.pokedex = record.pokedex or { seen = {}, caught = {} } + record.pokedex.seen[mon.species] = true + record.pokedex.caught[mon.species] = true + end answer(vm, TRUE) end diff --git a/src/ui/BagMenu.lua b/src/ui/BagMenu.lua index a59adc2e..949dcfcc 100644 --- a/src/ui/BagMenu.lua +++ b/src/ui/BagMenu.lua @@ -6,6 +6,7 @@ local ItemEffects = require("src.inventory.ItemEffects") local ListMenu = require("src.ui.ListMenu") local Runtime = require("src.mods.Runtime") local TextBox = require("src.render.TextBox") +local romText = require("src.core.RomText") local BagMenu = {} @@ -26,11 +27,19 @@ local function buildItems(game) right = (not unsellable) and ("x" .. game.save.inventory[id]) or nil, }) end + -- the $ff terminator's row: CANCEL is selectable and exits like B + -- (home/list_menu.asm:105-110, 523-528) #1685 + items[#items + 1] = { cancel = true, label = Strings("CANCEL") } return items end -local function consume(game, id) +local function consume(game, id, list) Bag.remove(game.save, id, 1) + -- engine/items/inventory.asm:131-136 + if not game.save.inventory[id] then + game.bagSavedMenuItem, game.bagListScrollOffset = 0, 0 + if list then list.index, list.scroll = 1, 0 end + end end local function save_name(game) @@ -66,6 +75,13 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) if picker then picker:close() end end + -- .useItem_closeMenu ends at CloseStartMenu, so the START menu kept open + -- behind the bag comes down with it (start_sub_menus.asm:400-407) #1745 + local function closeBag() + list:close() + if list.closeStartMenu then list.closeStartMenu() end + end + -- field POKé FLUTE: play the tune, then the no-effect text if result == "flute_field" then require("src.core.Sound").play(game.data, "Pokeflute") @@ -84,7 +100,7 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) -- field POKé FLUTE next to a not-yet-beaten Snorlax: "had effect" text, -- then the woke-up/battle sequence (data/scripts/story.lua snorlaxWake) if result == "flute_wake" then - list:close() + closeBag() require("src.core.Sound").play(game.data, "Pokeflute") showMessages(game, payload, function() local ow = game.overworld @@ -97,7 +113,7 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) end if result == "consumed_escape" then -- Poké Doll - consume(game, id) + consume(game, id, list) list:close() showMessages(game, payload, function() -- ItemUsePokeDoll sets wEscapedFromBattle and never touches @@ -120,12 +136,11 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) -- scripts -- the BICYCLE refuses with _CannotGetOffHereText and jumps -- back to ItemMenuLoop, so the bag stays open and no dismount happens -- (#513). The gate sits ahead of UseItem, before ItemUseBicycle ever - -- runs, which is why it precedes list:close() here. + -- runs, which is why it precedes the mount/dismount here. if game.save.forcedBike then showMessages(game, { Strings("You can't get off\nhere.") }) return end - list:close() local ow = game.overworld local Music = require("src.core.Music") -- IsBikeRidingAllowed (home/overworld.asm): the tilesets of @@ -146,27 +161,33 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) return false end if game.save.onBike then + closeBag() game.save.onBike = false Music.playMap(game.data, ow and ow.map.id, false) showMessages(game, { Strings("%s got off\nthe BICYCLE.", save_name(game)) }) elseif bikeAllowed() then + closeBag() game.save.onBike = true Music.playMap(game.data, ow.map.id, true) showMessages(game, { Strings("%s got on\nthe BICYCLE!", save_name(game)) }) else + -- NoCyclingAllowedHere -> ItemUseFailed zeroes the result byte and + -- .useItem_closeMenu loops back (item_effects.asm:2305-2319) showMessages(game, { Strings("No cycling\nallowed here.") }) end return end if result == "fish" then - list:close() local ow = game.overworld local p = ow and ow.player if ow and p and ow:facingIsShoreOrWater() then + closeBag() ow:goFishing(id) return end + -- FishingInit's `ret c` -> ItemUseNotTime -> ItemUseFailed, so a rod + -- away from water leaves the bag up (item_effects.asm:1893-1901) showMessages(game, { Strings("No good! It's not\neven near water.") }) return end @@ -177,7 +198,7 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) game.save.player.name) }) return end - consume(game, id) + consume(game, id, list) list:close() battle:throwBall(id) return @@ -197,21 +218,22 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) -- LearnedMove1Text: text_far, sound_get_item_1, text_promptbutton -- (learn_move.asm), so the jingle rides the box showMessages(game, { Strings("%s learned\n%s!", target.nickname or - game.data.pokemon[target.species].name, mdef.name) }, nil, + game.data.pokemon[target.species].name, mdef.name) }, closePicker, TextBox.soundOpts(game, "Get_Item1")) - if result == "learn" then consume(game, id) end + if result == "learn" then consume(game, id, list) end list.items = buildItems(game) list.index = math.min(list.index, math.max(1, #list.items)) taught() else require("src.ui.Screens").push(game, "MoveLearnMenu", target, moveId, function(learned) - if learned and result == "learn" then consume(game, id) end + if learned and result == "learn" then consume(game, id, list) end if learned then list.items = buildItems(game) list.index = math.min(list.index, math.max(1, #list.items)) end if learned then taught() end + closePicker() end) end end @@ -265,8 +287,8 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) local ow = game.overworld if ow and ESCAPE_ROPE_TILESETS[ow.map.def.tileset] and ow.map.id ~= "AGATHAS_ROOM" then - list:close() - consume(game, id) + closeBag() + consume(game, id, list) -- LeaveMapAnim spin-up + SFX_TELEPORT_EXIT_1, a fade, then land OUTSIDE -- the last Pokémon Center town door like Fly (#196), via the shared -- departure helper -- the same path Dig/Teleport take from the party menu @@ -292,7 +314,7 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) end if result == "consumed" then - consume(game, id) + consume(game, id, list) -- refresh counts in the list for i, it in ipairs(list.items) do if it.value == id then @@ -388,6 +410,13 @@ local function vanillaUseOn(game, battle, id, target, list, moveIndex, picker) return end + -- .chooseMon loops on a refusal, so the TM/HM picker stays up for another + -- pick (engine/items/item_effects.asm:2234, :2237) (#1686) + local machineDef = game.data.items[id] + if picker and picker.keepOpen and machineDef and machineDef.machine then + showMessages(game, payload) + return + end -- .healingItemNoEffect prints over the still-drawn party menu too, so the -- refusal closes the picker the same way (#252) showMessages(game, payload, closePicker) -- failed @@ -406,10 +435,15 @@ local function pickTargetAndUse(game, battle, id, list) local def = game.data.items[id] local opts = { pickOnly = true, + -- USE_ITEM_PARTY_MENU / EVO_STONE_PARTY_MENU, not the trade and daycare + -- NORMAL_PARTY_MENU (item_effects.asm:813, :768). #1610 + itemUse = true, battle = battle, -- HP medicine animates with the picker up (#252), RARE CANDY prints over - -- the party menu (item_effects.asm:1392-1418) - keepOpen = (not battle) and ItemEffects.keepsPartyMenuOpen(id), + -- the party menu (item_effects.asm:1392-1418); TM/HM stays up through + -- `predef LearnMove` (item_effects.asm:2238) (#1686) + keepOpen = (not battle) + and (ItemEffects.keepsPartyMenuOpen(id) or (def and def.machine ~= nil)), onSwitch = function(mon, picker) if not wantsMove then useOn(game, battle, id, mon, list, nil, picker) @@ -460,9 +494,15 @@ local function useItem(game, battle, id, list) local moveDef = game.data.moves[def.machine.move] local moveName = moveDef and moveDef.name or def.machine.move local booted = def.machine.kind == "HM" - and "Booted up an HM!" or Strings("Booted up a TM!") - showMessages(game, { booted, Strings("It contained\n%s!", moveName) }, - function() pickTargetAndUse(game, battle, id, list) end) + and romText(game.data, "_BootedUpHMText", "Booted up an HM!") + or romText(game.data, "_BootedUpTMText", "Booted up a TM!") + -- engine/items/item_effects.asm:2177 (#1686) + showMessages(game, { booted, + romText(game.data, "_TeachMachineMoveText", + "It contained\n%s!\fTeach %s\nto a POKéMON?", moveName, moveName) }, + nil, { choice = function(yes) + if yes then pickTargetAndUse(game, battle, id, list) end + end }) return end pickTargetAndUse(game, battle, id, list) @@ -484,7 +524,8 @@ function BagMenu.new(game, opts) onCancel = opts.onCancel, -- SELECT reorders items like the original bag (swap_items.asm) onSelectKey = function(item, l) - if not item then return end + -- attempts to swap the CANCEL row are ignored (swap_items.asm:19-22) + if not item or item.cancel then return end if not l.swapIndex then l.swapIndex = l.index return @@ -496,6 +537,12 @@ function BagMenu.new(game, opts) l.items = buildItems(game) end, onChoose = function(item) + -- A on CANCEL leaves the list exactly like B (home/list_menu.asm:105-110) + if item and item.cancel then + list:close() + if opts.onCancel then opts.onCancel() end + return + end local id = item.value local def = game.data.items[id] if list.swapIndex then -- A also completes a pending swap @@ -510,6 +557,12 @@ function BagMenu.new(game, opts) useItem(game, battle, id, list) return end + -- the BICYCLE never gets the option box: StartMenu_Item jumps straight + -- to .useOrTossItem (start_sub_menus.asm:340-342) #1705 + if id == "BICYCLE" then + useItem(game, battle, id, list) + return + end -- USE / TOSS submenu (the original's item options). -- data/text_boxes.asm USE_TOSS_MENU_TEMPLATE: box (13,10)-(19,14), -- text at (15,11); start_sub_menus.asm then sets wTopMenuItemY/X to @@ -548,6 +601,25 @@ function BagMenu.new(game, opts) }, { tx = 13, ty = 10, tw = 7, th = 5 })) end, }) + -- reopen on the saved cursor: engine/battle/core.asm:2230-2234 and + -- engine/menus/start_sub_menus.asm:319-323 #1732 + local n, rows = #list.items, list.cursorRows or list.rows + if n > 0 then + local saved = game.bagListScrollOffset or 0 + local index = math.min(saved + (game.bagSavedMenuItem or 0) + 1, n) + local scroll = math.min(saved, index - 1, math.max(0, n - rows)) + list.index, list.scroll = index, math.max(0, scroll, index - rows) + end + local baseUpdate = list.update + list.update = function(self, dt) + baseUpdate(self, dt) + game.bagListScrollOffset = self.scroll + game.bagSavedMenuItem = self.index - self.scroll - 1 + end + list.closeStartMenu = opts.onClose + -- the item box overlaps the kept-open START menu box, so neither docks to + -- a screen edge on its own (start_sub_menus.asm:302-329) #1745 + list.holdsUIAnchors = true return list end diff --git a/src/ui/ListMenu.lua b/src/ui/ListMenu.lua index 01d0a24c..dad1bda9 100644 --- a/src/ui/ListMenu.lua +++ b/src/ui/ListMenu.lua @@ -16,6 +16,34 @@ function ListMenu:sgbPalettes(game) return require("src.render.PaletteFX").wholeNamed(game.data, "MEWMON") end +local BLACK = { 0, 0, 0, 1 } +local MUTED_TEXT = { 0.55, 0.55, 0.55, 1 } + +-- row text runs from x=16 to the 160px screen's right margin (160-8, same +-- margin item.right right-aligns against); GAP is the blank strip kept +-- between a truncated label and item.right so the two never touch. +local ROW_LEFT = 16 +local ROW_RIGHT_MARGIN = 160 - 8 +local LABEL_GAP = 4 + +-- Truncate `text` to `pixels`, same convention as WideBattle.lua's own +-- fitName (HP-bar names facing the identical "arbitrary text vs. fixed +-- pixel budget" problem): cut on a whole glyph span, never mid-character, +-- and mark the cut with a trailing '.'. ShaderFXScreen's preset names are +-- player-supplied filenames of arbitrary length -- unclipped, a long one +-- either overlapped/garbled item.right's "CONVERT" hint or ran past the +-- screen's right edge outright. +local function fitLabel(text, pixels) + local spans = Font.split(text or "") + local n = Font.spansFitting(spans, pixels) + if n >= #spans then return text or "" end + local out = {} + for i = 1, math.max(0, n - 1) do + out[#out + 1] = (text or ""):sub(spans[i].from, spans[i].to) + end + return table.concat(out) .. "." +end + local ROWS = 7 -- LIST_MENU_BOX 4,2 - 19,12 (data/text_boxes.asm:13); 4 names from -- hlcoord 6,4 two rows apart (home/list_menu.asm:51-52, 364-365, 471-479) @@ -237,12 +265,13 @@ function ListMenu:drawItemBox() if #self.items == 0 then Font.draw(Strings("Nothing here."), ITEM_NAME_X, ITEM_TOP_Y) end - local shown = 0 + local shown, sawCancel = 0, false for row = 1, self.rows do local i = self.scroll + row local item = self.items[i] if not item then break end shown = shown + 1 + if item.cancel then sawCancel = true end local y = ITEM_TOP_Y + (row - 1) * 16 Font.draw(item.label, ITEM_NAME_X, y) if item.right then @@ -262,7 +291,7 @@ function ListMenu:drawItemBox() end -- the terminator prints CANCEL and returns before the '▼' -- (home/list_menu.asm:372, 518-524) - if shown == self.rows then + if shown == self.rows and not sawCancel then Font.drawCode(Theme.moreArrow, ITEM_MORE_X, ITEM_MORE_Y) end love.graphics.setColor(1, 1, 1, 1) @@ -282,22 +311,33 @@ function ListMenu:draw() local item = self.items[i] if not item then break end local y = 8 + row * 16 - Font.draw(item.label, 16, y) + -- item.muted: a real, selectable row that isn't fully "ready" yet (e.g. + -- ShaderFXScreen's unconverted presets) -- readable, never hidden, same + -- "always still readable" convention kit/Theme.lua's own disabled state + -- documents, just not the generic list-item shape that lived here + -- before ShaderFXScreen needed it. + local textColor = item.muted and MUTED_TEXT or BLACK + love.graphics.setColor(unpack(textColor)) + local budget = ROW_RIGHT_MARGIN - ROW_LEFT + if item.right then budget = budget - Font.width(item.right) - LABEL_GAP end + local label = fitLabel(item.label, budget) + Font.draw(label, 16, y) if item.ball then -- the Pokédex owned-ball marker tile -- one blank glyph after the name, measured in glyph advances rather -- than bytes: NIDORAN♂/♀ carry a multi-byte charmap entry, so -- `#item.label` overcounted by 2 and pushed their ball 16px right (#285) - local bx = 16 + Font.width(item.label) + 8 + 3 + local bx = 16 + Font.width(label) + 8 + 3 local by = y + 3 love.graphics.circle("fill", bx, by, 3.5) love.graphics.setColor(1, 1, 1, 1) love.graphics.rectangle("fill", bx - 3.5, by - 0.5, 7, 1) love.graphics.circle("fill", bx, by, 1.2) - love.graphics.setColor(0, 0, 0, 1) + love.graphics.setColor(unpack(textColor)) end if item.right then Font.draw(item.right, 160 - 8 - Font.width(item.right), y) end + love.graphics.setColor(unpack(BLACK)) if i == self.index then -- hollowIndex: a chosen row keeps the hollow '▷' left behind by -- pokered's PlaceUnfilledArrowMenuCursor (the old man demo's diff --git a/src/ui/MoveLearnMenu.lua b/src/ui/MoveLearnMenu.lua index 58c41b1d..5ceb00ce 100644 --- a/src/ui/MoveLearnMenu.lua +++ b/src/ui/MoveLearnMenu.lua @@ -1,7 +1,7 @@ -- "Which move should be forgotten?", replaces a move when a Pokémon with -- four moves learns a new one (engine/pokemon/learn_move.asm). Opens -- with the TryingToLearnText "Delete an older move...?" YES/NO; HM moves --- can't be forgotten; B / CANCEL gives up on the new move. +-- can't be forgotten; B gives up on the new move. local Font = require("src.render.Font") local Strings = require("src.core.Strings") @@ -66,7 +66,9 @@ end function MoveLearnMenu:update(dt) if not self.selecting then return end local input = self.game.input - local n = #self.mon.moves + 1 -- moves + CANCEL + -- wMaxMenuItem = wNumMovesMinusOne, no CANCEL row + -- engine/pokemon/learn_move.asm:144 (#1686) + local n = #self.mon.moves if input:wasPressed("up") then self.index = self.index > 1 and self.index - 1 or n elseif input:wasPressed("down") then @@ -74,23 +76,19 @@ function MoveLearnMenu:update(dt) elseif input:wasPressed("b") then self:confirmAbandon() elseif input:wasPressed("a") then - if self.index > #self.mon.moves then - self:confirmAbandon() - else - local old = self.mon.moves[self.index] - if HM_MOVES[old.id] then - -- HMCantDeleteText, then back to the forget list - local TextBox = require("src.render.TextBox") - self.game.stack:push(TextBox.new(self.game, - romText(self.game.data, "_HMCantDeleteText", - "HM techniques\ncan't be deleted!"))) - return - end - local mdef = self.game.data.moves[self.newMoveId] - self.mon.moves[self.index] = { id = self.newMoveId, pp = mdef.pp } - self.forgot = self.game.data.moves[old.id].name - self:finish(true) + local old = self.mon.moves[self.index] + if HM_MOVES[old.id] then + -- HMCantDeleteText, then back to the forget list + local TextBox = require("src.render.TextBox") + self.game.stack:push(TextBox.new(self.game, + romText(self.game.data, "_HMCantDeleteText", + "HM techniques\ncan't be deleted!"))) + return end + local mdef = self.game.data.moves[self.newMoveId] + self.mon.moves[self.index] = { id = self.newMoveId, pp = mdef.pp } + self.forgot = self.game.data.moves[old.id].name + self:finish(true) end end @@ -143,15 +141,14 @@ end function MoveLearnMenu:draw() if not self.selecting then return end - -- single-spaced move list box (TryingToLearn: TextBoxBorder at 4,7) - -- plus the port's extra CANCEL row - Font.drawBox(4, 5, 16, 7) + -- TextBoxBorder 4,7 b=4 c=14; PlaceString 6,8; cursor 5,8 + -- engine/pokemon/learn_move.asm:123-140 (#1686) + Font.drawBox(4, 7, 16, 6) love.graphics.setColor(0, 0, 0, 1) for i, mv in ipairs(self.mon.moves) do - Font.draw(self.game.data.moves[mv.id].name, 48, (5 + i) * 8) + Font.draw(self.game.data.moves[mv.id].name, 48, (7 + i) * 8) end - Font.draw(Strings("CANCEL"), 48, (6 + #self.mon.moves) * 8) - Font.drawCode(CURSOR, 40, (5 + self.index) * 8) + Font.drawCode(CURSOR, 40, (7 + self.index) * 8) -- WhichMoveToForgetText in the bottom dialogue box Font.drawBox(0, 12, 20, 6) Font.draw(Strings("Which move should"), 8, 14 * 8) diff --git a/src/ui/OptionsMenu.lua b/src/ui/OptionsMenu.lua index 503b5dfa..366cfb86 100644 --- a/src/ui/OptionsMenu.lua +++ b/src/ui/OptionsMenu.lua @@ -4,7 +4,7 @@ -- quirks), plus the port's audio rows and display rows: music/SFX -- volume (0-7), PIKACHU VOL (0-7, Yellow only: trims the PCM voice clips -- under SFX VOL), music low-pass filter (OFF/1X/2X/3X), COLORS / TILT / --- GBC FX / ZOOM / VOID FILL / VIDEO MODE, and the MODS row that opens +-- SHADER FX / ZOOM / VOID FILL / VIDEO MODE, and the MODS row that opens -- the mod manager. -- Rows are descriptors fed through the ui.options.rows hook, so mods can -- add their own; CANCEL is appended after the hook and stays fixed on the @@ -13,7 +13,7 @@ local PaletteFX = require("src.render.PaletteFX") local Pipelines = require("src.render.Pipelines") local Tilt = require("src.render.Tilt") -local GBCFX = require("src.render.GBCFX") +local ShaderFX = require("src.render.ShaderFX") local Zoom = require("src.render.Zoom") local TileRenderer = require("src.render.TileRenderer") local GameSpeed = require("src.core.GameSpeed") @@ -143,6 +143,20 @@ end local function sameRows(_, rows) return rows end +-- "OFF" plus every entry's display name, extension stripped -- a +-- Strings() lookup like RULESET's own record.name so a translation catalog +-- could rewrite "OFF" without needing to know about arbitrary preset +-- filenames. +local function shaderfxLabel(entry) + if not entry then return Strings("OFF") end + return Strings((entry.name:gsub("%.slangp$", ""))) +end + +-- Dual-shader slots: "main" backs the original SHADER +-- FX row (unchanged save key, unchanged default OFF), "secondary" backs the +-- new SHADER FX 2 row below it -- when both are set, ShaderFX.render() runs +-- main's chain into secondary's, same as stacking two RetroArch presets. + -- the vanilla rows as descriptors; each step body is the old per-index -- ladder's, so the save.options mutations are unchanged local function buildRows(game) @@ -323,10 +337,10 @@ local function buildRows(game) return true end }, -- Heads the port's display group: one tier that scales the heavy extras - -- (TILT / GBC FX / survey ZOOM) and the FPS ceiling for weaker devices. + -- (TILT / survey ZOOM) and the FPS ceiling for weaker devices. -- AUTO picks a default from the hardware; every tier is overridable. -- Re-applies live so the extras clamp (or, on a higher tier, restore to - -- the player's stored TILT / GBC FX / ZOOM) the moment the row changes. + -- the player's stored TILT / ZOOM) the moment the row changes. { id = "performance", label = Strings("PERFORMANCE"), value = function(g) return Strings(Performance.label(g.save.options.performance)) @@ -366,15 +380,30 @@ local function buildRows(game) end return true end }, - { id = "gbcfx", label = Strings("GBC FX"), + -- The generalized slang-shader-preset feature: a picker over + -- ShaderFX.list()'s real drop-in presets -- replaced GBCFX.lua's fixed + -- level ladder entirely (GBCFX.lua removed). A pushes a real list + -- screen -- OFF plus one row per .slangp found -- the same + -- "activate, not step" shape CONTROLS/MODS already use, rather than + -- cycling in place on this row. + -- ShaderFXScreen.lua does the actual list/activate; this row only opens + -- it and shows what is currently active. + { id = "shaderfx", label = Strings("SHADER FX"), value = function(g) - return GBCFX.levelLabel(g.save.options.gbcfx or 0) + return shaderfxLabel(ShaderFX.activeEntry("main")) end, - step = function(g, dir) - local o = g.save.options - o.gbcfx = wrapIndex((o.gbcfx or 0) + dir, 5) - GBCFX.setLevel(o.gbcfx) - return true + activate = function(g) + require("src.ui.Screens").push(g, "ShaderFXScreen", "main") + end }, + -- The secondary slot: same picker screen, opened on "secondary" instead + -- -- its own row so both slots are visible/settable independently + -- without a submenu inside a submenu. + { id = "shaderfx2", label = Strings("SHADER FX 2"), + value = function(g) + return shaderfxLabel(ShaderFX.activeEntry("secondary")) + end, + activate = function(g) + require("src.ui.Screens").push(g, "ShaderFXScreen", "secondary") end }, { id = "zoom", label = Strings("ZOOM"), value = function(g) @@ -565,14 +594,6 @@ local function buildRows(game) return true end }, } - -- issue #136: hide GBC FX on Android/iOS -- the present shader soft-bricks - if not GBCFX.isSupported() then - local filtered = {} - for _, row in ipairs(rows) do - if row.id ~= "gbcfx" then filtered[#filtered + 1] = row end - end - rows = filtered - end -- ORIENTATION only on the platforms Orientation.apply reaches (#1638). if not (Orientation.isAndroid() or Orientation.isIOS()) then local filtered = {} diff --git a/src/ui/PartyMenu.lua b/src/ui/PartyMenu.lua index 4e2b9535..718c5ba3 100644 --- a/src/ui/PartyMenu.lua +++ b/src/ui/PartyMenu.lua @@ -305,6 +305,7 @@ function PartyMenu.new(game, opts) self.onSwitch = opts.onSwitch self.onCancel = opts.onCancel self.pickOnly = opts.pickOnly + self.itemUse = opts.itemUse -- USE_ITEM_PARTY_MENU (item_effects.asm:813) -- Medicine keeps the picker on screen: item_effects.asm .doneHealing -- animates the party HP bar and then prints the message through -- RedrawPartyMenu with the menu STILL up, so BagMenu asks for keepOpen and @@ -725,16 +726,19 @@ end -- the party menu always prints a message in the bottom text box. With the -- normal message id that is PartyMenuBattleText ("Bring out which POKéMON?") -- when IsInBattle else PartyMenuNormalText ("Choose a POKéMON."); the swap / --- item / TM-HM ids print their own strings, which draw() handles inline. --- Pure (no side effects) so drivers can assert it. #147 +-- item / TM-HM ids print their own strings, and EVO_STONE shares +-- PartyMenuItemUseText (party_menu.asm:229 PartyMenuMessagePointers). +-- Pure (no side effects) so drivers can assert it. #147 #1610 function PartyMenu:bottomMessage() if self.swapFrom then - return "Move to where?" - elseif self.softboiledFrom or self.pickOnly then - return "Use on which one?" + return self.game.data.text._PartyMenuSwapMonText + or Strings("Move POKéMON\nwhere?") elseif self.tmhm then return self.game.data.text._PartyMenuUseTMText or Strings("Use TM on which\nPOKéMON?") + elseif self.softboiledFrom or self.itemUse then + return self.game.data.text._PartyMenuItemUseText + or Strings("Use item on which\nPOKéMON?") elseif self.battle then return self.game.data.text._PartyMenuBattleText or Strings("Bring out which\nPOKéMON?") @@ -858,38 +862,14 @@ function PartyMenu:draw() Font.drawCode(Theme.cursorHollow, 0, cursorY) end end - if self.swapFrom then - Font.draw(Strings("Move to where?"), 8, 136) - elseif self.softboiledFrom then - Font.draw(Strings("Use on which one?"), 8, 136) - elseif self.tmhm then - -- "Use TM on which\nPOKeMON?" in the standard bottom text box - -- (party_menu.asm keeps the message box for the TM/HM menu); box + line - -- geometry match TextBox's default (rows 12-17, text on rows 14/16). #210 - Font.drawBox(0, 12, 20, 6) - love.graphics.setColor(0, 0, 0, 1) - local prompt = self.game.data.text._PartyMenuUseTMText - or Strings("Use TM on which\nPOKéMON?") - local ly = 112 - for line in (prompt .. "\n"):gmatch("([^\n]*)\n") do - Font.draw(line, 8, ly) - ly = ly + 16 - end - elseif self.pickOnly then - Font.draw(Strings("Use on which one?"), 8, 136) - else - -- default field party menu (StartMenu) and the battle voluntary-switch - -- (BattleState:openParty): Gen1 prints PartyMenuNormalText / PartyMenuBattleText - -- in the standard bottom text box (party_menu.asm PartyMenuMessage), not - -- plain bottom-row text. Box + line geometry match the #210 TM/HM case and - -- TextBox's default (rows 12-17, text on rows 14/16). #147 - Font.drawBox(0, 12, 20, 6) - love.graphics.setColor(0, 0, 0, 1) - local ly = 112 - for line in (self:bottomMessage() .. "\n"):gmatch("([^\n]*)\n") do - Font.draw(line, 8, ly) - ly = ly + 16 - end + -- every message id prints through PrintText, so it lands in the standard + -- bottom text box, rows 12-17 (party_menu.asm:174). #147 #210 #1610 + Font.drawBox(0, 12, 20, 6) + love.graphics.setColor(0, 0, 0, 1) + local ly = 112 + for line in (self:bottomMessage() .. "\n"):gmatch("([^\n]*)\n") do + Font.draw(line, 8, ly) + ly = ly + 16 end if self.submenu then local n = #self.subItems diff --git a/src/ui/Screens.lua b/src/ui/Screens.lua index 424bfa58..755f2472 100644 --- a/src/ui/Screens.lua +++ b/src/ui/Screens.lua @@ -56,6 +56,9 @@ local GEN2 = { -- ../pokecrystal/engine/movie/intro.asm:1 CrystalIntro, the Crystal-only -- peer of GoldSilverIntro below. "CrystalIntro", + -- ../pokecrystal/engine/movie/splash.asm:1 SplashScreen, the Crystal-only + -- Ditto peer of GameFreakPresents below. + "CrystalSplash", "DayCareMenu", "DecorationMenu", "Diploma", "EggHatchAnim", "ElevatorMenu", "EvolutionAnim", "GameFreakPresents", diff --git a/src/ui/ShaderFXParamsScreen.lua b/src/ui/ShaderFXParamsScreen.lua new file mode 100644 index 00000000..3a8a65e0 --- /dev/null +++ b/src/ui/ShaderFXParamsScreen.lua @@ -0,0 +1,161 @@ +-- Per-preset #pragma parameter editor, reached via SELECT on a converted row in +-- ShaderFXScreen. A steps and wraps, Left/Right step and clamp, SELECT resets +-- one row, START resets all. Edits are keyed by preset name, not by slot. +-- See docs/shaderfx.md. + +local ListMenu = require("src.ui.ListMenu") +local ChoiceBox = require("src.ui.ChoiceBox") +local ShaderFX = require("src.render.ShaderFX") +local Strings = require("src.core.Strings") +local Logger = require("src.core.Logger") + +local ShaderFXParamsScreen = setmetatable({}, { __index = ListMenu }) +ShaderFXParamsScreen.__index = ShaderFXParamsScreen + +local function overridesFor(game, entry) + local opts = game.save and game.save.options + local all = opts and opts.shaderfxParams + return all and all[entry.name] +end + +local function currentValue(p, overrides) + local v = overrides and overrides[p.id] + if v == nil then v = p.initial end + return v +end + +-- Trims trailing zeros but always keeps one decimal place: many real pragma +-- steps are 0.01-0.05, which a fixed-width format would hide. +local function fmt(v) + local s = ("%.3f"):format(v) + s = s:gsub("(%..-)0+$", "%1"):gsub("%.$", ".0") + return s +end + +local function buildItems(game, entry, params) + local overrides = overridesFor(game, entry) + local items = {} + for _, p in ipairs(params) do + items[#items + 1] = { + label = Strings(p.description), param = p, + right = fmt(currentValue(p, overrides)), + } + end + return items +end + +function ShaderFXParamsScreen.new(game, entry) + local params, err = ShaderFX.listParams(entry) + if not params then + Logger.error("ShaderFXParamsScreen: %s: %s", entry.name, tostring(err)) + params = {} + end + local items = buildItems(game, entry, params) + local title = Strings((entry.name:gsub("%.slangp$", ""))) + + local self = setmetatable(ListMenu.new(game, title, items, { + rows = 6, + footer = Strings("A/L/R:STEP\nSELECT:RESET START:ALL"), + }), ShaderFXParamsScreen) + + -- Re-activates whichever slot(s) currently show this preset, so an edit + -- reaches the running chain by the next frame. Cheap enough to call on every + -- step: activate() re-reads the cached artifact, it never calls the bridge. + local function applyLive(overrides) + for _, slot in ipairs(ShaderFX.SLOTS) do + local active = ShaderFX.activeEntry(slot) + if active and active.name == entry.name then + ShaderFX.activate(slot, active, overrides) + end + end + end + + local function setParam(item, value) + local p = item.param + value = math.max(p.minimum, math.min(p.maximum, value)) + local opts = game.save and game.save.options + if not opts then return end + opts.shaderfxParams = opts.shaderfxParams or {} + opts.shaderfxParams[entry.name] = opts.shaderfxParams[entry.name] or {} + opts.shaderfxParams[entry.name][p.id] = value + item.right = fmt(value) + applyLive(opts.shaderfxParams[entry.name]) + if game.writeOptions then + game:writeOptions() + elseif game.persistOptions then + game:persistOptions() + end + end + + self.onChoose = function(item) + local overrides = overridesFor(game, entry) + local cur = currentValue(item.param, overrides) + local nextVal = cur + item.param.step + if nextVal > item.param.maximum + 1e-6 then nextVal = item.param.minimum end + setParam(item, nextVal) + end + self.onSelectKey = function(item) + setParam(item, item.param.initial) + end + + -- dir=-1/+1; clamps at the ends instead of onChoose's wrap. + local function stepCurrent(dir) + local item = self.items[self.index] + if not item then return end + local overrides = overridesFor(game, entry) + local cur = currentValue(item.param, overrides) + setParam(item, cur + dir * item.param.step) + end + + -- One write + one applyLive for the whole preset, not one per row. + local function resetAll() + local opts = game.save and game.save.options + if not opts then return end + opts.shaderfxParams = opts.shaderfxParams or {} + local ov = {} + opts.shaderfxParams[entry.name] = ov + for _, item in ipairs(items) do + local v = item.param.initial + ov[item.param.id] = v + item.right = fmt(v) + end + applyLive(ov) + if game.writeOptions then + game:writeOptions() + elseif game.persistOptions then + game:persistOptions() + end + end + + -- START: confirm, then reset every row. + local function confirmResetAll() + local hint = self.footer + self.footer = Strings("RESET ALL PARAMS?") + game.stack:push(ChoiceBox.new(game, function(yes) + self.footer = hint + if yes then resetAll() end + end, { defaultNo = true })) + end + + local baseUpdate = ListMenu.update + self.update = function(self_, dt) + local input = self_.game.input + if #self_.items > 0 then + if input:wasPressed("left") then + stepCurrent(-1) + return + elseif input:wasPressed("right") then + stepCurrent(1) + return + elseif input:wasPressed("start") then + confirmResetAll() + return + end + end + baseUpdate(self_, dt) + end + + return self +end + +return ShaderFXParamsScreen diff --git a/src/ui/ShaderFXScreen.lua b/src/ui/ShaderFXScreen.lua new file mode 100644 index 00000000..8c7a1b75 --- /dev/null +++ b/src/ui/ShaderFXScreen.lua @@ -0,0 +1,159 @@ +-- The SHADER FX preset picker: OFF, every .slangp ShaderFX.list() finds, then a +-- permanent DOWNLOAD SHADERS action row. `slot` picks which of ShaderFX.SLOTS +-- A activates and which save.options key persists it. See docs/shaderfx.md. + +local ListMenu = require("src.ui.ListMenu") +local ShaderFX = require("src.render.ShaderFX") +local Strings = require("src.core.Strings") +local Screens = require("src.ui.Screens") + +local ShaderFXScreen = setmetatable({}, { __index = ListMenu }) +ShaderFXScreen.__index = ShaderFXScreen + +-- OFF plus the preset's display name with its extension stripped. +local function label(entry) + if not entry then return Strings("OFF") end + return Strings((entry.name:gsub("%.slangp$", ""))) +end + +-- One row's display state from its entry.converted, shared by new() and +-- onChoose() so a successful convert updates a row exactly as building it did. +local function applyRowState(item) + if not item.entry then return end + -- NOT `cond and a or b`: that idiom breaks when `a` is itself nil/false. + if item.entry.converted then + item.muted = false + item.right = nil + else + item.muted = true + item.right = Strings("CONVERT") + end +end + +-- OFF, every real preset, then the permanent DOWNLOAD SHADERS action row. +local function buildItems(active) + local items = { { label = label(nil), entry = nil } } + local selected = 1 + for _, entry in ipairs(ShaderFX.list()) do + local item = { label = label(entry), entry = entry } + applyRowState(item) + items[#items + 1] = item + if active and active.name == entry.name then selected = #items end + end + items[#items + 1] = { label = Strings("DOWNLOAD SHADERS"), download = true } + return items, selected +end + +-- `slot` defaults to "main" so a caller that still pushes this screen with no +-- argument keeps today's behavior rather than erroring on a nil slot key. +function ShaderFXScreen.new(game, slot) + slot = slot or "main" + local optKey = ShaderFX.OPTION_KEY[slot] + local title = (slot == "secondary") and "SHADER FX 2" or "SHADER FX" + local items, selected = buildItems(ShaderFX.activeEntry(slot)) + + local self = setmetatable(ListMenu.new(game, title, items, { + -- 7 rows leaves the title line and the one-line footer hint free. + rows = 7, + footer = Strings("SELECT:EDIT PARAMS"), + }), ShaderFXScreen) + -- Opens on the active preset (or OFF). + self.index = selected + self.downloadJob = nil + + -- Rebuilds from ShaderFX.list() (e.g. after an install adds presets), keeping + -- the cursor on the same row index (clamped) rather than resetting to OFF. + local function refresh() + local newItems = buildItems(ShaderFX.activeEntry(slot)) + self.items = newItems + self.index = math.max(1, math.min(self.index, #newItems)) + end + + -- Polls the in-flight buildbot download alongside ListMenu's own input + -- handling. installDownloaded() itself is synchronous, a sub-second job. + local baseUpdate = ListMenu.update + self.update = function(self_, dt) + if self_.downloadJob then + local st = ShaderFX.downloadStatus(self_.downloadJob) + local row = self_.items[#self_.items] + if st.status == "pending" then + local pct = st.progress and (" %d%%"):format(st.progress * 100) or "" + row.right = Strings("...") .. pct + elseif st.status == "ok" then + local copied, err, unchanged = ShaderFX.installDownloaded(st.notModified) + self_.downloadJob = nil + if unchanged then + require("src.core.Logger").info("ShaderFXScreen: buildbot presets already up to date") + row.right = Strings("UP TO DATE") + elseif copied then + require("src.core.Logger").info("ShaderFXScreen: buildbot install copied %d files", copied) + refresh() + else + require("src.core.Logger").error("ShaderFXScreen: buildbot install failed: %s", tostring(err)) + self_.items[#self_.items].right = Strings("FAILED") + end + else -- "error" or "cancelled" + self_.downloadJob = nil + require("src.core.Logger").error("ShaderFXScreen: buildbot download failed: %s", tostring(st.err)) + row.right = Strings("FAILED") + end + end + baseUpdate(self_, dt) + end + + self.onChoose = function(item) + if item.download then + -- Ignore a repeat press while one is already in flight. + if self.downloadJob then return end + self.downloadJob = ShaderFX.downloadPresets() + item.right = Strings("...") + return + end + + -- A on an unconverted preset converts it in place instead of activating; + -- the screen stays open either way, since a convert is not a selection. + if item.entry and not item.entry.converted then + local ok, err = ShaderFX.convert(item.entry) + if not ok then + require("src.core.Logger").error("ShaderFXScreen: convert failed for %s: %s", + item.entry.name, tostring(err)) + end + applyRowState(item) + return + end + + local opts = game.save and game.save.options + if not item.entry then + ShaderFX.deactivate(slot) + if opts then opts[optKey] = nil end + else + -- isConverted() is existence-only with no staleness check, so an explicit + -- selection always reconverts. Human-paced, CPU-only, never per frame. + local convOk, convErr = ShaderFX.convert(item.entry) + if not convOk then + require("src.core.Logger").error("ShaderFXScreen: reconvert failed for %s: %s", + item.entry.name, tostring(convErr)) + end + local overrides = opts and opts.shaderfxParams and opts.shaderfxParams[item.entry.name] + local ok = ShaderFX.activate(slot, item.entry, overrides) + if opts then opts[optKey] = ok and item.entry.name or nil end + end + if game.writeOptions then + game:writeOptions() + elseif game.persistOptions then + game:persistOptions() + end + self:close() + end + + -- SELECT on a real, converted row opens its pragma-parameter editor; OFF, the + -- action row and an unconverted preset have nothing to read metadata from. + self.onSelectKey = function(item) + if not item.entry or item.download or not item.entry.converted then return end + Screens.push(game, "ShaderFXParamsScreen", item.entry) + end + + return self +end + +return ShaderFXScreen diff --git a/src/ui/ShopMenu.lua b/src/ui/ShopMenu.lua index 23ecc7ad..7d8b22d0 100644 --- a/src/ui/ShopMenu.lua +++ b/src/ui/ShopMenu.lua @@ -9,10 +9,12 @@ local Bag = require("src.inventory.Bag") local ChoiceBox = require("src.ui.ChoiceBox") +local Font = require("src.render.Font") local ListMenu = require("src.ui.ListMenu") local Menu = require("src.ui.Menu") local QuantityBox = require("src.ui.QuantityBox") local Strings = require("src.core.Strings") +local TextBox = require("src.render.TextBox") local romText = require("src.core.RomText") local ShopMenu = {} @@ -21,7 +23,21 @@ local function txt(game, key, fallback) return game.data.text[key] or fallback end -local function buy(game, stock) +-- engine/events/pokemart.asm:204 (.returnToMainPokemartMenu) +local function anythingElse(game) + return txt(game, "_PokemartAnythingElseText", + Strings("Is there anything\nelse I can do?")) +end + +-- prompt refusals leave the list for the mart menu -- pokemart.asm:113 +local function refuse(game, menu, list, text) + if list then list:close() end + game.stack:push(TextBox.new(game, text, function() + menu.footer = anythingElse(game) + end)) +end + +local function buy(game, stock, menu) local items = {} for _, id in ipairs(stock) do local def = game.data.items[id] @@ -36,11 +52,14 @@ local function buy(game, stock) local greet = txt(game, "_PokemartBuyingGreetingText", "Take your time.") local notEnough = txt(game, "_PokemartNotEnoughMoneyText", Strings("You don't have\nenough money.")) + local bagFull = txt(game, "_PokemartItemBagFullText", + Strings("You can't carry\nany more items.")) local list list = ListMenu.new(game, "BUY", items, { dialogue = true, money = function() return game.save.money end, footer = greet, + onCancel = function() menu.footer = anythingElse(game) end, onChoose = function(item) local def = game.data.items[item.value] if game.save.money < def.price then @@ -66,18 +85,22 @@ local function buy(game, stock) return end if game.save.money < cost then - list.footer = notEnough + refuse(game, menu, list, notEnough) return end if not Bag.add(game.save, item.value, qty, game.data) then - list.footer = txt(game, "_PokemartItemBagFullText", - Strings("You can't carry\nany more items.")) + refuse(game, menu, list, bagFull) return end - require("src.core.Sound").play(game.data, "Purchase") game.save.money = game.save.money - cost - list.footer = txt(game, "_PokemartBoughtItemText", - Strings("Here you are!\nThank you!")) + -- SFX_PURCHASE drains before the receipt -- pokemart.asm:193 + game.stack:push(TextBox.new(game, + txt(game, "_PokemartBoughtItemText", + Strings("Here you are!\nThank you!")), + function() list.footer = greet end, + { preSound = function() + return require("src.core.Sound").play(game.data, "Purchase") + end })) end)) end, })) @@ -86,7 +109,7 @@ local function buy(game, stock) game.stack:push(list) end -local function sell(game) +local function sell(game, menu) -- Sell list is ITEMLISTMENU with wPrintItemPrices cleared -- (pokemart.asm .sellMenuLoop): name + quantity only. Price shows -- in the quantity chooser. Stuffing "xN" into the label next to a @@ -100,12 +123,22 @@ local function sell(game) right = "x" .. game.save.inventory[id], }) end - local greet = txt(game, "_PokemartBuyingGreetingText", "Take your time.") + -- engine/events/pokemart.asm:50 + local greet = txt(game, "_PokemonSellingGreetingText", + Strings("What would you\nlike to sell?")) + if #items == 0 then + refuse(game, menu, nil, txt(game, "_PokemartItemBagEmptyText", + Strings("You don't have\nanything to sell."))) + return + end + local unsellable = txt(game, "_PokemartUnsellableItemText", + Strings("I can't put a\nprice on that.")) local list list = ListMenu.new(game, "SELL", items, { dialogue = true, money = function() return game.save.money end, footer = greet, + onCancel = function() menu.footer = anythingElse(game) end, onSelectKey = function(item, l) if not item then return end if not l.swapIndex then @@ -135,8 +168,7 @@ local function sell(game) -- indexing nil below -- guards saves that already picked up a bogus -- ITEM_NONE "0" from Blue's House before that pickup was fixed (#11). if not def or def.keyItem or item.value:find("^HM_") then - list.footer = txt(game, "_PokemartUnsellableItemText", - Strings("I can't put a\nprice on that.")) + refuse(game, menu, list, unsellable) return end local unit = math.floor(def.price / 2) @@ -157,6 +189,8 @@ local function sell(game) return end game.save.money = game.save.money + unit * qty + -- home/inventory.asm:15 AddAmountSoldToMoney sounds SFX_PURCHASE + require("src.core.Sound").play(game.data, "Purchase") Bag.remove(game.save, item.value, qty) local left = game.save.inventory[item.value] if left then @@ -164,7 +198,8 @@ local function sell(game) else list:removeCurrent() end - list.footer = txt(game, "_PokemartThankYouText", "Thank you!") + -- a sale prints nothing -- engine/events/pokemart.asm:112 + list.footer = greet end)) end, })) @@ -173,15 +208,53 @@ local function sell(game) game.stack:push(list) end +-- MONEY_BOX 11,0 (data/text_boxes.asm:35) over the greeting PrintText left +-- in the bottom box (home/text_script.asm:143) +local function drawClerk(menu) + local game = menu.game + love.graphics.setColor(1, 1, 1, 1) + Font.drawBox(11, 0, 9, 3) + love.graphics.setColor(0, 0, 0, 1) + local money = ("¥%d"):format((game.save and game.save.money) or 0) + Font.draw(money, 152 - Font.width(money), 8) + love.graphics.setColor(1, 1, 1, 1) + Font.drawBox(0, 12, 20, 6) + love.graphics.setColor(0, 0, 0, 1) + if menu.footer then + local flat = {} + for _, page in ipairs(TextBox.paginate(menu.footer)) do + for _, line in ipairs(page) do flat[#flat + 1] = line end + end + local y = 112 + for i = math.max(1, #flat - 1), #flat do + Font.draw(flat[i], 8, y) + y = y + 16 + end + end + love.graphics.setColor(1, 1, 1, 1) +end + function ShopMenu.new(game, stock, onQuit) -- keepOpen: the mart menu stays underneath its list so closing the -- list lands back here; only QUIT (or B) leaves and fires onQuit - local menu = Menu.new(game, { - { label = Strings("BUY"), keepOpen = true, onSelect = function() buy(game, stock) end }, - { label = Strings("SELL"), keepOpen = true, onSelect = function() sell(game) end }, - { label = Strings("QUIT"), onSelect = onQuit }, + local menu + -- engine/events/pokemart.asm:220 .done, reached by QUIT and by B alike + local function farewell() + game.stack:push(TextBox.new(game, + txt(game, "_PokemartThankYouText", "Thank you!"), onQuit)) + end + menu = Menu.new(game, { + { label = Strings("BUY"), keepOpen = true, onSelect = function() buy(game, stock, menu) end }, + { label = Strings("SELL"), keepOpen = true, onSelect = function() sell(game, menu) end }, + { label = Strings("QUIT"), onSelect = farewell }, }, { tx = 0, ty = 0, tw = 8, th = 8 }) - menu.onCancel = onQuit + menu.onCancel = farewell + menu.footer = txt(game, "_PokemartGreetingText", + Strings("Hi there!\nMay I help you?")) + menu.draw = function(self) + drawClerk(self) + Menu.draw(self) + end return menu end diff --git a/src/ui/StartMenu.lua b/src/ui/StartMenu.lua index 65f01166..7df11e4c 100644 --- a/src/ui/StartMenu.lua +++ b/src/ui/StartMenu.lua @@ -42,9 +42,14 @@ function StartMenu.new(game) Screens.push(game, "PartyMenu", { onCancel = reopen }) end }) - table.insert(items, { label = Strings("ITEM"), onSelect = function() - Screens.push(game, "BagMenu", { onCancel = reopen }) - end }) + -- StartMenu_Item draws LIST_MENU_BOX over the still-drawn START menu and + -- only redisplays it on the way out (start_sub_menus.asm:302-329) #1745 + table.insert(items, { label = Strings("ITEM"), keepOpen = true, + onSelect = function() + Screens.push(game, "BagMenu", { onClose = function() + if menu and game.stack:top() == menu then game.stack:pop() end + end }) + end }) -- the player's name opens the trainer card (StartMenu_TrainerInfo) table.insert(items, { label = game.save.player.name or "RED", diff --git a/src/ui/gen2/BattleHud.lua b/src/ui/gen2/BattleHud.lua index 716ed85d..7822a1ae 100644 --- a/src/ui/gen2/BattleHud.lua +++ b/src/ui/gen2/BattleHud.lua @@ -100,11 +100,11 @@ end -- The 4-colour palette the HP-bar cells draw with: white, the bar's own light -- colour, the state's fill colour, black -- which is HPBarPals' two colours -- bracketed the way every Gen 2 palette is. -function BattleHud:barColors(key) +function BattleHud:barColors(key, zero) local pal = self.palettes and self.palettes.hpBar and self.palettes.hpBar[key] if not pal then return nil end return { - { 255, 255, 255 }, + zero or { 255, 255, 255 }, { pal[1][1], pal[1][2], pal[1][3] }, { pal[2][1], pal[2][2], pal[2][3] }, { 0, 0, 0 }, @@ -145,9 +145,9 @@ end -- HUD's bar minus the "HP:" prefix -- same tiles, same HPBarPals colour, same -- one-pixel-at-a-time fill. Sharing this method is what keeps the two screens -- from ever disagreeing about how full a bar looks. -function BattleHud:drawBar(hp, maxHp, tx, ty) +function BattleHud:drawBar(hp, maxHp, tx, ty, zero) local pixels = HpBar.pixels(hp, maxHp) - local colors = self:barColors(HpBar.palette(pixels)) + local colors = self:barColors(HpBar.palette(pixels), zero) for cell = 0, HpBar.LENGTH_TILES - 1 do local remaining = pixels - cell * 8 local filled = math.max(0, math.min(8, remaining)) @@ -160,9 +160,11 @@ end -- "HP:" plus the six bar cells plus the end cap, starting at tile (tx, ty). -- Returns the column just past the assembly (tx + 9), so the caller can put the -- frame's vertical stub there. -function BattleHud:drawHpBar(hp, maxHp, tx, ty) +-- `zero` overrides colour 0: the stats screen puts the page tint there +-- (engine/gfx/color.asm:386-390). #1693 +function BattleHud:drawHpBar(hp, maxHp, tx, ty, zero) local pixels = HpBar.pixels(hp, maxHp) - local colors = self:barColors(HpBar.palette(pixels)) + local colors = self:barColors(HpBar.palette(pixels), zero) -- The "HP:" badge sits inside the bar's own attrmap region, so it wears the -- HP palette too: its background is HPBarPals' light colour (the cream the -- cart shows) and its letters are black. Drawing it white-on-black was the @@ -170,7 +172,7 @@ function BattleHud:drawHpBar(hp, maxHp, tx, ty) self:drawTile("hpBar", FIRST_BATTLE_EXTRA, TILE_HP_LABEL, tx, ty, colors) self:drawTile("hpBar", FIRST_BATTLE_EXTRA, TILE_HP_LABEL + 1, tx + 1, ty, colors) - self:drawBar(hp, maxHp, tx + 2, ty) + self:drawBar(hp, maxHp, tx + 2, ty, zero) self:drawTile("hpBar", FIRST_BATTLE_EXTRA, TILE_BAR_END, tx + 2 + HpBar.LENGTH_TILES, ty, colors) return tx + 3 + HpBar.LENGTH_TILES @@ -198,23 +200,23 @@ local EXP_PARTIAL_BASE = 0x54 -- $54 + remainder lands in ExpBarGFX -- PAL_BATTLE_BG_EXP, which the attrmap lays over (10,11)..(18,11) -- (engine/gfx/cgb_layouts.asm:142-145). -function BattleHud:expColors() +function BattleHud:expColors(zero) local pal = self.palettes and self.palettes.expBar if not pal then return nil end return { - { 255, 255, 255 }, + zero or { 255, 255, 255 }, { pal[1][1], pal[1][2], pal[1][3] }, { pal[2][1], pal[2][2], pal[2][3] }, { 0, 0, 0 }, } end -function BattleHud:drawExpBar(fraction, tx, ty) +function BattleHud:drawExpBar(fraction, tx, ty, zero) if not self:image("hpBar") then return false end fraction = math.max(0, math.min(1, fraction or 0)) local pixels = math.floor(fraction * BattleHud.EXP_LENGTH_PX) -- The whole row wears the exp bar's palette, full and empty cells included. - local colors = self:expColors() + local colors = self:expColors(zero) local remaining = pixels for cell = BattleHud.EXP_CELLS - 1, 0, -1 do diff --git a/src/ui/gen2/BattleState.lua b/src/ui/gen2/BattleState.lua index 365b8f67..64eed26f 100644 --- a/src/ui/gen2/BattleState.lua +++ b/src/ui/gen2/BattleState.lua @@ -209,6 +209,12 @@ end function BattleState:wantsFillScale() return true end function BattleState:drawsWidescreen() return true end +-- BATTLE BG (#1709): WHITE is the cart's paper surround, BLACK plain bars. +function BattleState:bgMode() + local options = self.game and self.game.options + return (options and options.battleBg) == "black" and "black" or "white" +end + function BattleState:bottomUIVisible() if not Runtime.wantsHook("battle.bottom_ui_visible") then return true end return Runtime.call("battle.bottom_ui_visible", function() return true end, @@ -2184,15 +2190,21 @@ function BattleState:update(_dt) end if self.phase == "menu" then - -- 2x2 grid: left/right swap the column, up/down the row. + -- 2x2 grid: left/right swap the column, up/down the row. No + -- STATICMENU_WRAP in BattleMenuHeader (engine/battle/menu.asm:31-33), so + -- the cursor clamps at each edge (engine/menus/menu.asm:156-166) (#1706). -- MenuClickSound / PlayClickSFX (home/menu.asm:746-762): SFX_READ_TEXT_2 -- on A/B only, never on D-pad. - if input:wasPressed("left") or input:wasPressed("right") then - self.menuIndex = self.menuIndex % 2 == 1 and self.menuIndex + 1 - or self.menuIndex - 1 - elseif input:wasPressed("up") or input:wasPressed("down") then - self.menuIndex = self.menuIndex <= 2 and self.menuIndex + 2 - or self.menuIndex - 2 + local col = (self.menuIndex - 1) % 2 + local row = math.floor((self.menuIndex - 1) / 2) + if input:wasPressed("left") then + self.menuIndex = row * 2 + math.max(0, col - 1) + 1 + elseif input:wasPressed("right") then + self.menuIndex = row * 2 + math.min(1, col + 1) + 1 + elseif input:wasPressed("up") then + self.menuIndex = math.max(0, row - 1) * 2 + col + 1 + elseif input:wasPressed("down") then + self.menuIndex = math.min(1, row + 1) * 2 + col + 1 elseif input:wasPressed("a") then self:playSfx("Sfx_ReadText2") self:chooseMenu(MENU_ACTION[MENU[self.menuIndex]]) @@ -2819,8 +2831,9 @@ function BattleState:pushCaught(enemy, itemId) -- PC's own move is InsertPokemonIntoBox, which inserts at the cursor. table.insert(box, 1, enemy) -- SendMonIntoBox refills the boxed slot's PP before it closes SRAM - -- (move_mon.asm:1062-1063). - Boxes.restorePP(enemy) + -- (move_mon.asm:1062-1063); the box_struct it writes carries no HP and no + -- status at all (macros/ram.asm:7-26). #1696 + Boxes.enterBox(enemy) -- `.SendToPC` re-reads sBoxCount AFTER the insert and sets -- BATTLERESULT_BOX_FULL when the box has just filled -- (item_effects.asm:612-619); Script_reloadmapafterbattle tests that bit diff --git a/src/ui/gen2/BoxMenu.lua b/src/ui/gen2/BoxMenu.lua index 1d7d28e4..027ccf42 100644 --- a/src/ui/gen2/BoxMenu.lua +++ b/src/ui/gen2/BoxMenu.lua @@ -432,7 +432,7 @@ function BoxMenu:insertMon() table.insert(dest, math.max(1, math.min(target, #dest + 1)), mon) -- .CopyToBox is InsertPokemonIntoBox, which tails into -- RestorePPOfDepositedPokemon (engine/pokemon/move_mon_wo_mail.asm:35-37). - if not self:isParty(destIndex) then Boxes.restorePP(mon) end + if not self:isParty(destIndex) then Boxes.enterBox(mon) end self.phase = nil self.moveFrom, self.backup = nil, nil self.index, self.scroll = 1, 0 @@ -453,9 +453,8 @@ function BoxMenu:cancelMove() self:clampIndex() end --- BillsPC_PressLeft / BillsPC_PressRight. The move screen wraps through box 0 --- (the PARTY); the withdraw list has no party to walk into, so it wraps inside --- the fourteen boxes. +-- BillsPC_PressLeft / BillsPC_PressRight, reached only from +-- MoveMonWithoutMail_DPad: the move screen wraps through box 0 (the PARTY). function BoxMenu:stepBox(delta) local low = self.mode == "move" and PARTY_BOX or 1 local span = Boxes.NUM_BOXES - low + 1 @@ -531,9 +530,11 @@ function BoxMenu:update(_dt) elseif input:wasPressed("down") then self.index = self.index < total and self.index + 1 or 1 self:ensureVisible() - elseif input:wasPressed("left") and self.mode ~= "deposit" then + -- Withdraw_UpDown reads PAD_UP and PAD_DOWN and nothing else; only + -- MoveMonWithoutMail_DPad walks the boxes (bills_pc.asm:806-820, :822-845). + elseif input:wasPressed("left") and self.mode == "move" then self:stepBox(-1) - elseif input:wasPressed("right") and self.mode ~= "deposit" then + elseif input:wasPressed("right") and self.mode == "move" then self:stepBox(1) elseif input:wasPressed("a") then self:act() diff --git a/src/ui/gen2/CrystalIntro.lua b/src/ui/gen2/CrystalIntro.lua index 7f14ecef..50afead6 100644 --- a/src/ui/gen2/CrystalIntro.lua +++ b/src/ui/gen2/CrystalIntro.lua @@ -282,12 +282,12 @@ SEQUENCES.IntroPichuWooper = function(_, st) end -- SpriteAnimFunc_IntroUnown (engine/sprite_anims/functions.asm:797-821): --- circle at radius VAR1, three sine steps per frame. +-- VAR1 is the angle, the counter is the radius (core.asm:543-545). SEQUENCES.IntroUnown = function(_, st) - local angle = st.jt + local radius = st.jt st.jt = (st.jt + 3) % 256 - st.yOffset = SpriteAnims.sine(angle, st.var1) - st.xOffset = SpriteAnims.cosine(angle, st.var1) + st.yOffset = SpriteAnims.sine(st.var1, radius) + st.xOffset = SpriteAnims.cosine(st.var1, radius) end -- SpriteAnimFunc_IntroUnownF (engine/sprite_anims/functions.asm:823-829): @@ -488,7 +488,7 @@ local function unownFade(self, pal, t) end -- CrystalIntro_InitUnownAnim (engine/movie/intro.asm:1191-1229): four structs --- at one spot, radii $08/$18/$28/$38, framesets 4/3/1/2. +-- at one spot, angles $08/$18/$28/$38, framesets 4/3/1/2. local UNOWN_SWIRL = { { 0x08, "IntroUnown4" }, { 0x18, "IntroUnown3" }, { 0x28, "IntroUnown1" }, { 0x38, "IntroUnown2" }, diff --git a/src/ui/gen2/CrystalSplash.lua b/src/ui/gen2/CrystalSplash.lua new file mode 100644 index 00000000..6436a6fa --- /dev/null +++ b/src/ui/gen2/CrystalSplash.lua @@ -0,0 +1,423 @@ +-- The Crystal GAME FREAK splash (pokecrystal engine/movie/splash.asm:1-342): +-- Ditto bounces in, rests, transforms into the logo, then GAME FREAK / presents. + +local Chrome = require("src.ui.gen2.Chrome") +local GbcPalette = require("src.render.GbcPalette") +local Music = require("src.core.Music") +local Runtime = require("src.mods.Runtime") +local Sound = require("src.core.Sound") +local SpriteAnims = require("src.ui.gen2.SpriteAnims") +local TileSheet = require("src.ui.gen2.TileSheet") + +local CrystalSplash = {} +CrystalSplash.__index = CrystalSplash +CrystalSplash.isOpaque = true + +local SCREEN_W, SCREEN_H = 160, 144 + +-- splash.asm:91 `depixel 10, 11, 4, 0` is y-first: x=e, y=d +-- (pokecrystal engine/sprite_anims/core.asm:113). +local LOGO_X, LOGO_Y = 11 * 8 + 0, 10 * 8 + 4 +-- pokecrystal constants/gfx_constants.asm:36 OAM_YCOORD_HIDDEN. +local YCOORD_HIDDEN = 160 + +-- splash.asm:161-164 and :183-186; tile $0d is the logo's own first tile +-- borrowed as the space. +local GAME_FREAK = { 0x00, 0x01, 0x02, 0x03, 0x0d, 0x04, 0x05, 0x03, 0x01, 0x06 } +local GAME_FREAK_X, GAME_FREAK_Y = 5, 10 +local PRESENTS = { 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c } +local PRESENTS_X, PRESENTS_Y = 7, 11 + +-- splash.asm:121-122 `ld c, 16 / call DelayFrames`. +local EXIT_FRAMES = 16 + +local BLACK = { 0, 0, 0 } +local WHITE = { 255, 255, 255 } + +-- pokecrystal gfx/splash/ditto.pal, loaded into OBJ pals 0 and 1 by +-- _CGB_GamefreakLogo (engine/gfx/cgb_layouts.asm:876-893). +local DITTO_OB = { WHITE, { 107, 90, 0 }, { 189, 99, 230 }, BLACK } +-- pokecrystal gfx/sgb/predef.pal:79 PREDEFPAL_GAMEFREAK_LOGO_BG. +local DEFAULT_BG = { BLACK, { 66, 90, 90 }, { 173, 173, 173 }, WHITE } + +-------------------------------------------------------------------------- +-- Sprite-anim data, registered into SpriteAnims' shared tables +-------------------------------------------------------------------------- + +-- dbsprite (pokecrystal macros/gfx.asm): y byte first. +local function s(xTile, yTile, xPixel, yPixel, tile, attr) + return { + y = (yTile * 8 + yPixel) % 256, + x = (xTile * 8 + xPixel) % 256, + tile = tile, + attr = attr, + } +end + +-- pokecrystal data/sprite_anims/oam.asm:1098-1108 .OAMData_GameFreakLogo1_3. +local DITTO_SMALL = {} +for row = 0, 2 do + for col = 0, 2 do + DITTO_SMALL[#DITTO_SMALL + 1] = + s(col - 2, row - 2, 4, 0, row * 0x10 + col, 1) + end +end + +-- pokecrystal data/sprite_anims/oam.asm:1110-1135 .OAMData_GameFreakLogo4_11. +local DITTO_MORPH = {} +for row = 0, 5 do + for col = 0, 3 do + DITTO_MORPH[#DITTO_MORPH + 1] = + s(col - 2, row - 5, 4, 0, row * 0x10 + col, 1) + end +end + +-- pokecrystal data/sprite_anims/oam.asm:139-149: vtile bases into the +-- 256-tile Ditto sheet GameFreakPresentsInit loads whole (splash.asm:72-85). +local OAMSETS = { + CRYSTAL_GAMEFREAK_LOGO_1 = { 0xd0, DITTO_SMALL }, + CRYSTAL_GAMEFREAK_LOGO_2 = { 0xd3, DITTO_SMALL }, + CRYSTAL_GAMEFREAK_LOGO_3 = { 0xd6, DITTO_SMALL }, + CRYSTAL_GAMEFREAK_LOGO_4 = { 0x6c, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_5 = { 0x68, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_6 = { 0x64, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_7 = { 0x60, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_8 = { 0x0c, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_9 = { 0x08, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_10 = { 0x04, DITTO_MORPH }, + CRYSTAL_GAMEFREAK_LOGO_11 = { 0x00, DITTO_MORPH }, +} + +local function f(oamset, duration, flags) + return { oamset = oamset, duration = duration, flags = flags or 0 } +end + +-- pokecrystal data/sprite_anims/framesets.asm:142-158 .Frameset_GameFreakLogo. +local FRAMESETS = { + CrystalGameFreakLogo = { + f("CRYSTAL_GAMEFREAK_LOGO_1", 12), f("CRYSTAL_GAMEFREAK_LOGO_2", 1), + f("CRYSTAL_GAMEFREAK_LOGO_3", 1), f("CRYSTAL_GAMEFREAK_LOGO_2", 4), + f("CRYSTAL_GAMEFREAK_LOGO_1", 12), f("CRYSTAL_GAMEFREAK_LOGO_2", 12), + f("CRYSTAL_GAMEFREAK_LOGO_3", 4), f("CRYSTAL_GAMEFREAK_LOGO_4", 32), + f("CRYSTAL_GAMEFREAK_LOGO_5", 3), f("CRYSTAL_GAMEFREAK_LOGO_6", 3), + f("CRYSTAL_GAMEFREAK_LOGO_7", 4), f("CRYSTAL_GAMEFREAK_LOGO_8", 4), + f("CRYSTAL_GAMEFREAK_LOGO_9", 4), f("CRYSTAL_GAMEFREAK_LOGO_10", 10), + f("CRYSTAL_GAMEFREAK_LOGO_11", 7), + "end", + }, +} + +local SEQUENCES = {} + +-- GameFreakLogoSpriteAnim (splash.asm:201-342): VAR1 jump height, VAR2 sine +-- offset / frame counter; sys.flag carries the transform's NextScene call. +SEQUENCES.CrystalGameFreakLogo = function(sys, st) + local splash = sys.splash + if st.jt == 0 then + -- GameFreakLogo_Init (splash.asm:221-225). + st.jt = 1 + elseif st.jt == 1 then + -- GameFreakLogo_Bounce (splash.asm:227-283). + if st.var1 == 0 then + st.jt = 2 + st.var2 = 0 + if splash then splash:playSfx("Sfx_DittoPopUp") end + return + end + local angle = st.var2 % 0x40 + if angle < 32 then angle = angle + 32 end + st.yOffset = SpriteAnims.sine(angle, st.var1) + local before = st.var2 + st.var2 = (st.var2 - 1) % 256 + if before % 0x20 == 0 then + st.var1 = (st.var1 - 48) % 256 + if splash then splash:playSfx("Sfx_DittoBounce") end + end + elseif st.jt == 2 then + -- GameFreakLogo_Ditto (splash.asm:285-304). + if st.var2 >= 32 then + st.jt = 3 + st.var2 = 0 + if splash then splash:playSfx("Sfx_DittoTransform") end + else + st.var2 = st.var2 + 1 + end + elseif st.jt == 3 then + -- GameFreakLogo_Transform (splash.asm:306-340). + if st.var2 == 64 then + st.jt = 4 + sys.flag = 1 + else + local step = math.floor(st.var2 / 4) + st.var2 = st.var2 + 1 + if splash then splash:fadeTo(step) end + end + end +end + +-- pokecrystal data/sprite_anims/objects.asm:11-12 SPRITE_ANIM_OBJ_GAMEFREAK_LOGO. +local OBJECTS = { + CRYSTAL_GAMEFREAK_LOGO = { "CrystalGameFreakLogo", "CrystalGameFreakLogo" }, +} + +local function register(target, entries) + for name, value in pairs(entries) do + if target[name] == nil then target[name] = value end + end +end + +register(SpriteAnims.OAMSETS, OAMSETS) +register(SpriteAnims.FRAMESETS, FRAMESETS) +register(SpriteAnims.OBJECTS, OBJECTS) +register(SpriteAnims.SEQUENCES, SEQUENCES) + +-------------------------------------------------------------------------- +-- The screen +-------------------------------------------------------------------------- + +function CrystalSplash:wantsFillScale() return true end +function CrystalSplash:drawsWidescreen() return true end + +-- opts: oakSpeech (data/generated/oak_speech.lua, for its `splash` table), +-- onDone(skipped) +function CrystalSplash.new(game, opts) + opts = opts or {} + local self = setmetatable({}, CrystalSplash) + self.game = game + self.onDone = opts.onDone + local splash = (opts.oakSpeech or {}).splash or {} + local ob = splash.dittoPalette or DITTO_OB + self.obColors = { ob[1], ob[2], ob[3], ob[4] } + self.bgColors = splash.bgPalette or DEFAULT_BG + self.dittoFade = splash.dittoFade + + -- GameFreakLogoGFX's 28 1bpp tiles land at vTiles2 $00 (splash.asm:62-65): + -- letters $00-$0c, the 3x5 logo $0d-$1b. + self.sheets = { + TileSheet.new({ path = splash.presents + or "assets/generated/splash/presents.png", wide = 13, firstTile = 0x00 }), + TileSheet.new({ path = splash.logo + or "assets/generated/splash/logo.png", wide = 3, firstTile = 0x0d }), + } + self.ditto = TileSheet.new({ path = splash.ditto + or "assets/generated/splash/ditto.png", + wide = splash.dittoTilesWide or 16, firstTile = 0x00 }) + + self.anims = SpriteAnims.new() + self.anims.splash = self + -- splash.asm:91-102: spawn hidden, VAR1=96, VAR2=48. + local st = self.anims:init("CRYSTAL_GAMEFREAK_LOGO", LOGO_X, LOGO_Y) + if st then + st.yOffset = YCOORD_HIDDEN + st.var1 = 96 + st.var2 = 48 + end + + self.scene = 0 + self.timer = 0 + self.tiles = {} -- the BG tilemap, sparse: [y][x] = tile id + self.frames = 0 + self.exitTail = nil + self.done = false + self.skipped = nil + return self +end + +function CrystalSplash:enter() + local data = self.game and self.game.data + if data and data.audio and data.audio.runtime then + Music.stop() + end + if Runtime.wants("intro.boot.gamefreak") then + Runtime.emit("intro.boot.gamefreak", { screen = self, game = self.game }) + end +end + +function CrystalSplash:finish() + if self.done then return end + self.done = true + if self.onDone then self.onDone(self.skipped) end +end + +function CrystalSplash:playSfx(name) + local data = self.game and self.game.data + if data and data.audio and data.audio.sfx and data.audio.sfx[name] then + Sound.play(data, name) + end +end + +-- The transform walks OBJ pal 1 colour 2 down GameFreakDittoPaletteFade +-- (splash.asm:306-334, gfx/splash/ditto_fade.pal). +function CrystalSplash:fadeTo(step) + local fade = self.dittoFade + local color = fade and fade[step + 1] + if color then self.obColors[3] = color end +end + +function CrystalSplash:placeString(tiles, tx, ty) + local row = self.tiles[ty] + if not row then + row = {} + self.tiles[ty] = row + end + for index, tile in ipairs(tiles) do + row[tx + index - 1] = tile + end +end + +-------------------------------------------------------------------------- +-- GameFreakPresentsScene (splash.asm:125-199) +-------------------------------------------------------------------------- + +function CrystalSplash:sceneWaitSpriteAnim() + if self.anims.flag == 0 then return end + self.scene = 1 + self.timer = 0 +end + +function CrystalSplash:scenePlaceGameFreak() + if self.timer < 32 then + self.timer = self.timer + 1 + return + end + self.timer = 0 + self:placeString(GAME_FREAK, GAME_FREAK_X, GAME_FREAK_Y) + self.scene = 2 + self:playSfx("Sfx_GameFreakPresents") +end + +function CrystalSplash:scenePlacePresents() + if self.timer < 64 then + self.timer = self.timer + 1 + return + end + self.timer = 0 + self:placeString(PRESENTS, PRESENTS_X, PRESENTS_Y) + self.scene = 3 +end + +function CrystalSplash:sceneWaitForTimer() + if self.timer < 128 then + self.timer = self.timer + 1 + return + end + self:beginExit() +end + +local SCENES = { + CrystalSplash.sceneWaitSpriteAnim, + CrystalSplash.scenePlaceGameFreak, + CrystalSplash.scenePlacePresents, + CrystalSplash.sceneWaitForTimer, +} + +-- GameFreakPresentsEnd (splash.asm:117-123). +function CrystalSplash:beginExit() + if self.exitTail then return end + self.anims:clear() + self.tiles = {} + self.exitTail = 0 +end + +function CrystalSplash:update(_dt) + self.frames = self.frames + 1 + if self.exitTail then + self.exitTail = self.exitTail + 1 + if self.exitTail > EXIT_FRAMES then self:finish() end + return + end + local input = self.game and self.game.input + if input and (input:wasPressed("a") or input:wasPressed("b") + or input:wasPressed("start") or input:wasPressed("select")) then + -- SplashScreen.pressed_button (splash.asm:51-54) returns carry. + self.skipped = true + self:beginExit() + return + end + local scene = SCENES[self.scene + 1] + if scene then scene(self) end + self.anims:playFrame() +end + +-------------------------------------------------------------------------- +-- Drawing +-------------------------------------------------------------------------- + +function CrystalSplash:sheetFor(tile) + for _, sheet in ipairs(self.sheets) do + if tile >= sheet.firstTile and sheet:available() then + local index = tile - sheet.firstTile + local image = sheet:image() + local _, height = image:getDimensions() + if index < sheet.wide * (height / 8) then return sheet end + end + end + return nil +end + +function CrystalSplash:drawTile(tile, tx, ty, colors) + local sheet = self:sheetFor(tile) + if not sheet then return end + sheet.palette = colors + sheet:draw(tile, tx, ty) +end + +function CrystalSplash:drawObjects() + local G = love.graphics + local sheet = self.ditto + if not sheet:available() then return end + local oam = self.anims.oam + for index = #oam, 1, -1 do + local entry = oam[index] + local quad = sheet:quad(entry.tile) + if quad then + local flipX = math.floor(entry.attr / SpriteAnims.OAM_XFLIP) % 2 == 1 + local flipY = math.floor(entry.attr / SpriteAnims.OAM_YFLIP) % 2 == 1 + local function body() + G.setColor(1, 1, 1, 1) + G.draw(sheet:image(), quad, + entry.x - 8 + (flipX and 8 or 0), entry.y - 16 + (flipY and 8 or 0), + 0, flipX and -1 or 1, flipY and -1 or 1) + end + if GbcPalette.available() then + GbcPalette.with(self.obColors, body) + else + body() + end + end + end +end + +function CrystalSplash:drawPanel() + local G = love.graphics + local backdrop = GbcPalette.color(self.bgColors, 1) or BLACK + G.setColor(backdrop[1] / 255, backdrop[2] / 255, backdrop[3] / 255, 1) + G.rectangle("fill", 0, 0, SCREEN_W, SCREEN_H) + G.setColor(1, 1, 1, 1) + for ty, row in pairs(self.tiles) do + for tx, tile in pairs(row) do + self:drawTile(tile, tx, ty, self.bgColors) + end + end + self:drawObjects() + G.setColor(1, 1, 1, 1) +end + +function CrystalSplash:draw() + self:drawPanel() +end + +function CrystalSplash:drawWidescreen(winW, winH) + local G = love.graphics + local backdrop = GbcPalette.color(self.bgColors, 1) or BLACK + G.setColor(backdrop[1] / 255, backdrop[2] / 255, backdrop[3] / 255, 1) + G.rectangle("fill", 0, 0, winW, winH) + local scale = Chrome.fitScale(winW, winH) + G.push() + G.translate(Chrome.fitOrigin(winW, winH, scale)) + G.scale(scale, scale) + self:drawPanel() + G.pop() +end + +return CrystalSplash diff --git a/src/ui/gen2/GameFreakPresents.lua b/src/ui/gen2/GameFreakPresents.lua index 7eab4456..c7a4650f 100644 --- a/src/ui/gen2/GameFreakPresents.lua +++ b/src/ui/gen2/GameFreakPresents.lua @@ -45,9 +45,9 @@ local SCREEN_W, SCREEN_H = 160, 144 -- wSpriteAnimDict[SPRITE_ANIM_DICT_GS_SPLASH] = $8d (GameFreakPresentsInit). local DICT_VTILE = 0x8d --- `depixel 10, 11, 4, 0` and `depixel 11, 11`: the macro is --- (x tile, y tile, x pixel, y pixel) and lands in de as x, y. -local LOGO_X, LOGO_Y = 10 * 8 + 4, 11 * 8 + 0 +-- `depixel 10, 11, 4, 0` and `depixel 11, 11` are y-first: x=e, y=d +-- (engine/sprite_anims/core.asm:113). +local LOGO_X, LOGO_Y = 11 * 8 + 0, 10 * 8 + 4 local SPARKLE_X, SPARKLE_Y = 11 * 8, 11 * 8 -- GameFreakPresents_PlaceGameFreak / _PlacePresents. $8d is the logo's own @@ -152,7 +152,7 @@ end function GameFreakPresents:finish() if self.done then return end self.done = true - if self.onDone then self.onDone() end + if self.onDone then self.onDone(self.skipped) end end -- PlaceString into the sparse tilemap. @@ -280,6 +280,7 @@ function GameFreakPresents:update(_dt) if input and (input:wasPressed("a") or input:wasPressed("b") or input:wasPressed("start") or input:wasPressed("select")) then -- .pressed_button: everything is torn down and the splash is over. + self.skipped = true self:beginExit() return end diff --git a/src/ui/gen2/OptionsMenu.lua b/src/ui/gen2/OptionsMenu.lua index 3ff6f334..61e2b431 100644 --- a/src/ui/gen2/OptionsMenu.lua +++ b/src/ui/gen2/OptionsMenu.lua @@ -20,6 +20,7 @@ local Chrome = require("src.ui.gen2.Chrome") local Logger = require("src.core.Logger") +local Performance = require("src.core.Performance") local Runtime = require("src.mods.Runtime") local Save = require("src.core.gen2.Save") @@ -112,6 +113,22 @@ local ROWS = { text = function(options) return FILTERS[(options.musicFilter or 0) + 1] end }, + -- Heads the port's display group, same spot src/ui/OptionsMenu.lua's own + -- PERFORMANCE row occupies relative to ZOOM/VOID FILL/TILT/SHADER FX below + -- (the extras this tier scales). Gen 1 row shape (`value`/`step`, not this + -- file's own `text`/`cycle`) works here unmodified: OptionsMenu:cycle + -- answers `row.step` first, and drawPanel already reads a function + -- `row.value` -- both written for exactly this kind of shared mod row. + { id = "performance", label = "PERFORMANCE", port = true, + value = function(g) + return Performance.label(g.options and g.options.performance) + end, + step = function(g, dir) + local o = g.options + o.performance = Performance.cycle(o.performance, dir) + g:applyOptions() + return true + end }, { label = "GAME SPEED", key = "speed", port = true, cycle = function(options, delta) local GameSpeed = require("src.core.GameSpeed") @@ -169,19 +186,33 @@ local ROWS = { text = function(options) return require("src.render.GbcPalette").modeLabel(options.color or "gbc") end }, - { label = "GBC FX", key = "gbcfx", port = true, - cycle = function(options, delta) - local GBCFX = require("src.render.GBCFX") - if not GBCFX.isSupported() then - options.gbcfx = 0 - return - end - local level = ((options.gbcfx or 0) + delta) % 5 - options.gbcfx = level - GBCFX.setLevel(level) - end, + -- SHADER FX reaches Gen 2 too, not just Gen 1. Same "activate" shape as + -- CONTROLS/TOUCH LAYOUT below (a pushed screen, not a `cycle` ladder) -- + -- ShaderFXScreen is the shared list screen both generations push, `id` + -- matching the Gen 1 row's so a mod filtering "shaderfx" on Red also + -- reaches Gold. + { id = "shaderfx", label = "SHADER FX", port = true, text = function(options) - return require("src.render.GBCFX").levelLabel(options.gbcfx or 0) + local ShaderFX = require("src.render.ShaderFX") + local entry = ShaderFX.activeEntry("main") + if not entry then return "OFF" end + return (entry.name:gsub("%.slangp$", "")):upper() + end, + activate = function(game) + require("src.ui.Screens").push(game, "ShaderFXScreen", "main") + end }, + -- Dual-shader secondary slot, same shared ShaderFXScreen as the row + -- above, opened on "secondary" instead -- see src/ui/OptionsMenu.lua's + -- mirror of this row for the full rationale. + { id = "shaderfx2", label = "SHADER FX 2", port = true, + text = function(options) + local ShaderFX = require("src.render.ShaderFX") + local entry = ShaderFX.activeEntry("secondary") + if not entry then return "OFF" end + return (entry.name:gsub("%.slangp$", "")):upper() + end, + activate = function(game) + require("src.ui.Screens").push(game, "ShaderFXScreen", "secondary") end }, { label = "VIDEO MODE", key = "videoMode", port = true, cycle = function(options, delta) @@ -240,6 +271,11 @@ local ROWS = { text = function(options) return require("src.core.FrameCap").label(options.fpsCap) end }, + -- BATTLE BG (#1709): the void around the battle screen. Gold has no WIDE + -- layout and no WORLD backdrop, so the ladder is the WHITE/BLACK pair only. + { label = "BATTLE BG", key = "battleBg", port = true, + values = { "white", "black" }, + display = { white = "WHITE", black = "BLACK" } }, { label = "CANCEL", cancel = true }, } @@ -257,7 +293,7 @@ local function sameRows(_, rows) return rows end -- edit into the next opening -- the Gen 1 site rebuilds its descriptors for the -- same reason (src/ui/OptionsMenu.lua buildRows). -- --- `id` is the key a Gen 1 mod filters a row on ("gbcfx", "speed", "musicVol") +-- `id` is the key a Gen 1 mod filters a row on ("shaderfx", "speed", "musicVol") -- and is added ALONGSIDE this file's own `key`, never in place of it: a mod -- written against Red's OPTION screen finds the shared rows where it expects -- them, and the rows Gold has that Red does not (PRINT, MENU ACCOUNT, FRAME, diff --git a/src/ui/gen2/PackGfx.lua b/src/ui/gen2/PackGfx.lua index bb8ed195..68103dc8 100644 --- a/src/ui/gen2/PackGfx.lua +++ b/src/ui/gen2/PackGfx.lua @@ -12,8 +12,9 @@ -- which DrawPackGFX swaps per pocket out of PackGFX -- DrawPocketName lays a 5x3 block at (0,7) from its own 5x12 tilemap -- _CGB_PackPals loads six BG palettes and colours five rectangles with --- them: the two header halves, the quantity column, the --- pocket plaque (red) and the bag picture (green) +-- them: the two header halves, the CURSOR column (7,2) 1x9 +-- whose colour 3 is red, the pocket plaque (red) and the bag +-- picture (green) -- engine/gfx/cgb_layouts.asm:715-734 -- -- A cache from before the pack stage simply has no `pack` table; PackMenu -- falls back to its plain boxes then. diff --git a/src/ui/gen2/PackMenu.lua b/src/ui/gen2/PackMenu.lua index 432ad490..3a5d970c 100644 --- a/src/ui/gen2/PackMenu.lua +++ b/src/ui/gen2/PackMenu.lua @@ -229,9 +229,9 @@ function PackMenu.label(itemId, def) return (tostring(itemId):gsub("_", " ")) end --- TMHMPocket (engine/items/tmhm.asm) writes GetMoveName's string under the --- TM's own name, so the second line of a TM row is the MOVE's name and not the --- constant the attributes row carries. +-- TMHM_DisplayPocketItems (engine/items/tmhm.asm:381-385) places GetMoveName's +-- string three tiles right of the row's number, so a TM/HM row reads as the +-- MOVE's name and the TM's own item name is never printed. function PackMenu:moveLabel(moveId) if not moveId then return nil end local moves = self.game and self.game.data and self.game.data.moves @@ -239,6 +239,17 @@ function PackMenu:moveLabel(moveId) return (def and def.name) or (tostring(moveId):gsub("_", " ")) end +-- engine/items/tmhm.asm:357-375 -- the number a TM/HM row prints: a TM with +-- PRINTNUM_LEADINGZEROS, an HM as 'H' and its own left-aligned ordinal. +local function tmhmLabelFor(itemId, def) + local digits = tostring((def and def.tmLabel) or (def and def.name) + or itemId):match("(%d+)") + local n = tonumber(digits) + if not n then return nil end + if tostring(itemId):sub(1, 3) == "HM_" then return "H" .. n end + return ("%02d"):format(n) +end + function PackMenu:rebuild() local pocket = self:pocket().id local rows = {} @@ -260,6 +271,7 @@ function PackMenu:rebuild() name = PackMenu.label(itemId, def), teaches = self:moveLabel(def and def.teaches), tmNumber = def and def.tmNumber, + tmhmLabel = (pocket == "TM_HM" and tmhmLabelFor(itemId, def)) or nil, -- A KEY_ITEM never shows one, and engine/items/tmhm.asm:390 skips the -- count for an HM only -- a TM prints ×NN like any other stack. showCount = pocket == "ITEM" or pocket == "BALL" @@ -929,13 +941,27 @@ function PackMenu:description() return def and def.description or nil end +-- engine/gfx/cgb_layouts.asm:723-726 -- the cursor column (7,2) 1x9 takes +-- palette $3, whose colour 3 is red (gfx/pack/pack.pal). +function PackMenu:cursorAt(tx, ty, hollow) + local palette = self.gfx and self.gfx:available() + and self.gfx:colorsAt(tx, ty) + if palette then + Chrome.cursorThrough(tx, ty, palette, false, hollow) + else + Chrome.cursor(tx, ty, hollow) + end +end + -- The list, description and cursor, on top of whatever chrome was drawn. -- --- PlaceMenuItemQuantity (engine/menus/menu_2.asm:10) writes the ×N one row --- DOWN and one column RIGHT of the name -- the quantity is the entry's second --- line, not a right-aligned column, which is why every PACK row is two tiles --- tall. Its `lb bc, 1, 2` is a TWO-digit field with the leading digit blanked, --- so the ones digit sits at name + 3 whether the count is 5 or 50. +-- ScrollingMenu_CallFunctions1and2 (engine/menus/scrolling_menu.asm:424-429) +-- steps the coord on by the header's `db 5, 8` COLUMN count before +-- PlaceMenuItemQuantity (engine/menus/menu_2.asm:19-25) adds SCREEN_WIDTH + 1, +-- so the ×N sits at name + 9 on the row BELOW the name, flush right in every +-- pocket (#1425, #1693). Its `lb bc, 1, 2` is a TWO-digit field with the +-- leading digit blanked. engine/items/tmhm.asm:392-403 writes that same +-- column for a TM. -- -- ScrollingMenu_PlaceCursor (engine/menus/scrolling_menu.asm:438) marks the -- row SELECT armed with the hollow ▷ while the solid ▶ goes on looking. @@ -945,27 +971,23 @@ function PackMenu:drawList(listX, listY) local ty = listY + (row - 1) * LIST_SPACING if i <= #self.rows then local entry = self.rows[i] - if i == self.index then - Chrome.cursor(listX - 1, ty) - elseif i == self.switching then - Chrome.cursor(listX - 1, ty, true) + -- engine/items/tmhm.asm:355-385 (#1695) + if entry.tmhmLabel then + Chrome.print(entry.tmhmLabel, listX - 3, ty) end - Chrome.print(entry.name, listX, ty) - if entry.teaches then - -- The TM pocket puts the move the TM teaches on that second line, and - -- its count at listX + 9 (engine/items/tmhm.asm:392) -- on the LABEL's - -- line here, since the move name owns the one below it. - Chrome.print(entry.teaches, listX + 1, ty + 1) - if entry.showCount then - Chrome.print("\xc3\x97" .. Chrome.number(entry.count, 2), - listX + 9, ty) - end - elseif entry.showCount then + if i == self.index then + self:cursorAt(listX - 1, ty) + elseif i == self.switching then + self:cursorAt(listX - 1, ty, true) + end + Chrome.print((entry.tmhmLabel and entry.teaches) or entry.name, + listX, ty) + if entry.showCount then Chrome.print("\xc3\x97" .. Chrome.number(entry.count, 2), - listX + 1, ty + 1) + listX + 9, ty + 1) end elseif i == self:total() then - if i == self.index then Chrome.cursor(listX - 1, ty) end + if i == self.index then self:cursorAt(listX - 1, ty) end Chrome.print("CANCEL", listX, ty) end end @@ -979,8 +1001,12 @@ function PackMenu:drawDescription(ty) local lines = self.message or (self.confirm and self.confirm.prompt) if lines then local name = self:playerName() + -- TEXTBOX_INNERY and home/text.asm:397 LineChar: rows 14 and 16 (#1725). + -- Only a message too tall for those two packs its rows one apart. + local top, step = ty, 2 + if #lines > 2 then top, step = ty - 1, 1 end for i, line in ipairs(lines) do - Chrome.print((line:gsub("{PLAYER}", name)), 1, ty + i - 2) + Chrome.print((line:gsub("{PLAYER}", name)), 1, top + (i - 1) * step) end return end @@ -1056,7 +1082,7 @@ function PackMenu:drawPanel() Chrome.box(0, 0, 20, 3) Chrome.print(self:pocket().label, 2, 1) Chrome.box(0, 3, 20, 12) - self:drawList(2, 4) + self:drawList(5, 4) Chrome.box(0, 12, 20, 6) self:drawDescription(14) self:drawOverlays() diff --git a/src/ui/gen2/Pokegear.lua b/src/ui/gen2/Pokegear.lua index 9c1dfdbe..bbb0e5e8 100644 --- a/src/ui/gen2/Pokegear.lua +++ b/src/ui/gen2/Pokegear.lua @@ -933,6 +933,7 @@ function Pokegear.new(game, opts) -- reject already dropped, so the cursor's skip loop is just "next row". self.fly = opts.fly self.onFly = opts.onFly + self.flyMon = opts.flyMon if self.fly and #self.fly > 0 then self.cards = { FLY_MAP_CARD } self.cardIndex = 1 @@ -956,6 +957,9 @@ function Pokegear.new(game, opts) -- so the RED_WALK icon keeps the overworld's own OBJ palette. self.sprites = opts.sprites or data.gen2Sprites self.palettes = opts.palettes or data.gen2Palettes + -- TownMapMon reads wCurPartyMon's icon + -- (../pokecrystal/engine/pokegear/pokegear.asm:2708-2721). + self.icons = opts.icons or data.gen2Icons local gfx = (opts.menuGfx or data.gen2MenuGfx or {}).pokegear self.gfx = gfx @@ -2130,7 +2134,11 @@ function Pokegear:drawMap() end end if current and current.x and current.y then - self:mapCursorSprite(current.x, current.y) + -- FlyMap's cursor is TownMapMon, the FlyMon's icon; only the MAP card's is + -- the POKEGEAR_ARROW (../pokecrystal/engine/pokegear/pokegear.asm:2326). + if not (self.fly and self:drawFlyMonCursor(current.x, current.y)) then + self:mapCursorSprite(current.x, current.y) + end end end @@ -2174,6 +2182,48 @@ function Pokegear:drawPlayerIcon(x, y) return true end +-- TownMapMon (../pokecrystal/engine/pokegear/pokegear.asm:2708-2721): the +-- FlyMon's party icon, on PAL_OW_RED like the RED_WALK icon beside it. +function Pokegear:loadFlyMonIcon() + if self.flyMonIcon ~= nil then return end + self.flyMonIcon = false + local mon = self.flyMon + if type(mon) ~= "table" then return end + local icons = self.icons + local iconId = mon.isEgg and "ICON_EGG" + or (icons and icons.species and mon.species + and icons.species[mon.species]) + local entry = iconId and icons and icons.icons and icons.icons[iconId] + if not (entry and entry.image) then return end + local def = { + id = "SPRITE_FLY_MON", image = entry.image, frames = 2, walker = false, + spriteType = "POKEMON_SPRITE", palette = "PAL_OW_RED", paletteId = 0, + species = mon.species, icon = iconId, + } + local ok, icon = pcall(SpriteRenderer.new, def, "flymon") + if not (ok and icon) then return end + local world = self.game and self.game.world + local daytime = (world and world.daytime) + or Palettes.clockDaytime(self.clock and self.clock.hour or nil) + local colors = self.palettes + and Palettes.spritePalette(self.palettes, daytime, def) + if colors then + icon:setObjPalette(colors, ("gen2:%s:0"):format(tostring(daytime))) + end + self.flyMonIcon = icon +end + +-- .Frameset_PartyMon is two 8-frame icon beats and no mirror +-- (data/sprite_anims/framesets.asm:66-69). +function Pokegear:drawFlyMonCursor(x, y) + self:loadFlyMonIcon() + if not self.flyMonIcon then return false end + love.graphics.setColor(1, 1, 1, 1) + self.flyMonIcon:draw(x - 8, y - 8, 0, -4, "down", 0, false, false, false, + math.floor((self.iconTimer or 0) / 8) % 2) + return true +end + -- The cursor arrow. It is the same PokegearSpritesGFX sheet the mode -- indicator uses, at tile $04; without the sheet the port falls back to -- Chrome's own cursor glyph so the card is still navigable. diff --git a/src/ui/gen2/SummaryMenu.lua b/src/ui/gen2/SummaryMenu.lua index 38f27dfb..431b778f 100644 --- a/src/ui/gen2/SummaryMenu.lua +++ b/src/ui/gen2/SummaryMenu.lua @@ -103,6 +103,14 @@ local PAGE_PALETTES = { { { 255, 255, 255 }, { 140, 255, 255 }, { 140, 255, 255 }, { 0, 0, 0 } }, } +-- gfx/stats/stats.pal, the colour LoadStatsScreenPals writes over colour 0 of +-- BG palettes 0 and 2 (engine/gfx/color.asm:386-390). #1693 +local PAGE_TINTS = { + { 255, 156, 255 }, + { 173, 255, 115 }, + { 140, 255, 255 }, +} + -- PrintTempMonStats' .StatNames, and the wTempMon fields it prints beside -- them. steps two rows, so the five labels are 2 rows apart and the -- values start one row below the first label. @@ -901,13 +909,20 @@ end -- A tile out of StatsScreenPageTilesGFX. The fallback arm draws each of the -- seven shapes by hand for a cache built before menu_gfx.stats existed. -function SummaryMenu:pageTile(id, tx, ty) +function SummaryMenu:pageTile(id, tx, ty, colors) local G = love.graphics local px, py = tx * 8, ty * 8 local sheet = self:statsTiles() if sheet and sheet.quads[id] then G.setColor(1, 1, 1, 1) - G.draw(sheet.image, sheet.quads[id], px, py) + local function body() + G.draw(sheet.image, sheet.quads[id], px, py) + end + if colors and GbcPalette.available() then + GbcPalette.with(colors, body) + else + body() + end return end G.setColor(0, 0, 0, 1) @@ -1106,8 +1121,26 @@ function SummaryMenu:drawHorizontalDivider() end end +-- BG palette 0 as the stats screen leaves it: the page tint in colour 0, black +-- ink in colour 3 (engine/gfx/color.asm:386-390). +function SummaryMenu:lowerColors() + local tint = PAGE_TINTS[self.page] or PAGE_TINTS[PINK_PAGE] + return { tint, tint, tint, { 0, 0, 0 } } +end + +-- StatsScreen_LoadGFX's .ClearBox: hlcoord 0, 8 / lb bc, 10, 20, the ten rows +-- LoadStatsScreenPals then tints (engine/pokemon/stats_screen.asm:549-557). +function SummaryMenu:drawPageBackground() + local G = love.graphics + local tint = GbcPalette.color(self:lowerColors(), 1) or { 255, 255, 255 } + G.setColor(tint[1] / 255, tint[2] / 255, tint[3] / 255, 1) + G.rectangle("fill", 0, 8 * 8, Chrome.SCREEN_W * 8, 10 * 8) + G.setColor(0, 0, 0, 1) +end + function SummaryMenu:drawVerticalDivider(tx) - for y = 8, 17 do self:pageTile(TILE_VERTICAL_DIVIDER, tx, y) end + local colors = self:lowerColors() + for y = 8, 17 do self:pageTile(TILE_VERTICAL_DIVIDER, tx, y, colors) end end function SummaryMenu:drawUpperHalf() @@ -1125,11 +1158,12 @@ end function SummaryMenu:drawPinkPage() local mon = self.mon or {} local maxHp = mon.maxHp or (mon.stats and mon.stats.hp) or 0 + local tint = PAGE_TINTS[self.page] or PAGE_TINTS[PINK_PAGE] -- DrawPlayerHP is DrawBattleHPBar with d = 6 and b = 0: "HP:" at (0,9), six -- bar cells, and the end cap at (8,9) -- which LoadPinkPage then rewrites as -- $41, the same shape from the stats sheet. if self.hud and self.hud:available() then - self.hud:drawHpBar(mon.hp, maxHp, 0, 9) + self.hud:drawHpBar(mon.hp, maxHp, 0, 9, tint) else HpBar.drawWithLabel(self.palettes, mon.hp, maxHp, 0, 9, Font) end @@ -1141,15 +1175,16 @@ function SummaryMenu:drawPinkPage() -- and (19,16). local fraction = HpBar.expFraction(mon, self:growth(), Mon.experienceForLevel) if self.hud and self.hud:available() then - self.hud:drawExpBar(fraction, 11, 16) + self.hud:drawExpBar(fraction, 11, 16, tint) else -- No HUD sheet in the cache: the plain rule, which is HP_BAR_LENGTH_PX -- (48) wide rather than the exp bar's 64, so it stops two tiles short of -- the $41 cap. A cache old enough to hit this has no bar tiles at all. HpBar.drawExp(self.palettes, fraction, 11 * 8, 16 * 8 + 3) end - self:pageTile(TILE_BAR_CAP_LEFT, 10, 16) - self:pageTile(TILE_BAR_CAP_RIGHT, 19, 16) + local colors = self:lowerColors() + self:pageTile(TILE_BAR_CAP_LEFT, 10, 16, colors) + self:pageTile(TILE_BAR_CAP_RIGHT, 19, 16, colors) end function SummaryMenu:drawGreenPage() @@ -1211,6 +1246,7 @@ function SummaryMenu:drawPanel() self:drawMoveDetail() else Chrome.clear() + self:drawPageBackground() self:drawUpperHalf() if self.page == GREEN_PAGE then self:drawGreenPage() @@ -1244,6 +1280,7 @@ SummaryMenu.STAT_LABELS = STAT_LABELS SummaryMenu.STAT_KEYS = STAT_KEYS SummaryMenu.TYPE_NAMES = TYPE_NAMES SummaryMenu.PAGE_PALETTES = PAGE_PALETTES +SummaryMenu.PAGE_TINTS = PAGE_TINTS SummaryMenu.levelText = levelText return SummaryMenu diff --git a/src/ui/kit/Theme.lua b/src/ui/kit/Theme.lua index 66a3fa30..6cb3f525 100644 --- a/src/ui/kit/Theme.lua +++ b/src/ui/kit/Theme.lua @@ -65,7 +65,7 @@ local PAL = { railGold = { 255, 203, 5 }, -- Yellow cartridge (bright) railAmber = { 218, 145, 32 }, -- Gold cartridge (deeper metal) railSilver = { 190, 198, 210 }, -- Silver cartridge (cool light metal) - railCrystal = { 168, 120, 236 }, -- Crystal cartridge (translucent violet) + railCrystal = { 132, 196, 228 }, -- Crystal cartridge (translucent ice blue) } -- Semantic aliases kept so ported call sites read the same as before. PAL.cardBorder = PAL.line diff --git a/src/world/NPC.lua b/src/world/NPC.lua index ef29b7fd..f8e41663 100644 --- a/src/world/NPC.lua +++ b/src/world/NPC.lua @@ -42,6 +42,23 @@ function NPC.new(data, mapId, objDef) return self end +-- LoadMapHeader .loadSpriteData zeroes the sprite state data and re-seeds +-- MAPY/MAPX from the map header -- home/overworld.asm:2133 +function NPC:resetToSpawn() + local def = self.def + self.cellX, self.cellY = def.x, def.y + self.px, self.py = self.cellX * 16, self.cellY * 16 + self.facing = FACING_FROM_RANGE[def.range] or "down" + self.targetX, self.targetY = nil, nil + self.moving = false + self.marching = false + self.hopStep = nil + self.progress = 0 + self.animClock = 0 + self.stepFlip = false + self.timer = love.math.random(30, 120) +end + function NPC:facePlayer(player) local dx = player.cellX - self.cellX local dy = player.cellY - self.cellY diff --git a/src/world/OverworldController.lua b/src/world/OverworldController.lua index e0391b3f..3ab5d66a 100644 --- a/src/world/OverworldController.lua +++ b/src/world/OverworldController.lua @@ -81,6 +81,24 @@ local HEAL_BALL_XY = { -- swaps the two middle shades of the monitor/ball art in place local HEAL_FLASH_MAP = { [0] = 0, [1] = 2, [2] = 1, [3] = 3 } +-- scripts/VermilionDock.asm:39 VermilionDockSSAnneLeavesScript: her hull is +-- the four blocks (5..8, 1..2) of VermilionDock.blk +local SS_ANNE_BLOCK = { x = 5, y = 1, w = 4, h = 2 } +-- scripts/VermilionDock.asm:164 VermilionDock_SyncScrollWithLY splits rSCX at +-- LY $50, so her top 16px -- the player's own cell row -- never scrolls +local SS_ANNE_KEEP_PX = 16 +-- scripts/VermilionDock.asm:79 `ld e, $8`: eight 16px columns, and each +-- .delay_between_drifts pass is eight frames per pixel +local SS_ANNE_SAIL_PX, SS_ANNE_PX_FRAMES = 128, 8 +-- scripts/VermilionDock.asm:182 VermilionDock_EraseSSAnne: block 1 is the +-- shoreline row she sat in, block 13 the open water below it +local SS_ANNE_WATER = { 1, 13 } +-- scripts/VermilionDock.asm:142 VermilionDock_EmitSmokePuff: a puff per +-- column off the front smokestack, drifting east 2px per drift step +local SS_ANNE_SMOKE = { dx = 64, dy = 20, drift = 2, every = 16, count = 5 } +-- scripts/VermilionDock.asm:65 `ldh [rOBP1], a` with a = 0: the puff is white +local SS_ANNE_SMOKE_MAP = { [0] = 0, [1] = 0, [2] = 0, [3] = 0 } + -- Fishing rod placement (FishingRodOAM, engine/overworld/player_animations -- .asm). Those dbsprite rows are raw shadow-OAM bytes like HEAL_BALL_XY -- above (screen = tile*8 + pixel - 8/16), measured against the player @@ -320,6 +338,7 @@ function OverworldState:setMap(mapId, x, y, facing, opts) self.parallelQueue = {} end self.marchers = {} + self.shipAnim = nil local queue = self.pendingScripts if queue then for i = #queue, 1, -1 do @@ -413,12 +432,14 @@ function OverworldState:setMap(mapId, x, y, facing, opts) -- (home/overworld.asm), so an NPC who walked up to the player stands -- on her spawn cell again the next time that map loads (#1028). Only -- the save-side spawn flags survive, and those live in Game.save, not - -- here. Warps rebuild the whole pool from scratch. + -- here. Warps rebuild the whole pool from scratch; a seam crossing arms + -- the re-seed and applyPendingSpawnResets lands it off camera (#1755). if not (opts and opts.seamless and self.npcPool) then self.npcPool = {} elseif fromMapId ~= mapId then for _, obj in ipairs(self.map.def.objects or {}) do - self.npcPool[mapId .. "_obj_" .. obj.index] = nil + local npc = self.npcPool[mapId .. "_obj_" .. obj.index] + if npc then npc.pendingSpawnReset = true end end end self.npcs = {} @@ -624,6 +645,41 @@ function OverworldState:rebuildNeighbors() end end +-- the deferred half of the seam re-seed armed in setMap (#1755): the cart's +-- connected map has no sprites to be seen snapping -- home/overworld.asm:2133 +function OverworldState:applyPendingSpawnResets() + local pool = self.npcPool + if not (pool and self.camera) then return end + local due + for _, npc in pairs(pool) do + if npc.pendingSpawnReset then + due = due or {} + due[npc] = true + end + end + if not due then return end + local cam = self.camera + local vw, vh = Game.renderer:worldViewSize() + local function onCamera(px, py) + return px + 16 > cam.x - 16 and px < cam.x + vw + 16 + and py + 16 > cam.y - 16 and py < cam.y + vh + 16 + end + for _, mv in ipairs(self.scriptMoves or {}) do due[mv.entity] = nil end + for entity in pairs(self.marchers or {}) do due[entity] = nil end + for _, npc in ipairs(self.npcs or {}) do + if due[npc] and onCamera(npc.px, npc.py) then due[npc] = nil end + end + for _, g in ipairs(self.ghosts or {}) do + if due[g.npc] and onCamera(g.npc.px + g.ox, g.npc.py + g.oy) then + due[g.npc] = nil + end + end + for npc in pairs(due) do + npc.pendingSpawnReset = nil + npc:resetToSpawn() + end +end + -- SGB overworld palette (engine/gfx/palettes.asm SetPal_Overworld): -- towns use their own palette, routes PAL_ROUTE, interiors the town or -- route they are in (wLastMap = our lastOutdoor), with tileset and @@ -1068,6 +1124,27 @@ function OverworldState:update(dt) if da.onDone then da.onDone() end end end + -- scripts/VermilionDock.asm:80 .shift_columns_up + if self.shipAnim and not self.shipAnim.gone then + local sa = self.shipAnim + sa.frames = sa.frames + 1 + if sa.frames >= SS_ANNE_PX_FRAMES then + sa.frames = 0 + sa.off = sa.off + 1 + if sa.off % SS_ANNE_SMOKE.every == 1 + and #sa.puffs < SS_ANNE_SMOKE.count then + sa.puffs[#sa.puffs + 1] = { x = sa.px - sa.off + SS_ANNE_SMOKE.dx, + y = sa.py + SS_ANNE_SMOKE.dy } + end + for _, p in ipairs(sa.puffs) do p.x = p.x + SS_ANNE_SMOKE.drift end + if sa.off >= SS_ANNE_SAIL_PX then + sa.gone, sa.puffs = true, {} + local done = sa.onDone + sa.onDone = nil + if done then done() end + end + end + end if self.cutAnim then local ca = self.cutAnim ca.frames = ca.frames - 1 @@ -1227,6 +1304,7 @@ function OverworldState:update(dt) -- escort then walks an extra tile before PlayerEntryMovementRLE, and -- the player lands on desk Oak. local scripted = self.runner:isRunning() or #self.scriptMoves > 0 + or (self.hopLand or 0) > 0 or self.engaging or self.emote or self.teleportOut or self.flyAnim or self.flyArrive if not scripted and not self.transitioning then @@ -1236,6 +1314,7 @@ function OverworldState:update(dt) -- direction handling (JoypadOverworld runs the map script first) -- -- the player can never start another step after being spotted. scripted = self.runner:isRunning() or #self.scriptMoves > 0 + or (self.hopLand or 0) > 0 or self.engaging or self.emote or self.teleportOut or self.flyAnim or self.flyArrive end @@ -1244,6 +1323,7 @@ function OverworldState:update(dt) if not scripted and not self.transitioning and Game.stack:top() == self then self:handleInput() end + if (self.hopLand or 0) > 0 then self.hopLand = self.hopLand - 1 end local stepped = self.player:update() -- the warp-arrival cell goes stale the instant the player's real cell @@ -1271,6 +1351,7 @@ function OverworldState:update(dt) self.camera:follow(self.player.px, self.player.py, Game.renderer:worldViewSize()) + self:applyPendingSpawnResets() -- pan_camera offset rides on top of the follow; the ramp resumes its -- runner when it lands @@ -1509,6 +1590,76 @@ function OverworldState:startDustAnim(cx, cy, onDone) self.dustAnim = { x = cx, y = cy, frames = 32, onDone = onDone } end +-- scripts/VermilionDock.asm:39 VermilionDockSSAnneLeavesScript: snapshot her +-- hull tiles, flood her box with water, and slide the snapshot west from there +function OverworldState:startSsAnneDeparture(onDone) + local map = self.map + local tx0, ty0 = SS_ANNE_BLOCK.x * 4, SS_ANNE_BLOCK.y * 4 + local tiles = {} + for row = 1, SS_ANNE_BLOCK.h * 4 do + local r = {} + for col = 1, SS_ANNE_BLOCK.w * 4 do + r[col] = map:tileAt(tx0 + col - 1, ty0 + row - 1) + end + tiles[row] = r + end + for bx = SS_ANNE_BLOCK.x, SS_ANNE_BLOCK.x + SS_ANNE_BLOCK.w - 1 do + for by = SS_ANNE_BLOCK.y, SS_ANNE_BLOCK.y + SS_ANNE_BLOCK.h - 1 do + map:setBlock(bx, by, SS_ANNE_WATER[by - SS_ANNE_BLOCK.y + 1] or 13) + end + end + map.renderer:rebuild() + self.shipAnim = { px = tx0 * 8, py = ty0 * 8, tiles = tiles, + off = 0, frames = 0, puffs = {}, onDone = onDone } +end + +-- scripts/VermilionDock.asm:164: the rSCX split keeps her top 16px (the +-- shoreline row and the gangway under the player) put while the rest sails +function OverworldState:drawShipAnim(camX, camY) + local sa = self.shipAnim + if not sa then return end + local renderer = self.map.renderer + local img, quads = renderer.image, renderer.quads + local ox, oy = -math.floor(camX), -math.floor(camY) + local keep = SS_ANNE_KEEP_PX / 8 + love.graphics.setColor(1, 1, 1, 1) + for row = 1, #sa.tiles do + if row <= keep or not sa.gone then + local slide = row > keep and sa.off or 0 + local wy = sa.py + (row - 1) * 8 + oy + for col = 1, #sa.tiles[row] do + local quad = quads[sa.tiles[row][col]] + if quad then + love.graphics.draw(img, quad, sa.px + (col - 1) * 8 - slide + ox, wy) + end + end + end + end + if #sa.puffs == 0 then return end + local fxDef = Game.data.field.overworldFx + local smoke = fxDef and fxDef.smoke + if not smoke then return end + if self.smokeImg == nil then + local ok, image = pcall(love.graphics.newImage, smoke.path) + self.smokeImg = ok and image or false + end + if not self.smokeImg then return end + local shader = PaletteFX.shader() + if shader then + PaletteFX.sendColors(shader, + PaletteFX.permute(PaletteFX.GRAYS, SS_ANNE_SMOKE_MAP)) + love.graphics.setShader(shader) + end + for _, p in ipairs(sa.puffs) do + for i = 0, 1 do + for j = 0, 1 do + love.graphics.draw(self.smokeImg, p.x + i * 8 + ox, p.y + j * 8 + oy) + end + end + end + if shader then love.graphics.setShader() end +end + -- Ledge hops (data/tilesets/ledge_tiles.asm): standing tile + ledge tile -- in front + matching input direction -> jump two cells. function OverworldState:checkLedgeHop(dir) @@ -1542,17 +1693,22 @@ function OverworldState:checkLedgeHop(dir) return false end require("src.core.Sound").play(Game.data, "Ledge") - local hop = (p.stepFramesCur or p.stepFrames or 16) * 2 + p.ledgeHop = true -- BIT_LEDGE_OR_FISHING, no bike speedup mid-hop + local hop = p:stepLength() * 2 p.hopFrames, p.hopTotal = hop, hop -- jump arc (cosmetic) - self:scriptMove(p, dir, 1, function() self:checkEdgeExit(dir) end) + self:scriptMove(p, dir, 1, function() + self:checkEdgeExit(dir) + self:finishLedgeHop() + end) return true end if not Collision.occupied(self.entities, lx, ly, p) and self.map:isWalkableCell(lx, ly) then require("src.core.Sound").play(Game.data, "Ledge") - local hop = (p.stepFramesCur or p.stepFrames or 16) * 2 + p.ledgeHop = true -- BIT_LEDGE_OR_FISHING, no bike speedup mid-hop + local hop = p:stepLength() * 2 p.hopFrames, p.hopTotal = hop, hop -- jump arc (cosmetic) - self:scriptMove(p, dir, 2) + self:scriptMove(p, dir, 2, function() self:finishLedgeHop() end) return true end end @@ -1560,6 +1716,13 @@ function OverworldState:checkLedgeHop(dir) return false end +-- _HandleMidJump .finishedJump lands with UpdateSprites + Delay3 before it +-- clears the joypad bytes -- engine/overworld/player_animations.asm:509 +function OverworldState:finishLedgeHop() + self.player.ledgeHop = nil + self.hopLand = 3 +end + -- walking off the map edge: connection crossing or edge warp (exit mats) function OverworldState:checkEdgeExit(dir) local p = self.player @@ -1665,9 +1828,7 @@ function OverworldState:crossConnection(dir, conn) -- fresh walk-cycle clock so the seam step always shows leg frames -- (mid-cycle stand phase would otherwise look like a slide) p.animClock = 0 - p.stepFramesCur = Game.save.onBike - and (FieldDefaults.world(Game.data, "bikeStepFrames") or 8) - or (FieldDefaults.world(Game.data, "stepFrames") or 16) + p.stepFramesCur = p:stepLength() require("src.core.FixedStep"):discardCatchup() return true end @@ -2413,16 +2574,12 @@ function OverworldState:trashCanSwitch(canIndex) local adj = tc.adjacent[puz.first] local masked = require("bit").band(love.math.random(0, 255), #adj) puz.second = masked == 0 and 0 or adj[masked] - -- VermilionGymTrashSuccessText1's text_asm tail plays SFX_SWITCH only - -- after the text has printed (text_far ...; text_asm; - -- WaitForSoundToFinish; PlaySound SFX_SWITCH; WaitForSoundToFinish), - -- and DisplayTextID's WaitForTextScrollButtonPress then holds the box - -- until the player dismisses it -- so the beep belongs on close, not - -- open. + -- engine/events/hidden_events/vermilion_gym_trash.asm:130 (text_asm tail: + -- SFX_SWITCH once the text has printed, before the button wait) (#1702) Game.stack:push(TextBox.new(Game, t._VermilionGymTrashSuccessText1 or Strings("Hey! There's a\nswitch under the\ntrash!\fThe 1st electric\nlock opened!"), - function() require("src.core.Sound").play(Game.data, "Switch") end)) + nil, TextBox.soundOpts(Game, "Switch"))) return end -- .trySecondLock @@ -2433,25 +2590,28 @@ function OverworldState:trashCanSwitch(canIndex) -- the clear floor block opens the doors (VermilionGymSetDoorTile) local door = FieldDefaults.fieldValue(Game.data, "hiddenExtras", "trashCans", "doorBlock") - self:replaceBlock(door.bx, door.by, door.block) - -- SuccessText3's text_asm tail plays SFX_GO_INSIDE after the text - -- prints, so the beep fires as the box closes, not as it opens. + -- engine/events/hidden_events/vermilion_gym_trash.asm:153 beeps as the + -- text finishes; scripts/VermilionGym.asm:30 beeps on the swap (#1702) Game.stack:push(TextBox.new(Game, t._VermilionGymTrashSuccessText3 or Strings("The 2nd electric\nlock opened!\fThe motorized door\nopened!"), - function() require("src.core.Sound").play(Game.data, "Go_Inside") end)) + function() + require("src.core.Sound").play(Game.data, "Go_Inside") + self:replaceBlock(door.bx, door.by, door.block) + end, + TextBox.soundOpts(Game, "Go_Inside"))) else -- wrong can: ResetEvent EVENT_1ST_LOCK_OPENED and immediately -- re-roll the first switch (Random & $e) save.flags.EVENT_1ST_LOCK_OPENED = nil puz.first = love.math.random(0, 7) * 2 puz.second = nil - -- VermilionGymTrashFailText's text_asm tail plays SFX_DENIED after the - -- text prints, so the beep fires as the box closes, not as it opens. + -- engine/events/hidden_events/vermilion_gym_trash.asm:162 (text_asm tail: + -- SFX_DENIED once the text has printed, before the button wait) (#1702) Game.stack:push(TextBox.new(Game, t._VermilionGymTrashFailText or Strings("Nope! There's\nonly trash here.\fHey! The electric\nlocks were reset!"), - function() require("src.core.Sound").play(Game.data, "Denied") end)) + nil, TextBox.soundOpts(Game, "Denied"))) end end @@ -2899,10 +3059,10 @@ function OverworldState:talkTo(npc) if entry then if entry.mart then npc:facePlayer(self.player) - Game.stack:push(TextBox.new(Game, romText(Game.data, "_PokemartGreetingText", "Hi there!\nMay I help you?"), function() - Screens.push(Game, "ShopMenu", entry.mart) - unfreeze() - end)) + -- the greeting stays in the box under the menu, so ShopMenu owns it + -- now -- home/text_script.asm:143 + Screens.push(Game, "ShopMenu", entry.mart) + unfreeze() return end if entry.nurse then @@ -3365,22 +3525,18 @@ function OverworldState:engageTrainer(npc, onDone, endBattleText, skipBattleText or (header and header.won and Game.data.text[header.won]) local BattleState = require("src.battle.BattleState") + local stingPlayed = false + -- home/trainers.asm:109 prints, :123 engages (BIT_SEEN_BY_TRAINER = + -- self.engaging), then home/text_script.asm:96 waits for A (#764, #1683) + local function playMeetSting() + if stingPlayed or self.engaging then return end + stingPlayed = true + local theme = meetTrainerTheme(d.trainerClass) + if theme then require("src.core.Music").play(Game.data, theme) end + end local function startBattle(options) self.cancelledTrainerSight = nil - -- TalkToTrainer (home/trainers.asm:88) prints the before-battle text - -- FIRST and only then runs `call EngageMapTrainer` / `jp - -- StartTrainerBattle`, so a trainer challenged on foot gets the sting - -- over the battle transition rather than under the dialogue. Its - -- `bit BIT_SEEN_BY_TRAINER, [hl] / ret nz` guard is self.engaging - -- here: TrainerEngage (engine/overworld/trainer_sight.asm:224) already - -- started the sting before the "!" bubble on the sight path, so it - -- must not restart. Script-driven challenges (gyms.lua leaders, - -- scripts/SilphCo11F.asm:269 Giovanni, scripts/FightingDojo.asm:122) - -- all `call EngageMapTrainer` too, and reach this same path (#764). - if not self.engaging then - local theme = meetTrainerTheme(d.trainerClass) - if theme then require("src.core.Music").play(Game.data, theme) end - end + playMeetSting() local battle = BattleState.newTrainer(Game, d.trainerClass, d.trainerParty, options) battle.checkpointOrigin = { @@ -3451,7 +3607,8 @@ function OverworldState:engageTrainer(npc, onDone, endBattleText, skipBattleText if skipBattleText then prepareBattle() else - Game.stack:push(TextBox.new(Game, battleText, prepareBattle)) + Game.stack:push(TextBox.new(Game, battleText, prepareBattle, + { auto = { wait = true, delay = 0, sound = playMeetSting } })) end end @@ -4395,18 +4552,11 @@ function OverworldState:afterBattle(result, battle) Logger.info("battle over: %s (lead %s %d/%d)", tostring(result), lead and lead.species or "-", lead and lead.hp or 0, lead and lead.stats.hp or 0) - local Evolution = require("src.pokemon.Evolution") - local function evolutions() - -- Only mons that gained a level this battle (EXP.ALL included). - -- Scanning the whole party re-offered B-cancelled evolutions forever (#213). - Evolution.checkParty(Game, nil, battle and battle.leveledUp) - end if result == "lose" then local oaksLabRival = battle and battle.oppClass == "OPP_RIVAL1" and self.map and self.map.id == "OAKS_LAB" if oaksLabRival then -- stay in the lab; OaksLabRivalEndBattleScript heals and continues - evolutions() return end -- blackout: revive the party at the last heal point; half the @@ -4419,7 +4569,7 @@ function OverworldState:afterBattle(result, battle) / (FieldDefaults.world(Game.data, "blackoutMoneyDivisor") or 2)) Runtime.emit("world.blacked_out", { save = Game.save, healTarget = self:healPoint() }) - self:warpToHealPoint(evolutions) + self:warpToHealPoint() else -- EndTrainerBattle sets BIT_CUR_MAP_LOADED_1 (home/trainers.asm), which -- re-runs the floor's door callback: beating the last Rocket Hideout guard @@ -4429,7 +4579,6 @@ function OverworldState:afterBattle(result, battle) if Game.save.safari and Game.save.safari.balls <= 0 then self:safariGameOver(Strings("PA: You're out of\nSAFARI BALLs!")) end - evolutions() end end @@ -4858,6 +5007,9 @@ function OverworldState:updateScriptMoves() e.facing = mv.dir local tx, ty = Collision.target(e.cellX, e.cellY, mv.dir) e.targetX, e.targetY = tx, ty + -- a simulated d-pad press runs at the CURRENT walk/bike speed, not + -- whatever the last real step left behind -- home/overworld.asm:276 + if e.stepLength then e.stepFramesCur = e:stepLength() end e.moving = true e.progress = 0 mv.remaining = mv.remaining - 1 @@ -5018,6 +5170,7 @@ function OverworldState:drawWorld() for _, nb in ipairs(self.neighbors) do nb.map.renderer:drawMapOnly(cam.x - nb.ox, bgY - nb.oy, vw, vh) end + self:drawShipAnim(cam.x, bgY) end -- per-billboard SGB palette source; only needed (and only paid for) when -- tilting. nil headless / on stale palettes -> billboards go uncolorized. @@ -5374,6 +5527,7 @@ function OverworldState:drawWorld() for _, nb in ipairs(self.neighbors) do nb.map.renderer:drawMapOnly(cam.x - nb.ox, bgY - nb.oy, vw, vh) end + self:drawShipAnim(cam.x, bgY) end end diff --git a/src/world/Player.lua b/src/world/Player.lua index 54727a7b..5fd33c47 100644 --- a/src/world/Player.lua +++ b/src/world/Player.lua @@ -110,6 +110,26 @@ function Player:turnWindow() return frames end +-- the bicycle doubles walking speed (8 frames per step); movement.speed +-- lets a mod multiply or replace that (running shoes, dash, etc.) +-- DoBikeSpeedup is skipped mid-hop -- home/overworld.asm:283 +function Player:stepLength() + local Game = require("src.core.Game") + local save = Game.save + local onBike = (save and save.onBike and not self.ledgeHop) or false + local frames = onBike and self.bikeStepFrames or self.stepFrames or STEP_FRAMES + if Runtime.wantsHook("movement.speed") then + frames = Runtime.call("movement.speed", function(f) return f end, frames, { + onBike = onBike, + surfing = self.surfing and true or false, + player = self, + input = Game.input, + save = save, + }) + end + return math.max(1, math.floor(tonumber(frames) or STEP_FRAMES)) +end + -- Attempt to start a step; returns "moved"|"turned"|"blocked"|nil. function Player:tryMove(dir, map, entities) if self.moving or self.inputLocked then return nil end @@ -145,22 +165,7 @@ function Player:tryMove(dir, map, entities) self.moving = true self.bumpFrames = nil -- a real step supersedes any in-place bonk self.progress = 0 - -- the bicycle doubles walking speed (8 frames per step); movement.speed - -- lets a mod multiply or replace that (running shoes, dash, etc.) - local Game = require("src.core.Game") - local save = Game.save - local frames = (save and save.onBike) and self.bikeStepFrames - or self.stepFrames or STEP_FRAMES - if Runtime.wantsHook("movement.speed") then - frames = Runtime.call("movement.speed", function(f) return f end, frames, { - onBike = save and save.onBike or false, - surfing = self.surfing and true or false, - player = self, - input = Game.input, - save = save, - }) - end - self.stepFramesCur = math.max(1, math.floor(tonumber(frames) or STEP_FRAMES)) + self.stepFramesCur = self:stepLength() return "moved" end diff --git a/src/world/gen2/FieldMoves.lua b/src/world/gen2/FieldMoves.lua index 66f8d57c..97cb0cc9 100644 --- a/src/world/gen2/FieldMoves.lua +++ b/src/world/gen2/FieldMoves.lua @@ -102,8 +102,8 @@ FieldMoves.TEXT = { .. "\fA #MON may be\nable to pass it."), ASK_WHIRLPOOL = Strings.source("A whirlpool is in\nthe way." .. "\fWant to use\nWHIRLPOOL?"), - -- Not a cart line: the stand-in destination prompt World:askFlyPoint uses - -- until the POKeGEAR's MAP card grows _FlyMap's cursor mode. + -- Not a cart line: the prompt World:askFlyPoint falls back to when there is + -- no screen at all to push -- a headless probe, never a real run. ASK_FLY_TO = Strings.source("Fly to %s?"), } @@ -183,6 +183,10 @@ function FieldMoves.bindEngineFlags(order) -- The flag IS wPlayerGender's bit 0, so World routes it to the gender byte -- (data/events/engine_flags.asm:131, constants/engine_flags.asm:121). FieldMoves.FEMALE_FLAG = byName[FieldMoves.FEMALE_FLAG_NAME] + -- Crystal's ENGINE_MOBILE_SYSTEM (constants/engine_flags.asm:25) has no Gold + -- row, so every id from BUG_CONTEST_TIMER up shifts one. + FieldMoves.BUG_CONTEST_FLAG = byName["ENGINE_BUG_CONTEST_TIMER"] or 16 + FieldMoves.BIKE_SHOP_CALL_FLAG = byName["ENGINE_BIKE_SHOP_CALL_ENABLED"] or 19 return flags end diff --git a/src/world/gen2/Npc.lua b/src/world/gen2/Npc.lua index ac21731e..3ad40933 100644 --- a/src/world/gen2/Npc.lua +++ b/src/world/gen2/Npc.lua @@ -31,6 +31,8 @@ local MOVE = { STANDING_LEFT = 8, STANDING_RIGHT = 9, SPINRANDOM_FAST = 10, + -- data/sprites/map_objects.asm:181-187 + POKEMON = 0x16, SPINCOUNTERCLOCKWISE = 0x1e, SPINCLOCKWISE = 0x1f, -- The three rows whose palette-flags byte is `STRENGTH_BOULDER | BIG_OBJECT` @@ -123,6 +125,11 @@ local SPIN_NEXT = { -- each quarter, no Random anywhere in the loop. local SPIN_TURN_FRAMES = 16 +-- SetFacingBounce steps OBJECT_STEP_FRAME once a frame and reads bit 3, so a +-- mon object holds each icon frame for eight -- map_object_action.asm:184-201 +local BOUNCE_PERIOD = 16 +local BOUNCE_HALF = 8 + local function rand(a, b) if love and love.math and love.math.random then return love.math.random(a, b) @@ -252,6 +259,8 @@ function NPC.new(mapId, objDef, spriteDef) bigObject = BIG_OBJECT[movement] == true, bigFacing = NPC.bigFacing(movement, spriteDef and spriteDef.id), fixedFacing = FIXED_FACING_MOVE[movement] or nil, + bouncing = movement == MOVE.POKEMON or nil, + bounceStep = 0, timer = rand(30, 120), sprite = SpriteRenderer.new(spriteDef, string.format("%s_obj_%d", mapId, objDef.index or 0)), -- The sheet is grayscale and carries no alpha; PAL_OW_* crossed with the @@ -501,6 +510,14 @@ function NPC:walkPhase() return (p >= frames / 4 and p < frames * 3 / 4) and 1 or 0 end +-- OBJECT_ACTION_BOUNCE's two columns, SetFacingBounce and +-- SetFacingFreezeBounce -- engine/overworld/map_object_action.asm:184-201 +function NPC:bounceFrame() + if not self.bouncing then return nil end + if self.frozen then return 0 end + return ((self.bounceStep or 0) >= BOUNCE_HALF) and 1 or 0 +end + -- Gen 1's seven-value entity pose (src/world/NPC.lua:124), on the class so a -- mod poses the object it is FOLLOWING, not only one it built itself. function NPC:pose() @@ -522,6 +539,9 @@ function NPC:update(map, entities) self.spawnLatched = true self.inGrass = NPC.grassAt(map, self.cellX, self.cellY) end + if self.bouncing and not self.frozen then + self.bounceStep = ((self.bounceStep or 0) + 1) % BOUNCE_PERIOD + end -- The teleport step type owns the object outright (it replaces -- STEP_TYPE_FROM_MOVEMENT until its last beat), so it runs above the frozen -- gate the way the walk interpolation does. @@ -763,7 +783,8 @@ function NPC:draw(ox, oy, scale) else self.sprite:draw( self.px, self.py + yOffset, 0, 0, - self.facing, self:walkPhase(), self.stepFlip) + self.facing, self:walkPhase(), self.stepFlip, + false, false, self:bounceFrame()) end G.pop() end diff --git a/src/world/gen2/Player.lua b/src/world/gen2/Player.lua index 4e4153fe..5a0734e4 100644 --- a/src/world/gen2/Player.lua +++ b/src/world/gen2/Player.lua @@ -23,6 +23,19 @@ local JUMP_Y = { -11, -10, -9, -8, -6, -4, 0, 0, } +-- FacingFish*'s loose rod OAM, offset from the sprite's top-left, and which +-- 8x8 of the sheet's rod row it draws (data/sprites/facings.asm:122-152). +local ROD_OAM = { + down = { dx = 0, dy = 16, tile = 0 }, + up = { dx = 0, dy = -8, tile = 0 }, + left = { dx = -8, dy = 5, tile = 1, flip = true }, + right = { dx = 16, dy = 5, tile = 1 }, +} + +-- The sheet row LoadFishingGFX lays over each standing frame's bottom tiles +-- (engine/events/fishing_gfx.asm:2-20). +local FISH_ROW = { down = 0, up = 1, left = 2, right = 2 } + function Player.new(cx, cy, facing, spriteDef) local self = setmetatable({ cellX = cx, cellY = cy, @@ -138,6 +151,17 @@ function Player:scriptStep(dir) return true end +-- CounterclockwiseSpinAction's .facings, seeded from the current direction by +-- Movement_step_dig -- map_object_action.asm:96-152, movement.asm:113-116 +local SPIN_FACINGS = { "down", "right", "up", "left" } +local SPIN_START = { down = 0, right = 1, up = 2, left = 3 } + +function Player:scriptSpin(frames) + if not frames or frames <= 0 then return end + self.spinFrames = frames + self.spinTimer = (SPIN_START[self.facing] or 0) * 4 +end + -- Gen 1's name for the cell being faced (src/world/Player.lua), so a mod that -- wraps World:interact asks one question of either generation. function Player:facingCell() @@ -158,6 +182,11 @@ function Player:update() if self.turnTimer > 0 then self.turnTimer = self.turnTimer - 1 end + if self.spinFrames then + self.spinTimer = (self.spinTimer or 0) + 1 + self.spinFrames = self.spinFrames - 1 + if self.spinFrames <= 0 then self.spinFrames = nil end + end if not self.moving then -- Re-arm turn-in-place once a poll finds no held direction (caller -- clears this while a dir is held; we only set it from idle). @@ -170,17 +199,27 @@ function Player:update() -- and the facing-delta math walked only half of it, leaving the sprite a -- cell behind where the grid said the player was. local frames = self.stepFrames or STEP_FRAMES - local adv = math.floor(self.progress * 16 / frames) local dx = (self.targetX or self.cellX) - self.cellX local dy = (self.targetY or self.cellY) - self.cellY - self.px = self.cellX * 16 + dx * adv - self.py = self.cellY * 16 + dy * adv + -- engine/overworld/map_objects.asm:331 -- AddStepVector moves the object + -- every frame, so the span is the whole move, not one cell scaled by dx. + local span = math.max(math.abs(dx), math.abs(dy), 1) + local adv = math.floor(self.progress * 16 * span / frames) + self.px = self.cellX * 16 + (dx / span) * adv + self.py = self.cellY * 16 + (dy / span) * adv if self.jumping then - -- engine/overworld/map_objects.asm:1815 - local idx = math.floor((self.progress - 1) / 2) + 1 + -- engine/overworld/map_objects.asm:1796 -- one table entry per cart frame, + -- tweened across our doubled step (#1713) + local t = (self.progress - 1) * (#JUMP_Y - 1) + / math.max(frames - 1, 1) + 1 + local idx = math.floor(t) if idx < 1 then idx = 1 end - if idx > #JUMP_Y then idx = #JUMP_Y end - self.spriteYOffset = JUMP_Y[idx] + if idx >= #JUMP_Y then + self.spriteYOffset = JUMP_Y[#JUMP_Y] + else + self.spriteYOffset = math.floor( + JUMP_Y[idx] + (JUMP_Y[idx + 1] - JUMP_Y[idx]) * (t - idx) + 0.5) + end end if self.progress >= frames then self.cellX, self.cellY = self.targetX, self.targetY @@ -195,12 +234,36 @@ function Player:update() return false end +-- FacingFishDown/Up/Left/Right: the standing frame's bottom tile row swapped +-- for the fishing sheet, plus the loose rod tile -- facings.asm:122-152 (#1708) +function Player:drawFishing(yOffset) + local sprite = self.sprite + local py = self.py + yOffset + local facing = self.facing + sprite:draw(self.px, py, 0, 0, facing, 0, false, true) + if not self.fishQuads then + self.fishQuads = { pose = {}, rod = {} } + for i = 0, 2 do + self.fishQuads.pose[i] = love.graphics.newQuad(0, i * 8, 16, 8, 16, 32) + end + for i = 0, 1 do + self.fishQuads.rod[i] = love.graphics.newQuad(i * 8, 24, 8, 8, 16, 32) + end + end + local sx, sy = sprite:getScreenOrigin(self.px, py, 0, 0) + sprite:drawTile(self.fishSheet, sx, + sy + math.max(0, sprite.frameHeight - 8), facing == "right", + self.fishQuads.pose[FISH_ROW[facing] or 0]) + local oam = ROD_OAM[facing] or ROD_OAM.down + sprite:drawTile(self.fishSheet, sx + oam.dx, sy + oam.dy, oam.flip, + self.fishQuads.rod[oam.tile]) +end + function Player:draw(ox, oy, scale) local G = love.graphics -- OBJECT_SPRITE_Y_OFFSET: added to the OBJ's y as it is written to OAM, so -- it moves the sprite without moving the player off the tile they are - -- standing on. StepFunction_GotBite's `xor 1` rod bob and the fly take-off - -- lift both ride this one byte. + -- standing on. StepFunction_GotBite's `xor 1` rod bob rides this one byte. local yOffset = self.spriteYOffset or 0 if self.jumping then -- engine/overworld/map_objects.asm:1995 @@ -217,9 +280,18 @@ function Player:draw(ox, oy, scale) G.scale(scale, scale) -- Chris is PAL_OW_RED; World:applyPalettes keeps the SpriteRenderer's -- OBJ palette current. - self.sprite:draw( - self.px, self.py + yOffset, 0, 0, - self.facing, self:walkPhase(), self.stepFlip) + if self.fishing and self.fishSheet then + self:drawFishing(yOffset) + else + local facing, phase = self.facing, self:walkPhase() + -- OBJECT_ACTION_SPIN (map_object_action.asm:96-152), for step_dig. + if self.spinFrames then + facing = SPIN_FACINGS[math.floor(self.spinTimer / 4) % 4 + 1] + phase = 0 + end + self.sprite:draw( + self.px, self.py + yOffset, 0, 0, facing, phase, self.stepFlip) + end G.pop() return end diff --git a/src/world/gen2/StepEvents.lua b/src/world/gen2/StepEvents.lua index 228b8213..7010ea29 100644 --- a/src/world/gen2/StepEvents.lua +++ b/src/world/gen2/StepEvents.lua @@ -23,7 +23,7 @@ -- -- Everything here is love-free and takes its state as arguments so the whole -- chain is testable without a world. -local Bike = require("src.world.gen2.Bike") +local FieldMoves = require("src.world.gen2.FieldMoves") local Breeding = require("src.core.gen2.Breeding") local Happiness = require("src.core.gen2.Happiness") local Phone = require("src.core.gen2.Phone") @@ -118,7 +118,7 @@ end local function bikeShopCallEnabled(save) local flags = save.engineFlags if type(flags) == "table" then - local set = flags[Bike.ENGINE_BIKE_SHOP_CALL_ENABLED] + local set = flags[FieldMoves.BIKE_SHOP_CALL_FLAG] if set ~= nil then return set == true end end return save.bikeShopCall == true @@ -137,7 +137,7 @@ function StepEvents.bikeStep(save, opts) Phone.queueSpecialCall(save, Phone.SPECIALCALL.SPECIALCALL_BIKESHOP) -- `res STATUSFLAGS2_BIKE_SHOP_CALL_F`: one call, ever. if type(save.engineFlags) == "table" then - save.engineFlags[Bike.ENGINE_BIKE_SHOP_CALL_ENABLED] = nil + save.engineFlags[FieldMoves.BIKE_SHOP_CALL_FLAG] = nil end save.bikeShopCall = false return true diff --git a/src/world/gen2/World.lua b/src/world/gen2/World.lua index df18d937..13a3f101 100644 --- a/src/world/gen2/World.lua +++ b/src/world/gen2/World.lua @@ -56,6 +56,7 @@ local Roamers = require("src.core.gen2.Roamers") local Runtime = require("src.mods.Runtime") local Screens = require("src.ui.Screens") local Sound = require("src.core.Sound") +local SpriteRenderer = require("src.render.SpriteRenderer") local StepEvents = require("src.world.gen2.StepEvents") local Tilt = require("src.render.Tilt") local Strings = require("src.core.Strings") @@ -85,6 +86,7 @@ local SFX = { EXIT_BUILDING = 35, JUMP_OVER_LEDGE = 0x16, BUMP = 0x24, + FLY = 0x18, } local EMOTE_SHOCK = 0 @@ -757,6 +759,15 @@ function World:load() self.tilesets = tilesets self.roofs = self:dataTable("gen2Roofs", "data/generated/roofs.lua") self.sprites = self:dataTable("gen2Sprites", "data/generated/sprites.lua") + -- A pre-#1748 cache stamps a SpriteMons row `frames = 1`, leaving + -- OBJECT_ACTION_BOUNCE one frame -- engine/overworld/map_object_action.asm:184 + for _, def in pairs(self.sprites or {}) do + if type(def) == "table" and (def.frames or 1) < 2 + and type(def.source) == "string" + and def.source:find("^ROM:SpriteMons") then + def.frames = 2 + end + end -- A cache from before the palette stage existed simply has no palettes.lua; -- everything below falls back to the grayscale path rather than failing. self.palettes = self:dataTable("gen2Palettes", "data/generated/palettes.lua") @@ -800,6 +811,14 @@ function World:load() local okImg, img = pcall(Assets.image, emotes.grassRustle) if okImg then self.grassRustleImage = img end end + -- LoadFishingGFX's two sheets + -- (../pokecrystal/engine/events/fishing_gfx.asm:7-12) + if emotes.fishing and pcall(Assets.image, emotes.fishing) then + self.fishingSheet = emotes.fishing + end + if emotes.fishingFemale and pcall(Assets.image, emotes.fishingFemale) then + self.fishingSheetFemale = emotes.fishingFemale + end end -- The heal machine's two OBJ tiles and their CGB palette, for the -- Pokecenter light show (World:startHealMachineAnim). A cache from before @@ -1427,6 +1446,9 @@ function World:busy() -- and the waterfall climb are all applymovement / pause commands inside a -- queued script, so nothing else may run under them. or self.fieldMove ~= nil + -- FlyFromAnim and FlyToAnim are blocking `callasm`s inside .FlyScript + -- (engine/events/overworld.asm:599, :605). + or self.flyAnim ~= nil end -- CheckMenuOW (engine/overworld/events.asm:802) is the tail of OWPlayerInput, @@ -1434,12 +1456,15 @@ end -- away while wScriptRunning is non-zero (events.asm:238-243). Two more gates -- sit above it even with no script up: PlayerMovement answering -- PLAYERMOVEMENT_CONTINUE, i.e. the player is mid-step (events.asm:474-477), --- and CheckStandingOnIce carrying (events.asm:479-480). START and SELECT are --- read NOWHERE else in the overworld, so a press that arrives while any of --- those hold is not queued or deferred, it is never read at all. +-- and CheckStandingOnIce carrying (events.asm:479-480). The frame a step is +-- QUEUED answers PLAYERMOVEMENT_FINISH instead (player_movement.asm:455-461), +-- which is zero, so the poll still runs there -- and on the Cycling Road's +-- forced roll that landing frame is the only one there is (#1718). function World:acceptsMenuInput() if self.battleActive or self:busy() then return false end - if self.player and self.player.moving then return false end + if self.player and self.player.moving and not self.stepFinished then + return false + end -- The same latch pair World:step's slide uses: a latched direction on an ice -- tile is CheckStandingOnIce's carry. if self.turningDirection and Permissions.isIce(self:playerCollision()) then @@ -1695,7 +1720,7 @@ function World:engineFlag(flag) -- how the two would come apart -- the officer's `setflag` and the results -- script's `clearflag` are the only writers, and both go through the pair -- below. - if flag == BugContest.ENGINE_BUG_CONTEST_TIMER and save then + if flag == FieldMoves.BUG_CONTEST_FLAG and save then return BugContest.isActive(save) end -- Badges live in save.player.badges, not in the flag table: on the cart the @@ -1736,7 +1761,7 @@ end function World:setEngineFlag(flag, value) if flag == nil then return end local save = self.game and self.game.save - if flag == BugContest.ENGINE_BUG_CONTEST_TIMER and save then + if flag == FieldMoves.BUG_CONTEST_FLAG and save then -- Route35NationalParkGate_OkayToProceed sets the flag BEFORE `special -- GiveParkBalls`, so starting here and starting again there is the cart's -- own order and the second start is what puts the balls on the counter. @@ -2042,7 +2067,7 @@ function World:breedmonSpriteDef(species) local def = { id = "SPRITE_DAY_CARE_MON", image = entry.image, - frames = 1, + frames = 2, walker = false, spriteType = "POKEMON_SPRITE", palette = "PAL_OW_RED", @@ -2311,6 +2336,9 @@ end -- rang the ordinary item jingle while the item argument was thrown away. An -- item the cache cannot name takes the `cp TM_HM / jr z` fall-through, SFX.ITEM. function World:specialSound(itemIndex) + -- The `waitsfx` above it (scripting.asm:445): SFX_READ_TEXT_2 ($08), which + -- the box rings on its own press, outranks SFX_GET_TM ($9b) here (#1483). + Sound.waitSfxDone() local id = itemIndex and self:itemIdByIndex(itemIndex) local items = self.game and self.game.data and self.game.data.items local def = id and items and items[id] @@ -3482,14 +3510,6 @@ function World:updateMapSetup() if ms.phase == "out" then ms.step = ms.step + 1 self.fade, self.fadeLevel = "white", ms.step / FADE_STEPS - -- FlyFromAnim carries the player up and off the map under the fade. The - -- bird's own frames are not in the cache, but the lift is: it is the same - -- OBJECT_SPRITE_Y_OFFSET sine the teleport step type walks - -- (src/script/gen2/Movement.lua), stepped over the fade's four levels. - if ms.lift and self.player then - self.player.spriteYOffset = Movement.teleportYOffset( - Movement.TELEPORT_RISE_HEIGHT + ms.step * FADE_STEPS) - end if ms.step >= FADE_STEPS then -- setMap clears self.fade (a map load repaints everything), so the sheet -- has to be re-armed at full strength on the far side for the fade in to @@ -3501,16 +3521,12 @@ function World:updateMapSetup() return end ms.step = ms.step - 1 - -- FlyToAnim, the same curve read backwards: the player comes down onto the - -- destination tile as the fade lets go of the screen. - if ms.lift and self.player then - self.player.spriteYOffset = Movement.teleportYOffset( - Movement.TELEPORT_RISE_HEIGHT + ms.step * FADE_STEPS) - end if ms.step <= 0 then self.fade, self.fadeLevel = nil, nil self.mapSetup = nil - if ms.lift and self.player then self.player.spriteYOffset = 0 end + -- `callasm FlyToAnim` is the command straight after `newloadmap + -- MAPSETUP_TELEPORT` (engine/events/overworld.asm:604-605). + if ms.flyIn then self:startFlyAnim("to", ms.flyIn) end return end self.fadeLevel = ms.step / FADE_STEPS @@ -3865,6 +3881,15 @@ function World:updateMovement() while st.i <= #st.bytes do local b = st.bytes[st.i] st.i = st.i + 1 + -- Movement_step_dig spins for the frames in the byte that follows + -- -- engine/overworld/movement.asm:113-131 (#1716) + if b == Movement.STEP_DIG then + local duration = st.bytes[st.i] or 0 + st.i = st.i + 1 + if ent.scriptSpin then ent:scriptSpin(duration) end + st.sleep = duration + return + end -- engine/overworld/movement.asm:163 if b == 0x57 then local duration = st.bytes[st.i] or 0 @@ -3890,6 +3915,11 @@ function World:updateMovement() elseif act.kind == "step" then local fromX, fromY = ent.cellX, ent.cellY if ent:scriptStep(act.dir) then + -- TurningStep's OBJECT_ACTION_SPIN, for the length of the step + -- (engine/overworld/movement.asm:693-699). + if act.spin and ent.scriptSpin then + ent:scriptSpin(ent.stepFrames or 16) + end self:followStep(ent, fromX, fromY) end return @@ -4797,15 +4827,35 @@ end -- src/world/gen2/Bike.lua owns every decision; this is the world state those -- decisions read and the presentation they end in. +-- ../pokecrystal/constants/engine_flags.asm:25 ENGINE_MOBILE_SYSTEM shifts every +-- later id up one: :36 ALWAYS_ON_BIKE against ../pokegold's :35. +function World:engineFlagId(name, goldId) + local order = self.constants and self.constants.engineFlagOrder + if type(order) ~= "table" then return goldId end + local ids = self.engineFlagIds + if not ids then + ids = {} + for index, entry in pairs(order) do + if type(index) == "number" and type(entry) == "string" then + ids[entry] = index - 1 + end + end + self.engineFlagIds = ids + end + return ids[name] or goldId +end + -- wBikeFlags' three bits are ENGINE_* ids like any other flag, so the map -- callbacks that set them (Route16AlwaysOnBikeCallback, -- Route17AlwaysOnBikeCallback) already land on save.engineFlags. function World:alwaysOnBike() - return self:engineFlag(Bike.ENGINE_ALWAYS_ON_BIKE) + return self:engineFlag(World.engineFlagId( + self, "ENGINE_ALWAYS_ON_BIKE", Bike.ENGINE_ALWAYS_ON_BIKE)) end function World:downhill() - return self:engineFlag(Bike.ENGINE_DOWNHILL) + return self:engineFlag(World.engineFlagId( + self, "ENGINE_DOWNHILL", Bike.ENGINE_DOWNHILL)) end -- GetPlayerTilePermission's operand: the collision under the player's feet. @@ -4963,6 +5013,11 @@ function World:beginFishing(outcome, wild) if self.player then self.player.fishing = true self.player.fishingState = self.fishing + -- LoadFishingGFX reads wPlayerGender + -- (../pokecrystal/engine/events/fishing_gfx.asm:8-12) + self.player.fishSheet = + (FieldMoves.isFemale(self:playerGender()) and self.fishingSheetFemale) + or self.fishingSheet end end @@ -5345,6 +5400,9 @@ function World:fieldContext(mon) -- digFromMenu reads this rather than re-deriving the banked warp. canEscapeRope = self:escapeRopeTarget() ~= nil, playerState = self.playerState, + -- SurfFunction.TrySurf and TrySurfOW both refuse while wBikeFlags' + -- ALWAYS_ON_BIKE is set (engine/events/overworld.asm:343-345, :498-500). + alwaysOnBike = self:alwaysOnBike(), strengthActive = self.strengthActive, -- FlashFunction tests wTimeOfDayPalset, not the map header, so a -- PALETTE_DARK map that FLASH has already lit refuses a second FLASH. @@ -5524,15 +5582,34 @@ function World:runCut(result) end -- Script_UsedWhirlpool, which is Script_Cut with DisappearWhirlpool and --- PlayWhirlpoolSound (a bare SFX.SURF) in place of the snip. +-- PlayWhirlpoolSound in place of the snip. function World:runWhirlpool(result) self:setNickname(result.mon) self:showText(Strings(result.text), function() self:replaceBlock(result.blockIndex, result.replacement) - self:playSfx(SFX.SURF) + self:playWhirlpoolSound() end) end +-- PlayWhirlpoolSound is WaitSFX, SFX_SURF, WaitSFX, never a bare PlaySFX +-- -- engine/events/field_moves.asm:5-10 (#1717) +function World:playWhirlpoolSound() + self.fieldMove = { phase = "whirlpoolsfx", waiting = true, left = 180 } +end + +-- PlayerMovementPointers' .force_turn arm and the Script_ForcedMovement it +-- calls -- events.asm:786-793, forced_movement.asm:1-51 (#1716) +local FORCED_BACK = { up = "down", down = "up", left = "right", right = "left" } + +function World:runForcedMovement() + local p = self.player + if not p or p.moving or self.moveState then return false end + local back = FORCED_BACK[p.facing] + if not back then return false end + self:beginMovement(0, Movement.forcedMovementBytes(back)) + return true +end + -- Script_UseFlash: the text plays SFX.FLASH from inside itself -- (UseFlashTextScript's text_asm), and BlindingFlash then sets -- STATUSFLAGS_FLASH_F and reloads the palettes. Setting the flag is all there @@ -5685,7 +5762,7 @@ function World:runFieldMove(result) elseif action == "waterfall" then self:runWaterfall(result) elseif action == "fly" then - self:openFlyMap() + self:openFlyMap(result.mon) elseif action == "headbutt" then self:runHeadbutt(result.facingX, result.facingY, result.mon) elseif action == "sweetscent" then @@ -5869,25 +5946,138 @@ function World:flyPoints() self.game and self.game.save, self.landmarks, self:region()) end --- .FlyScript: WarpToSpawnPoint, then `newloadmap MAPSETUP.TELEPORT` brings the --- map up with the player back in PLAYER_NORMAL. MapSetupScript_Teleport opens --- on FadeOutToWhite and falls through into _Warp, so flying is bracketed by the --- same pair of fades a door is, which is where the two fly animations ride: --- `lift` below hands them to World:updateMapSetup. -function World:flyTo(spawnId) +-- FlyFromAnim / FlyToAnim (engine/events/field_moves.asm:300, :334) and the two +-- curves they run (engine/sprite_anims/functions.asm:1350, :1418). +local FLY = { + FROM_FRAMES = 128, TO_FRAMES = 64, HOVER = 0x40, + AMP_MAX = 0x40, TO_AMP = 11 * 8, RISE = 84, +} + +-- FlyFunction_InitGFX's GetSpeciesIcon (engine/events/field_moves.asm:390): +-- the icon of the mon in wCurPartyMon, on PAL_OW_RED like every other OW OBJ. +function World:flyIconFor(mon) + if type(mon) ~= "table" then return nil end + local data = self.game and self.game.data + local icons = data and data.gen2Icons + local iconId = mon.isEgg and "ICON_EGG" + or (icons and icons.species and mon.species + and icons.species[mon.species]) + local entry = iconId and icons and icons.icons and icons.icons[iconId] + if not (entry and entry.image) then return nil end + local def = { + id = "SPRITE_FLY_MON", image = entry.image, frames = 2, walker = false, + spriteType = "POKEMON_SPRITE", palette = "PAL_OW_RED", paletteId = 0, + species = mon.species, icon = iconId, + } + local ok, icon = pcall(SpriteRenderer.new, def, "gen2fly") + if not (ok and icon) then return nil end + local daytime = self.daytime or Palettes.daytimeFor( + self.map and self.map.def, self:hour(), self.flashUsed) + local colors = Palettes.spritePalette(self.palettes, daytime, def) + if colors then + icon:setObjPalette(colors, ("gen2:%s:0"):format(tostring(daytime))) + end + return icon +end + +-- False when there is no icon sheet (or no love at all): the caller then flies +-- the way it always did rather than parking the world on an animation. +function World:startFlyAnim(phase, mon, onDone) + local icon = self:flyIconFor(mon) + local p = self.player + if not (icon and p) then return false end + local landing = phase == "to" + self.flyAnim = { + phase = phase, icon = icon, onDone = onDone, t = 0, + px = p.px, py = p.py, xoff = 0, wave = 0, + left = landing and FLY.TO_FRAMES or FLY.FROM_FRAMES, + hover = landing and 0 or FLY.HOVER, + amp = landing and FLY.TO_AMP or 0, + y = landing and -FLY.RISE or 0, + } + return true +end + +-- FlyFunction_FrameTimer (engine/events/field_moves.asm:409) over the two +-- AnimSeq_Fly* curves; the wobble is Sprites_Cosine's d * cos(n * pi / 32). +function World:stepFlyAnim() + local fa = self.flyAnim + if not fa then return end + local left = fa.left + if left <= 0 then + local done = fa.onDone + self.flyAnim = nil + if done then done() end + return + end + fa.left = left - 1 + if left >= 0x40 and left % 8 == 0 then + self:playSfxNamed("Sfx_Fly", SFX.FLY) + end + fa.t = fa.t + 1 + local amp = fa.amp + if fa.phase == "to" then + if fa.y >= 0 then return end + fa.y = fa.y + 2 + if amp > 0 then fa.amp = amp - 2 end + else + if fa.hover > 0 then + fa.hover = fa.hover - 1 + return + end + if fa.y <= -FLY.RISE then return end + fa.y = fa.y - 2 + if amp < FLY.AMP_MAX then fa.amp = amp + 8 end + end + fa.xoff = math.floor(amp * math.cos((fa.wave % 64) * math.pi / 32)) + fa.wave = fa.wave + 1 +end + +-- .Frameset_RedWalk is two 8-frame icon beats, the fourth mirrored +-- -- data/sprite_anims/framesets.asm:81-86 +function World:drawFlyAnim(s, billboard) + local fa = self.flyAnim + if not (fa and fa.icon) then return end + local G = love.graphics + local cam = self.camera + local px = fa.px + fa.xoff + local py = fa.py + fa.y + local ox = math.floor((0 - cam.x) * s) + local oy = math.floor((0 - cam.y) * s) + local beat = math.floor(fa.t / 8) % 4 + local function body() + G.setColor(1, 1, 1, 1) + G.push() + G.translate(ox, oy) + G.scale(s, s) + fa.icon:draw(px, py, 0, 0, "down", 0, false, false, beat == 3, beat % 2) + G.pop() + end + if billboard then + billboard(ox + (px + 8) * s, oy + (py + 16) * s, body) + else + body() + end +end + +-- .FlyScript: FlyFromAnim, WarpToSpawnPoint, `newloadmap MAPSETUP_TELEPORT`, +-- then FlyToAnim -- engine/events/overworld.asm:595-609 +function World:flyTo(spawnId, mon) local spawn = self.landmarks and self.landmarks.spawns and self.landmarks.spawns[spawnId] if not (spawn and spawn.map and self.maps and self.maps[spawn.map]) then return false end - self:applyPlayerState(FieldMoves.PLAYER_NORMAL) - local ok = self:runMapSetup(MAPSETUP.TELEPORT, function() - return self:setMap(spawn.map, spawn.x, spawn.y, "down") - end) - -- FlyFromAnim / FlyToAnim ride the setup script's own two fades: the take-off - -- lift under the fade out, the landing under the fade in. - if self.mapSetup then self.mapSetup.lift = true end - return ok + local function warp() + self:applyPlayerState(FieldMoves.PLAYER_NORMAL) + local ok = self:runMapSetup(MAPSETUP.TELEPORT, function() + return self:setMap(spawn.map, spawn.x, spawn.y, "down") + end) + if self.mapSetup then self.mapSetup.flyIn = mon end + return ok + end + if self:startFlyAnim("from", mon, warp) then return true end + return warp() end -- _FlyMap: the town map with the cursor locked to visited flypoints, A takes @@ -5898,7 +6088,7 @@ end -- "Where?" plate over it instead of the card strip. A run with no love at all -- (a headless probe) has no screen to push, so the destinations are offered -- one at a time through the same yesorno box every other field move uses. -function World:openFlyMap() +function World:openFlyMap(mon) local points = self:flyPoints() if #points == 0 then return false end -- Loaded on demand and through pcall: a headless run has no love, and this @@ -5909,28 +6099,31 @@ function World:openFlyMap() save = self.game.save, currentLandmark = self:currentLandmarkId(), fly = points, + -- TownMapMon draws wCurPartyMon's icon as the cursor + -- (../pokecrystal/engine/pokegear/pokegear.asm:2708-2721). + flyMon = mon, onFly = function(spawnId) self.game.stack:pop() - self:flyTo(spawnId) + self:flyTo(spawnId, mon) end, onClose = function() self.game.stack:pop() end, }) return true end - self:askFlyPoint(points, 1) + self:askFlyPoint(points, 1, mon) return true end -function World:askFlyPoint(points, index) +function World:askFlyPoint(points, index, mon) local row = points[index] if not row then return end local name = (row.name or row.landmark):gsub("\n", " ") self:showText(Strings(FieldMoves.TEXT.ASK_FLY_TO, name), function() self:askYesNo(function(yes) if yes then - self:flyTo(row.spawn) + self:flyTo(row.spawn, mon) else - self:askFlyPoint(points, index + 1) + self:askFlyPoint(points, index + 1, mon) end end) end) @@ -5958,6 +6151,18 @@ function World:updateFieldMove() st.timer = st.timer - 1 return end + if st.phase == "whirlpoolsfx" then + st.left = (st.left or 0) - 1 + if st.waiting then + if Sound.sfxBusy() and st.left > 0 then return end + st.waiting = nil + self:playSfxNamed("Sfx_Surf", SFX.SURF) + return + end + if Sound.sfxBusy() and st.left > 0 then return end + self.fieldMove = nil + return + end if st.phase == "strength" then self.fieldMove = nil if st.text then self:showText(Strings(st.text)) end @@ -6056,6 +6261,9 @@ function World:startBattle(opts, onDone) -- wInBattleTowerBattle (../pokecrystal/engine/events/battle_tower/ -- battle_tower.asm:220-223), which turns DoBadgeTypeBoosts off. battleTower = opts.battleTower, + -- wTimeOfDay, for BattleCommand_TimeBasedHealContinue + -- (engine/battle/effect_commands.asm:6401-6404). + timeOfDay = self:timeOfDayId(), }) self:playBattleMusic(opts) local function pushBattle() @@ -8639,8 +8847,10 @@ function World:setMap(mapId, cx, cy, facing, opts) -- MAPCALLBACK_NEWMAP runs, because the Cycling Road's callback is what sets -- them straight back again: leaving them set is how one visit to Route 17 -- would keep the player glued to the bike for the rest of the game. - self:setEngineFlag(Bike.ENGINE_ALWAYS_ON_BIKE, false) - self:setEngineFlag(Bike.ENGINE_DOWNHILL, false) + self:setEngineFlag(World.engineFlagId( + self, "ENGINE_ALWAYS_ON_BIKE", Bike.ENGINE_ALWAYS_ON_BIKE), false) + self:setEngineFlag(World.engineFlagId( + self, "ENGINE_DOWNHILL", Bike.ENGINE_DOWNHILL), false) -- "Respawn in Pokemon Centers" (home/map.asm, LoadMapAttributes' .SetSpawn): -- walking from an OUTDOOR map into an INDOOR one whose tileset is -- TILESET_POKECENTER rewrites wLastSpawnMapGroup / wLastSpawnMapNumber, and @@ -9741,6 +9951,7 @@ end function World:stepBody() if not self.map or not self.player then return end + self.stepFinished = false self:pollTimeOfDay() -- ShakeScreen and the `musicfadeout` tail both run UNDER a script (the VM is -- parked on the earthquake's own waitFrames while the screen is still @@ -9821,6 +10032,7 @@ function World:stepBody() -- it ticks here above the input gate the same way the emote does; its -- last flash's onDone is what resumes the nurse. if self.healAnim then self:stepHealAnim() end + if self.flyAnim then self:stepFlyAnim() end -- HandleCmdQueue sits in the overworld loop, once a frame, above the input -- gate: it is what drops a boulder that is already sitting on a hole, and it @@ -9841,8 +10053,9 @@ function World:stepBody() -- Freeze player input while a script / textbox / cutscene move is up. if self:busy() then - -- Keep scripted entities animating mid-step. - if self.player and self.player.moving then + -- Keep scripted entities animating mid-step. A step_dig spin has the + -- player standing still, so it has to tick here too. + if self.player and (self.player.moving or self.player.spinFrames) then self:playerStepGrass() if self.player:update() then self.player.inGrass = @@ -9856,6 +10069,7 @@ function World:stepBody() local p = self.player self:playerStepGrass() local landed = p:update() + self.stepFinished = landed -- CopyCoordsTileToLastCoordsTile -> SetTallGrassFlags, which is what a step -- ENDS on (engine/overworld/map_objects.asm:196-208, :247). if landed then p.inGrass = self:grassAt(p.cellX, p.cellY) end @@ -9917,6 +10131,11 @@ function World:stepBody() local dir = self.heldDir if not p.moving then local coll = self:playerCollision() + -- .CheckTile tests CheckWhirlpoolTile above the nybble ladder + -- -- engine/overworld/player_movement.asm:117-123 (#1716) + if Permissions.isWhirlpool(coll) and self:runForcedMovement() then + return + end local current = Permissions.currentDirection(coll) or Permissions.doorForcedDirection(coll) if current then @@ -10030,18 +10249,21 @@ function World:drawPeople(s, billboard) local G = love.graphics local p = self.player local cam = self.camera - local drawList = { - { kind = "player", py = p.py, ox = 0, oy = 0 }, - } - for _, npc in ipairs(self.npcs) do - drawList[#drawList + 1] = { - kind = "npc", npc = npc, ox = 0, oy = 0, py = npc.py, - } - end - for _, g in ipairs(self.ghosts) do - drawList[#drawList + 1] = { - kind = "npc", npc = g.npc, ox = g.ox, oy = g.oy, py = g.oy + g.npc.py, - } + -- .FlyScript hides the map's objects from HideSprites until its + -- LoadWalkingSpritesGFX tail -- engine/events/overworld.asm:597, :608 + local drawList = {} + if not self.flyAnim then + drawList[1] = { kind = "player", py = p.py, ox = 0, oy = 0 } + for _, npc in ipairs(self.npcs) do + drawList[#drawList + 1] = { + kind = "npc", npc = npc, ox = 0, oy = 0, py = npc.py, + } + end + for _, g in ipairs(self.ghosts) do + drawList[#drawList + 1] = { + kind = "npc", npc = g.npc, ox = g.ox, oy = g.oy, py = g.oy + g.npc.py, + } + end end table.sort(drawList, function(a, b) return a.py < b.py end) @@ -10076,6 +10298,7 @@ function World:drawPeople(s, billboard) self:drawEmote(s, billboard) self:drawHealAnim(s, billboard) + self:drawFlyAnim(s, billboard) end -- Split out of drawPeople so World:drawPipeline composites the one copy the @@ -10143,11 +10366,12 @@ function World:drawPipeline(id, w, h, s) -- the art: nil, like Gen 1 returns in its true-colour modes. paletteFor = function() return nil end, spriteColors = function() return nil end, - -- Gold's only standing effects; it has no dust/cutTree/bird/rod overlay, - -- and Gen 1's `at` skips a nil body, so those keys are simply absent. + -- Gold's only standing effects; it has no dust/cutTree/rod overlay, and + -- Gen 1's `at` skips a nil body, so those keys are simply absent. fx = { emote = function() self:drawEmote(1, nil) end, heal = function() self:drawHealAnim(1, nil) end, + bird = function() self:drawFlyAnim(1, nil) end, }, } -- `project(wx, wy)` -> canvas pixels, nil behind the camera. s = 1 lays the @@ -10165,6 +10389,7 @@ function World:drawPipeline(id, w, h, s) end self:drawEmote(1, at) self:drawHealAnim(1, at) + self:drawFlyAnim(1, at) end local override = Pipelines.drawWorld(id, ctx) -- world post-processes fold in here, so they never touch the text box on top diff --git a/tests/drivers/bag_cancel_row_bug1685_test.lua b/tests/drivers/bag_cancel_row_bug1685_test.lua new file mode 100644 index 00000000..cc5c7e05 --- /dev/null +++ b/tests/drivers/bag_cancel_row_bug1685_test.lua @@ -0,0 +1,174 @@ +-- Eye check on the CANCEL row at the foot of the item list (#1685). +-- PrintListMenuEntries prints ListMenuCancelText on the $ff terminator and +-- returns there (pokered home/list_menu.asm:371-372, 523-528), so the '▼' +-- at :518-522 never shares a page with CANCEL; DisplayListMenuIDLoop treats +-- that row as ExitListMenu (:105-110). No POKEPORT_SPEED: the arrow and +-- the cursor step are being judged frame by frame. +-- POKEPORT_DRIVER=tests/drivers/bag_cancel_row_bug1685_test.lua POKEPORT_IDENTITY=bug1685 POKEPORT_TOUCH=0 POKEPORT_VERSION=red love . +return function(game) + local U = dofile("tests/drivers/util.lua") + local Pokemon = require("src.pokemon.Pokemon") + local ListMenu = require("src.ui.ListMenu") + local Menu = require("src.ui.Menu") + local Screens = require("src.ui.Screens") + local Strings = require("src.core.Strings") + + local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots" + local ok = true + local function check(label, pass) + U.log(pass and "PASS" or "FAIL", label) + if not pass then ok = false end + return pass + end + + -- pokered data/maps/objects/PalletTown.asm: the house doors sit at (5,5) + -- and (13,5) and the lab's at (12,11), so (10,8) is open ground. + local TOWN, TOWN_X, TOWN_Y = "PALLET_TOWN", 10, 8 + -- six items: page one fills all four printed rows (so the '▼' is there to + -- lose), and CANCEL lands on the page after it + local STOCK = { "POTION", "ANTIDOTE", "BURN_HEAL", "ICE_HEAL", + "AWAKENING", "PARLYZ_HEAL" } + + for _, id in ipairs(STOCK) do + check(id .. " exists as an item", game.data.items[id] ~= nil) + end + check("CANCEL has a string", Strings("CANCEL") ~= nil and Strings("CANCEL") ~= "") + check("renderer is up", game.renderer ~= nil) + + game.save.player.name = "SEBAS" + game.save.party = { Pokemon.new(game.data, "CHARIZARD", 50) } + game.save.inventory = {} + game.save.bagOrder = nil + local Bag = require("src.inventory.Bag") + for i, id in ipairs(STOCK) do Bag.add(game.save, id, i) end + + local function stationary() + for _ = 1, 60 do + if not (game.overworld and game.overworld.player.moving) then break end + coroutine.yield() + end + end + + local function openBag(where) + stationary() + U.tap(game, "start") + U.wait(20) + local menu = game.stack:top() + if getmetatable(menu) == Menu then + local ITEM = Strings("ITEM") + for _ = 1, 20 do + if menu.items[menu.index].label == ITEM then break end + U.tap(game, "down") + U.wait(6) + end + U.tap(game, "a") + U.wait(20) + end + local bag = game.stack:top() + if getmetatable(bag) ~= ListMenu then + U.log("START -> ITEM did not reach the bag " .. where + .. ", pushing BagMenu directly") + bag = Screens.push(game, "BagMenu") + U.wait(20) + end + return getmetatable(bag) == ListMenu and bag or nil + end + + local function toTop(bag) + for _ = 1, #bag.items + 2 do + if bag.index == 1 then break end + U.tap(game, "up") + U.wait(6) + end + end + + U.teleport(game, TOWN, TOWN_X, TOWN_Y, "down") + U.wait(20) + + local bag = openBag("in Pallet Town") + if check("the bag opened", bag ~= nil) then + check("six items are in it", #bag.items == #STOCK + 1) + local last = bag.items[#bag.items] + check("the row after the last item is the terminator's CANCEL", + last ~= nil and last.cancel == true) + check("and it carries no item id", last ~= nil and last.value == nil) + check("labelled CANCEL", last ~= nil and last.label == Strings("CANCEL")) + + toTop(bag) + check("page one shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1685_page_one.png")) + + -- walk down until the cursor stops moving: it must stop ON the CANCEL + -- row, not one row short of it + local before + for _ = 1, #bag.items + 4 do + before = bag.index + U.tap(game, "down") + U.wait(6) + if bag.index == before then break end + end + check("the cursor walked all the way onto the CANCEL row", + bag.items[bag.index] ~= nil and bag.items[bag.index].cancel == true) + check("and stops there", bag.index == #bag.items) + check("with the list scrolled to its last page", + bag.scroll == #bag.items - (bag.cursorRows or bag.rows)) + check("cancel row shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1685_cancel_row.png")) + + -- A on CANCEL is ExitListMenu: the same exit B takes + U.tap(game, "a") + U.wait(25) + local stillUp = false + for _, s in ipairs(game.stack.states) do + if s == bag then stillUp = true end + end + check("A on CANCEL closed the item list", not stillUp) + check("and left no box or submenu over it", + getmetatable(game.stack:top()) ~= ListMenu) + check("after-cancel shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1685_after_cancel.png")) + end + + for _ = 1, 10 do + if game.stack:top() == game.overworld then break end + U.tap(game, "b") + U.wait(12) + end + + -- an empty bag is a box with CANCEL alone, which is what the cart shows; + -- the port used to print an invented "Nothing here." instead + game.save.inventory = {} + game.save.bagOrder = nil + local empty = openBag("with an empty bag") + if check("the empty bag still opens a box", empty ~= nil) then + check("holding exactly one row", #empty.items == 1) + check("and that row is CANCEL", + empty.items[1] ~= nil and empty.items[1].cancel == true) + check("empty bag shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1685_empty_bag.png")) + end + + U.log("") + if ok then + U.log("the bag has been opened, walked to the bottom and cancelled for you.") + U.log("in bug1685_page_one.png the four item names fill the box and the") + U.log("down arrow sits in the lower right corner. in bug1685_cancel_row.png") + U.log("CANCEL is one row below the last item, at the same left edge as the") + U.log("names, with the cursor on it -- and that corner arrow must be GONE.") + U.log("an arrow still painted next to CANCEL is the near miss here: it is") + U.log("easy to miss in a still and it is the exact thing the terminator's") + U.log("tail jump settles.") + U.log("bug1685_empty_bag.png is an empty bag: a box with CANCEL and nothing") + U.log("else. that replaces the port's old \"Nothing here.\" line, which the") + U.log("cart never printed, so it is a deliberate change, not a regression.") + U.log("the empty bag is on screen now; A or B should both close it.") + U.log("yellow shares this list code: rerun with POKEPORT_VERSION=yellow and") + U.log("a yellow identity and the three shots should look the same.") + else + U.log("a check above failed, so nothing on screen is worth reading yet.") + end + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/bike_dismount_bug513_test.lua b/tests/drivers/bike_dismount_bug513_test.lua index e9994a11..259d986f 100644 --- a/tests/drivers/bike_dismount_bug513_test.lua +++ b/tests/drivers/bike_dismount_bug513_test.lua @@ -160,9 +160,8 @@ return function(game) if check("the bag opened", isBag) then if stepTo(bag, function(b) return b.items[b.index].value == "BICYCLE" end, "BICYCLE") then - U.tap(game, "a") -- USE / TOSS submenu - U.wait(20) - U.tap(game, "a") -- USE is the first row + -- the BICYCLE skips USE/TOSS (start_sub_menus.asm:340-342) + U.tap(game, "a") U.wait(30) end end diff --git a/tests/drivers/bike_option_box_bug1705_test.lua b/tests/drivers/bike_option_box_bug1705_test.lua new file mode 100644 index 00000000..194db22d --- /dev/null +++ b/tests/drivers/bike_option_box_bug1705_test.lua @@ -0,0 +1,342 @@ +-- Eye check that the BICYCLE never shows the USE/TOSS box (#1705). +-- StartMenu_Item .choseItem does `cp BICYCLE / jp z, .useOrTossItem` before +-- it loads USE_TOSS_MENU_TEMPLATE (engine/menus/start_sub_menus.asm:340-342), +-- so mount, dismount and the Cycling Road refusal all land on one A press. +-- No POKEPORT_SPEED: it scales only the logic clock, and the frame the box +-- would flash on is the whole point of this run. +-- POKEPORT_DRIVER=tests/drivers/bike_option_box_bug1705_test.lua POKEPORT_IDENTITY=bug1705 POKEPORT_TOUCH=0 POKEPORT_VERSION=red love . +return function(game) + local U = dofile("tests/drivers/util.lua") + local Pokemon = require("src.pokemon.Pokemon") + local TextBox = require("src.render.TextBox") + local ListMenu = require("src.ui.ListMenu") + local Menu = require("src.ui.Menu") + local Screens = require("src.ui.Screens") + local Strings = require("src.core.Strings") + + local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots" + local ok = true + local function check(label, pass) + U.log(pass and "PASS" or "FAIL", label) + if not pass then ok = false end + return pass + end + + -- pokered data/maps/objects/PalletTown.asm: the house doors sit at (5,5) + -- and (13,5) and the lab's at (12,11), so (10,8) is open ground. OVERWORLD + -- tileset, so IsBikeRidingAllowed says yes here (home/overworld.asm). + local TOWN, TOWN_X, TOWN_Y = "PALLET_TOWN", 10, 8 + -- pokered data/maps/force_bike_surf.asm: ROUTE_16 (17,11) is a landing cell + -- out of the Route 16 gate's south door and arms BIT_ALWAYS_ON_BIKE. + local FORCE_MAP, FORCE_X, FORCE_Y = "ROUTE_16", 17, 11 + -- pokered data/maps/objects/Route16Gate1F.asm: warps on x 0 and 7, the + -- guard on (4,5), so (3,6) is plain floor -- and the gate script is what + -- clears the flag again (scripts/Route16Gate1F.asm `res BIT_ALWAYS_ON_BIKE`) + local GATE_MAP, GATE_X, GATE_Y = "ROUTE_16_GATE_1F", 3, 6 + + -- a missing item def, an unextracted refusal line and a bag that never + -- opens all look like the bug from the couch + check("BICYCLE exists as an item", game.data.items.BICYCLE ~= nil) + local cannot = game.data.text._CannotGetOffHereText + check("_CannotGetOffHereText was extracted", + type(cannot) == "string" and cannot:find("get off", 1, true) ~= nil) + check("POTION exists as the control item", game.data.items.POTION ~= nil) + check("renderer is up", game.renderer ~= nil) + + game.save.player.name = "SEBAS" + game.save.party = { Pokemon.new(game.data, "CHARIZARD", 50) } + game.save.inventory = game.save.inventory or {} + game.save.inventory.BICYCLE = 1 + game.save.inventory.POTION = 3 + game.save.onBike = false + game.save.forcedBike = nil + + local function stationary() + for _ = 1, 90 do + game.input.state.b = true + if not (game.overworld and game.overworld.player.moving) then break end + coroutine.yield() + end + game.input.state.b = false + end + + -- START -> ITEM -> the bag, by real presses. Route 16/17 roll the player + -- south whenever nothing is held, so brake into a standstill first or + -- handleInput eats the START. + local function openBag(where) + stationary() + U.tap(game, "start") + U.wait(20) + local menu = game.stack:top() + if getmetatable(menu) == Menu then + local ITEM = Strings("ITEM") + for _ = 1, 20 do + if menu.items[menu.index].label == ITEM then break end + U.tap(game, "down") + U.wait(6) + end + U.tap(game, "a") + U.wait(20) + end + local bag = game.stack:top() + if getmetatable(bag) ~= ListMenu then + -- a start menu that reordered itself would otherwise strand the run; + -- say so, then get to the moment anyway + U.log("START -> ITEM did not reach the bag on " .. where + .. ", pushing BagMenu directly") + bag = Screens.push(game, "BagMenu") + U.wait(20) + end + return getmetatable(bag) == ListMenu and bag or nil + end + + -- the cursor comes back on the last-used row (#1732), so walk to the top + -- before walking down or a row above the saved one is unreachable + local function cursorTo(bag, id) + for _ = 1, #bag.items do + if bag.index == 1 then break end + U.tap(game, "up") + U.wait(5) + end + for _ = 1, #bag.items do + local row = bag.items[bag.index] + if row and row.value == id then return true end + U.tap(game, "down") + U.wait(5) + end + return bag.items[bag.index] and bag.items[bag.index].value == id + end + + -- StartMenu_Item keeps the START menu up behind the bag, and that is a + -- Menu too, so only a Menu that was NOT already there counts as the + -- option box + local function menuSnapshot() + local seen = {} + for _, s in ipairs(game.stack.states) do seen[s] = true end + return seen + end + + local function newMenu(before) + for _, s in ipairs(game.stack.states) do + if getmetatable(s) == Menu and not before[s] then return true end + end + return false + end + + -- press A and watch every frame after it: a USE/TOSS box that appears and + -- is replaced two frames later is invisible in a still, and is the near + -- miss this whole run exists to catch + local function chooseAndWatch(frames) + local before = menuSnapshot() + U.tap(game, "a") + local flashed = newMenu(before) + for _ = 1, frames or 30 do + if newMenu(before) then flashed = true end + coroutine.yield() + end + return flashed, before + end + + local function boxSays() + local top = game.stack:top() + if getmetatable(top) ~= TextBox then return nil end + local lines = {} + for _, page in ipairs(top.pages or {}) do + for _, line in ipairs(page) do lines[#lines + 1] = line end + end + return table.concat(lines, " / ") + end + + local function dismissBox() + for _ = 1, 8 do + if getmetatable(game.stack:top()) ~= TextBox then break end + U.tap(game, "b") + U.wait(12) + end + end + + local function backToOverworld() + for _ = 1, 10 do + if game.stack:top() == game.overworld then break end + U.tap(game, "b") + U.wait(12) + end + end + + -- the control: an ordinary item DOES open the box, so a run where nothing + -- ever appears cannot be mistaken for the fix working + U.teleport(game, TOWN, TOWN_X, TOWN_Y, "down") + U.wait(20) + local bag = openBag("Pallet Town") + if check("the bag opened in " .. TOWN, bag ~= nil) then + if check("found the POTION row", cursorTo(bag, "POTION")) then + U.tap(game, "a") + U.wait(20) + check("a POTION still opens USE/TOSS", getmetatable(game.stack:top()) == Menu) + check("control shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1705_potion_usetoss.png")) + U.tap(game, "b") + U.wait(15) + end + end + + -- mount: one press, straight to the text + if bag and check("found the BICYCLE row", cursorTo(bag, "BICYCLE")) then + local flashed, before = chooseAndWatch(4) + check("no option box in the first frames after A (mount)", not flashed) + check("early shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1705_mount_first_frames.png")) + U.wait(60) + check("still no option box while the text types", not newMenu(before)) + local said = boxSays() + U.log("the box reads:", tostring(said)) + check("the single press mounted the bike", game.save.onBike == true) + check("and the line is the mount text", + said ~= nil and said:find("got on", 1, true) ~= nil) + check("mount shot reached disk", U.shot(game, SHOT_DIR .. "/bug1705_mount.png")) + end + dismissBox() + backToOverworld() + + -- dismount: the same one press + bag = openBag("Pallet Town (riding)") + if bag and check("found the BICYCLE row again", cursorTo(bag, "BICYCLE")) then + local flashed = chooseAndWatch(4) + check("no option box in the first frames after A (dismount)", not flashed) + U.wait(60) + local said = boxSays() + U.log("the box reads:", tostring(said)) + check("the single press dismounted", game.save.onBike == false) + check("and the line is the dismount text", + said ~= nil and said:find("got off", 1, true) ~= nil) + check("dismount shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1705_dismount.png")) + end + dismissBox() + backToOverworld() + + -- the Cycling Road refusal, armed the way the game arms it: by arriving on + -- the forced-bike cell (setMap runs checkForcedMovement on entry) + game.save.onBike = false + U.teleport(game, FORCE_MAP, FORCE_X, FORCE_Y, "down") + U.wait(25) + check("stepping onto the Route 16 cell mounts the bike", game.save.onBike == true) + check("and arms the forced-bike flag", game.save.forcedBike == true) + bag = openBag("Route 16") + if bag and check("found the BICYCLE row on the road", cursorTo(bag, "BICYCLE")) then + local flashed = chooseAndWatch(4) + check("no option box in the first frames after A (refusal)", not flashed) + U.wait(60) + local said = boxSays() + U.log("the box reads:", tostring(said)) + check("the refusal printed, not the dismount", + said ~= nil and said:find("get off", 1, true) ~= nil) + check("the player is still riding", game.save.onBike == true) + local stillUp = false + for _, s in ipairs(game.stack.states) do + if s == bag then stillUp = true end + end + check("and the bag list is still on the stack under the box (#513)", stillUp) + check("refusal shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1705_forced_refusal.png")) + end + dismissBox() + backToOverworld() + + -- walking into the gate releases the flag; the gate's tileset is not one of + -- IsBikeRidingAllowed's (home/overworld.asm), so the map change dismounts on + -- the way in and the release has to be shown back out on the road + U.teleport(game, GATE_MAP, GATE_X, GATE_Y, "up") + U.wait(25) + check("the gate clears the forced-bike flag", + game.save.forcedBike == nil or game.save.forcedBike == false) + + -- a plain Route 16 cell: walkable, nobody on it, and NOT one of the two + -- forced-bike tiles, so nothing re-arms the flag when we land + local function plainRoadCell() + local ow = game.overworld + local fm = game.data.field.forcedMovement + local forced = {} + for _, t in ipairs((fm and fm.tiles and fm.tiles[FORCE_MAP]) or {}) do + forced[t.x .. "," .. t.y] = true + end + if not ow then return nil end + for y = 0, 35 do + for x = 0, 19 do + if not forced[x .. "," .. y] and ow.map:inBounds(x, y) + and ow.map:isWalkableCell(x, y) and not ow:npcAtCell(x, y) then + return x, y + end + end + end + return nil + end + + U.teleport(game, FORCE_MAP, FORCE_X, FORCE_Y - 3, "up") + U.wait(20) + local px, py = plainRoadCell() + if px then + U.teleport(game, FORCE_MAP, px, py, "up") + U.wait(20) + end + check("back on Route 16, off the forced tiles, flag still clear", + game.save.forcedBike == nil or game.save.forcedBike == false) + + -- with the flag released the bike answers again: mount, then get off, one + -- press each, and the get-off is the very thing the road refused + if not game.save.onBike then + bag = openBag("Route 16 (released)") + if bag and check("found the BICYCLE row to remount", cursorTo(bag, "BICYCLE")) then + local flashed = chooseAndWatch(4) + check("no option box on the remount", not flashed) + U.wait(60) + U.log("the box reads:", tostring(boxSays())) + check("the remount worked", game.save.onBike == true) + end + dismissBox() + backToOverworld() + end + + bag = openBag("Route 16 (getting off)") + if bag and check("found the BICYCLE row again on the road", + cursorTo(bag, "BICYCLE")) then + local flashed = chooseAndWatch(4) + check("no option box on the released dismount", not flashed) + U.wait(60) + local said = boxSays() + U.log("the box reads:", tostring(said)) + check("the flag really is released: this one gets off", + game.save.onBike == false) + check("and the line is the dismount text, not the refusal", + said ~= nil and said:find("got off", 1, true) ~= nil) + check("released dismount shot reached disk", + U.shot(game, SHOT_DIR .. "/bug1705_released_dismount.png")) + end + + check("the BICYCLE was never consumed", (game.save.inventory.BICYCLE or 0) == 1) + + U.log("") + if ok then + U.log("the bike has been used five times for you: mounted and dismounted in") + U.log("PALLET TOWN, refused on the Route 16 forced stretch, then mounted and") + U.log("taken off again after the gate released the flag. every one of those") + U.log("was a single A press on the BICYCLE row, with no USE/TOSS box.") + U.log("shots are in " .. SHOT_DIR .. ": bug1705_potion_usetoss.png is the") + U.log("control, the box a POTION still gets. bug1705_mount_first_frames.png") + U.log("is two frames after the A press on the bike -- that one must show") + U.log("the mount text or a bare map, never a small box in the lower right.") + U.log("the near miss is a box that appears and is replaced before the text") + U.log("types, which reads as a pass in every later shot.") + U.log("you are on Route 16 with the bag closed; open it and try the bike as") + U.log("often as you like. it also has no TOSS any more, since the box that") + U.log("carried it is the one that no longer opens.") + U.log("yellow shares this code path: rerun with POKEPORT_VERSION=yellow") + U.log("and a yellow identity, and every beat should read the same.") + else + U.log("a check above failed, so nothing on screen is worth reading yet.") + end + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/crystal_shaderfx_shots.lua b/tests/drivers/crystal_shaderfx_shots.lua new file mode 100644 index 00000000..bec16cc1 --- /dev/null +++ b/tests/drivers/crystal_shaderfx_shots.lua @@ -0,0 +1,94 @@ +-- SHADER FX preset examples on Crystal, including a stacked pair. +-- +-- POKEPORT_IDENTITY=crystal-dev POKEPORT_GAME=crystal POKEPORT_TOUCH=0 \ +-- POKEPORT_SHOT_DIR=/tmp/shaderfx \ +-- POKEPORT_DRIVER=tests/drivers/crystal_shaderfx_shots.lua love . +-- +-- Never run this under POKEPORT_SPEED: the shots are of a live frame. +local U = require("tests.drivers.util") +local ShaderFX = require("src.render.ShaderFX") + +local WANT = { + { file = "gameboy-color-dot-matrix.slangp", tag = "gbc-dot-matrix" }, + { file = "sameboy-lcd.slangp", tag = "sameboy-lcd" }, + { file = "crt-caligari.slangp", tag = "crt-caligari" }, +} + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/shaderfx" + + U.wait(30) + U.log(("bridge canConvert=%s"):format(tostring(ShaderFX.canConvert()))) + if not ShaderFX.canConvert() then + U.log("FAIL no librashader bridge, nothing can be converted") + return + end + + local list = ShaderFX.list() + U.log(("found %d presets"):format(#list)) + if #list == 0 then U.log("FAIL no presets on disk") return end + + local byName = {} + for _, e in ipairs(list) do byName[e.name] = e end + + local ready = {} + for _, want in ipairs(WANT) do + local entry = byName[want.file] + if not entry then + U.log(("SKIP %s not in the preset set"):format(want.file)) + else + local ok, err = true, nil + if not entry.converted then ok, err = ShaderFX.convert(entry) end + if ok then + ready[#ready + 1] = { entry = entry, tag = want.tag } + U.log(("PASS converted %s"):format(want.file)) + else + U.log(("FAIL convert %s: %s"):format(want.file, tostring(err))) + end + end + end + if #ready == 0 then U.log("FAIL nothing converted") return end + + U.wait(60) + local world = game.world + if world and world.setMap then + world:setMap("CHERRYGROVE_CITY", 21, 6, "down") + U.wait(20) + else + U.log("note: no gen2 world yet, shooting whatever is on screen") + end + + ShaderFX.deactivate("main") + ShaderFX.deactivate("secondary") + U.wait(20) + U.shot(game, out .. "/00-none.png") + U.log("shot: no shader") + + for i, r in ipairs(ready) do + ShaderFX.deactivate("secondary") + local ok, err = ShaderFX.activate("main", r.entry) + U.wait(30) + if ok then + U.shot(game, ("%s/%02d-%s.png"):format(out, i, r.tag)) + U.log(("shot: %s"):format(r.tag)) + else + U.log(("FAIL activate %s: %s"):format(r.tag, tostring(err))) + end + end + + if #ready >= 2 then + local a, b = ready[1], ready[2] + local okA = ShaderFX.activate("main", a.entry) + local okB = ShaderFX.activate("secondary", b.entry) + U.wait(30) + if okA and okB then + U.shot(game, ("%s/%02d-stacked-%s-over-%s.png"):format(out, #ready + 1, a.tag, b.tag)) + U.log(("shot: stacked %s + %s"):format(a.tag, b.tag)) + else + U.log("FAIL could not stack two slots") + end + end + + U.log("done. the pad is yours; SHADER FX rows are in OPTIONS.") + while true do coroutine.yield() end +end diff --git a/tests/drivers/crystal_splash_shots.lua b/tests/drivers/crystal_splash_shots.lua new file mode 100644 index 00000000..fa46ff92 --- /dev/null +++ b/tests/drivers/crystal_splash_shots.lua @@ -0,0 +1,86 @@ +-- The Crystal GAME FREAK splash (pokecrystal engine/movie/splash.asm), shot +-- finely enough to catch both Ditto bounces, plus both IntroSequence exits +-- (pokecrystal engine/menus/intro_menu.asm:964-967): watched -> CrystalIntro, +-- skipped -> the title. +local U = require("tests.drivers.util") +local CrystalIntro = require("src.ui.gen2.CrystalIntro") +local CrystalSplash = require("src.ui.gen2.CrystalSplash") +local TitleState = require("src.ui.gen2.TitleState") + +local LIMIT = 900 + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-splash" + local interval = tonumber(os.getenv("POKEPORT_SHOT_INTERVAL") or "") or 2 + + U.wait(10) + local finished, skipped + local splash = CrystalSplash.new(game, { + oakSpeech = game.oakSpeechData or {}, + onDone = function(s) + finished, skipped = true, s + end, + }) + game.stack:clear() + game.stack:push(splash) + + local st = splash.anims.structs[1] + assert(st and st.index ~= 0, "no Ditto sprite anim struct was spawned") + local minY, sawMorph, scene = 256, false, -1 + while not finished and splash.frames < LIMIT do + U.wait(interval) + local offset = st.yOffset + if offset >= 128 then offset = offset - 256 end + if st.jt == 1 and offset < minY then minY = offset end + if st.jt >= 3 then sawMorph = true end + if splash.scene ~= scene then + scene = splash.scene + U.log(("scene %d at frame %d (jt=%d var1=%d)") + :format(scene, splash.frames, st.jt, st.var1)) + end + if not finished then + U.shot(game, ("%s/splash-%04d-scene%d.png") + :format(out, splash.frames, splash.scene)) + end + end + assert(finished, "the splash never finished (frame " + .. splash.frames .. ", scene " .. splash.scene .. ")") + assert(not skipped, "an unskipped splash reported skipped") + assert(minY <= -90, "Ditto never reached the top of its 96px bounce (min " + .. minY .. ")") + assert(sawMorph, "the transform scene never ran") + U.log(("splash done at frame %d, min bounce offset %d") + :format(splash.frames, minY)) + + -- Watched through: Game2 routes to the intro movie. + game:showGameFreak() + U.wait(5) + assert(getmetatable(game.stack:top()) == CrystalSplash, + "showGameFreak did not open the Crystal splash") + for _ = 1, LIMIT do + if getmetatable(game.stack:top()) == CrystalIntro then break end + U.wait(5) + end + assert(getmetatable(game.stack:top()) == CrystalIntro, + "a watched splash did not hand off to CrystalIntro (top " + .. tostring(game.stack:top()) .. ")") + U.log("watched splash handed off to the intro movie") + + -- Skipped: straight to the title, no intro movie. + game:showGameFreak() + U.wait(40) + U.shot(game, out .. "/skip-before.png") + U.tap(game, "b") + for _ = 1, 60 do + if getmetatable(game.stack:top()) == TitleState then break end + assert(getmetatable(game.stack:top()) ~= CrystalIntro, + "a skipped splash still played the intro movie") + U.wait(1) + end + assert(getmetatable(game.stack:top()) == TitleState, + "a skipped splash did not land on the title (top " + .. tostring(game.stack:top()) .. ")") + U.wait(30) + U.shot(game, out .. "/skip-title.png") + U.log("PASS crystal splash shots in " .. out) +end diff --git a/tests/drivers/gold_battle_bg_bug1709_test.lua b/tests/drivers/gold_battle_bg_bug1709_test.lua new file mode 100644 index 00000000..742f0fdb --- /dev/null +++ b/tests/drivers/gold_battle_bg_bug1709_test.lua @@ -0,0 +1,278 @@ +-- #1709: BATTLE BG on Gold, the WHITE / BLACK void around the battle screen, +-- and whether it survives a menu opened over the battle. The cart has no such +-- setting; maps/Route29.asm:432 is only where this parks the player. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_battle_bg_bug1709_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-battle-bg love . +-- +-- No POKEPORT_SPEED: the shots land a fixed number of frames after a +-- transition, and a logic clock running ahead of the render moves them. +local U = require("tests.drivers.util") + +local Chrome = require("src.ui.gen2.Chrome") +local Mon = require("src.battle.gen2.Mon") +local OptionsMenu = require("src.ui.gen2.OptionsMenu") +local Permissions = require("src.world.gen2.Permissions") +local Save = require("src.core.gen2.Save") + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-battle-bg" + local failures = 0 + + local function ok(label, condition, detail) + if condition then + print("[battlebg] ok " .. label) + else + failures = failures + 1 + print("[battlebg] FAIL " .. label .. " " .. tostring(detail)) + end + end + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 6) + end + + local function shot(path) + if not U.shot(game, path) then failures = failures + 1 end + end + + U.wait(45) + local world = game.world + assert(world and world.map, "gold world did not boot") + + -- ---- what the eye cannot check ----------------------------------------- + -- Each of these fails the same way the bug did: the void just stays white. + ok("battleBg has a default in the Gold options table", + Save.DEFAULT_OPTIONS.battleBg == "white", Save.DEFAULT_OPTIONS.battleBg) + + local bgRow + for i, row in ipairs(OptionsMenu.ROWS) do + if row.label == "BATTLE BG" then bgRow = i end + end + ok("OPTION carries a BATTLE BG row", bgRow ~= nil, bgRow) + if bgRow then + ok("and it is the last row before CANCEL", + OptionsMenu.ROWS[bgRow + 1] and OptionsMenu.ROWS[bgRow + 1].cancel == true, + bgRow) + end + + local battleModule = require("src.ui.gen2.BattleState") + ok("the Gold battle screen answers bgMode", + type(battleModule.bgMode) == "function", type(battleModule.bgMode)) + ok("and Game2 owns the repaint, not the battle screen", + type(game.paintBattleSurround) == "function", + type(game.paintBattleSurround)) + + -- At the letterbox size there is no void, so nothing below would show. + if love.window and love.window.setMode then + love.window.setMode(1280, 840, { resizable = true }) + U.wait(6) + end + local winW, winH = love.graphics.getDimensions() + local scale = Chrome.fitScale(winW, winH) + local ox, oy = Chrome.fitOrigin(winW, winH, scale) + ok(("the window leaves a void to look at (%dx%d, panel at %d,%d x%d)") + :format(winW, winH, ox, oy, scale), ox > 8 and oy > 8, ox .. "," .. oy) + + local player = Mon.new(game.data, "CYNDAQUIL", 12) + local wild = Mon.new(game.data, "PIDGEY", 4) + ok("CYNDAQUIL builds from the extracted tables", + player ~= nil and #player.moves > 0, player and #player.moves) + ok("and so does the wild PIDGEY", wild ~= nil and #wild.moves > 0, + wild and #wild.moves) + game.save.party = { player } + game.save.inventory = { POKE_BALL = 5, POTION = 3 } + + -- maps/Route29.asm:432, the teacher's WALK_LEFT_RIGHT lane, so (15,11) and + -- its neighbours are floor; a map edit that moves it falls back below. + assert(world:setMap("ROUTE_29", 15, 11, "down"), "setMap ROUTE_29 failed") + U.wait(8) + if not Permissions.isWalkable(world:playerCollision()) then + for _, step in ipairs({ { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 }, + { 2, 0 }, { -2, 0 } }) do + if world:setMap("ROUTE_29", 15 + step[1], 11 + step[2], "down") + and Permissions.isWalkable(world:playerCollision()) then + break + end + end + U.wait(8) + end + ok("the player is standing on floor, not in a wall", + Permissions.isWalkable(world:playerCollision()), + tostring(world:playerCollision())) + + print(failures == 0 + and "[battlebg] preflight PASS -- the shots below are worth looking at" + or ("[battlebg] preflight FAIL (%d) -- fix these before judging a pixel") + :format(failures)) + + -- ---- the run ----------------------------------------------------------- + -- Start from WHITE whatever the gold-dev identity was left on, so the first + -- half of the run is the same every time. + game.options.battleBg = "white" + shot(out .. "/00-route29.png") + + -- OPTION, walked to off the START menu the way a player gets there. + tap("start") + local startMenu = game.stack:top() + ok("START opened the menu", startMenu ~= nil and startMenu.items ~= nil, + startMenu) + if startMenu and startMenu.list then + for _ = 1, #startMenu.items do + local item = startMenu.items[startMenu.list.index] + if item and item.value == "option" then break end + tap("down", 3) + end + local landed = startMenu.items[startMenu.list.index] + ok("the cursor found OPTION", landed and landed.value == "option", + landed and landed.value) + end + tap("a", 10) + + local options = game.stack:top() + ok("the OPTION screen is up", options ~= nil and options.rows ~= nil, options) + if options then + -- UP from the first row wraps onto CANCEL, so BATTLE BG is two presses + -- away however many rows the build has. + for _ = 1, #options.rows do + if options:row() and options:row().key == "battleBg" then break end + tap("up", 3) + end + local row = options:row() + ok("the cursor is on BATTLE BG", row and row.key == "battleBg", + row and row.label) + U.log("01: the OPTION screen, cursor on BATTLE BG. it should read WHITE,") + U.log("sitting under MAX FPS and above CANCEL.") + shot(out .. "/01-option-white.png") + tap("right", 6) + ok("right stored black", game.options.battleBg == "black", + game.options.battleBg) + U.log("02: same row after one press right. it should read BLACK, and no") + U.log("other row on screen should have changed.") + shot(out .. "/02-option-black.png") + end + -- Gold plays with an empty stack: the world is not a state, so "back on the + -- map" is nothing on top rather than the overworld being on top. + tap("b", 10) + for _ = 1, 20 do + if game.stack:top() == nil then break end + tap("b", 4) + end + ok("the menus closed", game.stack:top() == nil, game.stack:top()) + + U.log("03: Route 29 with BATTLE BG on BLACK. the overworld is not a battle,") + U.log("so there must be NO black bars here -- the surround around the map is") + U.log("whatever VOID FILL draws, exactly as it was before.") + shot(out .. "/03-route29-black-set.png") + + -- ---- the battle -------------------------------------------------------- + assert(world:startBattle({ wild = wild }), "startBattle failed") + local battle + for _ = 1, 900 do + local top = game.stack:top() + if top and top.battle then battle = top break end + U.wait(1) + end + ok("the battle screen came up after the transition", battle ~= nil, battle) + if not battle then + print(("[battlebg] FAIL no battle to shoot (%d)"):format(failures)) + while true do coroutine.yield() end + end + for _ = 1, 150 do + if battle.phase == "menu" then break end + tap("a", 2) + end + ok("the battle reached the FIGHT menu", battle.phase == "menu", battle.phase) + ok("and it reports the black surround", + battle:bgMode() == "black", battle:bgMode()) + U.wait(10) + + U.log("04: the battle on BLACK. the void on all four sides of the GB screen") + U.log("is solid black; the battle's own field, HUD and message box stay") + U.log("white. black creeping over the panel edge -- a dark frame eating a") + U.log("row of the HUD or the box border -- is the band maths being wrong.") + shot(out .. "/04-battle-black.png") + + -- The 2x2 is FIGHT, / PACK, RUN. Clamp onto FIGHT first and step + -- from there: one cell off is RUN, which ends the battle instead of a menu. + local function pointAt(index) + tap("left", 3) + tap("up", 3) + if index == 2 or index == 4 then tap("right", 3) end + if index == 3 or index == 4 then tap("down", 3) end + return battle.menuIndex == index + end + + ok("the cursor is on PKMN", pointAt(2), battle.menuIndex) + tap("a", 12) + ok("the party list opened over the battle", battle.phase == "submenu", + battle.phase) + U.log("05: the party list over the same battle. this is the one that used to") + U.log("go wrong: the surround must still be black. white returning the") + U.log("instant the list goes up means the repaint is on the wrong layer.") + shot(out .. "/05-party-over-black.png") + tap("b", 12) + + ok("the cursor is on PACK", pointAt(3), battle.menuIndex) + tap("a", 14) + U.log("06: the PACK over the battle, same rule -- still black behind it.") + shot(out .. "/06-pack-over-black.png") + tap("b", 12) + for _ = 1, 20 do + if battle.phase == "menu" then break end + tap("b", 4) + end + + -- SCREEN POS moves the panel off centre, which is the other way the bands + -- can stop lining up with where the panel actually landed. + local positions = { + { 7, "upper", "the panel sits high, so the black above it is thin and", + "the band below is deep. both stop dead at the panel edge." }, + { 8, "top", "the panel is flush with the top, so there is no black", + "above it at all. a band up there means the lift was ignored." }, + } + for _, pos in ipairs(positions) do + game.options.screenPos = pos[2] + game:applyOptions() + U.wait(8) + local px, py = Chrome.fitOrigin(love.graphics.getDimensions()) + U.log(("0%d: SCREEN POS %s, panel at %d,%d."):format( + pos[1], pos[2], px, py)) + U.log(pos[3]) + U.log(pos[4]) + shot(out .. ("/0%d-screenpos-%s.png"):format(pos[1], pos[2])) + end + game.options.screenPos = "center" + game:applyOptions() + U.wait(8) + + -- The no-regression half: WHITE has to look exactly like it always did. + game.options.battleBg = "white" + U.wait(6) + ok("and back to white", battle:bgMode() == "white", battle:bgMode()) + U.log("09: the same battle flipped back to WHITE. paper white all the way to") + U.log("the window edge, no seam where the panel ends -- compare it with 04.") + shot(out .. "/09-battle-white.png") + + ok("back on PKMN for the white pair", pointAt(2), battle.menuIndex) + tap("a", 12) + U.log("10: the party list over the white battle, for the same comparison.") + shot(out .. "/10-party-over-white.png") + tap("b", 12) + + game.options.battleBg = "black" + U.wait(6) + + print(failures == 0 and "[battlebg] PASS gold_battle_bg_bug1709" + or ("[battlebg] FAIL gold_battle_bg_bug1709 (%d)"):format(failures)) + U.log("the battle is still up on BLACK and the controls are yours. leaving") + U.log("the OPTION screen wrote BLACK into the gold-dev options.lua, so the") + U.log("next boot starts there; set it back from OPTION if you want white.") + + while true do coroutine.yield() end +end diff --git a/tests/drivers/gold_cycling_road_bug1718_1749_test.lua b/tests/drivers/gold_cycling_road_bug1718_1749_test.lua new file mode 100644 index 00000000..ee3d17b8 --- /dev/null +++ b/tests/drivers/gold_cycling_road_bug1718_1749_test.lua @@ -0,0 +1,274 @@ +-- #1718 / #1749: START while the Cycling Road rolls the bike downhill, and SURF +-- refused there. Assertion driver -- every line it prints is PASS or FAIL. +-- Covers the halves tests/gen2_cycling_road_test.lua cannot: Game2's joypad +-- latch, which needs a real Input, and the A press at the water. +-- ../pokegold/maps/Route17.asm:11-16, engine/overworld/events.asm:193-231. +-- Never add POKEPORT_SPEED: which fixed step a press lands on IS the subject. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_cycling_road_bug1718_1749_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-cycling-road \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +local U = require("tests.drivers.util") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local Mon = require("src.battle.gen2.Mon") +local Permissions = require("src.world.gen2.Permissions") +local Screens = require("src.ui.Screens") + +-- The lane: x=9 is road, x=10 the water beside it, and Route 17's four bikers +-- stand at (4,17) (16,32) (3,53) (6,80) (../pokegold/maps/Route17.asm:147-150). +local ROAD = { map = "ROUTE_17", x = 9, y = 36 } +-- The control, a route with no ALWAYS_ON_BIKE on it: the shore south of the +-- Union Cave mouth (../pokegold/maps/Route32.asm:861 is the nearest object). +local SEA = { map = "ROUTE_32", x = 11, y = 41 } + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-cycling-road" + local fails = 0 + + local function report(ok, line) + if not ok then fails = fails + 1 end + U.log((ok and "PASS " or "FAIL ") .. line) + return ok + end + + U.wait(45) + local world = game.world + if not (world and world.map) then + U.log("FAIL gold world did not boot; nothing below ran") + while true do coroutine.yield() end + end + local save = game.save + + -- --------------------------------------------------------------- helpers + + local function tap(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + U.wait(2) + game.input.state[button] = false + U.wait(frames or 6) + end + + -- One edge then a sustained hold: re-queueing every frame would hand the + -- gate a fresh edge on the landing tick and prove nothing. + local function holdUntilMenu(button, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + local opened = false + for _ = 1, frames do + coroutine.yield() + if game.stack:top() then opened = true break end + end + game.input.state[button] = false + U.wait(2) + return opened + end + + local function tapAndRelease(button) + game.input.pressQueue[#game.input.pressQueue + 1] = button + game.input.state[button] = true + coroutine.yield() + game.input.state[button] = false + end + + local function closeMenus() + for _ = 1, 40 do + if not game.stack:top() then return true end + tap("b", 4) + end + return game.stack:top() == nil + end + + local function dismiss() + for _ = 1, 80 do + if not (world.textbox or world.choicebox or world:busy()) then return true end + if world.choicebox then tap("b", 4) else tap("a", 4) end + end + return not (world.textbox or world.choicebox) + end + + -- Put the roll back at the top of the lane, standing, so every trial starts + -- from the same step phase and none of them drifts into a biker. + local function park(x, y, facing) + local p = world.player + p.moving = false + p.progress = 0 + p.targetX, p.targetY = nil, nil + p.turnTimer = 0 + p.cellX, p.cellY = x, y + p.px, p.py = x * 16, y * 16 + p.facing = facing or "down" + world.stepFinished = false + world.heldDir = nil + end + + -- ---- preflight: everything here fails the same silent way the bugs do ---- + + local okScreen = pcall(Screens.get, game, "Gen2StartMenu") + report(okScreen, "the Gen2StartMenu screen id resolves") + + local badges = save.player.badges or {} + save.player.badges = badges + badges[FieldMoves.BADGE.SURF] = true + report(FieldMoves.hasBadge(save, FieldMoves.BADGE.SURF), "the FOGBADGE is on") + + local swimmer = Mon.new(game.data, "LAPRAS", 30, { moves = { { id = "SURF" } } }) + report(swimmer ~= nil, "the cache builds a LAPRAS") + save.party = { swimmer } + report(FieldMoves.partyMoveUser(save.party, "SURF") ~= nil, + "and it knows SURF, so CheckPartyMove has a mon to find") + + report(world:setMap(ROAD.map, ROAD.x, ROAD.y, "down") ~= false, + "ROUTE_17 loads") + U.wait(10) + report(world.map.id == ROAD.map, "and the world is on it") + report(world:alwaysOnBike() == true, + "MAPCALLBACK_NEWMAP set ALWAYS_ON_BIKE") + report(world:downhill() == true, "and DOWNHILL") + report(FieldMoves.isBiking(world.playerState), + "CheckUpdatePlayerSprite put the player on the bike") + + for cy = ROAD.y, ROAD.y + 12 do + local road = Permissions.isLand(world.map:cellCollision(ROAD.x, cy)) + local sea = Permissions.isWater(world.map:cellCollision(ROAD.x + 1, cy)) + if not (road and sea) then + report(false, ("ROUTE_17 (%d,%d) is no longer road-beside-water") + :format(ROAD.x, cy)) + break + end + end + report(true, "the lane is road all the way down with water on its right") + + local clear = true + for _, npc in ipairs(world.npcs or {}) do + if npc.cellX == ROAD.x and npc.cellY >= ROAD.y - 2 + and npc.cellY <= ROAD.y + 14 then + clear = false + end + end + report(clear, "and no biker is parked in it") + + if fails > 0 then + U.log("preflight failed -- the trials below would be measuring the setup,") + U.log("not the fix. fix the lines above first.") + while true do coroutine.yield() end + end + + -- ---- #1718: the nine offsets in an 8-frame STEP_BIKE cell --------------- + -- Offset 0 is the one tick the gate opens; 1..8 only the latch can carry. + + local opened = 0 + for offset = 0, 8 do + park(ROAD.x, ROAD.y, "down") + U.wait(offset) + local moving = world.player.moving and "mid-step" or "standing" + local ok = holdUntilMenu("start", 24) + if ok then opened = opened + 1 end + report(ok, ("START at offset %d (%s) opened the menu"):format(offset, moving)) + if offset == 4 then U.shot(game, out .. "/01-start-mid-roll.png") end + closeMenus() + end + report(opened == 9, ("all nine offsets opened the menu (%d/9)"):format(opened)) + + -- A press RELEASED inside the step is one the frozen mirror never sees again. + park(ROAD.x, ROAD.y, "down") + U.wait(3) + report(world.player.moving == true, "three ticks in, the roll is mid-step") + tapAndRelease("start") + U.wait(24) + report(game.stack:top() == nil, + "a START tapped and released inside the step opens nothing") + closeMenus() + + -- And the dropped press must not poison the latch for the next one. + park(ROAD.x, ROAD.y, "down") + U.wait(3) + report(holdUntilMenu("start", 24), + "the next held START still opens the menu") + closeMenus() + + -- ---- #1749: SURF refused on the road ------------------------------------ + + park(ROAD.x, ROAD.y, "down") + -- Held RIGHT into the water the step is refused every tick, so the player + -- stands facing the sea instead of rolling and an A press can land at all. + game.input.pressQueue[#game.input.pressQueue + 1] = "right" + game.input.state.right = true + U.wait(20) + report(world.player.facing == "right", "facing the water off the Cycling Road") + report(world.player.moving == false, "and held there by the water it bumps") + local ctx = world:fieldContext() + report(Permissions.isWater(ctx.facingColl), "the faced cell really is water") + report(ctx.alwaysOnBike == true, + "and the field-move context carries ALWAYS_ON_BIKE (#1749)") + U.shot(game, out .. "/02-road-facing-water.png") + + -- TrySurfOW's arm is `.quit`: xor a, no script, no text + -- (engine/events/overworld.asm:513-515). Pressed through the real Input. + game.input.pressQueue[#game.input.pressQueue + 1] = "a" + game.input.state.a = true + U.wait(2) + game.input.state.a = false + U.wait(12) + game.input.state.right = false + report(world.textbox == nil, "A at the water put up no text box") + report(world.queuedFieldMove == nil, "and queued no field move") + report(FieldMoves.isBiking(world.playerState), "the player is still on the bike") + + -- SurfFunction.TrySurf's arm is .FailSurf, which TALKS + -- (engine/events/overworld.asm:350-352, :387-390). The world has to be idle + -- first or useFieldMove answers CANT_USE_HERE off its own busy gate, which + -- is a refusal for the wrong reason and would read as a pass. + dismiss() + report(not world:busy(), "the world is idle before the PACK's SURF is asked") + local menu = world:useFieldMove("SURF", swimmer) + report(menu and menu.ok == false, "the PACK's SURF refuses on the road") + report(menu and menu.text == FieldMoves.TEXT.CANT_SURF, + "with CantSurfText, not the badge line and not silence") + U.wait(6) + report(world.textbox ~= nil, "and the refusal is on screen") + U.wait(70) -- let the line finish typing so the shot is readable + U.shot(game, out .. "/03-road-cant-surf.png") + dismiss() + + -- ---- the control: plain water, ALWAYS_ON_BIKE clear --------------------- + + report(world:setMap(SEA.map, SEA.x, SEA.y, "right") ~= false, "ROUTE_32 loads") + U.wait(10) + world:applyPlayerState(FieldMoves.PLAYER_NORMAL) + report(world:alwaysOnBike() == false, "ROUTE_32 has no ALWAYS_ON_BIKE") + local sea = world:fieldContext() + report(sea.alwaysOnBike == false, "so the context reports it clear") + report(Permissions.isWater(sea.facingColl), "and the player faces its water") + + local allowed = world:useFieldMove("SURF", swimmer) + report(allowed and allowed.ok == true, "the PACK's SURF still works there") + world.queuedFieldMove = nil + + tap("a", 10) + report(world.textbox ~= nil or world.choicebox ~= nil, + "and A at the water still offers to SURF") + U.wait(70) + U.shot(game, out .. "/04-route32-offer.png") + dismiss() + + if fails == 0 then + U.log("all trials passed. shots are in " .. out) + else + U.log(fails .. " trial(s) failed -- see the FAIL lines above") + end + U.log("what a wrong fix looks like: START opening the menu on roughly one") + U.log("press in eight is the World half applied without the Game2 latch, and") + U.log("a menu from the tapped-and-released press is the latch re-pressing a") + U.log("button the player already let go of.") + + world:setMap(ROAD.map, ROAD.x, ROAD.y, "down") + U.wait(10) + U.log("parked back on the Cycling Road; the controls are yours from here") + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/gold_field_anim_shots.lua b/tests/drivers/gold_field_anim_shots.lua index a0b79c6a..54c1638b 100644 --- a/tests/drivers/gold_field_anim_shots.lua +++ b/tests/drivers/gold_field_anim_shots.lua @@ -118,7 +118,10 @@ return function(game) for _, row in ipairs(FieldMoves.FLYPOINTS) do save.engineFlags[row.flag] = true end - ok("openFlyMap opens a screen", world:openFlyMap() == true) + -- The mon that used the move: FlyFunction_InitGFX and TownMapMon both draw + -- wCurPartyMon's icon (engine/events/field_moves.asm:390). + local flyMon = (save.party and save.party[1]) or { species = "PIDGEY" } + ok("openFlyMap opens a screen", world:openFlyMap(flyMon) == true) U.wait(4) local picker = game.stack:top() ok("and it is the town-map picker, not a yes/no box", @@ -130,18 +133,26 @@ return function(game) U.wait(4) U.shot(game, out .. "/06-flymap-moved.png") - -- A takes the destination: the fade out lifts the player off the map first. + -- A takes the destination: FlyFromAnim hovers over the tile for 64 frames, + -- climbs off the top of the screen, and FlyToAnim drops back in after the warp. U.tap(game, "a") - local lifted = 0 - for frame = 1, 40 do + U.wait(4) + ok("FLY starts the take-off animation", world.flyAnim ~= nil) + U.shot(game, out .. "/07-fly-takeoff.png") + local risen, landing = 0, false + for _ = 1, 300 do U.wait(1) - lifted = math.min(lifted, (world.player and world.player.spriteYOffset) or 0) - if frame == 4 then U.shot(game, out .. "/07-fly-takeoff.png") end + local fa = world.flyAnim + if fa then + risen = math.min(risen, fa.y or 0) + if fa.phase == "to" then landing = true end + elseif landing then + break + end end - ok("FLY lifts the player under the fade", lifted < 0, lifted) - U.wait(30) - ok("and lands them back on the tile", - (world.player.spriteYOffset or 0) == 0) + ok("the mon climbs off the map", risen < 0, risen) + ok("and FlyToAnim brings it back down", landing) + ok("with the player standing again", world.flyAnim == nil) U.shot(game, out .. "/08-fly-landed.png") -- --------------------------------------------------- tilt and the void diff --git a/tests/drivers/gold_fishing_rod_bug1708_test.lua b/tests/drivers/gold_fishing_rod_bug1708_test.lua new file mode 100644 index 00000000..d3d877d7 --- /dev/null +++ b/tests/drivers/gold_fishing_rod_bug1708_test.lua @@ -0,0 +1,369 @@ +-- #1708: Gold's fishing pose and rod. The cast is reached the way a player +-- reaches it -- walk to the shore, START, PACK, KEY ITEMS, OLD ROD, USE -- once +-- per facing, and the pose row and rod tile are sampled out of the real draw. +-- FacingFishDown/Up/Left/Right ../pokegold/data/sprites/facings.asm:122-152; +-- LoadFishingGFX ../pokegold/engine/events/fishing_gfx.asm:1-24. +-- No POKEPORT_SPEED: it scales the logic clock only, so the sampled frames and +-- the rendered ones drift apart and the rod is read off the wrong frame. +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_fishing_rod_bug1708_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-fishing \ +-- perl -e 'alarm 420; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +local U = require("tests.drivers.util") + +local Assets = require("src.render.Assets") +local Map = require("src.world.gen2.Map") +local PackMenu = require("src.ui.gen2.PackMenu") +local Permissions = require("src.world.gen2.Permissions") +local SpriteRenderer = require("src.render.SpriteRenderer") +local StartMenu = require("src.ui.gen2.StartMenu") + +local ROD_ITEM = "OLD_ROD" +local FACINGS = { "down", "up", "left", "right" } +local DELTA = { up = { 0, -1 }, down = { 0, 1 }, left = { -1, 0 }, right = { 1, 0 } } + +-- The loose rod OAM, `db y, x, attr, tile`, off the sprite's top-left +-- (data/sprites/facings.asm:122-152). Read here a second time so a typo in the +-- engine's copy of the table is a mismatch rather than a shared mistake. +local ROD_OAM = { + down = { dx = 0, dy = 16, tile = 0xfc, flip = false }, + up = { dx = 0, dy = -8, tile = 0xfc, flip = false }, + left = { dx = -8, dy = 5, tile = 0xfd, flip = true }, + right = { dx = 16, dy = 5, tile = 0xfd, flip = false }, +} +-- LoadFishingGFX's three destinations, vTiles $02 / $06 / $0a, which are the +-- bottom tile rows of the down / up / left standing frames; right is left +-- x-flipped (fishing_gfx.asm:13-18, facings.asm:143-152). +local POSE_ROW = { down = 0, up = 1, left = 2, right = 2 } +local POSE_FLIP = { down = false, up = false, left = false, right = true } +-- Four rows of two tiles: the three pose rows then $fc/$fd. +local SHEET_W, SHEET_H, ROD_ROW_Y = 16, 32, 24 + +-- Ponds with a shore on all four sides. Route 28's has no object events at +-- all (../pokegold/maps/Route28.asm:29), so nothing walks into a shot and no +-- trainer's line of sight crosses one; the other two are the fallbacks if its +-- blocks are ever edited (../pokegold/maps/Route28.blk). +local MAPS = { "ROUTE_28", "VIRIDIAN_CITY", "ROUTE_43" } + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-fishing" + local failures = 0 + + local function check(label, condition, detail) + if condition then + U.log("PASS", label) + else + failures = failures + 1 + U.log("FAIL", label, detail ~= nil and tostring(detail) or "") + end + return condition and true or false + end + + local function tap(btn, frames) + game.input.pressQueue[#game.input.pressQueue + 1] = btn + game.input.state[btn] = true + U.wait(2) + game.input.state[btn] = false + U.wait(frames or 6) + end + + U.wait(45) + local world = game.world + assert(world and world.map, "gold world did not boot") + local save = game.save + + -- ---- the halves of the drawing, before anything is on screen ------------- + -- A cache with no sheet, a sheet of the wrong size and a draw branch that + -- never fires all look identical on screen: a plain standing player. + + local sheet = world.fishingSheet + if not check("the cache carries LoadFishingGFX's sheet (world.fishingSheet)", + type(sheet) == "string", sheet) then + U.log("no emotes/fishing.png in this cache, so nothing below can draw.") + U.log("re-import the cart first:") + U.log(" POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_IMPORT_ONLY=1 \\") + U.log(" POKEPORT_IMPORT_ROM=/path/to/gold.gbc love .") + while true do coroutine.yield() end + end + + local okImg, image = pcall(Assets.image, sheet) + check("and it loads: " .. tostring(sheet), okImg and image ~= nil) + if okImg and image then + local w, h = image:getDimensions() + check(("it is %dx%d, the four rows the quads are written against") + :format(SHEET_W, SHEET_H), + w == SHEET_W and h == SHEET_H, ("%dx%d"):format(w, h)) + if h ~= SHEET_H then + U.log("a taller sheet moves the rod row, and both draws then sample") + U.log("the wrong pixels -- Gen 1 shipped exactly that as #321.") + end + end + + local Player = require("src.world.gen2.Player") + check("Player:drawFishing exists (the branch that reads player.fishing)", + type(Player.drawFishing) == "function") + check("SpriteRenderer:drawTile exists (it bakes the OBJ palette; a raw " + .. "love.graphics.draw would leave the rod in DMG greys)", + type(SpriteRenderer.drawTile) == "function") + + local rodDef = game.data and game.data.items and game.data.items[ROD_ITEM] + check("OLD ROD is a real item in this cache", rodDef ~= nil) + check("and it lives in the KEY ITEMS pocket", + rodDef ~= nil and rodDef.pocket == "KEY_ITEM", + rodDef and rodDef.pocket) + + -- ---- pick the pond ------------------------------------------------------ + -- Shores are re-derived from the generated blocks every run, so a re-extract + -- that shifts the water degrades to another cell instead of parking the + -- player at a wall. + + local function shores(mapId) + local def = world.maps and world.maps[mapId] + local tileset = def and world.tilesets and world.tilesets[def.tileset] + if not (def and tileset) then return nil end + local probe = Map.new(def, tileset) + local taken = {} + for _, obj in ipairs(def.objects or {}) do + taken[obj.x .. "," .. obj.y] = true + end + local function land(cx, cy) + if not probe:inBounds(cx, cy) then return false end + if taken[cx .. "," .. cy] then return false end + local coll = probe:cellCollision(cx, cy) + return Permissions.isWalkable(coll) and not Permissions.isWater(coll) + end + local found = {} + for _, facing in ipairs(FACINGS) do + local d = DELTA[facing] + for cy = 0, probe.heightCells - 1 do + for cx = 0, probe.widthCells - 1 do + if not found[facing] and land(cx, cy) + and probe:inBounds(cx + d[1], cy + d[2]) + and Permissions.isWater(probe:cellCollision(cx + d[1], cy + d[2])) + and land(cx - d[1], cy - d[2]) then + found[facing] = { x = cx, y = cy } + end + end + end + if not found[facing] then return nil end + end + return found + end + + local MAP, SHORE + for _, id in ipairs(MAPS) do + SHORE = shores(id) + if SHORE then MAP = id break end + end + if not check("a pond with all four shores and a step of room behind each", + MAP ~= nil, table.concat(MAPS, ", ")) then + while true do coroutine.yield() end + end + U.log("fishing on " .. MAP .. ", from " .. + ("down (%d,%d), up (%d,%d), left (%d,%d), right (%d,%d)"):format( + SHORE.down.x, SHORE.down.y, SHORE.up.x, SHORE.up.y, + SHORE.left.x, SHORE.left.y, SHORE.right.x, SHORE.right.y)) + + -- ---- the bag, and a pond that never bites ------------------------------- + -- FISHGROUP_NONE is .FishNoFish: the cast, the pose and the rod are the same + -- as a bite's, and every run ends on "Not even a nibble!" back on the map + -- rather than in a battle nobody asked for. Put back before the hand-off. + + save.inventory = { [ROD_ITEM] = 1 } + save.bagOrder = { ROD_ITEM } + local mapDef = world.maps[MAP] + local realGroup = mapDef.fishGroup + mapDef.fishGroup = "FISHGROUP_NONE" + + -- ---- what the sprite actually drew -------------------------------------- + + local watch = nil + local realDrawTile = SpriteRenderer.drawTile + SpriteRenderer.drawTile = function(self, path, x, y, flip, quad) + if watch and path == sheet then + local qx, qy, qw, qh = 0, 0, 0, 0 + if quad and quad.getViewport then qx, qy, qw, qh = quad:getViewport() end + watch[#watch + 1] = { x = x, y = y, flip = flip and true or false, + qx = qx, qy = qy, qw = qw, qh = qh } + end + return realDrawTile(self, path, x, y, flip, quad) + end + + local function lastOfSize(calls, w, h) + local hit + for _, c in ipairs(calls) do + if c.qw == w and c.qh == h then hit = c end + end + return hit + end + + -- ---- walk to a shore ---------------------------------------------------- + + local function goToShore(facing) + local cell, d = SHORE[facing], DELTA[facing] + world:setMap(MAP, cell.x - d[1], cell.y - d[2], facing) + U.wait(24) + U.hold(game, facing, 26) + U.wait(10) + local p = world.player + if p.cellX ~= cell.x or p.cellY ~= cell.y then + world:setMap(MAP, cell.x, cell.y, facing) + U.wait(24) + p = world.player + end + local fx, fy = p.cellX + d[1], p.cellY + d[2] + check(("%s: standing at (%d,%d) with water in front") + :format(facing, p.cellX, p.cellY), + p.facing == facing and world.map:inBounds(fx, fy) + and Permissions.isWater(world.map:cellCollision(fx, fy)), + ("facing %s"):format(tostring(p.facing))) + end + + -- ---- START, PACK, KEY ITEMS, OLD ROD, USE -------------------------------- + + local function castRod(facing) + tap("start") + local menu = game.stack:top() + if not check(("%s: START opened the menu"):format(facing), + getmetatable(menu) == StartMenu) then + return false + end + for _ = 1, #menu.items do + local row = menu.list and menu.list:current() + if row and row.value == "pack" then break end + tap("down", 4) + end + tap("a", 10) + local pack = game.stack:top() + if not check(("%s: and the PACK is open"):format(facing), + getmetatable(pack) == PackMenu) then + return false + end + for _ = 1, 4 do + if pack:pocket().id == "KEY_ITEM" then break end + tap("right", 6) + end + check(("%s: on the KEY ITEMS pocket"):format(facing), + pack:pocket().id == "KEY_ITEM", pack:pocket().id) + for _ = 1, 20 do + local row = pack.rows[pack.index] + if row and row.id == ROD_ITEM then break end + tap("down", 4) + end + local row = pack.rows[pack.index] + if not check(("%s: cursor on the OLD ROD"):format(facing), + row ~= nil and row.id == ROD_ITEM, row and row.id) then + return false + end + tap("a", 8) + local sub = pack.submenu + check(("%s: the item submenu opened on USE"):format(facing), + sub ~= nil and sub.rows[sub.index] == "use", + sub and sub.rows[sub.index]) + tap("a", 10) + return true + end + + -- ---- one facing, end to end --------------------------------------------- + + local function castAndSample(facing, index) + goToShore(facing) + if not castRod(facing) then return end + + for _ = 1, 60 do + if world.fishing then break end + U.wait(1) + end + check(("%s: the rod is out (world.fishing)"):format(facing), + world.fishing ~= nil) + check(("%s: the pose is up (player.fishing)"):format(facing), + world.player.fishing == true) + check(("%s: and it drew from the fishing sheet"):format(facing), + world.player.fishSheet == sheet, world.player.fishSheet) + check(("%s: the PACK closed, so the cast is on screen"):format(facing), + getmetatable(game.stack:top()) ~= PackMenu) + + watch = {} + U.wait(6) + local calls = watch + watch = nil + local pose = lastOfSize(calls, 16, 8) + local rod = lastOfSize(calls, 8, 8) + check(("%s: a 16x8 pose row was drawn"):format(facing), pose ~= nil) + check(("%s: and the 8x8 rod tile beside it"):format(facing), rod ~= nil) + if pose and rod then + check(("%s: the pose row is sheet row %d") + :format(facing, POSE_ROW[facing]), + pose.qx == 0 and pose.qy == POSE_ROW[facing] * 8, + ("%d,%d"):format(pose.qx, pose.qy)) + check(("%s: the pose is%s x-flipped") + :format(facing, POSE_FLIP[facing] and "" or " not"), + pose.flip == POSE_FLIP[facing]) + local oam = ROD_OAM[facing] + check(("%s: the rod tile is $%02x on the sheet's rod row") + :format(facing, oam.tile), + rod.qy == ROD_ROW_Y and rod.qx == (oam.tile - 0xfc) * 8, + ("%d,%d"):format(rod.qx, rod.qy)) + check(("%s: the rod tile is%s x-flipped") + :format(facing, oam.flip and "" or " not"), + rod.flip == oam.flip) + -- The pose row sits at the sprite's bottom tile row, so the OAM offsets + -- are read back relative to it. + local drop = math.max(0, (world.player.sprite.frameHeight or 16) - 8) + check(("%s: the rod sits at OAM offset %d,%d from the sprite") + :format(facing, oam.dx, oam.dy), + rod.x - pose.x == oam.dx and rod.y - pose.y == oam.dy - drop, + ("%d,%d"):format(rod.x - pose.x, rod.y - pose.y + drop)) + end + U.shot(game, ("%s/%02d-fishing-%s.png"):format(out, index, facing)) + + -- PutTheRodAway: the pose comes down with the verdict box, not later. + local down = nil + for frame = 1, 300 do + if world.textbox then tap("a", 2) else U.wait(1) end + if not down and world.player.fishing == nil then down = frame end + if down and not world.textbox then break end + end + check(("%s: the pose came down with the box"):format(facing), down ~= nil) + watch = {} + U.wait(8) + local after = #watch + watch = nil + check(("%s: and nothing draws the rod afterwards"):format(facing), + after == 0, after) + end + + for i, facing in ipairs(FACINGS) do + castAndSample(facing, i) + end + + SpriteRenderer.drawTile = realDrawTile + mapDef.fishGroup = realGroup + + -- ---- hand off on a live cast -------------------------------------------- + + goToShore("right") + castRod("right") + U.wait(20) + + U.log(("%d shot(s) in %s, one per facing (#1708)."):format(#FACINGS, out)) + U.log("in each one the player's lower half is the two-handed fishing pose,") + U.log("not the standing legs, and one thin dark rod line runs from the hands") + U.log("into the water: straight down below the feet facing down, straight up") + U.log("above the head facing up, and a short stroke starting a tile clear of") + U.log("the sprite and sloping away from it facing left or right.") + U.log("the near miss to look for is the pose swapping in with no rod, or the") + U.log("rod as a garbage block, which is the sheet and the quads disagreeing;") + U.log("the other is a rod in flat DMG greys while the player is in colour.") + U.log("the pond bit on nothing for the four shots; the group is back now, so") + U.log("this last cast can bite. the controls are yours.") + if failures > 0 then + U.log(("%d check(s) failed above -- read those before looking at the shots") + :format(failures)) + end + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/gold_fly_anim_bug1711_test.lua b/tests/drivers/gold_fly_anim_bug1711_test.lua new file mode 100644 index 00000000..d8cb70d7 --- /dev/null +++ b/tests/drivers/gold_fly_anim_bug1711_test.lua @@ -0,0 +1,305 @@ +-- #1711: FLY is an animation, not a warp. .FlyScript hides the map's objects +-- and runs FlyFromAnim before WarpToSpawnPoint and FlyToAnim after the +-- newloadmap (../pokegold/engine/events/overworld.asm:595-609, and the two +-- animations at engine/events/field_moves.asm:300 and :334). Flown the way a +-- player flies: START > POKeMON > FLY out of New Bark Town. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_fly_anim_bug1711_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-fly \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- Do not add POKEPORT_SPEED. It scales the logic clock only, and the beat +-- being judged here is SFX_FLY against the wingbeat, which is audio against +-- logic -- fast-forward pulls those two apart. +local U = require("tests.drivers.util") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local Mon = require("src.battle.gen2.Mon") + +local FLY_SPECIES = "PIDGEOTTO" + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-fly" + local fails = 0 + + local function ok(cond, msg) + if cond then + print("[fly] ok " .. msg) + else + fails = fails + 1 + print("[fly] FAIL " .. msg) + end + return cond + end + + local function tap(btn) U.tap(game, btn) U.wait(3) end + local function top() return game.stack:top() end + + U.wait(45) + local world = game.world + local save, data = game.save, game.data + if not ok(world and world.map, "gold booted into the overworld") then + error("gold fly: no world") + end + + local opts = save.options or {} + local sfxVol = opts.sfxVol or 7 + if sfxVol == 0 then + U.log("SFX volume is 0, so this run is silent whether the fix works or") + U.log("not. turn it up in OPTIONS and run again before judging the sound.") + end + ok(sfxVol > 0, ("SFX volume is %d"):format(sfxVol)) + + -- The wingbeat itself: no Sfx_Fly in the cache and the whole flight is + -- silent, which sounds exactly like the bug. + local audio = data and data.audio + local flySfx = world:sfxIdNamed("Sfx_Fly", 0x18) + local flySfxName = audio and audio.sfxOrder and audio.sfxOrder[flySfx + 1] + ok(flySfxName == "Sfx_Fly" and audio.sfx and audio.sfx[flySfxName] ~= nil, + ("the cache has Sfx_Fly at id %d"):format(flySfx)) + + -- FlyFunction .TryFly is CheckBadge STORMBADGE then CheckOutdoorMap + -- (../pokegold/engine/events/overworld.asm:544-551). + save.player = save.player or {} + if type(save.player.badges) ~= "table" then save.player.badges = {} end + save.player.badges.STORM = true + save.engineFlags = save.engineFlags or {} + for _, row in ipairs(FieldMoves.FLYPOINTS) do + save.engineFlags[row.flag] = true + end + + -- Mon.learnMove refuses a fifth move (src/battle/gen2/Mon.lua:650), and a + -- level-24 PIDGEOTTO already knows four. + local flyer = Mon.new(data, FLY_SPECIES, 24) + table.remove(flyer.moves, 1) + Mon.learnMove(flyer, "FLY", data) + save.party = { flyer } + local knowsFly = false + for _, entry in ipairs(flyer.moves or {}) do + if entry.id == "FLY" then knowsFly = true end + end + ok(knowsFly, FLY_SPECIES .. " knows FLY") + + -- FlyFunction_InitGFX's GetSpeciesIcon: no icon row for the species and + -- World:startFlyAnim refuses, which is the old instant warp back again. + local icons = data and data.gen2Icons + local iconId = icons and icons.species and icons.species[FLY_SPECIES] + local entry = iconId and icons.icons and icons.icons[iconId] + ok(entry and entry.image ~= nil, + ("%s flies on %s (%s)"):format(FLY_SPECIES, tostring(iconId), + tostring(entry and entry.image))) + + -- New Bark Town: a TOWN, so CheckOutdoorMap passes, and it keeps two objects + -- in view for HideSprites to take away -- the teacher at (6,8) and the + -- fisher at (12,9), ../pokecrystal/maps/NewBarkTown.asm:301-304. Scene 1 is + -- SCENE_NEWBARKTOWN_NOOP, so the teacher's coord event stays out of the way. + world.mapScenes = world.mapScenes or {} + world.mapScenes.NEW_BARK_TOWN = 1 + world:setMap("NEW_BARK_TOWN", 9, 8, "down") + U.wait(15) + local p = world.player + local function free(cx, cy) + return world.map:isWalkable(cx, cy) and not world:npcAt(cx, cy) + end + local DIRS = { down = { 0, 1 }, up = { 0, -1 }, left = { -1, 0 }, + right = { 1, 0 } } + if not free(p.cellX, p.cellY) then + for _, d in pairs(DIRS) do + if free(9 + d[1], 8 + d[2]) then + world:setMap("NEW_BARK_TOWN", 9 + d[1], 8 + d[2], "down") + U.wait(10) + break + end + end + end + ok(world.map.id == "NEW_BARK_TOWN" and free(p.cellX, p.cellY), + ("standing free on New Bark Town (%d,%d)"):format(p.cellX, p.cellY)) + ok((world.map.def and world.map.def.environment) == "TOWN", + "which is a TOWN, so FLY is allowed here") + ok(#world.npcs > 0, + ("with %d object(s) on the map to hide"):format(#world.npcs)) + + -- One real step through the pad, on a free neighbour. + local fromX, fromY = p.cellX, p.cellY + for name, d in pairs(DIRS) do + if free(fromX + d[1], fromY + d[2]) then + U.hold(game, name, 24) + break + end + end + U.wait(8) + ok(p.cellX ~= fromX or p.cellY ~= fromY, + ("the pad walked the player from (%d,%d) to (%d,%d)") + :format(fromX, fromY, p.cellX, p.cellY)) + local takeoffX, takeoffY = p.cellX, p.cellY + + -- Count the wingbeats, and only the ones the animation itself asks for. + local sfxFrom, sfxTo = 0, 0 + local realPlaySfx = world.playSfx + world.playSfx = function(self, id) + local fa = self.flyAnim + if fa and id == flySfx then + if fa.phase == "to" then sfxTo = sfxTo + 1 else sfxFrom = sfxFrom + 1 end + end + return realPlaySfx(self, id) + end + + -- START > POKeMON. CheckMenuOW only runs while nothing else owns the frame + -- (../pokegold/engine/overworld/events.asm), so wait the map's own settling + -- out rather than pressing into it. + for _ = 1, 240 do + if not world:busy() then break end + U.wait(2) + end + local menu + for _ = 1, 10 do + tap("start") + menu = top() + if menu and menu.screenId == "Gen2StartMenu" then break end + U.wait(6) + end + if not ok(menu and menu.screenId == "Gen2StartMenu", + "START opened the menu (top is " + .. tostring(menu and (menu.screenId or "?")) .. ")") then + error("gold fly: no start menu") + end + for _ = 1, 10 do + if menu.list:current().value == "pokemon" then break end + tap("down") + end + ok(menu.list:current().value == "pokemon", "the cursor found POKeMON") + tap("a") + + local party = top() + if not ok(party and party.screenId == "Gen2PartyMenu", + "POKeMON opened the party list") then + error("gold fly: no party list") + end + tap("a") + local sub = party.submenu + if not ok(sub ~= nil, "and A opened the action submenu") then + error("gold fly: no submenu") + end + local flyRow + for index, item in ipairs(sub.items) do + if item.id == "FLY" then flyRow = index end + end + if not ok(flyRow ~= nil, "which lists FLY") then + error("gold fly: the submenu has no FLY row") + end + for _ = 1, #sub.items do + if sub.index == flyRow then break end + tap("down") + end + tap("a") + U.wait(10) + + local picker = top() + if not ok(picker and picker.screenId == "Gen2Pokegear" and picker.fly, + "FLY opened the destination map") then + error("gold fly: no picker") + end + -- _FlyMap's .HandleDPad walks the visited rows; up is the next one along, + -- so one press leaves New Bark for the town after it. + tap("up") + U.wait(6) + local destination = picker:flyRow() + -- Landmark names carry TownMap_ConvertLineBreakCharacters' own , which + -- would break a log line in half. + ok(destination ~= nil, ("picked %s (%s)"):format( + (tostring(destination and destination.name):gsub("%s+", " ")), + tostring(destination and destination.spawn))) + + -- A commits, and .FlyScript starts on this map, not the far one. + U.tap(game, "a") + U.wait(3) + if not ok(world.flyAnim ~= nil and world.flyAnim.phase == "from", + "A started FlyFromAnim over the map being left") then + error("gold fly: the flight collapsed into a warp") + end + ok(world:busy(), "and the world is frozen under it, as the callasm is") + + local hoverFrames, minY, maxSwing = 0, 0, 0 + local toAmpFirst, toAmpLast, sawTo = nil, nil, false + local shots = { hover = false, climb = false, drop = false } + for _ = 1, 900 do + local fa = world.flyAnim + if fa and fa.phase == "from" then + if (fa.hover or 0) > 0 then hoverFrames = hoverFrames + 1 end + minY = math.min(minY, fa.y or 0) + maxSwing = math.max(maxSwing, math.abs(fa.xoff or 0)) + if not shots.hover and hoverFrames >= 20 then + shots.hover = true + U.shot(game, out .. "/01-fly-hover.png") + elseif not shots.climb and (fa.y or 0) <= -40 then + shots.climb = true + U.shot(game, out .. "/02-fly-climb.png") + end + elseif fa then + sawTo = true + toAmpFirst = toAmpFirst or fa.amp + toAmpLast = fa.amp + -- Mid-drop, not the first frame of it: the swing opens at 11 * 8 px, so + -- the icon starts the descent most of a screen off to one side. + if not shots.drop and (fa.y or 0) >= -44 and (fa.y or 0) <= -16 then + shots.drop = true + U.shot(game, out .. "/03-fly-drop.png") + end + elseif sawTo then + break + end + U.wait(1) + end + + -- FlyFromAnim: 0x40 frames on the tile, then 2px a frame off the top with + -- Sprites_Cosine widening the swing (engine/events/field_moves.asm:300-333). + ok(hoverFrames >= 48, + ("the icon held the take-off tile for %d frames"):format(hoverFrames)) + ok(minY <= -84, ("and climbed %d px off it"):format(-minY)) + ok(maxSwing >= 32, ("swinging up to %d px wide"):format(maxSwing)) + -- Nine beats going up (left 128 down to 64, every eighth), one coming down. + ok(sfxFrom == 9, ("SFX_FLY flapped %d times on the way up"):format(sfxFrom)) + ok(sfxTo == 1, ("and %d time on the way down"):format(sfxTo)) + ok(sawTo, "FlyToAnim ran on the far side of the warp") + ok(toAmpFirst and toAmpLast and toAmpLast < toAmpFirst, + ("with its swing damping from %s to %s"):format(tostring(toAmpFirst), + tostring(toAmpLast))) + ok(shots.hover and shots.climb and shots.drop, + "hover, climb and drop are all shot") + + U.wait(30) + ok(world.flyAnim == nil, "the animation is over") + ok(world.map.id ~= "NEW_BARK_TOWN", + ("and the player landed on %s at (%d,%d)"):format(world.map.id, + p.cellX, p.cellY)) + ok(not world:busy(), "with the controls handed back") + U.shot(game, out .. "/04-fly-landed.png") + ok(world.player.spriteYOffset == 0 or world.player.spriteYOffset == nil, + "standing flat on the tile, not still lifted") + + U.log(("flew %s out of New Bark Town from (%d,%d) for you (#1711). the"): + format(FLY_SPECIES, takeoffX, takeoffY)) + U.log("player's own sprite and every other object on the map should vanish") + U.log("the moment A is pressed, replaced by the mon's 16x16 party icon on") + U.log("that same tile, wings beating four times a second under a chirp of") + U.log("SFX_FLY, for about a second. only then does it climb off the top of") + U.log("the screen in a widening swing, and only then does the screen fade.") + U.log("on the far side the icon falls back in from above, its swing damping") + U.log("out, one more chirp, and the player pops in standing.") + U.log("shots are in " .. out .. ".") + U.log("the player still visible on the tile while the icon flies is the near") + U.log("miss for the hide; an icon sitting dead still for two seconds and") + U.log("then jumping is the hover without the climb.") + if fails > 0 then + U.log(("%d assertion(s) failed above -- read those before the pictures.") + :format(fails)) + end + U.log("the party still holds a flyer and the badge, so FLY again from the") + U.log("menu whenever you want another look. the controls are yours.") + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/gold_flymap_cursor_bug1712_test.lua b/tests/drivers/gold_flymap_cursor_bug1712_test.lua new file mode 100644 index 00000000..393642f6 --- /dev/null +++ b/tests/drivers/gold_flymap_cursor_bug1712_test.lua @@ -0,0 +1,234 @@ +-- #1712: the FLY map's cursor is the flying mon's party icon, not the MAP +-- card's arrow. FlyMap's .MapHud calls TownMapMon, which reads wCurPartyMon +-- and spawns SPRITE_ANIM_OBJ_PARTY_MON on that species' icon +-- (../pokecrystal/engine/pokegear/pokegear.asm:2326, :2708-2721). Reached the +-- way a player reaches it: START > POKeMON > FLY, standing in New Bark Town. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_flymap_cursor_bug1712_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-flymap \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- Do not add POKEPORT_SPEED: the icon's two-frame beat is half of what is +-- being judged here, and the logic clock is the only thing speed scales. +local U = require("tests.drivers.util") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local Mon = require("src.battle.gen2.Mon") + +local FLY_SPECIES = "PIDGEOTTO" + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-flymap" + local fails = 0 + + local function ok(cond, msg) + if cond then + print("[flymap] ok " .. msg) + else + fails = fails + 1 + print("[flymap] FAIL " .. msg) + end + return cond + end + + local function tap(btn) U.tap(game, btn) U.wait(3) end + local function top() return game.stack:top() end + + U.wait(45) + local world = game.world + local save, data = game.save, game.data + if not ok(world and world.map, "gold booted into the overworld") then + error("gold flymap: no world") + end + + -- FlyFunction .TryFly is CheckBadge STORMBADGE then CheckOutdoorMap + -- (../pokegold/engine/events/overworld.asm:544-551). + save.player = save.player or {} + if type(save.player.badges) ~= "table" then save.player.badges = {} end + save.player.badges.STORM = true + save.engineFlags = save.engineFlags or {} + for _, row in ipairs(FieldMoves.FLYPOINTS) do + save.engineFlags[row.flag] = true + end + + -- Mon.learnMove refuses a fifth move (src/battle/gen2/Mon.lua:650), and a + -- level-24 PIDGEOTTO already knows four. + local flyer = Mon.new(data, FLY_SPECIES, 24) + table.remove(flyer.moves, 1) + Mon.learnMove(flyer, "FLY", data) + save.party = { flyer } + local knowsFly = false + for _, entry in ipairs(flyer.moves or {}) do + if entry.id == "FLY" then knowsFly = true end + end + ok(knowsFly, FLY_SPECIES .. " knows FLY") + + -- The asset side, which fails exactly as silently as the bug: no icon row + -- for the species and drawFlyMonCursor gives the arrow back. + local icons = data and data.gen2Icons + local iconId = icons and icons.species and icons.species[FLY_SPECIES] + local entry = iconId and icons.icons and icons.icons[iconId] + ok(iconId ~= nil, "the cache maps " .. FLY_SPECIES .. " to an icon (" + .. tostring(iconId) .. ")") + ok(entry and entry.image ~= nil, "and that icon has a sheet (" + .. tostring(entry and entry.image) .. ")") + if entry and entry.image and love.filesystem.getInfo then + ok(love.filesystem.getInfo(entry.image) ~= nil, + "and the sheet is on disk") + end + + -- New Bark Town is a TOWN, so TryFly's CheckOutdoorMap passes, and it has + -- two wandering objects to watch -- the teacher at (6,8) and the fisher at + -- (12,9), ../pokecrystal/maps/NewBarkTown.asm:301-304. Scene 1 is + -- SCENE_NEWBARKTOWN_NOOP, so the teacher's coord event stays out of the way. + world.mapScenes = world.mapScenes or {} + world.mapScenes.NEW_BARK_TOWN = 1 + world:setMap("NEW_BARK_TOWN", 9, 8, "down") + U.wait(15) + local p = world.player + local function free(cx, cy) + return world.map:isWalkable(cx, cy) and not world:npcAt(cx, cy) + end + local DIRS = { down = { 0, 1 }, up = { 0, -1 }, left = { -1, 0 }, + right = { 1, 0 } } + if not free(p.cellX, p.cellY) then + for _, d in pairs(DIRS) do + if free(9 + d[1], 8 + d[2]) then + world:setMap("NEW_BARK_TOWN", 9 + d[1], 8 + d[2], "down") + U.wait(10) + break + end + end + end + ok(world.map.id == "NEW_BARK_TOWN" and free(p.cellX, p.cellY), + ("standing free on New Bark Town (%d,%d)"):format(p.cellX, p.cellY)) + ok((world.map.def and world.map.def.environment) == "TOWN", + "which is a TOWN, so FLY is allowed here") + + -- One real step through the pad, on a free neighbour. + local fromX, fromY = p.cellX, p.cellY + for name, d in pairs(DIRS) do + if free(fromX + d[1], fromY + d[2]) then + U.hold(game, name, 24) + break + end + end + U.wait(8) + ok(p.cellX ~= fromX or p.cellY ~= fromY, + ("the pad walked the player from (%d,%d) to (%d,%d)") + :format(fromX, fromY, p.cellX, p.cellY)) + + -- START > POKeMON. CheckMenuOW only runs while nothing else owns the frame + -- (../pokegold/engine/overworld/events.asm), so wait the map's own settling + -- out rather than pressing into it. + for _ = 1, 240 do + if not world:busy() then break end + U.wait(2) + end + local menu + for _ = 1, 10 do + tap("start") + menu = top() + if menu and menu.screenId == "Gen2StartMenu" then break end + U.wait(6) + end + if not ok(menu and menu.screenId == "Gen2StartMenu", + "START opened the menu (top is " + .. tostring(menu and (menu.screenId or "?")) .. ")") then + error("gold flymap: no start menu") + end + for _ = 1, 10 do + if menu.list:current().value == "pokemon" then break end + tap("down") + end + ok(menu.list:current().value == "pokemon", "the cursor found POKeMON") + tap("a") + + local party = top() + if not ok(party and party.screenId == "Gen2PartyMenu", + "POKeMON opened the party list") then + error("gold flymap: no party list") + end + + -- A on the flyer, then down the submenu to its FLY row. + tap("a") + local sub = party.submenu + if not ok(sub ~= nil, "and A opened the action submenu") then + error("gold flymap: no submenu") + end + local flyRow + for index, item in ipairs(sub.items) do + if item.id == "FLY" then flyRow = index end + end + if not ok(flyRow ~= nil, "which lists FLY") then + error("gold flymap: the submenu has no FLY row") + end + for _ = 1, #sub.items do + if sub.index == flyRow then break end + tap("down") + end + ok(sub.index == flyRow, "the cursor found FLY") + tap("a") + U.wait(10) + + local picker = top() + if not ok(picker and picker.screenId == "Gen2Pokegear", + "FLY opened the town map") then + error("gold flymap: FLY did not open the picker") + end + ok(picker.fly ~= nil and #picker.fly > 0, + "in _FlyMap dress, with " .. tostring(picker.fly and #picker.fly) + .. " flypoints to walk") + -- wCurPartyMon, as TownMapMon reads it (World:openFlyMap's flyMon). + ok(picker.flyMon == flyer, "and it was handed the mon that used the move") + ok(picker.icons ~= nil, "and it can see the icon table") + + U.wait(12) + ok(picker.flyMonIcon ~= nil and picker.flyMonIcon ~= false, + "the mon icon loaded for the cursor") + -- No objColors, no OBP bake, and the bake is what keys colour 0 transparent + -- (src/render/SpriteRenderer.lua:243): the icon would sit in a white box. + ok(picker.flyMonIcon and picker.flyMonIcon.objColors ~= nil, + "with an OBJ palette baked onto it") + + -- Landmark names carry TownMap_ConvertLineBreakCharacters' own , which + -- would break a log line in half. + local function flat(entry) + return (tostring(entry and entry.name):gsub("%s+", " ")) + end + + local before = picker:mapLandmark() + local player = picker:playerLandmark() + ok(before and before.x and before.y, "the cursor is on " .. flat(before)) + U.shot(game, out .. "/01-flymap-newbark.png") + + tap("up") + U.wait(8) + local after = picker:mapLandmark() + ok(after and (after.x ~= before.x or after.y ~= before.y), + ("up walked the cursor to %s at (%s,%s)"):format(flat(after), + tostring(after and after.x), tostring(after and after.y))) + ok(picker:playerLandmark() == player, + "and the player's own icon stayed where it was") + U.shot(game, out .. "/02-flymap-cherrygrove.png") + + U.log("flew the party list into the FLY map for you (#1712). the cursor over") + U.log("the highlighted town should be " .. FLY_SPECIES .. "'s 16x16 party") + U.log("icon, red like the little Chris icon parked on New Bark, swapping") + U.log("between its two frames about twice a second, and it moves with") + U.log("up/down while Chris stays put. shots are in " .. out .. ".") + U.log("the arrow cursor instead of a mon is the bug. a mon in a solid white") + U.log("box is the near miss -- the icon is right, the palette bake is not.") + if fails > 0 then + U.log(("%d assertion(s) failed above; the picture below is not worth") + :format(fails)) + U.log("reading until those are green.") + end + U.log("the picker is open and the controls are yours.") + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/gold_frame_seams.lua b/tests/drivers/gold_frame_seams.lua index 68526a20..e09d8639 100644 --- a/tests/drivers/gold_frame_seams.lua +++ b/tests/drivers/gold_frame_seams.lua @@ -8,22 +8,27 @@ -- Two halves, and the second is the one that matters. A hook that fires is -- easy; a hook that fires and MOVES A PIXEL is worse than no hook at all, -- because it silently changes what every existing Gold screenshot means. So --- this shoots the overworld, a menu over the overworld, CLASSIC, and CLASSIC + --- GBC FX with nothing subscribed, wraps all six hooks with pass-throughs that --- draw nothing, shoots the same four frames again, and compares the PNG bytes. +-- this shoots the overworld, CLASSIC, and a menu over the overworld with +-- nothing subscribed, wraps all six hooks with pass-throughs that draw +-- nothing, shoots the same three frames again, and compares the PNG bytes. -- Identical files are the claim; the shots are left on disk either way so a -- human can look at the picture the port is actually producing. -- --- The four frames are chosen to cover every branch of Game2:draw: no canvas at --- all, the zone pass alone, the zone pass into a texture GBC FX then reads, and --- (once the wraps are on) the render.compose path that forces a canvas even --- when no display mode wanted one. +-- The three frames are chosen to cover every branch of Game2:draw: no canvas +-- at all, the zone pass alone, and (once the wraps are on) the render.compose +-- path that forces a canvas even when no display mode wanted one. +-- +-- The zone-pass-into-a-texture-then-reread branch (`reread` in +-- Game2:drawViewportFrame, formerly exercised by CLASSIC + GBC FX before +-- GBCFX.lua's removal) is not covered here any more: +-- ShaderFX is the only thing left that triggers it, and activating it needs +-- a converted on-disk preset this headless driver does not set up. Flagged, +-- not silently dropped. local U = require("tests.drivers.util") local Runtime = require("src.mods.Runtime") local Hooks = require("src.mods.Hooks") local GbcPalette = require("src.render.GbcPalette") -local GBCFX = require("src.render.GBCFX") local OWNER = "driver_frame_seams" @@ -50,23 +55,17 @@ return function(game) U.wait(45) assert(game.world and game.world.map, "gold world did not boot") - -- The four frames, each named for the display state it exercises. `fx` is - -- requested rather than asserted: GBCFX.isSupported refuses on mobile GPUs - -- and a headless checkout may have no shader at all, in which case that - -- frame simply repeats the CLASSIC one and the comparison still means - -- something. + -- The three frames, each named for the display state it exercises. local frames = { - { name = "world", color = "gbc", fx = 0 }, - { name = "classic", color = "classic", fx = 0 }, - { name = "classicfx", color = "classic", fx = 2 }, - { name = "menu", color = "gbc", fx = 0, menu = true }, + { name = "world", color = "gbc" }, + { name = "classic", color = "classic" }, + { name = "menu", color = "gbc", menu = true }, } local function shoot(tag) local menuOpen = false for _, frame in ipairs(frames) do GbcPalette.setMode(frame.color) - GBCFX.setLevel(frame.fx) if frame.menu and not menuOpen then game:openStartMenu() menuOpen = true @@ -82,7 +81,6 @@ return function(game) U.wait(8) end GbcPalette.setMode("gbc") - GBCFX.setLevel(0) end -- POKEPORT_SEAM_BASELINE= shoots the four frames under that tag and diff --git a/tests/drivers/gold_ledge_hop_bug1713_test.lua b/tests/drivers/gold_ledge_hop_bug1713_test.lua new file mode 100644 index 00000000..10c4084e --- /dev/null +++ b/tests/drivers/gold_ledge_hop_bug1713_test.lua @@ -0,0 +1,272 @@ +-- #1713: a ledge hop advanced only every other logic frame, so the whole map +-- scrolled at 30Hz in 2px lurches and the sprite bobbed against its own arc. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_ledge_hop_bug1713_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-ledge \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- jump_step is STEP_WALK (pokegold/engine/overworld/movement.asm:595-597), so +-- StepFunction_PlayerJump runs the `db 0, 2, 8, 2` StepVectors row as two +-- 8-frame beats (engine/overworld/map_objects.asm:365-381, :1163-1200) and +-- UpdateJumpPosition walks its 16-entry arc one entry a frame (:1796-1817). +-- We render at twice that resolution, so the hop owes 1px and half an arc +-- entry on every one of its 32 frames. +-- +-- No POKEPORT_SPEED here on purpose: the whole subject is per-frame motion, +-- and fast-forward scales only the logic clock. +local U = require("tests.drivers.util") + +local Player = require("src.world.gen2.Player") +local Permissions = require("src.world.gen2.Permissions") + +-- ROUTE_30's ledge run at y=10 (data/generated/maps.lua, TILESET_JOHTO +-- collision $a3 COLL_HOP_DOWN): open ground two cells above it, a wall in +-- between, floor on the landing. Re-derived by scanning if a re-import moves. +local MAP = "ROUTE_30" +local LEDGE = { x = 4, y = 10 } + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-ledge" + local fails, lines = 0, {} + + local function claim(ok, text) + if not ok then fails = fails + 1 end + lines[#lines + 1] = (ok and "PASS " or "FAIL ") .. text + return ok + end + + local function stop() + for _, line in ipairs(lines) do U.log(line) end + while true do coroutine.yield() end + end + + U.wait(45) + local world = game.world + if not (world and world.map) then + U.log("FAIL the gold world never booted, nothing to look at") + while true do coroutine.yield() end + end + + claim(Player.STEP_FRAMES == 16, "a walk is 16 logic frames per cell") + claim(type(world.tryLedgeJump) == "function", + "World:tryLedgeJump is wired for the refused step to fall into") + + -- ---- find a ledge with room to run up to it ------------------------------ + world:setMap(MAP, LEDGE.x, LEDGE.y - 2, "down") + U.wait(10) + world.noWildEncounters = true + local map = world.map + + local function hopsDown(x, y) + if not map:inBounds(x, y) then return false end + local facings = Permissions.ledgeFacings(map:cellCollision(x, y)) + return facings ~= nil and facings.down == true + end + local function walkable(x, y) + return map:inBounds(x, y) and map:isWalkable(x, y) + end + -- A usable ledge: two free cells to walk down through, a refused cell in the + -- middle (that refusal is what becomes the jump) and a free landing. + local function usable(x, y) + return hopsDown(x, y) and not walkable(x, y + 1) and walkable(x, y + 2) + and walkable(x, y - 1) and walkable(x, y - 2) + end + + local target + if usable(LEDGE.x, LEDGE.y) then target = { x = LEDGE.x, y = LEDGE.y } end + if not target then + local def = world.maps[MAP] + for y = 0, (def.height or 0) * 2 - 1 do + for x = 0, (def.width or 0) * 2 - 1 do + if not target and usable(x, y) then target = { x = x, y = y } end + end + end + end + claim(target ~= nil, + ("%s still has a hop-down ledge with a run-up to it"):format(MAP)) + if not target then + U.log("nothing to hop off; stopping rather than parking you at a wall") + stop() + end + if target.x ~= LEDGE.x or target.y ~= LEDGE.y then + U.log(("note: using the ledge at (%d,%d), not the (%d,%d) in the header") + :format(target.x, target.y, LEDGE.x, LEDGE.y)) + end + local START = { x = target.x, y = target.y - 2 } + + local function press(dir) + table.insert(game.input.pressQueue, dir) + game.input.state[dir] = true + coroutine.yield() + end + + -- Back to the top of the run-up. The settle first is load bearing: a + -- setMap on top of a hop that is still in the air carries the leftover jump + -- into the new position and the next run measures nonsense. + local function reset() + game.input.state.down = false + for _ = 1, 120 do + if not (world.player and world.player.moving) then break end + coroutine.yield() + end + world:setMap(MAP, START.x, START.y, "down") + world.noWildEncounters = true + U.wait(8) + end + + -- ---- the run-up and the hop, measured ------------------------------------ + -- + -- Nobody can count pixels per frame by eye, and this is the whole bug: the + -- per-frame travel of the camera-following position, plus the arc riding on + -- top of it. Every sample is "pixels travelled == frames elapsed", never a + -- difference between two driver frames -- the fixed-step loop can run two + -- logic steps for one yield, and a delta would read that as a lurch. + reset() + local p = world.player + local hopRows, takeoff = {}, 0 + local walkSeen, walkWrong = 0, 0 + for _ = 1, 240 do + press("down") + if p.jumping then + if #hopRows == 0 then takeoff = p.cellY * 16 end + hopRows[#hopRows + 1] = { n = p.progress, py = p.py, + off = p.spriteYOffset or 0 } + elseif #hopRows > 0 then + break + elseif p.moving and (p.progress or 0) > 0 then + walkSeen = walkSeen + 1 + if p.py - p.cellY * 16 ~= p.progress then walkWrong = walkWrong + 1 end + end + end + game.input.state.down = false + + local wrong, lurch, last = 0, 0, 0 + for _, r in ipairs(hopRows) do + if r.py - takeoff ~= r.n then wrong = wrong + 1 end + if r.n > last then last = r.n end + end + -- The old quantum, named directly: an even number of pixels on an odd frame. + for _, r in ipairs(hopRows) do + if (r.py - takeoff) % 2 == 0 and r.n % 2 == 1 then lurch = lurch + 1 end + end + + claim(#hopRows > 0, "walking down into the ledge started a hop") + claim(last >= 30, + ("the hop ran its full 32 frames (the last one sampled was %d)") + :format(last)) + claim(p.cellY == target.y + 2, + ("it landed two cells down at y=%d (the player is at y=%d)") + :format(target.y + 2, p.cellY)) + claim(p.py - takeoff == 32, + ("and 32 pixels down, which is two cells (it moved %d)") + :format(p.py - takeoff)) + claim(wrong == 0, + ("on every one of the %d frames sampled the player had moved a pixel per" + .. " frame elapsed (%d had not)"):format(#hopRows, wrong)) + claim(lurch == 0, + ("so no frame of it stood still waiting to lurch two (%d did)") + :format(lurch)) + claim(walkSeen > 0 and walkWrong == 0, + ("the two ordinary steps before it move a pixel a frame too, on all %d" + .. " frames sampled (%d wrong)"):format(walkSeen, walkWrong)) + + -- The composed screen position: the camera-following py plus the sprite + -- offset. The armed frame is skipped because the first frame after it is + -- the take-off, and rising there is the jump starting. + local air, back = {}, 0 + for _, r in ipairs(hopRows) do + if r.n >= 1 then air[#air + 1] = r.py + r.off end + end + for i = 2, #air do + if air[i] < air[i - 1] then back = back + 1 end + end + claim(back == 0, + ("after the take-off the sprite never reversed against its own arc" + .. " (%d frames did)"):format(back)) + + -- ---- one frame per run, so the strip really is consecutive --------------- + -- + -- A capture costs the driver an unknown number of frames, so shooting four + -- frames in one hop would skip some. Four identical run-ups, each shot on a + -- different frame, gives a strip that can be flipped through. + -- One run-up, ending either on the frame asked for or on the landing. The + -- fixed-step loop can occasionally run two logic steps for one driver yield, + -- so the shot is taken at the first frame AT OR PAST the one asked for, and + -- the frame it actually landed on is reported rather than assumed. + local function hopRun(frame, path) + reset() + local airborne = false + for _ = 1, 240 do + press("down") + local pl = world.player + if pl.jumping then + airborne = true + if frame and pl.progress >= frame then + local at, py = pl.progress, pl.py + game.input.state.down = false + U.shot(game, path) + return at, py + end + elseif airborne then + break + end + end + game.input.state.down = false + end + + reset() + U.shot(game, out .. "/01-standing.png") + local strip = {} + for i, frame in ipairs({ 12, 13, 14, 15 }) do + local at, py = hopRun(frame, ("%s/02-strip-%d.png"):format(out, i)) + strip[#strip + 1] = { at = at or -1, py = py or -1 } + end + hopRun(4, out .. "/03-rising.png") + hopRun(16, out .. "/04-peak.png") + hopRun(28, out .. "/05-falling.png") + hopRun() + U.wait(20) + U.shot(game, out .. "/06-landed.png") + + local consecutive = true + local shown = {} + for i, s in ipairs(strip) do + shown[i] = ("%d"):format(s.at) + if i > 1 and (s.at - strip[i - 1].at ~= 1 + or s.py - strip[i - 1].py ~= 1) then + consecutive = false + end + end + claim(consecutive, + ("the strip really is four consecutive frames, %s -- if this is FAIL the" + .. " images are not comparable"):format(table.concat(shown, ", "))) + + for _, line in ipairs(lines) do U.log(line) end + U.log(("%d checks, %d failed"):format(#lines, fails)) + if fails > 0 then + U.log("something above is FAIL, so do not spend time watching the replay") + end + + -- ---- the replay, live ---------------------------------------------------- + U.log("shots are in " .. out .. "; 02-strip-* are consecutive frames of the") + U.log("same hop, so the ground should shift one pixel between each, and") + U.log("03 / 04 / 05 are the rise, the top of the arc and the drop.") + U.log("the replay walks down into the ledge three times, then hands over.") + U.wait(120) + for _ = 1, 3 do + hopRun() + U.wait(60) + end + + U.log("two ordinary steps down, then the hop: the map should scroll at the") + U.log("same speed through all three, and the sprite should rise, hang and") + U.log("fall once. a stutter, a 2px lurch, or the sprite bobbing back up") + U.log("during the rise is the old behaviour.") + U.log("the near miss to watch for: a smooth hop that clears only one cell,") + U.log("or one that takes twice as long as it should -- that is the two-cell") + U.log("span applied without the doubled duration.") + U.log("gen 1 is the reference; a Red ledge hop already looked like this.") + while true do coroutine.yield() end +end diff --git a/tests/drivers/gold_ow_bounce_bug1748_test.lua b/tests/drivers/gold_ow_bounce_bug1748_test.lua new file mode 100644 index 00000000..da492890 --- /dev/null +++ b/tests/drivers/gold_ow_bounce_bug1748_test.lua @@ -0,0 +1,328 @@ +-- #1748: overworld Pokemon objects (SPRITEMOVEDATA_POKEMON, $16) never bounce. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_ow_bounce_bug1748_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-bounce \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- The $16 row is SPRITEMOVEFN_BOUNCE + OBJECT_ACTION_BOUNCE +-- (data/sprites/map_objects.asm:181-187). SetFacingBounce steps +-- OBJECT_STEP_FRAME once a frame and reads bit 3, swapping FACING_STEP_DOWN_0 +-- for FACING_STEP_UP_0 -- eight frames on each (map_object_action.asm:184-202). +-- Its frozen column, SetFacingFreezeBounce, pins FACING_STEP_DOWN_0. +-- +-- No POKEPORT_SPEED here on purpose: an eight-frame dwell is the whole thing +-- being watched, and fast-forward scales only the logic clock. +local U = require("tests.drivers.util") + +local NPC = require("src.world.gen2.Npc") + +-- ../pokegold/maps/PokemonFanClub.asm:311-316 -- the bouncing SPRITE_ODDISH at +-- (7,3) shares the room with a SPRITE_FAIRY doll at (2,4) on +-- SPRITEMOVEDATA_STANDING_DOWN, which is the negative control standing next to +-- it. ../pokegold/maps/PewterPokecenter1F.asm is the reporter's own room. +local ROOM = { map = "POKEMON_FAN_CLUB", x = 7, y = 3 } +local PEWTER = { map = "PEWTER_POKECENTER_1F", x = 1, y = 3 } + +local SPRITEMOVEDATA_POKEMON = 0x16 +local DELTA = { + up = { 0, -1 }, down = { 0, 1 }, left = { -1, 0 }, right = { 1, 0 }, +} +local FACE_FROM = { up = "down", down = "up", left = "right", right = "left" } + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-bounce" + local fails, lines = 0, {} + + local function claim(ok, text) + if not ok then fails = fails + 1 end + lines[#lines + 1] = (ok and "PASS " or "FAIL ") .. text + return ok + end + + local function stop(why) + for _, line in ipairs(lines) do U.log(line) end + U.log(why) + while true do coroutine.yield() end + end + + U.wait(45) + local world = game.world + if not (world and world.map) then + U.log("FAIL the gold world never booted, nothing to look at") + while true do coroutine.yield() end + end + + -- ---- the things a human's eyes cannot check ------------------------------ + -- + -- Every one of these fails as silence: a missing movement byte, a sheet with + -- no second frame and a doll that quietly took the animation all look exactly + -- like "the object sits there", which is also what the bug looked like. + claim(NPC.MOVE.POKEMON == SPRITEMOVEDATA_POKEMON, + "SPRITEMOVEDATA_POKEMON is modelled as $16") + claim(type(NPC.bounceFrame) == "function", + "NPC:bounceFrame exists for the draw call to spend") + + local function findObject(mapId, x, y) + local def = world.maps[mapId] + if not def then return nil end + local exact, any + for _, obj in ipairs(def.objects or {}) do + if obj.movement == SPRITEMOVEDATA_POKEMON then + any = any or obj + if obj.x == x and obj.y == y then exact = obj end + end + end + return exact or any + end + + local monDef = findObject(ROOM.map, ROOM.x, ROOM.y) + claim(monDef ~= nil, + ("%s still carries a $16 object"):format(ROOM.map)) + if not monDef then + stop("no bouncing object on the map; stopping rather than faking the moment") + end + if monDef.x ~= ROOM.x or monDef.y ~= ROOM.y then + U.log(("note: using the mon at (%d,%d), not the (%d,%d) in the header") + :format(monDef.x, monDef.y, ROOM.x, ROOM.y)) + end + + local sheet = type(monDef.sprite) == "string" + and world.sprites and world.sprites[monDef.sprite] + claim(sheet ~= nil, + ("its sprite %s resolves to a sheet"):format(tostring(monDef.sprite))) + claim(sheet and (sheet.frames or 1) >= 2, + ("and that sheet is two frames deep (frames = %s) -- one frame is the half" + .. " of #1748 a re-import fixes"):format(sheet and tostring(sheet.frames))) + claim(world.scripts and world.scripts[monDef.scriptKey] ~= nil, + ("its script %s is in the cache, so the A press below opens a box") + :format(tostring(monDef.scriptKey))) + + -- ---- walk in and stand in front of it ------------------------------------ + world:setMap(ROOM.map, monDef.x, monDef.y + 1, "up") + U.wait(20) + local map = world.map + + -- Stand on the mon's neighbour and face back at it; any free neighbour will + -- do, so a re-import that shuffles the room degrades instead of parking the + -- player at a wall. + local spot + for _, dir in ipairs({ "down", "left", "right", "up" }) do + local d = DELTA[dir] + local x, y = monDef.x + d[1], monDef.y + d[2] + if not spot and map:isWalkable(x, y) then + spot = { x = x, y = y, facing = FACE_FROM[dir] } + end + end + claim(spot ~= nil, "there is a free cell beside it to stand on") + if not spot then + stop("nowhere to stand; stopping rather than parking the player at a wall") + end + world:setMap(ROOM.map, spot.x, spot.y, spot.facing) + U.wait(20) + + local mon, dolls = nil, {} + for _, npc in ipairs(world.npcs or {}) do + if npc.def == monDef then mon = npc + elseif npc.def and npc.def.movement ~= SPRITEMOVEDATA_POKEMON then + dolls[#dolls + 1] = npc + end + end + claim(mon ~= nil, "the object spawned as an NPC") + if not mon then stop("the mon never spawned; nothing to watch") end + claim(mon.bouncing == true, "and it spawned bouncing") + + local stillBouncers = 0 + for _, npc in ipairs(dolls) do + if npc.bouncing then stillBouncers = stillBouncers + 1 end + end + claim(stillBouncers == 0, + ("none of the %d other objects in the room bounce -- the Clefairy doll" + .. " beside it must not move"):format(#dolls)) + + -- ---- the cycle, measured on the logic clock ------------------------------ + -- One sample per frame, and the run lengths are what SetFacingBounce's bit 3 + -- decides. Measured rather than eyeballed because four flips a second is + -- exactly the rate a human reads as "about right" when it is wrong. + local samples = {} + for i = 1, 96 do + samples[i] = mon:bounceFrame() + coroutine.yield() + end + local runs, values = {}, {} + for i = 1, #samples do + if i > 1 and samples[i] == samples[i - 1] then + runs[#runs] = runs[#runs] + 1 + else + runs[#runs + 1] = 1 + values[#values + 1] = samples[i] + end + end + claim(#runs >= 5, ("the pose changed %d times in 96 frames"):format(#runs - 1)) + local alternates, dwell, uneven = true, nil, nil + for i = 2, #runs - 1 do + dwell = dwell or runs[i] + if runs[i] ~= dwell then uneven = uneven or runs[i] end + if values[i] == values[i - 1] then alternates = false end + end + claim(alternates and values[1] ~= nil, + "it alternates between two poses and only two") + claim(uneven == nil, ("every whole dwell is the same length" + .. (uneven and (" -- saw %d and %d"):format(dwell or 0, uneven) or ""))) + claim(dwell == 8, ("and it is the eight frames bit 3 buys (measured %s)") + :format(tostring(dwell))) + + -- ---- what the renderer was actually handed ------------------------------- + -- A bounce the draw call drops looks exactly like no bounce, and a doll that + -- picked the override up is the other way to pass this by accident. + local seen, watched = {}, { { key = "mon", npc = mon } } + for i, npc in ipairs(dolls) do + watched[#watched + 1] = { key = "doll" .. i, npc = npc } + end + for _, row in ipairs(watched) do + local sprite = row.npc.sprite + row.sprite, row.real = sprite, sprite.draw + seen[row.key] = {} + sprite.draw = function(s, ...) + local args = { ... } + local log = seen[row.key] + -- "none" rather than a hole, so a sprite that was never drawn at all is + -- not mistaken for one that was drawn with no override. + log[#log + 1] = args[10] == nil and "none" or args[10] + return row.real(s, ...) + end + end + U.wait(40) + for _, row in ipairs(watched) do row.sprite.draw = row.real end + + local monPoses = {} + for _, v in ipairs(seen.mon) do monPoses[v] = true end + claim(#seen.mon > 0, "the mon was drawn") + claim(monPoses[0] and monPoses[1], + "and both icon frames reached SpriteRenderer over 40 frames") + local dollDraws, dollOverrides = 0, 0 + for i = 1, #dolls do + for _, v in ipairs(seen["doll" .. i] or {}) do + dollDraws = dollDraws + 1 + if v ~= "none" then dollOverrides = dollOverrides + 1 end + end + end + claim(dollDraws > 0, ("the other %d objects were drawn too"):format(#dolls)) + claim(dollOverrides == 0, "and not one of them was handed a frame override") + + -- ---- the pair of shots --------------------------------------------------- + -- The counter is held while each capture lands so the file is definitely one + -- pose rather than whichever the spin drifted onto; the cycle above is what + -- proves it runs on its own. + local function holdShot(path, step) + os.execute('mkdir -p "' .. path:match("^(.*)/[^/]+$") .. '" 2>/dev/null') + game.capturePath = path + for _ = 1, 120 do + mon.bounceStep = step + if not game.capturePath then break end + coroutine.yield() + end + mon.bounceStep = step + coroutine.yield() + local f = io.open(path, "rb") + if not f then return nil end + local bytes = f:read("*a") + f:close() + return bytes + end + + local down = holdShot(out .. "/01-pose-down.png", 0) + local up = holdShot(out .. "/02-pose-up.png", 8) + claim(down ~= nil and up ~= nil, "both pose shots reached disk") + claim(down and up and down ~= up, + "and the two files differ, so the screen really changes between poses") + + -- ---- talking to it holds the first pose ---------------------------------- + -- OBJECT_ACTION_BOUNCE's frozen column is SetFacingFreezeBounce, which writes + -- FACING_STEP_DOWN_0 and never touches the counter. + mon.bounceStep = 12 + local phaseBefore = mon.bounceStep + U.tap(game, "a") + U.wait(30) + claim(world.talkNpc == mon or mon.frozen, + "the A press reached the mon and froze it") + local heldWrong = nil + for _ = 1, 60 do + if mon:bounceFrame() ~= 0 then heldWrong = mon:bounceFrame() end + coroutine.yield() + end + claim(heldWrong == nil, + "and it holds its first pose for the whole conversation") + claim(mon.bounceStep == phaseBefore, + ("with the step counter left at %d, so the bounce resumes on the phase it" + .. " froze at (it is %s)"):format(phaseBefore, tostring(mon.bounceStep))) + U.shot(game, out .. "/03-frozen-talking.png") + + U.tap(game, "a") + U.wait(40) + U.tap(game, "a") + U.wait(40) + + -- ---- the reporter's own room --------------------------------------------- + local pewterDef = findObject(PEWTER.map, PEWTER.x, PEWTER.y) + if not pewterDef then + U.log("note: no $16 object on " .. PEWTER.map .. ", skipping its shots") + else + world:setMap(PEWTER.map, pewterDef.x, pewterDef.y + 2, "up") + U.wait(30) + local jiggly + for _, npc in ipairs(world.npcs or {}) do + if npc.def == pewterDef then jiggly = npc end + end + claim(jiggly ~= nil and jiggly.bouncing == true, + ("the %s at (%d,%d) bounces too"):format(PEWTER.map, + pewterDef.x, pewterDef.y)) + if jiggly then + local a, b + local function pin(path, step) + os.execute('mkdir -p "' .. path:match("^(.*)/[^/]+$") .. '" 2>/dev/null') + game.capturePath = path + for _ = 1, 120 do + jiggly.bounceStep = step + if not game.capturePath then break end + coroutine.yield() + end + coroutine.yield() + local f = io.open(path, "rb") + if not f then return nil end + local bytes = f:read("*a") + f:close() + return bytes + end + a = pin(out .. "/04-pewter-down.png", 0) + b = pin(out .. "/05-pewter-up.png", 8) + claim(a ~= nil and b ~= nil and a ~= b, + "and its two pose shots differ as well") + end + end + + for _, line in ipairs(lines) do U.log(line) end + U.log(("%d checks, %d failed"):format(#lines, fails)) + if fails > 0 then + U.log("something above says FAIL, so do not spend time watching the room.") + end + + -- ---- what to look at ----------------------------------------------------- + U.log("shots are in " .. out .. ". 01 and 02 are the two poses of the same") + U.log("mon; they should look like the two halves of its party menu icon,") + U.log("the second one sitting a pixel or two differently. 03 is the same mon") + U.log("mid-conversation, which must match 01.") + U.log("") + U.log("the run ends back in the Fan Club with the Oddish on screen at (7,3).") + U.log("it should visibly flip between its two icon poses about four times a") + U.log("second, without moving off its tile or turning to face anything.") + U.log("the Clefairy doll at (2,4) and the people in the room must stay dead") + U.log("still: a doll that bobs means the bounce got keyed off the sprite") + U.log("instead of the movement byte. a mon that keeps bobbing while its text") + U.log("box is open is the other near miss -- it must hold one pose there and") + U.log("pick the cycle back up where it left off when the box closes.") + + world:setMap(ROOM.map, spot.x, spot.y, spot.facing) + while true do coroutine.yield() end +end diff --git a/tests/drivers/gold_pack_rows_bug1695_test.lua b/tests/drivers/gold_pack_rows_bug1695_test.lua new file mode 100644 index 00000000..2efb9cf7 --- /dev/null +++ b/tests/drivers/gold_pack_rows_bug1695_test.lua @@ -0,0 +1,243 @@ +-- The PACK's TM/HM rows (#1695), the list cursor's colour (#1694) and the rows +-- a message prints on in the description box (#1725). +-- engine/items/tmhm.asm:355-403 and engine/gfx/cgb_layouts.asm:723-726 (pokegold). +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_pack_rows_bug1695_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-pack-rows love . +-- +-- No POKEPORT_SPEED: it scales the logic clock only, so every shot here would +-- race the keypress that redrew the list. +local U = require("tests.drivers.util") + +local Bag = require("src.inventory.Bag") +local GbcPalette = require("src.render.GbcPalette") +local PackMenu = require("src.ui.gen2.PackMenu") + +-- ../pokecrystal/maps/NewBarkTown.asm:287 -- the tile in front of the player's +-- own front door. An outdoor map is what makes the ESCAPE ROPE below print +-- OakThisIsntTheTimeText instead of warping the PACK shut. +local HOME = { map = "NEW_BARK_TOWN", x = 13, y = 6 } + +-- One-digit and two-digit counts side by side, both HM ends of the pocket, and +-- the two key items whose submenus reach a SEL and a USE. +local SEED = { + { "POTION", 5 }, + { "SUPER_POTION", 50 }, + { "ESCAPE_ROPE", 3 }, + { "POKE_BALL", 7 }, + { "GREAT_BALL", 12 }, + { "ITEMFINDER", 1 }, + { "BICYCLE", 1 }, + { "TM_DYNAMICPUNCH", 1 }, + { "TM_HEADBUTT", 3 }, + { "TM_THUNDER", 24 }, + { "HM_CUT", 1 }, + { "HM_SURF", 1 }, + { "HM_WATERFALL", 1 }, +} + +-- TM/HM pocket order is wTMsHMs order (engine/items/tmhm.asm:341), and each row +-- carries the number the cart prints at column 5 and the move name at column 8. +local TMHM = { + { "TM_DYNAMICPUNCH", "01", "DYNAMICPUNCH" }, + { "TM_HEADBUTT", "02", "HEADBUTT" }, + { "TM_THUNDER", "25", "THUNDER" }, + { "HM_CUT", "H1", "CUT" }, + { "HM_SURF", "H3", "SURF" }, + { "HM_WATERFALL", "H7", "WATERFALL" }, +} + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-pack-rows" + local failed = 0 + + local function pass(ok, line) + if not ok then failed = failed + 1 end + U.log((ok and "PASS " or "FAIL ") .. line) + end + + local function shot(name) + U.wait(4) + U.shot(game, ("%s/%s.png"):format(out, name)) + end + + local function tap(button, frames) + U.tap(game, button) + U.wait(frames or 5) + end + + U.wait(45) + assert(game.world and game.world.map, "gold world did not boot") + + local world, save = game.world, game.save + + -- A later map edit must not park the player against a wall: try the door + -- tile, then any free neighbour of it. + local placed = world:setMap(HOME.map, HOME.x, HOME.y, "down") + if not placed then + for _, step in ipairs({ { 0, -1 }, { 1, 0 }, { -1, 0 }, { 0, 1 } }) do + placed = world:setMap(HOME.map, HOME.x + step[1], HOME.y + step[2], "down") + if placed then break end + end + end + U.wait(12) + + local mapId = world.map and world.map.id + local env = world.map and world.map.def and world.map.def.environment + pass(placed and env ~= "CAVE" and env ~= "DUNGEON", + ("standing in %s (environment %s), where an ESCAPE ROPE has nowhere to " .. + "pay out to"):format(tostring(mapId), tostring(env))) + + save.inventory = {} + save.bagOrder = {} + for _, entry in ipairs(SEED) do + local id, count = entry[1], entry[2] + if game.data.items and game.data.items[id] then + save.inventory[id] = count + table.insert(save.bagOrder, id) + else + pass(false, id .. " is not in this cache, so its row will be missing") + end + end + Bag.order(save, { items = game.data.items }) + + -- A probe pack for the checks, so the one on screen opens on a clean cursor. + local probe = PackMenu.new(game, { save = save, world = world, + pocket = "TM_HM" }) + + for i, want in ipairs(TMHM) do + local row = probe.rows[i] + pass(row and row.id == want[1] and row.tmhmLabel == want[2], + ("row %d is %s and its number reads %q (got %s / %s)"):format( + i, want[1], want[2], tostring(row and row.id), + tostring(row and row.tmhmLabel))) + pass(row and row.teaches == want[3], + ("row %d prints the move name %q rather than the item name %s"):format( + i, want[3], tostring(row and row.name))) + end + + pass(probe.gfx and probe.gfx:available(), + "this cache has the PACK's own tiles, so the screen is the cart's chrome " .. + "and not the fallback boxes") + pass(GbcPalette.available(), + "the palette shader is loaded, so a coloured cursor is drawable at all") + pass(GbcPalette.mode == "gbc", + ("colour mode is %q; anything else draws the cursor in DMG greys and " .. + "looks exactly like the bug"):format(tostring(GbcPalette.mode))) + + local cursorPal = probe.gfx and probe.gfx:available() + and probe.gfx:colorsAt(7, 2) + local ink = cursorPal and cursorPal[4] + pass(ink and ink[1] == 255 and ink[2] == 0 and ink[3] == 0, + ("the cursor column (7,2) resolves to a palette whose colour 3 is " .. + "255,0,0 (got %s)"):format(ink and table.concat(ink, ",") or "nil")) + local lastPal = probe.gfx and probe.gfx:available() + and probe.gfx:colorsAt(7, 10) + pass(lastPal == cursorPal, + "and the fifth list row's cursor cell (7,10) is in the same 1x9 zone") + + local finder = game.data.items and game.data.items.ITEMFINDER + pass(finder and finder.canSelect == true and world.registerItem ~= nil, + "the ITEMFINDER is registerable, so SEL prints \"Registered the\" and " .. + "not the refusal") + local rope = game.data.items and game.data.items.ESCAPE_ROPE + pass(rope and rope.fieldMenu ~= "ITEMMENU_NOUSE", + "the ESCAPE ROPE's submenu carries a USE row to reach the three-line " .. + "OAK message with") + + if failed > 0 then + U.log(("%d check(s) failed above, so the shots below cannot be read as " .. + "a pass."):format(failed)) + end + + game.packCursor = nil + local pack = PackMenu.new(game, { save = save, world = world, + onClose = function() game.stack:pop() end }) + game.stack:push(pack) + + U.log("00-items: the arrow beside POTION should be the same red as the") + U.log("pocket plaque on the left, not black. black in every pocket means") + U.log("the palette never reached it (#1694).") + shot("00-items") + + tap("select") + tap("down") + U.log("01-items-select: row 1 now carries the hollow arrow and row 2 the") + U.log("solid one, both red. \"Where should this\" / \"be moved to?\" sit on") + U.log("rows 14 and 16 with a blank row between them (#1725).") + U.log("switching row is " .. tostring(pack.switching) .. + ", cursor on " .. tostring(pack.index)) + shot("01-items-select") + tap("b") + tap("up") + + tap("right") + shot("02-balls") + tap("right") + shot("03-key-items") + U.log("02 and 03: same red arrow in POKe BALLS and KEY ITEMS.") + + tap("right") + U.log("04-tmhm-top: the rows read \"01 DYNAMICPUNCH\", \"02 HEADBUTT\",") + U.log("\"25 THUNDER\", \"H1 CUT\", \"H3 SURF\". the number is hard against the") + U.log("left edge of the item area where the blue pattern column ends, the") + U.log("arrow one tile later, the move name from column 8. the word TM or HM") + U.log("printed anywhere, or a right-aligned number, is the bug (#1695).") + U.log("pocket is " .. tostring(pack:pocket().id) .. + " with " .. tostring(#pack.rows) .. " rows") + shot("04-tmhm-top") + + for _ = 1, 5 do tap("down") end + U.log("05-tmhm-hms: scrolled to the last HM. \"H7 WATERFALL\" reads with a") + U.log("single digit and no count; \"H07\" would mean the TM branch took it.") + U.log("the three TM rows above it still carry their xNN on the line below.") + shot("05-tmhm-hms") + + tap("left") + tap("left") + tap("left") + tap("a") + tap("down") + tap("down") + tap("a") + U.log("06-toss-how-many: \"Throw away how\" on row 14 and \"many?\" on row 16,") + U.log("with a full blank row between them and the first line clear of the") + U.log("box's top border. adjacent lines mean the message path is still") + U.log("single-spaced (#1725).") + U.log("message is " .. + (pack.message and table.concat(pack.message, " / ") or "nil")) + shot("06-toss-how-many") + + tap("b") + tap("down") + tap("down") + tap("a") + tap("a") + U.log("07-oak-three-lines: a message too tall for two rows still packs one") + U.log("row apart, so \"OAK: GOLD!\" / \"This isn't the\" / \"time to use that!\"") + U.log("fill rows 13, 14 and 15. a gap here would clip the third line.") + U.log("message is " .. + (pack.message and table.concat(pack.message, " / ") or "nil")) + shot("07-oak-three-lines") + + tap("b") + tap("right") + tap("right") + tap("a") + tap("down") + tap("a") + U.log("08-registered: the case the report filed. \"Registered the\" on row 14") + U.log("and \"ITEMFINDER.\" on row 16, lining up with the item description") + U.log("that shares this box. row 13 plus row 14 is the old behaviour; row 15") + U.log("plus a clipped row 17 means the offset went the other way.") + U.log("message is " .. + (pack.message and table.concat(pack.message, " / ") or "nil")) + shot("08-registered") + + U.log("shots in " .. out .. "; the PACK is open on KEY ITEMS, controls yours") + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/gold_shaderfx_menu_black_crop_test.lua b/tests/drivers/gold_shaderfx_menu_black_crop_test.lua new file mode 100644 index 00000000..0e3cbbb9 --- /dev/null +++ b/tests/drivers/gold_shaderfx_menu_black_crop_test.lua @@ -0,0 +1,90 @@ +-- Regression test: with SHADER FX active on Gen 2 (Gold), opening the +-- START menu used to render as a flat black fill +-- instead of menu content. Root cause: ShaderFX.lua's cropToGbSource() +-- samples the scene canvas via love.graphics.draw(), which multiplies by +-- the current draw color -- the menu's own drawing (black text/border) +-- left that color at (0,0,0,1) and never reset it, so cropToGbSource's own +-- draw silently multiplied its whole output to black. push("all") at the +-- top of cropToGbSource saves/restores state for its caller but does not +-- reset color, so the function must set its own white explicitly rather +-- than trust whatever the caller left active. Fixed by an explicit +-- love.graphics.setColor(1, 1, 1, 1) immediately before that draw call. +-- +-- Samples ShaderFX._lastCrop directly rather than a screenshot of the +-- final window: ShaderFX.render() always draws the correct, unmodified +-- `canvas` as a base layer before compositing the (possibly-broken) shader +-- chain output on top, so a whole-window screenshot stays mostly readable +-- even when the crop itself is fully black -- it just loses the shader +-- effect under a faint dark overlay. Only the crop canvas itself catches +-- the bug precisely. +-- +-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/gold_shaderfx_menu_black_crop_test.lua \ +-- lovec.exe . +-- +-- Skips itself (does not fail) if no ShaderFX preset is installed in the +-- save dir's shaders/ folder (see ShaderFX.presetDir()) -- this test needs +-- a real preset to exercise cropToGbSource at all. +local U = require("tests.drivers.util") +local StartMenu = require("src.ui.gen2.StartMenu") + +-- Same 4x4-grid luminance-range technique this bug was originally +-- characterized with. +local function luminanceRange(canvas) + local id = canvas:newImageData() + local w, h = id:getDimensions() + local minL, maxL = 1, 0 + for gy = 0, 3 do + for gx = 0, 3 do + local x = math.min(w - 1, math.floor((gx + 0.5) * w / 4)) + local y = math.min(h - 1, math.floor((gy + 0.5) * h / 4)) + local r, g, b = id:getPixel(x, y) + local l = 0.299 * r + 0.587 * g + 0.114 * b + if l < minL then minL = l end + if l > maxL then maxL = l end + end + end + return maxL - minL +end + +return function(game) + U.wait(45) + assert(game.world and game.world.map, "gold world did not boot") + + local ShaderFX = require("src.render.ShaderFX") + local entry = ShaderFX.findEntry("gameboy-color-dot-matrix.slangp") + if not entry then + print("[driver] SKIP no ShaderFX preset installed -- cannot exercise cropToGbSource") + love.event.quit(0) + return + end + if not entry.converted then + local ok, err = ShaderFX.convert(entry) + assert(ok, "ShaderFX.convert failed: " .. tostring(err)) + end + game.options = game.options or {} + game.options.shaderfx = entry.name + game:applyOptions() + assert(ShaderFX.active("main"), "ShaderFX main slot did not activate") + + -- Baseline: no menu on the stack, crop should already have real content. + U.wait(10) + local baseline = luminanceRange(ShaderFX._lastCrop) + assert(baseline > 0.05, + ("sanity check failed: baseline crop (no menu) is already near-flat " .. + "(variance %.3f) -- something else is broken, not this bug"):format(baseline)) + + -- The actual repro: push the START menu, one more frame renders through + -- it, then sample the same crop canvas again. + game.stack:push(StartMenu.new(game, { save = game.save })) + U.wait(3) + local withMenu = luminanceRange(ShaderFX._lastCrop) + game.stack:pop() + + assert(withMenu > 0.05, + ("crop is near-flat with the START menu open (variance %.3f, baseline " .. + "was %.3f) -- the ShaderFX Gen2 blank-menu bug is back"):format(withMenu, baseline)) + + print(("[driver] PASS gold shaderfx menu-blank regression, baseline=%.3f withMenu=%.3f") + :format(baseline, withMenu)) + love.event.quit(0) +end diff --git a/tests/drivers/gold_shaderfx_zoom_sizing_test.lua b/tests/drivers/gold_shaderfx_zoom_sizing_test.lua new file mode 100644 index 00000000..4914d184 --- /dev/null +++ b/tests/drivers/gold_shaderfx_zoom_sizing_test.lua @@ -0,0 +1,73 @@ +-- Regression test: on Gen 2, SHADER FX only ever shaded the small centred +-- "faithful ratio" 160x144 box, never the +-- real on-screen footprint of the live overworld -- unlike Gen 1, whose +-- Renderer.lua grows ShaderFX's rect to the real world canvas/zoom footprint +-- whenever the live overworld is what's on screen (src/render/Renderer.lua, +-- the `self.worldActive` branch around line 977). Gen2's drawViewportFrame +-- instead always built ShaderFX's rect from Chrome.fitScale's fixed +-- faithful-ratio box (src/core/Game2.lua), so on any window that is not +-- exactly 4:3 -- every real phone, and any resized desktop window -- the +-- live world already draws edge to edge past that box (Chrome.lua's own +-- comment: "The live overworld IS the background here -- it draws edge to +-- edge... with no surround to paint first"), and SHADER FX only ever shaded +-- the small box in the middle, leaving the rest of the visible map unshaded. +-- +-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/gold_shaderfx_zoom_sizing_test.lua \ +-- lovec.exe . +-- +-- Skips itself (does not fail) if no ShaderFX preset is installed in the +-- save dir's shaders/ folder (see ShaderFX.presetDir()). +local U = require("tests.drivers.util") +local GameViewport = require("src.render.GameViewport") + +return function(game) + U.wait(45) + assert(game.world and game.world.map, "gold world did not boot") + + local ShaderFX = require("src.render.ShaderFX") + local entry = ShaderFX.findEntry("gameboy-color-dot-matrix.slangp") + if not entry then + print("[driver] SKIP no ShaderFX preset installed -- cannot exercise ShaderFX.render") + love.event.quit(0) + return + end + if not entry.converted then + local ok, err = ShaderFX.convert(entry) + assert(ok, "ShaderFX.convert failed: " .. tostring(err)) + end + game.options = game.options or {} + game.options.shaderfx = entry.name + game:applyOptions() + assert(ShaderFX.active("main"), "ShaderFX main slot did not activate") + + -- conf.lua's bare-desktop default (1024x768) is exactly 4:3, which + -- coincidentally hides this bug -- resize to a 16:9 window, the shape of + -- every real phone/handheld this project actually ships on, where the + -- live world draws well past the small faithful-ratio box. + love.window.setMode(1280, 720, { resizable = true }) + U.wait(5) + + local w, h = GameViewport.dimensions() + local pw, ph = GameViewport.pixelDimensions() + assert(game.frameWorldActive, "expected the live overworld to be on screen") + + local rect = ShaderFX._lastRect + assert(rect, "ShaderFX._lastRect was never set -- ShaderFX.render did not run") + print(("[driver] window %dx%d (%dx%d px), faithful box would be %dx%d, " .. + "ShaderFX rect is %.1fx%.1f"):format( + w, h, pw, ph, + 160 * math.floor(math.min(w / 160, h / 144)), + 144 * math.floor(math.min(w / 160, h / 144)), + rect.w, rect.h)) + + -- Real assertion: with the live overworld on screen, ShaderFX's rect + -- should track the world's real edge-to-edge footprint (~ the full + -- window), not the small integer-multiple 4:3 box centered inside it. + assert(rect.w >= pw - 2 and rect.h >= ph - 2, + ("SHADER FX's rect only covers %.1fx%.1f of a %dx%d px window -- still " .. + "the fixed faithful-ratio box, not the live world's real on-screen " .. + "footprint"):format(rect.w, rect.h, pw, ph)) + + print("[driver] PASS gold shaderfx zoom-sizing regression") + love.event.quit(0) +end diff --git a/tests/drivers/gold_splash_skip.lua b/tests/drivers/gold_splash_skip.lua new file mode 100644 index 00000000..94f4cb04 --- /dev/null +++ b/tests/drivers/gold_splash_skip.lua @@ -0,0 +1,42 @@ +-- A button during the GS splash skips the intro movie +-- (pokegold engine/menus/intro_menu.asm:848-851 IntroSequence). +local U = require("tests.drivers.util") +local GameFreakPresents = require("src.ui.gen2.GameFreakPresents") +local GoldSilverIntro = require("src.ui.gen2.GoldSilverIntro") +local TitleState = require("src.ui.gen2.TitleState") + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-splash" + + U.wait(10) + game:showGameFreak() + U.wait(5) + assert(getmetatable(game.stack:top()) == GameFreakPresents, + "showGameFreak did not open the GS splash (top " + .. tostring(game.stack:top()) .. ")") + U.wait(40) + U.shot(game, out .. "/splash.png") + U.tap(game, "b") + for _ = 1, 60 do + if getmetatable(game.stack:top()) == TitleState then break end + assert(getmetatable(game.stack:top()) ~= GoldSilverIntro, + "a skipped splash still played the intro movie") + U.wait(1) + end + assert(getmetatable(game.stack:top()) == TitleState, + "a skipped splash did not land on the title (top " + .. tostring(game.stack:top()) .. ")") + U.wait(30) + U.shot(game, out .. "/title.png") + + -- Watched through, the splash still hands off to the movie. + game:showGameFreak() + for _ = 1, 900 do + if getmetatable(game.stack:top()) == GoldSilverIntro then break end + U.wait(5) + end + assert(getmetatable(game.stack:top()) == GoldSilverIntro, + "a watched splash did not hand off to the intro movie (top " + .. tostring(game.stack:top()) .. ")") + U.log("PASS gold splash skip in " .. out) +end diff --git a/tests/drivers/gold_stats_page_tint_bug1693_test.lua b/tests/drivers/gold_stats_page_tint_bug1693_test.lua new file mode 100644 index 00000000..327d5e99 --- /dev/null +++ b/tests/drivers/gold_stats_page_tint_bug1693_test.lua @@ -0,0 +1,279 @@ +-- #1693: the mon SUMMARY's lower half never took the selected page's colour. +-- StatsScreen_LoadGFX .LoadPals farcalls LoadStatsScreenPals with the page +-- index, and that writes one gfx/stats/stats.pal colour over colour 0 of BG +-- palette 0 AND BG palette 2 (engine/gfx/color.asm:373-393); WipeAttrmap +-- leaves rows 8-17 on palette 0 with the exp strip at (10,16) on palette 2 +-- (engine/gfx/cgb_layouts.asm:219-229), so both writes land below the rule. +-- Never add POKEPORT_SPEED here: fast-forward scales the logic clock only, so +-- the cry and the page redraw stop landing in the order a reader is judging. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_stats_page_tint_bug1693_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-bug1693 \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +local U = require("tests.drivers.util") + +local GbcPalette = require("src.render.GbcPalette") +local HpBar = require("src.battle.gen2.HpBar") +local Mon = require("src.battle.gen2.Mon") +local SummaryMenu = require("src.ui.gen2.SummaryMenu") + +-- gfx/stats/stats.pal, 5-bit the way the ROM keeps it: pink, green, blue +local ROM_TINTS = { { 31, 19, 31 }, { 21, 31, 14 }, { 17, 31, 31 } } +local PAGE_NAMES = { "pink", "green", "blue" } + +local function up(v) return math.floor(v * 255 / 31 + 0.5) end +local function pct(v) return math.floor(v + 0.5) end + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-bug1693" + local fails = 0 + + local function ok(cond, msg) + if cond then U.log("PASS", msg) else fails = fails + 1 U.log("FAIL", msg) end + return cond and true or false + end + local function tap(btn) U.tap(game, btn) U.wait(4) end + local function top() return game.stack:top() end + local function shot(name) + return ok(U.shot(game, ("%s/%s.png"):format(out, name)), + name .. " reached disk") + end + + U.wait(45) + if not ok(game.world and game.world.map ~= nil, + "gold booted into the world") then + error("gold stats tint: no world, nothing to open a summary over") + end + + -- ---- the party the pink page needs --------------------------------------- + -- Mon.new is the only Gen 2 party builder; a mon out of Gen 1's Pokemon.new + -- comes back with no moves and no growth rate, so both bars would be empty. + local save = game.save + save.player.name = "GOLD" + save.player.id = 12345 + save.party = { + Mon.new(game.data, "CYNDAQUIL", 22), + Mon.new(game.data, "TOTODILE", 18), + } + local lead = save.party[1] + lead.item = "BERRY" + lead.hp = math.max(1, math.floor((lead.maxHp or 1) * 0.45)) + local def = game.data.pokemon[lead.species] + local rates = game.data.pokemon.growthRates + local rate = rates and def and rates[def.growthRate] + if rate then + local base = Mon.experienceForLevel(rate, lead.level) + local next_ = Mon.experienceForLevel(rate, lead.level + 1) + lead.experience = base + math.floor((next_ - base) * 0.55) + end + ok(game.world.giveEgg and game.world:giveEgg(175, 5) and save.party[3] + and save.party[3].isEgg == true, "slot 3 holds an egg") + + -- ---- everything the eye cannot check ------------------------------------- + for page = 1, 3 do + local tint = SummaryMenu.PAGE_TINTS and SummaryMenu.PAGE_TINTS[page] + ok(tint ~= nil and tint[1] == up(ROM_TINTS[page][1]) + and tint[2] == up(ROM_TINTS[page][2]) + and tint[3] == up(ROM_TINTS[page][3]), + ("the %s tint is stats.pal's own colour"):format(PAGE_NAMES[page])) + local probe = setmetatable({ page = page }, { __index = SummaryMenu }) + local lower = probe.lowerColors and probe:lowerColors() + ok(lower ~= nil and lower[1] == tint and lower[4][1] == 0, + ("the %s lower palette is that tint over black ink"):format( + PAGE_NAMES[page])) + end + ok(GbcPalette.available(), "the GBC shade-remap shader compiled") + + -- COLOR is the port's own display row and DMG flattens every palette in the + -- game, so a run started on it looks exactly like the bug. + game.options = game.options or {} + local startedOn = game.options.color or "gbc" + local function setColor(mode) + game.options.color = mode + if game.save then game.save.options = game.options end + GbcPalette.applyOptions(game.options) + return GbcPalette.mode + end + if startedOn ~= "gbc" then + U.log("COLOR was on " .. GbcPalette.modeLabel(startedOn) .. ", which would") + U.log("grey every shot below for the wrong reason. forcing it to GBC.") + end + ok(setColor("gbc") == "gbc", "COLOR is GBC for the run") + + -- ---- the live screen, counted rather than admired ------------------------ + -- The summary draws at GB coordinates, so a 160x144 canvas at scale 1 makes + -- a GB pixel a pixel and the tint countable. + local function frameOf(screen) + local G = love.graphics + local canvas = G.newCanvas(160, 144) + G.setCanvas(canvas) + G.clear(0, 0, 0, 1) + G.setColor(1, 1, 1, 1) + screen:draw() + G.setCanvas() + G.setColor(1, 1, 1, 1) + return canvas:newImageData() + end + + local function near(a, b) return math.abs(a - b) <= 2 end + + -- Counted against stats.pal itself, not the port's table, so a run that has + -- no PAGE_TINTS cannot agree with itself. + local function tintFor(page) + local rom = ROM_TINTS[page] or ROM_TINTS[1] + return { up(rom[1]), up(rom[2]), up(rom[3]) } + end + + local function scan(img, want, x0, y0, x1, y1) + local hit, white, total = 0, 0, 0 + for y = y0, y1 do + for x = x0, x1 do + local r, g, b = img:getPixel(x, y) + r, g, b = r * 255, g * 255, b * 255 + total = total + 1 + if near(r, want[1]) and near(g, want[2]) and near(b, want[3]) then + hit = hit + 1 + end + if near(r, 255) and near(g, 255) and near(b, 255) then + white = white + 1 + end + end + end + return hit / total * 100, white / total * 100 + end + + -- StatsScreen_LoadGFX .ClearBox: hlcoord 0, 8 / lb bc, 10, 20 + local LOWER = { 0, 64, 159, 143 } + local function report(label, hit, white) + U.log((" %-24s %3d%% tinted %3d%% white"):format(label, pct(hit), + pct(white))) + end + + local function zone(img, tint, label, rect, wantTint) + local hit, white = scan(img, tint, rect[1], rect[2], rect[3], rect[4]) + report(label, hit, white) + ok(hit >= wantTint, label .. " carries the page tint") + ok(white <= 2, label .. " has no white left in it") + end + + local function inspect(screen, name) + local img = frameOf(screen) + local tint = tintFor(screen.page) + zone(img, tint, "rows 8-17", LOWER, 40) + if screen.page == SummaryMenu.PINK_PAGE then + -- DrawPlayerHP: "HP:" at (0,9), six bar cells from (2,9) + zone(img, tint, "the HP bar's cells", { 16, 72, 63, 79 }, 8) + -- LoadPinkPage's divider column, and FillInExpBar at (11,16) + zone(img, tint, "the divider, column 9", { 72, 64, 79, 143 }, 20) + zone(img, tint, "the exp bar", { 88, 128, 151, 135 }, 8) + elseif screen.page == SummaryMenu.BLUE_PAGE then + zone(img, tint, "the divider, column 10", { 80, 64, 87, 143 }, 20) + end + -- The upper half is on the mon palette, which the cart never tints. + local _, white = scan(img, tint, 0, 0, 159, 55) + ok(white >= 20, "the upper half stayed white") + shot(name) + end + + -- ---- walk in through the pad --------------------------------------------- + tap("start") + local menu = top() + if not ok(menu and menu.screenId == "Gen2StartMenu", + "START opened the menu") then + error("gold stats tint: no start menu, cannot reach the summary") + end + for _ = 1, 10 do + if menu.list:current().value == "pokemon" then break end + tap("down") + end + ok(menu.list:current().value == "pokemon", "the cursor found the party row") + tap("a") + local party = top() + if not ok(party and party.screenId == "Gen2PartyMenu", + "that opened the party list") then + error("gold stats tint: no party list, cannot reach the summary") + end + + local function openStats() + tap("a") + ok(party.submenu ~= nil and party.submenu.items[1].id == "STATS", + "the mon submenu leads with STATS") + tap("a") + local screen = top() + ok(screen and screen.screenId == "Gen2SummaryMenu", + "STATS opened the summary") + return screen + end + + local summary = openStats() + ok(summary.hud and summary.hud:available(), + "the HUD sheet is cached, so the bars are the cart's own tiles") + ok(summary.statsTiles and summary:statsTiles() ~= nil, + "menu_gfx.stats is cached, so the divider and caps are too") + local fraction = HpBar.expFraction(summary.mon, summary:growth(), + Mon.experienceForLevel) + ok(fraction > 0.05 and fraction < 0.95, + "the lead is part way to its next level, so the exp bar is half drawn") + ok((summary.mon.hp or 0) > 0 and summary.mon.hp < (summary.mon.maxHp or 0), + "and hurt, so the HP bar has empty cells as well as full ones") + + inspect(summary, "01-pink-page") + tap("right") + ok(summary.page == SummaryMenu.GREEN_PAGE, "right reached the green page") + inspect(summary, "02-green-page") + tap("right") + ok(summary.page == SummaryMenu.BLUE_PAGE, "right reached the blue page") + inspect(summary, "03-blue-page") + tap("right") + ok(summary.page == SummaryMenu.PINK_PAGE, "and wrapped back to pink") + + -- ---- the two screens that must stay white -------------------------------- + tap("b") + ok(top() == party, "b came back to the list") + tap("down") + tap("down") + ok(party.index == 3, "the cursor reached the egg") + local egg = openStats() + ok(egg.mon and egg.mon.isEgg == true, "on the egg") + local eggTint, eggWhite = scan(frameOf(egg), tintFor(SummaryMenu.PINK_PAGE), + LOWER[1], LOWER[2], LOWER[3], LOWER[4]) + report("the egg's rows 8-17", eggTint, eggWhite) + -- EggStatsScreen never calls LoadStatsScreenPals (stats_screen.asm:786) + ok(eggTint <= 1 and eggWhite >= 40, "the egg page stayed white") + shot("04-egg-white") + + tap("b") + tap("up") + tap("up") + ok(setColor("dmg") == "dmg", "COLOR switched to DMG") + local dmg = openStats() + local dmgTint, dmgWhite = scan(frameOf(dmg), tintFor(dmg.page), + LOWER[1], LOWER[2], LOWER[3], LOWER[4]) + report("DMG's rows 8-17", dmgTint, dmgWhite) + -- LoadStatsScreenPals opens `call CheckCGB / ret z` (color.asm:373-375) + ok(dmgTint <= 1 and dmgWhite >= 40, "DMG flattened the tint back to white") + shot("05-dmg-white") + tap("b") + ok(setColor("gbc") == "gbc", "COLOR is back on GBC for the handoff") + + -- ---- what a reader is looking at ----------------------------------------- + openStats() + U.wait(4) + + if fails > 0 then + U.log(("%d check(s) failed above. do not judge the colours -- the run is"): + format(fails)) + U.log("not showing you what it claims to.") + end + U.log("shots are in " .. out .. ". the summary is open on the pink page and") + U.log("left/right turn it: everything under the horizontal rule should be") + U.log("washed pink, then green, then cyan, matching whichever page square is") + U.log("the large one, while the pic, nickname and level stay white.") + U.log("a partial fix leaves white in one of three places -- an 8px stripe") + U.log("down the divider column, the bands above and below the HP bar's fill,") + U.log("or the exp bar's interior inside its black frame.") + + while true do coroutine.yield() end +end diff --git a/tests/drivers/gold_tm_fanfare_bug1483_test.lua b/tests/drivers/gold_tm_fanfare_bug1483_test.lua new file mode 100644 index 00000000..0724bd4c --- /dev/null +++ b/tests/drivers/gold_tm_fanfare_bug1483_test.lua @@ -0,0 +1,338 @@ +-- #1483: the TM/HM jingle under `verbosegiveitem`, and the item jingle beside it. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_tm_fanfare_bug1483_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-tm-fanfare \ +-- perl -e 'alarm 300; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- GiveItemScript is `waitsfx / specialsound / waitbutton`, the drain sitting +-- ABOVE the sound (engine/overworld/scripting.asm:441-449). Without it PlaySFX +-- drops SFX_GET_TM ($9b) under the beep the box rang on its own press, +-- SFX_READ_TEXT_2 ($08) -- while SFX_ITEM ($01) outranks that beep and survives. +-- +-- No POKEPORT_SPEED here on purpose: audio runs on its own real-time +-- accumulator, so fast-forward slides the jingle off the press it belongs to, +-- and the ordering is the whole thing being judged. +local U = require("tests.drivers.util") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local Sound = require("src.core.Sound") + +-- ../pokegold/maps/Route32.asm:866 -- Route32RoarTMGuyScript, `verbosegiveitem +-- TM_ROAR`, gated on nothing but its own EVENT_GOT_TM05_ROAR latch. +local TM_GIVER = { map = "ROUTE_32", x = 15, y = 13, item = "TM_ROAR" } +-- ../pokegold/maps/Route32Pokecenter1F.asm:109 -- the fishing guru, +-- `verbosegiveitem OLD_ROD`, one warp away and the control for the same gate. +local ITEM_GIVER = + { map = "ROUTE_32_POKECENTER_1F", x = 1, y = 4, item = "OLD_ROD" } + +-- side the player stands on, and the way they have to look from there +local SIDES = { + { dx = -1, dy = 0, face = "right" }, + { dx = 1, dy = 0, face = "left" }, + { dx = 0, dy = -1, face = "down" }, + { dx = 0, dy = 1, face = "up" }, +} + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-tm-fanfare" + local fails, lines = 0, {} + + local function claim(ok, text) + if not ok then fails = fails + 1 end + lines[#lines + 1] = (ok and "PASS " or "FAIL ") .. text + return ok + end + + local function stop() + for _, line in ipairs(lines) do U.log(line) end + while true do coroutine.yield() end + end + + U.wait(45) + local world = game.world + if not (world and world.map) then + U.log("FAIL the gold world never booted, nothing to listen to") + while true do coroutine.yield() end + end + local data = game.data + + -- ---- everything that fails as silence -------------------------------------- + local audio = data.audio or {} + local ids = {} + for i, name in ipairs(audio.sfxOrder or {}) do ids[name] = i - 1 end + for _, name in ipairs({ "Sfx_GetTm", "Sfx_Item", "Sfx_ReadText2" }) do + claim(ids[name] ~= nil and audio.sfx and audio.sfx[name] ~= nil, + ("the cache can play %s (id %s)"):format(name, tostring(ids[name]))) + end + -- The gate is a numeric comparison, so the whole bug only exists while these + -- three ids sit in this order (constants/sfx_constants.asm:4, :11). + claim((ids.Sfx_Item or 0) < (ids.Sfx_ReadText2 or 0) + and (ids.Sfx_ReadText2 or 0) < (ids.Sfx_GetTm or 0), + "and SFX_ITEM outranks the box beep, which outranks SFX_GET_TM") + claim(type(Sound.waitSfxDone) == "function", + "Sound.waitSfxDone exists for specialsound's `waitsfx` to call") + + local vol = game.save.options and game.save.options.sfxVol + claim(vol ~= 0, ("SFX VOL is %s"):format(tostring(vol))) + if vol == 0 then + U.log("SFX VOL is ZERO -- a muted run sounds exactly like the bug.") + U.log("turn it up in OPTION before trusting anything you hear here.") + end + + for _, spot in ipairs({ TM_GIVER, ITEM_GIVER }) do + local def = data.items and data.items[spot.item] + claim(def ~= nil, ("the cache names the item %s"):format(spot.item)) + spot.pocket = def and def.pocket + spot.index = def and def.index + spot.want = (spot.pocket == "TM_HM") and "Sfx_GetTm" or "Sfx_Item" + end + claim(TM_GIVER.pocket == "TM_HM", + ("TM_ROAR sits in the TM_HM pocket (got %s)"):format( + tostring(TM_GIVER.pocket))) + claim(ITEM_GIVER.pocket ~= "TM_HM", + ("OLD_ROD does not (got %s)"):format(tostring(ITEM_GIVER.pocket))) + + -- ---- the recorder ---------------------------------------------------------- + -- + -- Sound.play returns nil when the priority gate DROPS the request, which is + -- the bug itself: the sound neither rings nor ducks the music. + local calls, frame, inSpecial = {}, 0, false + local realPlay = Sound.play + Sound.play = function(d, name) + local src = realPlay(d, name) + calls[#calls + 1] = { + name = Sound.resolve(d, name), frame = frame, + started = src ~= nil, special = inSpecial, + } + return src + end + local drains = 0 + local realDrain = Sound.waitSfxDone + Sound.waitSfxDone = function() + if inSpecial then drains = drains + 1 end + return realDrain() + end + local realSpecial = world.specialSound + world.specialSound = function(self, itemIndex) + inSpecial = true + local ok, err = pcall(realSpecial, self, itemIndex) + inSpecial = false + if not ok then error(err) end + end + + local function tap(button, gap) + table.insert(game.input.pressQueue, button) + game.input.state[button] = true + frame = frame + 1 + coroutine.yield() + game.input.state[button] = false + for _ = 1, (gap or 12) do frame = frame + 1 coroutine.yield() end + end + + local function walk(button, n) + for _ = 1, n do + table.insert(game.input.pressQueue, button) + game.input.state[button] = true + frame = frame + 1 + coroutine.yield() + end + game.input.state[button] = false + U.wait(6) + end + + -- The VM finishes its last `showRaw` and stops while the boxes it queued are + -- still on the stack, so "the script ended" is not "the conversation ended": + -- the stack has to be back where it was before A was ever pressed. + local baseDepth = #game.stack.states + local function idle() + return #game.stack.states <= baseDepth + and not world.vm:running() and not world:busy() + end + + -- Press first, then look: at rest the Gold overworld holds nothing on the + -- stack at all, so a leading idle() check would return before the A that + -- starts the conversation was ever sent. + local function mash(limit, gap) + for _ = 1, (limit or 40) do + tap("a", gap) + if idle() then return true end + end + return idle() + end + + local function clear(limit) + for _ = 1, (limit or 12) do + if idle() then return end + tap("b", 8) + end + end + + -- ---- walk up to one giver and take what they hand over --------------------- + local function visit(spot, shots) + clear() -- nothing from the last giver may still be on the stack + world:applyPlayerState(FieldMoves.PLAYER_NORMAL) + -- Land on the map first so the collision under the giver is this map's. + world:setMap(spot.map, spot.x, spot.y + 1, "up") + U.wait(20) + world.noWildEncounters = true + + -- A later map edit must degrade to a different side rather than park the + -- player in a wall, so the standing tile is picked from the live map. + local side + for _, s in ipairs(SIDES) do + local sx, sy = spot.x + s.dx, spot.y + s.dy + if not side and world.map:isWalkable(sx, sy) + and not world:npcAt(sx, sy) then + side = s + end + end + if not claim(side ~= nil, + ("a free tile beside the giver at (%d,%d) on %s"):format( + spot.x, spot.y, spot.map)) then + return nil + end + + -- Start two cells back and walk in, so the approach is the player's own. + local steps, sx, sy = 0, spot.x + side.dx, spot.y + side.dy + for n = 2, 3 do + local tx, ty = spot.x + side.dx * n, spot.y + side.dy * n + if steps == n - 2 and world.map:isWalkable(tx, ty) + and not world:npcAt(tx, ty) then + steps, sx, sy = n - 1, tx, ty + end + end + spot.side, spot.steps, spot.sx, spot.sy = side, steps, sx, sy + world:setMap(spot.map, sx, sy, side.face) + U.wait(20) + world.noWildEncounters = true + if steps > 0 then walk(side.face, 20 * steps) end + U.wait(10) + + local npc = world:facingObject() + local key = npc and npc.def and npc.def.scriptKey + local script = key and world.vm.scripts and world.vm.scripts[key] + if not claim(type(script) == "table", + ("%s has a script to run at (%d,%d)"):format(spot.map, spot.x, spot.y)) then + return nil + end + + -- The give is behind a `checkevent` latch (EVENT_GOT_TM05_ROAR, + -- EVENT_GOT_OLD_ROD); those are the only flags either script reads. + local gives = nil + spot.events = {} + for _, row in ipairs(script) do + if type(row) == "table" then + if row.event then + world.events:set(row.event, false) + spot.events[#spot.events + 1] = row.event + end + if row.op == "verbosegiveitem" then gives = row.item end + end + end + claim(gives == spot.index, + ("its `verbosegiveitem` hands over item %s, wanted %s (%s)"):format( + tostring(gives), tostring(spot.index), spot.item)) + if gives ~= spot.index then return nil end + + game.save.inventory = game.save.inventory or {} + game.save.inventory[spot.item] = nil + local first = #calls + 1 + U.shot(game, shots[1]) + + -- Mash A the way a player does: through the intro line, the yes/no the + -- guru asks (YES is the resting cursor), the received line and the pocket + -- line. Nothing here waits for the jingle; that is the point. + local function rang() + for i = first, #calls do + if calls[i].name == spot.want and calls[i].special then return true end + end + return false + end + for _ = 1, 40 do + tap("a") + if rang() or idle() then break end + end + U.shot(game, shots[2]) -- the box the jingle is meant to be ringing under + local finished = mash(40) + claim(finished, ("the %s conversation ran to the end"):format(spot.item)) + U.wait(30) + + local got = (game.save.inventory[spot.item] or 0) > 0 + claim(got, ("the %s reached the pack"):format(spot.item)) + + local heard, want, blipBefore = {}, nil, false + for i = first, #calls do + local c = calls[i] + heard[#heard + 1] = ("%s@%d%s"):format(c.name, c.frame, + c.started and "" or "(dropped)") + if c.name == spot.want and c.special then want = want or c end + if c.name == "Sfx_ReadText2" and c.started and not want then + blipBefore = true + end + end + U.log(("sfx across the %s hand-over: %s"):format( + spot.item, table.concat(heard, " "))) + return { want = want, blipBefore = blipBefore, heard = heard } + end + + local tm = visit(TM_GIVER, + { out .. "/01-tm-giver.png", out .. "/02-tm-jingle.png" }) + if not tm then + U.log("could not reach the TM giver; stopping rather than faking it") + Sound.play = realPlay + Sound.waitSfxDone = realDrain + stop() + end + claim(tm.blipBefore, + "the box rang its own beep before the TM jingle was asked for") + claim(drains > 0, "specialsound drained the channels first, as `waitsfx` does") + claim(tm.want ~= nil, "Sfx_GetTm was asked for from specialsound at all") + claim(tm.want and tm.want.started, + "and the priority gate let it start instead of dropping it") + + local item = visit(ITEM_GIVER, + { out .. "/03-item-giver.png", out .. "/04-item-jingle.png" }) + if item then + claim(item.want ~= nil, "Sfx_Item was asked for from specialsound too") + claim(item.want and item.want.started, "and it started, as it always did") + end + + Sound.play = realPlay + Sound.waitSfxDone = realDrain + + for _, line in ipairs(lines) do U.log(line) end + U.log(("%d checks, %d failed"):format(#lines, fails)) + if fails > 0 then + U.log("something above is FAIL, so do not spend time listening") + end + + -- ---- the replay, live ------------------------------------------------------ + -- + -- EVENT_GOT_TM05_ROAR is the only latch the Roar guy reads, so clearing what + -- his own script checked puts the whole hand-over back. + clear() + for _, ev in ipairs(TM_GIVER.events or {}) do world.events:set(ev, false) end + game.save.inventory[TM_GIVER.item] = nil + world:setMap(TM_GIVER.map, TM_GIVER.sx, TM_GIVER.sy, TM_GIVER.side.face) + world.noWildEncounters = true + U.wait(30) + U.log("the Roar guy is a couple of steps away; the replay starts in three") + U.log("seconds and mashes A the whole way through.") + U.wait(180) + if TM_GIVER.steps > 0 then walk(TM_GIVER.side.face, 20 * TM_GIVER.steps) end + U.wait(10) + mash(40, 16) + U.wait(60) + + U.log("what right sounds like: the route music cuts out on the received line") + U.log("and the TM jingle rings under it, then the music comes back.") + U.log("dead silence with the music still playing is the drop this fixes.") + U.log("expect the jingle to be cut short by the beep on the next box -- that") + U.log("is the missing trailing WaitSFX, not this fix failing.") + U.log("the guru in the Route 32 centre is the control: same beep, but his") + U.log("OLD ROD jingle rang before the fix as well.") + U.log("the controls are yours.") + while true do coroutine.yield() end +end diff --git a/tests/drivers/gold_whirlpool_forceturn_bug1716_test.lua b/tests/drivers/gold_whirlpool_forceturn_bug1716_test.lua new file mode 100644 index 00000000..e46eae12 --- /dev/null +++ b/tests/drivers/gold_whirlpool_forceturn_bug1716_test.lua @@ -0,0 +1,213 @@ +-- #1716: a whirlpool tile force-turns the player instead of being swum through. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_whirlpool_forceturn_bug1716_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-whirlpool \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- DoPlayerMovement's .CheckTile runs CheckWhirlpoolTile above the nybble ladder +-- and answers PLAYERMOVEMENT_FORCE_TURN (engine/overworld/player_movement.asm +-- :117-123), which is Script_ForcedMovement: step_dig 16, turn_in , +-- step_dig 16, turn_head , step_end (engine/events/forced_movement.asm +-- :25-51). turn_in `jp TurningStep`, i.e. InitStep under OBJECT_ACTION_SPIN -- +-- a spinning one-cell step, not a facing change. +-- +-- No POKEPORT_SPEED here on purpose: the spin, the step and the settle are what +-- is being watched, and fast-forward scales only the logic clock. +local U = require("tests.drivers.util") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local Movement = require("src.script.gen2.Movement") +local Mon = require("src.battle.gen2.Mon") +local Permissions = require("src.world.gen2.Permissions") + +-- data/generated/maps.lua, ROUTE_41: four whirlpools, the first at (22,12) with +-- plain water above and below it. Verified live below, and re-derived by +-- scanning the map if a re-import ever moves it. +local MAP = "ROUTE_41" +local WHIRL = { x = 22, y = 12 } + +local DELTA = { + up = { 0, -1 }, down = { 0, 1 }, left = { -1, 0 }, right = { 1, 0 }, +} + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-whirlpool" + local fails, lines = 0, {} + + local function claim(ok, text) + if not ok then fails = fails + 1 end + lines[#lines + 1] = (ok and "PASS " or "FAIL ") .. text + return ok + end + + U.wait(45) + local world = game.world + if not (world and world.map) then + U.log("FAIL the gold world never booted, nothing to look at") + while true do coroutine.yield() end + end + + -- ---- the things a human's eyes cannot check ------------------------------ + -- + -- All of these fail silently and look exactly like "the fix did nothing". + claim(Movement.decodeByte(0x24).kind == "step", + "$24 turn_in decodes as a step, not a facing change") + claim(Movement.decodeByte(0x24).spin == true, + "and it carries OBJECT_ACTION_SPIN") + claim(Movement.STEP_DIG == 0x4f and Movement.STEP_DIG_FRAMES == 16, + "$4f step_dig is modelled, 16 frames") + claim(type(world.runForcedMovement) == "function", + "World:runForcedMovement exists for .CheckTile to call") + claim(type(world.player.scriptSpin) == "function", + "Player:scriptSpin exists for step_dig to drive") + + -- SURF but deliberately NOT WHIRLPOOL, and no GLACIERBADGE: TryWhirlpoolOW + -- must never get a look in, or what we would be watching is the prompt. + local badges = game.save.player.badges or {} + game.save.player.badges = badges + for _, badge in pairs(FieldMoves.BADGE) do badges[badge] = nil end + badges[FieldMoves.BADGE.SURF] = true + local swimmer = Mon.new(game.data, "LAPRAS", 30, + { moves = { { id = "SURF" } } }) + claim(swimmer ~= nil, "a LAPRAS that knows SURF and nothing else") + game.save.party = { swimmer } + claim(not FieldMoves.hasBadge(game.save, FieldMoves.BADGE.WHIRLPOOL), + "no GLACIERBADGE, so no whirlpool prompt can fire") + + -- ---- find the whirlpool -------------------------------------------------- + world:applyPlayerState(FieldMoves.PLAYER_SURF) + world:setMap(MAP, WHIRL.x, WHIRL.y - 1, "down") + U.wait(10) + world.noWildEncounters = true + local map = world.map + + local function isWhirl(x, y) + return map:inBounds(x, y) and Permissions.isWhirlpool(map:cellCollision(x, y)) + end + local function isOpenWater(x, y) + return map:inBounds(x, y) + and Permissions.isWater(map:cellCollision(x, y)) + and not Permissions.isWhirlpool(map:cellCollision(x, y)) + end + + local target, approach = nil, nil + if isWhirl(WHIRL.x, WHIRL.y) then target = { x = WHIRL.x, y = WHIRL.y } end + if not target then + -- A re-import moved it; take any whirlpool on the map instead of parking + -- the player on open sea with nothing to look at. + local def = world.maps[MAP] + for y = 0, (def.height or 0) * 2 - 1 do + for x = 0, (def.width or 0) * 2 - 1 do + if not target and isWhirl(x, y) then target = { x = x, y = y } end + end + end + end + if target then + for _, dir in ipairs({ "down", "up", "right", "left" }) do + local d = DELTA[dir] + if not approach and isOpenWater(target.x - d[1], target.y - d[2]) then + approach = { x = target.x - d[1], y = target.y - d[2], dir = dir } + end + end + end + claim(target ~= nil, ("%s still has a whirlpool tile on it"):format(MAP)) + claim(approach ~= nil, "with open water beside it to swim in from") + if not (target and approach) then + for _, line in ipairs(lines) do U.log(line) end + U.log("nothing to drive; stopping here rather than faking the moment") + while true do coroutine.yield() end + end + if target.x ~= WHIRL.x or target.y ~= WHIRL.y then + U.log(("note: using the whirlpool at (%d,%d), not the (%d,%d) in the header") + :format(target.x, target.y, WHIRL.x, WHIRL.y)) + end + + -- ---- swim into it -------------------------------------------------------- + world:setMap(MAP, approach.x, approach.y, approach.dir) + world:applyPlayerState(FieldMoves.PLAYER_SURF) + world.noWildEncounters = true + U.wait(20) + claim(FieldMoves.isSurfing(world.playerState), "on the water, on the Lapras") + U.shot(game, out .. "/01-before.png") + + local p = world.player + local d = DELTA[approach.dir] + local beyond = { x = target.x + d[1], y = target.y + d[2] } + local seen = { onWhirl = false, spun = false, busy = false, past = false } + local shot = {} + + local function press(dir) + table.insert(game.input.pressQueue, dir) + game.input.state[dir] = true + coroutine.yield() + end + + for _ = 1, 300 do + press(approach.dir) + if p.cellX == target.x and p.cellY == target.y then + seen.onWhirl = true + end + if p.spinFrames then seen.spun = true end + if world:busy() then seen.busy = true end + if p.cellX == beyond.x and p.cellY == beyond.y then seen.past = true end + if not shot.spin and seen.onWhirl and p.spinFrames then + shot.spin = true + game.input.state[approach.dir] = false + U.shot(game, out .. "/02-whirling.png") + end + if shot.spin and not shot.back + and (p.cellX ~= target.x or p.cellY ~= target.y) then + shot.back = true + game.input.state[approach.dir] = false + U.shot(game, out .. "/03-thrown-back.png") + end + end + game.input.state[approach.dir] = false + -- Let whatever is still running settle before reading the resting facing. + for _ = 1, 180 do + if not world:busy() and not p.moving then break end + coroutine.yield() + end + U.shot(game, out .. "/04-settled.png") + + local BACK = { up = "down", down = "up", left = "right", right = "left" } + claim(seen.onWhirl, + ("the step onto the whirlpool at (%d,%d) happened -- the cart allows it") + :format(target.x, target.y)) + claim(seen.busy, "the forced movement took the world off the d-pad") + claim(seen.spun, "step_dig put the player under OBJECT_ACTION_SPIN") + claim(not seen.past, + ("300 frames of %s never reached (%d,%d) on the far side") + :format(approach.dir:upper(), beyond.x, beyond.y)) + claim(p.cellX == approach.x and p.cellY == approach.y, + ("the player was dragged back to (%d,%d), and is at (%d,%d)") + :format(approach.x, approach.y, p.cellX, p.cellY)) + claim(p.facing == BACK[approach.dir], + ("turn_head settled the facing to %s, and it is %s") + :format(BACK[approach.dir], tostring(p.facing))) + + for _, line in ipairs(lines) do U.log(line) end + U.log(("%d checks, %d failed"):format(#lines, fails)) + if fails > 0 then + U.log("something above is FAIL, so do not spend time watching the replay") + end + + -- ---- the replay, live ---------------------------------------------------- + U.log("shots are in " .. out .. "; 02 is the whirl, 03 the drag back out.") + U.log("the replay starts in three seconds and runs on its own.") + world:setMap(MAP, approach.x, approach.y, approach.dir) + world:applyPlayerState(FieldMoves.PLAYER_SURF) + world.noWildEncounters = true + U.wait(180) + for _ = 1, 200 do press(approach.dir) end + game.input.state[approach.dir] = false + + U.log("the Lapras swims one cell into the whirlpool, whirls on the spot,") + U.log("is dragged back out still whirling, and stops facing away from it.") + U.log("a bounce with no whirl means scriptSpin never fired; a whirl that") + U.log("never leaves the cell means $24 is still decoding as a turn.") + U.log("the controls are yours -- the d-pad cannot cross that cell.") + while true do coroutine.yield() end +end diff --git a/tests/drivers/gold_whirlpool_sound_bug1717_test.lua b/tests/drivers/gold_whirlpool_sound_bug1717_test.lua new file mode 100644 index 00000000..a6f78b50 --- /dev/null +++ b/tests/drivers/gold_whirlpool_sound_bug1717_test.lua @@ -0,0 +1,240 @@ +-- #1717: the surf wash PlayWhirlpoolSound rings as a whirlpool drains. +-- +-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \ +-- POKEPORT_DRIVER=tests/drivers/gold_whirlpool_sound_bug1717_test.lua \ +-- POKEPORT_SHOT_DIR=/tmp/gold-whirlpool-sfx \ +-- perl -e 'alarm 240; exec @ARGV' \ +-- python3 -c "import pty; pty.spawn(['love','.'])" +-- +-- PlayWhirlpoolSound is WaitSFX / PlaySFX SFX_SURF / WaitSFX +-- (engine/events/field_moves.asm:5-10), never a bare PlaySFX. The LEADING wait +-- is what makes it audible: SFX_SURF is $53 and PlaySFX drops any id above the +-- sound still on ch5-ch8 (home/audio.asm), so the beep that dismissed the text +-- box swallowed it. The TRAILING wait is why the water is still washing when +-- DisappearWhirlpool hands back, above `closetext`. +-- +-- No POKEPORT_SPEED here on purpose: audio runs on its own real-time +-- accumulator, so fast-forward slides the sound off the moment it belongs to, +-- and the ordering is the whole thing being judged. +local U = require("tests.drivers.util") + +local FieldMoves = require("src.world.gen2.FieldMoves") +local Mon = require("src.battle.gen2.Mon") +local Permissions = require("src.world.gen2.Permissions") +local Sound = require("src.core.Sound") + +-- data/generated/maps.lua, ROUTE_41: whirlpools at (22,12), (42,24), (6,30) and +-- (28,48). Stand one cell north of the first and face it. +local MAP = "ROUTE_41" +local WHIRL = { x = 22, y = 12 } + +return function(game) + local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-whirlpool-sfx" + local fails, lines = 0, {} + + local function claim(ok, text) + if not ok then fails = fails + 1 end + lines[#lines + 1] = (ok and "PASS " or "FAIL ") .. text + return ok + end + + U.wait(45) + local world = game.world + if not (world and world.map) then + U.log("FAIL the gold world never booted, nothing to listen to") + while true do coroutine.yield() end + end + + -- ---- everything that fails as silence ------------------------------------ + local audio = game.data.audio or {} + local hasLabel = false + for _, name in ipairs(audio.sfxOrder or {}) do + if name == "Sfx_Surf" then hasLabel = true end + end + claim(hasLabel, "the cache knows the sfx label Sfx_Surf") + claim(audio.sfx and audio.sfx.Sfx_Surf ~= nil, + "and it has a loadable definition for it") + claim(type(world.playWhirlpoolSound) == "function", + "World:playWhirlpoolSound exists for DisappearWhirlpool to call") + local vol = game.save.options and game.save.options.sfxVol + claim(vol ~= 0, ("SFX VOL is %s"):format(tostring(vol))) + if vol == 0 then + U.log("SFX VOL is ZERO -- a muted run sounds exactly like the bug.") + U.log("turn it up in OPTION before trusting anything you hear here.") + end + + -- SURF to get there and WHIRLPOOL to use, with the badges TryWhirlpoolOW + -- gates on: the gate has its own checks in tests/gen2_world_test.lua, and + -- what is under test here is the sound, not the refusal. + local badges = game.save.player.badges or {} + game.save.player.badges = badges + for _, badge in pairs(FieldMoves.BADGE) do badges[badge] = true end + local swimmer = Mon.new(game.data, "LAPRAS", 30, + { moves = { { id = "SURF" }, { id = "WHIRLPOOL" } } }) + claim(swimmer ~= nil, "a LAPRAS that knows SURF and WHIRLPOOL") + game.save.party = { swimmer } + + -- ---- stand on the water facing the whirlpool ----------------------------- + world:applyPlayerState(FieldMoves.PLAYER_SURF) + world:setMap(MAP, WHIRL.x, WHIRL.y - 1, "down") + U.wait(15) + world.noWildEncounters = true + + local ctx = world:fieldContext() + local facingWhirl = Permissions.isWhirlpool(ctx.facingColl) + if not facingWhirl then + -- A re-import moved it: take any whirlpool with open water above it rather + -- than ringing a sound at a patch of empty sea. + local def = world.maps[MAP] + for y = 1, (def.height or 0) * 2 - 1 do + for x = 0, (def.width or 0) * 2 - 1 do + if not facingWhirl + and Permissions.isWhirlpool(world.map:cellCollision(x, y)) + and Permissions.isWater(world.map:cellCollision(x, y - 1)) then + WHIRL.x, WHIRL.y = x, y + world:setMap(MAP, x, y - 1, "down") + world:applyPlayerState(FieldMoves.PLAYER_SURF) + U.wait(10) + ctx = world:fieldContext() + facingWhirl = Permissions.isWhirlpool(ctx.facingColl) + U.log(("note: using the whirlpool at (%d,%d)"):format(x, y)) + end + end + end + end + claim(facingWhirl, + ("facing the whirlpool at (%d,%d) on %s"):format(WHIRL.x, WHIRL.y, MAP)) + local blocks = world.maps[MAP] and world.maps[MAP].blocks + local index = ctx.facingBlockIndex + local before = blocks and index and blocks[index] + claim(before ~= nil, "and the block behind it is readable") + if not (facingWhirl and before) then + for _, line in ipairs(lines) do U.log(line) end + U.log("nothing to drive; stopping here rather than faking the moment") + while true do coroutine.yield() end + end + U.shot(game, out .. "/01-facing.png") + + -- ---- record every sfx the drain rings ------------------------------------ + -- + -- Sound.play returns nil when the priority gate DROPS the request, which is + -- the bug itself: the sound neither sounds nor ducks the music. + local calls, frame = {}, 0 + local realPlay = Sound.play + Sound.play = function(data, name) + local src = realPlay(data, name) + calls[#calls + 1] = { + name = name, frame = frame, started = src ~= nil, + phase = world.fieldMove and world.fieldMove.phase, + } + return src + end + + local function tap(button, gap) + table.insert(game.input.pressQueue, button) + game.input.state[button] = true + frame = frame + 1 + coroutine.yield() + game.input.state[button] = false + for _ = 1, (gap or 8) do frame = frame + 1 coroutine.yield() end + end + + -- Press A into the whirlpool, then answer the ask box. YES is the default + -- cursor, so A all the way down is what a player does. + local drainedAt, closedAt = nil, nil + for _ = 1, 24 do + if world.fieldMove and world.fieldMove.phase == "whirlpoolsfx" then break end + if blocks[index] ~= before and not closedAt then closedAt = frame end + tap("a") + end + if blocks[index] ~= before and not closedAt then closedAt = frame end + drainedAt = frame + + -- From here on nothing is pressed: the trailing WaitSFX is supposed to hold + -- the world by itself. + local busyAfter, phaseFrames = 0, 0 + for _ = 1, 300 do + if world.fieldMove and world.fieldMove.phase == "whirlpoolsfx" then + phaseFrames = phaseFrames + 1 + end + if world:busy() then busyAfter = busyAfter + 1 else break end + frame = frame + 1 + coroutine.yield() + end + Sound.play = realPlay + U.shot(game, out .. "/02-cleared.png") + + -- ---- what was rung ------------------------------------------------------- + local surf, surfStarted, surfInPhase = nil, false, false + local heard = {} + for _, c in ipairs(calls) do + heard[#heard + 1] = ("%s@%d%s"):format(c.name, c.frame, + c.started and "" or "(dropped)") + if c.name == "Sfx_Surf" then + surf = c + surfStarted = surfStarted or c.started + surfInPhase = surfInPhase or c.phase == "whirlpoolsfx" + end + end + + claim(blocks[index] ~= before, + "the whirlpool block was replaced, so the drain really ran") + claim(surf ~= nil, "Sfx_Surf was asked for at all") + claim(surfStarted, + "and the priority gate let it start instead of dropping it") + claim(surfInPhase, + "it was rung from PlayWhirlpoolSound, not from somewhere else") + claim(closedAt == nil or (surf and surf.frame >= closedAt), + "it came after the text box took its button, not before") + claim(busyAfter >= 1, + ("the world stayed shut for %d frames after the box closed"):format( + busyAfter)) + -- The phase counts down from 180 whatever happens, so 180 flat is the cap + -- firing rather than the sound ending. + claim(phaseFrames > 0 and phaseFrames < 180, + ("the wash ended on its own after %d frames, inside the 180-frame cap") + :format(phaseFrames)) + if phaseFrames >= 180 then + U.log("the 180-frame cap is doing the work: Sound.sfxBusy never cleared,") + U.log("so check curSfx bookkeeping rather than raising the cap.") + elseif phaseFrames > 165 then + U.log(("note: only %d frames of margin under the cap"):format( + 180 - phaseFrames)) + end + + for _, line in ipairs(lines) do U.log(line) end + U.log("sfx rung across the drain: " .. table.concat(heard, " ")) + U.log(("%d checks, %d failed"):format(#lines, fails)) + if fails > 0 then + U.log("something above is FAIL, so do not spend time listening") + end + + -- ---- the replay, live ---------------------------------------------------- + -- + -- LoadMapAttributes refills the block buffer from ROM, so the whirlpool is + -- back on the next map load and the whole thing can be run again by ear. + world:setMap("NEW_BARK_TOWN", 13, 6, "down") + U.wait(10) + world:applyPlayerState(FieldMoves.PLAYER_SURF) + world:setMap(MAP, WHIRL.x, WHIRL.y - 1, "down") + world.noWildEncounters = true + U.wait(30) + U.log("the whirlpool is back; the replay starts in three seconds.") + U.wait(180) + for _ = 1, 24 do + if world.fieldMove and world.fieldMove.phase == "whirlpoolsfx" then break end + tap("a", 14) + end + for _ = 1, 240 do + if not world:busy() then break end + coroutine.yield() + end + + U.log("what right sounds like: the box takes its A-press beep, then the same") + U.log("wave wash SURF plays when you get on the water, and control only comes") + U.log("back once the wash has finished.") + U.log("silence with the block gone is the drop; a wash that starts under the") + U.log("beep, or control back in the same frame, is the wrong half fixed.") + U.log("the controls are yours -- the other whirlpools are further south.") + while true do coroutine.yield() end +end diff --git a/tests/drivers/museum_back_entrance_bug1690_test.lua b/tests/drivers/museum_back_entrance_bug1690_test.lua new file mode 100644 index 00000000..c22c1ede --- /dev/null +++ b/tests/drivers/museum_back_entrance_bug1690_test.lua @@ -0,0 +1,211 @@ +-- Manual check of the Pewter museum clerk's back-entrance branches (#1690). +-- scripts/Museum1F.asm:45 reads wYCoord/wXCoord before the ticket flag, so +-- (13,4) and (12,3) behind the counter get the AMBER question and row 4 in +-- front of it gets the ¥50 ask. This walks all three by itself. +-- Do not add POKEPORT_SPEED: fast-forward scales only the logic clock, and +-- what is being judged here is page order and the choice box timing. +-- POKEPORT_DRIVER=tests/drivers/museum_back_entrance_bug1690_test.lua POKEPORT_TOUCH=0 POKEPORT_VERSION=red POKEPORT_IDENTITY=bug1690 SHOT_DIR=/tmp/museum1690 love . +return function(game) + local U = dofile("tests/drivers/util.lua") + local TextBox = require("src.render.TextBox") + local ChoiceBox = require("src.ui.ChoiceBox") + local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots" + + local MAP = "MUSEUM_1F" + local CLERK_TEXT = "TEXT_MUSEUM1F_SCIENTIST1" + -- pokered data/maps/objects/Museum1F.asm: MUSEUM1F_SCIENTIST1 at (12,4), + -- counter column x==11, back door warps in at (16,7)/(17,7) + local BEHIND_EAST = { x = 13, y = 4, facing = "left" } + local BEHIND_NORTH = { x = 12, y = 3, facing = "down" } + local IN_FRONT = { x = 10, y = 4, facing = "right" } + + local function check(label, ok) + U.log(ok and "PASS" or "FAIL", label) + return ok + end + + -- every one of these failing looks exactly like the bug on screen: a + -- missing string, a renamed key or an unwalkable cell all end in silence + local t = game.data.text or {} + for _, key in ipairs({ + "_Museum1FScientist1DoYouKnowWhatAmberIsText", + "_Museum1FScientist1TheresALabSomewhereText", + "_Museum1FScientist1AmberIsFossilizedTreeSapText", + "_Museum1FScientist1GoToOtherSideText", + "_Museum1FScientist1WouldYouLikeToComeInText", + }) do + check(key .. " is in the text catalog", + type(t[key]) == "string" and t[key] ~= "") + end + + local function clerkIn(ow) + for _, n in ipairs(ow and ow.npcs or {}) do + if n.def and n.def.text == CLERK_TEXT then return n end + end + return nil + end + + local function boxText(box) + local shown = {} + for _, page in ipairs(box.pages or {}) do + for _, line in ipairs(page) do shown[#shown + 1] = line end + end + return table.concat(shown, " / ") + end + + -- talking works either straight at the clerk or across the counter tile + local function facingTheClerk() + local ow = game.overworld + local clerk = clerkIn(ow) + if not clerk then return false end + local fx, fy = ow.player:facingCell() + if ow:npcAtCell(fx, fy) == clerk then return true end + if ow.map:isCounterCell(fx, fy) then + local Collision = require("src.world.Collision") + local bx, by = Collision.target(fx, fy, ow.player.facing) + return ow:npcAtCell(bx, by) == clerk + end + return false + end + + -- teleport to `spot`, and if a map edit moved the counter fall back to any + -- free walkable neighbour of the clerk so this degrades instead of parking + -- the player at a wall + local function standAt(spot, label) + U.teleport(game, MAP, spot.x, spot.y, spot.facing) + U.wait(10) + if facingTheClerk() then return check(label .. ": in position", true) end + local ow = game.overworld + local clerk = clerkIn(ow) + if clerk then + local sides = { + { 0, 1, "up" }, { 0, -1, "down" }, { 1, 0, "left" }, { -1, 0, "right" }, + } + for _, s in ipairs(sides) do + local cx, cy = clerk.cellX + s[1], clerk.cellY + s[2] + if ow.map:isWalkableCell(cx, cy) and not ow:npcAtCell(cx, cy) then + U.log(("(%d,%d) does not reach the clerk, standing on") + :format(spot.x, spot.y), cx, cy, "facing", s[3]) + U.teleport(game, MAP, cx, cy, s[3]) + U.wait(10) + break + end + end + end + return check(label .. ": in position", facingTheClerk()) + end + + -- press A and wait for the dialogue box to actually mount + local function talk() + U.tap(game, "a") + for _ = 1, 60 do + local top = game.stack:top() + if getmetatable(top) == TextBox then return top end + U.wait(1) + end + return nil + end + + -- page through until the YES/NO box pops (the clerk's question is two + -- pages, so one A press sits between the box opening and the choice) + local function toChoice() + for _ = 1, 20 do + if getmetatable(game.stack:top()) == ChoiceBox then + return game.stack:top() + end + U.tap(game, "a") + U.wait(20) + end + return getmetatable(game.stack:top()) == ChoiceBox and game.stack:top() or nil + end + + -- ChoiceBox starts on YES; NO is one step down + local function answer(yes) + if not yes then U.tap(game, "down") U.wait(10) end + U.tap(game, "a") + for _ = 1, 60 do + local top = game.stack:top() + if getmetatable(top) == TextBox then return top end + U.wait(1) + end + return nil + end + + game.save.flags = game.save.flags or {} + game.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = nil + standAt(BEHIND_EAST, "east of the clerk (13,4)") + + local box = talk() + if check("A behind the counter opens a box", box ~= nil) then + U.log("box reads:", boxText(box)) + check("it is the can't-sneak-in-the-back-way line", + boxText(box):find("sneak", 1, true) ~= nil) + check("no money window rides along with it", box.money == nil) + U.shot(game, SHOT_DIR .. "/bug1690_a_sneak.png") + end + + local choice = toChoice() + if check("the AMBER question offers YES/NO", choice ~= nil) then + U.shot(game, SHOT_DIR .. "/bug1690_b_amber_choice.png") + local answered = answer(true) + if check("YES opens a follow-up box", answered ~= nil) then + U.log("YES reads:", boxText(answered)) + check("YES is the resurrection lab line", + boxText(answered):find("lab", 1, true) ~= nil) + U.shot(game, SHOT_DIR .. "/bug1690_c_lab.png") + end + end + + -- with the ticket already bought the coordinate check still wins: a + -- ticket holder round the back is told off, not thanked (asm:45 runs + -- before the CheckEvent at asm:59) + game.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = true + standAt(BEHIND_NORTH, "north of the clerk (12,3), ticket in hand") + box = talk() + if check("A north of the clerk opens a box", box ~= nil) then + U.log("box reads:", boxText(box)) + check("a ticket holder round the back still gets told off", + boxText(box):find("sneak", 1, true) ~= nil) + U.shot(game, SHOT_DIR .. "/bug1690_d_ticket_holder_sneak.png") + end + choice = toChoice() + if check("it still offers YES/NO", choice ~= nil) then + local answered = answer(false) + if check("NO opens a follow-up box", answered ~= nil) then + U.log("NO reads:", boxText(answered)) + check("NO is the fossilized tree sap line", + boxText(answered):find("tree sap", 1, true) ~= nil) + U.shot(game, SHOT_DIR .. "/bug1690_e_tree_sap.png") + end + end + + -- the control case: the public side of the counter is untouched + game.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = nil + game.save.money = 3000 + standAt(IN_FRONT, "in front of the counter (10,4)") + box = talk() + if check("A across the counter opens a box", box ~= nil) then + U.log("box reads:", boxText(box)) + check("the front of the counter is still the ¥50 ticket ask", + boxText(box):find("50", 1, true) ~= nil) + check("and it still raises the money window", box.money ~= nil) + U.shot(game, SHOT_DIR .. "/bug1690_f_ticket_ask.png") + end + + U.log("shots are in " .. SHOT_DIR .. ", in the order they were taken.") + U.log("behind the counter the clerk should say \"You can't sneak in the back") + U.log("way!\", then \"Oh, whatever! Do you know what AMBER is?\" with YES/NO,") + U.log("and never a money window. YES talks about a lab resurrecting ancient") + U.log("POKeMON, NO says AMBER is fossilized tree sap. The box left on screen") + U.log("now is the last case: standing at (10,4) with no ticket, which must") + U.log("still be the ¥50 ask with the money window in the corner.") + U.log("the near misses to watch for: a money window sitting behind the AMBER") + U.log("question, or \"Take your time, and enjoy it all!\" at (12,3) once the") + U.log("ticket flag is set, which would mean the ticket check ran first.") + U.log("Yellow shares this script, so POKEPORT_VERSION=yellow should read") + U.log("exactly the same at all three spots.") + + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/pet_cries_bug1687_1649_test.lua b/tests/drivers/pet_cries_bug1687_1649_test.lua new file mode 100644 index 00000000..bdcd9a8f --- /dev/null +++ b/tests/drivers/pet_cries_bug1687_1649_test.lua @@ -0,0 +1,303 @@ +-- Talks to all six pet Pokemon for you and lets each one cry: #1687 +-- (S.S. Anne WIGGLYTUFF + MACHOKE) and #1649 (Vermilion PIDGEY, Vermilion +-- City MACHOP, Fan Club PIKACHU + SEEL). pokered/scripts/*.asm, e.g. +-- VermilionPidgeyHouse.asm:15 text_far then PlayCry at :19. Never add +-- POKEPORT_SPEED: only the logic clock scales, so the cry lands in the +-- wrong place relative to the typing this run exists to judge. +-- POKEPORT_DRIVER=tests/drivers/pet_cries_bug1687_1649_test.lua POKEPORT_TOUCH=0 POKEPORT_VERSION=red POKEPORT_IDENTITY=petcries SHOT_DIR=/tmp/petcries love . +return function(game) + local U = dofile("tests/drivers/util.lua") + local TextBox = require("src.render.TextBox") + local Runtime = require("src.mods.Runtime") + local GameVersion = require("src.core.GameVersion") + local init = require("data.scripts.init") + + local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots" + local yellow = GameVersion.isYellow() + local failures = 0 + + local function check(label, ok) + if not ok then failures = failures + 1 end + U.log(ok and "PASS" or "FAIL", label) + return ok + end + + -- own tick counter: the ordering claim is "cry after the last character", + -- so the cry and the end of typing have to be stamped on the same clock + local ticks = 0 + local function step() ticks = ticks + 1; coroutine.yield() end + local function waitTicks(n) for _ = 1, n do step() end end + local function tap(btn) U.tap(game, btn); ticks = ticks + 1 end + + -- sound.played is the engine's own cue feed (src/core/Sound.lua played()), + -- which is the only way a script can tell "no cry" from "a cry nobody + -- could hear"; both sound identical on a quiet machine. + local cries = {} + local heard = false + if type(Runtime.events.on) == "function" then + Runtime.events:on("sound.played", function(p) + if p and p.kind == "cry" then + heard = true + cries[#cries + 1] = { name = p.name, species = p.species, tick = ticks } + end + end, 0, "driver") + end + + -- pokered/data/maps/objects, all cell coordinates: VermilionPidgeyHouse + -- PIDGEY (3,5), VermilionCity MACHOP (29,9), PokemonFanClub PIKACHU (6,4) + -- and SEEL (1,4), SSAnne1FRooms WIGGLYTUFF (3,11), SSAnneB1FRooms MACHOKE + -- (11,12). The two S.S. Anne rooms maps slide their objects between + -- cabins at load (src/world/SsAnneLayout.lua), so every position below is + -- read back off the live map instead of trusted from the list. + local PETS = { + { map = "VERMILION_PIDGEY_HOUSE", object = "VERMILIONPIDGEYHOUSE_PIDGEY", + const = "TEXT_VERMILIONPIDGEYHOUSE_PIDGEY", species = "PIDGEY", + label = "_VermilionPidgeyHousePidgeyText", + control = "VERMILIONPIDGEYHOUSE_YOUNGSTER" }, + { map = "SS_ANNE_1F_ROOMS", object = "SSANNE1FROOMS_WIGGLYTUFF", + const = "TEXT_SSANNE1FROOMS_WIGGLYTUFF", species = "WIGGLYTUFF", + label = "_SSAnne1FRoomsWigglytuffText", + control = "SSANNE1FROOMS_LITTLE_GIRL" }, + { map = "SS_ANNE_B1F_ROOMS", object = "SSANNEB1FROOMS_MACHOKE", + const = "TEXT_SSANNEB1FROOMS_MACHOKE", species = "MACHOKE", + label = "_SSAnneB1FRoomsMachokeText" }, + { map = "POKEMON_FAN_CLUB", object = "POKEMONFANCLUB_SEEL", + const = "TEXT_POKEMONFANCLUB_SEEL", species = "SEEL", + label = "_PokemonFanClubSeelText" }, + -- two boxes, cry on the first (VermilionCity.asm:224, PlayCry at :228) + { map = "VERMILION_CITY", object = "VERMILIONCITY_MACHOP", + const = "TEXT_VERMILIONCITY_MACHOP", species = "MACHOP", + label = "_VermilionCityMachopText", extraBoxes = 1 }, + } + if yellow then + -- pokeyellow/data/maps/objects/PokemonFanClub.asm: the pet is a CLEFAIRY + PETS[#PETS + 1] = { map = "POKEMON_FAN_CLUB", + object = "POKEMONFANCLUB_CLEFAIRY", + const = "TEXT_POKEMONFANCLUB_CLEFAIRY", species = "CLEFAIRY", + label = "_PokemonFanClubClefairyText" } + else + PETS[#PETS + 1] = { map = "POKEMON_FAN_CLUB", + object = "POKEMONFANCLUB_PIKACHU", + const = "TEXT_POKEMONFANCLUB_PIKACHU", species = "PIKACHU", + label = "_PokemonFanClubPikachuText" } + end + + -- ---------------------------------------------------------------- checks + -- Everything below produces the same silence the bug did, so it is worth + -- knowing before anyone bothers listening. + local vol = game.save and game.save.options and game.save.options.sfxVol + U.log("sfx volume is", tostring(vol), "of 7") + if not vol or vol == 0 then + check("sfx volume is above zero (a muted run sounds exactly like the bug)", + false) + end + if yellow and game.save.options.pikaVol == 0 then + U.log("pikaVol is 0: Yellow's Pikachu clips are muted independently") + end + + for _, pet in ipairs(PETS) do + local tag = pet.species .. " on " .. pet.map + local script = init.talkScript(pet.map, pet.const) + if check(tag .. " has a ported talk script", type(script) == "table") then + local cryAt + for i, row in ipairs(script) do + if type(row) == "table" and row[1] == "play_cry" then cryAt = i end + end + if check(tag .. " has a play_cry row", cryAt ~= nil) then + check(tag .. " cries " .. pet.species, script[cryAt][2] == pet.species) + check(tag .. " uses the waitForButton form", script[cryAt][3] == true) + local next_ = script[cryAt + 1] + check(tag .. " arms " .. pet.label .. " on the very next row", + type(next_) == "table" and next_[1] == "show_text" + and next_[2] == pet.label) + end + end + check(tag .. " has a cry program in this cache", + game.data.audio.cries and game.data.audio.cries[pet.species] ~= nil) + check(pet.label .. " resolves to text", + type(game.data.text[pet.label]) == "string") + end + + -- Sound.playCry sends PIKACHU to the PCM clips whenever the cache carries + -- them; that voiced "Pikachuuu" is Yellow's, and hearing it in Red is the + -- failure #1649 warned about up front. + if not yellow then + check("this cache has no Pikachu voice clips (Red must get the chip cry)", + game.data.audio.pikaCries == nil) + end + + if failures > 0 then + U.log(failures, "checks failed above, so do not bother listening yet;") + U.log("a missing row or an unresolved label sounds exactly like the bug.") + end + + -- ---------------------------------------------------------------- walking + local function findNpc(ow, name) + for _, n in ipairs(ow.npcs or {}) do + if n.def and n.def.name == name then return n end + end + return nil + end + + -- {dx, dy, facing}: the offset from the pet to the cell to stand on plus + -- the direction that looks back at it, so +1 on y means stand below. + local SIDES = { + { 0, 1, "up" }, { 0, -1, "down" }, { 1, 0, "left" }, { -1, 0, "right" }, + } + + local function approach(ow, npc) + for _, s in ipairs(SIDES) do + local cx, cy = npc.cellX + s[1], npc.cellY + s[2] + if ow.map:isWalkableCell(cx, cy) and not ow:npcAtCell(cx, cy) then + return cx, cy, s[3] + end + end + return nil + end + + -- PIDGEY and MACHOP are WALK objects and drift off their spawn cell, so + -- pin them once the final teleport has rebuilt the npc list. + local function pin(npc) + npc.wanders = false + npc:resetToSpawn() + npc.wanders = false + end + + local function standAt(mapId, objName) + local def + for _, o in ipairs((game.data.maps[mapId] or {}).objects or {}) do + if o.name == objName then def = o end + end + if not def then return nil end + -- first hop just mounts the map so the live cells can be read + U.teleport(game, mapId, def.x, math.max(0, def.y + 1), "up") + waitTicks(6) + local ow = game.overworld + local npc = ow and findNpc(ow, objName) + if not npc then return nil end + pin(npc) + local cx, cy, facing = approach(ow, npc) + if not cx then return nil end + U.teleport(game, mapId, cx, cy, facing) + waitTicks(6) + ow = game.overworld + npc = findNpc(ow, objName) + if not npc then return nil end + pin(npc) + local fx, fy = ow.player:facingCell() + if ow:npcAtCell(fx, fy) ~= npc then return nil end + return npc + end + + -- Opens the box, holds still while it types and cries, then reports where + -- the cry landed against the last typed character. + local function talk(name) + local before = #cries + tap("a") + local box, armed, doneTick + for _ = 1, 300 do + local top = game.stack:top() + if getmetatable(top) == TextBox then + box = top + -- box.auto is cleared the moment the cry finishes, so snapshot it + if armed == nil then armed = top.auto or false end + if top.done and not doneTick then doneTick = ticks end + end + if doneTick and #cries > before then break end + step() + end + if not check(name .. ": pressing A opened a text box", box ~= nil) then + return nil + end + local lines = {} + for _, page in ipairs(box.pages or {}) do + for _, line in ipairs(page) do lines[#lines + 1] = line end + end + U.log("box reads:", table.concat(lines, " / ")) + return box, armed, doneTick, before + end + + U.log("about to walk to each pet and talk to it; turn the volume up now.") + waitTicks(180) + + for _, pet in ipairs(PETS) do + local tag = pet.species .. " on " .. pet.map + U.log("walking to the", pet.species) + local npc = standAt(pet.map, pet.object) + if not check(tag .. ": standing face to face with it", npc ~= nil) then + U.log("skipping", pet.species, "-- could not reach it") + else + local box, armed, doneTick, before = talk(tag) + if box then + -- the dropped `true` shows up here: without it the box pops itself + -- when the cry ends and never blinks its arrow + check(tag .. ": the box was armed with a cry", + type(armed) == "table" and type(armed.sound) == "function") + check(tag .. ": the cry keeps the A/B wait (waitForButton)", + type(armed) == "table" and armed.wait == true) + local fired = cries[before + 1] + if check(tag .. ": a cry actually played", fired ~= nil) then + check(tag .. ": the cry was " .. pet.species, + fired.species == pet.species) + -- near miss: a cry that fires as the line starts typing + check(tag .. ": it played after the last character, not before", + doneTick ~= nil and fired.tick >= doneTick) + if pet.species == "PIKACHU" and not yellow then + check("PIKACHU used the chip cry, not Yellow's voice clip", + fired.name == "PIKACHU") + end + check(tag .. ": exactly one cry for this box", + #cries == before + 1) + end + waitTicks(90) + U.shot(game, SHOT_DIR .. "/pet_cry_" .. pet.species:lower() .. ".png") + check(tag .. ": the box is still up waiting for A", + getmetatable(game.stack:top()) == TextBox) + for _ = 1, (pet.extraBoxes or 0) + 1 do + tap("a") + waitTicks(40) + end + if pet.extraBoxes then + U.log("the MACHOP's second box is the stomping line; it has no cry") + end + waitTicks(30) + end + end + + -- a neighbour that is meant to stay silent, so a run with no audio + -- device at all cannot pass itself off as a working cry + if pet.control then + local silent = standAt(pet.map, pet.control) + if silent then + local mark = #cries + talk(pet.control .. " (control)") + check(pet.control .. ": the silent neighbour played no cry", + #cries == mark) + tap("a") + waitTicks(30) + tap("a") + waitTicks(20) + end + end + end + + -- ---------------------------------------------------------------- verdict + U.log("talked to all", #PETS, "pets;", #cries, "cries fired.") + if not heard then + U.log("no cry reached the mixer at all, which is the #1687 / #1649 bug") + end + U.log(failures == 0 and "all checks passed" or (failures .. " checks FAILED")) + U.log("what you should have heard, once per pet: the box types the line,") + U.log("then a short cry, and only then the down arrow starts blinking.") + U.log("a cry that starts while the line is still typing is wrong, and so") + U.log("is a box that closes itself when the cry ends instead of waiting.") + U.log("in Red the Fan Club PIKACHU is a short chip cry; the long voiced") + U.log("\"Pikachuuu\" belongs to Yellow, where the pet is a CLEFAIRY.") + U.log("re-run with POKEPORT_VERSION=blue and POKEPORT_VERSION=yellow.") + U.log("screenshots are in", SHOT_DIR) + + -- parked in front of the last pet, so another A press repeats its cry + while true do + coroutine.yield() + end +end diff --git a/tests/drivers/ss_anne_departure_bug360_test.lua b/tests/drivers/ss_anne_departure_bug360_test.lua index efa4aefe..11a1b49d 100644 --- a/tests/drivers/ss_anne_departure_bug360_test.lua +++ b/tests/drivers/ss_anne_departure_bug360_test.lua @@ -90,11 +90,11 @@ return function(game) if r[2] == "SS_Anne_Horn" then horns = horns + 1 end end check("the departure blows the horn twice", horns == 2) - local slide = 0 - for _, w in ipairs(rowsOfKind(dockRows, "wait")) do - if w[2] == 20 then slide = slide + 1 end - end - check("she sails in eight beats, not one frame", slide == 8) + check("she sails as one blocking slide, not a block shuffle", + #rowsOfKind(dockRows, "ss_anne_departs") == 1 + and #rowsOfKind(dockRows, "replace_block") == 0) + check("he keeps facing down until he walks out", + (rowsOfKind(dockRows, "face_player_dir")[1] or {})[2] == "down") check("no keepMusic override into the city", (function() for _, r in ipairs(rowsOfKind(dockRows, "play_music")) do if r[3] and r[3].keep then return false end @@ -130,10 +130,12 @@ return function(game) and game.save.flags.EVENT_SS_ANNE_LEFT == nil and game.save.flags.EVENT_BEAT_SS_ANNE_RIVAL == nil) - U.log("Watch for: she idles a couple of seconds with smoke off the funnel,") - U.log("one horn, then travels WEST a block at a time with the water closing") - U.log("in behind her, a second horn once she is gone, and the surf loop") - U.log("gives way to the Vermilion theme the moment you cross into town.") + U.log("Watch for: he turns to face DOWN and stays that way, she idles two") + U.log("seconds, one horn, then she slides WEST smoothly for about seventeen") + U.log("seconds with white smoke puffing off the front funnel and drifting") + U.log("east, the dock row he stands on never moving; a second horn once she") + U.log("is gone, the gangway stub still under his feet, then he walks up and") + U.log("the surf loop gives way to the Vermilion theme as you cross in.") U.teleport(game, DOCK, DOCK_CELL.x, DOCK_CELL.y, "up") local ow = game.overworld diff --git a/tests/drivers/wrap_anim_bug1653_test.lua b/tests/drivers/wrap_anim_bug1653_test.lua new file mode 100644 index 00000000..032025d8 --- /dev/null +++ b/tests/drivers/wrap_anim_bug1653_test.lua @@ -0,0 +1,404 @@ +-- Driver: Wrap's animation length and the blank tile-load beat that opens every +-- subanimation row (#1653). PlayAnimation calls LoadMoveAnimationTiles once per +-- row (engine/battle/animations.asm:252) and CopyVideoData blocks c/8 + 1 frames +-- (home/copy2.asm:62), so WrapAnim's three rows (data/moves/animations.asm:401) +-- cost 3 x 10 blank frames on top of the 30 the port already played. +-- No POKEPORT_SPEED: it scales only the logic clock while audio runs real-time, +-- which desyncs the sfx-against-pulse ordering this driver exists to judge. +-- POKEPORT_DRIVER=tests/drivers/wrap_anim_bug1653_test.lua POKEPORT_VERSION=red POKEPORT_TOUCH=0 POKEPORT_IDENTITY=bug1653 SHOT_DIR=/tmp/wrap love . +return function(game) + local U = dofile("tests/drivers/util.lua") + local DIR = os.getenv("SHOT_DIR") or "/tmp/shots" + local Pokemon = require("src.pokemon.Pokemon") + local BattleState = require("src.battle.BattleState") + local AnimPlayer = require("src.battle.AnimPlayer") + + local pass, fail = 0, 0 + local function check(label, ok) + if ok then pass = pass + 1 else fail = fail + 1 end + U.log(ok and "PASS" or "FAIL", label) + return ok + end + + -- ---- what the eye and ear cannot check --------------------------------- + U.log("#1653 Wrap animation length: machine checks") + + local ba = game.data.battle_anims + check("battle_anims is in the cache", ba ~= nil) + local anims = (ba or {}).moveAnims or {} + check("WRAP is in the move table", game.data.moves.WRAP ~= nil) + check("WRAP has an animation", anims.WRAP ~= nil) + + -- anim_tileset 79 / 79 / 64 (engine/battle/animations.asm:383): 79 tiles is + -- nine 8-tile chunks plus the tail frame, so tileset 0 blocks 10 frames + local sheet0 = (ba or {}).tilesheets and ba.tilesheets[0] + check(("tileset 0 declares %s tiles (anim_tileset 79)") + :format(tostring(sheet0 and sheet0.tiles)), + sheet0 ~= nil and sheet0.tiles == 79) + + -- WrapAnim is three identical rows: SUBANIM_0_BIND on tileset 0, delay 4 + local seq = (anims.WRAP or {}).seq or {} + check(("WRAP is %d subanimation rows (want 3)"):format(#seq), #seq == 3) + local rowsOk = #seq == 3 + for _, row in ipairs(seq) do + rowsOk = rowsOk and row.effect == nil and row.tileset == 0 + and row.delay == 4 and row.sound == "WRAP" + end + check("every WRAP row is a tileset-0 subanimation with sound WRAP", rowsOk) + + -- The move id in the row resolves to a real sfx program through moves.lua + local sfxName = (game.data.moves.WRAP or {}).anim + and game.data.moves.WRAP.anim.sound + check("WRAP's row sound resolves to a program (" .. tostring(sfxName) .. ")", + sfxName ~= nil and ((game.data.audio or {}).sfx or {})[sfxName] ~= nil) + + -- ---- the compiled timeline --------------------------------------------- + local function compile(move) + if not (ba and anims[move]) then return nil end + local p = AnimPlayer.new(ba) + local ok = pcall(p.start, p, move, false) + if not ok then return nil end + return p + end + + local function total(p) + local n = 0 + for _, s in ipairs(p.steps) do n = n + s.dur end + return n + end + + local function shapeOf(p) + local out = {} + for _, s in ipairs(p.steps) do + out[#out + 1] = ("%d/%d"):format(s.dur, #s.sprites) + end + return table.concat(out, " ") + end + + -- which step is on screen at `elapsed`, mirroring AnimPlayer:update + local function stepAt(p, elapsed) + local acc = 0 + for _, s in ipairs(p.steps) do + acc = acc + s.dur + if elapsed < acc then return s end + end + return nil + end + + local wrap = compile("WRAP") + check("WRAP compiles into a timeline", wrap ~= nil) + + if wrap then + U.log(" WRAP steps: " .. shapeOf(wrap)) + check(("WRAP is %d frames long (want 60, half-length bug gives 30)") + :format(total(wrap)), total(wrap) == 60) + check(("WRAP compiles to %d steps (want 9: three rows of load + 2 blocks)") + :format(#wrap.steps), #wrap.steps == 9) + + local shapeOk = #wrap.steps == 9 + for i = 1, 9 do + local s = wrap.steps[i] + if not s then shapeOk = false break end + if i % 3 == 1 then + shapeOk = shapeOk and s.dur == 10 and #s.sprites == 0 + else + shapeOk = shapeOk and s.dur == 5 and #s.sprites == 8 + end + end + check("steps 1, 4 and 7 are 10 blank frames and the other six are 5 frames " + .. "of 8 sprites", shapeOk) + + -- Near-miss guard. Paying the 10 frames AFTER a row's blocks also totals + -- 60, but it opens on sprites and ends on a blank tail, and every sound + -- lands 10 frames early. + local first, last = wrap.steps[1], wrap.steps[#wrap.steps] + check("the blank beat OPENS the animation (step 1 is blank, 10 frames)", + first ~= nil and #first.sprites == 0 and first.dur == 10) + check("...and does not close it (the last step draws sprites)", + last ~= nil and #last.sprites > 0) + + local sounds = {} + for _, ev in ipairs(wrap.events) do + if ev.sound then sounds[#sounds + 1] = ev end + end + check(("WRAP queues %d row sounds (want 3)"):format(#sounds), #sounds == 3) + local want = { 10, 30, 50 } + for i = 1, 3 do + local ev = sounds[i] + check(("sound %d fires at frame %s (want %d, after that row's tile load)") + :format(i, ev and tostring(ev.frame) or "nil", want[i]), + ev ~= nil and ev.frame == want[i] and ev.sound == "WRAP") + if ev then + local st = stepAt(wrap, ev.frame) + check(("sound %d lands on a frame with sprites on screen, not on the " + .. "blank beat"):format(i), + st ~= nil and #st.sprites > 0) + end + end + end + + -- ---- the same load, elsewhere: this was never Wrap-specific ------------ + -- POUND is one tileset-0 row, so it gains the same 10 frames. + local pound = compile("POUND") + if pound then + local s = pound.steps[1] + check(("POUND also opens on a 10-frame blank load (%s)") + :format(s and ("%d/%d"):format(s.dur, #s.sprites) or "nil"), + s ~= nil and s.dur == 10 and #s.sprites == 0) + end + + -- Tileset 2 declares 64 tiles, which is eight chunks plus the tail: 9 frames. + local ball = compile("TRADE_BALL_DROP_ANIM") + if ball then + local s = ball.steps[1] + check(("a tileset-2 animation opens on 9 blank frames instead of 10 (%s)") + :format(s and ("%d/%d"):format(s.dur, #s.sprites) or "nil"), + s ~= nil and s.dur == 9 and #s.sprites == 0) + end + + -- Control: TACKLE's animation is two special-effect rows and no subanimation, + -- so PlayAnimation never reaches LoadMoveAnimationTiles and nothing changes. + local tackle = compile("TACKLE") + if tackle then + check(("TACKLE, which has no subanimation row, is still %d frames " + .. "(the load is not charged blindly)"):format(total(tackle)), + total(tackle) == 6) + end + + -- ---- options that would fake a failure --------------------------------- + local opts = game.save.options or {} + check("battle animations are on in OPTION", opts.animations ~= false) + if opts.animations == false then + U.log(" ANIMATION is off, which skips the whole queued row: turn it on") + U.log(" in OPTION before judging anything below") + end + local vol = opts.sfxVol + if vol == 0 then + U.log(" sfxVol is 0: all three WRAP sfx will be SILENT, which sounds") + U.log(" exactly like the bug. Raise SFX in OPTION before listening") + else + U.log(" sfxVol " .. tostring(vol) .. ", so the three squeezes should be audible") + end + + U.log(("machine checks: %d passed, %d failed"):format(pass, fail)) + if fail > 0 then + U.log("something above says FAIL, so do not spend time watching the screen") + end + if not game.data.moves.WRAP then + U.log("no WRAP in the move table, so there is nothing to put on screen") + while true do coroutine.yield() end + end + + -- ---- put a Wrap on screen ---------------------------------------------- + -- data/generated/maps.lua ROUTE_1 is 10x18 blocks of open route, and pokered + -- data/maps/objects/Route1.asm parks its two youngsters at (5, 24) and + -- (15, 13), so the north end is empty. (5, 5) sits in the fence line in the + -- current cache, so the neighbour fallback below is the one that runs; the + -- battle is pushed straight in either way. + local MAP, SX, SY = "ROUTE_1", 5, 5 + + local ekans = Pokemon.new(game.data, "EKANS", 30) + ekans.moves = { { id = "WRAP", pp = game.data.moves.WRAP.pp } } + game.save.party = { ekans } + game.save.player.name = "RED" + + U.teleport(game, MAP, SX, SY, "down") + U.wait(12) + local ow = game.overworld + if ow and not ow.map:isWalkableCell(SX, SY) then + -- a map edit blocked the cell: take the nearest free neighbour instead + for _, d in ipairs({ { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } }) do + local cx, cy = SX + d[1], SY + d[2] + if ow.map:isWalkableCell(cx, cy) and not ow:npcAtCell(cx, cy) then + U.log(("(%d, %d) is blocked, standing on %d, %d"):format(SX, SY, cx, cy)) + U.teleport(game, MAP, cx, cy, "down") + U.wait(12) + ow = game.overworld + break + end + end + end + check("the overworld is up on " .. MAP, ow ~= nil and ow.map.id == MAP) + + local battle = BattleState.newWild(game, "PIDGEY", 20) + battle.onFinish = function() end + ow:pushBattle(battle) + for _ = 1, 400 do + if game.stack:top() == battle and (battle.introSlide or 0) == 0 then break end + U.wait(1) + end + check("the battle reached the screen", game.stack:top() == battle) + + -- a foe that survives the wrap chain, so the animation can repeat + battle.enemy.mon.stats.hp = 500 + battle.enemy.mon.hp = 500 + battle.enemy.shownHP = 500 + -- a wild PIDGEY that knows WHIRLWIND ends the fight the moment it picks it + for i = #battle.enemy.mon.moves, 1, -1 do + local id = battle.enemy.mon.moves[i].id + if id == "WHIRLWIND" or id == "ROAR" or id == "TELEPORT" then + table.remove(battle.enemy.mon.moves, i) + end + end + + -- ---- watch the live playback ------------------------------------------- + -- every frame the player is playing, record whether sprites are on screen, + -- so the blank load beats show up as runs in the trace + local runs, cur = {}, nil + if battle.animPlayer then + local realStart = battle.animPlayer.start + battle.animPlayer.start = function(self, moveId, isPlayer, o) + local r = realStart(self, moveId, isPlayer, o) + cur = { move = moveId, marks = {} } + runs[#runs + 1] = cur + return r + end + end + + -- U.shot spins frames of its own, which would punch a hole in the trace, so + -- the measuring turn runs with `shooting` off and a later turn takes the shot + local shooting, shot = false, false + local function sample() + if not (battle.animPlaying and cur and battle.animPlayer) then return end + local ap = battle.animPlayer + local st = ap.steps[ap.stepIndex] + if not st then return end + local lit = #st.sprites > 0 + cur.marks[#cur.marks + 1] = lit and 1 or 0 + if shooting and not shot and lit and cur.move == "WRAP" then + shot = true + U.shot(game, DIR .. "/bug1653_wrap_squeeze.png") + end + end + + local function runLengths(marks) + local out, run, val = {}, 0, nil + for _, m in ipairs(marks) do + if m ~= val then + if val ~= nil then + out[#out + 1] = ("%s %d"):format(val == 1 and "sprites" or "blank", run) + end + val, run = m, 0 + end + run = run + 1 + end + if val ~= nil then + out[#out + 1] = ("%s %d"):format(val == 1 and "sprites" or "blank", run) + end + return table.concat(out, ", ") + end + + -- step n frames, sampling each one, pressing A only while a box is up: an A + -- on the FIGHT menu opens the move list and fires a move behind our back + local function pump(n, mash, stop) + for i = 1, n do + if mash and i % mash == 0 and battle.phase == "messages" then + table.insert(game.input.pressQueue, "a") + end + U.wait(1) + game.input.state.a = false + sample() + if stop and stop() then return end + end + end + + local function toMenu() + pump(1200, 6, function() return battle.phase == "menu" and #battle.queue == 0 end) + return battle.phase == "menu" + end + + -- FIGHT is menuIndex 1 of the 2x2 grid, and WRAP is the only move on the list + local function useWrap() + for _ = 1, 80 do + if battle.phase == "moveSelect" then break end + if battle.phase == "menu" then + if battle.menuIndex ~= 1 then + U.tap(game, battle.menuIndex > 2 and "up" or "left") + else + U.tap(game, "a") + end + else + U.tap(game, "a") + end + for _ = 1, 3 do U.wait(1) sample() end + end + if battle.phase ~= "moveSelect" then return false end + for _ = 1, 20 do + if battle.phase ~= "moveSelect" then return true end + U.tap(game, "a") + for _ = 1, 3 do U.wait(1) sample() end + end + return false + end + + -- the foe animates too, so pick the player's WRAP row out of the list + local function wrapRun() + for i = #runs, 1, -1 do + if runs[i].move == "WRAP" and #runs[i].marks > 0 then return runs[i] end + end + return nil + end + + check("the battle reached its FIGHT menu", toMenu()) + + local sent = false + for _ = 1, 6 do + -- WRAP is 85% accurate and the foe leans on SAND-ATTACK, so hand the + -- accuracy back each try rather than reading a whiff as a regression + battle.player.stages.accuracy = 0 + sent = useWrap() + if not sent then break end + pump(900, 8, function() + return wrapRun() ~= nil and not battle.animPlaying + end) + if wrapRun() then break end + U.log(" WRAP did not connect that turn; using it again") + toMenu() + end + check("chose WRAP from the move menu", sent) + + local played = wrapRun() + check("WRAP's animation actually played on screen", played ~= nil) + if played then + U.log((" live playback: %d frames, %s") + :format(#played.marks, runLengths(played.marks))) + -- the sampler runs once per fixed step and can slip a frame against the + -- battle's own update, so the compiled timeline above is the exact + -- authority; this only has to rule out the 30-frame version + check(("live playback is around 60 frames, not 30 (measured %d)") + :format(#played.marks), #played.marks >= 50) + end + -- WRAP traps the foe, so the next turn replays it: measurement is done, so + -- now let the sampler stop and catch a squeeze mid-coil for the record + shooting = true + for _ = 1, 4 do + if shot then break end + if battle.phase == "menu" then + battle.player.stages.accuracy = 0 + if not useWrap() then break end + end + pump(600, 8, function() return shot end) + end + if not shot then U.log(" no lit WRAP frame to capture") end + U.shot(game, DIR .. "/bug1653_wrap_after.png") + + -- ---- hand off ---------------------------------------------------------- + U.log("the pad is yours in a battle where the EKANS knows only WRAP (#1653),") + U.log("so pick FIGHT then WRAP and watch. the coils should squeeze the PIDGEY") + U.log("three separate times, each squeeze about a sixth of a second, with a") + U.log("clear blank beat of the same length before each one -- roughly a second") + U.log("end to end. the old bug ran the three squeezes together as one half-") + U.log("second smear with no gaps.") + U.log("listen as well as look: each of the three WRAP sfx should land as the") + U.log("coils appear. an sfx that fires while the screen is still blank, with") + U.log("the pause moved to the end of the animation, is the near miss that") + U.log("still measures 60 frames.") + U.log("wrap traps the foe, so the animation repeats over the next few turns") + U.log("and you can watch it more than once. any other move works the same") + U.log("way: every animation in the game now opens on that blank beat.") + U.log("screenshots: " .. DIR .. "/bug1653_*.png") + + while true do + coroutine.yield() + end +end diff --git a/tests/engine/bag_bicycle_no_options_bug1705.lua b/tests/engine/bag_bicycle_no_options_bug1705.lua new file mode 100644 index 00000000..772144aa --- /dev/null +++ b/tests/engine/bag_bicycle_no_options_bug1705.lua @@ -0,0 +1,244 @@ +-- The BICYCLE is used straight off the item list, with no USE/TOSS box +-- (#1705). +-- +-- StartMenu_Item's .choseItem reads wCurItem and, before it ever loads +-- USE_TOSS_MENU_TEMPLATE into wTextBoxID, does `cp BICYCLE / jp z, +-- .useOrTossItem` (engine/menus/start_sub_menus.asm:340-342). So the bike +-- mounts, dismounts or refuses on one A press, and -- having no TOSS row to +-- reach -- can never be thrown away from the bag at all. Every other item, +-- key items included, still gets the option box. +-- +-- The port pushed the USE/TOSS Menu for every field item, so the bike took +-- two presses and offered a TOSS the cart does not. +-- luajit tests/engine/bag_bicycle_no_options_bug1705.lua + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +local check, eq = T.check, T.eq +love = love or require("tests.love_stub") + +package.loaded["src.core.Sound"] = { play = function() end, playCry = function() end } +local music = {} +package.loaded["src.core.Music"] = { + playMap = function(_, mapId, biking) music[#music + 1] = { mapId, biking } end, +} +package.loaded["src.render.TextBox"] = { + new = function(_, text, done) return { textBox = true, text = text, done = done } end, + soundOpts = function() return nil end, +} +package.loaded["src.ui.BagMenu"] = nil +local BagMenu = require("src.ui.BagMenu") +local Menu = require("src.ui.Menu") +require("src.ui.Screens").invalidate() + +local Fixtures = require("tests.modkit.fixtures") +local Bag = require("src.inventory.Bag") + +local Data = Fixtures.fresh() +-- the fixture item table carries neither, and BagMenu reads only +-- name/keyItem/machine off a def; the branches under test key on the id +Data.items.BICYCLE = { id = "BICYCLE", index = 6, name = "BICYCLE", price = 0, + keyItem = true } +Data.items.TOWN_MAP = { id = "TOWN_MAP", index = 5, name = "TOWN MAP", + price = 0, keyItem = true } +Data.items.FIX_POTION = Data.items.FIX_POTION + or { id = "FIX_POTION", index = 20, name = "FIX POTION", price = 300 } + +local BIKE_MAP = { id = "FIX_TOWN", def = { tileset = "OVERWORLD" } } + +local function freshGame(extras) + local game = { + data = Data, + save = { + party = {}, + player = { name = "RED", id = 1 }, + inventory = {}, + options = {}, + flags = {}, + money = 0, + }, + } + game.stack = { + states = {}, + push = function(self, s) table.insert(self.states, s) end, + pop = function(self) return table.remove(self.states) end, + top = function(self) return self.states[#self.states] end, + } + game.input = { pressed = nil } + function game.input:wasPressed(b) return self.pressed == b end + function game.input:isDown() return false end + -- IsBikeRidingAllowed reads the tileset off the loaded map, and the + -- mount/dismount lines read the player's name off the save + game.overworld = { map = BIKE_MAP, player = { surfing = false } } + Bag.add(game.save, "FIX_POTION", 3) + Bag.add(game.save, "BICYCLE", 1) + Bag.add(game.save, "TOWN_MAP", 1) + for k, v in pairs(extras or {}) do game.save[k] = v end + return game +end + +local function rowFor(list, id) + for i, r in ipairs(list.items) do + if r.value == id then return i end + end + return nil +end + +local function isMenu(s) return getmetatable(s) == Menu end +local function isBox(s) return type(s) == "table" and s.textBox == true end + +local function inStack(game, pred) + for _, s in ipairs(game.stack.states) do + if pred(s) then return true end + end + return false +end + +-- Open the bag, put the cursor on `id` and press A once. Returns the list +-- and every state the press left on the stack above it, so a USE/TOSS box +-- that appears and is then replaced is still caught. +local function chooseOnce(game, id) + local list = BagMenu.new(game, {}) + game.stack:push(list) + local row = rowFor(list, id) + if not row then return nil, nil, "no " .. id .. " row in the bag" end + list.index = row + local seen = {} + local realPush = game.stack.push + game.stack.push = function(self, s) + seen[#seen + 1] = s + return realPush(self, s) + end + game.input.pressed = "a" + list:update(1 / 60) + game.input.pressed = nil + game.stack.push = realPush + return list, seen +end + +local function sawMenu(seen) + for _, s in ipairs(seen or {}) do + if isMenu(s) then return true end + end + return false +end + +local function boxText(game) + local top = game.stack:top() + return isBox(top) and top.text or nil +end + +-- on foot, somewhere cycling is allowed: one A press mounts +do + music = {} + local game = freshGame() + local list, seen, why = chooseOnce(game, "BICYCLE") + if check(list ~= nil, "the bag opened on the BICYCLE row: " .. tostring(why)) then + check(not sawMenu(seen), + "no USE/TOSS Menu was pushed, not even for a frame (:340-342)") + eq(game.save.onBike, true, "the single press mounted the bike") + local said = boxText(game) + if check(said ~= nil, "and printed a line") then + check(said:find("got on", 1, true) ~= nil, + "which is the mount text: " .. tostring(said)) + end + eq(game.save.inventory.BICYCLE, 1, "the bike is still in the bag") + eq(#music, 1, "the bike theme was cued once") + check(music[1] and music[1][2] == true, "as the riding track") + end +end + +-- already riding: the same single press dismounts +do + music = {} + local game = freshGame({ onBike = true }) + local list, seen = chooseOnce(game, "BICYCLE") + if check(list ~= nil, "the bag opened while riding") then + check(not sawMenu(seen), "still no option box on the way off the bike") + eq(game.save.onBike, false, "one press dismounted") + local said = boxText(game) + if check(said ~= nil, "and printed a line") then + check(said:find("got off", 1, true) ~= nil, + "which is the dismount text: " .. tostring(said)) + end + check(music[1] and music[1][2] == false, "and the map theme came back") + end +end + +-- Cycling Road: the refusal is reached on the same single press, and the +-- item list stays open behind it (`jp ItemMenuLoop`, #513) +do + local game = freshGame({ onBike = true, forcedBike = true }) + local list, seen = chooseOnce(game, "BICYCLE") + if check(list ~= nil, "the bag opened on the Cycling Road") then + check(not sawMenu(seen), "the refusal is not behind an option box either") + eq(game.save.onBike, true, "and the player is still riding") + local said = boxText(game) + if check(said ~= nil, "the refusal printed") then + check(said:find("get off", 1, true) ~= nil, + "with _CannotGetOffHereText: " .. tostring(said)) + end + check(inStack(game, function(s) return s == list end), + "the bag list is still on the stack under it (#513)") + end +end + +-- somewhere cycling is not allowed: still one press, still no box +do + local game = freshGame() + game.overworld.map = { id = "FIX_INDOORS", def = { tileset = "FIX_HOUSE" } } + local list, seen = chooseOnce(game, "BICYCLE") + if check(list ~= nil, "the bag opened indoors") then + check(not sawMenu(seen), "the no-cycling refusal skips the box too") + eq(game.save.onBike, nil, "and nothing was mounted") + local said = boxText(game) + check(said ~= nil and said:find("cycling", 1, true) ~= nil, + "NoCyclingAllowedHere printed: " .. tostring(said)) + end +end + +-- the control cases: everything else still gets USE/TOSS, key items included +do + local game = freshGame() + local list, seen = chooseOnce(game, "FIX_POTION") + if check(list ~= nil, "the bag opened on a plain item") then + check(sawMenu(seen), "an ordinary item still opens the option box") + check(isMenu(game.stack:top()), "and it is what the A press left on top") + end +end + +do + local game = freshGame() + local list, seen = chooseOnce(game, "TOWN_MAP") + if check(list ~= nil, "the bag opened on the TOWN MAP") then + check(sawMenu(seen), + "another key item still gets the box: pokered special-cases the " + .. "BICYCLE by id, not key items as a class") + end +end + +-- the box the bike no longer opens is the only route to TOSS, so the bike +-- cannot be thrown away from the bag at all +do + local game = freshGame() + local list, seen = chooseOnce(game, "BICYCLE") + if check(list ~= nil, "the bag opened on the BICYCLE row") then + local rows = {} + for _, s in ipairs(seen or {}) do + for _, it in ipairs((isMenu(s) and s.items) or {}) do + rows[#rows + 1] = tostring(it.label) + end + end + eq(#rows, 0, "the press offered no menu rows at all, TOSS included") + eq(game.save.inventory.BICYCLE, 1, "and the bike survives the press") + end +end + +package.loaded["src.core.Sound"] = nil +package.loaded["src.core.Music"] = nil +package.loaded["src.render.TextBox"] = nil +package.loaded["src.ui.BagMenu"] = nil +require("src.ui.Screens").invalidate() + +T.finish() diff --git a/tests/engine/bag_cancel_row_bug1685.lua b/tests/engine/bag_cancel_row_bug1685.lua new file mode 100644 index 00000000..ad33646f --- /dev/null +++ b/tests/engine/bag_cancel_row_bug1685.lua @@ -0,0 +1,253 @@ +-- The bag list ends on the terminator's CANCEL row (#1685). +-- +-- pokered's item lists are $ff-terminated. PrintListMenuEntries walks four +-- entries and, on the terminator, `jp z, .printCancelMenuItem` -- which is +-- `ld de, ListMenuCancelText / jp PlaceString`, a TAIL jump that RETURNS +-- from PrintListMenuEntries (home/list_menu.asm:371-372, 523-528). The '▼' +-- at :518-522 is only reached by the fall-through, so any page showing +-- CANCEL shows no down arrow. DisplayListMenuIDLoop compares the selection +-- against wListCount and takes ExitListMenu when it is the row past the last +-- item (:105-110), which is the same exit B takes. +-- +-- The port emitted one row per bag entry and stopped, so the list had no +-- CANCEL to walk onto and printed an invented "Nothing here." when the bag +-- was empty. +-- luajit tests/engine/bag_cancel_row_bug1685.lua + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") +local check, eq = T.check, T.eq +love = love or require("tests.love_stub") + +-- Font wants a real atlas and this suite is about what lands on which row, +-- so it records the calls instead (the shape tests/engine/ +-- bag_item_box_bug1521.lua uses). ListMenu and Theme bind Font at require +-- time, and BagMenu binds ListMenu and TextBox at require time. +local calls = {} +package.loaded["src.render.Font"] = { + BORDER = { tl = 1, tr = 2, bl = 3, br = 4, h = 5, v = 6 }, + draw = function(text, x, y) calls[#calls + 1] = { "draw", text, x, y } end, + drawCode = function(code, x, y) calls[#calls + 1] = { "code", code, x, y } end, + drawBox = function(tx, ty, tw, th) calls[#calls + 1] = { "box", tx, ty, tw, th } end, + width = function(text) return #tostring(text) * 8 end, + -- Menu.new sizes its box off split(); reaching it at all is the failure + -- this suite reports, so the stub answers instead of erroring + split = function(text) + local spans = {} + for i = 1, #tostring(text) do spans[i] = { from = i, to = i, code = 0 } end + return spans + end, +} +package.loaded["src.core.Sound"] = { play = function() end, playCry = function() end } +package.loaded["src.render.TextBox"] = { + new = function(_, text, done) return { textBox = true, text = text, done = done } end, + soundOpts = function() return nil end, +} +package.loaded["src.ui.ListMenu"] = nil +package.loaded["src.ui.Theme"] = nil +package.loaded["src.ui.BagMenu"] = nil +local ListMenu = require("src.ui.ListMenu") +local Theme = require("src.ui.Theme") +local BagMenu = require("src.ui.BagMenu") +require("src.ui.Screens").invalidate() + +local Fixtures = require("tests.modkit.fixtures") +local Bag = require("src.inventory.Bag") +local Strings = require("src.core.Strings") + +local CANCEL = Strings("CANCEL") + +local Data = Fixtures.fresh() +for i = 1, 6 do + local id = "FIXITEM_" .. i + Data.items[id] = { id = id, index = 100 + i, name = "FIX ITEM " .. i, + price = 100, tossable = true } +end + +local function freshGame(count) + local game = { + data = Data, + save = { + party = {}, + player = { name = "RED", id = 1 }, + inventory = {}, + options = {}, + flags = {}, + money = 0, + }, + } + game.stack = { + states = {}, + push = function(self, s) table.insert(self.states, s) end, + pop = function(self) return table.remove(self.states) end, + top = function(self) return self.states[#self.states] end, + } + -- one button edge per update, the way Input reports a fixed step + game.input = { pressed = nil } + function game.input:wasPressed(b) return self.pressed == b end + function game.input:isDown() return false end + for i = 1, count do Bag.add(game.save, "FIXITEM_" .. i, i) end + return game +end + +local function openBag(game, opts) + local list = BagMenu.new(game, opts) + game.stack:push(list) + return list +end + +local function found(kind, pred) + for _, c in ipairs(calls) do + if c[1] == kind and pred(c) then return c end + end + return nil +end + +local function drawnAt(text, x, y) + return found("draw", function(c) + return c[2] == text and c[3] == x and (y == nil or c[4] == y) + end) +end + +local function press(list, btn) + list.game.input.pressed = btn + list:update(1 / 60) + list.game.input.pressed = nil +end + +-- the row itself: one CANCEL after the last bag entry, carrying no id and no +-- quantity (home/list_menu.asm:523-528) +do + local game = freshGame(6) + local list = openBag(game) + eq(#list.items, 7, "six bag entries plus the terminator's CANCEL row") + local last = list.items[#list.items] + eq(last.label, CANCEL, "the last row is CANCEL") + eq(last.cancel, true, "flagged as the terminator row, not an item") + eq(last.value, nil, "with no item id behind it") + eq(last.right, nil, "and no 'xN' count (PrintListMenuEntries never gets " + .. "that far for the terminator)") + eq(CANCEL, "CANCEL", "ListMenuCancelText reads CANCEL") + for i = 1, 6 do + eq(list.items[i].value, "FIXITEM_" .. i, "row " .. i .. " is still its item") + end +end + +-- page one of a long list: four real names, the '▼', no CANCEL yet +do + local game = freshGame(6) + local list = openBag(game) + calls = {} + list:draw() + for row = 1, 4 do + local y = 32 + (row - 1) * 16 + check(drawnAt("FIX ITEM " .. row, 48, y) ~= nil, + "name " .. row .. " sits at (48, " .. y .. ")") + end + check(found("draw", function(c) return c[2] == CANCEL end) == nil, + "CANCEL is below the fold on page one, not printed on it") + check(found("code", function(c) + return c[2] == Theme.moreArrow and c[3] == 144 and c[4] == 88 + end) ~= nil, "four real rows fill the page, so the '▼' prints (:518-522)") +end + +-- walking down: the cursor reaches CANCEL and stops there, and the page it +-- lands on drops the '▼' +do + local game = freshGame(6) + local list = openBag(game) + for _ = 1, 6 do press(list, "down") end + eq(list.index, 7, "six downs put the cursor on the CANCEL row") + eq(list.scroll, 4, "with the scroll capped at wListCount - 2") + press(list, "down") + eq(list.index, 7, "and a seventh down goes nowhere: CANCEL is the last row") + eq(list.scroll, 4, "the list does not scroll past it either") + + calls = {} + list:draw() + -- rows 5, 6, CANCEL, then the terminator's return + check(drawnAt("FIX ITEM 5", 48, 32) ~= nil, "FIX ITEM 5 leads the last page") + check(drawnAt(CANCEL, 48, 64) ~= nil, + "CANCEL sits one row below the last item, at the item names' x") + check(found("code", function(c) + return c[2] == Theme.cursor and c[3] == 40 and c[4] == 64 + end) ~= nil, "the cursor is on it, in wTopMenuItemX's column") + check(found("code", function(c) return c[2] == Theme.moreArrow end) == nil, + "and the '▼' is gone: .printCancelMenuItem returns before it") +end + +-- the subtle one: three items plus CANCEL fills all four printed rows, so +-- `shown == rows` alone would still paint the arrow next to CANCEL +do + local game = freshGame(3) + local list = openBag(game) + eq(#list.items, 4, "three items and CANCEL exactly fill the four rows") + calls = {} + list:draw() + check(drawnAt(CANCEL, 48, 80) ~= nil, "CANCEL is the fourth printed row") + check(found("code", function(c) return c[2] == Theme.moreArrow end) == nil, + "a full page whose last row is CANCEL still prints no '▼' (:371-372)") +end + +-- an empty bag is a box with CANCEL alone, which is what the cart shows +do + local game = freshGame(0) + local list = openBag(game) + eq(#list.items, 1, "no items: the terminator is the whole list") + eq(list.items[1] and list.items[1].cancel, true, "and that row is CANCEL") + calls = {} + list:draw() + check(drawnAt(CANCEL, 48, 32) ~= nil, "printed on the first row") + check(found("draw", function(c) + return tostring(c[2]):find("Nothing here", 1, true) ~= nil + end) == nil, "the port's invented \"Nothing here.\" line is gone") + check(found("code", function(c) return c[2] == Theme.moreArrow end) == nil, + "one row, no '▼'") +end + +-- A on CANCEL is ExitListMenu: the same exit B takes (:105-110) +do + local game = freshGame(6) + local cancels = 0 + local list = openBag(game, { onCancel = function() cancels = cancels + 1 end }) + for _ = 1, 6 do press(list, "down") end + eq(list.index, 7, "cursor on CANCEL") + press(list, "a") + check(game.stack:top() ~= list, "A on CANCEL leaves the item list") + eq(#game.stack.states, 0, "with nothing pushed over it: no USE/TOSS box, " + .. "no message") + eq(cancels, 1, "and the caller's onCancel ran, exactly as for B") +end + +do + local game = freshGame(6) + local cancels = 0 + local list = openBag(game, { onCancel = function() cancels = cancels + 1 end }) + press(list, "b") + check(game.stack:top() ~= list, "B still exits the list") + eq(cancels, 1, "through the same callback") +end + +-- SELECT swaps two bag entries; the terminator is not one +-- (engine/menus/swap_items.asm:19-22) +do + local game = freshGame(6) + local list = openBag(game) + for _ = 1, 6 do press(list, "down") end + press(list, "select") + eq(list.swapIndex, nil, "SELECT on the CANCEL row starts no swap") + press(list, "up") + press(list, "select") + eq(list.swapIndex, 6, "while SELECT on a real row still does") +end + +package.loaded["src.render.Font"] = nil +package.loaded["src.core.Sound"] = nil +package.loaded["src.render.TextBox"] = nil +package.loaded["src.ui.ListMenu"] = nil +package.loaded["src.ui.Theme"] = nil +package.loaded["src.ui.BagMenu"] = nil +require("src.ui.Screens").invalidate() + +T.finish() diff --git a/tests/engine/cart_launcher.lua b/tests/engine/cart_launcher.lua index 7eeda51d..40c0adad 100644 --- a/tests/engine/cart_launcher.lua +++ b/tests/engine/cart_launcher.lua @@ -96,6 +96,38 @@ eq(#imp:_ensureCarts("blue"), 1, "blue lists only its own cart") eq(imp:_ensureCarts("blue")[1].id, "johto_lite", "and that one is Johto Lite") eq(#imp:_ensureCarts("yellow"), 0, "a game with no carts lists none") +-- A .g1rcart dropped into the carts folder by hand, with no registry entry: +-- the launcher must adopt it, not read past it. _refreshCarts used to call +-- CartStore.index (registry only) and never saw one. +do + local stray = CartManifest.parse(cartTable({ + id = "dropped_in", title = "Dropped In", version = "2.0.0" })) + check(stray ~= nil, "the stray fixture parses") + local opts = SaveData.loadOptions() + opts[CartStore.OPTIONS_KEY] = nil + SaveData.saveOptions(opts) + love.filesystem.createDirectory(CartStore.DIR) + love.filesystem.write(CartStore.fileFor("dropped_in"), + CartManifest.encode(stray)) + + local fresh = freshLauncher() + local found + for _, row in ipairs(fresh:_ensureCarts("red")) do + if row.id == "dropped_in" then found = row end + end + check(found ~= nil, "the launcher lists a cart dropped into the folder") + if found then + eq(found.title, "Dropped In", "and reads its title from the file") + eq(found.base, "red", "and its base game") + end + eq(CartStore.index()[1] ~= nil, true, + "listing healed the registry so the cheap index sees it too") + + -- Put the fixture set back: later blocks assert on the picker's own layout, + -- and a third red cart changes its height. + CartStore.uninstall("dropped_in") +end + imp.tab = "red" imp.ready.red = true imp._cartPopup = "red" @@ -109,8 +141,9 @@ check(picker:find("Johto Lite", 1, true) == nil, check(picker:find("v1.2.0", 1, true) ~= nil, "a cart row carries its version") check(picker:find("sealed", 1, true) ~= nil, "a cart row carries its seal state") check(picker:find("open", 1, true) ~= nil, "including an open one") -check(picker:find("Get more carts", 1, true) ~= nil, - "the last row is the browse placeholder") +check(picker:find("Import a cart", 1, true) ~= nil + or picker:find("Get more carts", 1, true) ~= nil, + "the last row imports a cart, by picker or by folder") imp._cartPopup = nil local vanillaColors = drawColors(imp) @@ -305,14 +338,14 @@ local maker = freshLauncher() maker.tab = "red" maker.ready.red = true maker:_setModScope("red") -eq(maker:_cartCaptureCount("red"), 2, - "the control counts only the mods enabled for this game") +eq(maker:_cartCaptureCount("red"), 3, + "the control counts every mod the capture would pin, on or off") maker:_beginCartSave("red") check(maker._cartSave ~= nil, "Save as cart opens a form") -eq(maker._cartSave.count, 2, "the form reports the captured mod count") +eq(maker._cartSave.count, 3, "the form reports the captured mod count") eq(maker._cartSave.version, "red", "scoped to the game the panel is showing") -eq(#maker._cartSave.unresolved, 1, "capture reports one pin it could not resolve") +eq(#maker._cartSave.unresolved, 2, "capture reports the pins it could not resolve") eq(maker._cartSave.unresolved[1].id, "wide_gym", "naming the mod it belongs to") check(tostring(maker._cartSave.unresolved[1].reason):find("semantic", 1, true) ~= nil, "and why it could only be pinned locally") @@ -345,7 +378,13 @@ eq(made.base, "red", "based on the game the panel was showing") eq(made.version, "1.0.0", "at the default cart version") eq(made.seal, "sealed", "sealed by default") eq(made.shell, "#ff3c48", "wearing the base game's rail colour") -eq(#made.mods, 2, "pinning exactly the enabled mods") +eq(#made.mods, 3, "pinning every installed mod, on or off") +local madeOff +for _, entry in ipairs(made.mods) do + if entry.id == "off_mod" then madeOff = entry end +end +check(madeOff ~= nil, "including the one the player has switched off") +eq(madeOff.enabled, false, "which is pinned switched off rather than dropped") local listedNow = false for _, row in ipairs(maker:_ensureCarts("red")) do @@ -472,9 +511,513 @@ eq(SaveData.slotSealBroken("kanto_plus", freshSlot), false, "starts sealed again") eq(gapCart:cartPlan("red").refused, true, "so the cart refuses that one") +install({ id = "plus_cart", title = "Plus Cart", seal = "sealed+", + shell = "#445566" }) +LauncherMods.list = function() return FULL_MODS end +local plusCart = freshLauncher() +plusCart.tab = "red" +plusCart.ready.red = true +plusCart._cartPopup = "red" +local plusPicker = drawAndCapture(plusCart) +check(plusPicker:find("sealed+", 1, true) ~= nil, + "the picker spells a sealed+ cart's seal out") +plusCart._cartPopup = nil +plusCart:_selectCart("red", "plus_cart") +local plusPlan = plusCart:cartPlan("red") +eq(plusPlan.seal, "sealed+", "the plan carries the sealed+ seal") +eq(plusPlan.sealed, true, "sealed+ is a sealed cart") +eq(plusPlan.enforced, true, "and enforces its mod set") +local plusText = drawAndCapture(plusCart) +check(plusText:find("Sealed", 1, true) ~= nil, "the page says it is sealed") +check(plusText:find("switch any of them on or off", 1, true) ~= nil, + "and that the player may switch the mods it pins") +check(plusText:find("Break the seal", 1, true) ~= nil, + "while still offering the escape hatch") +eq(SaveData.slotSealBroken("plus_cart", + plusCart.activeSlot[plusCart:slotScope("red")] or "slot1"), false, + "and reading the page breaks nothing") + +-- ------- installing the mods a cart pins, instead of defeating its seal + +local ModUpdate = require("src.mods.ModUpdate") +local realFetchBegin, realFetchPump = + ModUpdate.beginFetchReleases, ModUpdate.pumpFetchReleases +local realDlBegin, realDlPump = + ModUpdate.beginDownloadZip, ModUpdate.pumpDownloadZip +local realInstallDownloaded = LauncherMods.installDownloadedZip + +love.data = love.data or {} +local savedData = { hash = love.data.hash, encode = love.data.encode } +-- The archive's digest IS its bytes here, so a fixture writes the hash it +-- wants the downloaded zip to have. +love.data.hash = function(_, data) return tostring(data) end +love.data.encode = function(_, _, digest) return tostring(digest) end + +local SHA_ONE = ("0123abcd"):rep(8) +local SHA_TWO = ("dead9876"):rep(8) + +local net = { versions = {}, bytes = {}, err = nil, repos = {} } +ModUpdate.beginFetchReleases = function(repo, modId) + net.repos[modId] = repo + return { modId = modId, repo = repo } +end +ModUpdate.pumpFetchReleases = function(h) + if net.err then return true, nil, net.err end + local out = {} + for _, v in ipairs(net.versions[h.modId] or {}) do + out[#out + 1] = { version = v, tag = "v" .. v, + zip = { url = h.modId .. "@" .. v, name = h.modId .. ".zip" } } + end + return true, out +end +ModUpdate.beginDownloadZip = function(url, destName) + love.filesystem.write(destName, net.bytes[url] or "not-the-pinned-archive") + return { path = destName } +end +ModUpdate.pumpDownloadZip = function(h) return true, h.path end + +local haveMods = {} +LauncherMods.installDownloadedZip = function(modId, localPath, version) + haveMods[modId] = version or "?" + pcall(love.filesystem.remove, localPath) + return true, haveMods[modId] +end +LauncherMods.list = function() + local rows = {} + for id, v in pairs(haveMods) do + rows[#rows + 1] = fakeRow({ id = id, name = id, version = v }) + end + return rows +end + +install({ id = "fill_cart", title = "Fill Cart", shell = "#227744", + mods = { + { id = "fill_one", source = "github", repo = "ren/fill-one", + version = "1.0.0", sha256 = SHA_ONE }, + { id = "fill_two", source = "github", repo = "ren/fill-two", + version = "2.1.0", sha256 = SHA_TWO }, + }, + load_order = { "fill_one", "fill_two" } }) +install({ id = "odd_cart", title = "Odd Cart", shell = "#772244", + mods = { + { id = "banana_mod", source = "gamebanana", mod = 4821, file = 99123, + md5 = ("ab"):rep(16) }, + { id = "here_mod", source = "local", version = "0.0.0" }, + }, + load_order = { "banana_mod", "here_mod" } }) + +local function fillPage(cartId) + local page = freshLauncher() + page.tab = "red" + page.ready.red = true + page:_selectCart("red", cartId) + return page +end + +local function runFill(page) + page:pressInstallCartMods("red") + local guard = 0 + while page._cartFill and guard < 500 do + page:_pumpModInstall() + page:_pumpCartFill() + guard = guard + 1 + end + check(page._cartFill == nil, "the install run finishes") + return page.cartFillNotice or {} +end + +local function failureText(notice) + return table.concat(notice.failures or {}, " | ") +end + +net.versions.fill_one = { "1.0.0", "0.9.0" } +net.versions.fill_two = { "2.1.0" } +net.bytes["fill_one@1.0.0"] = SHA_ONE +net.bytes["fill_two@2.1.0"] = SHA_TWO + +-- A cart whose pins are all installed offers nothing to install. +haveMods = { fill_one = "1.0.0", fill_two = "2.1.0" } +local readyFill = fillPage("fill_cart") +eq(readyFill:cartPlan("red").refused, false, "every pin installed, so it plays") +eq(#readyFill:cartFillRows("red"), 0, "with nothing left to install") +local readyText = drawAndCapture(readyFill) +check(readyText:find("Install required mods", 1, true) == nil + and readyText:find("required mods", 1, true) == nil, + "so a ready cart never offers the install button") +check(readyText:find("Break the seal", 1, true) ~= nil, + "while the seal control is where it always was") + +-- Nothing installed: the button appears, named for the count, beside the seal. +haveMods = {} +local gapFill = fillPage("fill_cart") +eq(#gapFill:cartFillRows("red"), 2, "both uninstalled pins queue up") +local gapFillText = drawAndCapture(gapFill) +check(gapFillText:find("Install 2 required mods", 1, true) ~= nil, + "a refused cart offers to install what it pins, counted") +check(gapFillText:find("the way its author built it", 1, true) ~= nil, + "saying plainly that this is the way to play it as built") +check(gapFillText:find("Break the seal", 1, true) ~= nil, + "with breaking the seal still there as the fallback") + +-- A pin installed at the WRONG version is a gap too: the cart wants its own. +haveMods = { fill_one = "0.9.0", fill_two = "2.1.0" } +local skewFill = fillPage("fill_cart") +eq(skewFill:cartPlan("red").mismatched[1].id, "fill_one", + "a pin at another version is a mismatch") +eq(#skewFill:cartFillRows("red"), 1, "which queues for install like a gap") +eq(skewFill:cartFillRows("red")[1].version, "1.0.0", + "at the version the cart pins, not the one on disk") +local skewText = drawAndCapture(skewFill) +check(skewText:find("Install required mods", 1, true) ~= nil, + "a single gap drops the count from the label") + +-- THE HASH GATE. An archive that is not the one the cart recorded installs +-- nothing, however well the id and version line up. +haveMods = {} +net.bytes["fill_one@1.0.0"] = "some other build entirely" +local badHash = fillPage("fill_cart") +local badNotice = runFill(badHash) +eq(haveMods.fill_one, nil, "a hash mismatch installs nothing at all") +eq(badNotice.ok, false, "and the run reports as failed") +check(failureText(badNotice):find("fill_one", 1, true) ~= nil, + "naming the mod whose archive did not match") +check(failureText(badNotice):find("sha256", 1, true) ~= nil, + "and saying it was the hash: " .. failureText(badNotice)) +eq(badHash:cartPlan("red").refused, true, "so the cart still refuses") +net.bytes["fill_one@1.0.0"] = SHA_ONE + +-- Partial: one archive verifies, the other does not. +haveMods = {} +net.bytes["fill_two@2.1.0"] = "wrong bytes for the second mod" +local partial = fillPage("fill_cart") +local partialNotice = runFill(partial) +eq(haveMods.fill_one, "1.0.0", "the pin that verified is installed") +eq(haveMods.fill_two, nil, "the pin that did not is not") +eq(partialNotice.ok, false, "a partial run reads as a failure") +check(tostring(partialNotice.text):find("1 of 2", 1, true) ~= nil, + "counting what landed: " .. tostring(partialNotice.text)) +check(failureText(partialNotice):find("fill_two", 1, true) ~= nil, + "and naming only the mod that failed") +check(failureText(partialNotice):find("fill_one", 1, true) == nil, + "not the one that worked") +local partialText = drawAndCapture(partial) +check(partialText:find("fill_two", 1, true) ~= nil, + "the card reports the failure where the player pressed the button") +net.bytes["fill_two@2.1.0"] = SHA_TWO + +-- The whole run, verified, with the seal untouched at the end of it. +haveMods = {} +local good = fillPage("fill_cart") +local goodScope = good:slotScope("red") +good:_ensureSlots(goodScope) +local goodSlot = good.activeSlot[goodScope] +eq(good:cartPlan("red").refused, true, "the cart refuses before the run") +local goodNotice = runFill(good) +eq(goodNotice.ok, true, "the run reports success: " .. tostring(goodNotice.text)) +eq(haveMods.fill_one, "1.0.0", "the first pin lands at its pinned version") +eq(haveMods.fill_two, "2.1.0", "and the second at its own") +eq(net.repos.fill_one, "ren/fill-one", "each pin was looked up in its own repo") +eq(net.repos.fill_two, "ren/fill-two", "including the second") +eq(good:cartPlan("red").refused, false, + "and the cart is ready to play with no further presses") +eq(SaveData.slotSealBroken("fill_cart", goodSlot or "slot1"), false, + "installing never breaks the cart's seal") +eq(SaveData.isSealBroken(), false, "nor the session's") +local goodText = drawAndCapture(good) +check(goodText:find("Sealed", 1, true) ~= nil, + "the card flips to ready without another click") +check(goodText:find("required mods", 1, true) == nil, + "and stops offering the install button") + +-- No release carrying that version. +haveMods = {} +net.versions.fill_one = { "0.9.0" } +local noRel = fillPage("fill_cart") +local noRelNotice = runFill(noRel) +eq(haveMods.fill_one, nil, "a version the repo does not publish installs nothing") +check(failureText(noRelNotice):find("v1.0.0", 1, true) ~= nil, + "and the failure names the version it wanted: " .. failureText(noRelNotice)) +net.versions.fill_one = { "1.0.0", "0.9.0" } + +-- No .zip on the matching release. +haveMods = {} +local savedPump = ModUpdate.pumpFetchReleases +ModUpdate.pumpFetchReleases = function(h) + return true, { { version = "1.0.0", tag = "v1.0.0" }, + { version = "2.1.0", tag = "v2.1.0" } } +end +local noZip = fillPage("fill_cart") +local noZipNotice = runFill(noZip) +eq(haveMods.fill_one, nil, "a release with no archive installs nothing") +check(failureText(noZipNotice):find(".zip", 1, true) ~= nil, + "and says so: " .. failureText(noZipNotice)) +ModUpdate.pumpFetchReleases = savedPump + +-- Network down. +haveMods = {} +net.err = "no network transport on this platform" +local offline = fillPage("fill_cart") +local offlineNotice = runFill(offline) +eq(haveMods.fill_one, nil, "an offline run installs nothing") +eq(offlineNotice.ok, false, "and reports as failed") +check(failureText(offlineNotice):find("no network transport", 1, true) ~= nil, + "carrying the transport's own words: " .. failureText(offlineNotice)) +net.err = nil + +-- Sources the launcher cannot fetch are refused per mod, not as one silence. +haveMods = {} +local odd = fillPage("odd_cart") +eq(#odd:cartFillRows("red"), 2, "both odd pins are gaps") +local oddText = drawAndCapture(odd) +check(oddText:find("Install 2 required mods", 1, true) ~= nil, + "the button is offered even when a pin may not be fetchable") +local oddNotice = runFill(odd) +eq(oddNotice.ok, false, "neither can be installed") +eq(#(oddNotice.failures or {}), 2, "and each is reported on its own line") +check(failureText(oddNotice):find("banana_mod", 1, true) ~= nil + and failureText(oddNotice):find("GameBanana", 1, true) ~= nil, + "the gamebanana pin says what it is pinned to: " .. failureText(oddNotice)) +check(failureText(oddNotice):find("here_mod", 1, true) ~= nil + and failureText(oddNotice):find("nothing to download", 1, true) ~= nil, + "and the local pin says there is nothing to fetch") +eq(next(haveMods), nil, "with nothing installed either way") +local oddAfter = drawAndCapture(odd) +check(oddAfter:find("Break the seal", 1, true) ~= nil, + "and the seal is still the fallback it was") + +-- Breaking the seal still works exactly as it did, install button or not. +local sealStill = fillPage("odd_cart") +local oddScope = sealStill:slotScope("red") +sealStill:_newSlot(oddScope) +local oddSlot = sealStill.activeSlot[oddScope] +check(type(oddSlot) == "string", "the cart page has a loaded save slot") +eq(sealStill:pressBreakSeal("red"), false, "the first press still only arms") +eq(SaveData.slotSealBroken("odd_cart", oddSlot), false, "breaking nothing") +eq(sealStill:pressBreakSeal("red"), true, "and the second still breaks it") +eq(SaveData.slotSealBroken("odd_cart", oddSlot), true, "on that slot") +eq(sealStill:cartPlan("red").refused, false, "so the cart plays") + +love.data.hash, love.data.encode = savedData.hash, savedData.encode +ModUpdate.beginFetchReleases, ModUpdate.pumpFetchReleases = + realFetchBegin, realFetchPump +ModUpdate.beginDownloadZip, ModUpdate.pumpDownloadZip = + realDlBegin, realDlPump +LauncherMods.installDownloadedZip = realInstallDownloaded +-- Later blocks audit the picker's layout, which counts the carts on red. +CartStore.uninstall("fill_cart") +CartStore.uninstall("odd_cart") + LauncherMods.list = realModList window(1280, 720) +-- ------- the MODS tab under an active cart + +-- the rows the base game's own list would hand back, so the panel with no +-- cart active has something real to disagree with the carts about +local PIN_MODS = { + fakeRow({ id = "pin_on", name = "Pin On", version = "1.0.0" }), + fakeRow({ id = "pin_off", name = "Pin Off", version = "1.0.0", + enabled = false, + enabledByVersion = { red = false, blue = false, yellow = false, + gold = false, silver = false } }), +} + +local function localPin(id, off) + local entry = { id = id, source = "local", version = "1.0.0" } + if off then entry.enabled = false end + return entry +end + +local PIN_SET = { localPin("pin_on"), localPin("pin_off", true) } +local PIN_ORDER = { "pin_on", "pin_off" } + +install({ id = "plus_mods", title = "Plus Mods", seal = "sealed+", + shell = "#2b8a3e", mods = PIN_SET, load_order = PIN_ORDER }) +install({ id = "hard_mods", title = "Hard Mods", seal = "sealed", + shell = "#8a2b3e", mods = PIN_SET, load_order = PIN_ORDER }) +install({ id = "gap_mods", title = "Gap Mods", seal = "sealed+", + shell = "#3e2b8a", + mods = { localPin("pin_on"), localPin("ghost_mod") }, + load_order = { "pin_on", "ghost_mod" } }) + +local realSetEnabled, realSetAllEnabled = LauncherMods.setEnabled, LauncherMods.setAllEnabled +local perGameWrites = 0 +LauncherMods.setEnabled = function(...) + perGameWrites = perGameWrites + 1 + return realSetEnabled(...) +end +LauncherMods.setAllEnabled = function(...) + perGameWrites = perGameWrites + 1 + return realSetAllEnabled(...) +end +LauncherMods.list = function() return PIN_MODS end + +-- the base game's own answer for the same mod, which nothing below may move +local seeded = SaveData.loadOptions() +SaveData.setModEnabled(seeded, "pin_off", false, "red") +SaveData.setModEnabled(seeded, "pin_on", true, "red") +SaveData.saveOptions(seeded) + +local function rowsById(imp) + local byId = {} + for _, row in ipairs(imp.mods or {}) do byId[row.id] = row end + return byId +end + +local plain = freshLauncher() +plain.tab = "mods" +plain.ready.red = true +plain:_selectCart("red", nil) +plain:_setModScope("red") +eq(#plain.mods, 2, "with no cart the panel lists the installed mods") +eq(plain.mods[1].cartPin, nil, "which are not marked as any cart's") +check(type(plain.mods[1].enabledByVersion) == "table", + "and still carry their per-game answers") +perGameWrites = 0 +plain:_toggleMod("pin_on", nil, "red") +eq(perGameWrites, 1, "a toggle with no cart still writes the per-game flag") +eq(SaveData.modEnabled(SaveData.loadOptions(), "pin_on", "red"), false, + "which is what changed") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "plus_mods", "pin_on"), nil, + "and no cart scope was touched") +SaveData.setModEnabled(seeded, "pin_on", true, "red") +SaveData.saveOptions(seeded) + +local pins = freshLauncher() +pins.tab = "mods" +pins.ready.red = true +pins:_selectCart("red", "plus_mods") +pins:_setModScope("red") +eq(#pins.mods, 2, "an active cart makes the panel list its pins") +local pinRows = rowsById(pins) +eq(pinRows.pin_on.cartPin, true, "each row is marked as the cart's") +eq(pinRows.pin_on.cartId, "plus_mods", "naming the cart it came from") +eq(pinRows.pin_on.enabled, true, "a pin shipped switched on shows on") +eq(pinRows.pin_off.enabled, false, "a pin shipped switched off shows off") +eq(pinRows.pin_off.cartTogglable, true, "sealed+ hands every pin's switch over") +eq(pinRows.pin_on.enabledByVersion, nil, + "and a cart row carries no per-game answer, because a cart is one game") + +local pinText = drawAndCapture(pins) +check(pinText:find("PINNED", 1, true) ~= nil, + "the list says on every row that these are the cart's mods") +check(pinText:find("Plus Mods", 1, true) ~= nil, "and names the cart above them") +check(pinText:find("In this cart:", 1, true) ~= nil, + "with a switch that answers the cart, not the game") + +perGameWrites = 0 +pins:_toggleMod("pin_off", nil, "red") +local afterOn = SaveData.loadOptions() +eq(SaveData.cartModEnabled(afterOn, "plus_mods", "pin_off"), true, + "a sealed+ toggle writes the player's answer into the cart's scope") +eq(perGameWrites, 0, "and never through the per-game path") +eq(SaveData.modEnabled(afterOn, "pin_off", "red"), false, + "so the base game's flag for that mod is untouched") +eq(SaveData.modEnabled(afterOn, "pin_on", "red"), true, "as is every other") +eq(rowsById(pins).pin_off.enabled, true, "the row follows the new answer") + +local pinScope = pins:slotScope("red") +pins:_ensureSlots(pinScope) +local pinSlot = pins.activeSlot[pinScope] +eq(SaveData.slotSealBroken("plus_mods", pinSlot or "slot1"), false, + "switching a sealed+ pin does not break the cart's seal") +eq(SaveData.isSealBroken(), false, "nor the session's") +eq(pins:cartPlan("red").broken, false, "and the plan still reads it as intact") + +pins:_toggleMod("pin_off", nil, "red") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "plus_mods", "pin_off"), false, + "pressing again switches it back off, still in the cart's scope") + +perGameWrites = 0 +pins:_setAllMods(true) +eq(perGameWrites, 0, "Enable all cannot reach a cart's mod set") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "plus_mods", "pin_off"), false, + "so no pin moved") +check(tostring(pins.modNotice.text):find("Plus Mods", 1, true) ~= nil, + "and the panel says which cart is deciding") +eq(pins.modNotice.ok, false, "as a refusal") +pins:_setAllMods(false) +eq(perGameWrites, 0, "Disable all cannot either") +eq(SaveData.modEnabled(SaveData.loadOptions(), "pin_on", "red"), true, + "and the base game's list is where it was") + +pins:_toggleMod("wide_gym", nil, "red") +check(tostring(pins.modNotice.text):find("cannot be added to", 1, true) ~= nil, + "a mod the cart does not pin cannot be switched on from here") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "plus_mods", "wide_gym"), nil, + "and nothing is written for it") + +pins.safeMode = true +pins:_toggleMod("pin_off", nil, "red") +check(tostring(pins.modNotice.text):find("Safe mode", 1, true) ~= nil, + "safe mode still refuses a cart toggle first") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "plus_mods", "pin_off"), false, + "and writes nothing") +pins.safeMode = false + +local sealedPins = freshLauncher() +sealedPins.tab = "mods" +sealedPins.ready.red = true +sealedPins:_selectCart("red", "hard_mods") +sealedPins:_setModScope("red") +local hardRows = rowsById(sealedPins) +eq(hardRows.pin_off.enabled, false, "a sealed cart's off pin shows off") +eq(hardRows.pin_off.cartTogglable, false, "and hands no switch over") +eq(hardRows.pin_on.cartTogglable, false, "nor does the pin it ships on") +perGameWrites = 0 +sealedPins:_toggleMod("pin_off", nil, "red") +eq(perGameWrites, 0, "a sealed pin never reaches the per-game path either") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "hard_mods", "pin_off"), nil, + "and a press under a sealed cart writes nothing") +eq(sealedPins.modNotice.ok, false, "the press is refused") +check(tostring(sealedPins.modNotice.text):find("sealed", 1, true) ~= nil, + "with the panel saying why rather than doing nothing") +check(tostring(sealedPins.modNotice.text):find("Break the seal", 1, true) ~= nil, + "and pointing at the one way to change it") +local hardScope = sealedPins:slotScope("red") +sealedPins:_ensureSlots(hardScope) +eq(SaveData.slotSealBroken("hard_mods", + sealedPins.activeSlot[hardScope] or "slot1"), false, + "a refused press breaks no seal of its own") +local hardText = drawAndCapture(sealedPins) +check(hardText:find("Pinned, sealed:", 1, true) ~= nil, + "and the row itself reads as locked") + +local gapPins = freshLauncher() +gapPins.tab = "mods" +gapPins.ready.red = true +gapPins:_selectCart("red", "gap_mods") +gapPins:_setModScope("red") +local gapRows = rowsById(gapPins) +eq(#gapPins.mods, 2, "a pin that is not installed is still listed") +eq(gapRows.ghost_mod.status, "missing", "as missing") +eq(gapRows.ghost_mod.enabled, false, "and switched off") +gapPins:_toggleMod("ghost_mod", nil, "red") +check(tostring(gapPins.modNotice.text):find("not installed", 1, true) ~= nil, + "switching it says so instead of writing an answer for a mod that is absent") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "gap_mods", "ghost_mod"), nil, + "and writes nothing") + +pins:_selectCart("red", nil) +pins:_setModScope("red") +local backRows = rowsById(pins) +eq(#pins.mods, 2, "choosing the base game lists the player's own mods again") +eq(backRows.pin_on.cartPin, nil, "with no cart marks left on them") +check(type(backRows.pin_on.enabledByVersion) == "table", + "and their per-game answers back") +eq(backRows.pin_off.enabled, false, + "reading exactly what the base game's flags say") +perGameWrites = 0 +pins:_toggleMod("pin_off", nil, "red") +eq(perGameWrites, 1, "and a toggle is a per-game write once more") +eq(SaveData.modEnabled(SaveData.loadOptions(), "pin_off", "red"), true, + "which lands in the game's own flags") +eq(SaveData.cartModEnabled(SaveData.loadOptions(), "plus_mods", "pin_off"), false, + "leaving the cart's answer where the player left it") + +LauncherMods.setEnabled, LauncherMods.setAllEnabled = realSetEnabled, realSetAllEnabled +LauncherMods.list = realModList + local function clipped(r) local x1, y1, x2, y2 = r.x, r.y, r.x + r.w, r.y + r.h if r.clip then @@ -540,6 +1083,22 @@ for _, size in ipairs(SIZES) do if ok then auditFrame(("%dx%d %s"):format(W, H, cart and "cart" or "vanilla"), "Custom Carts") + -- The refused card carries two chips now, so both have to stay on it. + if cart then + local sawFill = false + for _, r in ipairs(Kit.audit or {}) do + local label = tostring(r.label) + if label == "Install required mods" or label == "Break the seal" then + sawFill = sawFill or label == "Install required mods" + check(r.x >= -0.5 and r.x + r.w <= W + 0.5 + and r.y >= -0.5 and r.y + r.h <= H + 0.5, + ("%dx%d cart card: %q stays inside the window") + :format(W, H, label)) + end + end + check(sawFill, + ("%dx%d cart card: drew Install required mods"):format(W, H)) + end end Kit.audit = nil @@ -595,6 +1154,303 @@ for _, size in ipairs(SIZES) do end Kit.audit = nil end +LauncherMods.list = function() return PIN_MODS end +for _, size in ipairs(SIZES) do + local W, H = size[1], size[2] + window(W, H) + for _, cart in ipairs({ "plus_mods", "hard_mods" }) do + local panel = freshLauncher() + panel.tab = "mods" + panel.ready.red = true + panel:_selectCart("red", cart) + panel:_setModScope("red") + LauncherView.draw(panel) + Kit.audit = {} + local ok, err = pcall(LauncherView.draw, panel) + Kit.audit = ok and Kit.audit or nil + check(ok, ("%dx%d %s mods draws: %s"):format(W, H, cart, tostring(err))) + if ok then auditFrame(("%dx%d %s mods"):format(W, H, cart)) end + Kit.audit = nil + end +end LauncherMods.list = realModList +-- ------- FIND tab: browsing the index's carts instead of its mods +-- +-- The feed carries carts beside mods at the same schema_version, so the panel +-- has a Mods / Carts switch. Installing a cart from a listing goes through +-- CartStore.install with the downloaded bytes, never the mod installer. + +local ModIndex = require("src.mods.ModIndex") +local ModUpdate = require("src.mods.ModUpdate") +local Json = require("src.link.Json") + +local INDEX_CART = { + id = "indexed_cart", title = "Indexed Cart", author = "Ren", + version = "1.4.0", base = "silver", seal = "sealed", + repo = "https://github.com/ren/indexed-cart", + github = "ren/indexed-cart", + mods = { { id = "rare_soda", source = "github", repo = "ren/rare-soda", + version = "0.4.1", sha256 = SHA } }, + update_check = "ok", + latest = { version = "1.4.0", tag = "v1.4.0", + zip = { name = "indexed_cart-1.4.0.zip", + url = "https://example.test/indexed_cart-1.4.0.zip" } }, +} + +local INDEX_FEED = ModIndex.parse(Json.encode({ + schema_version = 1, + categories = { "GAMEPLAY" }, + base_games = { "red", "blue", "yellow", "gold", "silver" }, + mods = { + { id = "rare_soda", title = "Rare Soda", author = "Ren", version = "0.4.1", + categories = { "GAMEPLAY" }, update_check = "off" }, + { id = "true_colour", title = "True Colour", author = "Sam", + version = "1.0.0", categories = { "ART" }, update_check = "off" }, + }, + carts = { + INDEX_CART, + { id = "gold_rush", title = "Gold Rush", author = "Sam", version = "3.0.0", + base = "gold", seal = "open", repo = "https://github.com/sam/gold-rush", + mods = { { id = "steps", source = "github", repo = "sam/steps", + version = "1.0.0", sha256 = SHA } }, + update_check = "off" }, + }, +})) +check(INDEX_FEED ~= nil, "the find-tab fixture feed parses") + +window(1280, 720) + +local find = freshLauncher() +eq(find.findKind, "mods", "the Find tab browses mods by default") +check(find.findBase == nil, "with no base-game filter armed") +find.tab = "find" +find.modScope = nil +find.findLoaded = true +find.findSources = { { feed = "https://example.test/data/index.json", + base = "https://example.test/", + label = "example/index" } } +find.findIndex = { mods = INDEX_FEED.mods, carts = INDEX_FEED.carts, + categories = { "GAMEPLAY", "ART" }, + baseGames = ModIndex.baseGamesIn(INDEX_FEED) } + +eq(#find:_findRows(), 2, "the default rows are the feed's mods") +eq(find:_findRows()[1].id, "rare_soda", "and they are the mod entries") + +local modsFind = drawAndCapture(find) +check(modsFind:find("Mods (2)", 1, true) ~= nil, + "the switch says how many mods the feed lists") +check(modsFind:find("Carts (2)", 1, true) ~= nil, "and how many carts") +check(modsFind:find("Rare Soda", 1, true) ~= nil, "mods are what is listed") + +find:_setFindKind("carts") +eq(find.findKind, "carts", "the switch flips to carts") +eq(#find:_findRows(), 2, "and the rows become the feed's carts") +check(ModIndex.isCart(find:_findRows()[1]), "which are cart entries") + +local cartsFind = drawAndCapture(find) +check(cartsFind:find("Indexed Cart", 1, true) ~= nil, + "a cart listing is drawn on the Carts half") +check(cartsFind:find("Rare Soda", 1, true) == nil, + "and the mod listings are gone") +check(cartsFind:find("Search carts", 1, true) ~= nil, + "the search field asks for carts") + +-- search spans the same fields it does for a mod +find.findQuery = "gold" +eq(#find:_findRows(), 1, "searching a cart title narrows the list") +eq(find:_findRows()[1].id, "gold_rush", "to that cart") +find.findQuery = "Ren" +eq(find:_findRows()[1].id, "indexed_cart", "searching by author works too") +find.findQuery = "" + +-- the cart-side filter is by base game, and the popup offers only the base +-- games the feed's carts actually play as +find.findBase = "gold" +eq(#find:_findRows(), 1, "filtering by base game keeps that game's carts") +eq(find:_findRows()[1].id, "gold_rush", "and only those") +local filterText +do + find._filterPopup = true + filterText = drawAndCapture(find) + find._filterPopup = nil +end +check(filterText:find("Filter by base game", 1, true) ~= nil, + "the filter popup filters carts by base game") +check(filterText:find("Filter by category", 1, true) == nil, + "not by a category no cart has") +find.findBase = nil + +-- MODS-tab scope still applies: a cart plays as exactly one game +find.modScope = "silver" +eq(#find:_findRows(), 1, "a scoped launcher lists only that game's carts") +eq(find:_findRows()[1].id, "indexed_cart", "the one based on silver") +find.modScope = nil + +find:_setFindKind("mods") +eq(#find:_findRows(), 2, "switching back restores the mod rows") +find:_setFindKind("carts") + +-- ------- installing a cart from a listing + +local INDEX_CART_BYTES = CartManifest.encode(CartManifest.parse(cartTable({ + id = "indexed_cart", title = "Indexed Cart", version = "1.4.0", + base = "silver", shell = "#d8c24a" }))) + +eq(#find:_ensureCarts("silver"), 0, "silver has no carts before the install") + +local entry +for _, row in ipairs(find:_findRows()) do + if row.id == "indexed_cart" then entry = row end +end +check(entry ~= nil, "the cart listing is on screen to install") + +local realBegin, realPump = ModUpdate.beginDownloadZip, ModUpdate.pumpDownloadZip +local asked = {} +ModUpdate.beginDownloadZip = function(url, name) + asked[#asked + 1] = { url = url, name = name } + return { name = name } +end +ModUpdate.pumpDownloadZip = function(h) + love.filesystem.write(h.name, INDEX_CART_BYTES) + return true, h.name +end + +find:_findConfirmInstall(entry) +check(find._modConfirm ~= nil, "installing a cart arms a confirm first") +eq(find._modConfirm.title, "Install cart", "and it says it is a cart") +eq(find._modConfirm.indexEntry, entry, "carrying the listing it will install") +do + local lines = table.concat(find._modConfirm.lines or {}, "\n") + check(lines:find("Pins 1 mod", 1, true) ~= nil, + "the confirm says how many mods the cart pins") + check(lines:find("installed separately", 1, true) ~= nil, + "and that installing the cart does not install them") +end +find._modConfirm = nil + +find:_findInstall(entry) +check(find._cartInstall ~= nil, "the cart download is in flight") +check(find._modInstall == nil, "and it is not a mod install") +eq(asked[1].url, "https://example.test/indexed_cart-1.4.0.zip", + "the release the listing resolves is what gets downloaded") +check(asked[1].name:find(".g1rcart", 1, true) ~= nil, + "into a cart file, not a mod zip") + +-- single in flight: a mod install cannot start on top of a cart download +find:_beginModInstall({ modId = "rare_soda", name = "Rare Soda", notice = "find", + release = { version = "0.4.1", + zip = { url = "https://example.test/rare_soda.zip" } } }) +check(find._modInstall == nil, "a mod install cannot race a cart install") +eq(#asked, 1, "and nothing else was downloaded") + +find:_pumpCartInstall() +check(find._cartInstall == nil, "the cart install completes") +check(find.findNotice ~= nil and find.findNotice.ok, + "and reports success on the Find tab") + +local installedCart = CartStore.get("indexed_cart") +check(installedCart ~= nil, "the cart is installed through CartStore") +if installedCart then + eq(installedCart.title, "Indexed Cart", "with its own title") + eq(installedCart.base, "silver", "and the game it plays as") +end + +-- the per-version cache is the whole point: without invalidating it the new +-- cart would not show in Custom Carts until a relaunch +eq(#find.carts["silver"], 1, + "the cached cart list for that game is refreshed in place") +eq(find.carts["silver"][1].id, "indexed_cart", "with the new cart in it") +eq(find:_findInstalledCarts()["indexed_cart"], "1.4.0", + "and the Find rows now read it as installed") + +-- the Custom Carts picker draws the new cart in the same session, with no +-- refresh call from here and no relaunch +do + local picker = freshLauncher() + picker.tab = "silver" + picker.ready.silver = true + picker._cartPopup = "silver" + local pickerText = drawAndCapture(picker) + check(pickerText:find("Indexed Cart", 1, true) ~= nil, + "the Custom Carts picker lists the freshly installed cart") +end +do + local same = drawAndCapture(find) + check(same ~= nil, "the Find tab still draws after an install") +end + +-- ------- the pins prompt +-- +-- Installing a cart never installs its mods behind the player's back, but a +-- cart whose pins are missing will not start, so it asks once and routes a +-- yes at the existing hash-verified fill queue. + +check(find._modConfirm ~= nil, "a cart with missing pins prompts after install") +eq(find._modConfirm.kind, "cartPins", "through the launcher's confirm modal") +eq(find._modConfirm.version, "silver", "for the game the cart plays as") +eq(find._modConfirm.id, "indexed_cart", "naming the cart just installed") +do + local lines = table.concat(find._modConfirm.lines or {}, "\n") + check(lines:find("Indexed Cart pins 1 mod", 1, true) ~= nil, + "the prompt names the cart and how many pins are missing") +end +check(find.activeCart["silver"] == nil, + "and asking does not select the cart on its own") + +-- yes routes at pressInstallCartMods, which owns the hash check +do + local realFetchRel = ModUpdate.beginFetchReleases + local realPumpRel = ModUpdate.pumpFetchReleases + local asked_repos = {} + ModUpdate.beginFetchReleases = function(repo) + asked_repos[#asked_repos + 1] = repo + return { repo = repo } + end + ModUpdate.pumpFetchReleases = function() return true, nil, "no releases" end + find._modConfirm = nil + find:_installCartPins("silver", "indexed_cart") + eq(find.activeCart["silver"], "indexed_cart", + "saying yes selects the cart the pins belong to") + for _ = 1, 8 do find:_pumpCartFill() end + eq(asked_repos[1], "ren/rare-soda", + "and the fill queue resolves the cart's own pin") + check(find.cartFillNotice ~= nil and not find.cartFillNotice.ok, + "reporting per-mod failures through the existing notice") + find:_selectCart("silver", nil) + find.cartFillNotice = nil + ModUpdate.beginFetchReleases = realFetchRel + ModUpdate.pumpFetchReleases = realPumpRel +end + +-- a cart whose pins are all installed must not prompt at all +do + local realList = LauncherMods.list + LauncherMods.list = function() + return { { id = "rare_soda", version = "0.4.1", + manifest = { id = "rare_soda", version = "0.4.1" } } } + end + local satisfied = freshLauncher() + eq(#satisfied:_cartPinsMissing("silver", "indexed_cart"), 0, + "a cart with every pin installed is missing none") + satisfied:_offerCartPins({ id = "indexed_cart", title = "Indexed Cart", + base = "silver" }) + check(satisfied._modConfirm == nil, "so it does not prompt") + LauncherMods.list = realList +end + +-- a download that is not a cart at all fails loudly instead of installing +ModUpdate.pumpDownloadZip = function(h) + love.filesystem.write(h.name, "not a cart at all") + return true, h.name +end +find.findNotice = nil +find:_findInstall(entry) +find:_pumpCartInstall() +check(find._cartInstall == nil, "a junk download ends the job") +check(find.findNotice ~= nil and not find.findNotice.ok, + "and says so rather than installing anything") + +ModUpdate.beginDownloadZip, ModUpdate.pumpDownloadZip = realBegin, realPump + T.finish("cart launcher") diff --git a/tests/engine/cart_manifest.lua b/tests/engine/cart_manifest.lua index 493fdc9a..177ff024 100644 --- a/tests/engine/cart_manifest.lua +++ b/tests/engine/cart_manifest.lua @@ -198,8 +198,102 @@ rejects(function(c) c.load_order = { "rare_soda", "rare_soda" } end, "twice", rejects(function(c) c.load_order = { "rare_soda", "master_ball" } end, "does not pin", "a load_order naming an unpinned mod") +rejects(function(c) c.mods[1].enabled = "no" end, "enabled must be", + "a string enabled flag") +rejects(function(c) c.mods[1].enabled = 0 end, "enabled must be", + "a numeric enabled flag") + +rejects(function(c) c.options = "fast" end, "cart options must be a table", + "a non-table cart options block") +rejects(function(c) c.options = { [2] = 1 } end, "cart option keys", + "a numeric cart option key") +rejects(function(c) c.options = { textSpeed = { 1 } } end, + "must be a string, number or boolean", "a table cart option value") + T.eq(CartManifest.parse(nil), nil, "parse refuses a non-table") +-- ------- a pin the cart ships switched off + +T.eq(cart.mods[1].enabled, nil, "a pin that says nothing carries no enabled flag") +T.eq(CartManifest.modEnabled(cart.mods[1]), true, "and defaults to enabled") +T.eq(CartManifest.modEnabled(nil), false, "modEnabled refuses a non-entry") + +local offRaw = baseCart() +offRaw.mods[1].enabled = false +local offCart = CartManifest.parse(offRaw) +T.check(offCart ~= nil, "a pin switched off parses") +T.eq(offCart.mods[1].enabled, false, "and keeps the flag") +T.eq(CartManifest.modEnabled(offCart.mods[1]), false, "which reads back as off") +T.eq(offCart.mods[1].sha256, SHA, "a switched-off pin is pinned like any other") +T.eq(offCart.mods[1].options.flavour, "grape", "with its options captured") +T.same(CartManifest.decode(CartManifest.encode(offCart)), offCart, + "a switched-off pin survives the file round trip") +T.neq(CartManifest.hash(offCart), CartManifest.hash(cart), + "and is part of the cart hash") + +local onRaw = baseCart() +onRaw.mods[1].enabled = true +T.eq(CartManifest.canonical(CartManifest.parse(onRaw)), + CartManifest.canonical(cart), + "an explicit enabled = true is the same cart as saying nothing") + +-- ------- settings the cart ships + +local optRaw = baseCart() +optRaw.options = { textSpeed = 1, animations = false, ruleset = "gen1_faithful" } +local optCart, optErr = CartManifest.parse(optRaw) +T.check(optCart ~= nil, "a cart that ships settings parses: " .. tostring(optErr)) +T.eq(optCart.options.textSpeed, 1, "the shipped number survives") +T.eq(optCart.options.animations, false, "the shipped boolean survives") +T.eq(optCart.options.ruleset, "gen1_faithful", "the shipped string survives") +T.eq(cart.options, nil, "a cart that ships none carries no options table") +T.same(CartManifest.decode(CartManifest.encode(optCart)), optCart, + "shipped settings survive the file round trip") +T.neq(CartManifest.hash(optCart), CartManifest.hash(cart), + "and are part of the cart hash") +T.neq(optCart.options, optCart.mods[1].options, + "a cart's own settings are not a mod's") + +-- ------- the sealed+ seal + +local plusRaw = baseCart() +plusRaw.seal = "sealed+" +local plusCart, plusErr = CartManifest.parse(plusRaw) +T.check(plusCart ~= nil, "a sealed+ cart parses: " .. tostring(plusErr)) +T.eq(plusCart.seal, "sealed+", "the seal survives") +T.same(CartManifest.decode(CartManifest.encode(plusCart)), plusCart, + "a sealed+ cart round trips through a file") +T.neq(CartManifest.hash(plusCart), CartManifest.hash(cart), + "and sealed+ is part of the cart hash") +T.eq(CartManifest.SEALS["sealed+"], true, "sealed+ is a known seal") + +-- ------- the launcher fields the file round trip used to drop + +local dressed = baseCart() +dressed.finish = "sparkle+holo" +dressed.speeds = { 1, 2 } +local dressedCart = CartManifest.parse(dressed) +local reread = CartManifest.decode(CartManifest.encode(dressedCart)) +T.eq(reread.finish, "sparkle+holo", "a cart's finish survives the file round trip") +T.same(reread.speeds, { 1, 2 }, "and so does its speed ladder") +T.eq(CartManifest.hash(reread), CartManifest.hash(dressedCart), + "so an installed copy hashes the same as the one that was written") + +-- ------- a cart that uses none of the above serializes exactly as it always did + +T.eq(CartManifest.canonical(cart), + "[cart].6:author$3:Ren.4:base$3:red.6:engine$7:>=1.4.0.2:id$10:kanto_plus" + .. ".5:label$13:art/label.png.4:repo$14:ren/kanto-plus.4:seal$6:sealed" + .. ".5:shell$7:#3fa9f5.7:summary$20:A sealed set of five.5:title$10:Kanto Plus" + .. ".7:version$5:1.2.0[mods]@9:rare_soda.2:id$9:rare_soda" + .. ".4:repo$13:ren/rare-soda.6:sha256$64:" .. SHA + .. ".6:source$6:github.7:version$5:0.4.1[options].5:fizzyT.7:flavour$5:grape" + .. ".9:sweetness#3@9:hard_mode.4:file#99123.2:id$9:hard_mode.3:md5$32:" .. MD5 + .. ".3:mod#4821.6:source$10:gamebanana[options][order]@9:rare_soda@9:hard_mode", + "the canonical string of a cart using no new field is byte for byte the old one") +T.eq(CartManifest.hash(cart), "2a8fbbacbd1df3f349b6a6ed387fa036", + "so its hash, and every save stamped with it, is unchanged") + local open = baseCart() open.seal = "open" open.repo = nil diff --git a/tests/engine/cart_saves.lua b/tests/engine/cart_saves.lua index 3b14225a..42b94e5b 100644 --- a/tests/engine/cart_saves.lua +++ b/tests/engine/cart_saves.lua @@ -264,6 +264,90 @@ do T.eq(again.meta.cartHash, nil, "with no cart stamp on it") end +-- ------- cart-scoped settings + +do + local files = fresh() + local base = SaveData.loadOptions() + base.textSpeed = 5 + base.musicVol = 2 + base.speedBattle = 1 + T.check(SaveData.saveOptions(base), "the base game writes its own settings") + local plain = files["options.lua"] + + SaveData.setCart("nuzlocke", "hash1") + local inCart = SaveData.loadOptions() + T.eq(inCart.textSpeed, 5, "a cart starts from the global value") + T.eq(inCart.musicVol, 2, "for every key, scoped or not") + inCart.textSpeed = 1 + inCart.musicVol = 7 + inCart.speedBattle = 4 + T.check(SaveData.saveOptions(inCart), "change some settings inside the cart") + + local stored = options(files) + T.eq(stored.textSpeed, 5, "the global text speed is untouched") + T.eq(stored.cartOptions.nuzlocke.textSpeed, 1, "the cart keeps its own") + T.eq(stored.cartOptions.nuzlocke.speedBattle, 4, "and its own battle speed") + T.eq(stored.musicVol, 7, "an unscoped setting is written globally") + T.eq(stored.cartOptions.nuzlocke.musicVol, nil, "and never lands in the cart") + + T.eq(SaveData.loadOptions().textSpeed, 1, "the cart reads its value back") + T.eq(SaveData.loadOptions().musicVol, 7, "and the machine's shared volume") + + SaveData.setCart("marathon", "hash2") + T.eq(SaveData.loadOptions().textSpeed, 5, + "another cart does not see the first cart's setting") + local other = SaveData.loadOptions() + other.textSpeed = 3 + T.check(SaveData.saveOptions(other), "the second cart sets its own") + T.eq(options(files).cartOptions.nuzlocke.textSpeed, 1, + "which leaves the first cart's alone") + + SaveData.setCart(nil) + T.eq(SaveData.loadOptions().textSpeed, 5, "and the base game keeps the global") + T.eq(SaveData.loadOptions().speedBattle, 1, "for every scoped key") + + T.check(plain:find("cartOptions", 1, true) ~= nil, + "the options file declares the overlay") + T.check(plain:find("nuzlocke", 1, true) == nil, + "but an install that never ran a cart names no cart in it") + SaveData.setCart(nil) + local vanilla = SaveData.loadOptions() + vanilla.textSpeed = 4 + T.check(SaveData.saveOptions(vanilla), "a base-game write after playing carts") + T.eq(options(files).cartOptions.nuzlocke.textSpeed, 1, + "leaves every cart's overlay intact") + T.eq(options(files).cartOptions.marathon.textSpeed, 3, "for every cart") +end + +do + local files = fresh() + SaveData.setCart("author_cart", "hash3") + T.eq(SaveData.seedCartOptions({ textSpeed = 1, animations = false, + musicVol = 0, nonesuch = 3 }), true, "a cart seeds its shipped settings") + local seeded = SaveData.loadOptions() + T.eq(seeded.textSpeed, 1, "the author's text speed applies") + T.eq(seeded.animations, false, "and the author's battle animation choice") + T.eq(seeded.musicVol, 7, "a machine setting is never seeded") + T.eq(options(files).cartOptions.author_cart.musicVol, nil, "not even into the cart") + T.eq(options(files).cartOptions.author_cart.nonesuch, nil, + "and a key outside the cart-scoped set is ignored") + T.eq(options(files).cartOptionsSeeded.author_cart, true, "the seed is recorded") + + local player = SaveData.loadOptions() + player.textSpeed = 5 + T.check(SaveData.saveOptions(player), "the player then picks their own speed") + T.eq(SaveData.seedCartOptions({ textSpeed = 1, animations = false }), false, + "a second boot re-seeds nothing") + T.eq(SaveData.loadOptions().textSpeed, 5, "so the player's change survives") + + SaveData.setCart(nil) + T.eq(SaveData.loadOptions().textSpeed, 3, + "and the base game still has the shipped default of its own") + T.eq(SaveData.seedCartOptions({ textSpeed = 1 }), false, + "seeding with no cart active does nothing") +end + love.filesystem = realFS T.finish("cart_saves") diff --git a/tests/engine/cart_seal.lua b/tests/engine/cart_seal.lua index d0edfa0e..35866c86 100644 --- a/tests/engine/cart_seal.lua +++ b/tests/engine/cart_seal.lua @@ -98,6 +98,12 @@ local function pin(id, version, options) options = options } end +local function offPin(id, version, options) + local p = pin(id, version, options) + p.enabled = false + return p +end + local function boot(files) local data = { pokemon = {} } local loader = Loader.new({ fs = memfs(files) }) @@ -175,6 +181,171 @@ do T.eq(loader:cartStatus().enforced, false, "an open cart enforces nothing") end +-- ------- a pin the cart ships switched off + +local function withFlags(files, flags) + local opts = SaveSerializer.decode(files["options.lua"]) or {} + opts.mods = opts.mods or {} + for id, on in pairs(flags) do opts.mods[id] = on end + files["options.lua"] = SaveSerializer.encode(opts) + return files +end + +local function withCartFlags(files, cartId, flags) + local opts = SaveSerializer.decode(files["options.lua"]) or {} + opts.cartMods = opts.cartMods or {} + opts.cartMods[cartId] = opts.cartMods[cartId] or {} + for id, on in pairs(flags) do opts.cartMods[cartId][id] = on end + files["options.lua"] = SaveSerializer.encode(opts) + return files +end + +do + local files = install() + writeCart(files, cartTable("shipped_off", "sealed", + { pin("alpha"), offPin("gamma", "1.0.0", { tint = "cart" }) }, + { "alpha", "gamma" })) + SaveData.setCart("shipped_off", "hashA") + + local loader, data, ok = boot(files) + T.check(ok, "a sealed cart that ships a mod switched off loads") + T.eq(names(loader.order), "alpha", "and runs only the pins it ships switched on") + T.eq(data.pokemon.GAMMA, nil, "the switched-off pin does not run") + T.eq(loader.mods.gamma.enabled, false, "and is reported as inactive") + T.eq(loader.mods.gamma.state, "disabled", "with the disabled row state") + T.check(loader.mods.gamma ~= nil, "while still being installed") + T.eq(loader:cartStatus().pins.gamma.options.tint, "cart", + "carrying the settings the cart shipped it with") +end + +do + local files = withCartFlags(install(), "welded", { gamma = true }) + writeCart(files, cartTable("welded", "sealed", + { pin("alpha"), offPin("gamma") }, { "alpha", "gamma" })) + SaveData.setCart("welded", "hashB") + + local loader, data, ok = boot(files) + T.check(ok, "a sealed cart loads with the player asking for the off pin") + T.eq(data.pokemon.GAMMA, nil, "but sealed refuses the toggle") + T.eq(loader.mods.gamma.enabled, false, "the pin stays exactly as the cart shipped it") +end + +-- ------- sealed+ : the same fixed set, switchable + +do + local files = withCartFlags(install(), "plus", { gamma = true }) + writeCart(files, cartTable("plus", "sealed+", + { pin("alpha"), offPin("gamma", "1.0.0", { tint = "cart" }) }, + { "alpha", "gamma" })) + SaveData.setCart("plus", "hashC") + + local loader, data, ok = boot(files) + T.check(ok, "a sealed+ cart loads") + local report = loader:cartStatus() + T.eq(report.seal, "sealed+", "the report carries the new seal") + T.eq(report.sealed, true, "which is a sealed cart") + T.eq(report.enforced, true, "and is enforced like one") + T.eq(names(loader.order), "alpha,gamma", + "the player switched the cart's off pin on and it runs") + T.eq(data.pokemon.GAMMA.name, "cart", + "still with the cart's frozen option value, not the player's") + T.eq(data.pokemon.BETA, nil, "a mod the cart does not pin cannot be added") + T.eq(loader.mods.beta.enabled, false, "and stays switched off") +end + +do + local files = withCartFlags(install(), "plus_off", { alpha = false }) + writeCart(files, cartTable("plus_off", "sealed+", + { pin("alpha"), pin("gamma") }, { "alpha", "gamma" })) + SaveData.setCart("plus_off", "hashD") + + local loader, data, ok = boot(files) + T.check(ok, "a sealed+ cart loads with a pin the player switched off") + T.eq(names(loader.order), "gamma", "which does not run") + T.eq(data.pokemon.ALPHA, nil, "so its content is absent") + T.eq(loader.mods.alpha.enabled, false, "and the row reads as off") +end + +do + local files = install() + writeCart(files, cartTable("plus_gap", "sealed+", + { pin("alpha"), pin("delta", "2.0.0") }, { "alpha", "delta" })) + SaveData.setCart("plus_gap", "hashE") + + local loader, _, ok = boot(files) + T.check(not ok, "sealed+ still refuses a pin that is not installed") + T.eq(#loader.order, 0, "and plays no subset of itself") + T.eq(loader:cartStatus().refused, true, "the report refuses it") +end + +do + local files = install() + love.filesystem = memfs(files) + SaveData.resetSlotState() + GameVersion.set("red") + writeCart(files, cartTable("plus_seal", "sealed+", + { pin("alpha"), offPin("gamma") }, { "alpha", "gamma" })) + SaveData.setCart("plus_seal", "hashF") + local slot = SaveData.createCartSlot("plus_seal") + SaveData.setActiveCartSlot("plus_seal", slot) + + local loader = boot(files) + T.check(loader:setEnabled("gamma", true), "switch a sealed+ pin on") + T.eq(SaveData.isSealBroken(), false, "which does not break the session seal") + T.eq(SaveData.slotSealBroken("plus_seal", slot), false, + "nor mark the save slot modified") + T.eq(SaveData.adoptCartSeal("plus_seal"), false, + "so the next boot still adopts an intact seal") + + local again, data, ok = boot(files) + T.check(ok, "and the cart loads again") + T.eq(names(again.order), "alpha,gamma", "with the mod the player switched on") + T.eq(data.pokemon.BETA, nil, "and still nothing the cart does not pin") +end + +do + local files = withFlags(install(), { gamma = false }) + writeCart(files, cartTable("plus_split", "sealed+", + { pin("alpha"), offPin("gamma") }, { "alpha", "gamma" })) + SaveData.setCart("plus_split", "hashI") + + local loader = boot(files) + T.eq(loader.mods.gamma.enabled, false, "a cart's off pin starts off") + T.check(loader:setEnabled("gamma", true), "and the player switches it on") + local opts = options(files) + T.eq(opts.cartMods.plus_split.gamma, true, + "the answer is stored under the cart that asked for it") + T.eq(SaveData.modEnabled(opts, "gamma", "red"), false, + "and the base game's own flag for that mod is untouched") +end + +-- ------- an open cart hands back only the pins it ships switched off + +do + local files = withCartFlags(install(), "open_off", { gamma = true }) + writeCart(files, cartTable("open_off", "open", + { pin("beta"), offPin("gamma") }, { "beta", "gamma" })) + SaveData.setCart("open_off", "hashG") + + local loader, data, ok = boot(files) + T.check(ok, "an open cart with a switched-off pin loads") + T.check(data.pokemon.GAMMA ~= nil, "the player switched it on, so it runs") + T.eq(loader.mods.beta.enabled, true, + "while a pin the cart says nothing about is still forced on") +end + +do + local files = install() + writeCart(files, cartTable("open_quiet", "open", + { pin("beta"), offPin("gamma") }, { "beta", "gamma" })) + SaveData.setCart("open_quiet", "hashH") + + local loader, data, ok = boot(files) + T.check(ok, "an open cart whose off pin the player never touched loads") + T.eq(data.pokemon.GAMMA, nil, "with that pin off by default") + T.eq(loader.mods.gamma.enabled, false, "and reported off") +end + -- ------- a missing pin: refusal when sealed, warning when open do diff --git a/tests/engine/cart_store.lua b/tests/engine/cart_store.lua index 6eea56b0..47713dd9 100644 --- a/tests/engine/cart_store.lua +++ b/tests/engine/cart_store.lua @@ -224,6 +224,33 @@ local empty = memfs() T.eq(#CartStore.list(empty), 0, "a fresh install lists no carts") T.eq(#CartStore.listFor("red", empty), 0, "listFor is empty on a fresh install") +-- ------- the fields the registry rows have to carry through the store + +local dressedFs = memfs() +local dressed = select(2, bytesOf({ id = "dressed", title = "Dressed", + finish = "holo", speeds = { 1, 2 }, seal = "sealed+", + options = { textSpeed = 1 } })) +local dressedCart, dressedHash = CartStore.install(CartManifest.encode(dressed), + dressedFs) +T.check(dressedCart ~= nil, "a cart with a finish, speeds and settings installs") +T.eq(dressedHash, CartManifest.hash(dressed), "hashing the same as it was written") +T.same(CartStore.get("dressed", dressedFs), dressed, + "and coming back off disk unchanged") + +local dressedReg = SaveData.loadOptions(dressedFs).carts.dressed +T.eq(dressedReg.finish, "holo", "the registry row carries the finish") +T.same(dressedReg.speeds, { 1, 2 }, "and the speed ladder") +T.eq(dressedReg.seal, "sealed+", "and the seal, spelled in full") + +local dressedRow = CartStore.list(dressedFs)[1] +T.eq(dressedRow.finish, "holo", "the list row carries the finish") +T.same(dressedRow.speeds, { 1, 2 }, "and the speed ladder") +T.eq(dressedRow.seal, "sealed+", "and the seal") +T.eq(dressedRow.cart.options.textSpeed, 1, + "and the settings the cart ships, on the parsed cart") +T.eq(SaveData.loadOptions(dressedFs).carts.dressed.hash, dressedHash, + "listing does not rewrite the registry it already agrees with") + local function rowSet() return { { id = "hard_mode", name = "Hard Mode", version = "2.0.0", enabled = true, @@ -258,26 +285,33 @@ T.eq(captured.title, "My Cart", "the captured cart keeps the title") T.eq(captured.shell, "#ff8800", "the captured shell normalises") T.eq(captured.seal, "open", "the captured seal is the author's choice") T.eq(captured.base, "red", "the captured base is the identity's") -T.eq(#captured.mods, 3, "only the enabled mods are pinned") +T.eq(#captured.mods, 4, "every installed mod is pinned, switched on or off") T.eq(captured.load_order[1], "hard_mode", "load order follows the row order") -T.eq(captured.load_order[2], "rare_soda", "load order follows the row order") -T.eq(captured.load_order[3], "sprite_pack", "load order follows the row order") -for _, entry in ipairs(captured.mods) do - T.neq(entry.id, "off_mode", "a disabled mod is never pinned") -end +T.eq(captured.load_order[2], "off_mode", "including the row that is switched off") +T.eq(captured.load_order[3], "rare_soda", "load order follows the row order") +T.eq(captured.load_order[4], "sprite_pack", "load order follows the row order") T.eq(captured.mods[1].source, "github", "a mod with repo, version and hash pins to github") T.eq(captured.mods[1].repo, "ren/hard-mode", "the github pin keeps the repo") T.eq(captured.mods[1].sha256, SHA, "the github pin keeps the recorded hash") -T.eq(captured.mods[2].source, "local", "a mod with no archive hash pins locally") -T.eq(captured.mods[2].version, "0.4.1", "the local pin keeps the installed version") -T.eq(captured.mods[2].repo, nil, "a local pin carries no repo") -T.eq(captured.mods[2].sha256, nil, "a local pin carries no hash") -T.eq(captured.mods[2].options.flavour, "grape", "the author's option values are frozen in") -T.eq(captured.mods[2].options.sweetness, 3, "every scalar option is frozen in") -T.eq(captured.mods[2].options.nested, nil, "a table option value is dropped") -T.eq(captured.mods[3].source, "local", "a mod with no repo pins locally") -T.eq(captured.mods[3].version, "0.0.0", "an unparsable version pins as 0.0.0") +T.eq(captured.mods[1].enabled, nil, "an enabled mod pins with no enabled field") +T.eq(CartManifest.modEnabled(captured.mods[1]), true, "and reads back as enabled") +T.eq(captured.mods[2].id, "off_mode", "the switched-off mod is pinned in place") +T.eq(captured.mods[2].enabled, false, "and is pinned switched off") +T.eq(CartManifest.modEnabled(captured.mods[2]), false, "which reads back as off") +T.eq(captured.mods[2].source, "github", "a disabled pin still resolves its source") +T.eq(captured.mods[2].sha256, SHA2, "and still carries its archive hash") +T.eq(captured.mods[2].options.unused, true, + "a disabled mod's options are captured like any other") +T.eq(captured.mods[3].source, "local", "a mod with no archive hash pins locally") +T.eq(captured.mods[3].version, "0.4.1", "the local pin keeps the installed version") +T.eq(captured.mods[3].repo, nil, "a local pin carries no repo") +T.eq(captured.mods[3].sha256, nil, "a local pin carries no hash") +T.eq(captured.mods[3].options.flavour, "grape", "the author's option values are frozen in") +T.eq(captured.mods[3].options.sweetness, 3, "every scalar option is frozen in") +T.eq(captured.mods[3].options.nested, nil, "a table option value is dropped") +T.eq(captured.mods[4].source, "local", "a mod with no repo pins locally") +T.eq(captured.mods[4].version, "0.0.0", "an unparsable version pins as 0.0.0") T.eq(captured.mods[1].options, nil, "a mod with no options freezes none") T.eq(#unresolved, 2, "capture reports every locally pinned mod") @@ -309,12 +343,18 @@ pinned[4] = nil local full, fullUnresolved = CartStore.capture(identity, pinned, modOptions) T.check(full ~= nil, "a fully pinned capture builds a cart") T.eq(#fullUnresolved, 0, "a fully pinned capture reports nothing unresolved") -T.eq(full.mods[2].source, "github", "a recorded hash promotes the pin to github") -T.eq(full.mods[2].sha256, SHA2, "the promoted pin uses the recorded hash") +T.eq(full.mods[3].source, "github", "a recorded hash promotes the pin to github") +T.eq(full.mods[3].sha256, SHA2, "the promoted pin uses the recorded hash") T.eq(CartManifest.publishable(full), true, "a fully pinned cart is publishable") -local noMods, noModsErr = CartStore.capture(identity, { rowSet()[2] }, modOptions) -T.eq(noMods, nil, "a capture with nothing enabled is refused") +local offOnly = CartStore.capture(identity, { rowSet()[2] }, modOptions) +T.check(offOnly ~= nil, "a capture of nothing but switched-off mods still builds") +T.eq(#offOnly.mods, 1, "pinning the one mod it was given") +T.eq(offOnly.mods[1].enabled, false, "switched off") +T.eq(offOnly.mods[1].options.unused, true, "with its settings kept") + +local noMods, noModsErr = CartStore.capture(identity, {}, modOptions) +T.eq(noMods, nil, "a capture with no mods at all is refused") T.check(type(noModsErr) == "string" and noModsErr:find("cart must pin", 1, true) ~= nil, "the empty capture says why (got " .. tostring(noModsErr) .. ")") T.eq(CartStore.capture({ id = "bad id" }, rowSet(), modOptions), nil, diff --git a/tests/engine/game_speed_categories_test.lua b/tests/engine/game_speed_categories_test.lua index 57bcd86f..6303fd42 100644 --- a/tests/engine/game_speed_categories_test.lua +++ b/tests/engine/game_speed_categories_test.lua @@ -193,4 +193,31 @@ do eq(g.save.options.speedMenu, 2, "cycling in a menu bumps speedMenu") end +-- A cart may narrow the ladder (CartManifest's `speeds`), and returning to +-- the launcher must put it back. +do + local GameSpeed = require("src.core.GameSpeed") + eq(#GameSpeed.allowed(), #GameSpeed.LEVELS, "no cart means the full ladder") + check(not GameSpeed.isLocked(), "and nothing is pinned") + + GameSpeed.setAllowed({ 1, 2 }) + eq(#GameSpeed.allowed(), 2, "a cart narrows the ladder") + eq(GameSpeed.cycle(1, 1), 2, "cycling stays inside the cart's levels") + eq(GameSpeed.cycle(2, 1), 1, "and wraps within them") + eq(GameSpeed.clamp(100), 2, "a value past the cart's top clamps into it") + check(not GameSpeed.isLocked(), "two levels is narrowed, not pinned") + + GameSpeed.setAllowed({ 1 }) + check(GameSpeed.isLocked(), "one level reads as pinned") + eq(GameSpeed.cycle(1, 1), 1, "and cycling cannot leave it") + + GameSpeed.setAllowed({ 1, 7 }) + eq(#GameSpeed.allowed(), 1, "a level that is not on the ladder is dropped") + + GameSpeed.setAllowed(nil) + eq(#GameSpeed.allowed(), #GameSpeed.LEVELS, + "leaving the cart restores the full ladder") + eq(GameSpeed.cycle(4, 1), 10, "and cycling reaches the levels again") +end + T.finish("game_speed_categories") diff --git a/tests/engine/gen2_stats_tiles_bug1558.lua b/tests/engine/gen2_stats_tiles_bug1558.lua index de6fe03c..79ff10da 100644 --- a/tests/engine/gen2_stats_tiles_bug1558.lua +++ b/tests/engine/gen2_stats_tiles_bug1558.lua @@ -21,6 +21,21 @@ for p = 1, 3 do end end +-- gfx/stats/stats.pal, the colour LoadStatsScreenPals drops into colour 0 of +-- BG palettes 0 and 2 (engine/gfx/color.asm:386-390) +local ROM_TINTS = { { 31, 19, 31 }, { 21, 31, 14 }, { 17, 31, 31 } } +for p = 1, 3 do + for ch = 1, 3 do + T.eq(SummaryMenu.PAGE_TINTS[p][ch], up(ROM_TINTS[p][ch]), + ("stats.pal tint %d channel %d"):format(p, ch)) + end + local page = setmetatable({ page = p }, { __index = SummaryMenu }) + local lower = page:lowerColors() + T.eq(lower[1][1], SummaryMenu.PAGE_TINTS[p][1], + ("lower half palette %d takes the page tint as colour 0"):format(p)) + T.eq(lower[4][1], 0, ("lower half palette %d keeps black ink"):format(p)) +end + -- the quads: 17 tiles from $31, one 8x8 cell each off the 136x8 sheet love.graphics = love.graphics or {} local realNewQuad = love.graphics.newQuad @@ -48,4 +63,4 @@ local old = setmetatable({ menuGfx = {} }, { __index = SummaryMenu }) T.check(old:statsTiles() == nil, "no menu_gfx.stats falls back, not crashes") love.graphics.newQuad = realNewQuad -T.finish("gen2 stats tiles and page palettes (#1558)") +T.finish("gen2 stats tiles and page palettes (#1558, #1693)") diff --git a/tests/engine/launcher_skins_ux.lua b/tests/engine/launcher_skins_ux.lua index 3ce36f51..9ee14f87 100644 --- a/tests/engine/launcher_skins_ux.lua +++ b/tests/engine/launcher_skins_ux.lua @@ -265,4 +265,32 @@ check(update and update:find("_pumpSkinFetch", 1, true) ~= nil, check(TouchSkin.ARCHIVE_EXTS.deltaskin == true, "and the installer accepts the extension") +-- Turning skins off must leave the pad on. `enabled` is the pad's own switch, +-- and the button that calls this only exists while a skin is active, which +-- already requires the pad to be enabled. +do + local SaveData = require("src.core.SaveData") + local TouchControls = require("src.core.TouchControls") + + local opts = SaveData.loadOptions() + opts.touchControls = { enabled = true, skin = "some_skin" } + SaveData.saveOptions(opts) + + local imp = RomImporter.new(function() end, { launcher = true }) + imp:_disableSkins() + + local after = SaveData.loadOptions().touchControls + eq(after.skin, nil, "turning skins off clears the selected skin") + check(after.enabled ~= false, "and leaves the touch pad enabled") + + local cfg = TouchControls.normalizeConfig(after) + check(cfg.enabled, "so the pad is on after normalizing") + eq(cfg.skin, nil, "with no skin behind it") + + check(imp._skinNotice ~= nil and imp._skinNotice.ok == true, + "and the notice reports success") + check(tostring(imp._skinNotice.text):find("built-in pad", 1, true) ~= nil, + "promising the built-in pad, which is now what happens") +end + T.finish("launcher_skins_ux") diff --git a/tests/engine/mod_index_tests.lua b/tests/engine/mod_index_tests.lua index 93e1a455..b05d040f 100644 --- a/tests/engine/mod_index_tests.lua +++ b/tests/engine/mod_index_tests.lua @@ -385,4 +385,152 @@ do eq(cats[1], "GAMEPLAY", "and they keep the feed's declared order") end +-- ------- carts: a second array on the same feed, at the same schema_version +-- +-- The published index added carts without bumping schema_version, so an older +-- build has to keep reading the feed and this one has to read both halves. +-- The fixture below is the shape carts/@/meta.json validates to. + +local OMEGA = { + folder = "bryanthaboi@omega_random_competition", + id = "omega_random_competition", + title = "OMEGA RANDOM COMPETITION", + author = "bryanthaboi", + summary = "Bois Club Randomizer as its own cartridge.", + version = "1.0.0", + base = "red", + seal = "sealed", + shell = "#7B1B22", + finish = "holo", + speeds = { 1, 2 }, + tags = { "randomizer", "competition" }, + repo = "https://github.com/bryanthaboi/omega-random-competition", + github = "bryanthaboi/omega-random-competition", + automatic_version_check = true, + mods = { { id = "bcr", source = "github", repo = "bryanthaboi/bcr", + version = "1.0.0", sha256 = ("83a111b4"):rep(8) } }, + load_order = { "bcr" }, + license = "MIT", + description_url = "data/carts/bryanthaboi@omega_random_competition/description.md", + update_check = "pending", +} + +local JOHTO_CART = { + id = "johto_run", title = "Johto Run", author = "Ren", version = "2.1.0", + base = "gold", seal = "open", + repo = "https://github.com/ren/johto-run", + github = "ren/johto-run", + mods = { { id = "steps", source = "gamebanana", mod = 42, file = 99, + md5 = ("ab"):rep(16), enabled = false, + options = { pace = "fast" } } }, + update_check = "ok", + latest = { version = "2.1.0", tag = "v2.1.0", + zip = { name = "johto_run-2.1.0.zip", + url = "https://example.test/johto_run-2.1.0.zip" } }, +} + +local function cartFeed(carts, overrides) + local doc = { schema_version = 1, count = 1, cart_count = #carts, + categories = { "GAMEPLAY" }, + base_games = { "red", "blue", "yellow", "gold", "silver" }, + mods = { NUZLOCKE }, carts = carts } + for k, v in pairs(overrides or {}) do doc[k] = v end + return Json.encode(doc) +end + +do + local index, err = ModIndex.parse(cartFeed({ OMEGA, JOHTO_CART })) + check(index ~= nil, "a feed carrying carts parses: " .. tostring(err)) + eq(index.schemaVersion, 1, "carts arrive at schema_version 1, unbumped") + eq(#index.mods, 1, "the mods array still parses") + eq(#index.carts, 2, "and the carts array parses beside it") + local c = index.carts[1] + eq(c.id, "omega_random_competition", "cart id") + eq(c.title, "OMEGA RANDOM COMPETITION", "cart title") + eq(c.base, "red", "the game the cart plays as") + eq(c.seal, "sealed", "its seal") + eq(c.shell, "#7B1B22", "its shell colour") + eq(c.finish, "holo", "its finish") + eq(c.speeds[2], 2, "its speed ladder") + eq(c.tags[1], "randomizer", "its tags") + eq(c.license, "MIT", "its license") + eq(c.load_order[1], "bcr", "its load order") + eq(#c.mods, 1, "its pinned mod set") + eq(c.mods[1].source, "github", "a github pin keeps its source") + eq(c.mods[1].repo, "bryanthaboi/bcr", "with the repo it comes from") + eq(c.mods[1].version, "1.0.0", "the exact pinned version") + eq(#c.mods[1].sha256, 64, "and the digest that gates it") + check(ModIndex.isCart(c), "a parsed cart is marked as one") + check(not ModIndex.isCart(index.mods[1]), "a mod is not") + + local g = index.carts[2] + eq(g.mods[1].source, "gamebanana", "a gamebanana pin keeps its source") + eq(g.mods[1].mod, 42, "with its mod page id") + eq(g.mods[1].file, 99, "and its file id") + eq(#g.mods[1].md5, 32, "and the digest GameBanana reports") + eq(g.mods[1].enabled, false, "a pin shipped switched off stays off") + eq(g.mods[1].options.pace, "fast", "frozen options survive") + eq(ModIndex.installUrl(g), "https://example.test/johto_run-2.1.0.zip", + "a cart resolves its release asset the same way a mod does") +end + +-- the old-feed case: no carts key at all +do + local index, err = ModIndex.parse(feed({ NUZLOCKE })) + check(index ~= nil, "a feed with no carts key still parses: " .. tostring(err)) + eq(#index.mods, 1, "its mods are unaffected") + eq(type(index.carts), "table", "and carts is a list, never nil") + eq(#index.carts, 0, "an absent carts array is an empty one") +end + +-- a broken cart row costs itself, not the whole feed +do + local noBase = {} + for k, v in pairs(OMEGA) do noBase[k] = v end + noBase.base = nil + local noMods = {} + for k, v in pairs(JOHTO_CART) do noMods[k] = v end + noMods.id, noMods.mods = "empty_pins", {} + local index, err = ModIndex.parse(cartFeed({ + noBase, "not even an object", { id = "bare" }, noMods, OMEGA })) + check(index ~= nil, "a feed with malformed carts still parses: " .. tostring(err)) + eq(#index.carts, 1, "only the well-formed cart is listed") + eq(index.carts[1].id, "omega_random_competition", "and it is the intact one") + eq(#index.mods, 1, "the mods array is untouched by a bad cart") +end + +-- search and filter: matches() already spans title / author / summary / id, +-- so the cart half reuses it wholesale. The category filter does not apply +-- (a cart has none); base does. +do + local index = ModIndex.parse(cartFeed({ OMEGA, JOHTO_CART })) + local carts = index.carts + eq(#ModIndex.filter(carts, {}), 2, "no filter keeps every cart") + eq(ModIndex.filter(carts, { query = "omega" })[1].id, + "omega_random_competition", "search matches a cart by title") + eq(ModIndex.filter(carts, { query = "Ren" })[1].id, "johto_run", + "search matches a cart by author") + eq(ModIndex.filter(carts, { query = "randomizer" })[1].id, + "omega_random_competition", "and by summary") + eq(#ModIndex.filter(carts, { query = "omega johto" }), 0, + "cart search terms are ANDed too") + eq(ModIndex.filter(carts, { base = "gold" })[1].id, "johto_run", + "filtering by base game keeps the carts for that game") + eq(#ModIndex.filter(carts, { base = "RED" }), 1, + "and compares case-insensitively") + eq(#ModIndex.filter(carts, { base = "silver" }), 0, + "a base no cart plays as filters everything out") + eq(#ModIndex.filter(carts, { category = "GAMEPLAY" }), 0, + "a cart carries no categories, so a category filter never matches one") + eq(ModIndex.filter(carts, { tag = "competition" })[1].id, + "omega_random_competition", "cart tags filter") + + local bases = ModIndex.baseGamesIn(index) + eq(#bases, 2, "only base games a cart actually plays as are offered") + eq(bases[1], "red", "and they keep the feed's declared base_games order") + eq(bases[2], "gold", "in that order") + eq(#ModIndex.baseGamesIn(ModIndex.parse(feed({ NUZLOCKE }))), 0, + "a cartless feed offers no base games") +end + print("ok mod_index_tests") diff --git a/tests/engine/museum_clerk_back_entrance_bug1690.lua b/tests/engine/museum_clerk_back_entrance_bug1690.lua new file mode 100644 index 00000000..ebced384 --- /dev/null +++ b/tests/engine/museum_clerk_back_entrance_bug1690.lua @@ -0,0 +1,222 @@ +-- The Pewter museum ticket clerk dispatches on the player's coordinates +-- before it looks at the ticket flag (#1690). scripts/Museum1F.asm:45 +-- reads wYCoord/wXCoord first: (13,4) and (12,3) are behind the counter +-- (the AMBER question), Y==4 otherwise is the ticket path, and anything +-- else is the "go to the other side" brush-off. The port only ever had +-- the middle branch, so two thirds of the NPC never fired. +-- +-- tests/engine/museum_money_box_bug1335.lua and museum_1f_clerk_ +-- translation_test.lua both call the clerk with ow == nil, which stays on +-- the ticket path either way, so neither can see the coordinate branches. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.harness") + +package.loaded["src.render.TextBox"] = { + new = function(_, text, onDone, opts) + return { text = text, onDone = onDone, opts = opts } + end, +} + +local M = assert(loadfile("data/scripts/story2.lua"))() +local clerk = M.MUSEUM_1F.talk.TEXT_MUSEUM1F_SCIENTIST1 + +-- data/maps/objects/Museum1F.asm: MUSEUM1F_SCIENTIST1 stands at (12,4) +-- with the counter column at x==11. (13,4) is the cell east of him and +-- (12,3) the cell north of him, both reachable only from the back door; +-- (10,4) talks to him across the counter from the public side. +local BEHIND = { { 13, 4 }, { 12, 3 } } +local FRONT = { 10, 4 } + +local pushed +local function mkGame(cash) + pushed = {} + return { + data = { text = {} }, + save = { money = cash, flags = {} }, + stack = { push = function(_, box) pushed[#pushed + 1] = box end }, + } +end + +local function mkOw(x, y) + return { player = { cellX = x, cellY = y } } +end + +-- nil-tolerant: a branch that pushes nothing at all is a failure to +-- report, not a crash that hides every check after it +local function has(box, needle) + return box ~= nil and tostring(box.text):find(needle, 1, true) ~= nil +end + +-- answering a box that never offered a choice is the failure mode itself, +-- so report it rather than dying on a nil index and hiding the rest +local function answer(box, yes) + if box and box.opts and box.opts.choice then box.opts.choice(yes) end +end + +-- ------------------------------------------------ behind the counter +for _, cell in ipairs(BEHIND) do + local where = ("(%d,%d)"):format(cell[1], cell[2]) + + local g = mkGame(3000) + clerk(g, mkOw(cell[1], cell[2]), nil, function() end) + local ask = pushed[1] + T.check(has(ask, "sneak"), + where .. " opens the can't-sneak-in-the-back-way box") + T.check(ask.opts ~= nil and ask.opts.choice ~= nil, + where .. " carries the AMBER yes/no choice") + T.check(ask.opts.money == nil, + where .. " raises no money window behind the AMBER question") + T.check(ask.onDone == nil, where .. " chains through the choice, not onDone") + + -- YES: .TheresALabSomewhereText + answer(ask, true) + T.check(has(pushed[2], "lab"), where .. " YES gives the resurrection lab line") + + -- NO: .AmberIsFossilizedTreeSapText + g = mkGame(3000) + clerk(g, mkOw(cell[1], cell[2]), nil, function() end) + answer(pushed[1], false) + T.check(has(pushed[2], "tree sap"), where .. " NO explains AMBER is tree sap") + + T.eq(g.save.money, 3000, where .. " never charges the player") + T.check(not g.save.flags.EVENT_BOUGHT_MUSEUM_TICKET, + where .. " never hands out a ticket") +end + +-- the coordinate check runs BEFORE the ticket check, so a ticket holder +-- who wanders round the back still gets told off (asm:45 precedes asm:59) +for _, cell in ipairs(BEHIND) do + local where = ("(%d,%d)"):format(cell[1], cell[2]) + local g = mkGame(3000) + g.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = true + clerk(g, mkOw(cell[1], cell[2]), nil, function() end) + T.check(has(pushed[1], "sneak"), + where .. " with a ticket is still the back-way box, not take-your-time") + answer(pushed[1], false) + T.check(has(pushed[2], "tree sap"), + where .. " with a ticket still answers NO with the tree sap line") +end + +-- the done callback reaches the second box on both answers +local g = mkGame(3000) +local doneFired = false +clerk(g, mkOw(13, 4), nil, function() doneFired = true end) +answer(pushed[1], true) +T.check(pushed[2].onDone ~= nil, "the AMBER answer box carries the done callback") +pushed[2].onDone() +T.check(doneFired, "and it chains back out of the conversation") + +-- ------------------------------------------------ the brush-off +-- scripts/Museum1F.asm:58: no ticket and not on row 4 means "other side" +local OFF_ROW = { { 12, 5 }, { 13, 3 }, { 12, 2 }, { 11, 3 } } +for _, cell in ipairs(OFF_ROW) do + local where = ("(%d,%d)"):format(cell[1], cell[2]) + local gg = mkGame(3000) + clerk(gg, mkOw(cell[1], cell[2]), nil, function() end) + T.check(has(pushed[1], "other side"), where .. " gets the brush-off line") + T.check(pushed[1].opts == nil, where .. " raises no money window") + T.eq(gg.save.money, 3000, where .. " never charges the player") +end + +-- with a ticket, off-row talk falls through to take-your-time instead +-- (asm:59 CheckEvent gates the brush-off) +local g2 = mkGame(3000) +g2.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = true +clerk(g2, mkOw(12, 5), nil, function() end) +T.check(has(pushed[1], "Take your time"), + "(12,5) with a ticket gets take-your-time, not the brush-off") + +-- ------------------------------------------------ the ticket path holds +-- across the counter from the public side is row 4: the money box +local g3 = mkGame(3000) +clerk(g3, mkOw(FRONT[1], FRONT[2]), nil, function() end) +T.check(has(pushed[1], "50"), "(10,4) still opens the child's ticket ask") +T.check(pushed[1].opts ~= nil and pushed[1].opts.money ~= nil, + "and the ask still raises the money window") +answer(pushed[1], true) +T.eq(g3.save.money, 2950, "buying from the front still costs 50") +T.check(g3.save.flags.EVENT_BOUGHT_MUSEUM_TICKET, "and still sets the ticket flag") + +local g4 = mkGame(3000) +g4.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = true +clerk(g4, mkOw(FRONT[1], FRONT[2]), nil, function() end) +T.check(has(pushed[1], "Take your time"), + "(10,4) with a ticket still gets take-your-time") +T.check(pushed[1].opts == nil, "and no money window on that branch") + +-- a caller with no overworld (the two older suites, and any script that +-- talks to the clerk out of band) must keep the pre-#1690 ticket path +local g5 = mkGame(3000) +clerk(g5, nil, nil, function() end) +T.check(has(pushed[1], "50"), "ow == nil still opens the ticket ask") +T.check(pushed[1].opts ~= nil and pushed[1].opts.money ~= nil, + "ow == nil still raises the money window") + +-- ------------------------------------------------ the rope onStep path +-- Museum1FDefaultScript calls the clerk over when the player steps onto +-- (9,4) or (10,4); OverworldController passes the player's own cell, so +-- the brush-off must not swallow the ask there +for _, x in ipairs({ 9, 10 }) do + local where = ("(%d,4)"):format(x) + local g6 = mkGame(3000) + local moved = false + local ow = mkOw(x, 4) + ow.scriptMove = function() moved = true end + local handled = M.MUSEUM_1F.onStep(g6, ow, x, 4) + T.check(handled, where .. " on the rope is handled by onStep") + T.check(has(pushed[1], "50"), where .. " on the rope opens the ticket ask") + T.check(pushed[1].opts ~= nil and pushed[1].opts.money ~= nil, + where .. " on the rope keeps the money window") + answer(pushed[1], false) + T.check(has(pushed[2], "Come again"), where .. " declining says come again") + pushed[2].onDone() + T.check(moved, where .. " declining still shoves the player back south (#151)") +end + +-- a ticket holder walking the rope is not stopped at all +local g7 = mkGame(3000) +g7.save.flags.EVENT_BOUGHT_MUSEUM_TICKET = true +local ow7 = mkOw(9, 4) +ow7.scriptMove = function() end +T.check(not M.MUSEUM_1F.onStep(g7, ow7, 9, 4), + "a ticket holder crosses the rope without being stopped") +T.eq(#pushed, 0, "and no box is pushed") + +-- ------------------------------------------------ translation reaches it +-- the two new branches must read game.data.text, not bare literals +local TRANSLATED = { + _Museum1FScientist1DoYouKnowWhatAmberIsText = "Pas par derriere !\nL'AMBRE, tu connais ?", + _Museum1FScientist1TheresALabSomewhereText = "Un labo essaie de\nles ressusciter.", + _Museum1FScientist1AmberIsFossilizedTreeSapText = "C'est de la resine\nfossilisee.", + _Museum1FScientist1GoToOtherSideText = "Passe de l'autre\ncote !", +} +local function mkTranslated() + pushed = {} + return { + data = { text = TRANSLATED }, + save = { money = 3000, flags = {} }, + stack = { push = function(_, box) pushed[#pushed + 1] = box end }, + } +end + +local g8 = mkTranslated() +clerk(g8, mkOw(13, 4), nil, function() end) +T.eq(pushed[1].text, TRANSLATED._Museum1FScientist1DoYouKnowWhatAmberIsText, + "the back-way box uses the translated AMBER question") +answer(pushed[1], true) +T.eq(pushed[2].text, TRANSLATED._Museum1FScientist1TheresALabSomewhereText, + "YES uses the translated lab line") + +g8 = mkTranslated() +clerk(g8, mkOw(12, 3), nil, function() end) +answer(pushed[1], false) +T.eq(pushed[2].text, TRANSLATED._Museum1FScientist1AmberIsFossilizedTreeSapText, + "NO uses the translated tree sap line") + +g8 = mkTranslated() +clerk(g8, mkOw(12, 5), nil, function() end) +T.eq(pushed[1].text, TRANSLATED._Museum1FScientist1GoToOtherSideText, + "the brush-off uses the translated other-side line") + +T.finish("museum_clerk_back_entrance_bug1690") diff --git a/tests/engine/performance_tiers.lua b/tests/engine/performance_tiers.lua index 153d414b..1f494743 100644 --- a/tests/engine/performance_tiers.lua +++ b/tests/engine/performance_tiers.lua @@ -84,12 +84,14 @@ T.eq(Performance.label(nil), "AUTO", "label nil -> AUTO") -- -------------------------------------------------------------------- caps local hi, lo = Performance.CAPS.high, Performance.CAPS.low -T.check(hi.tilt and hi.gbcfx and hi.survey and not hi.fpsMax, "high caps: all on, no fps ceiling") -T.check((not lo.tilt) and (not lo.gbcfx) and (not lo.survey), "low caps: heavy extras off") +T.check(hi.tilt and hi.survey and hi.shaderfx and not hi.fpsMax, + "high caps: all on, no fps ceiling") +T.check((not lo.tilt) and (not lo.survey) and (not lo.shaderfx), + "low caps: heavy extras off") T.eq(lo.fpsMax, 60, "low caps: FPS ceiling of 60") local bal = Performance.CAPS.balanced -T.check((not bal.tilt) and (not bal.gbcfx) and bal.survey and not bal.fpsMax, - "balanced caps: no tilt/gbcfx, survey kept, no fps ceiling") +T.check((not bal.tilt) and bal.survey and (not bal.shaderfx) and not bal.fpsMax, + "balanced caps: no tilt, no shaderfx, survey kept, no fps ceiling") device("Linux", "arm64", 4) T.eq(Performance.caps("auto"), Performance.CAPS.low, "caps(auto) resolves through detect") diff --git a/tests/gen2_audio_test.lua b/tests/gen2_audio_test.lua index 9d0031fa..e9f50e88 100644 --- a/tests/gen2_audio_test.lua +++ b/tests/gen2_audio_test.lua @@ -74,6 +74,12 @@ if ok then peak = math.max(peak, math.abs(l), math.abs(r)) end check(peak > 0.01, "TitleScreen renders audible samples (peak=" .. peak .. ")") + -- audio/drumkits.asm kit 5: the NR42 envelope rings on past the noise_note + -- script, so a snare must outlast the one frame its script occupies. + local frame = ChipSynth.SAMPLE_RATE / 60 + local snare = engine:drumInstrumentGen2(5, 1) + check(snare[#snare].endSample > frame * 2, + "kit 5 snare rings past its script (" .. snare[#snare].endSample .. " samples)") end local bark = audio.songs.Music_NewBarkTown diff --git a/tests/gen2_battle_cursor_test.lua b/tests/gen2_battle_cursor_test.lua new file mode 100644 index 00000000..0b77c7df --- /dev/null +++ b/tests/gen2_battle_cursor_test.lua @@ -0,0 +1,200 @@ +-- The battle main menu's 2x2 cursor clamps at every edge instead of wrapping +-- to the opposite command (#1706). BattleMenuHeader's .MenuData flag byte is +-- `db STATICMENU_CURSOR | STATICMENU_DISABLE_B` (engine/battle/menu.asm:31-33) +-- with no STATICMENU_WRAP, so Init2DMenuCursorPosition leaves both wrap bits +-- clear (engine/menus/menu.asm:156-166) and _2DMenuInterpretJoypad's +-- .check_wrap_around_* arms answer `xor a / ret`: the cursor does not move. +-- ContestBattleMenuHeader (menu.asm:70-77) is the same grid, same flag byte. +-- +-- luajit tests/gen2_battle_cursor_test.lua +-- +-- ROM-free: the fixtures below are the extractor's shapes, and every press +-- goes through the real Input edge detector and the real screen. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 battle cursor") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Battle = require("src.battle.gen2.Battle") +local BattleState = require("src.ui.gen2.BattleState") +local Input = require("src.core.Input") +local Mon = require("src.battle.gen2.Mon") + +-- ---------------------------------------------------------------- fixtures + +local TYPES = { NORMAL = { id = "NORMAL", index = 0, category = "physical" } } + +local MOVES = { + TACKLE = { id = "TACKLE", name = "TACKLE", power = 35, type = "NORMAL", + accuracy = 95, pp = 35, effect = "EFFECT_NORMAL_HIT" }, +} + +local GROWTH = { + GROWTH_MEDIUM_FAST = { numerator = 1, denominator = 1, squared = 0, + linear = 0, constant = 0 }, +} + +local POKEMON = { + growthRates = GROWTH, + CYNDAQUIL = { + id = "CYNDAQUIL", index = 155, name = "CYNDAQUIL", + baseStats = { hp = 39, attack = 52, defense = 43, speed = 65, + specialAttack = 60, specialDefense = 50 }, + types = { "NORMAL", "NORMAL" }, catchRate = 45, baseExp = 65, + growthRate = "GROWTH_MEDIUM_FAST", genderRatio = 31, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, + PIDGEY = { + id = "PIDGEY", index = 16, name = "PIDGEY", + baseStats = { hp = 40, attack = 45, defense = 40, speed = 56, + specialAttack = 35, specialDefense = 35 }, + types = { "NORMAL", "NORMAL" }, catchRate = 255, baseExp = 55, + growthRate = "GROWTH_MEDIUM_FAST", genderRatio = 127, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, +} + +local DATA = { + pokemon = POKEMON, + moves = MOVES, + type_chart = { types = TYPES, matchups = {} }, + items = {}, +} + +local perfect = { attack = 15, defense = 15, speed = 15, special = 15 } +perfect.hp = Mon.hpDV(perfect) + +-- The smallest roll that neither crits nor misses. +local function detRandom(n) + if (n or 1) <= 1 then return 0 end + return 1 +end + +local function newScreen(opts) + opts = opts or {} + Input:init() + local player = Mon.new(DATA, "CYNDAQUIL", 10, { dvs = perfect }) + player.moves = { { id = "TACKLE", pp = 35, maxPp = 35 } } + local wild = Mon.new(DATA, "PIDGEY", 5, { dvs = perfect }) + wild.moves = { { id = "TACKLE", pp = 35, maxPp = 35 } } + local save = { party = { player }, inventory = {}, player = { name = "GOLD" } } + local pushed = {} + local game = { + data = DATA, save = save, input = Input, options = {}, + stack = { + push = function(_, screen) pushed[#pushed + 1] = screen end, + pop = function() table.remove(pushed) end, + top = function() return pushed[#pushed] end, + clear = function(self) while #pushed > 0 do self:pop() end end, + }, + } + local battle = Battle.new({ data = DATA, party = { player }, wild = wild, + save = save, random = detRandom }) + local screen = BattleState.new(game, { battle = battle, save = save, + contest = opts.contest }) + game.stack:push(screen) + return screen, pushed +end + +-- Battle lines end in `prompt`, and PromptButton waits on A or B with no frame +-- countdown (home/joypad.asm:383-412), so the drain presses like a player. +local function runToMenu(screen, cap) + for _ = 1, (cap or 3000) do + local waiting = (screen.messageTimer or 0) > 0 + if waiting then Input:overlayPressed("a") end + Input:step() + screen:update(1 / 60) + if waiting then Input:overlayReleased("a") end + if screen.phase == "menu" then return true end + end + return false +end + +local function press(screen, button) + Input:overlayPressed(button) + Input:step() + screen:update(1 / 60) + Input:overlayReleased(button) + Input:step() +end + +-- One press from a known cursor position, answering where it landed. +local function pressAt(screen, index, button) + screen.menuIndex = index + press(screen, button) + return screen.menuIndex +end + +-- ---- the whole 2x2 transition table --------------------------------------- +-- +-- Row-major, FIGHT / PkMn over PACK / RUN (BattleMenuHeader's menu_coords). +-- The eight edge rows are the bug; the eight interior rows are the guard +-- against a fix that clamps the raw index instead of the column and the row, +-- which would hold every edge and still break FIGHT-down and RUN-left. +local GRID = { + { 1, "left", 1 }, { 2, "left", 1 }, { 3, "left", 3 }, { 4, "left", 3 }, + { 1, "right", 2 }, { 2, "right", 2 }, { 3, "right", 4 }, { 4, "right", 4 }, + { 1, "up", 1 }, { 2, "up", 2 }, { 3, "up", 1 }, { 4, "up", 2 }, + { 1, "down", 3 }, { 2, "down", 4 }, { 3, "down", 3 }, { 4, "down", 4 }, +} + +local LABEL = { "FIGHT", "PkMn", "PACK", "RUN" } + +do + local screen = newScreen() + check(runToMenu(screen), "the intro drains to the battle menu") + eq(screen.menuIndex, 1, "which opens on FIGHT") + + for _, row in ipairs(GRID) do + local from, button, want = row[1], row[2], row[3] + local note = from == want + and ("%s holds against %s"):format(LABEL[from], button) + or ("%s goes %s to %s"):format(LABEL[from], button, LABEL[want]) + eq(pressAt(screen, from, button), want, note) + end + + -- Whatever the cursor lands on has to stay a command the menu can run; + -- an off-by-one clamp would index MENU past its end and choose nothing. + for _, row in ipairs(GRID) do + local landed = pressAt(screen, row[1], row[2]) + check(BattleState.MENU[landed] ~= nil, + ("%s %s leaves the cursor on a real command"):format( + LABEL[row[1]], row[2])) + end +end + +-- ---- the same grid inside the bug-catching contest ------------------------- +-- +-- ContestBattleMenuHeader only moves the box out to menu_coords 2, 12 +-- (engine/battle/menu.asm:70-77); flag byte and cells are BattleMenuHeader's. +do + local screen = newScreen({ contest = true }) + check(runToMenu(screen), "a contest battle drains to its menu") + eq(screen.contest, true, "with the contest menu's coordinates") + eq(pressAt(screen, 2, "right"), 2, "PkMn holds against right in the contest") + eq(pressAt(screen, 3, "down"), 3, "PARKBALL holds against down") + eq(pressAt(screen, 1, "down"), 3, "and FIGHT still drops onto it") +end + +-- ---- the D-pad is silent --------------------------------------------------- +-- +-- MenuClickSound / PlayClickSFX play SFX_READ_TEXT_2 for A and B only +-- (home/menu.asm:746-762), so a rebuilt branch must not click on a move. +do + local screen = newScreen() + check(runToMenu(screen), "reached the menu again") + local played = {} + screen.playSfx = function(_, name) played[#played + 1] = name end + for _, button in ipairs({ "left", "right", "up", "down" }) do + press(screen, button) + end + eq(#played, 0, "no click sound on any of the four directions") + screen.menuIndex = 1 + press(screen, "a") + eq(played[1], "Sfx_ReadText2", "A on FIGHT is what clicks") +end + +S.finish() diff --git a/tests/gen2_battle_options_test.lua b/tests/gen2_battle_options_test.lua new file mode 100644 index 00000000..51c59947 --- /dev/null +++ b/tests/gen2_battle_options_test.lua @@ -0,0 +1,262 @@ +-- BATTLE BG on Gold (#1709): the one battle-surround setting Gold's renderer +-- can honour. This covers the wiring a screenshot cannot -- the default key, +-- the OPTION row and its ladder, the launcher gear row, the mod-facing member +-- table -- plus the band geometry Game2 paints, asserted as rectangles rather +-- than as pixels. +-- +-- What colour those bands actually come out is not a claim this file makes; +-- tests/drivers/gold_battle_bg_bug1709_test.lua is where a human judges that. + +package.path = "./?.lua;" .. package.path + +love = love or {} +love.graphics = love.graphics or { + getColor = function() return 1, 1, 1, 1 end, + setColor = function() end, + rectangle = function() end, + print = function() end, + printf = function() end, + draw = function() end, + newQuad = function() return {} end, + newImage = function() return nil end, + getShader = function() return nil end, + setShader = function() end, + newShader = function() error("no shaders in this harness") end, + getDimensions = function() return 160, 144 end, + push = function() end, pop = function() end, + translate = function() end, scale = function() end, + circle = function() end, clear = function() end, +} +love.math = love.math or { random = function(a, b) return b and a or 0.5 end } +love.image = love.image or {} +love.timer = love.timer or { getTime = function() return 0 end } +love.filesystem = love.filesystem or { + load = function() return nil end, + getInfo = function() return nil end, + read = function() return nil end, + write = function() return true end, + remove = function() return true end, +} +require("src.core.Logger").warn = function() end + +local BattleState = require("src.ui.gen2.BattleState") +local Chrome = require("src.ui.gen2.Chrome") +local Game2 = require("src.core.Game2") +local Gen2Compat = require("src.mods.Gen2Compat") +local LauncherSettings = require("src.import.LauncherSettings") +local OptionsMenu = require("src.ui.gen2.OptionsMenu") +local Save = require("src.core.gen2.Save") +local ScreenPosition = require("src.core.ScreenPosition") + +local checks, failures = 0, 0 +local function check(label, got, want) + checks = checks + 1 + if got ~= want then + failures = failures + 1 + print(("FAIL %s: got %s want %s"):format(label, tostring(got), + tostring(want))) + end +end + +-- --------------------------------------------------------------- the key + +check("the default surround is the cart's paper white", + Save.DEFAULT_OPTIONS.battleBg, "white") +check("and a fresh options table carries it", + Save.defaultOptions().battleBg, "white") + +-- --------------------------------------------------------------- the row + +local function rowNamed(label) + for i, row in ipairs(OptionsMenu.ROWS) do + if row.label == label then return i, row end + end +end + +local bgIndex, bgRow = rowNamed("BATTLE BG") +check("OPTION has a BATTLE BG row", bgRow ~= nil, true) +if bgRow then + check("it edits battleBg", bgRow.key, "battleBg") + check("it is a port row, not one of the cart's seven", bgRow.port, true) + check("WHITE and BLACK are the whole ladder", #bgRow.values, 2) + check("stored lowercase, shown WHITE", bgRow.display.white, "WHITE") + check("and BLACK", bgRow.display.black, "BLACK") + -- Appended at the tail, so nothing the other suites index by position moves. + check("it follows MAX FPS", OptionsMenu.ROWS[bgIndex - 1].label, "MAX FPS") + check("and CANCEL still ends the list", + OptionsMenu.ROWS[bgIndex + 1].cancel, true) + check("CANCEL is last", bgIndex + 1, #OptionsMenu.ROWS) +end +check("the cart's rows are unmoved", OptionsMenu.ROWS[7].key, "frame") +check("the rebind screen is unmoved", OptionsMenu.ROWS[8].id, "controls") +check("the port's audio group is unmoved", OptionsMenu.ROWS[9].key, "musicVol") + +-- The screen is built from ROWS, so the row has to survive buildRows too. +local menu = OptionsMenu.new({ options = Save.defaultOptions() }, + { options = Save.defaultOptions() }) +local built +for _, row in ipairs(menu.rows) do + if row.key == "battleBg" then built = row end +end +check("buildRows keeps it", built ~= nil, true) +if built then + check("and gives it the mod-facing id battleBg", built.id, "battleBg") + check("the menu starts on WHITE", menu.options.battleBg, "white") + menu:cycle(built, 1) + check("right stores black, not the display string", + menu.options.battleBg, "black") + menu:cycle(built, 1) + check("right again wraps to white", menu.options.battleBg, "white") + menu:cycle(built, -1) + check("left walks the ladder the other way", menu.options.battleBg, "black") + menu:cycle(built, -1) + check("and back", menu.options.battleBg, "white") +end + +-- ------------------------------------------------------ the launcher gear + +local model = LauncherSettings.open(nil, "gold") +local gearRow +for _, section in ipairs(model.sections) do + for _, row in ipairs(section.rows) do + if row.label == "BATTLE BG" then gearRow = row end + end +end +check("the gold gear offers BATTLE BG", gearRow ~= nil, true) +if gearRow then + model.opts.gold.battleBg = nil + check("an options.lua with no battleBg reads WHITE", gearRow.value(), "WHITE") + gearRow.step(1) + check("stepping writes the gold block, not the flat Gen 1 one", + model.opts.gold.battleBg, "black") + check("and the row reads BLACK", gearRow.value(), "BLACK") + gearRow.step(1) + check("stepping again returns to white", model.opts.gold.battleBg, "white") +end + +-- ---------------------------------------------------------- the battle end + +local bgMode = BattleState.bgMode +check("the Gold battle screen answers bgMode", type(bgMode), "function") +if type(bgMode) == "function" then + check("black when the option says so", + bgMode({ game = { options = { battleBg = "black" } } }), "black") + check("white when it says white", + bgMode({ game = { options = { battleBg = "white" } } }), "white") + check("white on an options table that predates the key", + bgMode({ game = { options = {} } }), "white") + check("white with no game at all", bgMode({}), "white") + -- Gen 1's third mode leaves the battle non-opaque so the map shows through; + -- Gold has no such path, so an options.lua carried over from Red must not + -- switch the Gold battle to a mode nothing paints. + check("Gen 1's WORLD degrades to white here", + bgMode({ game = { options = { battleBg = "world" } } }), "white") +end + +check("and mods are told bgMode is backed on this side", + Gen2Compat.memberStatus("src.battle.BattleState", "bgMode"), "backed") + +-- ------------------------------------------------------------- the bands +-- +-- Game2 paints the surround, not the battle screen: the widescreen layer +-- resolves to the TOP state, so a party menu or text box opened over the +-- battle would otherwise repaint the void white under itself. + +local G = love.graphics +local realRect, realSetColor = G.rectangle, G.setColor +local painter = Game2.paintBattleSurround +check("Game2 owns the surround repaint", type(painter), "function") + +local function paint(states, w, h) + if type(painter) ~= "function" then return {} end + local rects, pen = {}, { 1, 1, 1, 1 } + G.setColor = function(r, g, b, a) + pen = { r or 0, g or 0, b or 0, a or 1 } + end + G.rectangle = function(_, x, y, rw, rh) + rects[#rects + 1] = { x = x, y = y, w = rw, h = rh, pen = pen } + end + local ok, err = pcall(painter, { stack = { states = states } }, w, h) + G.rectangle, G.setColor = realRect, realSetColor + if not ok then + check("paintBattleSurround ran: " .. tostring(err), false, true) + end + return rects +end + +local blackBattle = { bgMode = function() return "black" end } +local whiteBattle = { bgMode = function() return "white" end } +local plainMenu = {} +local overworld = {} + +check("BLACK paints the four bands", #paint({ blackBattle }, 1024, 768), 4) +check("WHITE paints nothing at all", #paint({ whiteBattle }, 1024, 768), 0) +check("the overworld alone paints nothing", + #paint({ overworld, plainMenu }, 1024, 768), 0) + +-- A menu over the battle keeps the battle's void: the walk goes down the +-- stack past states that have no bgMode of their own. +check("a party menu over the battle still finds the battle's mode", + #paint({ overworld, blackBattle, plainMenu }, 1024, 768), 4) + +local function panelSafe(states, w, h, label) + local scale = Chrome.fitScale(w, h) + local ox, oy = Chrome.fitOrigin(w, h, scale) + local pw, ph = 160 * scale, 144 * scale + local rects = paint(states, w, h) + local covered, overlap, offColour = 0, 0, 0 + for _, r in ipairs(rects) do + covered = covered + r.w * r.h + if r.pen[1] ~= 0 or r.pen[2] ~= 0 or r.pen[3] ~= 0 then + offColour = offColour + 1 + end + local ix = math.max(0, math.min(r.x + r.w, ox + pw) - math.max(r.x, ox)) + local iy = math.max(0, math.min(r.y + r.h, oy + ph) - math.max(r.y, oy)) + overlap = overlap + ix * iy + end + -- The band maths has to tile the void exactly: any overlap with the panel is + -- a black frame eating the HUD or the message box, and any shortfall is a + -- strip of white left behind on one edge. + check(label .. ": no band touches the battle panel", overlap, 0) + check(label .. ": the void is covered edge to edge", covered, w * h - pw * ph) + check(label .. ": every band is black", offColour, 0) +end + +for _, size in ipairs({ { 1024, 768 }, { 1280, 840 }, { 1920, 1080 }, + { 800, 600 }, { 1366, 768 } }) do + panelSafe({ blackBattle }, size[1], size[2], + ("%dx%d"):format(size[1], size[2])) +end + +-- SCREEN POS lifts the panel off centre, which is the other way the four +-- bands can stop agreeing with where the panel actually landed. +for _, mode in ipairs({ "center", "upper", "top" }) do + ScreenPosition.setMode(mode) + panelSafe({ blackBattle, plainMenu }, 1280, 840, "screen pos " .. mode) +end +ScreenPosition.setMode("center") + +-- A window smaller than the GB screen has no void to paint; the bands must +-- not wrap around to the far edge on the negative origin. +check("nothing to paint under 160x144", #paint({ blackBattle }, 100, 90), 0) + +-- ----------------------------------------------------- the call site +-- +-- Constructing a Game2 needs love, so where the paint is called from is read +-- out of the source, the way the other Gen 2 suites check this file. It has +-- to run right after the widescreen layer has painted its white surround and +-- before the letterbox, or there is nothing to repaint over. +local handle = io.open("src/core/Game2.lua", "r") +local source = handle and handle:read("*a") +if handle then handle:close() end +check("Game2's source is readable", source ~= nil, true) +if source then + check("drawScene repaints straight after the widescreen layer", + source:find("wide:drawWidescreen%(w, h%)%s*self:paintBattleSurround%(w, h%)") + ~= nil, true) +end + +print(("gen2 battle options: %d checks, %d failures"):format(checks, failures)) +if failures > 0 then + error(("%d assertion(s) failed"):format(failures), 0) +end diff --git a/tests/gen2_battle_test.lua b/tests/gen2_battle_test.lua index ff60c311..3fb4c794 100644 --- a/tests/gen2_battle_test.lua +++ b/tests/gen2_battle_test.lua @@ -689,15 +689,16 @@ statusBattle.player.moves[1].pp = 20 statusBattle:takeTurn({ kind = "move", move = "THUNDER_WAVE" }) check("a second status fails", statusBattle.enemy.status, "paralyze") --- Sleep lands with a turn counter, and canAct spends it. Asserted on the move --- rather than a whole turn: with this deterministic random the roll is the --- minimum 1 turn, and the slower foe's own turn later in the same round then --- wakes it -- which is what the cart does as well. +-- Sleep lands with a turn counter, and canAct spends it. The counter opens at +-- 2, so the target cannot wake in the round it was slept +-- (engine/battle/effect_commands.asm:3591-3598, #1707). local sleepBattle = newBattle() sleepBattle.player.moves = { { id = "SPORE", pp = 15, maxPp = 15 } } sleepBattle:useMove(sleepBattle.player, sleepBattle.enemy, "SPORE") check("spore slept the target", sleepBattle.enemy.status, "sleep") -check("sleep has turns", (sleepBattle.enemy.statusTurns or 0) >= 1, true) +check("sleep never opens shorter than two turns", + (sleepBattle.enemy.statusTurns or 0) >= 2, true) +check("the lowest roll is exactly two", sleepBattle.enemy.statusTurns, 2) -- A sleeping mon cannot act, and the counter runs down to a wake-up. sleepBattle.enemy.statusTurns = 2 check("asleep cannot act", sleepBattle:canAct(sleepBattle.enemy), false) @@ -1386,12 +1387,25 @@ check("Ground is immune", Effects.sandstormHits({ "NORMAL", "GROUND" }), false) check("Steel is immune", Effects.sandstormHits({ "STEEL" }), false) check("Flying is not", Effects.sandstormHits({ "NORMAL", "FLYING" }), true) --- BattleCommand_Heal's .Weather ladder: a half normally, two thirds in sun, --- a quarter in rain or sandstorm. -check("Morning Sun heals half in clear weather", - Effects.weatherHealFraction(nil), 1 / 2) -checkNear("...two thirds in sun", Effects.weatherHealFraction("sun"), 2 / 3, 0.001) -check("...a quarter in rain", Effects.weatherHealFraction("rain"), 1 / 4) +-- BattleCommand_TimeBasedHealContinue's .Multipliers ladder, walked by the +-- time of day and the weather (engine/battle/effect_commands.asm:6388-6454). +local DAY_F = Effects.SUN_HEAL.EFFECT_SYNTHESIS +check("Synthesis heals half in the day in clear weather", + Effects.timeBasedHealFraction(nil, DAY_F, 1), 1 / 2) +check("...the lot in sun", Effects.timeBasedHealFraction("sun", DAY_F, 1), 1) +check("...a quarter in rain", + Effects.timeBasedHealFraction("rain", DAY_F, 1), 1 / 4) +check("...a quarter at night in clear weather", + Effects.timeBasedHealFraction(nil, DAY_F, 2), 1 / 4) +check("...a half at night in sun", + Effects.timeBasedHealFraction("sun", DAY_F, 2), 1 / 2) +check("...an eighth at night in a sandstorm", + Effects.timeBasedHealFraction("sandstorm", DAY_F, 2), 1 / 8) +check("Moonlight wants NITE instead", + Effects.timeBasedHealFraction(nil, Effects.SUN_HEAL.EFFECT_MOONLIGHT, 2), + 1 / 2) +check("a battle with no clock still heals half", + Effects.timeBasedHealFraction(nil, DAY_F, nil), 1 / 2) -- ProtectChance halves for every consecutive use and gives up after eight. check("first Protect always works", Effects.protectChance(0), 0xff) diff --git a/tests/gen2_billspc_dpad_test.lua b/tests/gen2_billspc_dpad_test.lua new file mode 100644 index 00000000..29976170 --- /dev/null +++ b/tests/gen2_billspc_dpad_test.lua @@ -0,0 +1,171 @@ +-- Bill's PC d-pad: only MOVE W/O MAIL walks the boxes (#1710). +-- +-- luajit tests/gen2_billspc_dpad_test.lua +-- +-- ROM-free. Withdraw_UpDown is the entire joypad handler for the WITHDRAW +-- list and the DEPOSIT list (engine/pokemon/bills_pc.asm:806-820) and reads +-- PAD_UP and PAD_DOWN and nothing else. BillsPC_PressLeft / PressRight +-- (:909-931) are reachable only through MoveMonWithoutMail_DPad and +-- MoveMonWithoutMail_DPad_2 (:822-869), whose one caller is +-- _MovePKMNWithoutMail (:480) -- so left and right belong to the MOVE screen +-- alone, both while it is choosing a mon and while the insert cursor is up. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 bills pc dpad") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local BoxMenu = require("src.ui.gen2.BoxMenu") +local Boxes = require("src.core.gen2.Boxes") + +local function mon(species) + return { species = species, nickname = species, name = species, + level = 5, hp = 20, maxHp = 20 } +end + +local function newInput() + local input = { pressed = {} } + function input:press(...) + for _, button in ipairs({ ... }) do self.pressed[button] = true end + end + function input:wasPressed(button) + if self.pressed[button] then + self.pressed[button] = nil + return true + end + return false + end + function input:isDown() return false end + return input +end + +local function newGame(save) + local input = newInput() + return { + input = input, + save = save, + data = { audio = {}, pokemon = {} }, + stack = { _items = {}, + push = function(self, s) self._items[#self._items + 1] = s end, + pop = function(self) return table.remove(self._items) end, + top = function(self) return self._items[#self._items] end, + }, + }, input +end + +-- Three party mons and two boxes with something in them, so every list under +-- test has rows and the last-healthy rule never gets in the way. +local function newSave() + local save = { party = { mon("CYNDAQUIL"), mon("TOTODILE"), mon("PIDGEY") }, + boxes = {}, boxNames = {}, currentBox = 3 } + Boxes.box(save, 3)[1] = mon("GEODUDE") + Boxes.box(save, 3)[2] = mon("ZUBAT") + Boxes.box(save, 4)[1] = mon("ONIX") + return save +end + +local function press(screen, input, ...) + for _, button in ipairs({ ... }) do + input:press(button) + screen:update(0) + end +end + +local function open(mode) + local save = newSave() + local game, input = newGame(save) + local menu = BoxMenu.new(game, { save = save, mode = mode, + onClose = function() end }) + return menu, input, save +end + +-- ---- the withdraw list ---------------------------------------------------- +do + local menu, input = open("withdraw") + eq(menu.boxIndex, 3, "the withdraw list opens on the current box") + eq(menu:title(), "BOX3", "and the header names it") + + press(menu, input, "left") + eq(menu.boxIndex, 3, "LEFT on the withdraw list does not change the box") + eq(menu:title(), "BOX3", "the header still reads BOX3") + eq(menu.index, 1, "and the cursor has not been reset by a box step") + + -- Two more LEFTs, so a screen that steps and then steps back cannot pass by + -- landing on 3 again. + press(menu, input, "left", "left") + eq(menu.boxIndex, 3, "and neither do two more") + eq(#menu:list(), 2, "the list is still BOX3's two mons") + + -- RIGHT from a fresh screen, for the same reason. + menu, input = open("withdraw") + press(menu, input, "right", "right") + eq(menu.boxIndex, 3, "RIGHT does not change the box either") + eq(menu:title(), "BOX3", "the header is unmoved") + + -- Withdraw_UpDown DOES read up and down, so the fix must not have taken the + -- whole d-pad away. + press(menu, input, "down") + eq(menu.index, 2, "DOWN still walks the list") + press(menu, input, "up") + eq(menu.index, 1, "and UP walks back") +end + +-- ---- the deposit list ----------------------------------------------------- +-- +-- _DepositPKMN's .HandleJoypad calls the same Withdraw_UpDown, and its list is +-- the party (wBillsPC_LoadedBox is zeroed at bills_pc.asm:17-18), so there is +-- no box for left and right to walk to in the first place. +do + local menu, input = open("deposit") + eq(menu:title(), "PARTY ", "the deposit list browses the party") + local before = menu.boxIndex + press(menu, input, "left", "right", "left") + eq(menu.boxIndex, before, "the deposit list ignores left and right") + eq(menu:title(), "PARTY ", "and stays on the party") + eq(#menu:list(), 3, "with all three party mons") + press(menu, input, "down") + eq(menu.index, 2, "up and down still work here too") +end + +-- ---- the move screen ------------------------------------------------------ +-- +-- The half that is supposed to have box stepping. Gating this on the wrong +-- mode string ("withdraw") would leave the reported bug in place and break +-- this instead, which is why it is asserted next to the other two. +do + local menu, input, save = open("move") + eq(menu.boxIndex, 3, "the move screen opens on the current box") + + press(menu, input, "right") + eq(menu.boxIndex, 4, "RIGHT walks to the next box") + eq(menu:title(), "BOX4", "and the header follows") + eq(#menu:list(), 1, "showing BOX4's one mon") + + press(menu, input, "left", "left", "left", "left") + eq(menu.boxIndex, 0, "four LEFTs from BOX4 reach the PARTY, box 0") + eq(menu:title(), "PARTY ", "BillsPC_BoxName's .party arm") + eq(#menu:list(), 3, "and the list is the party") + + press(menu, input, "left") + eq(menu.boxIndex, Boxes.NUM_BOXES, + "LEFT off box 0 wraps to the last box (BillsPC_PressLeft)") + press(menu, input, "right") + eq(menu.boxIndex, 0, "and RIGHT wraps back through it") + + -- The insert cursor is the separate .Joypad2 arm, and it walks boxes too: + -- choose the first party mon, MOVE, then drive the cursor to BOX1. + press(menu, input, "a", "a") + eq(menu.phase, "insert", "MOVE opens the insert cursor") + press(menu, input, "right") + eq(menu.boxIndex, 1, "RIGHT walks the insert cursor to BOX1") + eq(menu:title(), "BOX1", "and the header names the destination") + press(menu, input, "left") + eq(menu.boxIndex, 0, "LEFT walks it back to the party") + press(menu, input, "right", "a") + eq(#save.party, 2, "A there really does move the mon") + eq(Boxes.box(save, 1)[1].nickname, "CYNDAQUIL", "into the box it named") +end + +S.finish() diff --git a/tests/gen2_box_intake_test.lua b/tests/gen2_box_intake_test.lua new file mode 100644 index 00000000..37e9d5d9 --- /dev/null +++ b/tests/gen2_box_intake_test.lua @@ -0,0 +1,280 @@ +-- Everything that lands a mon in a box lands it healed (#1696). +-- +-- luajit tests/gen2_box_intake_test.lua +-- +-- ROM-free. box_struct ends at Level and has no Status, no HP and no MaxHP +-- at all -- those three belong to party_struct alone (macros/ram.asm:7-40) -- +-- so a boxed mon has nowhere to keep damage, and every screen that reads one +-- goes through CalcTempmonStats, whose .not_egg arm copies MON_MAXHP over +-- MON_HP and whose .zero_status arm blanks MON_STATUS before anything is +-- drawn (engine/pokemon/tempmon.asm:39-83). The four intakes are the catch +-- that overflows to the PC (`.SendToPC` / SendMonIntoBox, +-- engine/items/item_effects.asm:604, engine/pokemon/move_mon.asm:942-1065), +-- the PC's own deposit, MOVE W/O MAIL, and the bug contest's +-- full-party arm (engine/pokemon/caught_nickname.asm:72-90). +-- +-- The asymmetry at the bottom is real cart behaviour and is the near-miss to +-- watch: a catch that fits in the PARTY goes through TryAddMonToParty +-- (item_effects.asm:551-556) and KEEPS its damage, so a fix that heals every +-- capture is as wrong as one that heals none. + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 box intake") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Battle = require("src.battle.gen2.Battle") +local BattleState = require("src.ui.gen2.BattleState") +local BoxMenu = require("src.ui.gen2.BoxMenu") +local Boxes = require("src.core.gen2.Boxes") +local BugContest = require("src.core.gen2.BugContest") +local Input = require("src.core.Input") +local Mon = require("src.battle.gen2.Mon") + +-- A mon hurt and statused exactly the way a ball lands on one. +local function hurt(species) + return { species = species, nickname = species, name = species, level = 5, + hp = 1, maxHp = 20, status = "sleep", statusTurns = 3, + moves = { { id = "TACKLE", pp = 2, maxPp = 35 } } } +end + +local function healthy(species) + return { species = species, nickname = species, name = species, level = 5, + hp = 20, maxHp = 20, + moves = { { id = "TACKLE", pp = 35, maxPp = 35 } } } +end + +local function newSave(party) + return { party = party or {}, boxes = {}, boxNames = {}, currentBox = 1 } +end + +-- ---- Boxes.enterBox, the shared seam -------------------------------------- +do + local mon = hurt("PIDGEY") + Boxes.enterBox(mon) + eq(mon.hp, 20, "a mon entering a box is at full HP") + eq(mon.status, nil, "with no status byte to carry it") + eq(mon.statusTurns, nil, "and no sleep counter either") + eq(mon.moves[1].pp, 35, "RestorePPOfDepositedPokemon refilled its PP") + + -- .not_egg is skipped for an EGG: CalcTempmonStats writes 0 over MON_HP + -- instead, which is what keeps a stored egg from reading as hatchable. + local egg = hurt("TOGEPI") + egg.isEgg = true + Boxes.enterBox(egg) + eq(egg.hp, 0, "an EGG stays at 0 HP") + eq(egg.status, nil, "and still loses the status byte") + + -- A mon with no maxHp recorded must not come out with hp nil, which would + -- read as fainted everywhere downstream. + local odd = { species = "MISSINGNO", hp = 4 } + Boxes.enterBox(odd) + eq(odd.hp, 4, "a mon with no maxHp keeps the HP it had") + eq(Boxes.enterBox(nil), nil, "and nil is handed straight back") +end + +-- ---- the PC's own deposit ------------------------------------------------- +-- +-- Read while the mon is STILL IN THE BOX: this is what the PC's STATS screen +-- shows, and healing only on the way back out looks right in the party while +-- the storage screen still reports 1 HP and SLP. +do + local save = newSave({ healthy("CYNDAQUIL"), hurt("PIDGEY"), + healthy("GEODUDE") }) + local ok = Boxes.deposit(save, 2, 1) + check(ok, "the hurt mon deposits") + local boxed = Boxes.box(save, 1)[1] + eq(boxed.species, "PIDGEY", "and it is the one in the box") + eq(boxed.hp, 20, "sitting there at full HP") + eq(boxed.status, nil, "with the status gone") + eq(boxed.moves[1].pp, 35, "and its PP back") + + -- ...and the withdraw arm still hands back the same whole mon. + local took + ok, took = Boxes.withdraw(save, 1, 1) + check(ok, "withdrawing it works") + eq(took.hp, 20, "and it is still whole on the way out") +end + +-- ---- MOVE W/O MAIL ---------------------------------------------- +do + local function newInput() + local input = { pressed = {} } + function input:press(...) + for _, button in ipairs({ ... }) do self.pressed[button] = true end + end + function input:wasPressed(button) + if self.pressed[button] then + self.pressed[button] = nil + return true + end + return false + end + function input:isDown() return false end + return input + end + + local function press(screen, input, ...) + for _, button in ipairs({ ... }) do + input:press(button) + screen:update(0) + end + end + + local function openMove(save) + local input = newInput() + local game = { + input = input, save = save, data = { audio = {}, pokemon = {} }, + stack = { _items = {}, + push = function(self, s) self._items[#self._items + 1] = s end, + pop = function(self) return table.remove(self._items) end, + top = function(self) return self._items[#self._items] end, + }, + } + return BoxMenu.new(game, { save = save, mode = "move", + onClose = function() end }), input + end + + -- party -> box: .CopyToBox writes a box_struct, so the damage cannot follow. + local save = newSave({ hurt("PIDGEY"), healthy("CYNDAQUIL"), + healthy("GEODUDE") }) + local menu, input = openMove(save) + press(menu, input, "left") + eq(menu.boxIndex, 0, "the move screen walks left to the PARTY") + press(menu, input, "a", "a") + eq(menu.phase, "insert", "MOVE opens the insert cursor") + press(menu, input, "right", "a") + eq(#save.party, 2, "the hurt mon left the party") + local boxed = Boxes.box(save, 1)[1] + eq(boxed and boxed.nickname, "PIDGEY", "and landed in BOX1") + eq(boxed and boxed.hp, 20, "at full HP") + eq(boxed and boxed.status, nil, "with no status") + eq(boxed and boxed.moves[1].pp, 35, "and full PP") + + -- party -> party is the same screen's reorder, and party_struct HAS the + -- three fields, so this arm must leave the damage exactly where it was. + save = newSave({ hurt("PIDGEY"), healthy("CYNDAQUIL"), healthy("GEODUDE") }) + menu, input = openMove(save) + press(menu, input, "left") + eq(menu.boxIndex, 0, "back on the party") + press(menu, input, "a", "a", "down", "down", "a") + eq(#save.party, 3, "the party still has three") + local moved + for _, mon in ipairs(save.party) do + if mon.nickname == "PIDGEY" then moved = mon end + end + eq(moved and moved.hp, 1, "a party-to-party move keeps the damage") + eq(moved and moved.status, "sleep", "and keeps the status") +end + +-- ---- the bug contest's full-party arm ------------------------------------- +do + local save = newSave({ healthy("A"), healthy("B"), healthy("C"), + healthy("D"), healthy("E"), healthy("F") }) + save.currentBox = 2 + save.playerName = "GOLD" + BugContest.start(save) + BugContest.switchCaught(save, hurt("SCYTHER")) + local result = BugContest.collectCaughtMon(save, 6) + eq(result, BugContest.BOXED_MON, "a full party sends the contest catch to a box") + local boxed = Boxes.box(save, 2)[1] + eq(boxed and boxed.nickname, "SCYTHER", "it is in the current box") + eq(boxed and boxed.hp, 20, "at full HP") + eq(boxed and boxed.status, nil, "with no status") + eq(boxed and boxed.moves[1].pp, 35, "and its PP restored") +end + +-- ---- the catch that overflows to the PC ----------------------------------- +-- +-- The whole chain, through the real BattleState: a ball that lands while the +-- party is full runs `.SendToPC`, and what the PC's STATS screen then reads +-- is the box_struct SendMonIntoBox wrote. +do + local TYPES = { NORMAL = { id = "NORMAL", index = 0, + category = "physical" } } + local MOVES = { TACKLE = { id = "TACKLE", name = "TACKLE", power = 35, + type = "NORMAL", accuracy = 95, pp = 35, effect = "EFFECT_NORMAL_HIT" } } + local POKEMON = { + growthRates = { GROWTH_MEDIUM_FAST = { numerator = 1, denominator = 1, + squared = 0, linear = 0, constant = 0 } }, + CYNDAQUIL = { + id = "CYNDAQUIL", index = 155, name = "CYNDAQUIL", + baseStats = { hp = 39, attack = 52, defense = 43, speed = 65, + specialAttack = 60, specialDefense = 50 }, + types = { "NORMAL", "NORMAL" }, catchRate = 45, baseExp = 65, + growthRate = "GROWTH_MEDIUM_FAST", genderRatio = 31, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, + PIDGEY = { + id = "PIDGEY", index = 16, name = "PIDGEY", + baseStats = { hp = 40, attack = 45, defense = 40, speed = 56, + specialAttack = 35, specialDefense = 35 }, + types = { "NORMAL", "NORMAL" }, catchRate = 255, baseExp = 55, + growthRate = "GROWTH_MEDIUM_FAST", genderRatio = 127, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, + } + local DATA = { + pokemon = POKEMON, moves = MOVES, + type_chart = { types = TYPES, matchups = {} }, + items = { POKE_BALL = { id = "POKE_BALL", name = "POKe BALL", + pocket = "BALL" } }, + } + local perfect = { attack = 15, defense = 15, speed = 15, special = 15 } + perfect.hp = Mon.hpDV(perfect) + + -- partySize 6 fills the party so the catch overflows; 5 leaves it room. + local function catch(partySize) + Input:init() + local party = {} + for i = 1, partySize do + local mon = Mon.new(DATA, "CYNDAQUIL", 10, { dvs = perfect }) + mon.nickname = "MON" .. i + mon.moves = { { id = "TACKLE", pp = 35, maxPp = 35 } } + party[i] = mon + end + local wild = Mon.new(DATA, "PIDGEY", 5, { dvs = perfect }) + wild.moves = { { id = "TACKLE", pp = 4, maxPp = 35 } } + -- one HP and asleep: what a ball usually lands on + wild.hp = 1 + wild.status = "sleep" + wild.statusTurns = 3 + local save = { party = party, inventory = { POKE_BALL = 1 }, + currentBox = 3, boxes = {}, boxNames = {} } + local game = { + data = DATA, save = save, input = Input, options = {}, + stack = { push = function() end, pop = function() end, + top = function() return nil end }, + } + -- random 0: the catch roll always lands. + local battle = Battle.new({ data = DATA, party = party, wild = wild, + save = save, random = function() return 0 end }) + local screen = BattleState.new(game, { battle = battle, save = save }) + screen:useItem("POKE_BALL") + return battle, save, wild + end + + local battle, save, wild = catch(6) + eq(battle.outcome, "caught", "the ball lands on a full party") + eq(#save.party, 6, "the party did not grow") + local boxed = Boxes.box(save, 3)[1] + eq(boxed, wild, "SendMonIntoBox put the catch in slot 1 of the current box") + eq(boxed and boxed.hp, boxed and boxed.maxHp, + "and the PC holds it at full HP") + eq(boxed and boxed.status, nil, "with no status on the STATS screen") + eq(boxed and boxed.statusTurns, nil, "and no sleep counter behind it") + eq(boxed and boxed.moves[1].pp, 35, "PP refilled with the rest") + + -- The other half of the cart's asymmetry. + battle, save, wild = catch(5) + eq(battle.outcome, "caught", "the ball lands with room in the party") + eq(save.party[6], wild, "and TryAddMonToParty keeps it in the party") + eq(wild.hp, 1, "at the 1 HP it was caught on") + eq(wild.status, "sleep", "still asleep") + eq(wild.moves[1].pp, 4, "and with the PP it had left") + eq(Boxes.count(save, 3), 0, "nothing went to the PC") +end + +S.finish() diff --git a/tests/gen2_contest_test.lua b/tests/gen2_contest_test.lua index 4d01b880..5d253ced 100644 --- a/tests/gen2_contest_test.lua +++ b/tests/gen2_contest_test.lua @@ -1108,7 +1108,7 @@ do "function World:bugContestBattleOver", "self:bugContestBattleOver()", "BugContestResultsWarpScript", - "BugContest.ENGINE_BUG_CONTEST_TIMER", + "FieldMoves.BUG_CONTEST_FLAG", -- Kurt's menu and the item pair the ladder needs. "scriptMenu = function(header, onChoose)", "itemIndex = function(id)", diff --git a/tests/gen2_cycling_road_test.lua b/tests/gen2_cycling_road_test.lua new file mode 100644 index 00000000..ef159cf7 --- /dev/null +++ b/tests/gen2_cycling_road_test.lua @@ -0,0 +1,279 @@ +-- The Cycling Road: the START poll the forced roll used to swallow (#1718) and +-- the ALWAYS_ON_BIKE flag SURF never saw (#1749). +-- +-- luajit tests/gen2_cycling_road_test.lua +-- +-- Route17AlwaysOnBikeCallback sets ENGINE_ALWAYS_ON_BIKE and ENGINE_DOWNHILL on +-- MAPCALLBACK_NEWMAP (maps/Route17.asm:13-16), and DOWNHILL is what makes +-- .GetDPad read an empty pad as DOWN: the player is stepping on every single +-- frame of that road. +-- +-- #1718: the port gated START on "not moving", which on Route 17 is never -- +-- stepBody lands the step and queues the next one inside the SAME tick. The +-- cart refuses only on PLAYERMOVEMENT_CONTINUE; a QUEUED step answers +-- PLAYERMOVEMENT_FINISH (player_movement.asm:459-461), whose arm is `xor a / +-- ld c, a / ret` (events.asm:761-779), so CheckMenuOW still runs there +-- (events.asm:485-498). That landing frame comes round once in eight, so the +-- other half of the fix is Game2's joypad latch (events.asm:193-199, :215-231); +-- it needs a real Input and is driven by +-- tests/drivers/gold_cycling_road_bug1718_1749_test.lua. +-- +-- #1749: both surf entry points already refused on ctx.alwaysOnBike +-- (engine/events/overworld.asm:350-352, :513-515), but World:fieldContext never +-- set the field, so neither refusal was reachable. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 cycling road") +local check, eq = S.check, S.eq + +local Bike = require("src.world.gen2.Bike") +local FieldMoves = require("src.world.gen2.FieldMoves") +local Permissions = require("src.world.gen2.Permissions") +local Player = require("src.world.gen2.Player") +local World = require("src.world.gen2.World") + +-- constants/collision_constants.asm +local COLL_LAND, COLL_WATER = 0x00, 0x29 + +check(Permissions.isLand(COLL_LAND), "COLL_FLOOR $00 is a LAND_TILE") +check(Permissions.isWater(COLL_WATER), "COLL_WATER $29 is a WATER_TILE") + +-- ---- the gate: World:acceptsMenuInput, OWPlayerInput's preamble (#1718) ---- +-- +-- The shipped methods, over a world carrying only the fields they read. +local function gate(w) + w.busy = World.busy + w.playerCollision = World.playerCollision + return World.acceptsMenuInput(w) +end + +eq(gate({ player = { moving = false } }), true, + "standing still: PLAYERMOVEMENT_FINISH, so CheckMenuOW runs") +eq(gate({ player = { moving = true }, stepFinished = false }), + false, "mid-step: PLAYERMOVEMENT_CONTINUE, and OWPlayerInput returns") +eq(gate({ player = { moving = true }, stepFinished = true }), + true, "the frame the step lands reads it again, whatever was queued on top") + +-- stepFinished opens ONE arm and must not reach past it. +eq(gate({ player = { moving = true }, stepFinished = true, battleActive = true }), + false, "a battle still refuses on the landing frame") +eq(gate({ player = { moving = true }, stepFinished = true, textbox = {} }), + false, "an open text box still refuses on the landing frame") +eq(gate({ player = { moving = true }, stepFinished = true, mapSetup = {} }), + false, "and so does a map setup script") +eq(gate({ player = { moving = true }, stepFinished = true, fieldMove = {} }), + false, "and a field move's tail") +eq(gate({ player = { moving = false }, + vm = { running = function() return true end } }), + false, "wScriptRunning refuses even standing still (events.asm:238-243)") + +-- CheckStandingOnIce's carry, the arm that sits below the movement one. +do + local COLL_ICE = 0x23 + check(Permissions.isIce(COLL_ICE), "COLL_ICE $23") + local iced = { + player = { moving = false, cellX = 1, cellY = 1 }, + stepFinished = true, + turningDirection = "down", + map = { cellCollision = function() return COLL_ICE end }, + } + eq(gate(iced), false, "a latched slide on ice refuses") + iced.turningDirection = nil + eq(gate(iced), true, "and lets go once the latch clears") +end + +-- ---- .GetDPad and .DoStep on a DOWNHILL map -------------------------------- + +eq(Bike.forcedDirection(nil, true), "down", + "no direction held on the Cycling Road is a step DOWN") +eq(Bike.forcedDirection("up", true), "up", "a held direction still wins") +eq(Bike.forcedDirection(nil, false), nil, "and off the road, nothing") +eq(Bike.stepFrames(FieldMoves.PLAYER_BIKE, "down", true, Player.STEP_FRAMES), 8, + "the roll is a STEP_BIKE cell: half a walk") +eq(Bike.stepFrames(FieldMoves.PLAYER_BIKE, "left", true, Player.STEP_FRAMES), 16, + "and every other direction gets the walking duration back") + +-- ---- the roll: 24 ticks of Route 17, #1718's premise ----------------------- +-- +-- One iteration of Game2's fixed step over a real Player. + +local openRoad = { + inBounds = function() return true end, + isWalkable = function() return true end, +} + +local function tick(w) + -- Game2's fixed step asks first, with last tick's stepFinished still up. + local accepts = gate(w) + -- What the port asked before the fix, counted off the same run. + local standing = not w.player.moving + local p = w.player + w.stepFinished = false + w.stepFinished = p:update() + if not p.moving then + local dir = Bike.forcedDirection(nil, true) + p.stepFrames = Bike.stepFrames( + FieldMoves.PLAYER_BIKE, dir, true, Player.STEP_FRAMES) + p:tryMove(dir, openRoad, nil) + end + return accepts, standing +end + +do + local w = { player = Player.new(9, 36, "down") } + local polled, idle, gaps, run = {}, 0, 0, 0 + for n = 1, 24 do + local accepts, standing = tick(w) + if accepts then + polled[#polled + 1] = n + if run > gaps then gaps = run end + run = 0 + else + run = run + 1 + end + if standing then idle = idle + 1 end + end + + -- The direct proof of the premise. + eq(idle, 1, "the forced roll leaves the player standing on tick 1 and never again") + eq(w.player.moving, true, "and it is still rolling 24 ticks later") + eq(w.player.cellY > 36, true, "having actually travelled down the road") + + eq(#polled, 3, "the landing frame comes round three times in 24 ticks") + eq(table.concat(polled, ","), "1,10,18", + "tick 1, then one poll per 8-frame bike step") + eq(gaps, 8, "eight refused ticks between polls -- one press in eight lands") +end + +-- ---- ALWAYS_ON_BIKE reaches the field-move context (#1749) ----------------- +-- +-- The bug is the wiring, so the flag comes through the shipped +-- World:alwaysOnBike -> World:engineFlag pair off a real save table. + +local function surfMon() + return { species = "LAPRAS", moves = { "SURF" } } +end + +-- A road cell facing water: with the flag clear this ctx surfs. +local function fieldSelf(onBike, badge) + local coll = {} + local map = { + width = 8, height = 8, + def = { blocks = {}, environment = "ROUTE", tileset = "TILESET_KANTO" }, + cellCollision = function(_, cx, cy) return coll[cy * 16 + cx] or COLL_LAND end, + } + for i = 1, 64 do map.def.blocks[i] = 1 end + -- water in the cell the player faces, land under their feet + coll[36 * 16 + 10] = COLL_WATER + local save = { + party = { surfMon() }, + player = { badges = { FOG = badge ~= false or nil } }, + engineFlags = { [Bike.ENGINE_ALWAYS_ON_BIKE] = onBike or nil }, + } + return { + player = Player.new(9, 36, "right"), + map = map, + playerState = FieldMoves.PLAYER_BIKE, + game = { save = save }, + engineFlags = World.engineFlags, + engineFlag = World.engineFlag, + alwaysOnBike = World.alwaysOnBike, + blockIndexAt = World.blockIndexAt, + escapeRopeTarget = function() return nil end, + facingObject = function() return nil end, + hour = function() return 12 end, + } +end + +eq(World.fieldContext(fieldSelf(true)).alwaysOnBike, true, + "fieldContext carries ALWAYS_ON_BIKE onto the road") +eq(World.fieldContext(fieldSelf(false)).alwaysOnBike, false, + "and reports it clear everywhere else") + +do + -- The ctx really is surfable, or the refusals below pass for the wrong reason. + local ctx = World.fieldContext(fieldSelf(false), surfMon()) + eq(ctx.facing, "right", "facing the water") + check(Permissions.isWater(ctx.facingColl), "and the faced cell is water") + local menu = FieldMoves.surfFromMenu(ctx) + eq(menu.ok, true, "flag clear: the PACK's SURF goes through") + local ow = FieldMoves.trySurfOW(ctx) + eq(ow.ok, true, "flag clear: the A press offers to SURF") + eq(ow.ask, FieldMoves.TEXT.ASK_SURF, "with the usual prompt") +end + +do + local ctx = World.fieldContext(fieldSelf(true), surfMon()) + -- .FailSurf: MenuTextboxBackup on CantSurfText, so the menu refusal TALKS. + local menu = FieldMoves.surfFromMenu(ctx) + eq(menu.ok, false, "on the road the menu refuses") + eq(menu.text, FieldMoves.TEXT.CANT_SURF, "with CantSurfText") + -- TrySurfOW's arm is `.quit`: xor a, no script and no text at all. + local ow = FieldMoves.trySurfOW(ctx) + eq(ow.ok, false, "and the A press refuses") + eq(ow.took, nil, "silently -- .quit queues no script") + eq(ow.text, nil, "and prints nothing") +end + +do + -- CheckBadge runs ABOVE the ALWAYS_ON_BIKE test. + local ctx = World.fieldContext(fieldSelf(true, false), surfMon()) + local menu = FieldMoves.surfFromMenu(ctx) + eq(menu.text, FieldMoves.TEXT.BADGE_REQUIRED, + "no FOGBADGE still outranks the road (engine/events/overworld.asm:347-352)") +end + +-- ---- the real Route 17, when a cache is around ----------------------------- +-- +-- Pins the coordinates the driver walks to, so a map edit fails here instead +-- of parking a human at a wall. + +local cache = os.getenv("GOLD_CACHE") +if not cache then + cache = (os.getenv("HOME") or "") + .. "/Library/Application Support/LOVE/gold-dev/gold" +end +local mapsPath = cache .. "/data/generated/maps.lua" +local mf = io.open(mapsPath, "r") +if not mf then + check(true, "gold cache absent : fixture checks only (SKIP cache facts)") + S.finish() + return +end +mf:close() + +local Map = require("src.world.gen2.Map") +local maps = assert(loadfile(mapsPath))() +local tilesets = assert(loadfile(cache .. "/data/generated/tilesets.lua"))() +local scripts = assert(loadfile(cache .. "/data/generated/scripts.lua"))() + +do + local def = maps.ROUTE_17 + check(def ~= nil, "the cache carries ROUTE_17") + local ops = {} + for _, cb in ipairs(def.callbacks or {}) do + if cb.callback == "MAPCALLBACK_NEWMAP" then + for _, cmd in ipairs(scripts[cb.scriptKey] or {}) do + ops[#ops + 1] = cmd.op + end + end + end + eq(table.concat(ops, ","), "setflag,setflag,endcallback", + "Route17AlwaysOnBikeCallback is the two unconditional setflags") + + local map = Map.new(def, tilesets[def.tileset]) + -- The lane the driver rides: x=9 is road, x=10 is the water beside it, and + -- the four bikers stand at (4,17) (16,32) (3,53) (6,80), well clear of it. + for cy = 36, 48 do + check(Permissions.isLand(map:cellCollision(9, cy)), + "ROUTE_17 (9," .. cy .. ") is road") + check(Permissions.isWater(map:cellCollision(10, cy)), + "ROUTE_17 (10," .. cy .. ") is water") + end + for _, obj in ipairs(def.objects or {}) do + check(not (obj.x == 9 and obj.y >= 34 and obj.y <= 50), + "no object parked in the driver's lane") + end +end + +S.finish() diff --git a/tests/gen2_dex_gift_test.lua b/tests/gen2_dex_gift_test.lua new file mode 100644 index 00000000..73c4eca9 --- /dev/null +++ b/tests/gen2_dex_gift_test.lua @@ -0,0 +1,152 @@ +-- A script-gifted mon registers in the #DEX. GiveShuckle +-- (engine/events/shuckle.asm:14) hands its mon to TryAddMonToParty, whose +-- PARTYMON arm falls into .registerpokedex / SetSeenAndCaughtMon +-- (engine/pokemon/move_mon.asm:179-197), so Mania's SHUCKIE arrives already +-- ticked off. #1719. ROM-free: +-- luajit tests/gen2_dex_gift_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 dex gift") +local check, eq, same = S.check, S.eq, S.same + +love = require("tests.love_stub") + +local Vm = require("src.script.gen2.Vm") +local Events = require("src.world.gen2.Events") +local Specials = require("src.script.gen2.Specials") +local Breeding = require("src.core.gen2.Breeding") +local Save = require("src.core.gen2.Save") + +-- constants/pokemon_constants.asm: SHUCKLE is 213. +local SHUCKLE_INDEX = 213 + +-- Just enough of data.pokemon / data.moves for Mon.new to build a SHUCKLE, +-- plus one other species so the "index, not name" mistake has something to +-- collide with. +local function fixture() + return { + pokemon = { + SHUCKLE = { name = "SHUCKLE", index = SHUCKLE_INDEX, + growthRate = "MEDIUM_FAST", + types = { "BUG", "ROCK" }, + baseStats = { hp = 20, attack = 10, defense = 230, speed = 5, + specialAttack = 10, specialDefense = 230 }, + levelMoves = { { level = 1, move = "CONSTRICT" } } }, + TOTODILE = { name = "TOTODILE", index = 158, + growthRate = "MEDIUM_SLOW", + types = { "WATER", "WATER" }, + baseStats = { hp = 50, attack = 65, defense = 64, speed = 43, + specialAttack = 44, specialDefense = 48 }, + levelMoves = { { level = 1, move = "SCRATCH" } } }, + }, + moves = { + CONSTRICT = { name = "CONSTRICT", pp = 35 }, + SCRATCH = { name = "SCRATCH", pp = 35 }, + }, + items = {}, + } +end + +-- The three hooks GiveShuckle reads out of World:specialHooks: the party it +-- appends to, the save it flags the dex on, and the data Mon.new builds from. +local function giftVm(record) + record.party = record.party or {} + return Vm.new({}, {}, Events.new(), { specials = { + party = function() return record.party end, + save = function() return record end, + data = fixture, + } }) +end + +-- ---- the gift itself ------------------------------------------------------ +local giftedDex +do + local record = { party = {} } + Specials.HANDLERS.GiveShuckle(giftVm(record)) + + eq(#record.party, 1, "Mania's SHUCKIE joins the party") + local mon = record.party[1] + eq(mon.nickname, "SHUCKIE", "under its own nickname") + + local dex = record.pokedex or {} + eq((dex.seen or {})[mon.species], true, "and it is SEEN in the #DEX") + eq((dex.caught or {})[mon.species], true, + "and CAUGHT: SetSeenAndCaughtMon sets both flags, not just the one") + eq((dex.caught or {})[SHUCKLE_INDEX], nil, + "keyed by the species name PokedexMenu:rebuild looks up, not by dex number") + local summary = Save.summary(record) + eq(summary and summary.caught, 1, + "so the CONTINUE panel's own count agrees (Save.lua:910-913)") + giftedDex = record.pokedex +end + +-- The handler must leave wScriptVar TRUE, because ManiasHouse.asm branches on +-- it to pick the "took it" text over the "your party is full" one. +do + local record = { party = {} } + local vm = giftVm(record) + Specials.HANDLERS.GiveShuckle(vm) + eq(vm.scriptVar, 1, "GiveShuckle answers TRUE when it hands one over") +end + +-- ---- a dex that already has entries in it --------------------------------- +do + local record = { party = {}, + pokedex = { seen = { TOTODILE = true }, caught = { TOTODILE = true } } } + Specials.HANDLERS.GiveShuckle(giftVm(record)) + eq(record.pokedex.caught.TOTODILE, true, "the starter's entry survives") + eq(record.pokedex.caught.SHUCKLE, true, "and SHUCKIE joins it") + eq(Save.summary(record).caught, 2, "two owned species, counted once each") +end + +-- The shape a loaded save actually has, rather than a hand-built one: +-- Save.normalize seeds pokedex.seen/caught, so the handler is writing into +-- tables that already exist. +do + local record = Save.normalize({ party = {} }) or { party = {} } + record.party = record.party or {} + Specials.HANDLERS.GiveShuckle(giftVm(record)) + eq(record.pokedex.caught.SHUCKLE, true, "a normalized save takes the flag too") +end + +-- ---- the arms that must NOT flag the dex ---------------------------------- +-- .full returns before _AddPartyMon runs, so nothing reaches .registerpokedex +-- and the player who never received the mon has no entry for it. +do + local full = {} + for i = 1, Breeding.PARTY_SIZE do full[i] = { species = "TOTODILE", level = i } end + local record = { party = full } + local vm = giftVm(record) + Specials.HANDLERS.GiveShuckle(vm) + eq(vm.scriptVar, 0, "a full party refuses the gift") + eq(#record.party, Breeding.PARTY_SIZE, "and nothing is appended") + eq(record.pokedex, nil, "a refused gift leaves no #DEX entry behind") +end + +-- Mon.new failing (no such species in the cache) is the other early out. +do + local record = { party = {} } + local vm = Vm.new({}, {}, Events.new(), { specials = { + party = function() return record.party end, + save = function() return record end, + data = function() return { pokemon = {}, moves = {} } end, + } }) + Specials.HANDLERS.GiveShuckle(vm) + eq(vm.scriptVar, 0, "a mon that cannot be built is refused") + eq(record.pokedex, nil, "and still flags nothing") +end + +-- ---- parity with the engine's other SetSeenAndCaughtMon ports ------------- +-- Breeding.markPokedex is the shared port of the same routine the hatch, the +-- NPC trade and the givepoke opcode all run. A gift that flags the dex its +-- own way instead of matching that state is drift, and drift is what leaves +-- one screen showing the entry and another not. +do + local sibling = { party = {} } + check(Breeding.markPokedex(sibling, "SHUCKLE"), + "the shared SetSeenAndCaughtMon port still takes a species") + same(giftedDex, sibling.pokedex, + "GiveShuckle leaves the identical #DEX state the shared port does") +end + +S.finish() diff --git a/tests/gen2_field_anim_test.lua b/tests/gen2_field_anim_test.lua index 3513c46b..50b77d6e 100644 --- a/tests/gen2_field_anim_test.lua +++ b/tests/gen2_field_anim_test.lua @@ -71,9 +71,14 @@ check("$30 jump_step DOWN is a jump", Movement.decodeByte(0x30).kind, "jump") check("and it keeps its facing", Movement.decodeByte(0x33).dir, "right") check("$2c slow_jump_step is one too", Movement.decodeByte(0x2c).kind, "jump") check("$34 fast_jump_step as well", Movement.decodeByte(0x34).kind, "jump") --- The neighbouring families are still plain steps / turns. -check("$28 turn_waterfall is untouched", - Movement.decodeByte(0x28).kind, "turn") +-- $20 turn_away / $24 turn_in / $28 turn_waterfall all `jp TurningStep` +-- (engine/overworld/movement.asm:483-513), which is InitStep with +-- OBJECT_ACTION_SPIN (:693-715): one cell crossed, spinning, not a facing +-- change. Script_ForcedMovement's bounce out of a whirlpool is that step. +check("$28 turn_waterfall is a spinning step", + Movement.decodeByte(0x28).kind, "step") +check("$24 turn_in is one too", Movement.decodeByte(0x24).kind, "step") +check("and it carries the spin", Movement.decodeByte(0x24).spin, true) check("$10 big_step is untouched", Movement.decodeByte(0x10).kind, "step") -- ------------------------------------------ sliding, fixed facing, tree shake diff --git a/tests/gen2_ledge_hop_test.lua b/tests/gen2_ledge_hop_test.lua new file mode 100644 index 00000000..408b3b17 --- /dev/null +++ b/tests/gen2_ledge_hop_test.lua @@ -0,0 +1,270 @@ +-- A ledge hop advances every logic frame, the way every other step does. +-- +-- luajit tests/gen2_ledge_hop_test.lua +-- +-- A hop is the engine's only two-cell move (World:tryLedgeJump, STEP_LEDGE). +-- On the cart it is jump_step, i.e. STEP_WALK (pokegold/engine/overworld/ +-- movement.asm:595-597), so GetStepVector hands StepFunction_PlayerJump the +-- `db 0, 2, 8, 2` row (map_objects.asm:365-381) and .stepjump / .stepland run +-- it as two 8-frame beats: 16 frames, 2px EVERY frame, and UpdateJumpPosition +-- (:1796-1817) adds the speed to OBJECT_JUMP_HEIGHT and indexes its 16-entry +-- arc at height/2, one entry per frame. +-- +-- We render Gen 2 at twice that temporal resolution (Player.STEP_FRAMES = 16 +-- for one cell), so the hop is 32 frames and has to move 1px and half an arc +-- entry on every one of them. It used to compute the sub-cell offset per CELL +-- and then scale it by the cell delta, so half the hop's frames moved nothing +-- and the other half jumped 2px -- and since the camera follows px/py, the +-- whole map scrolled at 30Hz. The arc had the matching quantum with the +-- opposite sign, which dragged the sprite back UP the screen five times. #1713 +-- +-- Self-contained: no cache, no love. tests/drivers/gold_ledge_hop_bug1713_ +-- test.lua is the half a person watches. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 ledge hop") +local check, eq = S.check, S.eq + +local Player = require("src.world.gen2.Player") +local Permissions = require("src.world.gen2.Permissions") +local World = require("src.world.gen2.World") + +local DELTA = { up = { 0, -1 }, down = { 0, 1 }, + left = { -1, 0 }, right = { 1, 0 } } + +-- ---- one move, frame by frame ---------------------------------------------- +-- +-- What the renderer reads each frame: the position the camera follows, and the +-- OBJECT_SPRITE_Y_OFFSET added on top of it. Row 1 is the standing frame +-- before the move starts, so row i+1 is frame i. +local function playMove(dir, opts) + opts = opts or {} + local p = Player.new(5, 5, dir) + local d = DELTA[dir] + local cells = opts.jump and 2 or 1 + p.targetX, p.targetY = p.cellX + d[1] * cells, p.cellY + d[2] * cells + p.moving = true + p.progress = 0 + p.jumping = opts.jump or nil + p.stepFrames = opts.stepFrames + or (opts.jump and Player.STEP_FRAMES * 2 or Player.STEP_FRAMES) + local rows = { { px = p.px, py = p.py, off = 0 } } + local frames = 0 + while p.moving and frames < 200 do + p:update() + frames = frames + 1 + rows[#rows + 1] = { px = p.px, py = p.py, off = p.spriteYOffset or 0 } + end + return p, rows, frames +end + +-- Per-frame change in one recorded column. +local function steps(rows, key) + local out = {} + for i = 2, #rows do out[i - 1] = rows[i][key] - rows[i - 1][key] end + return out +end + +local function countIf(list, fn) + local n = 0 + for _, v in ipairs(list) do if fn(v) then n = n + 1 end end + return n +end + +-- ---- the control: an ordinary one-cell walk -------------------------------- +-- +-- The hop's fix must not have been bought by moving this. +do + local p, rows, frames = playMove("down") + eq(frames, Player.STEP_FRAMES, "a walk is 16 logic frames") + local dy = steps(rows, "py") + eq(countIf(dy, function(v) return v ~= 1 end), 0, + "and every one of them moves the player exactly one pixel down") + eq(countIf(steps(rows, "px"), function(v) return v ~= 0 end), 0, + "with no sideways drift") + eq(p.cellY, 6, "it lands one cell on") + eq(p.py, 6 * 16, "on the pixel the cell says") + + -- .DoStep's STEP_BIKE arm: the same one cell in half the frames, so the + -- per-frame advance doubles. This is what a span applied to the wrong + -- denominator breaks first. + local bike, bikeRows, bikeFrames = + playMove("right", { stepFrames = Player.STEP_FRAMES / 2 }) + eq(bikeFrames, 8, "a bike step is 8 logic frames") + eq(countIf(steps(bikeRows, "px"), function(v) return v ~= 2 end), 0, + "each moving two pixels, so a bike still covers one cell") + eq(bike.cellX, 6, "and lands one cell on, not two") +end + +-- ---- the hop --------------------------------------------------------------- +-- +-- The bug, stated as numbers: half these frames used to move nothing and the +-- other half used to move two pixels. +local hopP, hopRows, hopFrames = playMove("down", { jump = true }) +eq(hopFrames, Player.STEP_FRAMES * 2, "a ledge hop is 32 logic frames") +local hopDy = steps(hopRows, "py") +eq(countIf(hopDy, function(v) return v ~= 1 end), 0, + "every frame of a ledge hop moves the player a pixel") +eq(countIf(hopDy, function(v) return math.abs(v) >= 2 end), 0, + "and no frame of it moves two") +eq(countIf(steps(hopRows, "px"), function(v) return v ~= 0 end), 0, + "a hop straight down never moves sideways") +-- The near miss: span math applied without the matching frames scaling covers +-- one cell in 32 frames instead of two. +eq(hopRows[#hopRows].py - hopRows[1].py, 32, + "the 32 frames add up to 32 pixels, which is two cells") +eq(hopP.cellY, 7, "and the grid agrees the player crossed two cells") +eq(hopP.py, 7 * 16, "landing on the landing cell's own pixel") +eq(countIf(hopRows, function(r) + return r.px % 1 ~= 0 or r.py % 1 ~= 0 +end), 0, "and no frame leaves the player on a half pixel") + +-- ---- the arc --------------------------------------------------------------- +-- +-- UpdateJumpPosition's .y_offsets: -4 up to -12 and back to 0, one entry per +-- cart frame, so across our doubled step it is half an entry per frame. +do + local off = {} + for i = 2, #hopRows do off[#off + 1] = hopRows[i].off end + local peak = 0 + for i = 1, #off do if off[i] < peak then peak = off[i] end end + -- The arc rises, then falls, and changes its mind exactly once: any extra + -- sign change in the offsets is the sprite wobbling. + local moves = {} + for i = 2, #off do + local v = off[i] - off[i - 1] + if v ~= 0 then moves[#moves + 1] = v end + end + local turns = 0 + for i = 2, #moves do + if (moves[i] > 0) ~= (moves[i - 1] > 0) then turns = turns + 1 end + end + eq(off[1], -4, "the arc opens on the table's first entry") + eq(peak, -12, "peaks 12 pixels up, the table's own peak") + eq(off[#off], 0, "and is back on the ground for the landing frame") + eq(turns, 1, "rising then falling, once, with no wobble in between") + eq(countIf(off, function(v) return v > 0 or v < -12 end), 0, + "and never leaves the range the table covers") + + -- The composed screen position, which is what an eye actually tracks: the + -- camera-following py plus the sprite offset. The first frame lifts the + -- sprite -- that is the take-off -- and after it a hop DOWN may never go + -- backwards. Before the fix it did so on five frames. + local screen, back = {}, 0 + for i = 2, #hopRows do + screen[#screen + 1] = hopRows[i].py + hopRows[i].off + end + for i = 2, #screen do + if screen[i] < screen[i - 1] then back = back + 1 end + end + eq(back, 0, "the arc never drags the sprite back up the screen") + check(screen[1] < hopRows[1].py + hopRows[1].off, + "the one time it does rise is the take-off, on the first frame") + eq(countIf(steps(hopRows, "py"), function(v) return v ~= 1 end), 0, + "while the map underneath scrolls one pixel a frame throughout") +end + +-- A sideways hop is the same move on the other axis: Gold's $a0 is HOP_RIGHT. +for _, dir in ipairs({ "left", "right" }) do + local p, rows, frames = playMove(dir, { jump = true }) + local want = DELTA[dir][1] + eq(frames, 32, ("a %s hop is 32 logic frames too"):format(dir)) + eq(countIf(steps(rows, "px"), function(v) return v ~= want end), 0, + ("and moves one pixel %s on every one of them"):format(dir)) + eq(countIf(steps(rows, "py"), function(v) return v ~= 0 end), 0, + ("a %s hop never slides the player up or down a row"):format(dir)) + eq(p.cellX, 5 + want * 2, ("it lands two cells %s"):format(dir)) +end + +-- The step ends clean: nothing about the jump is left set for the next walk. +eq(hopP.moving, false, "the hop ends the step") +eq(hopP.jumping, nil, "and clears the jump") +eq(hopP.spriteYOffset, 0, "and puts the sprite back on its feet") + +-- ---- the same hop, through World ------------------------------------------- +-- +-- Player alone cannot prove the wiring: World:tryLedgeJump is what picks the +-- two-cell target and the doubled duration (World.lua's STEP_LEDGE arm), and a +-- fix that only touched one of the two would still stutter in the game. +local COLL_FLOOR, COLL_WALL, COLL_HOP_DOWN = 0x00, 0x07, 0xa3 + +local function ledgeWorld(px, py, dir, coll) + local game = { + data = { items = {}, moves = {}, pokemon = {} }, + save = { player = { name = "GOLD", badges = {} }, party = {}, + inventory = {} }, + } + local world = World.new(game) + game.world = world + local cells = {} + cells[py * 100 + px] = coll or COLL_HOP_DOWN + local d = DELTA[dir] + -- The refused single step, which is what turns the walk into a jump. + cells[(py + d[2]) * 100 + (px + d[1])] = COLL_WALL + local map + map = { + id = "ROUTE_29", + width = 10, height = 10, + def = { objects = {}, bgEvents = {}, environment = "ROUTE", + tileset = "TILESET_JOHTO", width = 10, height = 10 }, + cellCollision = function(_, x, y) + return cells[y * 100 + x] or COLL_FLOOR + end, + inBounds = function(_, x, y) + return x >= 0 and y >= 0 and x < 20 and y < 20 + end, + isWalkable = function(_, x, y) + return map:inBounds(x, y) + and Permissions.isWalkable(map:cellCollision(x, y)) + end, + warpAt = function() return nil end, + connection = function() return nil end, + } + world.map = map + world.maps = { ROUTE_29 = map.def } + world.player = Player.new(px, py, dir) + world.player.turnArmed = false + world.entities = { world.player } + world.npcs = {} + world.encounters = {} + world.noWildEncounters = true + world.pollTimeOfDay = function() end + world.updatePeople = function() end + return world +end + +check(Permissions.isLedge(COLL_HOP_DOWN), "$a3 is a ledge") +check((Permissions.ledgeFacings(COLL_HOP_DOWN) or {}).down, + "and its row hops DOWN") + +do + local world = ledgeWorld(4, 5, "down") + local p = world.player + local rows, airborne = {}, false + for _ = 1, 120 do + world.heldDir = (not airborne) and "down" or nil + local wasAirborne = airborne + world:step() + if p.jumping then airborne = true end + if airborne then + rows[#rows + 1] = { px = p.px, py = p.py, off = p.spriteYOffset or 0 } + end + if wasAirborne and not p.moving then break end + end + check(#rows > 0, "holding down on a ledge starts a hop") + eq(#rows - 1, 32, "which runs the doubled 32-frame duration") + eq(p.cellY, 7, "and lands two cells down, on the far side of the wall") + local dy = steps(rows, "py") + eq(countIf(dy, function(v) return v ~= 1 end), 0, + "every frame of the in-game hop scrolls the map exactly one pixel") + eq(rows[#rows].py - rows[1].py, 32, + "so the whole hop is 32 pixels of travel, not 16") + local screen, back = {}, 0 + for i = 2, #rows do screen[#screen + 1] = rows[i].py + rows[i].off end + for i = 2, #screen do + if screen[i] < screen[i - 1] then back = back + 1 end + end + eq(back, 0, "and after the take-off the sprite never reverses") +end + +S.finish() diff --git a/tests/gen2_menus_test.lua b/tests/gen2_menus_test.lua index 8c0934b2..8843026d 100644 --- a/tests/gen2_menus_test.lua +++ b/tests/gen2_menus_test.lua @@ -356,10 +356,11 @@ local optionsGame, optionsInput = newGame(Save.newGame()) local options = OptionsMenu.new(optionsGame, { options = Save.defaultOptions(), }) --- The cart's seven rows, then the port's: CONTROLS, audio, speed, display, --- video mode, screen position, the mobile-gated touch three (buildRows), --- MAX FPS and CANCEL. -check("twenty-four rows", #OptionsMenu.ROWS, 24) +-- The cart's seven rows, then the port's: CONTROLS, audio, PERFORMANCE, +-- speed, display, SHADER FX + SHADER FX 2 (the second slot added alongside +-- the dual-shader feature), video mode, screen position, the mobile-gated +-- touch three (buildRows), MAX FPS, BATTLE BG and CANCEL. +check("twenty-seven rows", #OptionsMenu.ROWS, 27) check("the cart's rows come first", OptionsMenu.ROWS[7].key, "frame") check("then the rebind screen", OptionsMenu.ROWS[8].id, "controls") check("then the port's audio group", OptionsMenu.ROWS[9].key, "musicVol") @@ -955,20 +956,24 @@ check("GBC leaves a palette alone", 1)[1], 1) check("and has no present pass", GbcPalette.presentColors(), nil) -local zoomIndex, gbcfxIndex +local zoomIndex, tiltIndex for i, row in ipairs(OptionsMenu.ROWS) do if row.label == "ZOOM" then zoomIndex = i end - if row.label == "GBC FX" then gbcfxIndex = i end + if row.label == "TILT" then tiltIndex = i end end check("VOID FILL follows ZOOM", OptionsMenu.ROWS[zoomIndex + 1].label, "VOID FILL") check("and TILT follows VOID FILL", OptionsMenu.ROWS[zoomIndex + 2].label, "TILT") -check("VIDEO MODE follows GBC FX", OptionsMenu.ROWS[gbcfxIndex + 1].label, +check("SHADER FX follows COLOR follows TILT", OptionsMenu.ROWS[tiltIndex + 2].label, + "SHADER FX") +check("SHADER FX 2 follows SHADER FX", OptionsMenu.ROWS[tiltIndex + 3].label, + "SHADER FX 2") +check("VIDEO MODE follows SHADER FX 2", OptionsMenu.ROWS[tiltIndex + 4].label, "VIDEO MODE") -check("and SCREEN POS follows it", OptionsMenu.ROWS[gbcfxIndex + 2].label, +check("and SCREEN POS follows it", OptionsMenu.ROWS[tiltIndex + 5].label, "SCREEN POS") -check("and TOUCH PAD follows that", OptionsMenu.ROWS[gbcfxIndex + 3].label, +check("and TOUCH PAD follows that", OptionsMenu.ROWS[tiltIndex + 6].label, "TOUCH PAD") local videoRow = select(2, rowNamed("VIDEO MODE")) diff --git a/tests/gen2_obedience_test.lua b/tests/gen2_obedience_test.lua index c256a726..e027b8cc 100644 --- a/tests/gen2_obedience_test.lua +++ b/tests/gen2_obedience_test.lua @@ -180,7 +180,7 @@ do random = rolls({ 39, 39, 5, 2 }) }) eq(battle:checkObedience("ROCK_THROW"), true, "napped instead") eq(mon.status, "sleep", "BeganToNap writes sleep straight in") - eq(mon.statusTurns, 3, "1-7 turns, from the same roll shape as sleep") + eq(mon.statusTurns, 3, "1-7 turns, written straight into the status byte") check(findText(battle.events, "ROCKY began to nap!"), "with its own line") -- Self-hit: the margin roll in the second band. diff --git a/tests/gen2_ow_bounce_test.lua b/tests/gen2_ow_bounce_test.lua new file mode 100644 index 00000000..211e56fc --- /dev/null +++ b/tests/gen2_ow_bounce_test.lua @@ -0,0 +1,311 @@ +-- SPRITEMOVEDATA_POKEMON ($16), the row every overworld mon object stands on. +-- +-- luajit tests/gen2_ow_bounce_test.lua (ROM-free; the cache section SKIPs +-- without a gold cache) +-- +-- data/sprites/map_objects.asm:181-187 gives the row SPRITEMOVEFN_BOUNCE and +-- OBJECT_ACTION_BOUNCE. SetFacingBounce increments OBJECT_STEP_FRAME once a +-- frame, masks it to four bits and reads bit 3: set means FACING_STEP_UP_0, +-- clear falls into SetFacingFreezeBounce and FACING_STEP_DOWN_0 +-- (engine/overworld/map_object_action.asm:184-202). Those are tiles $00..$03 +-- and $04..$07 of the mon's menu icon (data/sprites/facings.asm:43-72), i.e. +-- the two 16x16 halves of the 16x32 sheet extractIcons already writes. +-- +-- Both halves of #1748 are pinned here: the animation itself, and the sheet +-- being two frames deep so the animation has a second pose to reach. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 ow bounce") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local NPC = require("src.world.gen2.Npc") +local SpriteRenderer = require("src.render.SpriteRenderer") +local World = require("src.world.gen2.World") + +-- constants/map_object_constants.asm:135-151 +local SPRITEMOVEDATA_STILL = 0x01 +local SPRITEMOVEDATA_STANDING_DOWN = 0x06 +local SPRITEMOVEDATA_POKEMON = 0x16 + +-- trueColor short-circuits SpriteRenderer past the OBP bake, so :draw here +-- needs no canvases (the same trick tests/gen2_big_object_test.lua uses). +local MON_SHEET = { + id = "SPRITE_JIGGLYPUFF", frames = 2, trueColor = true, + spriteType = "POKEMON_SPRITE", walker = false, + image = "assets/generated/icons/gen2/jigglypuff.png", +} +local DOLL_SHEET = { + id = "SPRITE_FAIRY", frames = 6, trueColor = true, + spriteType = "WALKING_SPRITE", walker = true, + image = "assets/generated/sprites/fairy.png", +} + +local function build(movement, sheet) + return NPC.new("TEST_MAP", + { index = 1, movement = movement, x = 4, y = 4 }, sheet or MON_SHEET) +end + +-- ---- the movement byte ----------------------------------------------------- +eq(NPC.MOVE.POKEMON, SPRITEMOVEDATA_POKEMON, + "SPRITEMOVEDATA_POKEMON is $16 in map_object_constants.asm") + +-- Without the seam every block below it raises rather than reporting, which +-- turns a whole suite of answers into one traceback. +local HAS_BOUNCE = check(type(NPC.bounceFrame) == "function", + "NPC:bounceFrame is the seam OBJECT_ACTION_BOUNCE draws through") +if not HAS_BOUNCE then + NPC.bounceFrame = function() return nil end +end + +do + local mon = build(SPRITEMOVEDATA_POKEMON) + check(mon.bouncing == true, "a $16 object is built bouncing") + check(mon.fixedFacing == true, + "and keeps FIXED_FACING, which the $16 row's flags1 byte carries") + eq(mon.facing, "down", "its `db DOWN ; facing` column is DOWN") + eq(select(1, NPC.patternFor(SPRITEMOVEDATA_POKEMON)), "stand", + "MovementFunction_Bouncing parks it on STEP_TYPE_STANDING: no walking") +end + +-- ---- eight frames down, eight frames up ------------------------------------ +-- `inc a / and %00001111 / ld [hl], a / and %00001000` is a sixteen-frame +-- cycle with an eight-frame dwell on each pose, and the counter is stepped +-- BEFORE the bit is read -- so the spawn frame is pose 0 and so are the seven +-- after it. +do + local mon = build(SPRITEMOVEDATA_POKEMON) + eq(mon.bounceStep, 0, "OBJECT_STEP_FRAME starts at zero") + local seen, wrong = { mon:bounceFrame() }, nil + for i = 1, 31 do + mon:update() + seen[i + 1] = mon:bounceFrame() + end + for i = 0, 31 do + local want = math.floor(i / 8) % 2 + if seen[i + 1] ~= want and not wrong then + wrong = ("frame %d drew pose %s, wanted %d") + :format(i, tostring(seen[i + 1]), want) + end + end + check(wrong == nil, "two full cycles run 0,0..0,1,1..1 eight frames apiece" + .. (wrong and (" -- " .. wrong) or "")) + eq(seen[1], 0, "the spawn frame is FacingStepDown0, the icon's first half") + eq(seen[9], 1, "the ninth is FacingStepUp0, its second half") + eq(seen[17], 0, "and the seventeenth is back to the first") + eq(mon.bounceStep, 31 % 16, "the counter wrapped at sixteen, not at eight") +end + +-- ---- the frozen column ----------------------------------------------------- +-- OBJECT_ACTION_BOUNCE's second entry is SetFacingFreezeBounce, which writes +-- FACING_STEP_DOWN_0 and never touches OBJECT_STEP_FRAME. So a mon held for a +-- conversation pins its FIRST pose and resumes on the phase it left. +do + local mon = build(SPRITEMOVEDATA_POKEMON) + for _ = 1, 10 do mon:update() end + eq(mon:bounceFrame(), 1, "ten frames in, the mon is on the up pose") + eq(mon.bounceStep, 10, "with OBJECT_STEP_FRAME at 10") + + mon.frozen = true + local pinned = true + for _ = 1, 40 do + mon:update() + if mon:bounceFrame() ~= 0 then pinned = false end + end + check(pinned, "frozen, it holds FacingStepDown0 for the whole conversation") + eq(mon.bounceStep, 10, + "and SetFacingFreezeBounce leaves the step counter where it was") + + mon.frozen = false + mon:update() + eq(mon.bounceStep, 11, "released, the counter carries on from 10") + eq(mon:bounceFrame(), 1, "so the bounce resumes on the phase it froze at") +end + +-- ---- every other movement byte is still ------------------------------------ +-- Only the $16 row carries OBJECT_ACTION_BOUNCE; the Clefairy, Charizard and +-- Pidgeot dolls are SPRITEMOVEDATA_STANDING_DOWN and take +-- OBJECT_ACTION_STAND (data/sprites/map_objects.asm:53-59). +do + for _, movement in ipairs({ SPRITEMOVEDATA_STILL, SPRITEMOVEDATA_STANDING_DOWN, + NPC.MOVE.WANDER, NPC.MOVE.SPINRANDOM_SLOW, NPC.MOVE.BIGDOLL }) do + local npc = build(movement, DOLL_SHEET) + check(not npc.bouncing, + ("movement $%02x does not bounce"):format(movement)) + check(npc:bounceFrame() == nil, + ("and $%02x asks for no frame override"):format(movement)) + end + + -- The other half of it: a mon SHEET on a still row stays still. Gold has no + -- such object, but a mod or a variablesprite slot can make one. + local still = build(SPRITEMOVEDATA_STILL, MON_SHEET) + for _ = 1, 40 do still:update() end + check(still:bounceFrame() == nil, + "a POKEMON_SPRITE sheet on a STILL row never bounces either") +end + +-- ---- the frame reaches the renderer ---------------------------------------- +-- NPC:draw is where the pose is spent: SpriteRenderer:draw's trailing +-- frameOverride argument. A bounce the draw call drops looks exactly like no +-- bounce at all. +do + local mon = build(SPRITEMOVEDATA_POKEMON) + local doll = build(SPRITEMOVEDATA_STANDING_DOWN, DOLL_SHEET) + local seen = {} + local function recorder(who) + return { draw = function(_, _, _, _, _, _, _, _, _, _, frameOverride) + seen[who] = { override = frameOverride, count = (seen[who] + and seen[who].count or 0) + 1 } + end } + end + mon.sprite, doll.sprite = recorder("mon"), recorder("doll") + + mon:draw(0, 0, 1) + doll:draw(0, 0, 1) + eq(seen.mon.override, 0, "the mon's first draw overrides to frame 0") + check(seen.doll.override == nil, "and the doll's overrides to nothing") + + for _ = 1, 8 do mon:update() end + mon:draw(0, 0, 1) + eq(seen.mon.override, 1, "eight frames later it overrides to frame 1") +end + +-- ---- a one-frame sheet has nowhere to bounce to ---------------------------- +-- SpriteRenderer builds one quad per frame and :draw only honours an override +-- it has a quad for, so the extractor half of #1748 is load bearing: with +-- `frames = 1` the up pose is simply not on the sheet. +do + local one = SpriteRenderer.new({ + id = "ONE", frames = 1, trueColor = true, image = MON_SHEET.image }, "one") + eq(one.frameCount, 1, "a frames = 1 def builds one quad") + check(one.frames[1] == nil, "so there is no second frame to override to") + + local two = SpriteRenderer.new(MON_SHEET, "two") + eq(two.frameCount, 2, "a frames = 2 def builds both") + check(two.frames[1] ~= nil, "and frame 1 is a real quad") + eq(two:getFrameGeometry(1).y, two.frameHeight, + "which is the lower 16x16 of the 16x32 icon sheet") +end + +-- ---- World:load repairs a stale cache -------------------------------------- +-- The extractor fix only reaches a player who re-imports, and there is no +-- non-file lever that would force one. World:load back-fills the SpriteMons +-- rows on the way past, keyed on `source` so a mod's own POKEMON_SPRITE row is +-- left exactly as the mod wrote it. +do + local sprites = { + SPRITE_JIGGLYPUFF = { id = "SPRITE_JIGGLYPUFF", frames = 1, + source = "ROM:SpriteMons[20]", spriteType = "POKEMON_SPRITE", + image = "assets/generated/icons/gen2/jigglypuff.png" }, + SPRITE_CHRIS = { id = "SPRITE_CHRIS", frames = 12, walker = true, + source = "ROM:OverworldSprites[0]", + image = "assets/generated/sprites/chris.png" }, + SPRITE_MOD_MON = { id = "SPRITE_MOD_MON", frames = 1, + source = "MOD:pocket-monsters", spriteType = "POKEMON_SPRITE", + image = "mods/pocket-monsters/mon.png" }, + } + local world = World.new({ data = { + gen2Maps = { TEST_MAP = { width = 1, height = 1 } }, + gen2Tilesets = {}, + gen2Sprites = sprites, + } }) + -- load goes on to tilesets, palettes and map art this stub has none of; the + -- back-fill sits in its first dozen lines, so let the rest fall over. + pcall(world.load, world) + eq(sprites.SPRITE_JIGGLYPUFF.frames, 2, + "a pre-#1748 SpriteMons row is back-filled to two frames on load") + eq(sprites.SPRITE_CHRIS.frames, 12, + "an OverworldSprites row is not touched") + eq(sprites.SPRITE_MOD_MON.frames, 1, + "and a mod's own POKEMON_SPRITE row keeps the frame count it declared") +end + +-- ---- the day-care pair ----------------------------------------------------- +-- GetMonSprite's .BreedMon1 / .BreedMon2 arms have no sprites.lua row to +-- back-fill (engine/overworld/overworld.asm:279-305), so the def World builds +-- by hand has to carry the second frame itself. +do + local world = World.new({ data = { gen2Icons = { + species = { PIKACHU = "ICON_PIKACHU" }, + icons = { ICON_PIKACHU = { + image = "assets/generated/icons/gen2/pikachu.png" } }, + } } }) + local def = world:breedmonSpriteDef("PIKACHU") + check(def ~= nil, "a deposited PIKACHU builds a day-care sprite def") + eq(def and def.frames, 2, "two frames, like every other SpriteMons row") + eq(def and def.spriteType, "POKEMON_SPRITE", "and it is a mon sheet") +end + +-- ---- the cache ------------------------------------------------------------- +-- Same default every other gen2 suite uses, so a run with no GOLD_CACHE set +-- still reads the cache instead of skipping silently. +local cache = os.getenv("GOLD_CACHE") + or ((os.getenv("HOME") or "") .. "/Library/Application Support/LOVE/gold-dev/gold") +local function loadCache(name) + local chunk = loadfile(cache .. "/data/generated/" .. name .. ".lua") + return chunk and chunk() or nil +end + +local sprites = loadCache("sprites") +if not sprites then + check(true, "no GOLD_CACHE: the extracted rows are not checked (SKIP)") +else + local monRows, thin = 0, {} + for id, def in pairs(sprites) do + if type(def) == "table" and type(def.source) == "string" + and def.source:find("^ROM:SpriteMons") then + monRows = monRows + 1 + if (def.frames or 1) < 2 then thin[#thin + 1] = id end + end + end + check(monRows > 0, "the cache carries SpriteMons rows at all") + if #thin > 0 then + check(true, ("cache predates #1748 (%d thin rows, first %s) : World:load" + .. " back-fills them, a re-import writes them (SKIP)") + :format(#thin, thin[1])) + else + check(true, ("all %d SpriteMons rows are two frames deep"):format(monRows)) + end + + -- The objects the reporter was looking at: every $16 object on every map has + -- to name a sheet that the bounce can actually flip. + local maps = loadCache("maps") + if not maps then + check(true, "no maps.lua: the $16 objects are not checked (SKIP)") + else + local bouncers, slots, unresolved, oneFrame = 0, 0, {}, {} + for mapId, def in pairs(maps) do + if type(def) == "table" then + for _, obj in ipairs(def.objects or {}) do + if obj.movement == SPRITEMOVEDATA_POKEMON then + bouncers = bouncers + 1 + if type(obj.sprite) == "number" then + -- The day-care pair: GetMonSprite's .BreedMon arms resolve those + -- two bytes to the deposited species' icon at spawn time, so + -- there is no sprites.lua row for them to name. + slots = slots + 1 + elseif not sprites[obj.sprite] then + unresolved[#unresolved + 1] = mapId + elseif (sprites[obj.sprite].frames or 1) < 2 then + oneFrame[#oneFrame + 1] = mapId + end + end + end + end + end + check(bouncers > 0, ("the cache carries %d SPRITEMOVEDATA_POKEMON objects") + :format(bouncers)) + check(#unresolved == 0, "every named one of them names a sheet the cache has" + .. (unresolved[1] and (" (%s does not)"):format(unresolved[1]) or "")) + check(slots == 2, ("and %d of them are the two day-care slots"):format(slots)) + if #oneFrame > 0 then + check(true, ("%d of them sit on a pre-#1748 row : World:load back-fills" + .. " them (SKIP)"):format(#oneFrame)) + else + check(true, "and every one of those sheets is two frames deep") + end + end +end + +S.finish() diff --git a/tests/gen2_pack_rows_test.lua b/tests/gen2_pack_rows_test.lua new file mode 100644 index 00000000..1d812ba2 --- /dev/null +++ b/tests/gen2_pack_rows_test.lua @@ -0,0 +1,404 @@ +-- The PACK's list row and description box, as coordinates. +-- +-- Most of what these three bugs broke is an integer the ASM names outright: +-- TMHMPocket_GetCurrentLineCoord's column 5 and the `ld bc, 3` that puts the +-- move name at column 8 (engine/items/tmhm.asm:355-403, #1695), the 1x9 cursor +-- column at (7,2) whose palette carries the red (engine/gfx/cgb_layouts.asm: +-- 723-726, #1694), and TEXTBOX_INNERY for anything printed in the description +-- box (#1725). Chrome is swapped for a recorder here, so what is asserted is +-- the write list rather than the pixels -- whether the cursor comes out RED on +-- the real screen is tests/drivers/gold_pack_rows_bug1695_test.lua's job. + +package.path = "./?.lua;" .. package.path + +-- The UI modules require love-side helpers at load time. Stub the pieces they +-- touch during construction and logic; nothing here draws. +love = love or {} +love.graphics = love.graphics or { + getColor = function() return 1, 1, 1, 1 end, + setColor = function() end, + rectangle = function() end, + print = function() end, + printf = function() end, + draw = function() end, + newQuad = function() return {} end, + newImage = function() return nil end, + getShader = function() return nil end, + setShader = function() end, + newShader = function() error("no shaders in this harness") end, + getDimensions = function() return 160, 144 end, + push = function() end, pop = function() end, + translate = function() end, scale = function() end, + circle = function() end, clear = function() end, +} +love.math = love.math or { + random = function(a, b) + if b then return a end + return a and 1 or 0.5 + end, +} +love.image = love.image or {} +love.filesystem = love.filesystem or { + load = function() return nil end, + getInfo = function() return nil end, + read = function() return nil end, + write = function() return true end, + remove = function() return true end, +} +love.timer = love.timer or { getTime = function() return 0 end } + +-- No font is loaded here, so Font.encode would warn once per unknown glyph. +require("src.core.Logger").warn = function() end + +local Chrome = require("src.ui.gen2.Chrome") +local PackGfx = require("src.ui.gen2.PackGfx") +local PackMenu = require("src.ui.gen2.PackMenu") +local Save = require("src.core.gen2.Save") + +local failures, checks = 0, 0 +local function check(name, got, want) + checks = checks + 1 + if got ~= want then + failures = failures + 1 + print(("FAIL %s: got %s, want %s"):format( + name, tostring(got), tostring(want))) + end +end + +-- ---------------------------------------------------------------- fixtures + +local ITEMS = { + POTION = { id = "POTION", name = "POTION", pocket = "ITEM", index = 17, + canToss = true, canSelect = false, fieldMenu = "ITEMMENU_PARTY", + description = "Restores HPby 20." }, + ITEMFINDER = { id = "ITEMFINDER", name = "ITEMFINDER", pocket = "KEY_ITEM", + index = 55, canToss = false, canSelect = true, + fieldMenu = "ITEMMENU_CLOSE", + description = "Checks for unseenitems in the area." }, + TM_DYNAMICPUNCH = { id = "TM_DYNAMICPUNCH", name = "TM01", pocket = "TM_HM", + index = 191, tmNumber = 1, tmLabel = "TM01", teaches = "DYNAMICPUNCH" }, + TM_HEADBUTT = { id = "TM_HEADBUTT", name = "TM02", pocket = "TM_HM", + index = 192, tmNumber = 2, tmLabel = "TM02", teaches = "HEADBUTT" }, + TM_NIGHTMARE = { id = "TM_NIGHTMARE", name = "TM50", pocket = "TM_HM", + index = 240, tmNumber = 50, tmLabel = "TM50", teaches = "NIGHTMARE" }, + HM_CUT = { id = "HM_CUT", name = "HM01", pocket = "TM_HM", index = 243, + tmNumber = 51, tmLabel = "HM01", teaches = "CUT" }, + HM_WATERFALL = { id = "HM_WATERFALL", name = "HM07", pocket = "TM_HM", + index = 249, tmNumber = 57, tmLabel = "HM07", teaches = "WATERFALL" }, + -- A cache old enough to carry neither tmLabel nor a numbered name: the row + -- has no number to print and must fall back to the item's own name. + TM_LEGACY = { id = "TM_LEGACY", name = "TM??", pocket = "TM_HM", index = 300, + teaches = "SWIFT" }, +} + +local MOVES = {} +for _, name in ipairs({ "DYNAMICPUNCH", "HEADBUTT", "NIGHTMARE", "CUT", + "WATERFALL", "SWIFT" }) do + MOVES[name] = { id = name, name = name, description = "Movetext." } +end + +local function newInput() + local input = { pressed = {} } + function input:press(...) + for _, button in ipairs({ ... }) do self.pressed[button] = true end + end + function input:wasPressed(button) + if self.pressed[button] then + self.pressed[button] = nil + return true + end + return false + end + function input:isDown() return false end + return input +end + +local function newGame(save) + return { + input = newInput(), + save = save, + options = save and save.options or Save.defaultOptions(), + data = { audio = {}, pokemon = {}, items = ITEMS, moves = MOVES }, + stack = { _items = {}, + push = function(self, s) self._items[#self._items + 1] = s end, + pop = function(self) return table.remove(self._items) end, + top = function(self) return self._items[#self._items] end, + }, + } +end + +-- ------------------------------------------------------------- the recorder +-- +-- PackMenu reaches Chrome through the module table on every call, so swapping +-- the four entry points it draws through collects the screen as a write list. + +local writes, cursors +local real = { + print = Chrome.print, cursor = Chrome.cursor, + cursorThrough = Chrome.cursorThrough, box = Chrome.box, clear = Chrome.clear, +} + +local function install() + writes, cursors = {}, {} + Chrome.print = function(text, tx, ty) + writes[#writes + 1] = { text = text, x = tx, y = ty } + end + Chrome.cursor = function(tx, ty, hollow) + cursors[#cursors + 1] = + { x = tx, y = ty, hollow = hollow or false, palette = nil } + end + Chrome.cursorThrough = function(tx, ty, palette, _invert, hollow) + cursors[#cursors + 1] = + { x = tx, y = ty, hollow = hollow or false, palette = palette } + end + Chrome.box = function() end + Chrome.clear = function() end +end + +local function restore() + Chrome.print, Chrome.cursor = real.print, real.cursor + Chrome.cursorThrough, Chrome.box, Chrome.clear = + real.cursorThrough, real.box, real.clear +end + +-- Where a string landed, as "x,y", so a miss reads as the coordinate it wanted. +local function at(text) + for _, write in ipairs(writes) do + if write.text == text then return write.x .. "," .. write.y end + end + return "absent" +end + +local function drew(text) + for _, write in ipairs(writes) do + if write.text == text then return true end + end + return false +end + +-- The cart's own PACK chrome, stubbed: PackGfx needs a real PNG to answer +-- available(), and none of that matters to where the writes land. +local RED = { { 255, 255, 255 }, { 123, 123, 255 }, { 0, 0, 255 }, { 255, 0, 0 } } +local function withPackGfx(pack) + pack.gfx = { + available = function() return true end, + draw = function() end, + colorsAt = function(_self, tx, ty) + if tx == 7 and ty >= 2 and ty <= 10 then return RED end + return nil + end, + } + return pack +end + +local function openPack(inventory, order, pocket) + local save = Save.newGame() + save.player.name = "GOLD" + save.inventory = inventory + save.bagOrder = order + local game = newGame(save) + local pack = PackMenu.new(game, { save = save, pocket = pocket }) + return withPackGfx(pack), save, game +end + +-- ------------------------------------------- the TM/HM row's number (#1695) +-- +-- TMHM_DisplayPocketItems writes the number itself: PRINTNUM_LEADINGZEROS on a +-- two-digit field for a TM, and the literal 'H' plus a PRINTNUM_LEFTALIGN +-- ordinal for an HM. The item's own name is never printed in this pocket. + +do + local pack = openPack({ + TM_DYNAMICPUNCH = 1, TM_HEADBUTT = 3, TM_NIGHTMARE = 24, + HM_CUT = 1, HM_WATERFALL = 1, TM_LEGACY = 1, + }, { + "HM_WATERFALL", "TM_NIGHTMARE", "HM_CUT", "TM_HEADBUTT", + "TM_DYNAMICPUNCH", "TM_LEGACY", + }, "TM_HM") + + check("TM01 prints as 01", pack.rows[1].tmhmLabel, "01") + check("TM02 prints as 02", pack.rows[2].tmhmLabel, "02") + check("TM50 keeps both digits", pack.rows[3].tmhmLabel, "50") + -- HM01 is TM/HM 51: PrintNum sees 51 - NUM_TMS = 1, left aligned. + check("HM01 prints as H1", pack.rows[4].tmhmLabel, "H1") + check("HM07 prints as H7", pack.rows[5].tmhmLabel, "H7") + check("a numberless TM row has no number to print", + pack.rows[6].tmhmLabel, nil) + + install() + pack.index = 1 + pack:drawPanel() + restore() + + -- hlcoord 5 for the number, `ld bc, 3` on to column 8 for the move name, and + -- the cursor gutter between them at LIST_X - 1. + check("the number sits at column 5", at("01"), "5,2") + check("the move name sits at column 8", at("DYNAMICPUNCH"), "8,2") + check("the item's own name is never printed", drew("TM01"), false) + check("nor is an invented HM prefix", drew("HM01"), false) + check("the cursor is one tile left of the name", cursors[1].x, 7) + check("and level with the row it marks", cursors[1].y, 2) + -- engine/items/tmhm.asm:392-403 -- SCREEN_WIDTH + 9 from the number's coord. + check("a TM's count is at column 17 on the row below", at("\xc3\x97 1"), "17,3") + check("the fourth row is the first HM", at("H1"), "5,8") + check("its move name shares that row", at("CUT"), "8,8") + check("and an HM prints no count", drew("\xc3\x97 1"), true) + + -- The fifth row is HM07, whose count would be the only other "× 1". + local ones = 0 + for _, write in ipairs(writes) do + if write.text == "\xc3\x97 1" then ones = ones + 1 end + end + check("exactly one count on screen, the TM's", ones, 1) +end + +-- A row with no number to print still has to draw something a person can read, +-- so the item's own name stands in rather than the row going blank. +do + local pack = openPack({ TM_LEGACY = 1 }, { "TM_LEGACY" }, "TM_HM") + install() + pack.index = 1 + pack:drawPanel() + restore() + check("a numberless row falls back to the item name", at("TM??"), "8,2") + check("and prints nothing in the number column", drew("SWIFT"), false) +end + +-- ------------------------------------------------- an ordinary pocket's row + +do + local pack = openPack({ POTION = 5 }, { "POTION" }, "ITEM") + install() + pack.index = 1 + pack:drawPanel() + restore() + check("an ITEM row starts at column 8", at("POTION"), "8,2") + check("with no number beside it", drew("01"), false) + check("and its count in the same column a TM's uses", + at("\xc3\x97 5"), "17,3") +end + +-- ------------------------------------------------ the cursor's palette (#1694) +-- +-- _CGB_PackPals fills (7,2) 1x9 with palette $3, whose colour 3 is red, and +-- that rectangle is exactly the five list rows' cursor gutter. + +do + local pack = openPack({ POTION = 5, ESCAPE_ROPE = 1 }, { "POTION" }, "ITEM") + install() + pack.index = 1 + pack:drawPanel() + restore() + check("the cursor asks the pack for its cell's palette", + cursors[1] and cursors[1].palette, RED) + local ink = cursors[1] and cursors[1].palette and cursors[1].palette[4] + check("which is the one whose colour 3 is red", + ink and table.concat(ink, ","), "255,0,0") + + -- SELECT arms a row: ScrollingMenu_PlaceCursor's hollow arrow takes the same + -- palette, so `hollow` has to survive the call. + pack.rows[2] = { id = "ESCAPE_ROPE", count = 1, name = "ESCAPE ROPE", + showCount = true } + pack.switching = 1 + pack.index = 2 + install() + pack:drawPanel() + restore() + local armed + for _, cursor in ipairs(cursors) do + if cursor.hollow then armed = cursor end + end + check("the armed row's hollow arrow is drawn", armed ~= nil, true) + check("in the cursor column", armed and armed.x, 7) + check("and through the same red palette", armed and armed.palette, RED) + + -- No pack tiles in the cache: the fallback must still draw a cursor rather + -- than nothing at all. + pack.gfx = { available = function() return false end, draw = function() end } + pack.switching = nil + pack.index = 1 + install() + pack:drawPanel() + restore() + check("a cache with no pack tiles falls back to the plain arrow", + cursors[1] and cursors[1].palette, nil) +end + +-- PackGfx flattens paletteZones to a per-cell lookup; the cursor zone is the +-- one PackMenu reads, so check the rectangle resolves over its whole height. +do + local pals = { { { 1, 1, 1 } }, { { 2, 2, 2 } }, { { 3, 3, 3 } }, RED } + local gfx = PackGfx.new({ pack = { + palettes = pals, + paletteZones = { { 0, 0, 10, 1, 2 }, { 7, 2, 1, 9, 4 } }, + } }) + check("the cursor column starts at row 2", gfx:colorsAt(7, 2), RED) + check("and runs nine rows down to row 10", gfx:colorsAt(7, 10), RED) + check("row 11 is outside it", gfx:colorsAt(7, 11), pals[1]) + check("so is the name column", gfx:colorsAt(8, 2), pals[1]) + check("the header keeps its own zone", gfx:colorsAt(0, 0), pals[2]) +end + +-- ------------------------------------------ the description box's rows (#1725) +-- +-- Every text box in the game starts at TEXTBOX_INNERY and steps two rows a +-- line. The item description already did; a message printed over the same box +-- did not. + +do + local pack = openPack({ ITEMFINDER = 1 }, { "ITEMFINDER" }, "KEY_ITEM") + + install() + pack.index = 1 + pack:drawPanel() + restore() + check("an item description starts on row 14", + at("Checks for unseen"), "1,14") + check("and its second line is row 16", at("items in the area."), "1,16") + + -- RegisteredItemText, the case the report filed. + pack.message = { "Registered the", "ITEMFINDER." } + install() + pack:drawPanel() + restore() + check("a message's first line shares the description's row", + at("Registered the"), "1,14") + check("and its second line lands on row 16", at("ITEMFINDER."), "1,16") + + -- _AskThrowAwayText, the other two-line message in this box. + pack.message = { "Throw away how", "many?" } + install() + pack:drawPanel() + restore() + check("the toss question starts on row 14", at("Throw away how"), "1,14") + check("with a blank row under it", at("many?"), "1,16") + + -- OakThisIsntTheTimeText is three lines, which two double-spaced rows cannot + -- hold: those pack one row apart so the last is inside the box. + pack.message = { "OAK: {PLAYER}!", "This isn't the", "time to use that!" } + install() + pack:drawPanel() + restore() + check("a three-line message starts a row higher", at("OAK: GOLD!"), "1,13") + check("its second line is row 14", at("This isn't the"), "1,14") + check("and its third clears the bottom border", + at("time to use that!"), "1,15") + + -- The yes/no prompt is printed in the same box by the same path. + pack.message = nil + pack.confirm = { prompt = { "Throw away 1", "POTION(S)?" }, choice = 1 } + install() + pack:drawPanel() + restore() + check("the toss confirmation uses the same two rows", + at("Throw away 1"), "1,14") + check("and the same gap", at("POTION(S)?"), "1,16") +end + +print(("gen2 pack rows: %d checks, %d failures"):format(checks, failures)) +-- Raise rather than os.exit: tests/run_tests.lua dofiles this file, so an +-- exit here takes the whole tier down with it and silently skips every +-- suite listed after this one (see tests/harness.lua's T.suite note). +if failures > 0 then + error(("%d assertion(s) failed"):format(failures), 0) +end diff --git a/tests/gen2_sleep_counter_test.lua b/tests/gen2_sleep_counter_test.lua new file mode 100644 index 00000000..20cc97d6 --- /dev/null +++ b/tests/gen2_sleep_counter_test.lua @@ -0,0 +1,213 @@ +-- The counter a sleep MOVE writes: BattleCommand_SleepTarget's .random_loop +-- (engine/battle/effect_commands.asm:3591-3598), which masks with SLP_MASK, +-- rerolls 0 and SLP_MASK and only then does `inc a` -- so 2-7, never 1 (#1707). +-- Rest and the disobedience nap keep their own counters and are the controls. +-- +-- luajit tests/gen2_sleep_counter_test.lua -- ROM-free + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 sleep counter") +local check, eq = S.check, S.eq + +local Battle = require("src.battle.gen2.Battle") +local Mon = require("src.battle.gen2.Mon") + +-- ---------------------------------------------------------------- fixtures + +local TYPES = { + NORMAL = { id = "NORMAL", index = 0, category = "physical" }, + FLYING = { id = "FLYING", index = 2, category = "physical" }, + FIRE = { id = "FIRE", index = 20, category = "special" }, + GRASS = { id = "GRASS", index = 22, category = "special" }, + PSYCHIC = { id = "PSYCHIC", index = 24, category = "special" }, +} + +local MATCHUPS = {} + +local MOVES = { + TACKLE = { id = "TACKLE", name = "TACKLE", power = 35, type = "NORMAL", + accuracy = 100, pp = 35, effect = "EFFECT_NORMAL_HIT" }, + -- data/moves/moves.asm: SPORE and HYPNOSIS are both EFFECT_SLEEP. + SPORE = { id = "SPORE", name = "SPORE", power = 0, type = "GRASS", + accuracy = 100, pp = 15, effect = "EFFECT_SLEEP" }, + HYPNOSIS = { id = "HYPNOSIS", name = "HYPNOSIS", power = 0, + type = "PSYCHIC", accuracy = 100, pp = 20, effect = "EFFECT_SLEEP" }, + REST = { id = "REST", name = "REST", power = 0, type = "PSYCHIC", + accuracy = 100, pp = 10, effect = "EFFECT_HEAL" }, +} + +local GROWTH = { + GROWTH_MEDIUM_SLOW = { numerator = 6, denominator = 5, squared = -15, + linear = 100, constant = 140 }, +} + +local POKEMON = { + growthRates = GROWTH, + -- Fast enough to move first against the PIDGEY below at these levels. + CYNDAQUIL = { + id = "CYNDAQUIL", index = 155, name = "CYNDAQUIL", + baseStats = { hp = 39, attack = 52, defense = 43, speed = 65, + specialAttack = 60, specialDefense = 50 }, + types = { "FIRE", "FIRE" }, catchRate = 45, baseExp = 65, + growthRate = "GROWTH_MEDIUM_SLOW", genderRatio = 31, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, + PIDGEY = { + id = "PIDGEY", index = 16, name = "PIDGEY", + baseStats = { hp = 40, attack = 45, defense = 40, speed = 56, + specialAttack = 35, specialDefense = 35 }, + types = { "NORMAL", "FLYING" }, catchRate = 255, baseExp = 55, + growthRate = "GROWTH_MEDIUM_SLOW", genderRatio = 127, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, +} + +local DATA = { + pokemon = POKEMON, + moves = MOVES, + type_chart = { types = TYPES, matchups = MATCHUPS }, + items = {}, +} + +local perfect = { attack = 15, defense = 15, speed = 15, special = 15 } +perfect.hp = Mon.hpDV(perfect) + +-- BattleRandom(n) -> 0..n-1, pinned to one value. +local function zeroRandom() return 0 end +local function fixedRandom(value) + return function(n) return math.min(value, (n or 1) - 1) end +end + +local function newBattle(opts) + opts = opts or {} + local player = Mon.new(DATA, "CYNDAQUIL", 10, { dvs = perfect }) + player.moves = { + { id = "SPORE", pp = 15, maxPp = 15 }, + { id = "TACKLE", pp = 35, maxPp = 35 }, + } + local wild = Mon.new(DATA, "PIDGEY", 5, { dvs = perfect }) + wild.moves = { { id = "TACKLE", pp = 35, maxPp = 35 } } + local battle = Battle.new({ + data = DATA, + party = { player }, + wild = wild, + random = opts.random or zeroRandom, + }) + battle:takeEvents() + return battle, player, wild +end + +local function texts(events) + local out = {} + for _, event in ipairs(events or {}) do + if event.text then out[#out + 1] = event.text end + end + return out +end + +local function found(events, needle) + for _, text in ipairs(texts(events)) do + if text:find(needle, 1, true) then return true end + end + return false +end + +-- ------------------------------------------------------- the roll's range + +-- The whole roll space against .random_loop's window: 2..7 inclusive, six +-- outcomes, no 1 and no 8 (effect_commands.asm:3591-3598). +do + local seen, low, high = {}, math.huge, -math.huge + for roll = 0, 7 do + local battle, _, wild = newBattle({ random = fixedRandom(roll) }) + battle:useMove(battle.player, wild, "SPORE") + eq(wild.status, "sleep", "roll " .. roll .. " slept the target") + local turns = wild.statusTurns or 0 + seen[turns] = true + low, high = math.min(low, turns), math.max(high, turns) + end + eq(low, 2, "the shortest sleep a sleep move can roll is two turns") + eq(high, 7, "the longest is seven, SLP_MASK itself never being written") + check(not seen[1], "one turn is unreachable, so no free-action sleep") + check(not seen[0], "and zero is unreachable") + local count = 0 + for _ in pairs(seen) do count = count + 1 end + eq(count, 6, "six distinct counters, the width of the cart's window") +end + +do + local battle, _, wild = newBattle() + battle:useMove(battle.player, wild, "SPORE") + eq(wild.statusTurns, 2, "the lowest roll writes two, not one") +end + +-- ------------------------------------------- slept by a faster foe (#1707) + +-- CheckPlayerTurn decrements before the sleeper acts, so the round the sleep +-- landed in is the one a 1 would have cost nothing. +do + local battle, player, wild = newBattle() + local hpBefore = player.hp + local events = battle:takeTurn({ kind = "move", move = "SPORE" }) + eq(wild.status, "sleep", "the slower foe is asleep") + check(found(events, "is fast asleep!"), + "and spends the same round's action asleep") + check(not found(events, "woke up!"), + "it cannot wake in the round it was slept") + eq(wild.statusTurns, 1, "one turn of the counter was spent") + eq(player.hp, hpBefore, "so the sleeper landed no attack of its own") +end + +-- The counter still runs out on the next round. +do + local battle, _, wild = newBattle() + battle:takeTurn({ kind = "move", move = "SPORE" }) + local events = battle:takeTurn({ kind = "move", move = "TACKLE" }) + check(found(events, "woke up!"), "the next round wakes it") + eq(wild.status, nil, "and clears the status byte") + eq(wild.statusTurns, nil, "and the counter with it") +end + +-- Hypnosis shares EFFECT_SLEEP, so it shares the window. +do + local battle, _, wild = newBattle() + battle.player.moves[1] = { id = "HYPNOSIS", pp = 20, maxPp = 20 } + battle:useMove(battle.player, wild, "HYPNOSIS") + eq(wild.status, "sleep", "hypnosis slept the target") + eq(wild.statusTurns, 2, "off the same .random_loop") +end + +-- ------------------------------------------------------------- the controls + +-- Rest writes REST_SLEEP_TURNS + 1 straight into the status byte, no roll +-- (effect_commands.asm:6015-6027). +do + local battle, player, wild = newBattle() + player.moves = { { id = "REST", pp = 10, maxPp = 10 }, + { id = "TACKLE", pp = 35, maxPp = 35 } } + player.hp = 1 + battle:useMove(player, wild, "REST") + eq(player.status, "sleep", "rest slept the user") + eq(player.statusTurns, 3, "rest is still exactly three") + eq(player.hp, player.maxHp, "and still a full heal") + + local events = battle:takeTurn({ kind = "move", move = "TACKLE" }) + check(found(events, "is fast asleep!"), "the first turn after rest is lost") + events = battle:takeTurn({ kind = "move", move = "TACKLE" }) + check(found(events, "is fast asleep!"), "so is the second") + events = battle:takeTurn({ kind = "move", move = "TACKLE" }) + check(found(events, "woke up!"), "and it acts on the third") +end + +-- The disobedience nap rerolls only 0 and has no `inc a`, so 1 is legal +-- there (effect_commands.asm:778-785) and the two rolls are not shared. +do + local record = Battle.STATUSES.sleep + check(type(record.onInflict) == "function", "sleep still has an onInflict") + local mon = {} + record.onInflict({ random = zeroRandom }, mon) + eq(mon.statusTurns, 2, "the status record's own floor is two") +end + +S.finish() diff --git a/tests/gen2_sprites_test.lua b/tests/gen2_sprites_test.lua index 78c77ab0..6fecfc95 100644 --- a/tests/gen2_sprites_test.lua +++ b/tests/gen2_sprites_test.lua @@ -172,10 +172,13 @@ else "which ReadMonMenuIcon turns into PIKACHU's menu icon") eq(doll.image, "assets/generated/icons/gen2/pikachu.png", "so it draws from the icon sheet extractIcons already writes") - -- FacingStepDown0 is the only OAM set a still mon object ever uses, and it - -- is tiles $00..$03: the icon's first frame. The second is the party - -- menu's bob and never reaches the map. - eq(doll.frames, 1, "one frame: _DoesSpriteHaveFacings sends a mon down-only") + -- OBJECT_ACTION_BOUNCE swaps FacingStepDown0's tiles $00..$03 for + -- FacingStepUp0's $04..$07, so both icon frames reach the map (#1748). + if doll.frames == 1 then + check(true, "cache predates #1748 : re-import for the mon bounce (SKIP)") + else + eq(doll.frames, 2, "two frames: SetFacingBounce swaps the icon's pair") + end check(not doll.walker, "and a doll does not walk") eq(doll.paletteId, 0, "_GetSpritePalette answers 0 for every mon sprite") eq(doll.palette, "PAL_OW_RED", "which is PAL_OW_RED in the MapObjectPals set") diff --git a/tests/gen2_timed_heal_test.lua b/tests/gen2_timed_heal_test.lua new file mode 100644 index 00000000..361b8fc8 --- /dev/null +++ b/tests/gen2_timed_heal_test.lua @@ -0,0 +1,315 @@ +-- Morning Sun / Synthesis / Moonlight: BattleCommand_TimeBasedHealContinue +-- (engine/battle/effect_commands.asm:6374) walks a four-rung .Multipliers +-- table from the half rung -- the wrong wTimeOfDay steps down, sun up, rain +-- and sandstorm down (#1751). World:startBattle is where the hour comes from. +-- +-- luajit tests/gen2_timed_heal_test.lua -- ROM-free + +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 timed heal") +local check, eq = S.check, S.eq + +local Battle = require("src.battle.gen2.Battle") +local Effects = require("src.battle.gen2.Effects") +local Mon = require("src.battle.gen2.Mon") + +-- constants/ram_constants.asm:137-140, wTimeOfDay: MORN_F 0, DAY_F 1, NITE_F 2, +-- DARKNESS_F 3. +local MORN, DAY, NITE, DARK = 0, 1, 2, 3 + +-- ---------------------------------------------------------------- fixtures + +local TYPES = { + NORMAL = { id = "NORMAL", index = 0, category = "physical" }, + FLYING = { id = "FLYING", index = 2, category = "physical" }, + GRASS = { id = "GRASS", index = 22, category = "special" }, + WATER = { id = "WATER", index = 21, category = "special" }, +} + +local MOVES = { + TACKLE = { id = "TACKLE", name = "TACKLE", power = 35, type = "NORMAL", + accuracy = 100, pp = 35, effect = "EFFECT_NORMAL_HIT" }, + -- data/moves/moves.asm: three 5 PP status moves that differ only in effect. + SYNTHESIS = { id = "SYNTHESIS", name = "SYNTHESIS", power = 0, + type = "GRASS", accuracy = 100, pp = 5, effect = "EFFECT_SYNTHESIS" }, + MORNING_SUN = { id = "MORNING_SUN", name = "MORNING SUN", power = 0, + type = "NORMAL", accuracy = 100, pp = 5, effect = "EFFECT_MORNING_SUN" }, + MOONLIGHT = { id = "MOONLIGHT", name = "MOONLIGHT", power = 0, + type = "NORMAL", accuracy = 100, pp = 5, effect = "EFFECT_MOONLIGHT" }, + SUNNY_DAY = { id = "SUNNY_DAY", name = "SUNNY DAY", power = 0, + type = "FIRE", accuracy = 100, pp = 5, effect = "EFFECT_SUNNY_DAY" }, + RAIN_DANCE = { id = "RAIN_DANCE", name = "RAIN DANCE", power = 0, + type = "WATER", accuracy = 100, pp = 5, effect = "EFFECT_RAIN_DANCE" }, +} + +local GROWTH = { + GROWTH_MEDIUM_SLOW = { numerator = 6, denominator = 5, squared = -15, + linear = 100, constant = 140 }, +} + +local POKEMON = { + growthRates = GROWTH, + CHIKORITA = { + id = "CHIKORITA", index = 152, name = "CHIKORITA", + baseStats = { hp = 45, attack = 49, defense = 65, speed = 45, + specialAttack = 49, specialDefense = 65 }, + types = { "GRASS", "GRASS" }, catchRate = 45, baseExp = 64, + growthRate = "GROWTH_MEDIUM_SLOW", genderRatio = 31, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, + PIDGEY = { + id = "PIDGEY", index = 16, name = "PIDGEY", + baseStats = { hp = 40, attack = 45, defense = 40, speed = 56, + specialAttack = 35, specialDefense = 35 }, + types = { "NORMAL", "FLYING" }, catchRate = 255, baseExp = 55, + growthRate = "GROWTH_MEDIUM_SLOW", genderRatio = 127, + levelMoves = { { level = 1, move = "TACKLE" } }, evolutions = {}, + }, +} + +local DATA = { + pokemon = POKEMON, + moves = MOVES, + type_chart = { types = TYPES, matchups = {} }, + items = {}, +} + +local perfect = { attack = 15, defense = 15, speed = 15, special = 15 } +perfect.hp = Mon.hpDV(perfect) + +local function zeroRandom() return 0 end + +local function newBattle(opts) + opts = opts or {} + local player = Mon.new(DATA, "CHIKORITA", 20, { dvs = perfect }) + player.moves = { + { id = "SYNTHESIS", pp = 5, maxPp = 5 }, + { id = "MORNING_SUN", pp = 5, maxPp = 5 }, + { id = "MOONLIGHT", pp = 5, maxPp = 5 }, + { id = "SUNNY_DAY", pp = 5, maxPp = 5 }, + } + local wild = Mon.new(DATA, "PIDGEY", 5, { dvs = perfect }) + wild.moves = { { id = "TACKLE", pp = 35, maxPp = 35 } } + local battle = Battle.new({ + data = DATA, + party = { player }, + wild = wild, + random = zeroRandom, + timeOfDay = opts.timeOfDay, + }) + battle:takeEvents() + return battle, player, wild +end + +-- ------------------------------------------------------------- the ladder + +local frac = Effects.timeBasedHealFraction +check(type(frac) == "function", + "Effects models the whole command, not just the weather half") + +-- .Multipliers itself (effect_commands.asm:6450-6454). +local RUNGS = { 1 / 8, 1 / 4, 1 / 2, 1 } +eq(Effects.HEAL_MULTIPLIERS[1], RUNGS[1], "rung 0 is an eighth") +eq(Effects.HEAL_MULTIPLIERS[2], RUNGS[2], "rung 1 is a quarter") +eq(Effects.HEAL_MULTIPLIERS[3], RUNGS[3], "rung 2 is a half, the default") +eq(Effects.HEAL_MULTIPLIERS[4], RUNGS[4], "rung 3 is the whole bar") + +-- The `ld b, MORN_F / DAY_F / NITE_F` each of the three entry points loads +-- (effect_commands.asm:6362-6371). +eq(Effects.SUN_HEAL.EFFECT_MORNING_SUN, MORN, "Morning Sun wants MORN") +eq(Effects.SUN_HEAL.EFFECT_SYNTHESIS, DAY, "Synthesis wants DAY") +eq(Effects.SUN_HEAL.EFFECT_MOONLIGHT, NITE, "Moonlight wants NITE") + +-- The six cells that matter, read as Synthesis: its own hour on the top row, +-- any other hour on the bottom. +eq(frac(nil, DAY, DAY), 1 / 2, "right hour, clear sky: a half") +eq(frac("sun", DAY, DAY), 1, "right hour in sun: the whole bar") +eq(frac("rain", DAY, DAY), 1 / 4, "right hour in rain: a quarter") +eq(frac(nil, DAY, NITE), 1 / 4, "wrong hour, clear sky: a quarter") +eq(frac("sun", DAY, NITE), 1 / 2, "wrong hour in sun: a half") +eq(frac("rain", DAY, NITE), 1 / 8, "wrong hour in rain: an eighth") + +-- Sandstorm takes the same `dec c / dec c` arm rain does. +eq(frac("sandstorm", DAY, DAY), 1 / 4, "sandstorm is rain's rung") +eq(frac("sandstorm", DAY, NITE), 1 / 8, "at either hour") + +-- Every hour that is not the move's own is the wrong one, DARKNESS included. +eq(frac(nil, DAY, MORN), 1 / 4, "morning is the wrong hour for Synthesis") +eq(frac(nil, DAY, DARK), 1 / 4, "and so is DARKNESS") +eq(frac(nil, MORN, MORN), 1 / 2, "Morning Sun at dawn is the top row") +eq(frac(nil, MORN, DAY), 1 / 4, "Morning Sun in the afternoon is not") +eq(frac(nil, NITE, NITE), 1 / 2, "Moonlight at night is the top row") +eq(frac(nil, NITE, DAY), 1 / 4, "Moonlight at noon is not") + +-- wTimeOfDay by name, the spelling World keeps. +eq(frac(nil, DAY, "DAY"), 1 / 2, "the DAY spelling reads as DAY_F") +eq(frac(nil, DAY, "NITE"), 1 / 4, "and NITE as NITE_F") +eq(frac(nil, NITE, "NITE"), 1 / 2, "Moonlight likewise") + +-- `ld a, [wLinkMode] / and a / jr nz, .Weather` (effect_commands.asm:6396-6399): +-- a battle with no clock skips the time term rather than failing the hour. +eq(frac(nil, DAY, nil), 1 / 2, "no clock, no time term") +eq(frac("sun", DAY, nil), 1, "the weather half still walks") + +-- Gen 3's 2/3 is not on this ladder anywhere. +do + local offLadder = {} + for _, weather in ipairs({ "none", "sun", "rain", "sandstorm" }) do + for _, wants in ipairs({ MORN, DAY, NITE }) do + for hour = MORN, DARK do + local got = frac(weather ~= "none" and weather or nil, wants, hour) + local onLadder = false + for _, rung in ipairs(RUNGS) do + if got == rung then onLadder = true end + end + if not onLadder then + offLadder[#offLadder + 1] = ("%s/%d/%d=%s") + :format(weather, wants, hour, tostring(got)) + end + end + end + end + eq(#offLadder, 0, + "every cell lands on a .Multipliers rung: " .. table.concat(offLadder, " ")) +end +check(Effects.weatherHealFraction == nil + or math.abs(Effects.weatherHealFraction("sun") - 2 / 3) > 0.0001, + "and nothing still answers Gen 3's two thirds in sun") + +-- ------------------------------------------------------- through a battle + +-- wTimeOfDay reaches the handler (effect_commands.asm:6401-6404). +do + local battle = newBattle({ timeOfDay = NITE }) + eq(battle.timeOfDay, NITE, "Battle.new carries wTimeOfDay") +end + +local function healedBy(move, timeOfDay, weather) + local battle, player = newBattle({ timeOfDay = timeOfDay }) + battle.weather = weather + battle.weatherTurns = weather and 5 or nil + player.hp = math.floor(player.maxHp / 2) + local before = player.hp + battle:useMove(player, battle.enemy, move) + return player.hp - before, player.maxHp, battle:takeEvents() +end + +do + local healed, maxHp = healedBy("SYNTHESIS", NITE) + eq(healed, math.floor(maxHp / 4), "Synthesis at night restores a quarter") + check(healed ~= math.floor(maxHp / 2), + "which is not the flat half the unfixed move gave") +end + +do + local healed, maxHp, events = healedBy("SYNTHESIS", DAY) + eq(healed, math.floor(maxHp / 2), "Synthesis in the day restores a half") + local said = false + for _, event in ipairs(events) do + if event.text and event.text:find("regained health!", 1, true) then + said = true + end + end + check(said, "and still says so") +end + +-- Sun on the top rung is GetMaxHP, not a bigger fraction, so the bar fills +-- from wherever it started rather than from half. +do + local battle, player = newBattle({ timeOfDay = DAY }) + battle.weather, battle.weatherTurns = "sun", 5 + player.hp = 1 + battle:useMove(player, battle.enemy, "SYNTHESIS") + eq(player.hp, player.maxHp, + "Synthesis in the day under Sunny Day fills the bar from 1 HP") + + battle, player = newBattle({ timeOfDay = DAY }) + battle.weather, battle.weatherTurns = "sun", 5 + player.hp = math.floor(player.maxHp / 2) + battle:useMove(player, battle.enemy, "SYNTHESIS") + eq(player.hp, player.maxHp, "and from half") +end + +do + local healed, maxHp = healedBy("SYNTHESIS", NITE, "rain") + eq(healed, math.floor(maxHp / 8), "Synthesis at night in rain is an eighth") +end + +do + local healed, maxHp = healedBy("MOONLIGHT", NITE) + eq(healed, math.floor(maxHp / 2), "Moonlight at night restores a half") + healed = healedBy("MOONLIGHT", DAY) + eq(healed, math.floor(maxHp / 4), "and a quarter at noon") + healed = healedBy("MORNING_SUN", MORN) + eq(healed, math.floor(maxHp / 2), "Morning Sun at dawn restores a half") + healed = healedBy("MORNING_SUN", NITE) + eq(healed, math.floor(maxHp / 4), "and a quarter at night") +end + +-- At NITE only Moonlight is on its top rung. +do + local night = {} + for _, move in ipairs({ "MORNING_SUN", "SYNTHESIS", "MOONLIGHT" }) do + night[move] = healedBy(move, NITE) + end + check(night.MOONLIGHT > night.SYNTHESIS, + "Moonlight beats Synthesis at night") + eq(night.MORNING_SUN, night.SYNTHESIS, + "and the two daytime moves tie below it") +end + +-- effect_commands.asm:6443-6448: a full-HP user gets HPIsFullText and no heal, +-- whatever the clock says. +do + local battle, player = newBattle({ timeOfDay = NITE }) + battle:useMove(player, battle.enemy, "SYNTHESIS") + eq(player.hp, player.maxHp, "a full-HP user is not healed") + local said = false + for _, event in ipairs(battle:takeEvents()) do + if event.text and event.text:find("HP is full", 1, true) then said = true end + end + check(said, "and hears HPIsFullText instead") +end + +-- ------------------------------------------------- the overworld's clock + +-- World:timeOfDayId is wTimeOfDay off the RTC hour +-- (engine/tilesets/timeofday_pals.asm:5-11), and startBattle hands it over. +do + local World = require("src.world.gen2.World") + local Screens = require("src.ui.Screens") + + local pushed + local realPush = Screens.push + Screens.push = function(_, id, opts) + if id == "Gen2BattleState" then pushed = opts end + end + + local ok, err = pcall(function() + for _, hour in ipairs({ { "MORN", MORN }, { "DAY", DAY }, + { "NITE", NITE }, { "DARK", DARK } }) do + local mon = Mon.new(DATA, "CHIKORITA", 20, { dvs = perfect }) + local game = { + data = DATA, + save = { version = "gold", player = { name = "GOLD", id = 1234 }, + party = { mon }, inventory = {}, boxes = {} }, + } + game.stack = { pop = function() end } + local world = World.new(game) + world.tod = hour[1] + -- No map, so DoBattleTransition has nothing to wipe and the battle + -- screen comes straight in (World:pushBattleTransition). + world.map = nil + pushed = nil + world:startBattle({ wild = Mon.new(DATA, "PIDGEY", 5, { dvs = perfect }) }) + eq(pushed and pushed.battle and pushed.battle.timeOfDay, hour[2], + "a battle started at " .. hour[1] .. " carries that wTimeOfDay") + end + end) + + Screens.push = realPush + check(ok, "the World seam ran: " .. tostring(err)) +end + +S.finish() diff --git a/tests/gen2_vm_test.lua b/tests/gen2_vm_test.lua index b1b92761..79ffc201 100644 --- a/tests/gen2_vm_test.lua +++ b/tests/gen2_vm_test.lua @@ -1768,8 +1768,10 @@ end -- Shuckle you caught yourself is the thing the routine refuses. do local list = {} + local record = { party = list } local vm = specialVm(0, { order = { "x" }, hooks = { party = function() return list end, + save = function() return record end, data = function() return { pokemon = { SHUCKLE = { name = "SHUCKLE", index = 213, growthRate = "MEDIUM_FAST", @@ -1785,6 +1787,9 @@ do eq(list[1].otId, Specials.MANIA_OT_ID, "with MANIA's trainer ID") eq(list[1].item, "BERRY", "holding a BERRY") eq(list[1].level, 15, "at level 15") + local dex = record.pokedex or {} + eq((dex.seen or {}).SHUCKLE, true, "seen in the #DEX") + eq((dex.caught or {}).SHUCKLE, true, "and caught in the #DEX") local hooks2 = { party = function() return list end, selectPartyMon = function(_, done) done(1, list[1]) end } diff --git a/tests/gen2_whirlpool_test.lua b/tests/gen2_whirlpool_test.lua new file mode 100644 index 00000000..40dd4e76 --- /dev/null +++ b/tests/gen2_whirlpool_test.lua @@ -0,0 +1,229 @@ +-- Whirlpool tiles force-turn the player: DoPlayerMovement's .CheckTile, the +-- CheckWhirlpoolTile arm that sits ABOVE the nybble ladder. +-- +-- luajit tests/gen2_whirlpool_test.lua +-- +-- COLL_WHIRLPOOL is tested first and takes PLAYERMOVEMENT_FORCE_TURN +-- (engine/overworld/player_movement.asm:117-123), which runs Script_ForcedMovement +-- (engine/events/forced_movement.asm:1-51): step_dig 16, turn_in , +-- step_dig 16, turn_head , step_end. So a whirlpool is entered, whirled +-- on, and left again the way the player came, with the d-pad ignored throughout. +-- +-- The port had no arm at all -- only the HI_NYBBLE_CURRENT and HI_NYBBLE_WARPS +-- ones -- so a whirlpool cell was plain water and a surfer swam straight over +-- it, past the HM06 + GLACIERBADGE gate on Route 41 and Route 27. Two decoding +-- gaps sat under that: turn_away / turn_in / turn_waterfall all `jp TurningStep` +-- (engine/overworld/movement.asm:483-513), which is a real one-cell STEP under +-- OBJECT_ACTION_SPIN, and $4f step_dig was not modelled at all. #1716 +-- +-- The whirl itself is drawing, so what is asserted here is the state the +-- drawing reads (Player.spinFrames) and the grid the player ends on. +-- tests/drivers/gold_whirlpool_forceturn_bug1716_test.lua is the other half. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 whirlpool") +local check, eq, same = S.check, S.eq, S.same + +local Movement = require("src.script.gen2.Movement") +local Permissions = require("src.world.gen2.Permissions") +local World = require("src.world.gen2.World") +local Player = require("src.world.gen2.Player") +local FieldMoves = require("src.world.gen2.FieldMoves") + +-- ---- the tile -------------------------------------------------------------- +-- +-- CheckWhirlpoolTile is the two-entry compare COLL_WHIRLPOOL $24 / COLL_WHIRLPOOL_1 $2c. +local COLL_WATER, COLL_WHIRLPOOL, COLL_WHIRLPOOL_1 = 0x29, 0x24, 0x2c + +check(Permissions.isWhirlpool(COLL_WHIRLPOOL), "COLL_WHIRLPOOL $24") +check(Permissions.isWhirlpool(COLL_WHIRLPOOL_1), "COLL_WHIRLPOOL_1 $2c") +check(not Permissions.isWhirlpool(COLL_WATER), "plain water is not one") +check(not Permissions.isWhirlpool(0x33), "and neither is a waterfall") +-- The arm is above the nybble ladder, not part of it: the tile's PERMISSION is +-- still WATER_TILE, which is what lets a surfing player step onto it at all. +check(Permissions.isWater(COLL_WHIRLPOOL), + "a whirlpool is still WATER_TILE, so .CheckSurfable lets the step happen") +eq(Permissions.currentDirection(COLL_WHIRLPOOL), nil, + "and it is not a HI_NYBBLE_CURRENT tile") + +-- ---- Script_ForcedMovement's stream ---------------------------------------- +-- +-- .MovementData_up is `step_dig 16 / turn_in DOWN / step_dig 16 / +-- turn_head DOWN / step_end`, i.e. every byte points BACK the way the player +-- came. turn_head is the $00 family, turn_in the $24 one, step_dig $4f with +-- its frame count in the byte after it (macros/scripts/movement.asm:163-167). +eq(Movement.STEP_DIG, 0x4f, "$4f step_dig") +eq(Movement.STEP_DIG_FRAMES, 16, "and the 16 frames the stream asks it for") +same(Movement.forcedMovementBytes("down"), + { 0x4f, 16, 0x24, 0x4f, 16, 0x00, 0x47 }, + "thrown DOWN: step_dig 16, turn_in DOWN, step_dig 16, turn_head DOWN, end") +same(Movement.forcedMovementBytes("up"), + { 0x4f, 16, 0x25, 0x4f, 16, 0x01, 0x47 }, "thrown UP") +same(Movement.forcedMovementBytes("left"), + { 0x4f, 16, 0x26, 0x4f, 16, 0x02, 0x47 }, "thrown LEFT") +same(Movement.forcedMovementBytes("right"), + { 0x4f, 16, 0x27, 0x4f, 16, 0x03, 0x47 }, "thrown RIGHT") + +-- The middle byte is the one the port used to read as a facing change, which +-- is why the bounce could not exist: turn_in never moved anybody. +for byte, dir in pairs({ [0x24] = "down", [0x25] = "up", + [0x26] = "left", [0x27] = "right" }) do + local act = Movement.decodeByte(byte) + eq(act.kind, "step", ("$%02x turn_in crosses a cell"):format(byte)) + eq(act.dir, dir, ("$%02x turn_in direction"):format(byte)) + eq(act.spin, true, ("$%02x turn_in spins on the way"):format(byte)) +end +eq(Movement.decodeByte(0x20).kind, "step", "$20 turn_away is a step too") +eq(Movement.decodeByte(0x28).kind, "step", "$28 turn_waterfall as well") +-- The neighbours must not have picked the spin up. +eq(Movement.decodeByte(0x0c).spin, nil, "$0c step is a plain step") +eq(Movement.decodeByte(0x10).spin, nil, "$10 big_step too") +eq(Movement.decodeByte(0x00).kind, "turn", "$00 turn_head is still a turn") + +-- ---- the step -------------------------------------------------------------- +-- +-- One whirlpool at (5,5) in an open pond, the way Route 41's four sit: water on +-- every side of them (data/generated/maps.lua, ROUTE_41 (22,12)). +local WHIRL_X, WHIRL_Y = 5, 5 + +local function whirlWorld(px, py, facing, coll) + local game = { + data = { items = {}, moves = {}, pokemon = {} }, + save = { player = { name = "GOLD", badges = {} }, party = {}, + inventory = {} }, + } + local world = World.new(game) + game.world = world + local cells = {} + for y = 0, 9 do + for x = 0, 9 do cells[y * 100 + x] = COLL_WATER end + end + cells[WHIRL_Y * 100 + WHIRL_X] = coll or COLL_WHIRLPOOL + local map + map = { + id = "ROUTE_41", + width = 5, height = 5, + def = { objects = {}, bgEvents = {}, environment = "WATER", + tileset = "TILESET_JOHTO", width = 5, height = 5 }, + cellCollision = function(_, x, y) + return cells[y * 100 + x] or COLL_WATER + end, + inBounds = function(_, x, y) + return x >= 0 and y >= 0 and x < 10 and y < 10 + end, + isWalkable = function(_, x, y) + return Permissions.isWalkable(map:cellCollision(x, y)) + end, + warpAt = function() return nil end, + connection = function() return nil end, + } + world.map = map + world.maps = { ROUTE_41 = map.def } + world.player = Player.new(px, py, facing) + world.entities = { world.player } + world.npcs = {} + world.playerState = FieldMoves.PLAYER_SURF + world.encounters = {} + world.pollTimeOfDay = function() end + -- Nothing here draws, and nothing here is about the wild roll. + world.noWildEncounters = true + world.updatePeople = function() end + return world, game +end + +-- Swim at the whirlpool from `dir` for `frames` with the d-pad held the whole +-- way, the way a player leaning on it does, and report what happened. +local function swimInto(dir, frames) + local DELTA = { up = { 0, -1 }, down = { 0, 1 }, + left = { -1, 0 }, right = { 1, 0 } } + local d = DELTA[dir] + -- Two cells short of the whirlpool, so the approach is an ordinary swim. + local world = whirlWorld(WHIRL_X - d[1] * 2, WHIRL_Y - d[2] * 2, dir) + local p = world.player + local r = { onWhirlpool = false, spun = false, busy = false, past = false } + for _ = 1, frames or 220 do + world.heldDir = dir + world:step() + if p.cellX == WHIRL_X and p.cellY == WHIRL_Y then r.onWhirlpool = true end + if p.spinFrames then r.spun = true end + if world:busy() then r.busy = true end + -- One cell past the whirlpool, on the far side. + if p.cellX == WHIRL_X + d[1] and p.cellY == WHIRL_Y + d[2] then + r.past = true + end + end + r.x, r.y, r.facing = p.cellX, p.cellY, p.facing + return r, world +end + +-- The cart lets the player land on the whirlpool: FORCE_TURN is answered from +-- the tile UNDERFOOT, so the step onto it happens and the bounce follows. +local BACK = { up = "down", down = "up", left = "right", right = "left" } +for _, dir in ipairs({ "up", "down", "left", "right" }) do + local r = swimInto(dir) + check(r.onWhirlpool, + ("swimming %s reaches the whirlpool cell"):format(dir)) + check(not r.past, + ("holding %s never carries the player through it"):format(dir)) + check(r.busy, + ("the forced movement owns the world while it runs (%s)"):format(dir)) + check(r.spun, + ("step_dig put the player under OBJECT_ACTION_SPIN (%s)"):format(dir)) + eq(r.facing, BACK[dir], + ("turn_head leaves the player facing away from it (%s)"):format(dir)) +end + +-- COLL_WHIRLPOOL_1 is the same arm, not a second tile that fell through. +do + local world = whirlWorld(WHIRL_X, WHIRL_Y + 2, "up", COLL_WHIRLPOOL_1) + local p = world.player + local past = false + for _ = 1, 220 do + world.heldDir = "up" + world:step() + if p.cellY < WHIRL_Y then past = true end + end + check(not past, "$2c force-turns exactly like $24") +end + +-- The negative control, and the reason the bug was invisible: the same cell as +-- plain water is swum straight over. +do + local world = whirlWorld(WHIRL_X, WHIRL_Y + 2, "up", COLL_WATER) + local p = world.player + for _ = 1, 220 do + world.heldDir = "up" + world:step() + end + check(p.cellY < WHIRL_Y, "plain water in the same cell still lets us through") + eq(p.spinFrames, nil, "and nothing spins over it") +end + +-- The turn is answered from the tile the player is STANDING on, not from a +-- neighbour: swimming past a whirlpool one cell to the side is untouched. +do + local world = whirlWorld(WHIRL_X - 1, WHIRL_Y + 2, "up") + local p = world.player + for _ = 1, 220 do + world.heldDir = "up" + world:step() + end + eq(p.cellX, WHIRL_X - 1, "the column beside the whirlpool is ordinary water") + check(p.cellY < WHIRL_Y, "and it is swum up without a bounce") +end + +-- The stream is Script_ForcedMovement's own, byte for byte, and it is queued +-- through the same World:beginMovement every applymovement uses -- so the +-- freeze, the follower and the step-end bookkeeping all come along with it. +do + local world = whirlWorld(WHIRL_X, WHIRL_Y, "up") + check(world:runForcedMovement(), "standing on one starts the stream") + check(world.moveState ~= nil, "through an applymovement, not a bespoke path") + same(world.moveState.bytes, Movement.forcedMovementBytes("down"), + "and the bytes are the ones facing UP asks for") + check(world:busy(), "which is what closes the overworld to input") + -- It does not start a second copy over itself. + check(not world:runForcedMovement(), "one stream at a time") +end + +S.finish() diff --git a/tests/mod_graphics_tests.lua b/tests/mod_graphics_tests.lua index 5b9ff89d..1df7cb49 100644 --- a/tests/mod_graphics_tests.lua +++ b/tests/mod_graphics_tests.lua @@ -134,9 +134,7 @@ love.graphics = { -- Fresh copies of the modules that cache a compiled shader or a page set -- at first use, so they see the recorder above -- and so the originals --- every other suite holds never see it. GBCFX is in the list because --- Renderer:endFrame reaches it and parity_gbcfx asserts on its unset --- shader cache. +-- every other suite holds never see it. -- The tile/sprite renderers join them because they report trueColor rects -- to PaletteFX and resolve through Assets, and the loader because it holds -- Assets as an upvalue: an earlier suite's copy of any of the three would @@ -144,7 +142,7 @@ love.graphics = { local savedLoaded = {} for _, name in ipairs({ "src.render.PaletteFX", "src.render.Renderer", "src.render.Font", "src.render.Assets", - "src.render.GBCFX", "src.render.SpriteRenderer", + "src.render.SpriteRenderer", "src.render.TileRenderer", "src.mods.Loader" }) do savedLoaded[name] = package.loaded[name] package.loaded[name] = nil diff --git a/tests/mod_ui_tests.lua b/tests/mod_ui_tests.lua index 29a81a83..4cb7576b 100644 --- a/tests/mod_ui_tests.lua +++ b/tests/mod_ui_tests.lua @@ -285,8 +285,8 @@ local WANT_IDS = { "textSpeed", "animations", "battleStyle", "battleLayout", "battleFit", "battleHud", "battleBg", "uiLayout", "ruleset", "musicVol", "sfxVol", "musicFilter", "performance", "colors", - "tilt", "gbcfx", "zoom", "voidFill", "videoMode", - "faithfulRes", "screenPos", "fpsCap", + "tilt", "shaderfx", "shaderfx2", "zoom", "voidFill", + "videoMode", "faithfulRes", "screenPos", "fpsCap", "speedOverworld", "speedBattle", "speedMenu", "mods", "controls", "dateFormat", "timeFormat" } local function orow(menu, id) @@ -331,7 +331,9 @@ check(om.game.save.options.musicVol == 6, "music volume steps down") for _ = 1, 10 do orow(om, "musicVol").step(om.game, -1) end check(om.game.save.options.musicVol == 0, "music volume clamps at 0") --- ZOOM / VOID FILL rows (looked up by id; WANT_IDS above pins the order) +-- ZOOM / VOID FILL rows (looked up by id; WANT_IDS above pins the order, +-- with SHADER FX / SHADER FX 2 right after TILT now that GBCFX.lua and +-- its row are gone) local Zoom = require("src.render.Zoom") local TileRenderer = require("src.render.TileRenderer") om.game.save.options.zoom = 0 @@ -359,6 +361,39 @@ check(om.game.save.options.voidFill == "black", "VOID FILL steps to BLACK") orow(om, "voidFill").step(om.game, 1) check(om.game.save.options.voidFill == "trees", "VOID FILL wraps to TREES") +-- the SHADER FX row now pushes a real ShaderFXScreen list instead of +-- cycling in place. With no presets under ShaderFX.presetDir() (nothing +-- is dropped in for this stub love.filesystem), the pushed screen must +-- show OFF plus the permanent DOWNLOAD SHADERS row and stay a safe +-- no-op rather than crash. SHADER FX 2 (the dual-shader secondary slot) +-- mirrors it one row down, opening the same shared screen on +-- "secondary" instead. +local ShaderFX = require("src.render.ShaderFX") +check(om.rows[16].id == "shaderfx", "row 16 is the SHADER FX row") +check(om.rows[16].value(om.game) == "OFF", "SHADER FX shows OFF with no presets") +check(om.rows[16].step == nil, "SHADER FX row has no step() any more") +om.rows[16].activate(om.game) +local sfxScreen = om.game.stack:top() +check(sfxScreen and sfxScreen.title == "SHADER FX", + "SHADER FX row.activate() pushes a ShaderFXScreen") +check(#sfxScreen.items == 2 and sfxScreen.items[1].label == "OFF" + and sfxScreen.items[2].download == true, + "ShaderFXScreen shows OFF + DOWNLOAD SHADERS with zero presets found") +sfxScreen.onChoose(sfxScreen.items[1]) +check(ShaderFX.active("main") == false, "choosing OFF on an empty list stays a safe no-op") +check(om.game.stack:top() == nil, "ShaderFXScreen pops itself after onChoose") + +check(om.rows[17].id == "shaderfx2", "row 17 is the SHADER FX 2 row") +check(om.rows[17].value(om.game) == "OFF", "SHADER FX 2 shows OFF with no presets") +om.rows[17].activate(om.game) +local sfx2Screen = om.game.stack:top() +check(sfx2Screen and sfx2Screen.title == "SHADER FX 2", + "SHADER FX 2 row.activate() pushes the shared ShaderFXScreen on the secondary slot") +sfx2Screen.onChoose(sfx2Screen.items[1]) +check(ShaderFX.active("secondary") == false, "choosing OFF on the secondary slot is a safe no-op") +check(ShaderFX.active() == false, "neither slot active means ShaderFX.active() is false") +check(om.game.stack:top() == nil, "the secondary ShaderFXScreen pops itself after onChoose") + -- the MAX FPS row cycles the render-cap steps and shows the value plain om.game.save.options.fpsCap = nil check(orow(om, "fpsCap").value(om.game) == "60", diff --git a/tests/mod_world_tests.lua b/tests/mod_world_tests.lua index ed4b4fbe..f1ea223c 100644 --- a/tests/mod_world_tests.lua +++ b/tests/mod_world_tests.lua @@ -976,8 +976,10 @@ do check(battle.leveledUp and battle.leveledUp[caterpie], "awardExp records the level-up for EvolveAfterBattle") - game.stack:pop() - battle.onFinish("win") + -- EndOfBattle evolves on the battle screen (end_of_battle.asm:42-45), + -- so drive finish() rather than calling onFinish by hand + battle.result = "win" + battle:finish() -- the "is evolving!" box types out and holds DelayFrames 50 before the -- movie (evos_moves.asm:120-134) (#1596), so drive frames to reach it game.input.wasPressed = function() return false end diff --git a/tests/modkit/record.lua b/tests/modkit/record.lua index b573116b..3b7cf6ff 100644 --- a/tests/modkit/record.lua +++ b/tests/modkit/record.lua @@ -61,8 +61,8 @@ function Record.events(target, opts) return capture end --- the sanctioned draw-capture pattern from tests/parity_gbcfx.lua, lifted --- so sprite/tileset mods can assert on what reached the screen +-- the sanctioned love.graphics.draw-capture pattern, lifted so sprite/ +-- tileset mods can assert on what reached the screen function Record.draw() local original = love.graphics.draw local capture = { draws = {} } diff --git a/tests/parity_cycling_road_brake.lua b/tests/parity_cycling_road_brake.lua index 3b1bffc6..de8b9052 100644 --- a/tests/parity_cycling_road_brake.lua +++ b/tests/parity_cycling_road_brake.lua @@ -132,6 +132,9 @@ do o:handleInput() check(not o.player.moving, "and holding A there changes nothing") Input:reset() + -- a scripted step now reads the live bike state (#1754), so do not leak + -- the mount into whatever suite runs next + Game.save.onBike = false end S.finish() diff --git a/tests/parity_escort_lockstep.lua b/tests/parity_escort_lockstep.lua index 4fc567df..2c98f206 100644 --- a/tests/parity_escort_lockstep.lua +++ b/tests/parity_escort_lockstep.lua @@ -50,7 +50,9 @@ local function runEscort(sync, steps) npc.cellX, npc.cellY, npc.px, npc.py = 10, 4, 160, 64 npc.moving, npc.progress, npc.targetX, npc.targetY = false, 0, nil, nil ow.scriptMoves = {} - npc.stepFrames = sync and (p.stepFramesCur or p.stepFrames) or nil + -- a scripted step re-derives its length from the live walk/bike state + -- (home/overworld.asm:276, #1754), so sync off that, not a stale latch + npc.stepFrames = sync and p:stepLength() or nil local worstDrift, done, i = 0, false, 0 local function tick() i = i + 1 diff --git a/tests/parity_gbcfx.lua b/tests/parity_gbcfx.lua deleted file mode 100644 index 891008e6..00000000 --- a/tests/parity_gbcfx.lua +++ /dev/null @@ -1,171 +0,0 @@ --- Parity test, GBC FX ladder (Pixel Transparency shader). --- Unit-tests the Lua-side API of src/render/GBCFX.lua headless under the --- love stub: level clamping, the OFF→1→2→3→4→OFF cycle, options plumbing, --- level labels, and that active()/present() degrade gracefully when the --- stub offers no love.graphics.newShader (shader() returns nil). -package.path = "./?.lua;./?/init.lua;" .. package.path -if not _G.love then _G.love = require("tests.love_stub") end -local S = require("tests.harness").suite("parity gbcfx") -local check, eq = S.check, S.eq - --- === assertions === - -local GBCFX = require("src.render.GBCFX") - --- defaults -eq(GBCFX.level, 0, "gbcfx starts at level 0 (OFF)") -eq(#GBCFX.LABELS, 5, "five labels (OFF + 4 levels)") -eq(GBCFX.LABELS[1], "OFF", "first label is OFF") - --- setLevel clamps and floors -GBCFX.setLevel(2) -eq(GBCFX.level, 2, "setLevel stores an in-range level") -GBCFX.setLevel(-3) -eq(GBCFX.level, 0, "setLevel clamps below to 0") -GBCFX.setLevel(99) -eq(GBCFX.level, 4, "setLevel clamps above to 4") -GBCFX.setLevel(2.9) -eq(GBCFX.level, 2, "setLevel floors fractional levels") -GBCFX.setLevel("3") -eq(GBCFX.level, 3, "setLevel accepts numeric strings") -GBCFX.setLevel(nil) -eq(GBCFX.level, 0, "setLevel(nil) resets to OFF") -GBCFX.setLevel("junk") -eq(GBCFX.level, 0, "setLevel(non-numeric) resets to OFF") - --- cycle wraps OFF→1→2→3→4→OFF and returns the new level -GBCFX.setLevel(0) -eq(GBCFX.cycle(), 1, "cycle OFF -> 1") -eq(GBCFX.cycle(), 2, "cycle 1 -> 2") -eq(GBCFX.cycle(), 3, "cycle 2 -> 3") -eq(GBCFX.cycle(), 4, "cycle 3 -> 4") -eq(GBCFX.cycle(), 0, "cycle 4 wraps to OFF") -eq(GBCFX.level, 0, "cycle leaves the wrapped level stored") - --- applyOptions reads opts.gbcfx -GBCFX.applyOptions({ gbcfx = 3 }) -eq(GBCFX.level, 3, "applyOptions reads opts.gbcfx") -GBCFX.applyOptions({}) -eq(GBCFX.level, 0, "applyOptions without gbcfx resets to OFF") -GBCFX.setLevel(2) -GBCFX.applyOptions(nil) -eq(GBCFX.level, 0, "applyOptions(nil) resets to OFF") - --- labels -eq(GBCFX.levelLabel(0), "OFF", "label for level 0") -eq(GBCFX.levelLabel(1), "1", "label for level 1") -eq(GBCFX.levelLabel(4), "4", "label for level 4") -GBCFX.setLevel(3) -eq(GBCFX.levelLabel(), "3", "levelLabel() defaults to the current level") -eq(GBCFX.levelLabel(42), "OFF", "out-of-range label falls back to OFF") - --- headless: the love stub has no newShader, so the shader never compiles -eq(GBCFX.shader(), nil, "shader() is nil headless") -GBCFX.setLevel(4) -check(not GBCFX.active(), "active() is false headless even at level 4") - --- present() falls back to a plain draw when the shader is unavailable -local drawn = nil -local g = love.graphics -local oldDraw, oldSetColor = g.draw, g.setColor -g.draw = function(c, x, y) drawn = { c, x, y } end -g.setColor = g.setColor or function() end -local canvas = {} -local ok, err = pcall(GBCFX.present, canvas, 5) -g.draw = oldDraw -g.setColor = oldSetColor -check(ok, "present() does not error headless (" .. tostring(err) .. ")") -check(drawn and drawn[1] == canvas and drawn[2] == 0 and drawn[3] == 0, - "present() falls back to a plain draw at (0,0)") - -GBCFX.setLevel(0) - --- issue #136: Android/iOS refuse GBC FX (shader soft-bricks the APK) -check(GBCFX.isSupported(), "desktop / headless stub supports GBC FX") -local prevSystem = love.system -love.system = { getOS = function() return "Android" end } -check(not GBCFX.isSupported(), "Android reports GBC FX unsupported") -GBCFX.setLevel(3) -eq(GBCFX.level, 0, "setLevel forces OFF on Android") -eq(GBCFX.cycle(), 0, "cycle stays OFF on Android") -local opts = { gbcfx = 4 } -check(GBCFX.applyOptions(opts) == true, - "applyOptions reports a cleared persisted level on Android") -eq(opts.gbcfx, 0, "applyOptions clears opts.gbcfx on Android") -eq(GBCFX.level, 0, "applyOptions leaves level OFF on Android") -check(not GBCFX.active(), "active() is false on Android") -eq(GBCFX.shader(), nil, "shader() is nil on Android") -love.system = { getOS = function() return "iOS" end } -check(not GBCFX.isSupported(), "iOS reports GBC FX unsupported") -love.system = prevSystem -check(GBCFX.isSupported(), "support restores when OS stub is removed") --- desktop path still applies a level after leaving the mobile gate -GBCFX.applyOptions({ gbcfx = 2 }) -eq(GBCFX.level, 2, "applyOptions still sets levels on desktop") -GBCFX.setLevel(0) - --- Options menu hides the GBC FX row on Android -local OptionsMenu = require("src.ui.OptionsMenu") -love.system = { getOS = function() return "Android" end } -local om = OptionsMenu.new({ - data = { rulesets = {}, constants = {} }, - save = { options = {} }, - stack = { pop = function() end }, - input = { wasPressed = function() return false end }, - modStatus = { available = {} }, -}) -local hasGbc = false -for _, row in ipairs(om.rows) do - if row.id == "gbcfx" then hasGbc = true end -end -check(not hasGbc, "Options menu omits GBC FX on Android") -love.system = prevSystem - --- POKEPORT_GBCFX overrides the platform default both ways. Handheld packs --- (build-rg34xxsp.sh) export 0 because their getOS() says "Linux" while the --- GPU is phone class; 1 is the escape hatch if a device turns out to cope. -local prevEnv = os.getenv("POKEPORT_GBCFX") -local realGetenv = os.getenv -local stubEnv -os.getenv = function(name) - if name == "POKEPORT_GBCFX" then return stubEnv end - return realGetenv(name) -end - -stubEnv = "0" -check(not GBCFX.isSupported(), "POKEPORT_GBCFX=0 refuses GBC FX on desktop") -GBCFX.setLevel(3) -eq(GBCFX.level, 0, "setLevel forces OFF under POKEPORT_GBCFX=0") -local handheldOpts = { gbcfx = 4 } -check(GBCFX.applyOptions(handheldOpts) == true, - "applyOptions reports a cleared level under POKEPORT_GBCFX=0") -eq(handheldOpts.gbcfx, 0, "applyOptions heals a persisted level on a handheld") -check(not GBCFX.active(), "active() is false under POKEPORT_GBCFX=0") - -local omHandheld = OptionsMenu.new({ - data = { rulesets = {}, constants = {} }, - save = { options = {} }, - stack = { pop = function() end }, - input = { wasPressed = function() return false end }, - modStatus = { available = {} }, -}) -hasGbc = false -for _, row in ipairs(omHandheld.rows) do - if row.id == "gbcfx" then hasGbc = true end -end -check(not hasGbc, "Options menu omits GBC FX under POKEPORT_GBCFX=0") - --- "1" wins over the Android gate, so the override is a real two-way door. -stubEnv = "1" -love.system = { getOS = function() return "Android" end } -check(GBCFX.isSupported(), "POKEPORT_GBCFX=1 forces GBC FX on despite Android") -love.system = prevSystem - -stubEnv = nil -check(GBCFX.isSupported(), "unset POKEPORT_GBCFX falls back to the OS check") -os.getenv = realGetenv -eq(os.getenv("POKEPORT_GBCFX"), prevEnv, "os.getenv restored") -GBCFX.setLevel(0) - --- === summary === -S.finish() diff --git a/tests/parity_rare_candy_menu.lua b/tests/parity_rare_candy_menu.lua index e6c936d6..d9e188da 100644 --- a/tests/parity_rare_candy_menu.lua +++ b/tests/parity_rare_candy_menu.lua @@ -175,7 +175,7 @@ do check(isBox(box), "the last candy levels too") finishLevelUp(game, box) eq(game.stack:top(), list, "the bag stays open after the last candy") - eq(#list.items, 0, "the emptied row left the list") + eq(#list.items, 1, "the emptied row left the list, leaving only CANCEL") eq(game.save.inventory.RARE_CANDY, nil, "no candies left in the inventory") end diff --git a/tests/parity_ss_anne_departure.lua b/tests/parity_ss_anne_departure.lua index f7a196d3..41f42c24 100644 --- a/tests/parity_ss_anne_departure.lua +++ b/tests/parity_ss_anne_departure.lua @@ -83,9 +83,10 @@ do for _, r in ipairs(rowsOfKind(rows, "show_text")) do said[#said + 1] = r[2] end + -- SSAnne2FRivalText's text_asm arms SaveEndBattleTextPointers, so the + -- defeat line prints in battle, not on the map (scripts/SSAnne2F.asm:199) local order = { "_SSAnne2FRivalText", - "_SSAnne2FRivalDefeatedText", "_SSAnne2FRivalCutMasterText", } local pi = 1 @@ -93,7 +94,10 @@ do if pi <= #order and id == order[pi] then pi = pi + 1 end end eq(pi, #order + 1, - ("x=%d text order: greeting, defeated, CUT master"):format(x)) + ("x=%d text order: greeting, then CUT master"):format(x)) + local armed = rowsOfKind(rows, "save_end_battle_text")[1] + check(armed ~= nil and armed[2] == "_SSAnne2FRivalDefeatedText", + ("x=%d arms the defeat line for the battle screen (#1688)"):format(x)) local walk = rowsOfKind(rows, "walk_npc")[1] check(walk ~= nil, ("x=%d exit is a walk_npc list"):format(x)) @@ -123,13 +127,9 @@ local function dockBlock(bx, by) end local function sail(cellX, cellY) - local rows, puffs = nil, 0 + local rows = nil local ow = { player = { cellX = cellX, cellY = cellY }, - startDustAnim = function(_, _, _, done) - puffs = puffs + 1 - if done then done() end - end, queueScript = function(_, r) rows = r end, } local game = { @@ -139,10 +139,15 @@ local function sail(cellX, cellY) story3.VERMILION_DOCK.onEnter(game, ow) check(rows ~= nil, "stepping off the gangway queues the departure") check(game.save.flags.EVENT_SS_ANNE_LEFT == true, "EVENT_SS_ANNE_LEFT set") - eq(puffs, 3, "three funnel smoke puffs (LoadSmokeTileFourTimes)") return rows end +local function kindIndex(rows, kind, from) + for i = from or 1, #rows do + if rows[i][1] == kind then return i end + end +end + do -- the hull ids the slide reuses are the map's own blocks, so a data -- rebuild that renumbered the tileset would be caught here @@ -165,52 +170,25 @@ do local waits = rowsOfKind(rows, "wait") eq(waits[1][2], 120, "120 frames before the first horn") eq(waits[#waits][2], 120, "EraseSSAnne's 120 frames before the walk out") - local slide = 0 - for _, w in ipairs(waits) do - if w[2] == 20 then slide = slide + 1 end - end - eq(slide, 8, "eight column shifts, .shift_columns_up's ld e, $8") - -- the bug was the whole hull blinking to water in a single frame with no - -- travel at all: her bow block has to be written one column further west - -- each step, and the water has to close in astern behind her - local bow, wake = {}, {} - for _, r in ipairs(rowsOfKind(rows, "replace_block")) do - if r[3] == 1 and r[4] == dockBlock(DOCK_HULL.x0, 1) then - bow[#bow + 1] = r[2] - elseif r[3] == 1 and r[4] == 1 then - wake[#wake + 1] = r[2] - end - end - check(dirsEqual(bow, { 4, 3, 2, 1 }), "the bow sails west a column a step") - check(dirsEqual(wake, { 8, 7, 6, 5, 4, 3, 2, 1 }), - "water closes in astern, stern column first") + -- scripts/VermilionDock.asm:50 zeroes wSpritePlayerStateData1ImageIndex and + -- :77 freezes sprite updates: he faces DOWN until he walks out (#1689) + eq(rows[1][1], "face_player_dir", "he is turned before the first delay") + eq(rows[1][2], "down", "and he is turned to face DOWN") - for _, r in ipairs(rowsOfKind(rows, "replace_block")) do - check(r[2] >= 1 and r[2] <= DOCK_HULL.x1, - "the slide stays inside the dock's water, off the pier column 0") - end + -- she used to be shuffled west one whole 32px block per beat, which read as + -- teleporting; .shift_columns_up is a 1px-per-8-frames slide (#1689) + eq(#rowsOfKind(rows, "replace_block"), 0, + "no block shuffle: the hull slides, it does not jump") + eq(#rowsOfKind(rows, "ss_anne_departs"), 1, "one blocking sail-away beat") - -- scripts/VermilionDock.asm:182-203: the tile fill covers the whole ship, - -- the gangway block under the player included (#1211) - local final = {} - for _, r in ipairs(rowsOfKind(rows, "replace_block")) do - final[r[2] .. "," .. r[3]] = r[4] - end - for bx = DOCK_HULL.x0, DOCK_HULL.x1 do - for by = DOCK_HULL.y0, DOCK_HULL.y1 do - check(WATER[final[bx .. "," .. by]], - ("hull block (%d,%d) ends as open water"):format(bx, by)) - end - end - - -- and she has to have travelled: the westmost water column of the map - -- carried hull blocks partway through - local sawWest = false - for _, r in ipairs(rowsOfKind(rows, "replace_block")) do - if r[2] == 1 and not WATER[r[4]] then sawWest = true end - end - check(sawWest, "the hull reaches the west edge of the water before it goes") + local horn1 = kindIndex(rows, "play_sound") + local sailIdx = kindIndex(rows, "ss_anne_departs") + local horn2 = kindIndex(rows, "play_sound", (horn1 or 0) + 1) + check(horn1 and sailIdx and horn2 and horn1 < sailIdx and sailIdx < horn2, + "horn, then she sails, then the horn again") + check(kindIndex(rows, "warp") > sailIdx, + "the walk out only starts once she has gone") end do diff --git a/tests/parity_ss_anne_guard.lua b/tests/parity_ss_anne_guard.lua index 8ad004c5..30cc7efb 100644 --- a/tests/parity_ss_anne_guard.lua +++ b/tests/parity_ss_anne_guard.lua @@ -66,6 +66,7 @@ local function gameWith(opts) _VermilionCitySailor1YouNeedATicketText = "You need a ticket\nto get aboard.", _VermilionCitySailor1ShipSetSailText = "The ship set sail.", + _VermilionCitySailor1WelcomeToSSAnneText = "Welcome to S.S.\nANNE!", _SSAnneCaptainsRoomRubCaptainsBackText = "Rub-rub...", _SSAnneCaptainsRoomCaptainIFeelMuchBetterText = "I feel better!", _SSAnneCaptainsRoomCaptainReceivedHM01Text = "Got HM01!", @@ -143,25 +144,36 @@ do check(#pushed == 0, "no spurious dialog off the check") end --- Sailor talk after ship left: ShipSetSail branch (row script). +-- Sailor talk: once she has sailed he only reports it gone, and before +-- that an A press is the plain greeting, never the ticket check (#1651). +-- scripts/VermilionCity.asm:158-198 do - local ScriptRunner = require("src.script.ScriptRunner") - local game = gameWith({ flags = { EVENT_SS_ANNE_LEFT = true } }) - local rows = city.talk.TEXT_VERMILIONCITY_SAILOR1 - local runner = ScriptRunner.new(game, nil) - runner:run(rows, {}) - local guard = 0 - while runner:isRunning() and guard < 200 do - guard = guard + 1 - if game.stack and game._pushed then - local box = game._pushed[#game._pushed] - if box and box.done then box.done() end - end - runner:update() - end - local last = game._pushed[#game._pushed] - eq(last and last.text, "The ship set sail.", + local talk = city.talk.TEXT_VERMILIONCITY_SAILOR1 + local game, pushed = gameWith({ flags = { EVENT_SS_ANNE_LEFT = true } }) + talk(game, owWith({}), nil, function() end) + eq(pushed[#pushed] and pushed[#pushed].text, "The ship set sail.", "talk after ship left shows ShipSetSail") + + game, pushed = gameWith({}) + local ow = owWith({}) + ow.player.cellX, ow.player.cellY, ow.player.facing = 18, 30, "right" + talk(game, ow, nil, function() end) + eq(pushed[#pushed] and pushed[#pushed].text, "Welcome to S.S.\nANNE!", + "facing him from the west is the plain greeting, no ticket check") + + game, pushed = gameWith({}) + ow = owWith({}) + ow.player.cellX, ow.player.cellY, ow.player.facing = 19, 29, "down" + talk(game, ow, nil, function() end) + eq(pushed[#pushed] and pushed[#pushed].text, "Welcome to S.S.\nANNE!", + "talking from in front of him is the plain greeting too") + + game, pushed = gameWith({}) + ow = owWith({}) + ow.player.cellX, ow.player.cellY, ow.player.facing = 19, 31, "up" + talk(game, ow, nil, function() end) + eq(pushed[#pushed] and pushed[#pushed].text, "Welcome to S.S.\nANNE!", + "and from behind him") end -- Departure cutscene: Music_Surfing + EVENT_SS_ANNE_LEFT via Flags.set. @@ -180,22 +192,22 @@ do check(ow._queued ~= nil, "departure queues the sail-away script") -- #360: the surf override must NOT ride into Vermilion City, and she -- sails west block by block - local kept, horns, slid, underPlayer = false, 0, 0, false + local kept, horns, sails, shuffled, faced = false, 0, 0, 0, false for _, row in ipairs(ow._queued or {}) do if row[1] == "play_music" and row[3] and row[3].keep then kept = true end if row[1] == "play_sound" and row[2] == "SS_Anne_Horn" then horns = horns + 1 end - if row[1] == "replace_block" then - slid = slid + 1 - if row[2] == 7 and row[3] == 1 then underPlayer = true end - end + if row[1] == "ss_anne_departs" then sails = sails + 1 end + if row[1] == "replace_block" then shuffled = shuffled + 1 end + if row[1] == "face_player_dir" and row[2] == "down" then faced = true end end eq(kept, false, "departure lets VERMILION_CITY's own theme take the warp") eq(horns, 2, "the horn blows before and after she sails") - check(slid > 8, "she sails west block by block instead of vanishing") - -- scripts/VermilionDock.asm:182-203 (#1211) - eq(underPlayer, true, "the gangway block under the player is erased too") + eq(sails, 1, "she slides west as one animation, not a block shuffle") + eq(shuffled, 0, "and no hull block is stamped across the dock any more") + -- scripts/VermilionDock.asm:50 (#1689) + eq(faced, true, "he keeps facing down until he walks out") end -- Captain rub jingle: play_once Music_PkmnHealed sits after the rub text. diff --git a/tests/parity_trainer_evolution_order.lua b/tests/parity_trainer_evolution_order.lua index d457f4bc..ba4a7af0 100644 --- a/tests/parity_trainer_evolution_order.lua +++ b/tests/parity_trainer_evolution_order.lua @@ -1,6 +1,5 @@ --- A trainer script's post-battle text must finish before a level evolution. --- Its start_battle row resumes the script after OverworldState:afterBattle, --- so this covers the same handoff used by trainer and Rocket encounters. +-- EndOfBattle evolves on the battle screen, before the map comes back +-- (engine/battle/end_of_battle.asm:42-45) (#1656) package.path = "./?.lua;./?/init.lua;" .. package.path if not _G.love then _G.love = require("tests.love_stub") end @@ -77,13 +76,9 @@ check(#Game.stack.states == 1, Game.stack:pop() moreText.onDone() --- The evolution runs as the EvolutionState cutscene screen now (the --- evolve_mon.asm sequence lives in src/ui/EvolutionState.lua), not a bare --- "evolving!" text box, so assert the screen itself took the stack. -local evolution = Game.stack:top() -check(evolution ~= nil - and (evolution.screenId == "EvolutionState" - or stateHas(evolution, "evolving")), - "the level evolution starts after trainer after-text closes") +-- The evolution belongs to the battle screen (BattleState:finish -> +-- Evolution.checkParty), so afterBattle leaves nothing behind the text. +check(#Game.stack.states == 0, + "afterBattle pushes no evolution; the battle screen already ran it") S.finish() diff --git a/tests/parity_trashcans.lua b/tests/parity_trashcans.lua index 3abda268..a8d063f5 100644 --- a/tests/parity_trashcans.lua +++ b/tests/parity_trashcans.lua @@ -59,6 +59,7 @@ local textBoxStub = { end, } local realTextBox = getUpvalue(OW.trashCanSwitch, "TextBox") +textBoxStub.soundOpts = realTextBox.soundOpts local fakeGame = { data = Data, save = SaveData.newGame(), stack = { push = function() end } } check(setUpvalue(OW.trashCanSwitch, "TextBox", textBoxStub), "TextBox upvalue rewired") check(setUpvalue(OW.trashCanSwitch, "Game", fakeGame), "Game upvalue rewired") diff --git a/tests/pet_cries_test.lua b/tests/pet_cries_test.lua new file mode 100644 index 00000000..89f07aaa --- /dev/null +++ b/tests/pet_cries_test.lua @@ -0,0 +1,157 @@ +-- Pet-NPC cries: #1687 (S.S. Anne WIGGLYTUFF + MACHOKE) and #1649 +-- (Vermilion PIDGEY, Vermilion City MACHOP, Fan Club PIKACHU + SEEL). +-- Commands.play_cry only arms the very next show_text, so what is asserted +-- here is placement: one play_cry row, the right species, the waitForButton +-- form, sitting immediately before the box it belongs to. The sound itself +-- is a driver's job (tests/drivers/pet_cries_bug1687_1649_test.lua). +-- Self-contained: `luajit tests/pet_cries_test.lua`. +package.path = "./?.lua;./?/init.lua;" .. package.path +if not _G.love then _G.love = require("tests.love_stub") end + +local Data = require("src.core.Data") +if not (Data.maps and Data.maps.PALLET_TOWN) then Data:load() end +local init = require("data.scripts.init") +local GameVersion = require("src.core.GameVersion") +local S = require("tests.harness").suite("pet cries") +local check, eq = S.check, S.eq + +local yellow = GameVersion.isYellow() + +-- pokered/scripts/*.asm, PlayCry line in brackets: +-- SSAnne1FRooms.asm:66 [:70], SSAnneB1FRooms.asm:82 [:86], +-- VermilionPidgeyHouse.asm:15 [:19], VermilionCity.asm:224 [:228], +-- PokemonFanClub.asm:71 [:76] and :84 [:89]. +local PETS = { + { map = "SS_ANNE_1F_ROOMS", const = "TEXT_SSANNE1FROOMS_WIGGLYTUFF", + object = "SSANNE1FROOMS_WIGGLYTUFF", species = "WIGGLYTUFF", + label = "_SSAnne1FRoomsWigglytuffText" }, + { map = "SS_ANNE_B1F_ROOMS", const = "TEXT_SSANNEB1FROOMS_MACHOKE", + object = "SSANNEB1FROOMS_MACHOKE", species = "MACHOKE", + label = "_SSAnneB1FRoomsMachokeText" }, + { map = "VERMILION_PIDGEY_HOUSE", const = "TEXT_VERMILIONPIDGEYHOUSE_PIDGEY", + object = "VERMILIONPIDGEYHOUSE_PIDGEY", species = "PIDGEY", + label = "_VermilionPidgeyHousePidgeyText" }, + -- the cry belongs to the first box; the stomping line is a second box + -- with no cry of its own (VermilionCity.asm:233 .StompingTheLandFlatText) + { map = "VERMILION_CITY", const = "TEXT_VERMILIONCITY_MACHOP", + object = "VERMILIONCITY_MACHOP", species = "MACHOP", + label = "_VermilionCityMachopText", + after = "_VermilionCityMachopStompingTheLandFlatText" }, + { map = "POKEMON_FAN_CLUB", const = "TEXT_POKEMONFANCLUB_SEEL", + object = "POKEMONFANCLUB_SEEL", species = "SEEL", + label = "_PokemonFanClubSeelText" }, +} + +if yellow then + PETS[#PETS + 1] = { + map = "POKEMON_FAN_CLUB", const = "TEXT_POKEMONFANCLUB_CLEFAIRY", + object = "POKEMONFANCLUB_CLEFAIRY", species = "CLEFAIRY", + label = "_PokemonFanClubClefairyText", + } +else + PETS[#PETS + 1] = { + map = "POKEMON_FAN_CLUB", const = "TEXT_POKEMONFANCLUB_PIKACHU", + object = "POKEMONFANCLUB_PIKACHU", species = "PIKACHU", + label = "_PokemonFanClubPikachuText", + } +end + +local function rowsOf(script) + local plays, texts = {}, {} + for i, row in ipairs(script) do + if type(row) == "table" then + if row[1] == "play_cry" then plays[#plays + 1] = i end + if row[1] == "show_text" then texts[#texts + 1] = i end + end + end + return plays, texts +end + +for _, pet in ipairs(PETS) do + local tag = pet.map .. "/" .. pet.const + local script = init.talkScript(pet.map, pet.const) + if check(type(script) == "table", tag .. " has a ported talk script") then + local plays = rowsOf(script) + if eq(#plays, 1, tag .. " carries exactly one play_cry row") then + local cry = script[plays[1]] + eq(cry[2], pet.species, tag .. " cries " .. pet.species) + -- the waitForButton form: without it the box pops itself when the + -- cry ends instead of holding for A/B (Commands.play_cry, #247/#251) + eq(cry[3], true, tag .. " uses the waitForButton play_cry form") + -- play_cry arms ctx.pendingCry for the NEXT show_text only, so the + -- box it belongs to has to be the very next row + local next_ = script[plays[1] + 1] + check(type(next_) == "table" and next_[1] == "show_text" + and next_[2] == pet.label, + tag .. " arms " .. pet.label .. " on the next row") + end + if pet.after then + local _, texts = rowsOf(script) + eq(#texts, 2, tag .. " still shows both of its boxes") + local last = texts[#texts] + eq(script[last][2], pet.after, tag .. " keeps " .. pet.after .. " last") + end + end + + check(Data.pokemon[pet.species] ~= nil, pet.species .. " is a known species") + check(Data.audio.cries and Data.audio.cries[pet.species] ~= nil, + pet.species .. " has a cry program in the mounted cache") + local text = Data.text[pet.label] + check(type(text) == "string" and text ~= "", + pet.label .. " resolves to text") + + -- a script nobody can reach is the same silence as a missing cry + local objects = (Data.maps[pet.map] or {}).objects or {} + local found + for _, o in ipairs(objects) do + if o.name == pet.object then found = o end + end + if check(found ~= nil, pet.map .. " still lists " .. pet.object) then + eq(found.text, pet.const, pet.object .. " talks through " .. pet.const) + end +end + +-- Yellow swaps the Fan Club pet for a CLEFAIRY on its own text constant +-- (pokeyellow/data/maps/objects/PokemonFanClub.asm), so the extra row has +-- to be version-gated in both directions. +if yellow then + check(init.talkScript("POKEMON_FAN_CLUB", "TEXT_POKEMONFANCLUB_CLEFAIRY") ~= nil, + "Yellow registers the CLEFAIRY pet") +else + check(init.talkScript("POKEMON_FAN_CLUB", "TEXT_POKEMONFANCLUB_CLEFAIRY") == nil, + "Red/Blue do not register Yellow's CLEFAIRY pet") +end + +-- The Yellow half of that guard, checked from any version: re-read the +-- module with isYellow forced on, then put package.loaded back exactly as +-- it was so the registry keeps pointing at the table it merged. +do + local key = "data.scripts.flavor.pokemon_fan_club" + local cached = package.loaded[key] + local realIsYellow = GameVersion.isYellow + GameVersion.isYellow = function() return true end + package.loaded[key] = nil + local ok, module = pcall(require, key) + GameVersion.isYellow = realIsYellow + package.loaded[key] = cached + if check(ok, "the Fan Club script loads with isYellow forced on") then + local row = module.POKEMON_FAN_CLUB.talk.TEXT_POKEMONFANCLUB_CLEFAIRY + if check(type(row) == "table", "the Yellow branch adds the CLEFAIRY pet") then + eq(row[1][1], "play_cry", "Yellow CLEFAIRY leads with play_cry") + eq(row[1][2], "CLEFAIRY", "Yellow CLEFAIRY cries CLEFAIRY, not PIKACHU") + eq(row[1][3], true, "Yellow CLEFAIRY uses the waitForButton form") + eq(row[2][2], "_PokemonFanClubClefairyText", + "Yellow CLEFAIRY arms its own text") + end + end +end + +-- Sound.playCry hands PIKACHU to the PCM clips whenever the cache has +-- them, which is Yellow's voiced cry. Red/Blue must never reach that +-- branch: audio.pikaCries is the only thing gating it. +if not yellow then + check(Data.audio.pikaCries == nil, + "a non-Yellow cache has no Pikachu voice clips for playCry to find") +end + +S.finish() diff --git a/tests/run_tests.lua b/tests/run_tests.lua index 2b271766..b778adaf 100644 --- a/tests/run_tests.lua +++ b/tests/run_tests.lua @@ -1223,8 +1223,8 @@ do local mhc = BattleState.newWild(Game, "SNORLAX", 40) mhc.rng = mkseq({ 0, 255 }) -- acc, damage; crit from the hook mhc:performMove(mhc.player, mhc.enemy, { id = "DOUBLE_KICK", pp = 10 }) - eq(countText(mhc, "Critical hit!"), 2, - "multi-hit prints Critical hit! once per strike") + eq(countText(mhc, "Critical hit!"), 1, + "PrintCriticalOHKOText clears wCriticalHitOrOHKO, so the crit line prints once") local cseq = {} for _, r in ipairs(mhc.queue) do if r.anim == "DOUBLE_KICK" then cseq[#cseq + 1] = "anim" @@ -1233,8 +1233,8 @@ do elseif r.text == "It's super\neffective!" then cseq[#cseq + 1] = "se" end end - eq(table.concat(cseq, ","), "anim,drain,crit,se,anim,drain,crit,se", - "crit then effectiveness follow each multi-hit drain") + eq(table.concat(cseq, ","), "anim,drain,crit,se,anim,drain,se", + "the crit line prints once, effectiveness after every drain") unsub() Runtime.install(savedE, savedH) end @@ -1658,7 +1658,7 @@ do rep.options = { textSpeed = 3, animations = false, battleStyle = "SET", ruleset = "gen1_faithful", musicVol = 4, sfxVol = 2, musicFilter = 2, - colors = "og", tilt = 2, gbcfx = 3, + colors = "og", tilt = 2, } rep.defeatedTrainers = { ["OPP_BROCK:1"] = true } rep.pokedex = { seen = { PIKACHU = true, CATERPIE = true }, @@ -1687,7 +1687,6 @@ do eq(back.options.animations, false, "options.lua round-trips animations") eq(back.options.colors, "og", "options.lua round-trips colors") eq(back.options.tilt, 2, "options.lua round-trips tilt") - eq(back.options.gbcfx, 3, "options.lua round-trips gbcfx") -- zoom / voidFill ride the same options.lua path when present rep.options.zoom = -2 rep.options.voidFill = "water" @@ -2315,6 +2314,14 @@ do press("down") press("down") press("a") -- QUIT + check(not quitCalled, "QUIT says goodbye before it returns (pokemart.asm:220)") + local goodbye = StateStack:top() + check(goodbye ~= shop and goodbye.isTextBox, + "QUIT prints _PokemartThankYouText") + for _ = 1, 600 do + if quitCalled then break end + press("a") + end check(quitCalled, "QUIT fires onQuit (script runner resume)") eq(#StateStack.states, depth0, "mart menu unwound cleanly") end @@ -2635,14 +2642,14 @@ do -- option boxes (the port rows plus the MODS/CONTROLS entries) through a 4-box -- viewport with a $EE ▼ marker; MUSIC VOL / SFX VOL clamp at 0..7 like -- the text-speed cursor clamps at its ends (.pressedLeftInTextSpeed), --- MUSIC FILTER cycles OFF/1X/2X/3X, and COLORS / TILT / GBC FX / VIDEO MODE --- cycle their display modes. +-- MUSIC FILTER cycles OFF/1X/2X/3X, and COLORS / TILT / VIDEO MODE +-- cycle their display modes (SHADER FX activates a pushed screen instead). do local OptionsMenu = require("src.ui.OptionsMenu") local OInput = require("src.core.Input") local PaletteFX = require("src.render.PaletteFX") local Tilt = require("src.render.Tilt") - local GBCFX = require("src.render.GBCFX") + local ShaderFX = require("src.render.ShaderFX") local GameSpeed = require("src.core.GameSpeed") local FrameCap = require("src.core.FrameCap") local SD = require("src.core.SaveData") @@ -2681,7 +2688,6 @@ do "new saves default to MEDIUM text (InitOptions TEXT_DELAY_MEDIUM)") eq(og.save.options.colors, "gbc", "new saves default COLORS to GBC") eq(og.save.options.tilt, 0, "new saves default TILT to OFF") - eq(og.save.options.gbcfx, 0, "new saves default GBC FX to OFF") eq(og.save.options.zoom, 0, "new saves default ZOOM to FIT") eq(og.save.options.voidFill, "trees", "new saves default VOID FILL to TREES") eq(og.save.options.videoMode, "windowed", @@ -2725,12 +2731,22 @@ do eq(Tilt.level, 1, "Tilt level tracks TILT option") press("a"); press("a"); press("a") eq(og.save.options.tilt, 0, "TILT wraps back to OFF") - check(seek("gbcfx"), "cursor reaches GBC FX") - press("a") - eq(og.save.options.gbcfx, 1, "A cycles GBC FX to 1") - eq(GBCFX.level, 1, "GBCFX level tracks GBC FX option") - for _ = 1, 4 do press("a") end - eq(og.save.options.gbcfx, 0, "GBC FX wraps back to OFF") + check(seek("shaderfx"), "cursor reaches SHADER FX") + -- this row activates a pushed ShaderFXScreen rather than cycling in + -- place like the rest of this suite's rows; `og.stack` above only + -- stubs `pop`, not a real push/top stack, so activate() is not + -- called here -- tests/mod_ui_tests.lua exercises it end to end against + -- a real stack. + check(om.rows[om.index].step == nil, "SHADER FX row has no step()") + check(type(om.rows[om.index].activate) == "function", + "SHADER FX row has an activate()") + check(seek("shaderfx2"), "cursor reaches SHADER FX 2") + -- the dual-shader secondary slot: same shared ShaderFXScreen, opened on + -- "secondary" instead -- see the SHADER FX row above for why activate() + -- isn't exercised against this stub stack either. + check(om.rows[om.index].step == nil, "SHADER FX 2 row has no step() either") + check(type(om.rows[om.index].activate) == "function", + "SHADER FX 2 row has an activate()") check(seek("zoom"), "cursor reaches ZOOM") local ZoomOpt = require("src.render.Zoom") press("a") @@ -2806,7 +2822,7 @@ do require("src.core.Sound").applyOptions(og.save.options) PaletteFX.applyOptions(og.save.options) Tilt.applyOptions(og.save.options) - GBCFX.applyOptions(og.save.options) + ShaderFX.applyOptions(og.save.options) require("src.render.Zoom").applyOptions(og.save.options) require("src.render.TileRenderer").applyOptions(og.save.options) require("src.core.VideoMode").applyOptions(og.save.options) @@ -3354,7 +3370,7 @@ end -- ---------------------------------------------- suite discovery -- The chains below used to be hard-coded arrays, so adding a suite meant -- editing a list and forgetting to meant the suite silently never ran. --- They are globbed now (21-testing-and-ci §CI). +-- They're globbed now instead. -- -- Order still matters: these suites share one process and one Data, and -- the sequence they were chained in is the sequence they are known to @@ -3395,10 +3411,6 @@ end -- back. Nothing notices until a LATER file reads the leftover, and then the -- failure lands nowhere near its cause: -- --- * the Android ROM-importer suites pin getOS to "Android", so --- GBCFX.isSupported() answers false for the rest of the run and --- parity_gbcfx fails "setLevel stores an in-range level (got 0, want 2)" --- -- while passing perfectly on its own; -- * suites that swap in a minimal love.filesystem drop -- getDirectoryItems, so three rom_importer suites then die on -- "attempt to call field 'getDirectoryItems' (a nil value)". @@ -3621,6 +3633,19 @@ runSuites(orderedGlob( "tests/gen2_crystal_anim_test.lua", "tests/gen2_crystal_caught_data_test.lua", "tests/gen2_crystal_gender_test.lua", + -- Pinned in the order the glob already ran them in, alphabetically last. + "tests/gen2_battle_cursor_test.lua", + "tests/gen2_battle_options_test.lua", + "tests/gen2_billspc_dpad_test.lua", + "tests/gen2_box_intake_test.lua", + "tests/gen2_cycling_road_test.lua", + "tests/gen2_dex_gift_test.lua", + "tests/gen2_ledge_hop_test.lua", + "tests/gen2_ow_bounce_test.lua", + "tests/gen2_pack_rows_test.lua", + "tests/gen2_sleep_counter_test.lua", + "tests/gen2_timed_heal_test.lua", + "tests/gen2_whirlpool_test.lua", }, LEAKS_SAVE_SLOT_STATE)) -- ---------------------------------------------- Android second ROM pick (#167) @@ -3638,6 +3663,8 @@ runSuites({ "tests/rom_importer_choose_version_test.lua" }) -- platform_nx_* / rom_importer_nx_* live in tests/engine/ (ROM-free T2) so -- CI's headless lane runs them without data/generated/. runSuites({ "tests/launcher_mods_install_zip_test.lua" }) +-- ---------------------------------------------- pet Pokemon cries (#1687, #1649) +runSuites({ "tests/pet_cries_test.lua" }) -- ---------------------------------------------- parity workstream tests -- Each tests/parity_*.lua is a self-contained file (own bootstrap + check, -- error()s if any assertion fails). Globbed, so dropping a new parity @@ -3656,7 +3683,6 @@ runSuites(orderedGlob("tests/parity_*.lua", { "tests/parity_yellow_bills_pikachu.lua", "tests/parity_trainer_evolution_order.lua", "tests/parity_intro.lua", "tests/parity_tilt.lua", - "tests/parity_gbcfx.lua", })) -- ---------------------------------------------- the globbed tiers diff --git a/tests/switch_transfer_docs_test.lua b/tests/switch_transfer_docs_test.lua index 6dbe1198..71596684 100644 --- a/tests/switch_transfer_docs_test.lua +++ b/tests/switch_transfer_docs_test.lua @@ -66,7 +66,6 @@ mustContain(install, "Select + **A**", "install") mustContain(install, "Select + **L**", "install") mustContain(install, "COLORS", "install") mustContain(install, "TILT", "install") -mustContain(install, "GBC FX", "install") mustContain(install, "PERFORMANCE", "install") mustContain(install, "Stock engine effect", "install") mustContain(install, "## Limitations", "install") diff --git a/tools/cartkit.py b/tools/cartkit.py index b1febf74..0e1db64a 100644 --- a/tools/cartkit.py +++ b/tools/cartkit.py @@ -58,7 +58,10 @@ BUNDLE_VERSION = 1 CART_SCHEMA = 1 BASES = ("red", "blue", "yellow", "gold", "silver", "crystal") -SEALS = ("sealed", "open") +SEALS = ("sealed", "sealed+", "open") +FINISHES = ("sparkle", "holo", "sparkle+holo") +# GameSpeed.LEVELS (src/core/GameSpeed.lua) +SPEED_LEVELS = (1, 2, 3, 4, 10, 20, 30, 50, 75, 100, 200) SOURCES = ("github", "gamebanana") MAX_MODS = 64 MAX_OPTIONS = 64 @@ -67,9 +70,10 @@ LABEL_WARN_BYTES = 256 * 1024 LABEL_MAX_BYTES = 1024 * 1024 CART_KEYS = ("schema", "id", "title", "version", "author", "repo", "summary", - "shell", "label", "base", "engine", "seal", "mods", "load_order") + "shell", "finish", "label", "base", "engine", "seal", "speeds", + "mods", "load_order") MOD_KEYS = ("id", "source", "repo", "version", "sha256", "mod", "file", "md5", - "options") + "enabled", "options") ID_RE = re.compile(r"[A-Za-z0-9_-]{1,64}") SEMVER_RE = re.compile( @@ -338,7 +342,21 @@ def check_identity(cart, findings): seal = cart.get("seal", "sealed") if seal not in SEALS: - findings.append(err("CK002", '"seal" must be "sealed" or "open"')) + findings.append(err("CK002", '"seal" must be one of: ' + + ", ".join(SEALS))) + finish = cart.get("finish") + if finish is not None and finish not in FINISHES: + findings.append(err("CK002", '"finish" must be one of: ' + + ", ".join(FINISHES))) + speeds = cart.get("speeds") + if speeds is not None: + if not isinstance(speeds, list) or not speeds: + findings.append(err("CK002", + '"speeds" must be a non-empty array')) + elif any(v not in SPEED_LEVELS for v in speeds): + findings.append(err("CK002", '"speeds" entries must be game-speed ' + 'levels: ' + + ", ".join(str(v) for v in SPEED_LEVELS))) for key in cart: if key not in CART_KEYS: @@ -424,6 +442,9 @@ def check_mods(cart, findings): check_github_pin(entry, label, findings) else: check_gamebanana_pin(entry, label, findings) + if "enabled" in entry and not isinstance(entry["enabled"], bool): + findings.append(err("CK004", f"{label} enabled must be true or " + "false; omit it to ship the mod on")) if "options" in entry and entry["options"] is not None: for problem in option_problems(entry["options"], label): findings.append(err("CK004", problem)) diff --git a/tools/crystal_movie_symbols.py b/tools/crystal_movie_symbols.py index 82d8a12e..8fec9ce5 100644 --- a/tools/crystal_movie_symbols.py +++ b/tools/crystal_movie_symbols.py @@ -62,10 +62,12 @@ TITLE_SYMBOLS = [ "TitleScreenPalettes", ] -# engine/movie/splash.asm:344 -- replaces Gold's GameFreakLogoStarsGFX +# engine/movie/splash.asm:344 -- replaces Gold's GameFreakLogoStarsGFX. +# The Ditto OBJ palette is a local label (engine/gfx/cgb_layouts.asm:876-893). SPLASH_SYMBOLS = [ "GameFreakDittoGFX", "GameFreakDittoPaletteFade", + "_CGB_GamefreakLogo.GamefreakDittoPalette", ] MOVIE_SYMBOLS = ( diff --git a/tools/crystal_symbol_deltas.py b/tools/crystal_symbol_deltas.py index 800da88d..047dc1e3 100644 --- a/tools/crystal_symbol_deltas.py +++ b/tools/crystal_symbol_deltas.py @@ -1,6 +1,6 @@ """REQUIRED_SYMBOLS delta between pokegold.sym and pokecrystal.sym. -make_gold_manifest.REQUIRED_SYMBOLS names 340 symbols by hand. 25 of them do +make_gold_manifest.REQUIRED_SYMBOLS names 341 symbols by hand. 25 of them do not exist in pokecrystal.sym: Crystal renamed the credits mons, split the trainer-card / Pokegear / pack-pals blocks by player gender, split the two FontsExtra tiles apart, and replaced the whole Gold/Silver intro movie and @@ -54,6 +54,8 @@ ADD_SYMBOLS = frozenset({ "MalePokegearPals", "FemalePokegearPals", # engine/gfx/cgb_layouts.asm:818,821 "_CGB_PackPals.ChrisPackPals", "_CGB_PackPals.KrisPackPals", + # engine/events/fishing_gfx.asm:41 -- Kris' half of the fishing pose. + "KrisFishingGFX", # gfx/font.asm:51,63 -- black is 1bpp at tile $60, up_arrow 2bpp at $61. "FontsExtra_SolidBlackGFX", "FontsExtra2_UpArrowGFX", # main.asm:425-448 -- the pic-animation pointer tables, absent from Gold. diff --git a/tools/make_gold_manifest.py b/tools/make_gold_manifest.py index 5f48fb3b..e9564f9e 100644 --- a/tools/make_gold_manifest.py +++ b/tools/make_gold_manifest.py @@ -840,6 +840,9 @@ REQUIRED_SYMBOLS = { # who just spotted the player, and the other faces scripts use. "ShockEmote", "QuestionEmote", "HappyEmote", "SadEmote", "HeartEmote", "BoltEmote", "SleepEmote", "FishEmote", + # gfx/overworld/chris_fish.2bpp (engine/events/fishing_gfx.asm:23): the + # fishing pose rows and the rod tiles FacingFish* parks by the player. + "FishingGFX", # The Pokecenter heal machine's OBJ art (engine/events/ # heal_machine_anim.asm): two tiles -- the machine's light ($7c) and the # ball ($7d) -- plus the CGB palette .LoadPalettes copies over diff --git a/tools/rom_manifest_crystal.json b/tools/rom_manifest_crystal.json index e1b7609d..260b93f7 100644 --- a/tools/rom_manifest_crystal.json +++ b/tools/rom_manifest_crystal.json @@ -15796,6 +15796,10 @@ 36, 25736 ], + "FishingGFX": [ + 46, + 17650 + ], "FlaaffyBackpic": [ 85, 16753 @@ -16908,6 +16912,10 @@ 34, 17813 ], + "KrisFishingGFX": [ + 46, + 17794 + ], "KrisPic": [ 34, 19385 @@ -20940,6 +20948,10 @@ 2, 20822 ], + "_CGB_GamefreakLogo.GamefreakDittoPalette": [ + 2, + 21793 + ], "_CGB_PackPals.ChrisPackPals": [ 2, 21561 diff --git a/tools/rom_manifest_gold.json b/tools/rom_manifest_gold.json index 333445da..e42afb81 100644 --- a/tools/rom_manifest_gold.json +++ b/tools/rom_manifest_gold.json @@ -14072,6 +14072,10 @@ 36, 27127 ], + "FishingGFX": [ + 20, + 17792 + ], "FlaaffyBackpic": [ 25, 23889 diff --git a/tools/rom_manifest_silver.json b/tools/rom_manifest_silver.json index 0b869a25..789fb014 100644 --- a/tools/rom_manifest_silver.json +++ b/tools/rom_manifest_silver.json @@ -14072,6 +14072,10 @@ 36, 27127 ], + "FishingGFX": [ + 20, + 17792 + ], "FlaaffyBackpic": [ 25, 24656 diff --git a/tools/shaderfx-bridge/.gitignore b/tools/shaderfx-bridge/.gitignore new file mode 100644 index 00000000..2f7896d1 --- /dev/null +++ b/tools/shaderfx-bridge/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/tools/shaderfx-bridge/Cargo.lock b/tools/shaderfx-bridge/Cargo.lock new file mode 100644 index 00000000..3f3652bc --- /dev/null +++ b/tools/shaderfx-bridge/Cargo.lock @@ -0,0 +1,955 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bit-set" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2f926cc3060f09db9ebc5b52823d85268d24bb917e472c0c4bea35780a7d" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "cc" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "glslang" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0db73ac0e8bd6f9c253b70205f2bb1c63845b6e263665ac8063316ce16f408c8" +dependencies = [ + "bitflags", + "glslang-sys", + "rustc-hash 2.1.3", + "smartstring", + "thiserror 2.0.20", +] + +[[package]] +name = "glslang-sys" +version = "0.8.1+275822a" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec80baca8831e8414db40c562fd76ca6a32a792c1db990451d4e7d3cb246e1ed" +dependencies = [ + "cc", + "glob", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "serde", + "zerocopy", +] + +[[package]] +name = "halfbrown" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed2f2edad8a14c8186b847909a41fbb9c3eafa44f88bd891114ed5019da09" +dependencies = [ + "hashbrown 0.16.1", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "librashader-common" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75fcb7b016f592e08241eb627ab94d8b2e435769b99f2705a2ba11c063a1b5fc" +dependencies = [ + "bitflags", + "halfbrown", + "num-traits", + "rustc-hash 2.1.3", + "serde", + "strumbra", +] + +[[package]] +name = "librashader-pack" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e1405d8ae8996621cacbc5d1f9220486eda4cafaf229da02c02eecfbbe2cf" +dependencies = [ + "image", + "librashader-common", + "librashader-preprocess", + "librashader-presets", + "rayon", +] + +[[package]] +name = "librashader-preprocess" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62507ee532a6f3320acac509e3d3b32e8828c8bd1161a74bc576351729c820e2" +dependencies = [ + "encoding_rs", + "librashader-common", + "nom", + "serde", + "thiserror 2.0.20", +] + +[[package]] +name = "librashader-presets" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d70306212493fbb4be617cdb98b7048cb896b16182951aeb17856bee3d14aeff" +dependencies = [ + "librashader-common", + "librashader-preprocess", + "nom", + "nom_locate", + "num-traits", + "once_cell", + "regex", + "serde", + "thiserror 2.0.20", + "vec_extract_if_polyfill", +] + +[[package]] +name = "librashader-reflect" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923a7ea3724e2fca281a08598217fe2daa5b6a245a278448251c851f19c0b290" +dependencies = [ + "bitflags", + "bytemuck", + "glslang", + "librashader-common", + "librashader-pack", + "librashader-preprocess", + "librashader-presets", + "naga", + "rspirv", + "rustc-hash 2.1.3", + "spirv", + "spirv-cross2", + "thiserror 2.0.20", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "naga" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23bf0a141a9ab6f07dbb492db53245e464bc9db42f407772d9ae03d83a2c1033" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.17.1", + "indexmap", + "libm", + "log", + "naga-types", + "num-traits", + "once_cell", + "petgraph", + "rustc-hash 1.1.0", + "serde", + "spirv", + "thiserror 2.0.20", + "unicode-ident", +] + +[[package]] +name = "naga-types" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658200ddc25c6c7b860747516d132d1b284c0fafb7a380233acee9a72fb30e11" +dependencies = [ + "hashbrown 0.17.1", + "indexmap", + "rustc-hash 1.1.0", + "serde", + "thiserror 2.0.20", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom_locate" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" +dependencies = [ + "bytecount", + "memchr", + "nom", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rspirv" +version = "0.13.0+sdk-1.4.341.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091dca2e1d6fd3098417b5ec88e77e80d1ba5945750943419dc976858082c296" +dependencies = [ + "rustc-hash 1.1.0", + "spirv", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "static_assertions", + "version_check", +] + +[[package]] +name = "spike" +version = "0.1.0" +dependencies = [ + "librashader-common", + "librashader-preprocess", + "librashader-presets", + "librashader-reflect", + "serde", + "serde_json", +] + +[[package]] +name = "spirv" +version = "0.4.0+sdk-1.4.341.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "spirv-cross-sys" +version = "0.7.2+38681a3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9291b270f65ee1e61842d0a4dadc707d3b1669d8001e0900433e341c897d5d1b" +dependencies = [ + "bytemuck", + "cc", + "num-derive", + "num-traits", +] + +[[package]] +name = "spirv-cross2" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01f93f6f1637a1a72b43d2ca50ebbcd94c3f4c4e94eda8e27144834671f008" +dependencies = [ + "bitflags", + "bytemuck", + "memchr", + "spirv", + "spirv-cross-sys", + "spirv-cross2-derive", + "thiserror 1.0.69", +] + +[[package]] +name = "spirv-cross2-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18017a288e6ce64dd5d56510166baeabb01849483555c031f573c091b6934a64" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strumbra" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b498044485e2789b38e047fdb4c7ac827bd72d66407af9e5d15626f9c45364e" +dependencies = [ + "serde", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "vec_extract_if_polyfill" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c9cb5fb67c2692310b6eb3fce7dd4b6e4c9a75be4f2f46b27f0b2b7799759c" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] diff --git a/tools/shaderfx-bridge/Cargo.toml b/tools/shaderfx-bridge/Cargo.toml new file mode 100644 index 00000000..d9671c35 --- /dev/null +++ b/tools/shaderfx-bridge/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "spike" +version = "0.1.0" +edition = "2024" + +[lib] +name = "librashader_bridge" +crate-type = ["cdylib", "rlib"] + +[dependencies] +librashader-preprocess = "0.12.0" +librashader-presets = "0.12.0" +librashader-reflect = "0.12.0" +librashader-common = "0.12.0" +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/tools/shaderfx-bridge/src/lib.rs b/tools/shaderfx-bridge/src/lib.rs new file mode 100644 index 00000000..2cd175f2 --- /dev/null +++ b/tools/shaderfx-bridge/src/lib.rs @@ -0,0 +1,1009 @@ +// Plain FFI surface: call a function, get strings/a manifest back. No +// Librashader runtime backend (GL/Vulkan/D3D/Metal) is linked in and no +// live graphics context is ever touched here -- this is +// librashader-presets + librashader-reflect only, the translation step, +// exactly what spike/src/main.rs already proved works as a standalone +// binary. This just gives that same logic a stable C ABI so a LuaJIT +// `ffi.load`/`ffi.cdef` caller can reach it. + +use std::collections::HashMap; +use std::ffi::{CStr, CString}; +use std::os::raw::c_char; +use std::path::Path; + +use librashader_common::{FilterMode, WrapMode}; +use librashader_presets::{Scaling, ScaleFactor, ScaleType, ShaderFeatures, ShaderPreset}; +use librashader_preprocess::ShaderSource; +use librashader_reflect::back::glsl::GlslVersion; +use librashader_reflect::back::targets::GLSL; +use librashader_reflect::back::{CompileShader, FromCompilation}; +use librashader_reflect::front::{Glslang, ShaderInputCompiler}; +use librashader_reflect::reflect::semantics::{ + Semantic, ShaderSemantics, TextureSemanticMap, TextureSemantics, UniformSemantic, + UniqueSemanticMap, +}; +use librashader_reflect::reflect::ReflectShader; +use serde::Serialize; + +fn filter_str(f: FilterMode) -> &'static str { + match f { + FilterMode::Linear => "linear", + FilterMode::Nearest => "nearest", + } +} + +fn wrap_str(w: WrapMode) -> &'static str { + match w { + WrapMode::ClampToBorder => "clamp_to_border", + WrapMode::ClampToEdge => "clamp_to_edge", + WrapMode::Repeat => "repeat", + WrapMode::MirroredRepeat => "mirrored_repeat", + } +} + +fn texture_semantics_str(t: TextureSemantics) -> &'static str { + match t { + TextureSemantics::Original => "Original", + TextureSemantics::Source => "Source", + TextureSemantics::OriginalHistory => "OriginalHistory", + TextureSemantics::PassOutput => "PassOutput", + TextureSemantics::PassFeedback => "PassFeedback", + TextureSemantics::User => "User", + } +} + +/// Every `LIBRA_TEXTURE_` sampler2D uniform this pass's *already +/// compiled* GLSL declares -- scraped from the same compiler output +/// `love-test/main.lua`'s old `findSamplers` regexed directly, just done +/// once here instead of by every Lua consumer. +fn extract_texture_uniform_names(glsl: &str) -> Vec { + const PREFIX: &str = "LIBRA_TEXTURE_"; + let mut names = Vec::new(); + for line in glsl.lines() { + let t = line.trim(); + if !t.starts_with("uniform ") || !t.contains("sampler2D") { + continue; + } + let Some(pos) = t.find(PREFIX) else { continue }; + let rest = &t[pos + PREFIX.len()..]; + let end = rest + .find(|c: char| !(c.is_alphanumeric() || c == '_')) + .unwrap_or(rest.len()); + let name = &rest[..end]; + if !name.is_empty() && !names.iter().any(|n: &String| n == name) { + names.push(name.to_string()); + } + } + names +} + +/// Classifies every declared `LIBRA_TEXTURE_` sampler using the same +/// `librashader_reflect::reflect::semantics` resolution librashader itself +/// uses at runtime (`ShaderSemantics::create_pass_semantics` + the +/// `TextureSemanticMap` name-lookup fallback: explicit alias/LUT-name +/// entries first, then the built-in `Source`/`Original`/`OriginalHistoryN`/ +/// `PassOutputN`/`PassFeedbackN` literal-name conventions) -- replaces the +/// Lua-side `passOutputAlias`/`originalHistory`/hardcoded +/// `"COLOR_PALETTE"`/`"BACKGROUND"` name matching: a pass reachable only +/// by its real `.slangp` alias (not a +/// literal `PassOutputN` name), or a preset with differently-named LUTs, +/// could never be resolved by that pattern matching but resolves correctly +/// here because this is the actual API meant for it, not a reimplication +/// of its naming convention. +/// `ShaderSemantics::create_pass_semantics` (the per-pass convenience API +/// this file uses instead of upstream's real `compile_preset_passes`) +/// only registers the alias of the pass being +/// compiled, not every other pass's alias -- upstream's real preset-wide +/// compile builds one shared semantics map covering every pass's alias +/// before compiling any of them (`librashader_reflect::reflect::presets:: +/// compile_preset_passes`'s own `insert_pass_semantics` loop over ALL +/// passes). That gap is invisible for a preset where every cross-pass +/// texture reference uses the literal `PassOutputN` name (matched by +/// `TextureSemanticMap`'s own prefix-strip fallback regardless of this +/// map), which is all the earlier per-pass approach was ever validated +/// against -- but a real +/// preset can and does reference another pass's output purely by its own +/// `aliasN` (`ds-hybrid-scalefx.slangp`'s `scalefx-pass2.slang` samples +/// `scalefx_pass0`, pass 1's alias, with no `PassOutput1`-shaped name +/// anywhere), which the per-pass map can never resolve. Mirrors upstream's +/// own `insert_pass_semantics` (alias -> PassOutput, `Size` -> +/// PassOutput's size semantic, `Feedback`/`FeedbackSize` -> +/// PassFeedback) since that function itself isn't exported publicly. +fn insert_extra_pass_semantics(semantics: &mut ShaderSemantics, alias: &str, index: usize) { + if alias.trim().is_empty() { + return; + } + semantics.texture_semantics.insert( + alias.into(), + Semantic { + semantics: TextureSemantics::PassOutput, + index, + }, + ); + semantics.uniform_semantics.insert( + format!("{alias}Size").into(), + UniformSemantic::Texture(Semantic { + semantics: TextureSemantics::PassOutput, + index, + }), + ); + semantics.texture_semantics.insert( + format!("{alias}Feedback").into(), + Semantic { + semantics: TextureSemantics::PassFeedback, + index, + }, + ); + semantics.uniform_semantics.insert( + format!("{alias}FeedbackSize").into(), + UniformSemantic::Texture(Semantic { + semantics: TextureSemantics::PassFeedback, + index, + }), + ); +} + +fn classify_samplers( + preset: &ShaderPreset, + semantics: &ShaderSemantics, + fragment: &str, +) -> Vec { + let names = extract_texture_uniform_names(fragment); + names + .into_iter() + .map(|name| match semantics.texture_semantics.texture_semantic(&name) { + Some(sem) => { + let user_name = if matches!(sem.semantics, TextureSemantics::User) { + preset.textures.get(sem.index).map(|t| t.meta.name.to_string()) + } else { + None + }; + SamplerOut { + name, + semantic: texture_semantics_str(sem.semantics).to_string(), + index: sem.index, + user_name, + } + } + None => SamplerOut { + name, + semantic: "Unknown".to_string(), + index: 0, + user_name: None, + }, + }) + .collect() +} + +/// Every member name a given struct (named `struct_name`) declares in this +/// pass's *already compiled* GLSL -- scraped the same way +/// `ShaderFixup.lua`'s `flattenStruct` does (`struct { +/// ; ... };`), before that struct gets flattened away into packed +/// uniforms. Includes every member of whichever struct is named: `*Size` +/// uniforms (`OutputSize`, `SourceSize`, `OriginalHistorySize1`, ...), +/// ordinary `#pragma parameter`s (`response_time`, `color_toggle`, ...), and +/// (when scanning a `LIBRA_UBO_*` struct) `MVP`/motion uniforms +/// (`Gyroscope`, `Accelerometer`, `AccelerometerRest`) alike -- +/// `classify_size_uniforms` below is what tells them apart. +fn extract_struct_member_names(glsl: &str, struct_name: &str) -> Vec { + let marker = format!("struct {struct_name}"); + let Some(start) = glsl.find(marker.as_str()) else { + return Vec::new(); + }; + let Some(open) = glsl[start..].find('{') else { + return Vec::new(); + }; + let body_start = start + open + 1; + let Some(close) = glsl[body_start..].find('}') else { + return Vec::new(); + }; + let body = &glsl[body_start..body_start + close]; + body.split(';') + .filter_map(|member| { + let member = member.trim(); + if member.is_empty() { + return None; + } + member.split_whitespace().last().map(|s| s.to_string()) + }) + .collect() +} + +/// Classifies every `LIBRA_PUSH_FRAGMENT` struct member using the same +/// `librashader_reflect::reflect::semantics` name-resolution +/// `classify_samplers` above uses for texture samplers, applied to the +/// pass's own `uniform_semantics` map instead of `texture_semantics`: +/// `unique_semantic` resolves the fixed built-in names (`OutputSize`, +/// `FinalViewportSize`, `MVP`, `FrameCount`, ...), `texture_semantic` +/// resolves the `*Size` convention `TextureSemantics::size_uniform_name` +/// defines (`SourceSize`, `OriginalSize`, `OriginalHistorySizeN`, +/// `PassOutputSizeN`, `PassFeedbackSizeN`, `UserSizeN`). This replaces +/// `love-test/main.lua`'s `sizeTable()`'s own `OriginalHistorySize(%d+)`/ +/// `PassOutputSize(%d+)` Lua regex -- the same class of gap the sampler- +/// wiring fix closed: a member that isn't one of those two literal name +/// shapes (a `PassFeedbackSizeN`/`UserSizeN`, which no preset under +/// `references/` happens to use but which `size_uniform_name`'s convention +/// covers just as well) could never be classified correctly by pattern +/// matching alone. Confirmed empirically (throwaway `main.rs` print block, +/// added/inspected/reverted, against the real preset): an ordinary +/// `#pragma parameter` (`response_time`, `color_toggle`, ...) is NOT an +/// unresolved name here -- `ShaderSemantics::create_pass_semantics` itself +/// registers every one of a pass's own declared parameters into +/// `uniform_semantics` as `UniqueSemantics::FloatParameter` +/// (`librashader_reflect::reflect::presets::create_pass_semantics`), so +/// `unique_semantic` resolves them too, as `kind = "unique", semantic = +/// "FloatParameter"` -- real classification, not a guess. `kind = +/// "parameter"` (semantic/index left empty) is the fallback for a name +/// that resolves to neither map, which no known preset's push struct ever +/// contains -- callers already have a separate, working mechanism for +/// actual parameter defaults (`ALL_DEFAULTS`), so this fallback only exists +/// to fail informatively rather than silently misclassify something odd as +/// a size uniform. +/// Structs classified, paired with whether to scan them from the vertex +/// (true) or fragment (false) GLSL text. `LIBRA_PUSH_FRAGMENT`/ +/// `LIBRA_PUSH_VERTEX` mirror each other (same #pragma parameters, per +/// ShaderFixup.lua's own documented convention) so scanning both is +/// redundant but harmless -- names are deduped below. +/// `LIBRA_UBO_FRAGMENT`/`LIBRA_UBO_VERTEX` are new here: previously only +/// ever carried a special-cased `MVP` (substituted to `transform_projection` +/// in ShaderFixup.lua, never needing a real classified value), but a real +/// preset (pixel_transparency.slang) also declares `Gyroscope`/ +/// `Accelerometer`/`AccelerometerRest` there once +/// `ShaderFeatures::SENSOR_UNIFORMS` is set -- those need real +/// classification too, the same as any other built-in. +const CLASSIFIED_STRUCTS: [(&str, bool); 4] = [ + ("LIBRA_PUSH_FRAGMENT", false), + ("LIBRA_PUSH_VERTEX", true), + ("LIBRA_UBO_FRAGMENT", false), + ("LIBRA_UBO_VERTEX", true), +]; + +fn classify_size_uniforms( + semantics: &ShaderSemantics, + vertex: &str, + fragment: &str, +) -> Vec { + let mut seen = std::collections::HashSet::new(); + let mut out = Vec::new(); + for (struct_name, is_vertex) in CLASSIFIED_STRUCTS { + let glsl = if is_vertex { vertex } else { fragment }; + for name in extract_struct_member_names(glsl, struct_name) { + if !seen.insert(name.clone()) { + continue; // already classified from an earlier (mirrored) struct + } + out.push(if let Some(sem) = semantics.uniform_semantics.unique_semantic(&name) { + SizeUniformOut { + name, + kind: "unique".to_string(), + semantic: sem.semantics.as_str().to_string(), + index: 0, + } + } else if let Some(sem) = semantics.uniform_semantics.texture_semantic(&name) { + SizeUniformOut { + name, + kind: "texture".to_string(), + semantic: texture_semantics_str(sem.semantics).to_string(), + index: sem.index, + } + } else { + SizeUniformOut { + name, + kind: "parameter".to_string(), + semantic: String::new(), + index: 0, + } + }); + } + } + out +} + +fn scale_type_str(t: ScaleType) -> &'static str { + match t { + ScaleType::Input => "source", + ScaleType::Absolute => "absolute", + ScaleType::Viewport => "viewport", + ScaleType::Original => "original", + } +} + +#[derive(Serialize)] +pub struct ScalingOut { + pub scale_type: String, + /// "float": `factor` is a multiplier on the reference size (the normal + /// case). "absolute": `factor` is itself the size in pixels, verbatim + /// (only meaningful when `scale_type == "absolute"`). + pub factor_kind: String, + pub factor: f32, +} + +fn scaling_out(s: &Scaling) -> ScalingOut { + let (factor_kind, factor) = match s.factor { + ScaleFactor::Float(f) => ("float", f), + ScaleFactor::Absolute(i) => ("absolute", i as f32), + }; + ScalingOut { + scale_type: scale_type_str(s.scale_type).to_string(), + factor_kind: factor_kind.to_string(), + factor, + } +} + +/// A single `#pragma parameter` as declared in a pass's own shader source: +/// name, human-readable label, and the slider's default/min/max/step. This +/// is the real source of truth this project's Lua harnesses previously hand +/// -copied into a shared `ALL_DEFAULTS` table from reading `gb-params.inc` +/// by eye. +#[derive(Serialize)] +pub struct ParameterOut { + pub id: String, + pub description: String, + pub initial: f32, + pub minimum: f32, + pub maximum: f32, + pub step: f32, +} + +/// A preset-level parameter override (the `.slangp` file's own `param = value` +/// lines, e.g. `gameboy-color-dot-matrix.slangp`'s `color_toggle = "1.000000"`) +/// -- applied on top of each pass's own `ParameterOut.initial` default. +#[derive(Serialize)] +pub struct ParameterOverrideOut { + pub name: String, + pub value: f32, +} + +/// One of the preset's lookup textures (e.g. `COLOR_PALETTE`/`BACKGROUND` for +/// `gameboy-color-dot-matrix.slangp`) -- name to bind it as, the real path to +/// load, and its sampling settings. Previously hardcoded per-preset in Lua as +/// `paletteImg`/`backgroundImg`. +#[derive(Serialize)] +pub struct TextureOut { + pub name: String, + pub path: String, + pub wrap_mode: String, + pub filter_mode: String, + pub mipmap: bool, +} + +/// One `LIBRA_TEXTURE_` sampler this pass's compiled GLSL declares, +/// classified via real `librashader_reflect` semantics (see +/// `classify_samplers`) instead of Lua-side name-pattern matching. +/// `semantic` is one of `"Original"`/`"Source"`/`"OriginalHistory"`/ +/// `"PassOutput"`/`"PassFeedback"`/`"User"`/`"Unknown"` (the last only if +/// this pass declares a sampler no semantic could resolve at all -- a +/// genuine translation bug, not an expected case). `index` is meaningful +/// for every semantic except `Original`/`Source`/`Unknown` (always 0 there). +/// `user_name` is only set for `"User"`: the real preset texture name +/// (matches one of `TranslateResult.textures[].name`) to bind, resolved +/// from the same LUT list, not a hardcoded per-preset name. +#[derive(Serialize)] +pub struct SamplerOut { + pub name: String, + pub semantic: String, + pub index: usize, + pub user_name: Option, +} + +/// One `LIBRA_PUSH_FRAGMENT` struct member, classified via real +/// `librashader_reflect` semantics (see `classify_size_uniforms`) instead +/// of Lua-side `*Size` name-pattern matching. `kind` is `"unique"` (a fixed +/// built-in like `OutputSize`/`MVP`/`FrameCount` -- `semantic` names which +/// one, `index` always 0), `"texture"` (a `*Size` uniform tied to a texture +/// semantic -- `semantic` is one of `Original`/`Source`/`OriginalHistory`/ +/// `PassOutput`/`PassFeedback`/`User`, `index` meaningful for every +/// semantic except `Original`/`Source`), or `"parameter"` (an ordinary +/// `#pragma parameter`, not a size uniform at all -- `semantic` empty, +/// `index` 0). +#[derive(Serialize)] +pub struct SizeUniformOut { + pub name: String, + pub kind: String, + pub semantic: String, + pub index: usize, +} + +#[derive(Serialize)] +pub struct PassOutput { + pub id: String, + pub alias: Option, + pub vertex: String, + pub fragment: String, + pub filter: String, + pub wrap_mode: String, + pub frame_count_mod: u32, + pub srgb_framebuffer: bool, + pub float_framebuffer: bool, + pub mipmap_input: bool, + pub scale_x: ScalingOut, + pub scale_y: ScalingOut, + /// This pass's own `#pragma parameter` declarations (id/description/ + /// initial/min/max/step) -- every pass in the preset contributes to one + /// flat namespace (matching how `#pragma parameter` works upstream: + /// shared uniform names across passes are the same parameter), so a + /// consumer merges these across all passes, then layers the preset-level + /// `TranslateResult.parameter_overrides` on top by name. + pub parameters: Vec, + /// Every texture sampler this pass's fragment shader declares, real- + /// semantics-classified. See `SamplerOut`. + pub samplers: Vec, + /// Every `LIBRA_PUSH_FRAGMENT` struct member this pass declares + /// (`*Size` uniforms and `#pragma parameter`s alike), real-semantics- + /// classified. See `SizeUniformOut`. + pub size_uniforms: Vec, +} + +#[derive(Serialize)] +pub struct TranslateResult { + pub pass_count: usize, + pub passes: Vec, + pub textures: Vec, + pub parameter_overrides: Vec, + pub error: Option, +} + +/// The convert-time ESSL 100 gap: `textureSize`/`texelFetchOffset`/ +/// `textureOffset` are all GLSL ES 3.00+-only -- spirv-cross refuses to +/// *emit* them for an ES 1.00 target and the whole pass fails to compile +/// (`UnsupportedSpirv("textureSize is not supported in ESSL 100.")` etc, +/// captured for real across 14 real buildbot presets by `shaderfix-repro/`). +/// Unlike every other ES-1.00 fixup this +/// project does (`ShaderFixup.lua`, all post-compile GLSL-text patches), +/// this one has to happen on the RAW `.slang` source text *before* SPIRV +/// compilation -- spirv-cross's error means no GLSL text is ever produced +/// for the pass to patch afterward. Only ever called for the ES 1.00 +/// target; desktop GLSL 1.20 supports all three calls natively and is left +/// untouched. Rewrites, textually, into ES-1.00-legal equivalents: +/// - `textureSize(, )` -> a literal `ivec2(w, h)`, for a `` +/// that's one of this preset's own declared static textures (a LUT/ +/// border PNG with fixed, load-time-known dimensions -- `lut_sizes`, +/// read directly from each PNG's IHDR chunk). `` must be a +/// non-negative integer literal (true of every real occurrence found so +/// far -- always `0`); a `` not in `lut_sizes`, or a non-literal/ +/// negative ``, is left unrewritten so it fails exactly as loudly +/// as before instead of silently guessing wrong. +/// - `texelFetchOffset(, , , )` / +/// `textureOffset(, , )` -> `texture(, ...)` (NOT +/// `texture2D` -- the source here is still `#version 450` desktop GLSL +/// at this stage, before spirv-cross's own ES 1.00 backend does its +/// usual automatic `texture()` -> `texture2D()` downgrade during +/// emission, same as it already does for every other ordinary `texture()` +/// call in these shaders) sampling at the equivalent texel-center UV, +/// using ``'s own `Size` uniform's `.zw` (reciprocal size -- +/// every pass-graph texture Source/PassOutputN/OriginalHistoryN/etc +/// already declares one, per the slang spec's own convention, confirmed +/// directly against `lcd-grid-v2.slang`'s existing `texelSize = +/// global.SourceSize.zw` line). The uniform's containing block instance +/// name (`params`/`global`/etc) is discovered by scanning the source's +/// own push-constant/UBO block bodies for a member named `Size`, +/// never assumed to be one fixed block. Honest limit, not fixable +/// without a much bigger rewrite: `texture()` sampling honors the +/// sampler's configured wrap mode at out-of-range coordinates, which is +/// not necessarily identical to `texelFetch`'s implementation-defined +/// out-of-bounds behavior -- a possible edge-of-image discrepancy for +/// passes whose fetch offsets can go out of range, not measured, flagged +/// here for whoever verifies these presets' rendered output next. +fn rewrite_essl100_gaps(text: &mut String, lut_sizes: &HashMap) { + rewrite_texture_size_calls(text, lut_sizes); + rewrite_offset_fetch_calls(text, "texelFetchOffset", true); + rewrite_offset_fetch_calls(text, "textureOffset", false); +} + +fn rewrite_texture_size_calls(text: &mut String, lut_sizes: &HashMap) { + for (start, end, args) in find_calls(text, "textureSize").into_iter().rev() { + let (Some(tex), Some(lod)) = (args.first(), args.get(1)) else { + continue; + }; + let Some(&(w, h)) = lut_sizes.get(tex.trim()) else { + continue; + }; + let Ok(lod) = lod.trim().parse::() else { + continue; + }; + text.replace_range(start..end, &format!("ivec2({}, {})", w >> lod, h >> lod)); + } +} + +fn rewrite_offset_fetch_calls(text: &mut String, fn_name: &str, has_lod: bool) { + let expected_args = if has_lod { 4 } else { 3 }; + + // A pass can sample another pass's PassOutput/alias purely through + // texelFetchOffset/textureOffset with no textureSize() call of its own + // (`ds-hybrid-scalefx.slangp`'s scalefx-pass2.slang samples its + // `scalefx_pass0` alias this way) -- the raw shader source then never + // declares that texture's own `Size` uniform at all, since the + // author never needed it directly. Ensure one exists, injected into an + // existing uniform block, before computing any call's byte offsets + // below (injecting text shifts every later offset, so this must fully + // finish first, not interleave with the rewrite loop). + let mut tex_names: Vec = find_calls(text, fn_name) + .into_iter() + .filter(|(_, _, args)| args.len() == expected_args) + .map(|(_, _, args)| args[0].trim().to_string()) + .collect(); + tex_names.sort(); + tex_names.dedup(); + for tex in &tex_names { + ensure_size_uniform_declared(text, tex); + } + + for (start, end, args) in find_calls(text, fn_name).into_iter().rev() { + if args.len() != expected_args { + continue; + } + let tex = args[0].trim(); + let Some(prefix) = find_uniform_block_instance(text, &format!("{tex}Size")) else { + continue; + }; + let replacement = if has_lod { + format!( + "texture({tex}, (vec2(({coord}) + ({off})) + vec2(0.5)) * {prefix}.{tex}Size.zw)", + tex = tex, + coord = args[1].trim(), + off = args[3].trim(), + prefix = prefix + ) + } else { + format!( + "texture({tex}, ({uv}) + vec2({off}) * {prefix}.{tex}Size.zw)", + tex = tex, + uv = args[1].trim(), + off = args[2].trim(), + prefix = prefix + ) + }; + text.replace_range(start..end, &replacement); + } +} + +/// Finds every top-level call of `name(...)` in `src` (not preceded by an +/// identifier char, so a longer name that happens to end in `name` can't +/// false-match), returning `(start_byte, end_byte_exclusive, args)` per +/// call -- `args` are the call's comma-separated argument texts, split +/// respecting nested parens/brackets so an argument like `(coord)` or +/// `ivec2(0, 0)` doesn't get sliced apart. A plain regex can't do this +/// safely since GLSL call arguments nest arbitrarily. +fn find_calls(src: &str, name: &str) -> Vec<(usize, usize, Vec)> { + let bytes = src.as_bytes(); + let pat = format!("{name}("); + let mut out = Vec::new(); + let mut search_from = 0usize; + while let Some(rel) = src[search_from..].find(pat.as_str()) { + let start = search_from + rel; + let open = start + pat.len() - 1; + let preceded_by_ident = start > 0 && { + let c = bytes[start - 1] as char; + c.is_alphanumeric() || c == '_' + }; + if preceded_by_ident { + search_from = open + 1; + continue; + } + let mut depth = 0i32; + let mut i = open; + let mut close = None; + while i < bytes.len() { + match bytes[i] { + b'(' => depth += 1, + b')' => { + depth -= 1; + if depth == 0 { + close = Some(i); + break; + } + } + _ => {} + } + i += 1; + } + let Some(close) = close else { break }; + let args = split_top_level_args(&src[open + 1..close]); + out.push((start, close + 1, args)); + search_from = close + 1; + } + out +} + +fn split_top_level_args(s: &str) -> Vec { + let mut args = Vec::new(); + let mut depth = 0i32; + let mut cur = String::new(); + for c in s.chars() { + match c { + '(' | '[' => { + depth += 1; + cur.push(c); + } + ')' | ']' => { + depth -= 1; + cur.push(c); + } + ',' if depth == 0 => { + args.push(cur.trim().to_string()); + cur = String::new(); + } + _ => cur.push(c), + } + } + if !cur.trim().is_empty() || !args.is_empty() { + args.push(cur.trim().to_string()); + } + args +} + +/// One `[layout(...)] uniform { ... } ;` declaration +/// found by `find_uniform_blocks` -- `body_start`/`body_end` bound the +/// member-declaration text between (not including) the braces. +struct UniformBlockSpan { + instance: String, + body_start: usize, + body_end: usize, +} + +/// Scans `src` for every `[layout(...)] uniform { ... } ;` +/// declaration (push-constant or UBO alike, `params`/`global`/etc -- never +/// one fixed instance name, confirmed by both shapes existing in the real +/// corpus: `lcd-grid-v2.slang`'s `global.SourceSize` vs. +/// `scalefx-pass0.slang`'s `params.SourceSize`). Skips plain non-block +/// uniform declarations (e.g. `uniform sampler2D Source;`) by requiring a +/// `{` immediately (past whitespace) after the block-name identifier. +fn find_uniform_blocks(src: &str) -> Vec { + let bytes = src.as_bytes(); + let mut out = Vec::new(); + let mut search_from = 0usize; + while let Some(rel) = src[search_from..].find("uniform ") { + let kw_start = search_from + rel; + let after_kw = kw_start + "uniform ".len(); + let rest = &src[after_kw..]; + let ident_end = rest + .find(|c: char| !(c.is_alphanumeric() || c == '_')) + .unwrap_or(rest.len()); + let after_ident = rest[ident_end..].trim_start(); + if !after_ident.starts_with('{') { + search_from = after_kw; + continue; + } + let open = after_kw + (rest.len() - after_ident.len()); + let mut depth = 0i32; + let mut i = open; + let mut close = None; + while i < bytes.len() { + match bytes[i] { + b'{' => depth += 1, + b'}' => { + depth -= 1; + if depth == 0 { + close = Some(i); + break; + } + } + _ => {} + } + i += 1; + } + let Some(close) = close else { break }; + let after = src[close + 1..].trim_start(); + let instance = after + .split(|c: char| c == ';' || c.is_whitespace()) + .next() + .unwrap_or(""); + if !instance.is_empty() { + out.push(UniformBlockSpan { + instance: instance.to_string(), + body_start: open + 1, + body_end: close, + }); + } + search_from = close + 1; + } + out +} + +/// The accessor `` for the block (of `find_uniform_blocks`) whose +/// body declares a member named exactly `member` -- used to correctly +/// qualify a `Size` reference once it's known to exist somewhere. +fn find_uniform_block_instance(src: &str, member: &str) -> Option { + find_uniform_blocks(src) + .into_iter() + .find(|b| member_declared(&src[b.body_start..b.body_end], member)) + .map(|b| b.instance) +} + +/// Guarantees `Size` is declared in some uniform block of `text`, +/// injecting `vec4 Size;` into one if it isn't already there, and +/// returns that block's accessor either way. Needed for +/// `rewrite_offset_fetch_calls`: a pass can reference another pass's +/// PassOutput/alias purely through texelFetchOffset/textureOffset with no +/// textureSize() call of its own (`ds-hybrid-scalefx.slangp`'s +/// scalefx-pass2.slang samples its `scalefx_pass0` alias exactly this way), +/// so the raw shader source never declares that texture's own `*Size` +/// uniform at all -- the author never needed it directly, but our rewrite +/// does. Prefers a block that already declares some other `*Size` member +/// (matching the real convention every corpus shader already follows of +/// keeping every `*Size` uniform in one block alongside `SourceSize`/ +/// `OutputSize`), falling back to the first uniform block found at all; +/// `None` only if the shader declares no uniform block whatsoever, which no +/// known real corpus shader does. +fn ensure_size_uniform_declared(text: &mut String, tex: &str) -> Option { + let member = format!("{tex}Size"); + if let Some(instance) = find_uniform_block_instance(text, &member) { + return Some(instance); + } + let blocks = find_uniform_blocks(text); + let target = blocks + .iter() + .find(|b| { + text[b.body_start..b.body_end] + .split(';') + .any(|stmt| stmt.trim_end().ends_with("Size")) + }) + .or_else(|| blocks.first())?; + let instance = target.instance.clone(); + let insert_at = target.body_end; + text.insert_str(insert_at, &format!("\tvec4 {member};\n")); + Some(instance) +} + +fn member_declared(body: &str, member: &str) -> bool { + body.split(';').any(|stmt| { + stmt.split_whitespace() + .last() + .map(|last| last == member) + .unwrap_or(false) + }) +} + +/// Reads a PNG's real pixel width/height straight from its IHDR chunk +/// (bytes 16..20 = width, 20..24 = height, big-endian u32, always the +/// first chunk right after the 8-byte signature per the PNG spec) -- no +/// image-decoding crate needed for just the header, consistent with this +/// project's preference for minimal dependencies. `None` on any read/parse +/// failure; `rewrite_texture_size_calls` treats a missing entry as "leave +/// unrewritten," so this fails the same loud, pre-existing way rather than +/// silently. +fn png_dimensions(path: &Path) -> Option<(u32, u32)> { + let bytes = std::fs::read(path).ok()?; + if bytes.len() < 24 || &bytes[0..8] != b"\x89PNG\r\n\x1a\n" || &bytes[12..16] != b"IHDR" { + return None; + } + let w = u32::from_be_bytes(bytes[16..20].try_into().ok()?); + let h = u32::from_be_bytes(bytes[20..24].try_into().ok()?); + Some((w, h)) +} + +pub fn compile_pass_glsl( + source: &ShaderSource, + version: GlslVersion, +) -> Result<(String, String), Box> { + let compiled = Glslang::compile(source)?; + let mut reflect = GLSL::from_compilation(compiled)?; + let semantics = ShaderSemantics { + uniform_semantics: Default::default(), + texture_semantics: Default::default(), + }; + // Best-effort, matching main.rs: don't fail the whole pass if reflect() + // can't resolve semantics we never populated. + let _ = reflect.reflect(0, &semantics); + let output = reflect.compile(version)?; + Ok((output.vertex, output.fragment)) +} + +/// Parses a `.slangp` preset and compiles every pass to GLSL text at the +/// requested dialect. No fixup (precision header, struct flattening, +/// main()->effect() rewrite) happens here -- that stays a Lua-side stage, +/// run against the returned GLSL text. +pub fn translate_preset(preset_path: &Path, version: GlslVersion) -> TranslateResult { + // SENSOR_UNIFORMS only defines `_HAS_SENSOR_UNIFORMS` in preprocessing so + // a preset's own `#ifdef` guard (e.g. pixel_transparency.slang's + // Gyroscope/Accelerometer/AccelerometerRest block) compiles in -- the + // resulting uniforms are then already classified generically by + // classify_size_uniforms below via the real `unique_semantic` lookup, + // same as every other built-in (OutputSize, MVP, FrameCount, ...), no + // further special-casing needed here. + let preset = match ShaderPreset::try_parse(preset_path, ShaderFeatures::SENSOR_UNIFORMS) { + Ok(p) => p, + Err(e) => { + return TranslateResult { + pass_count: 0, + passes: Vec::new(), + textures: Vec::new(), + parameter_overrides: Vec::new(), + error: Some(format!("preset parse failed: {e}")), + }; + } + }; + + let textures = preset + .textures + .iter() + .map(|t| TextureOut { + name: t.meta.name.to_string(), + path: t.path.to_string_lossy().into_owned(), + wrap_mode: wrap_str(t.meta.wrap_mode).to_string(), + filter_mode: filter_str(t.meta.filter_mode).to_string(), + mipmap: t.meta.mipmap, + }) + .collect(); + + let parameter_overrides = preset + .parameters + .iter() + .map(|p| ParameterOverrideOut { + name: p.name.to_string(), + value: p.value, + }) + .collect(); + + // Only needed for `rewrite_essl100_gaps`'s `textureSize()` case -- + // real load-time dimensions for this preset's own declared static + // textures (LUTs, borders), read once, reused for every pass. + let lut_sizes: HashMap = preset + .textures + .iter() + .filter_map(|t| png_dimensions(&t.path).map(|dim| (t.meta.name.to_string(), dim))) + .collect(); + + let mut passes = Vec::new(); + for (pass_index, pass) in preset.passes.iter().enumerate() { + let mut source = match ShaderSource::load(&pass.path, preset.features) { + Ok(s) => s, + Err(e) => { + return TranslateResult { + pass_count: preset.pass_count as usize, + passes, + textures, + parameter_overrides, + error: Some(format!( + "pass {} source load failed: {e}", + pass.meta.id + )), + }; + } + }; + // ES 1.00 can't emit textureSize/texelFetchOffset/ + // textureOffset at all (spirv-cross errors before any GLSL text + // exists to patch post-compile) -- rewrite the raw source first. + // Desktop GLSL 1.20 supports all three natively; left untouched. + if matches!(version, GlslVersion::Glsl100Es) { + rewrite_essl100_gaps(&mut source.vertex, &lut_sizes); + rewrite_essl100_gaps(&mut source.fragment, &lut_sizes); + } + let mut parameters: Vec = source + .parameters + .values() + .map(|p| ParameterOut { + id: p.id.to_string(), + description: p.description.clone(), + initial: p.initial, + minimum: p.minimum, + maximum: p.maximum, + step: p.step, + }) + .collect(); + // FastHashMap iteration order isn't stable -- sort so the JSON (and + // anything downstream that diffs it) doesn't churn run to run. + parameters.sort_by(|a, b| a.id.cmp(&b.id)); + + match compile_pass_glsl(&source, version) { + Ok((vertex, fragment)) => { + let mut semantics = match ShaderSemantics::create_pass_semantics::< + Box, + >(&preset, pass_index) + { + Ok(s) => s, + Err(e) => { + return TranslateResult { + pass_count: preset.pass_count as usize, + passes, + textures, + parameter_overrides, + error: Some(format!( + "pass {} semantics failed: {e}", + pass.meta.id + )), + }; + } + }; + // See insert_extra_pass_semantics: create_pass_semantics only + // knows this pass's own alias; a later pass can still sample + // an earlier pass's output purely by that earlier pass's own + // alias, which needs registering here too. + for (other_index, other_pass) in preset.passes.iter().enumerate() { + if other_index == pass_index { + continue; + } + if let Some(alias) = other_pass.meta.alias.as_ref() { + insert_extra_pass_semantics(&mut semantics, alias, other_index); + } + } + let samplers = classify_samplers(&preset, &semantics, &fragment); + let size_uniforms = classify_size_uniforms(&semantics, &vertex, &fragment); + passes.push(PassOutput { + id: pass.meta.id.to_string(), + alias: pass.meta.alias.as_ref().map(|a| a.to_string()), + vertex, + fragment, + filter: filter_str(pass.meta.filter).to_string(), + wrap_mode: wrap_str(pass.meta.wrap_mode).to_string(), + frame_count_mod: pass.meta.frame_count_mod, + srgb_framebuffer: pass.meta.srgb_framebuffer, + float_framebuffer: pass.meta.float_framebuffer, + mipmap_input: pass.meta.mipmap_input, + scale_x: scaling_out(&pass.meta.scaling.x), + scale_y: scaling_out(&pass.meta.scaling.y), + parameters, + samplers, + size_uniforms, + }) + } + Err(e) => { + return TranslateResult { + pass_count: preset.pass_count as usize, + passes, + textures, + parameter_overrides, + error: Some(format!("pass {} compile failed: {e}", pass.meta.id)), + }; + } + } + } + + TranslateResult { + pass_count: preset.pass_count as usize, + passes, + textures, + parameter_overrides, + error: None, + } +} + +/// `es != 0` targets GLSL ES 1.00 (mobile/LÖVE's ES dialect); `es == 0` +/// targets GLSL 1.20 (LÖVE's desktop dialect). Returns a JSON-encoded +/// `TranslateResult`, always -- even the error case is valid JSON with an +/// `error` string and empty `passes`, so a caller never has to distinguish +/// "call failed" from "call succeeded but returned an error" at the ABI +/// boundary, only by reading the JSON. +/// +/// Ownership: the returned pointer is heap-allocated by Rust and must be +/// freed with `librashader_free_string`, never with the caller's own +/// allocator. +#[unsafe(no_mangle)] +pub extern "C" fn librashader_translate_preset(preset_path: *const c_char, es: i32) -> *mut c_char { + let path_str = unsafe { + if preset_path.is_null() { + return CString::new("{\"error\":\"null preset_path\",\"pass_count\":0,\"passes\":[],\"textures\":[],\"parameter_overrides\":[]}") + .unwrap() + .into_raw(); + } + CStr::from_ptr(preset_path).to_string_lossy().into_owned() + }; + let version = if es != 0 { + GlslVersion::Glsl100Es + } else { + GlslVersion::Glsl120 + }; + let result = translate_preset(Path::new(&path_str), version); + let json = serde_json::to_string(&result).unwrap_or_else(|e| { + format!("{{\"error\":\"serialize failed: {e}\",\"pass_count\":0,\"passes\":[],\"textures\":[],\"parameter_overrides\":[]}}") + }); + CString::new(json) + .unwrap_or_else(|_| { + CString::new("{\"error\":\"nul byte in translated output\",\"pass_count\":0,\"passes\":[],\"textures\":[],\"parameter_overrides\":[]}") + .unwrap() + }) + .into_raw() +} + +/// Frees a string returned by `librashader_translate_preset`. Must be +/// called exactly once per returned pointer, from the same allocator +/// (this library) that produced it -- never `free()` the pointer directly +/// from the caller's side. +#[unsafe(no_mangle)] +pub extern "C" fn librashader_free_string(s: *mut c_char) { + if s.is_null() { + return; + } + unsafe { + drop(CString::from_raw(s)); + } +} diff --git a/tools/shaderfx-bridge/src/main.rs b/tools/shaderfx-bridge/src/main.rs new file mode 100644 index 00000000..8ef0eec7 --- /dev/null +++ b/tools/shaderfx-bridge/src/main.rs @@ -0,0 +1,123 @@ +use std::path::PathBuf; + +use librashader_presets::{ShaderFeatures, ShaderPreset}; +use librashader_preprocess::ShaderSource; +use librashader_reflect::back::glsl::GlslVersion; +use librashader_bridge::compile_pass_glsl; + +fn count_uniform_vectors(glsl: &str) -> (usize, Vec) { + let mut total = 0usize; + let mut lines = Vec::new(); + for line in glsl.lines() { + let t = line.trim(); + if !t.starts_with("uniform ") { + continue; + } + // crude: skip sampler uniforms, they don't cost a fragment uniform *vector* slot + if t.contains("sampler") { + lines.push(format!("(sampler, not counted) {t}")); + continue; + } + let cost = if t.contains("mat4") { + 4 + } else if t.contains("mat3") { + 3 + } else if t.contains("mat2") { + 2 + } else { + 1 // scalar, vec2, vec3, vec4 all cost one vec4 slot each + }; + // arrays: uniform float foo[8]; costs 8 slots + let mut n = cost; + if let Some(br) = t.find('[') { + if let Some(close) = t[br..].find(']') { + if let Ok(count) = t[br + 1..br + close].trim().parse::() { + n = cost * count; + } + } + } + total += n; + lines.push(format!("({n} slot{}) {t}", if n == 1 { "" } else { "s" })); + } + (total, lines) +} + +fn main() -> Result<(), Box> { + let preset_path = PathBuf::from( + "../references/slang-shaders-gameboy/handheld/gameboy-color-dot-matrix.slangp", + ); + println!("=== parsing preset: {} ===", preset_path.display()); + let preset = ShaderPreset::try_parse(&preset_path, ShaderFeatures::empty())?; + println!("pass_count = {}", preset.pass_count); + for pass in &preset.passes { + println!( + " pass {} alias={:?} -> {}", + pass.meta.id, + pass.meta.alias, + pass.path.display() + ); + } + for tex in &preset.textures { + println!( + " texture {} -> {} (linear={:?})", + tex.meta.name, + tex.path.display(), + tex.meta.filter_mode + ); + } + println!(); + + std::fs::create_dir_all("out")?; + + for pass in &preset.passes { + let label = format!( + "pass{}{}", + pass.meta.id, + pass.meta + .alias + .as_ref() + .map(|a| format!("_{a}")) + .unwrap_or_default() + ); + println!("=== {label}: {} ===", pass.path.display()); + + let source = match ShaderSource::load(&pass.path, preset.features) { + Ok(s) => s, + Err(e) => { + println!(" !! ShaderSource::load failed: {e}"); + continue; + } + }; + println!(" parameters: {}", source.parameters.len()); + for (name, p) in &source.parameters { + println!( + " {name} = {} (min {} max {} step {})", + p.initial, p.minimum, p.maximum, p.step + ); + } + + for (tag, version) in [("100es", GlslVersion::Glsl100Es), ("120", GlslVersion::Glsl120)] { + match compile_pass_glsl(&source, version) { + Ok((vert, frag)) => { + let (slots, lines) = count_uniform_vectors(&frag); + println!(" -- GLSL {tag}: fragment uniform-vector cost = {slots}"); + for l in &lines { + println!(" {l}"); + } + let out_path = format!("out/{label}_{tag}.frag.glsl"); + std::fs::write(&out_path, &frag)?; + println!(" written to {out_path}"); + let vert_path = format!("out/{label}_{tag}.vert.glsl"); + std::fs::write(&vert_path, &vert)?; + println!(" written to {vert_path}"); + } + Err(e) => { + println!(" !! GLSL {tag} compile failed: {e}"); + } + } + } + println!(); + } + + Ok(()) +} From da73a4fe250d963d06b0906ff1717b66a5397adf Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 08:51:20 -0400 Subject: [PATCH 30/33] Update crystal_version_test.lua --- tests/engine/crystal_version_test.lua | 49 +++++++++++++-------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/tests/engine/crystal_version_test.lua b/tests/engine/crystal_version_test.lua index 894a4504..cddcacd2 100644 --- a/tests/engine/crystal_version_test.lua +++ b/tests/engine/crystal_version_test.lua @@ -84,37 +84,32 @@ GameVersion.set(savedCurrent) -- ------- 6. the importer's required-file list -local RomImporter = require("src.import.RomImporter") +local CacheContract = require("src.import.CacheContract") -love.filesystem = love.filesystem or {} -local savedGetInfo = love.filesystem.getInfo -local savedGetReal = love.filesystem.getRealDirectory -local savedGetSource = love.filesystem.getSource - -local function probe(version) - local seen, order = {}, {} - love.filesystem.getInfo = function(name) - if not seen[name] then - seen[name] = true - order[#order + 1] = name - end - return { type = "file" } +local function requiredSet(version) + local prefix = version == "red" and "" or GameVersion.cachePrefix(version) + local required, isOverride = CacheContract.requiredFilesFor(version) + local seen, count = {}, 0 + local function add(path) + if not seen[prefix .. path] then count = count + 1 end + seen[prefix .. path] = true end - love.filesystem.getRealDirectory = function() return "/source" end - love.filesystem.getSource = function() return "/source" end - RomImporter.isReady(version) - return seen, order + for _, path in ipairs(required) do add(path) end + if not isOverride then + for _, path in ipairs(CacheContract.VERSION_REQUIRED_FILES[version] or {}) do + add(path) + end + end + return seen, count end -local crystalSeen, crystalOrder = probe("crystal") -local redSeen = probe("red") +local crystalSeen, crystalCount = requiredSet("crystal") +local redSeen = requiredSet("red") -love.filesystem.getInfo = savedGetInfo -love.filesystem.getRealDirectory = savedGetReal -love.filesystem.getSource = savedGetSource - -check(#crystalOrder > 20, - ("the crystal list is substantial (%d entries probed)"):format(#crystalOrder)) +check(select(2, CacheContract.requiredFilesFor("crystal")) == true, + "crystal has its own required-file override, not the Gen 1 list") +check(crystalCount > 20, + ("the crystal list is substantial (%d entries)"):format(crystalCount)) for _, path in ipairs({ "crystal/data/generated/encounters.lua", "crystal/data/generated/landmarks.lua", @@ -184,6 +179,8 @@ check(Opcodes.TERMINATORS.farjumptext == true, -- ------- 8. the launcher reaches the crystal tab +local RomImporter = require("src.import.RomImporter") + local visited = {} local fake = setmetatable({ tab = GameVersion.ORDER[1] }, RomImporter) fake._switchTab = function(self, id) From 1bd6e3593148b25c19432c8b8080a5b49d473c8f Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 09:02:56 -0400 Subject: [PATCH 31/33] copy rintro --- src/import/CacheContract.lua | 1 + src/import/CrystalMovie.lua | 45 +++++++++++++++++++++- src/ui/gen2/CopyrightSplash.lua | 23 ++++++++--- tests/engine/copyright_splash_backdrop.lua | 45 ++++++++++++++++++++++ 4 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 tests/engine/copyright_splash_backdrop.lua diff --git a/src/import/CacheContract.lua b/src/import/CacheContract.lua index 0459e895..dd4e8503 100644 --- a/src/import/CacheContract.lua +++ b/src/import/CacheContract.lua @@ -98,6 +98,7 @@ CacheContract.VERSION_REQUIRED_FILES_OVERRIDE = { "assets/generated/title/crystal_logo.png", "assets/generated/title/crystal_wordmark.png", "assets/generated/title/crystal_suicune.png", + "assets/generated/title/copyright_splash.png", "assets/generated/splash/ditto.png", "assets/generated/intro/chris.png", "assets/generated/intro/kris.png", diff --git a/src/import/CrystalMovie.lua b/src/import/CrystalMovie.lua index b0d943cb..fb9892b3 100644 --- a/src/import/CrystalMovie.lua +++ b/src/import/CrystalMovie.lua @@ -258,6 +258,44 @@ local function colorize(image, palFor) return out end +-- engine/movie/splash.asm:20-30 sets SCGB_GAMEFREAK_LOGO before Copyright, so +-- the card runs on gfx/sgb/predef.pal:79 PREDEFPAL_GAMEFREAK_LOGO_BG. +local COPYRIGHT_TILES = 29 +local COPYRIGHT_BG = { + { 0, 0, 0 }, { 66, 90, 90 }, { 173, 173, 173 }, { 255, 255, 255 }, +} + +-- data/copyright.asm at hlcoord 2, 7 (engine/menus/intro_menu.asm:1315-1326). +local COPYRIGHT_LINES = { + { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c }, + { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x7a, 0x7b, 0x7c }, + { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c }, +} + +local function extractCopyright(self) + local symbol = self:symbol("CopyrightGFX") + local raw = self.rom:bytes(symbol.bank, symbol.address, + COPYRIGHT_TILES * TILE_BYTES) + self:write2bpp(raw, COPYRIGHT_TILES * 8, 8, "title/copyright.png") + + local painted = {} + for index, tile in ipairs(tilesFrom2bpp(raw)) do + painted[index] = colorize(tile, function() return COPYRIGHT_BG end) + end + local backdrop = COPYRIGHT_BG[1] + local splash = ImageWriter.blank(160, 144, + backdrop[1] / 255, backdrop[2] / 255, backdrop[3] / 255, 1) + for row, line in ipairs(COPYRIGHT_LINES) do + for column, id in ipairs(line) do + blitTile(splash, painted[id - 0x60 + 1], (1 + column) * 8, (6 + row) * 8) + end + end + self:save(splash, "title/copyright_splash.png") +end + function CrystalMovie.extractTitle(self) self:beginStage("Title screen") @@ -348,6 +386,7 @@ function CrystalMovie.extractTitle(self) local gemTinted = colorize(gem, function() return pals.obj[1] end) self:save(gemTinted, "title/crystal_gem.png") self:save(gem, "title/crystal_gem_gray.png") + extractCopyright(self) self:tick("Title screen", 4, 5) local function unit(color) return { color[1] / 255, color[2] / 255, color[3] / 255 } end @@ -356,7 +395,7 @@ function CrystalMovie.extractTitle(self) generation = 2, layout = "crystal_title", source = "ROM:TitleSuicuneGFX + TitleLogoGFX + TitleCrystalGFX" - .. " + TitleScreenPalettes", + .. " + TitleScreenPalettes + CopyrightGFX", screen = "assets/generated/title/crystal_screen.png", screenGray = "assets/generated/title/crystal_screen_gray.png", image = "assets/generated/title/crystal_logo.png", @@ -371,6 +410,10 @@ function CrystalMovie.extractTitle(self) suicuneEvery = 8, gem = "assets/generated/title/crystal_gem.png", gemGray = "assets/generated/title/crystal_gem_gray.png", + copyright = "assets/generated/title/copyright.png", + copyrightSplash = "assets/generated/title/copyright_splash.png", + copyrightBackdrop = unit(COPYRIGHT_BG[1]), + copyrightInk = unit(COPYRIGHT_BG[4]), -- Strip 0 starts at OAM (64, -$22) and stops at OAM y 22, i.e. screen -- (56, 6) (engine/movie/title.asm:306-311,340-362). gemX = 56, diff --git a/src/ui/gen2/CopyrightSplash.lua b/src/ui/gen2/CopyrightSplash.lua index abeed958..9b22ff15 100644 --- a/src/ui/gen2/CopyrightSplash.lua +++ b/src/ui/gen2/CopyrightSplash.lua @@ -23,6 +23,11 @@ local HOLD_FRAMES = 100 -- Only used when the extracted splash image is missing. local LINE_Y = { 48, 64, 80 } +-- Gold boots on the default BGP; Crystal inverts under SCGB_GAMEFREAK_LOGO +-- (../pokecrystal/engine/movie/splash.asm:20-30). +local DEFAULT_BACKDROP = { 1, 1, 1 } +local DEFAULT_INK = { 0, 0, 0 } + local function tryImage(path) if not path then return nil end local ok, image = pcall(Assets.image, path) @@ -43,6 +48,8 @@ function CopyrightSplash.new(game, opts) self.image = tryImage(opts.image) or tryImage(title.copyrightSplash) or tryImage("assets/generated/title/copyright_splash.png") + self.backdrop = opts.backdrop or title.copyrightBackdrop or DEFAULT_BACKDROP + self.ink = opts.ink or title.copyrightInk or DEFAULT_INK -- Text fallback only when the ROM extract is missing (tests / bare boots). self.lines = opts.lines self.frames = 0 @@ -78,17 +85,24 @@ function CopyrightSplash:update(_dt) end end +function CopyrightSplash:fillBackdrop(width, height) + local G = love.graphics + local c = self.backdrop + G.setColor(c[1], c[2], c[3], 1) + G.rectangle("fill", 0, 0, width, height) +end + function CopyrightSplash:drawPanel() local G = love.graphics - G.setColor(1, 1, 1, 1) - G.rectangle("fill", 0, 0, SCREEN_W, SCREEN_H) + self:fillBackdrop(SCREEN_W, SCREEN_H) if self.image then + G.setColor(1, 1, 1, 1) G.draw(self.image, 0, 0) return end if not self.lines then return end -- The Gen 2 font is a fixed 8px cell, so centring is a character count. - G.setColor(0, 0, 0, 1) + G.setColor(self.ink[1], self.ink[2], self.ink[3], 1) for index, line in ipairs(self.lines) do local y = LINE_Y[index] if y then @@ -104,8 +118,7 @@ end function CopyrightSplash:drawWidescreen(winW, winH) local G = love.graphics - G.setColor(1, 1, 1, 1) - G.rectangle("fill", 0, 0, winW, winH) + self:fillBackdrop(winW, winH) local scale = Chrome.fitScale(winW, winH) G.push() G.translate(Chrome.fitOrigin(winW, winH, scale)) diff --git a/tests/engine/copyright_splash_backdrop.lua b/tests/engine/copyright_splash_backdrop.lua new file mode 100644 index 00000000..9e82b458 --- /dev/null +++ b/tests/engine/copyright_splash_backdrop.lua @@ -0,0 +1,45 @@ +-- Crystal's boot copyright card is white text on black: SplashScreen sets +-- SCGB_GAMEFREAK_LOGO before calling Copyright, so the card runs on +-- PREDEFPAL_GAMEFREAK_LOGO_BG rather than the default BGP Gold's DMG boot +-- leaves up (../pokecrystal/engine/movie/splash.asm:21-30). The card used to +-- hardcode a white fill and Crystal shipped no extracted splash at all, so the +-- first screen of the game was blank white. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local T = require("tests.modkit") +local CopyrightSplash = require("src.ui.gen2.CopyrightSplash") + +local function colorsEq(got, want, message) + T.eq(#got, 3, message .. " (three channels)") + for index = 1, 3 do + T.eq(got[index], want[index], message .. " channel " .. index) + end +end + +local gold = CopyrightSplash.new({}, { title = {} }) +colorsEq(gold.backdrop, { 1, 1, 1 }, "Gold keeps the white card") +colorsEq(gold.ink, { 0, 0, 0 }, "Gold keeps black text") + +local crystal = CopyrightSplash.new({}, { + title = { + copyrightBackdrop = { 0, 0, 0 }, + copyrightInk = { 1, 1, 1 }, + }, +}) +colorsEq(crystal.backdrop, { 0, 0, 0 }, "Crystal's card is black") +colorsEq(crystal.ink, { 1, 1, 1 }, "Crystal's text is white") + +-- The extractor has to emit the image too, or the card is an empty backdrop. +local CrystalMovie = require("src.import.CrystalMovie") +T.eq(type(CrystalMovie.extractTitle), "function", + "CrystalMovie still owns the Crystal title stage") + +local CacheContract = require("src.import.CacheContract") +local required = CacheContract.VERSION_REQUIRED_FILES_OVERRIDE.crystal +local found = false +for _, path in ipairs(required) do + if path == "assets/generated/title/copyright_splash.png" then found = true end +end +T.eq(found, true, "a Crystal cache without the splash is rebuilt") + +T.finish("copyright splash backdrop") From 2c1c2fe0801413dddb68fbf5e16e2e8607596da3 Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 10:00:42 -0400 Subject: [PATCH 32/33] Create liblibrashader_bridge.dylib --- .../release/liblibrashader_bridge.dylib | Bin 0 -> 9475136 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 tools/shaderfx-bridge/target/release/liblibrashader_bridge.dylib diff --git a/tools/shaderfx-bridge/target/release/liblibrashader_bridge.dylib b/tools/shaderfx-bridge/target/release/liblibrashader_bridge.dylib new file mode 100755 index 0000000000000000000000000000000000000000..a93711b2a52139f7732851c3c0b3632740100eb0 GIT binary patch literal 9475136 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 z%0A3!DLb6u3F*7bQ}$7Yr`(xIabNdp$?ttk@^`PpUs7NAMCR|_Y4UqtHu<|>!Do4h zvN#Fj_KhKmcecsjI>+Qk9N*0Lq$%Dc_{H)8O46q`mv^wFu=Ag4{Tu_etk%;qN$@VA9%MbZ!c9#X=Z$l=H5ewEB@Ja0{+iz9i*Zs29v8$yrZkOjIK zv3{1hI>FDg;eN;xj(d=01=roq1b6qhXam|(^BY!wu>^BeIAXPXAQ$Fb>W}xzO-HO* zOlh6Y{FZ_sbq-*+V0oJ#hB_U78t2_Bm_H|&_02%vCBv7oHySfNeVv)=_ucqD)|t6D z#N4+Qe@kKi>U>hrPw^rS^AAS+oP>FAQr2FouX>=QOu3--f1;J0x4+18lM~qh&xU!s zJR$vedA^1Go6tUL4{V{O{DEC9=6<^p$78(!UqJoM3YgM@^;}#Z@S*EQ?K+CCqqF>l zSbMd`XZhQbU}G2)!=T4j_&fVA99^u!J|dJo_`7M1(sRfs+Ri3s`CCC3W_8X=NeSC> zZsbqg-rFVr+3AwMb%x|WH?o)e+-%9;HV1Zi(5iTnLX}4J-NoCPKMwYLaZ;AwH#rMB zwqZRe`4hv~`BNJpC+wYUr3LG{a0_!?dLYYx(iGRmHd8zf`UUtyoB;ps_b$a>9{OVi zWZ4<&COvr$nw6Fn4*yq(rM$Bzt3Kk&Z0673%5pDZOcM<&ZOD*H8!=|0cd^m~8Gc|= z=|Nn_?4mxe=+EjSVPCE2cT2FPGOBgmu~hUm&Bd3?BxN^ZmCwqg^NxOy7j-2{k!`d# z^P2M1btkRMI?D3)luTen^WmR52e2cmFT*@wlbO=FP4ai_l;HcdIO93kan`l&`tHfW zdrQW!BJ@LUH*``G#fo;|JLU-JL-RMEz_*g^`zGJEmweo2lVh*o^ZCs-7ZMS+%|CJM znU6X(TesCVqKpTAqhq#tuWycdujh3MdJlshsQ-H_G^Z|rjV{iB9h}CR9(7kptl2{A zdzE&8N~ijVm~`caPv93w*YFVsPoWIgbN(N&&MI%n@XRjFya*nJ;OTw9ytf)-r3Lk& z9_2L3{q4u

`5q@S`9wQv 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˚iTGn&VIT*e*jFgH6zYB1WdC@ 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

r+eY{VN!+ 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

G}-&B9n36Tejq&cm;O80ntV1OGVCPXA^8svS*Q> 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%0A~PVQc8g&Udk%Trl<{1-2Gnf`;@TH9^ZDS1(F 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

Og4_rR9el;_U` zC;IUoUitm!l=G9{U%+$8@BQ=`<&4+SQ#kzU#oz|Nb5}YGO9${3@bYBv^Ca+e2{9ah zUAHxU#+%aJox^-gs7YG+$=LSVLfR3nP!u1<`Pv^N>5p*FRoi0wGEL{5_QbAa;%dZq z9V_yK>_C2FKjSiB;>>FO@KD4a5RV3C<4CXi+NIPIU5QFI~p3d+GE+t8(xa*Kp_KP2AR zqCh`WN02`$uSoXyA0mspE$jTj)SrOoWDmsA{I}iHvtcl>zk!{*KfetY) z#8=kcYiu@ofHPzB0J5{kaNgI>{@cKg#Zza8@4_cezmJ+Ue_D9Q80TG9__vYY>EV~0 z-;8gY^P6!!@BGHE>REm}b047#J#xV%%)e;d6nv!Q2gP_=g=bb{k3GiYBlQAnspr#y zamDlOK>7N4V!AsnYYh(0t=P!18d?kcTRWtNfn&s;3a?At#}qEuX^5@ z7SA$)Z%KBmF^ay^T{1z*1LwoLSpAL41mC3mt+t;OyktZ!nB(blZ~UZ204sjDO7`rF z1{iap-KQ@~HsV9d>>Ki+RV>wJUpe=o*20^NP%SN1m;kAXdq_ZvU5 zztPAzDq?)2gmvw598cQccpMn$*ZCVu?QfLx4f#5D*%os#NpwVwF}F%Qf@j`uvD>O< zP9}EO);7B><{+1O^0sx2-BuI*I;Fd|fCIB%jCCtG$=lYYPQPd?leQG^ma}s1UTh4T zz?Z?kM$vWMed8Yc8%wRcfZlHu+21H-?9Lv@Aiqcz{7qyJfajb%(FxE5}eyMw(&b9k^z12r&pRTg^X@9$q<(xfEA0gUf z<}TbD*RhZD`xs+-+?QY5ePNx+u@b=^uhAz1e&YdKA&Cd1p58}UFyB$kmC9a*I&6pJo||IA+8{2>oaFt zeEzdWTkSJk4xbd^iRa$J5)Q2|ZANEb|ns>uOk&X>Bd?wsjTxS7^Xd;k6Q_~S&~0y97U9+X^NMxI6$r1M z3tY{kPwYigMlL;se759ws_!^98`3c)16Q@s!mELy2cd->JDG1#U(e_94tV2dipJLakqmItmtjfxk(rjP?d0pvHqi_m* zbU`2*_o{J7u<#sD+^diN9FLXu>XMZ3Z}Jfr)dH z!;ik+5$8w_-;=mk^3Ax7HvN2I#{nOXto;i79<`3rxj%fy{|hm%?6_4szevn0cri1k z7W8^|F|US3#+eq*;%C3ofo{$Uw@pctE!RE3cf4nXpMP&Pee|=b{5|!1V^jGSaOfv1 z>8VYnVphpF<4boZtsKgA8dm}^{~Ya#j`-E_*4pQ|96CbqUq>H>*Y-RcTh{vy?|Nbn z;`rFz&fXP$yc^se6#tZ3os|!7drs=oEaCf%K@Vlk3m8S!?A0b>9JRN{=eNneY7+KU zld+NhFJt9QU_0%k;)b+-##rHr@7rr3*=8De;ui2ksmphZGq*LZJdmFeBmc>5w(fnc zt$UX}9I+HrWY6{>_H5@$)@IwYEsM~r{`PFLlWfB-;UImKtz;=Qt868|MIYTZ0m=#cAR@s})}V%e7*U1+*Xf1DQ4AD5nN*%9w!EPm(K;n&)0 z-EgUMYjrpJV}rf%D(wZ=b&TJjoGHsskDgg!{Hzx6O#5~g_m5ArXlI>a>rQpf+?4P- z%B>$!+^{!jj8!bhrRaonUAoFhz6fL!dFUUp&5!7WOKhERLPRH=-W=5lTl4TdI7WI} zuTGeFk>QE9zhWbCAcOCO?3g*_Epu$0uyn&(1Ig?a2U5C0OWzFNj!sy#T^Y1S0(Kf! z?3;8`pC^5_bePwLwvz)Q^pL(U-JoPmk^1O`BlVFxx$9RD4^nlc8&nz1;pNQJtglP= zo*aG^+Y84w?^2#WW$NUk`uEL$bmmtvozudy-76->l~ZRjbv6yN+6o|JlWy#>4s}w^ zI%m7;6jDducFM1Hl~;Xz<4dmc1)lQv`;^ail^^CQ|9w~atL^p&xXKTvJZEyZ^uh3# zEc&3Qeqr7DZo1FjM(BfL@&D`xH+|sPb9!~E^_27ag?;vn8I<{;`0v%ojkf&Y(OCHy1XOZ>)p_bfCI{cAOSM8KW0RTTVh2L8P^k!6wGhW<2<+a@xP zxRR15j-ZcjdMB1mKtI@7P6#c&=w}1IKkIPcwbS3h+gn5$J5EzYe$` zz}V}6dpC_!4_v1~7*x}Qo#E)=(zmBqG=FJrR*<|w`Bzr7%qC~M zY)fXMzX|caJuXxcFI`S5`HsH1b$mT-8-cCo1w+U~uxs2CUv-|^UcYQ|{hm9Gn)BFO z$WzSxAO!(qWfSs`V0=qq6YmVpyWg;nQYhbaO`rzZON1`l%m01Udw+7kv=h`BkdlH7 ziL!xEas3|nwv(N<`JJq`XOLGWuB9keTaR84_`UXZy4jX!Jmu%PkUd+*-kri8E@dxY zP=D-(^Xu8$rtCyK;0#j-U_)*NIQV?~1nFD+?EW)CJ`YT5JMM%%(U8rOZVblih= z?7?5!d$2A>&N~BLMg?sIXLgM5uubPNPw^x4OKsi5uj5walALA)-Lq|Dl zXZgM4t3lR9@>Mr(kUxgx_xGn64b?V&SPvdtRXC~j0rvXtxYXtV_Gr~*#jVwx=~ctF zo)%6z1qWvu>;5nq&6!K<~HbXtyvLkwjH~KdU(C2_)u8(Z`;8shuBk%3G5mEqq}NW z-Nn$TAM?BbI2e8Wf?XAF+h62m+Iw}8y_XvC75WqJy0h#04EeD3S&D&u!#AqNHw9Xr4kFJI zo^8xF#vI`rvyZQxI@?%xQx5Z%1}@F{rt#@}%-`Wf#&`_$YZ}S>nNJ^QGdEN4bJkq# zrQUS~7L3>NTsXxmvu(R}GWcl{_$jXDzb3S&ms3voKM}i)`HaW!yVs!KW3GRpKIF5< z$D6q%Gs8DBAA(ioK0G`!P`?MAp=IBcZqoY6z+z5C;kdo@SN;2{r*B`u56dn0o<@6L zKfd<9HSJseF`x0zXZ+9suQ`4g;K|l2dH*2qZ{z)Kyccd9AD^}Shw& zLXBxHvRd*EV;ec7c_cE!1&l2}KDb8i*gVTsT>AEZ^q+?m1&4V@+VJDlZw#$-L8gqo3)JS9JXE z7(Y5>;nwc*iApa-&`DD-w9b_`v;MRc$$L@3U9@X#w!d)K% z`)=GNy`$ul`i=z`mhN#G;}Gt82t4KXCEG=PXZ`ig4~H#f%^cVe54(Mml^fZ42A(kW zMz1sWSa{8ZxxcrYx|XN-=8fQtuJ(y^AZ!2pdF^J}6kcd(vG9VvAK=p2?8OC&VbIrp zr#1K?-%(xjd|wpR^{nE#aLOxBb&ogJ4>iWP^&vXL1z-2lhT0W;Nf)r%)CHu3*S~C@ z;pYCyCV%Wv^2Y{=aZnDtE$BuMS%qw60qq7ibksvieljKkZ^_|lCcGtwOOQ!E2+V6g z%wv6XjO^x8aEjm|lAo5n*2-R6-9>)dtN5mL?Ph-32u_LSr#;GhGe513Q_jeD&h+H) z8T7@CPbN}Ub1S+&pLb5~*&iK?))~ojZ|>RU=%^j}g#4)`Pe@L5XprP^nmOhu4YJ5p z-jP3?=qjIJmw)KE({6IOulX!3Twu>t6EVBR6FYNt#K!X|?KTM~HMww-gMSAyJ_r9E ziOf}0$G?I1X6{*gu0F_%e*XjfSKM=T5csp^DmDBU-U(kjbkPOw@v;7zk5?0-^YJ?6 zd!v62_d;eM`XU$H@&^6$lNosR&);RtwLbdi=cwNs{quIt0?|iXfob6pNB`U%o_N8f zgKh?|jQ=0>3E+!*+R^?GAF*(U_O9l8l{xR^OxYA$7yVn_3D2mGd(FOY*WJQ<=~UaU zje`e?hZpGsPl9at))VTF-x;VGku94~=>1Z7tSrfitsEJW6$^jdK|6ln7I$34cl~jP z=#h-@hrD;=j^VETFx;~r&Y-NdAJG5t&cPk`AC2yz6rQiTydw{B8}YxRxWkfn_Hpf% z6U}i)_tuTB@(%832}SqT(W3U+r9Uc_U+Hqm-j_l*CqUblLEGlfp3@S9t{q-kzFB?! zgtG2^d!?&whd0{mYWsc4Z$jSdu5*#Aj_4Zg^*^}kyhWXV_g;S&c<#wwU%(pq?e%Tc z@6BGXxA*$5fy0h_y>qS`_L<4oJMuyCN|FywyDMpBDc9NT?r|PVp+bRvWVP=E} zX8O|?!OZzxz|2J6wNDOUtJK-I)X@o=@Byxmr#)x=<@;W1(~4=<`fqS}EzyYcyQ2}I z`99{`%K78ARa+0vc#L&+)_+H#@KSPkG3!5&=MG+d$$l<9+&1$!cF*k&{!9)($FtAi zDINYX3tf}!qpFYv1mT^7eZ}KWd{bw$m!D@o%zdhH`_<8$e)>ymAF4ka8Hb*I$g^WN zJcAt1U)QSk&gR?YgRud7BYv)Aq_sam24NVjEh9?mbKoN>7xIp;VwvHr0_-TJ2L z2^Q_By(3;+I9a(U-o|$EorvwC6>~vn-TNx{o>AZ0pPW&qZ9z)-G@i92uouuV$aZmF zA#rUAkvjo<2a!ir_n*{KfGoQ#5ZrkoGI(;nH0O;qribB6OYqB_Jw~>Tw8LCgBZK%6 zK4)Wr;mfhfeAgAHH9XcCm%mM>+txQo*_qJ91L>O^&&kF{c|bIOZkx;}C|A^M)SrVt zpQA%-0nTMtF#(x-C1bmVu^o;x#^e=2Uof^q$n)zNTPb6+Vp>eTKLKUUWOUz43Twa=Lw4RMDaqW`8`0A@IUBlv&*b9@ay)azAS^s4} zDa%j%v}F7uWKnzhM&exQ5{PNcHxlO+H!L@dv5A#>7OI#z!kC_Ld;k1UCGyE{TW#i2 zN4_-9^L*el^eNx8-!H~TMmgcM7hYiOo%X_Q1~gXJ`(PvW{Pw|(jNPISlfys2Z)>qh z6DEh>IN8E=0s8Vfzujf-Sn>~@KE3b4>$jd;o+uk z;K9L*0diPsUA(yKrp74ly4-KQdV;$+Z!XZ9-PjR#?PWdUwPv=hf_&}FGYOelIqT%m z`m0-_XHh0)9`Mlmi?Q#H()t#y93lph^(;Bu&!^7KK6Q?r5Uta0`gKP6gK}4Shd=nl zRsJ(i`EU4?f8SO9ZI1a9E!*=dTHX{Z3Az86yTOcqA@_mYZ~d&bwm{h~DPIOffyftkyr{MKBat-0*No>1jCJ+x#h zI*SJ2wdU}NM(YxHY%-oXHqReEW7*nEPqmIS*sS9!U*+-F+CzEyN+d6y(eeOmuJiaW z^v78*WE_JOD{l&PYX183YTPmNN)>-=d~Bbw?!LW^Z%Ys3w!b>t-s668xx@H>b>)9G zLH4ZBiKWD6tV7pZ4DNf3u}E$uxOc~-)_2@GkSV~F*Z%5$>MAaGZ}{VI#OBr?KfCGS zI&?a@^l=H_anlL0e0g%|qaS}foBFZ%<8ol2-qy*~gKs25y@CDUr;8B|a_E2(Y$^lz z%MAZsys0ZZ1AbI%RSsQ>-Y;TX2OOGyVpa0_biv_wZt7Vqzm@dmd@kt?FZf4m?fG27 zO@etpyi>lR`@NESdZ)eO>%%!b_Fl2Z5!K6@pZx%b&C9egZatCAf?v+OB{$K2sr}<7#_R81jqu*ZnU+VW}uRMBEFZRlxtiAHz zHlN?qz4FN1p6!+G^yOAA?Uma;ZLPhPtE;{8@Xx#7D`QvpY_D7n{3#Z)&$;3YuVs{X z&K2Y&=DAYJ-1m5|lzj2MGP;+0rJx(XANRSEXWR9rGM1j~m0wcMyH}30F1_6=1rhqT z`*S7Frf)ywJ3ZMe%jl!uUfD(c-t3ikM#kPN7QGZZrt4tf`X%ZMwtxLeYwb&1UBUKW zpXdQ>uk0CYuie}`*uJ0g4s1I#Qw?*~W7z)c7l-Ye`S!n?X8IOm=?QEfqnsDE&*xch zVf%~FOk?>@PheXx><8OJc-|Y>9?=DCyJ@CbCqXj>$CxzJKKPs7&`iT`?AbYR0exv5 zVeOT+k6UY7xw_gb+3Xc}zRS>+vs$J=C+8ElD@Y#b5b?Su;+rhlxt;fN{B|Q~=B+gF ziB--@+1%WBN7BlNxSY0{@o7^2Ov&~V&iKjHMB@9+q^+DPV=lbh^izg!U9&cjZ~z_H z^y|nCLN2xO9|nxV3SwMfkKUlXzLfn`-*w*iBX_3xo;buRBb~kT{d@WL_gvo(@$Edu zlE61}>BEe9#@v@_>%z;7%N8XWbNA7Q3%|*4V$fWTt)4Ts&hA_#8WZno&vY7``)u`J0Ko;}G!I4C2F-@Vx}a zT*jE^kV918gNJTFkKp8HAHN@eHnSg$(`hf^$0f4C+!-8-9bjl_^IrOpORQ$+eL3U5 zk?WgW)3|QoYMJpIHUCWIi2uXv8lmJYxHr8G*C|>m$F@4;cJbo`K`HPUf4F_;v|) z4lkK7@(udqz=xGv)oSkm^E(mw@pXJxu-1spx$HvAhHqb!2<$M&2WIJArSYl3+)?J! z^~|%gX8C<=c)YlHvojY??p5V&J!w$c!UV>v`(E0K)QdALICjnPl-r8$*V>FGwsi%$ zYRa%lEgQ9c%>lzI8w`b(W2+filSz!}bgm+PyCtlM&BBxmt*|WQxFSb&BQ>) zftid`dJ4hbJbR3FjKy8Po^gb}W?VLry*q;PifgX1G-gTvQ9K@=s;H4T4E!b@XL7}! z^tD-j@R%cbq8@$tbTPI-2H*58NBgnbX#9!xWN;_zbpHa8{Pz@HT(JQbUll<+>*_2-N^m%Xoe;eKt;q^;ezC#@7t z^Xuzg-tFf)e8sO=JK*qE_WhmKp4YsmFz?lxci|!C-GRF-2kw|_cNqh`r8U~4c?O1t z1FO}pF)y>nyp4HOY|1Upm?^)MF^4;h`HeNR`)JJbOdFWD_-1juQKT4_er>K}tXmjM zwY{!&arjf)>stTAB~#%y>~)#MSWCb)FPgAwtz*Y$)_iq*_9SgLaK*CIaPoR(Y%OUG zJy+5ij3-wXcwq+n@iF3-CEhi8*BtD8f~hUNaKdhKsBdN7?pYlDuX(>GFeCEb0Po#{JkBYf ztN+-JJO7LIA9<|vf2RK9ujBl$(tpky=l^;yEF6{8VRe z0pGJ?i;^1}7%is%Ey7#f*wj4nGuxgA{k!CsihGss$w?nX&)$elZ7e;zU#wllu#(SZ zA-dvs&=u#~e)e-B{G&f_=H?&EZT|5t`sk)#o{vE>&U&2u&Kam(jYF`$$y4}N2# zaOZW@U+@C{Z#*ymO*GC>#5eT$&T)q3^n!;hw|U5`JpFWJllqQZr`<}q`Oo7M_X6=Y ze-rf$on-d2=f0s!!B;bpQJ$ac^$qp+4~f$`VdowE2-rBAdg3AP;C}W;7F~QMcat}Z z=rK|v{vp#JgO7~wI_|GG2Uj_8Glh5%iwtA#_(9cKcY@22@2xPVOghe9K7MFgAfK4{ zRvd_UeCDQGaUe2?1Mzl(6$hfPJ+I~6z-VR+I}pY08lHnZ$c_i$_z=uzU9{Kz@*72S zdUx*|8AOg3qd%#WXMq`u?M7g5Q0oP0*NxqKsEp#H7EXe)B#j=sT}%}c?1EyR&X zuN>c!2Hy9ZLuAc0CU+jor>L-||GZH5`&Ap=^b>)3+%cD|&L4P%cp zf1-JnU&-vlu@ejb4h&rl&T?SN>0jZ|6AS;wyN9SFUBVAPv|vkc)f9oNXpD&G!@$+# zu5-^ga7Ap0u-b9M)db+`YsY5p>Hu4b#_=Q5;`0xUjK&!G$utYLGJ&lJ?HD89Va~Ni*M3K5IaKS&Om*T_!`EGhM5yClkr=66LKUEbAG3W@8GvLHpyyW zME)#h9AHl_w>iq6gA#S{-r25p$kq;F;)d|=Y)p97PJnS0I0k>)5&27O{-X4){h ze`MVC$8LznrmhcsTVH6Z6QHe5gpLf7|01sDAn+J0&K>54Np$gZ#{rW8?8%?QPfBu) zjSk+s*v5N_=!FItzjEWg&!<}OnGSrWCmLhZ11ArYj`7#@MY{JcVU#mERvaApknA1W zUfZi&G?9E<{;?+AHeIE_n`|c@qMx#1*ZgKe_r=OZGak6|%SE$<`pQKk-|&vGmeIT& z{C5N!E%|+qaqyqdTy}>8hXQZuCcLG`gtz@8CtVLdGHozJ9+;~DeuM{=FGqd(1Gr9S z=?E7dbozO)?Zm>r^6p9-=DzNNxyA?{jQT#`Rxdei-0$~~j0fiW0CRnTxf6i76M;G4 z?bZ-{v;%W9JHedrU?5mEH3ygzy_6RC_W!=|`OIB7U|8pc=1Y6?s*ZSZrVV#)yqL#Y z{Ihs5oi_aN;x1s((I=l1`JEab$M4?Y#bv$3i-J?(#ZQ^%p5VnF(0@O?_%`*s!i)95 zs)Kh@+_37J`|j}KcUhAtUYx@EmjVYD01xK_7hlB>_AB-KM^3&TcroGBiyOBwmx5CV zHy*U%bdn2BBYotZ;PmIz(cax~pljUtdR=eev@>oL9T>pYb{;-{!i^>#OgAd`kl$YTxqX$CTcg~m;i zM=NgiTVFQ@w@)<2zczTkbB8L^r%fRaY5wuRWf!pr()uW-Xh%NE zvCF?DenZi!_`0H};@1_u8Na&daQup*v_92Eg?*}uF7LCT=$1Y=7Om=2Ui4I-nMH5* z`Ol)meJ(9Z>swk>*tfXo^1kDWZs~hQ(W<_AMNjq3Eqb$WM$zHE1B-UY<=nJ%aMj@a zzDu)C;rl^j#nfxLZy!)KIFI{&?xGJv1FHs$XUXS2g8LNix!h-SAI5ztcgfZ3x#M$? zvYmSd_x;?{xQ7N+4OYB@eD1Q3o5Ef8akIJ0K5i*@*~is$muz)A_aOKE+-3I`qK~HR zfxB?U6z&N_LxbCi@t63?&!-j-x^Q6?^DRBVfr-WA3jzs=dlHHl7H3|%u$kw!S_ zE8(`lw6Z|@SrgAQ&P>?4ENfzkappy|-Hc6p*?EC!*PYjA8aapttvx<*F0m1(CsMB; zm-??dAD*~2E3xYPQ!DaAi4}v=2LJAkoM|)8Gj6)O@7k;!Xt$F>mrPjt2EUPWmZq-F zny7Dsvx1|H!L!dxD#!~23((nA#)1#=GGCN#6mC?`OyR{K^k3TT1E&cGM)t3G=BqmL z%r{=z83&GIfBdsJaC-K?9|!iQpFP2WKck!<4m|YJFMtDGbLh~E9dKZLlxMDCZlgHR zpFeTai(VYKn>lpz%{{?^zoU-!)+iL`u)8z(Q|2}b zf4x70Cw>9=JJp82)4GAbO9g*jpTXmMat4ot&hVbWQ-S}k&fvm68#rt0IBVB&)~@EP zUBOvf%~@N;S-XI<_D0Uya?aYBoVEYSS$ipGZ7FAMaZ%a{53_gqR2M40Jh%?5=!t?)MJDaNqR1vqwI-3hPn@?p9n(j!Qwv^|~a;iF= z%?X^%qD7puIgzuuV5pHC#}hX$sdGSq;^;cVU(Z=TIM zm-B~JO%+XX%6Z11597ua-Ax;dIC~R0d)3B{J2E)$GY98WH;Kz=EMB-Svv}dD)XNQA zyf8RudDgN)!_H3VYn(l&i}gyJ|Ig#g>VE;g{N8_b#+Mhdm;PCNS)Tdt$Co4MXHW3u zR?7LE*CC$&J9(BLGq?W?zWj_i?Cp8ImpVGH-}`IV=XIYS|7-B&S-VgeA4))K}Mlu_eMr>L)AcI>|WUq$R~>Wzof^`r}7r>R&|oUcaFa(y>nfLg)0S*S7U?V=mC|JcH!WX*7CHHR{6#2-E>>m zdQ1P3)+>nD*5>jbKhU>pUnRG$p^?~u(lt~umu|b;Sh*yIfpZu1#~xsCp!L?YK7=HKx@jLg5$ufzO51g#=J5j#e~F3G$q$n_&z zxp~aJ^5Pw4zN_Lo)>FKPyQyo<-TW5K(Z$SB0&_GYbWd}DHo}@C+S|!|X>JrhyC3uO z_~J>s{)72>h55O6_IFxdVSb*#2JJNF<_50afdLik*{_i7`0u3L!RydSw=ULY?ah&*j#d`9zD#%UxQHP}q8 zY**HD&Py)WgkA0yVoQIh{HEVB^E}Oc1bekDH*vn{z7TuBTyl+vj3Vt{>0K3zS9Y7m zP-E<5=CPIM1?0CaAZBXbr%Q#*z2>|32Rjy>Uw`}&sl=|P@r4)!p2vhmjMDt-seISy7RR?HaY*BZa< zI5V;1Ob@@$Jbb|TUjDqjc3p~P*E4{Ao4$)3?Rq-;&SHBJOHZ?XL~(s4zPm;3lkPX5 zFPc8TV^?W1`I`A=%a71K8kx(hh&NhIEcGg4scStprnT3OV~(}Q8rc(;y=hALHGFCW z<2mu^&9a~KvuP8rdkZ#gMVw!)E}OO;1G+xH+%|2E_~jOJe!WKj+~-%UTnFD_j+|VF zvT1Y9ucxUmdp5yb0N60)NZ9^3xMrqs#$;QLiC(P=J%>rJkwbf;V%1Pb_H$=4rb7d; zMWBpqha&Z_2FLTvu^n3fm?e{T{EtV17kvGWBX)ECc^}<#QHR}}=Hi|n&c$fv!s|mb zkGk@q>1{rRO5i|zp3Z+OpF(H6@8EnVUYe6n;fn8)Yl-^TaLIn|3H{z@o&U4Af0g%s zXTJ8to$KMBuYDFhu3x;XC@#~!5Y2c#<5OFC?$}4fdui$>-pe@Z`NexVm@3`7g`2*? z?`>wR>g4c1;NPK3r6*CD>AZKI-GXlHDRT5}_vGl?3LISC-afY6%*U4;zJNNbhmp^5 zMAXhwu_&~69?0r!XSoA<&a!Lrw+HRu10HYrfCm^GbcJbWqJ8YxS?W7(JIl3{tIZY>Hn9eJrZIZYptfs&ZQ4wK$T);!KYGtvR})WxFTAlG26VBW!xI&+vM+g! z`h<^gPPL$eY_;vzw6?EOSM7S&Hi&LKmaT0S>%NV8T3a`6n+2Y}ojwmAX~lH>A%0Ja zm!Na)y%gfa8ZF>t{Z9}7h5xG}|I@4I{R)CwE@Ma4*)d z+FrvIjKOaWy|%Kav4-t2V(-UU=K4kV zq}tHB&5Ewu3Mb}VP%)UgShsr4DvQpWbbm(3crussD%gI=qC%wEi;#mOmuM#s8lnK!XcFI^pOP)_?z@ZilChc{@AZ=hUd z$|?VO*71w%#nVo59bchdqIK*+d3Wo$g}DTswM;v~TAuX<*76hDID4?mT9y|j--9Q! zmhaJTqP1MfeB8Bsk#mXmp3E|%8Hv}@q|X0eYxxvoKAAl^Dal$cr+s&8`3>g&Fdxy? zx|U9Txw?a{cE*}Fu1>x$y}GWuC+|$Mj!n?T?r7=vv`z_VX))t;>E$HPI{k=sa(SZ7 zCo|1up0bnUlbPmSw3$B&8hd^M8hhTqhsKUR$@P4fdUu=$jU5GzJ-?I2o<_OKlF`_q z&RU*+g0;MuwM?cj2aM+iOg91*20E*BIpzFx*Hp3IJsE>yU*VBm_Gc?`j>*mi2u@eXY2~rwxDnA;&a<%JBMdX zIyrWvfG3Y|U7W z|1ZGQ6in~w=FUk6=c<6KOG^Y-;hXsTY~YiKCv=B%$#_C3woRA6Un#gJ;P3q`xZASX zmo2#Kcb0h@@Jhtrzel;t6ZXZyb9-5LIGQ}CL>qmc2v?_CxZ3?W4R=2`b1!2e*bYbn zTQAPacVOJVcwB1+wnmS=yA#F}yU0-W*_|*x#2CFWR(>*D_s=ocGe?)Ezr&d)m-psT zuD)BzC#rjYsCmRUk-kuu`^#4inPBCHorQdM)g{IT=|OGSct_FJwu4Vt!I|jV;-h!(;LaE4-jb5e zdrS7-?c7@uS>CA&-Myobe1(IN8-L4uy>^7W^t_tf^xPV~%Z;(tJrLgp?vL#DH9X3G zcWnqy(smWP^TUr%Y}lE{9WvOkcJ?%$PvtCU+ulVl>`V!^mr73MPNc1WTd=%{Gn&e2 z6W~6TohgC#6!s7IzQ6Qs<`ghKU5-8Jt-#TXcZ9GjDbBi%{DH9`Gvy1`TdKzz) z@qA}b-=5vWm#xaLERO6vX6z{iHo;V51a`_Piq-r5v5R-~?%liQW9~)zg!cd9^B+UD zt=a?3&OKxMs#?yTKhN)TQcf|Yf7`#$S@xXIhAuHS*O>jrn@F7w}!3hYeu}v25RzU=BxVk2z43YquzkJagZmVKOm zX@v(EE%1^j;3a%oCb3Vm;R`%Fo|hz!Gjq=*y!On|x})@c@lN}!Ub23~UvB(Ka{l7- z6!%P(XkRgNPsCHYqkX!6eGu&e;jTPoF>CoA?u-JXzx;@@H(b+UZwQ&gI{MEv3;7+-Uw$Y!C*i+elxGj<2BsbK z58p?;Jfk}+-lnZ&?0BAC-HpB>p8Y%8iDx&%vs>B2%?{75vgWTduvzA63%>Sw*uS45 zxa)VO`6%TF3${{mco|KtA|->qSeiTG}Ju<7IpUG-`&-@RS1OTc%}wP0uS-EUa1 zv-$4Bz%CKry@Wc+`0mH0-QihszMIY%PQ-WTodjGLNrr}g@5k1pvyulLIoiz|J;H%) zznHsLPyG&=?fmxYE&t?yyxwwgw=hfW zpF0t(-g@lBunL2Z@=bg3(S_B6%vpRU9#)0j=q}0y;qqw~E}vMh z5v++7NlIh?LO+RM?ZxSn(QUl6HjvXvYq!w97v`P1O|E%&2YhqPpLpQ@L0@+bvdm_F zYi&QTo^!rO&-r!|J?Am>95=7R?QwdJeLv#_=YGa7rsv$t+`W3v!1RHZo}+hp^_(H# z&Mz+h;(E?~=Fz$>^xgZfC)RV$ zUX|Qloc*)^-5mL)PX3p_Fb45|*#x?~tECdS$LGl3LR)W+{Pic1BflKo+$3MM?rLd3 zhZe0BysELMyD@oPbLMyDL$0s$dD>{qFZ`v`*ZCrPaCwJazB8Bojz?{twD0m%&ZBcr zA9oc6p5|^o{CbKB6|H^Ym$ABCe3#FeFt+@ADPzmIt2#eK>?dPfG$&>3#(PeS#1^GA z#0DDCSj=dMVN3b@Jx1+6u(AH)dgCqWtv=+f513CX-<(TaIpbMkS-wYqw0Cp=!yB!$ z&v#YWKJsSTXZ%?7F2iilIJbzV_aJtzC;s+coSzPGj+!&{3)9E}mQwpqzY+Zh`nO`} zB94#tu;Zf@9dF_HE}otLZmjMI|7Y7iymrN!1cD z8>@My`;7K6H{EGu46K@RC2MT)BJ{FviDo$W1?~k7OD+;$>AXX8|9IcnLmzNXl{++b zPII4RK+ipzW30PpA@i@)n_e+;%s=R} zwO=^et0c8naFX7*%Ri79ok8Y@+2KaT=uG)4_sNgnJQmx|sOJ1|bP#PN{}MN1#r@30 z7fFoRh-Ugxd=K~R4G0{vb<9fcy3w6ZOo-^!OO&9s1)_ka^{&VTSkeIDt<-83I0b|4;u@MzvXK-@g?bu1) zw>iYX`n=@0a}h7PzTA8Lij>!4#|<||SUw3~_=N!Fugo!uMgTvZo8|myv=A5v8Gljq?&ak5iAE{Y9zO&g z?B~@RDVV8^2DP5y^_8zT;ZW2HX| zN9wuH`@6KC4Q%#-SBLmOo7QU$Cs}2A+=H(7a34A`Zsa(uxD-Ei+JV^ANx*Ls@oiIw zl1qoUwjVOToIyroJ}}B7o~Me>t6P>_BNgc`HuoHwwZf-f&u!O86I1m$=Ofz53=@QktM#M4Cu(-1HX`;F))?5U;;z;nhf zm^NMDi_T&F<6(LM{Un3wrhgEt>%g@9AH9x)>2~sbx-gxAZS4OAnEIHnyS@f-wC>u7 z4yim1*qhiw{&lRgp5~UQUKw!J`k#p2Sol3n>j#aS2JWzyZS+5xcMby|xF>9#@IW}F z{#?B6z$wP$;?y+`E_uhh?7f&Zj#vMUeU?RI>$d@`!V35^wt3P2!h3vUBka{fSB4u_ zK|_oIRZ~_x;`nl}ENS$?8w;-VHR^8LN8mSCgNGSUlr}8FuOMH^y#KWGVP#JYM{iHb z-u@!-mb0O;#YgYj(V0Uqac-g!q41z#b7V%K3VrAp-5loW%Wk^d(#Bwe+#C7x%wh!k%Sa3V*>mXs#1|V>RD()bm;K zSGn-iOmpe0eBwAQe5_RV_pZ6)B!N}`NqVrNh+jn^8wXNeEMB-SuG0ZE%I|AI< z(nQRaLG0v(jL93bvA1tV%|7l36zugbZ#>*zs5|<4Uv&75zUYXGPCx(Yl&ef|IJ&S5 z8EF!-QYkXiCCE+}lWXQ8;@|B&GiS~2vvMS#`aegl`;y*d?LL`ktd!g{gt7uYgPl7` zWTWas-;zr&sHLpk?tMdTJC*#EvgyfAZ_8;Z<{rl8%4ri$S5B2q87*=Wcf$XXF^Jb6 ze*&V&ikGV(E}oocKrgSKrOWUM0>_?}(Vffl`$MLY3F-yqHg z=sEXtizY3iADtJNOuRk6D+=J{{jIuz_Ir?bZVEQ7s(B{x*dFLZg)gv7eYD^kRv%_= zXCG?k?V~glZmiESMl>O7wvsCiJIIJmc{STS4LAw!bv8>f;siH`&EwpyL)izw@WYr< z`xkNu%s6e+1;KGSmj#R)ep-x-SB5{cj5%dz8pt2WeEwyt<~&*2K(3M+<)Gcnd}ciE zt9{}EV`cgI;i#T*2Bl^)cUM<%cXhzZfgN6+U0J-LP%-pnMzsEnFzt1Z=7bgZpBHYp z&(~-BqCWSv&%~GP%Ae`@RV_a<_c==L-O62@MZjS+XCahp{NRVNI`tzNa%bAo_6YlD zRyubJRnFg_SY>a%>D1hBFPMp(BbX>((kHFVF=UZd$dm$EkS z+AS~ZX{-x-aHS8pf=pxK%4Be*!WXn~MRLq^)=aoEEU+!F;sh7W=SQ;82?UD|fZ0vWHY|3fD%%-kb9Rdcdvh3G8&>S>+{ z4j(>b>z~%UVzJRG+ez8+xv>Lg;kUzMgPg-JP7M!5GS*4QS1xoP@+5e- z{4cc6Pc@!j1I$Eo-ST%SufERiqoz3A;P!F*^D9@8FQ7g1+^SWgtE=Jn6Tp$x*BN_W z1%Gb4&KUbn3h^Awq58T_W2^m<(N!s%E|`&0bwPC+cNeD#o?Y`+Q~pB!cZ@wn=w+iU zy*SI9FBqnjyl~s&M#BvB2AiHs-?ej#4}>l+nloZdd|!*x!VQ9pw|x7bqS+0=z5P$o zx@58Yi-#KP4!}ERaVANz-V^!OI|E;v5DoAw;?FMbo;K$=v^fXboMY{`wlrw-e|OU6 zZG&yvyo~Qew0U#BO;?w}4{X|;BdJ_vjz`2cXC$`FdB89wQ9-YaaBu}@VRH)YVPr^ z0;kgGBk){YY&*K{Yw*IE)}5!B=HEG^DqLHPKWG@``Yk)gPRhj(vB$0ZpTfEr+9n>g z8`>sVi?)dminiH&D!XD$h7GH2&^8xVqDitNh_<=BPdv}1ZEjn|5?TF2+q`XE9_i9H z&8>lX&Ae7|{Tb$vzu2@*`kO^x>hD%hfAgq6FK*0#^R&@< zIkmaL(`GhpKF@h9^K+a*s&>vG-2}bz>IccrV+lVKoyWS8_BxMsvS+8K1(TnhR=iAn zY>I2EEn)91gjYRtL!Xt8^Qq%=AD=M&$%b3<$IiHF;mFyHOL+6$l{W1c|F>-eow3%} z@hll#3zVYg46tdN;)E=p?Kesqxd63)<~Qtpe=6^=>1)UwZd&{PId|Wev+r+n_I@XRz;Qu(AXc~5x$F3!oU_tg*0S%$qSuXd?#B3do3P&G#*Q+CDnD;UUwS8rU%|FUJ zaJ19!u%2fzzwfR1d=!cocl{3HK?~>$zSDt!vag1SEo>tHMZ%cqs?>;lHj)c2XT20V zA^kz?_smZ44f!cPKJOiD9NxSWjLY&vs7-wNK;~QD&AXfZyw7jHuU7BFuCV4vY`yZQ z+k1-t&K<+n{{-XFdv69l$@Z|?$^J4N*oZ%iZ_EBN6TV%}{n05S(LqKVD`m^59)iDy zvK-2CvB$W0tFxj*nM(+JO#Gb=X(zB-c+Y$`;U^N_p2AqXc8g?pIy_6g>>C3Od6SLk z?eI#`#t3uGy#%`Qq-}pG=N|0xB|iK@iTzu@U~Y%saeRp2Su5=Yv%!43Hh`Jf_q=x% z31+`O7ONAylIf4#>5iG_cdt8UdUQv@-5!7E{X*`zHlqUt2Y1y)dOzJ&7fCBkpo_3~ zz4Hm6m)Q6eFzcQ9chynscWW$xD&JV$VU{cw%H40i=ZvVv8MrBBY_K=Be0+S1p%b&8 zmClgazKJmqr##{zbolaXCq&`33FWdT+SvAq(6RtHCLiIge7CXI`M!`P3pYp>eivEz zYTHh6V)-moQFWYr7P5546U%3ziZ#c{XLeh!e18vko#zVgiJ|hwk}hU0ANO=+ z>}<1lNVF*1T-&>9$`s0NJ7SjE(-c@@ zo|SnRJc%%`0QnKXiS^2(uKX#j@B{QGvlPG4L2R-C{6_h?#$4q_kY8E4XKPR76nsaK zA-3-*vfR#zP%nITd`Q{&I}GS;qMQiZ;YsC7BpYGRS%N<{#a~-}-IlSX=+_er`#yK+ z7#}e2MC1R(zF79v$YyuCbUO*1_A@SfA7-1c@muS7tTr)kQ@y~?@B?A%FJk`|VN)so zyZ;JuMa@kspTvIWJ&Z(8@bK_~uQ_KP))%S#(vzx$#Wq9ocJ@_?XtoNz^yXoKMX{?=f ze^D_0{&jMFTXZeSnJDi&pL55t<8UUM!q+@49QJk7Rs6 zvX^Ts*L(&#YZ1TRSxM&9Ks-e@y77TycK(hg@^{qZ*AT4<2sTD`TwHOM`MVy8V+Wf# zL*-r5^`>uT(+t=PB(C)%-3taj`Z*dZl3ignFqeJe{@~VC zPd^`gY&G(|YoBo2ig#Q6BXfD%-iKXS^0_46VBtE|j9UI4bzwGFT(;fZrN=HBZ75d>f z{n^{|ViTS7VR!9FBUgZ(DN^*&WB}huM~X*cPWB4rQ+-)(=NVX41z?jtnn5Psy*5Hz<>A zfE~C(u@{>yxY{;aaA&}0pW1co`!|oz(c;a`6=U5rPvdQme(Av8-T$(E=v<%0GZN^T z10PJTN2$$lXhD-o%G%SIR)S=ra_U(FgBv-fpzlZ^ z{kq>}jk38bCU1DBj`T~~=6;1UYsf{n1LJ-8ajN@Hh!lr(&#wGb6IU#fYz@wuaWRB1 z0LN-z-@30 zRULaf&n)9?==gm5ZrF~!O-x_Q^+xTy81f0RGm2k~mlx_CU(#m$e~$!>Q7gf@bKsxewzi^|T-*y}w$h2^1X&fCW03Q<5fe{fGHZ4J8 z>U-o$8$ZyP+alWeLO5E_TpF<9x8ZAQ^=BvKnE@--%I2Ahja2=m{gT(O=RGcuy`1`9 zzPdXNzWU$6fluMnJUPCaT`?Fx?ib^$*%e{@xhKO{#d{oE_}gRtZ1bL3z+UC+uy@AO z(oY&awA6{y?4+fG#D@p0{+E}Qc7Olh{}e`H>?vOqM)>Pa3P#sE@DQAu|76eY;e)aD z8zaF}XCsH{ z9{D0-yLFd*06DD)StOsc$cw>$$?uXUUWG>8hTI_9-vW;=;*6mD|G{bVBSpx^1JDooXIVgF3Mfvn>i2e-X%V%mwjJ*z=y7Wt}(ZW{)-Bl@|LA6nS#$e?es^(3v_33 zs&CSQ#rS^}@9y%nQHI&pOS00m0DWB1wce!QR=3hAv zcF>W*)b4!tjO4Iz7d;^HxglE@Nc>E4`TAS(2CP368>xH2r_boK@LimSq~F zSR3UQXq@ff)nI5}+aepsW?~PU_iBlyH$TUiggde?dGuzBXY#I2dASgt>B!5%a(@4T-*5B#eLlN-jxGOeVr8IzXh8XA{>t*tde+X~P5kU9 z#L?y(&ka6%^9AgK3l@FmYg}}IIkA^+a^SJ?kS)i1_f+fM_MS>+Qyas6Oaw>i9BnC_ z{lC^%RL`DF*1q!b?{vtJqa7LYcE%fTXJ7U??Chn`3EA04F|S1aA-%`;57~U?9qP@$ z;nao&pLNQRr%_f3%r7YKcWxLlzx< zoHaNNnaz?DEqYoRX#h@&#}p2?UNd-X*6-GYz3GD-LPT@V`LU5Dnqv8h|g*M9xD)Y@0Kkr(lFT~c_wv8zE zbirG4v@valRi~&jf57;;wmvcyUW`y<$%Lx^aa{dqPosaEKeu>0@mFQObe)5-^2!wQ zj_ZI;6k43mZ*L#rjn*H+zyfTKZY%?(VdXK>9H`u>1U!X#CXeV)0?cjd+&g>yI2pW+gqVIA81eN3xgd=Smx+EQ%xXY-zo z&@98cP|^_~GE5zdBF-3+EQ0gS+;($DDm3Ug*Y!*>dZ=?&;d#PTbs3XM;t(-%TttD&!lz=NxPWNeUpQuVm6C{awA#tU4gj!y@NS+D)T)uwy7 z<`BkzIsICA#C${}eNG%zA+A(+B&z*2{W|MDo1pF}>dJ>Hc^(_DC2QI5 z%`t!cTIW0Ud7JP1y? z^4eL@ho#hQ2KUGJH}(uc&rO5oDkqcfQ|vvhVnc6ylbqct*8ko9-t4p9?WOd$h_S2z z&gHMdlY#@c2l^BH`l=Dt`A6AGH1}!fXwtc=z|(+1J@$^yCyDp=_TY{yk2XxOZMLG5 z^$!>uT9IShdU03h8hfqd@53nZha3Oa2cJEAK)J8=&T)Dt_6wa)i+^vJ`bQUbuLo;= z=CghpgS&obv3?evqJPmOd;LP@VR)InX4&Q|jKf{OMt-|6F5=v%D-)An3YqwJYfYb{ z&U$P=-g+B3LnxV8Io@1SfIt&P^`zM%0I{)BTkeHNQ~-_aR6?)xmZ zo_jI($j+qa8Q=qT-!A_6&gH!qW0$`9&gFfAeQMT}Y#O(=Wb?SkOI{uKM9G$MRXxT( zv!u_Grz_ZF=osyriOC+1t;yKKcaOV26K=F~POW(V-OGCi(`#dUoD;K3H}J?G1{I+tLTr=C?iWRg?dF=VEnlsr8@r1^28ohSq;@jOSf&Ol$YEWe%-m58X(ADqBrivbdT3$eEG@ zgrEP1`s%wH+NN{8I@7E56}=E0c?SPLEA+|L!^@#h^YFzNE?zRFd-*S9p3B-lf^Cq# zqdLQ?HOoLgKb`qKgl#a(AKLyN=Y)b*p18Yq6raGB+?gltt{nmAZ2AbsFPs%^?=ENd z+tjPW7WfFZzDKbIx-mBcDOZ_n$<Ar(CcWIK#gF5_4+)q&0O)k;~`^-4!pC_!y?qNJX z1i0v)f@*ZR$N}Yj&M{x-Jpm&p&exf3E(zqYK85|#0^b!r z3eNX4e|K*Q&Mu5~p56=R>TckSK0jrl;D}vo207Bo$&ogL9BC!IYqSMN(dsPoYG7p3 z@sRoBqs*y;wq}~oCxMG_HyK>IgGseuf=+PYnpAunva`!ouap zFS5_0!K550`5HcWg7Zxdk6X;09I}C(51+Ee!#ux2 zTg}sZpN%VD3g+iHeYeWf8Y1$cU6CTApp;U)`)oieXGmhRv; z2Kc%2Im~a(XE@)<=(TGjknK$QxLn%3-|0uRTlgisa_8HDU&M%1bJt6}enw%nEAoQ;1u=8+@E>LTL&qvb$+ZMF~m?W}A={>eBO1UVqE!zGF zJm^vQ%_>i<@&ekc%$BP{=HtY&`PuhR5??Tb7~g~Jfz}7?*s%ljqu8+~{Fn#X52eTh z2at`e*s--v?ATB2*fGITv15O7V#j9l9_ih!@OC$LEQ{E&W_Wt_0?X!Nos+L#fZy-# zaC96zs(Oj!S@e=6vX@DQcgDvU@BX~w`;Id{?$TR>&JsVq5@&o(^nEhp%SK*vKFL>2E20C!_zs5U>dHWZkzwiC9 zlm0&D%x4E>^4%x$*~jOT4Xm;GSpjw-@v{~5Aw5d`EZgB{&DrvuS53K(XOai>EK|>( z@HNPm;pKA$@GbfJsyg6|FTomD$h_4VU%WoYSS_21c%JI${oTU+o5*w2O$Kwx88hie za>g1@{&dM1r-GZVooXEGV*k!GmmEH3oAp`h;nT_F z?LEw2^0s&Vq{lzQI@xQMW&WP?RMp+e+aa?z^(Ak6>$&na^XNF&F;MHxxsG_b*C*B{4_=2mSbSFnX z*)3c;@Aq-##n~qbllpG*x{6L*BbX%6M>0BKl5L*nfx}n$?bS!_|2MWnr*6fTuoYW^akON`ujwlg$cm$DS>_$=FV0qQ zPgJ121sy_mvz5T%kH~A)$Zjg1L0?TN;jx>0+A&7?`0bmq$?S+i<2?0RC{ylRmzRC` zmc3WM2>dS9zK0(-C*fTievq7=#mgGPhlNRC85oqDpNn?gEVx0ty!=44tBCQ5Ub%Yu zx+jnK35@GFdm1vw15JN{r|Kl$8?U2x>F8bI{aECrtAxBkXuhBgnlB2j>vkM%r?gAGZ zj(>Av;w)XOS68@~b*axeCHj2ZQ~zD+du{5&{|7kS9sB|o{1VH`$`K)2;M#&*Ijg{t zvzln@>K?AFoXGYg9YD69Umxz&J)Wbj@US~sSasCDD+?!-wXpw$lF)zg@Oyw`CoP4q zznPeC+qy?La&5Bxf3GX!WSI+{IlV|(a{Z&LjH9*j!c{nT3;l@R3h!KdTGls=qIjE{ z{64Zpe76IxA@kakfUD{xkYS&bZr34CA;ab*fvd(ii9QnP7d@N;X2L@MY9VRBvt)*B8*B;j;7ShoP<%<{X?d!lx^w(XF z>~9)HnE|8m_%%^pwH(v%tjT`HAzVKjo+ch}i2o;q|BU2!3TsSl^pS`k{5<072ifND zdWz=QYq7cGcc%GUetXwqP`7K5JTFjpbmg;q+n6CHsf%3FHprGs9uho}OI+Q6cU!i3;qf8-7I_d7E5zuS-uUmgXF06tCcQ0WVIGMYbD#=Oi+A>GFImz)2jv_9@zQcLK ziX!LkrDfb974T(kPeYDUOv)r;?00+aUg|ub!5!0C*fY8RVmkBcV$bB>CEdTIcX{oZ zN2xdeAHIeK@VI$aY)6)P31yY!B%c>|_tNRaXnvl%m+l8niSAw+L;qT<8UKd6mmd6I zzI&-WkC?+D_T5W9#y#(}u6HlZ=I*80d7XDJ)pUFJlJv`v`K5!$teoVxVN;1JSL2!9 z+!n{5Ss1(}wRRtE3Loog8!uX|+!iAuBQ7V8CNL-Ep>>zi4ldyVb08upz&vVF|~KBFg-zwvTkbj+2V z{@E94uQFRl?#gQq-8hjPjuYfNvTR|aRvfLnnYq67yJ+1De9M;lBEJVac^k_U*izqJ zB6=^I(aGIg{fI-OPL{63$8v}!#Gef<1XhYgT}~mRGv7GvxD*?r3w(=Y-Q`{{}dbi>3?RC5Fe+2S*D|9=hwoY3~8x6sHfK z0*s{R$(Db-KA2&;`rzfX_12R<=!NNwF96eR^w}LuM|BI+PT#V{|EU|#&$e<_d^bEz z@wsKhwWJwFG;lh0#BR<>2>;ysnv>ZPck(XT5xe4Hw)q(I*-S12$t5rA98|Y<#0>L! z>Ll~qdtn>=0t^dEBb>6xT*neR{ZItS_*Ae1@?{@sWNjK2N@`Z1Zpw zxkqv}XA>52mUAYtWB&nN(S1~s|Ee9|_Du8}$+!;!JLw;`9B$i?v%hT=*>+_5#I`0` z??Y($y^*ec%Mbdlbwz%ToGmYD`DR5n34cS2b;6+eV+o0Yv< zeH1FbYOd{nZAJcEI@sQ$`NS%g;A2v(X@GSq#j2O32;tx339e)67r&Z-pa)}ANg~&hc@ya?VqYR`^iGq#P&gFnX5SW=E9|%z62NX zdw1*+?4QVq#ikR}kRM#yUXo?QG8xV<4%xXr1*;_;{m+XOVuy0!zKedfzd4^c{@Jp9`~-jtmnOtU)Jm1CoT(z#y@lMsY{+V?)}+i#5C?HAXXyZ zH?SRFJ~69ze`fHlvySDr-n~5BC-t%d`Zflwy{wJ?i-Ku2IxDSr3?{bGpx?6o#`9~P zJ~lB{)hnzl+#uioBH||WO!Qv4fG0Vzo|D1NNsEd5>|^X<4Xk*~Oy)AV&x9St#O3!! z$N89kJ|RBxU*O(@7cDBP>hWsfE@D+a2pau=S$WQe$1Bg>@I>X{4WITg`af4$u;E|* zjsAZC@7KbACj& z+1od!Rku%K{_}c8MpqBenfC1MjaE!ru2~3fDXx1E{4JNe6YYJGV{W5-)o1qoN^XvT zOv+@tlidB+eaGs!Lw0UE^W4u^)>`o@nPv&)3ws%R7Bdd%e=UC7UpV#miD^_7G|Jhh zZ+iD>3wYGszLZ^l&y+qZ72gu&+rsrL?by-5jPsX_qdR&vu&U3>JU)@>uizW?;TugM zZp+V^bnaq-kGZ^Xo&gQz><0ILL}s(Eik*F>Slcx6bCkg!%D!Vbw8qRg|GMIMcCh;Vr?ct%Z5=uoqWp`)a(7w zk|~RPy(>h|I6twjglAqF;hxb5axO_R^eLQY5G@$JK31naH7q4E+MB~CGW~b;f|+82 z8PoIN~|v9+{kAOfz-EO~33MrlW~#BMycbyiOlXcjIp6+{bLjJCgT{ zhs@!(;H0zSdT$wH2{K>nd<*A6-~nSB{DD!b>xJ3wb+Nj1+UOo&J=^UWx7lUfA#=@f zZ`(NhEA{Pn|j%z3&?Gcj4He*zCW}2$&1F;lh-i@?OMi|a^d6P zU8cTORs(;s=iPOjn>l}>yOz?(StdLy+_Pj#kdNrkZsZN+E!)Og9E7%)k+*C*XN#1# z3>#C$VD|8C^sQniZ<*Ri&LcNZrgEPd#Gk#!yae+AeY&w!ZXUBlv1pIJ+BKGHEob2h z-VAaU0vhnrvAWT$W0aUq$tl02Z`rS0*%-UugR)b{`~JBv#>&?mucHh8qdA9iP4CF) zQPw&jZ_sDJ$f_~8rzk*dj{)6O+~d`IC6nY>wwc>~tUoXnFVLLbI$x&_ikKGGs9n#vcOYu7`Rz7tZZ@t^ zj>E0MFSTIOf~EKH-G9=8&8*{4;HtA~E{?xNOr6^1aBk1#lV!jrlzw8_d!&^IRI+#X zb{zS&K7giv{|fAjd?KIOyzLI~O?Hwm^FGO^H{9*Y;K%C%dVU?x6%TaiMjz*SkBjDf8vX6Eb4?9H5EwSQ-sXHb43o%B5$N2Z=@q{^lmun_t*YC-&gdH6)8m@Tw*lpUb>di26=o8GZyR7 z5F3rZl=c5D{fL&n#2J_-WQ;a`7lOmhU*WDS>PSymPaW-Z$#Wrav}%zUe3CM&U6{M|@W}+w^WY6p^>4S!F;`M&+Hj*bs>}Wi1GeV`>X7`;n>QpcGTaSYK+_mK9Bb2 zZI6%>E`V)5c=YZaOK&ySw_%Gn$&oV|`}`vIXZhl4_)V}qXhfEW&Rx1H1kTqhf7~s` z`Xl7ES%VyVhckBNz)@Kqv~^l~PR&*6p&Gr{z8`Op<>$);#}0MOX^=UcwjJY&CKxaC z(s(bU@A&ZszjyNEExfsNypuo2cw1H1Gv49ucp2C59)<;9=~Bb}Mx%04#gDPA{N%?N zpsowkA>ECUcX?sDF>Z`${2!ZP<4GZF+?ruTbuOkAKCuIN|8Tz1c!>MS_F~%+exyKG zHU5LFozA~r%RB~x^ZLJ+|L=3J$hf zvMHw!--1o9yrlinsAYnyJv;}G{9c86!{k!vkHyUtiI9Q)f{_Wn~l z$-1!&LwZXi=O0IKk5psRDaL5t(^$j*Z@FugofQAyg-2>!t<&srZD3s5^XJl^WQtuwCp1LT0yX>7 zLNyuII?1PyXI{;k9PGfOJaaAWGFYR%!0oGyQ!vis{uGT>;}lLUV4Po1FwU)4op_x4 z(SI!XO|{4QfHO|%X}S|9BR!)g#QxMf&WbN%U2PdcHkv`^nT*{_zizSCBFBth`-z{% zrVc{4^}=-aH%@-6rI*`dy*|lUExcm9-mw{RW1CD{!L$&Vg7=M0S>eXX%r|}08=tlN zn?Eb(4#}m+3x$<-{)#;4cK%y--kjosrd6EZU-q>}!-p0l&!jD0G9b;DmOlOKJTKUm zSM+sbK+)K~1C&!|>DfyLV7E>;f)f_Z0_U}6OIS0#ubeRoM-P4_9F51Zwo6VP9!(e9 z@W@XF59eK8c)X&z4xYL4P*2LdFj(l%D;A8J^2kM>*%coDQ&_x8&JM}xCzV@xwsXGW zyNPoPx7=yV*)@?&zHVbznLH1oR-X ziPz<-5%!)c{i?BEyjpZ=17pAY}bVGm;@=VcS`ud_~m>`lY$v0sv8?4pg{asOTQ z;`Y{8DATwY`+3%$Vth?OW5h}00XaXUr{*^#-UEZ_UwUaNclMmj9@zWau6v+^E-^0Q z|LIBKRy6eF;T9NT!!5ed#{J{g+ZHM%KK*xXXgDyUtj~qZwqBd~3^%{8B^*-*ZQ(lW; z&8{nbwTrmJPBKD0bz0MjH$Agz%I-^KBQWL;?_ZrK{V_Ogp_TW$=n8btKE~X~q5oe7 zR!zvu)#RXPLf$Lo`_`39rX;F=JvO=7H~1{QHNfv;_|K$*t$A}e>&V&sIWv&4LfBkn z7s$Z|GzJ?`o@_vjy%+D9?h944IQD+ofTrS8(z@I4n%R*PNj9K%;zSntax5E={X5UH z0eux4kl@(H+#1j;wtgAigZy!mkOf@dhHFcj3D4@VVfMFem?6i8*+Q;L-DO=;ulyMU zkMAw|sJ}j(mWb zO#{%|kR=X^W{ zH{YNAI$D>;_mlir|3Bkfc_}`kTz0B8{1;7W<^Nz}Wwbx^T(%=U7cT0#kB`>63H+A+ zAsdPAq29*(r2D7v?XLGC?s-ww1}oA2MY>+r7u8 zEw4f!^i1}xRAA79?;-87@5o1>`Z?CKzfoVX^}3gw#e_V z*aSSSIy_hWz-fn^_-WQ{2J6<$x?Sh2*U^QSVwahWeWnaM%_QtKrNmQR(t!QOil?&H z7nswI_@oTwdSdN5?UgFiy%4&$YXP51K1aU)GW{g8w{`lNve(#WzjZg_qLl3RW@xzd z+O`44TjPD%?T@4H7W-uP$u^6z`w)X>oe3|Yd?fQ-#k#g(Hz8-l3jBbz#pt>wcOomc zG2l~9VcAo>IfWz3l}FslsV91uMjmnK-RZzW{@il<3es0jAXt+d7+5nNU+NmhraZ>= z*pyn?_iUP|a+@nRg?OpAle; zxit@KJ@IMmro0Y&yZYD<4%IW(T`3vc?Ks{Ha|Qh`w(OA^+t;TAYF03gSt-8l8U7UN zWSBKPuL7Pct~MGTrGE_xUnA>uk>mjJE2)<8`me1fI2@W;|F?kXsvs7M;ad zXIIYIkcOYseV2Sj^5w~Y8vm?g9Qb-V#?im)I7;y|ajF$mSI@&9fIe2<}JBGzU?shD>%EcB7&U{*kr}YQMt%b0iKQbWm)l1YNIvr zZ@1~3U>xs9+dV{nG+TzUf9F~z9 zvU41Z!Hxc$M_kOBv#ukwPx|OTdYSt_$bauSj~joN*e1T8@zp!|1NK4F`!M%v_RD_g zw)o0EH-EtE4qw@7^Ob7$r1CF3d(_uT1o7e836s?)fYHxO|D|t$laT zCU{+1K99WYCp`D{nBs6z`3ylFFXMJ`WcOqp#$V}E{6_;z&ptfl4EV& z6*BwF_kgYFVd`zW_V&mm@OC`86`R06*^vUs@%epv-_nc>-*hc;PxK@F-KhAx)2M^a zFpPS=&w0|q!%2>>d(x@KD17tsdpB-d08LQ8i;cMfay)+Q4;Fu~;Pq8IeZ6-tMyB7m zn3x&f=eAusFkrVO&)28$v9!S^{@S!To1xVK{9=+-ntq~u(4`Az;`2q{X;kcJJAKOz zs=d{e$z3r$s`IKC+XKK*Hj7q1`PO;zlm=iEZMt@Tq#D}eV?L9C%f@NO9`3B0+Ll!{ zWf`A#`a*x2dlkBu;3ZnPmFF!rB}Km>hf`-vLCA{b`Vjv3*=HvgM|c&vOx>}TW>ih_ zF;=}}7j|9U|5QUi%B}Cl&>`1l z?#sK?x1wXr)rVqJtutI!-->t4Hk;!5H{j(*u<6@)A%BG(?>LNc7V%zk`%jS_LNrKq zL}PYuwdZQ%*c}#*36{2e+F7redZHg6T<`iWb?%8f_Q(~lc+SppJ1*`s%DcvAgv<|_ z_l4x+6ij4q(!Oxly#!jVy9N^7fqmrr6Op0pnDmj1S@N{n8?+}EUVp0(^iRbR2v__b zT(R>Z*|_4}NAYviTz=uqu{&6(-cP6(?J{SS@4<%_ zEF`a@vs!CA$ea?lu4^K(sXvayj$7CD`+{)(xJ{BzkJ{#_^<%Lh@ zb(X#8l(l=xo^{Ip;VEly%33^SKXc0d>M2|8l>Nz5w#q4c+f(+CQ}(*2>_Mlj$x~M2 zlx?A`J72R`#<62v$cqkrYCFr03watklTZHJ)ZFV9i0(=M3PN}CiKo~K-H|_jFy%IX z4w;*ph>Z!@a*|v2Ys#QE#mhV~kCGe8Eqd(u`aN+dCCDU89Y3{VO*eB!r`(B4S&Zyd zO+UQ9y_r7d(8qShb04t*eW0&jue>?(4C8;6*nyqI4*aZO@`9iBzjQ&EF$SQaYPT8u zmadb- zKr*=WDtF%Y-Ajpm)<552>+foJ0Ng&Cwg;gzyW!`>ad9o%;OWY#M4ZgJ0}0|~l|*xtkI6ue8o>C(+r9BDZf>PS_wxO{u`6$1D?5M{&yr!@^9<+Of!876J%)Ko z9y$bmNlx>|-nueTM@#~_zVc2<9Mduin7-@WMd6NH=b8X7!nU5c{1Uu?MVv<^{_>c@U`_;tqQ}YSrmbyvg`{jMz$t3N! zv%mbu=T30rigxPe)FCAab~L#xv+oXmA=N~@SvM>xY|pTt@ECe^FwBB zn;UDAX;$kx4)t@|Kb_eHkuM?9{-){TvHb9p|oC1*oyq0y)ulN0_gce45W7HMw# zktd6MoLdp?#^;s-T^3CZR?dn@$8_~!D`pp&c{;Kr<=AgK^<3{W>xHT(Q(@6Y7}z?UAi# z*mEC=e^4<+@qPg5uZlAY@V@cLVKdKi`D&IWV_rf3mhNfs&3PU1p!M)GSC5qr;p(x? z#1ktXwDnA*v2_Q&kT+5q>Ua3wYLj2&7ygFU4}7(4Tl71%!5Z(E!VTyX?O|e2gV5L5 zP@}PUi1FOyw~A{`?7U?kkEm@QW;F2oxw8MtsohPyULH7Wt?jf0kv0dmL10@1tY+n) zpO91UZ1kD&cNud(1}41LeU zjxf}Q%g?dB$|uqB{yxsy5-V%16?L15IrY=O>(3cdfKGD<`WHHq@Tpuz5mR5rW+hw9VeFKzqzv5t5OE?6@EO_lmJQY!=7CAiFzeju2I5x~Uss;b z89{7iUuK_)Ul!8mA@6+b}ucGtwn zZzQ@2F(y+aqvz3|U?6=?c`NFl7~8PMpBwqv7T;U89D*Koru3*ha~ATjWP#=-_k)&EnEh6s4N(6XluG(Ww~ zj$>=Rm3;;6Z@m?KW850=F6p5|@jt0td!k5pBS0IVXKmn@pIp_7>C#%uHsh|F?s3!j zrCY544%WE&U&!ykodXB94ZEypvM)FpI+HGZx?^#5-W^9`Bk%!Dk$#4JFr@=87^k)8 zJ^eScws$3XuMa->2U>10pxY~4M%ktbN2Bf#EXAMS)>edd4Exi)(CL)K@Ibq~Wp^AXzN zyXrsQpIxyJ8aFY@nHThxW_)Mp_m)h$7Chd?zE+>9+?Q+7B=Ac*^J?d=$9FAzlg(e9 zJDdj0Q~pA5y9!&n{3`nwh8t&SU9rb6;Jvcdc1KgiS6$nrmo9&ly*kgO)uPkw{9mm* zl-Sqorw%`)yYE_gKAk<@#y7s)vhq}e`%$p%_p@^l+V?;wr|nBViDfs?Zy~fjANyYz zJzqYe0C=GPN;N*MpyICi4%{^g`e!s)zrTJ#E&C|ia!Cf2y2r{{y|NQP9X~YKG{)>!+{tM+l zZ-n;CC(wlaeu(pfqH*#Ke8zZ%i;8{Id;_P*A8$1F=eO!ej^6;CX-vzl(HLCcfbg@1 zIlnv0X!tX>|67HV;KRH0CwlZAzJfp|G6nO)&(a_H;kca9ZVuB2SeHMoi`K=qNWSTV zOwbqj^+QHD1zDj#^34G9M5opsMvl?Fmo1mualZl2`Nw+pa0c{wB>0qt-+mN+`)up% zhToJOWx6k;V&($TEZZJ*!++WP*@`iP?xevFr$guEw|~m=+hC0k=fU_5R;@>fXb?*IH=~@{6>ceLPKWIlB{nS)O@3<@D1w9^5v96^|Ej z4;waO$(Xy5lXoL;PUjq@@Y?&1rE#*JWVg+XLt}fGK3lE+0u{1FC`TK6r$feDOqn~6 z8c$u>T?>YW8wQ_(p6xTX?*t#i-&Kqfz8u;Zr+n`;^{=*V*gb^%-Z<0`DH9zqPWf_2 zy$K2GU7)gi;3>URFKeDyJ#K#;@htZ&9k>4}zPBtJw|}G2Sa@c*;VfW~4qTT3*Y=4< zA#hJTj{fv{;oq#l8-08egin$ z&i=<7-q@?585!s5W3dtYk#iMm zaRfV!=yncqBs)`b+I3!Uynm1-Cyt?w;=V^hI~$>$g-$Gekoe%GloeZfZUXJ4#Lq5+u73=bI#v&O)b{yib->xLj&7J9kYV;1tY_?B6WKIP44*#=f z!;$fw^znXc9s^B+iOJ<_$0)P_^Ig#2>AM}dV8NIT#D%}5I<1$p9>@ri)yQr>btJL( z(sS>1#-Ml_<)v&r!Ce6JsUJY*nZY@va^OE>i=A6;#6P6RYs?|@O3s2>zj^1Qe?L}t zco=6Yb_Hu&Ci-f3@rj&@OgfBFP~N;R*5wS+6UaN#P1bN$x@|Z<$}D4q#=V=qrZe^u z;!U+iidWZ}#|%Egiy$!EP5t@EPuee{8TskNfSgyh;4psVA=nxvE9OqD8!SZ?6@3f6RI~&$6HMo}I{AVQ8iL3DA!l zW8BIb``AC~_l_;LZutTG=g-W`-7j;U@+HVF-L=1wda|+JgU;}dr~OQ)d<*UWK)L2E zdm(45vPJ9lZprc5Tfe2Qd|ld;dxyeHD{qaI7uaJ=gAQm+UU@wHL2PQ)MSWHlryT!m z#@n%}J$W{iXJ2FuQm_%YYam(aWZ~S5|EW7To$A0-aMm4RE}XNS@>#&IyY_t?cnZ#v zUEKD)oN~cg?c?z!)4>;H&Ji}uk@3M(Y|aB#aTc@5vo^oxx9aRi2hbkT+FV2b&Cv2# ztY<@vz1_+>mUEvSIQ=&F*wu>mwfY0atpkmyWDmtJ{ZTXx{b~_3O?@@@HKxWEac&7Y zUiIra!>K!|rQ03i-qXYA5t>u^CE*R#(3K-!F{0OUUc3sJ^1kS5&ejjb-t>?^d;2TU zv!&28>Ac&B^VM1QWO=)!^G3jR>AX$n*gEgrxt#5B=$T^l#)+13E~wm(JYdnZT<}sp zo{-rWI&$QL9u02H`ZU@egzjp53pppDG5S~!(MHYXAhbfX!-6w(?!TP8C|w*q--r#_px# zqT%zIx87sZMCI4ZGv87@cuj=0t^{_?%y%GVN1)H6_r%ueyohApEXsZWzU*@8I&)d- z$ph2IyxiEeMDsnY+<43_%sc$_Rqwwx5>))cT**>)UJl=vBp*rVn}Te71v2tCkd-e- zX1)wN+SkcNl4`|ZxqCtQ`jqVJ1BI`F2H{#^t}#M%Kl+((W(7_Rt4`2E8-(&t45N;D3<4cSnZ3 z_Y_~nysY^In8&-=Mh#<&(kLWvrnkN72@jqgl%W_==ZS3*R4NeDO5gXW3M2+3G^p%$2QnU`Mvs z!l-CLZrquY(LNMe;4dk;+vl+dnxHQ_v$ZwTSU;OG?>cy8nG9qZVtCh;>s%D~mCWE= z#4W%;_L0*W&xg=1YoCIryE1Iw{%<~J4+2BIQ+sd|Fx45VcX`iC;DP(@hEq=b?!EZU z^zJ5NhNWBT{Zn|q_MrBU*0LXciw-`Vo>jAgvrk$>t-sDp?}9geLVb4+p3ma#DKQoNcvHthD6VJhO=ZE?&(1S8VD5VpW7Y+7t13cJQOvNUI!L z(7DG4nh$#NF`a0Sr+^>s_|tfIGx)xyIkvus!)I(eUaq+?L7!DSV^eS6>GG^jI{EP% z;ODVeb`^GCW6cG!fjn1m=cw9y_`d$q3uhhf5d!LKeDPH&&l!f^I7yl)HJ;8t322v;XS*f*Zqg*zWpHMEDKAkyzNSR>x z2xX!t5A!X#{BM+tFZ`A7!NmOOSuvj>e59ui=5q!g$@%(?ZRqXQ*eeS8E#HG{uhDZ? z4y_U|i;FGQIHbdAPO{e=q>gB`)eby+8d%6yVcBw^x8>ZOr@7eA^UR;|++Cx!PF=~_ zP4r{e37C&L`lG%KeV^nSY24e~Mit;mw+4@;Hnl+LSFw~V&YUx;~A#*43{mQnSPdn*Y-rQy-%;PV+ zIDe1-U-k<-ZZXS@d@5bbhRcOK_r?=m`7-<({nx-gAl$a^59sPI{31E{3z`4b;-N|G zlh*us->kfFw19D60`3U++Gr>IOoV$M_Xqbl?=c@7%YC8~zeYIt6`FYbz3pWk_!T-K zegz!-YGMrH8Nx5gl~M5P5cs9{*!~aY{mwFPU=6a#ACNb>^WOI7Xq$V9gJ0x(ipQ^H zxb+=y>-k@H;?_^;N4WLJn-k-a?qkqh2CgsqG3v{{6pu%R`N{F9+=D0I2S>7q-S5nw zjLp@#D+k$AQ^G)TU~Eb|@CX?3Mh+2$LR zdGS$ow^7y^yOU}D^KF|}CC0gsxu3P`#J}V3V)&Rfc5y7e58>e9o7ig;yN@Z}=kI0y zBR!?)@BIw!W=l0&`WcPtQ@k(-KD&t6gkkumt+?Y1BPu`IE95JFs3-b^;@62M6`lJf zaFQ&nSSj)0nHC?;G1r}9tb7PxjO>vUv9&%5PH#Z|4aFupzUI4jY(w_8^-udwc`IM` zzwUa0Sm5@6al|@9au|MB9=mHtwPbI2<_g{?{X;ZOy4Y3yLN(v&H?T%ylWc0syg8=u za}{SS9>dS#$|VbF8{ur6I|m=O4$a|i%7r8GbGU~&2%eT6ulQ7AGR5m|amG+DUkX0A z0Qq3W>&m;qsjW`zpU#^oN6mih8iU!hmQA5|XP%mG(RYAcd0}jhrRZ#7Y>v7|Alt$_ z=GQOWI0}4HPAHw%n{AMH57_2le-1!%I{9Uuc^36%T68SOoB>WX5yv81A?J9k`=cl0 zTaZp`+j{cM+0EcHeFZ8vY*@;-l}DgQ*FLl9(_3dSxd!x(Qu>z-+53+CEk*6auqPj4 z9xYFZ-e#DyH-P)dh4FY>{&>Gy!?)>z;JBR20>%wLB|f0N?C%S9K$|$D6libvFIzPy zWkPgz&k50DUs}x~aHIv@YQ~a&wIAjfD^*^8pd_j~++$ud`RK(vD*k-e^1$qhNLfL6 zd3I%Sq)@T_JyW75iX(oSbvK@k)~yE~);>!xUd^R|eP%spEk5M8$_90m4KjB+W!Zcu zmmh52m$PPqb%*CH=9J;c0S_V9#oyb!EQsHdJreLGmILIsjIw76*)yd9&N8uQUgP~< zIY2qVB@5_1UOC|ZfO~bbQW_prE_F-J44Kc;_7TY{L%!BAzD#F)x07T2xbY!-ob>qo z_V|99WPEy$cYNa*-yOUB4V7nfj_*HdJAa75ns%j=uBkCXx+Zce~VAl*Kl+q zc}Ya)QYS=%#sv0DuqFVG1^1Oi)4-WBaHeSXoJati83JzaAnrixdURn4wxd_;$Gq3Q zEI1vyS;M|AXHO8P6b&q%ZuvHYfA?Q8{#4?u3hlgKMOAjZmEx)jksq`FJS!3z)hQ27 zz-BR;`JV@!({ttP(>N5TCOJWTZWm`^o??8`5kv#x`|v||Gm$0Zb(ORZS@OjEzKJ!G zt}+rhC*t=SqbrkZ96P9&<;aq*u5v16k|pnW(#~B{KEXG(e2H&tvNijCKV#)!*6c)i z4PAb9GH`B5H>TbMjkp>5@Br)Ge<8Em(3M6Om`uFx;o&W`exTi57c{IxZVx?=1mVYR3e|>MnBU3nrQ3JNAqy!r1@wr z=+2oR4=>@}$dZRjh$+ZxFM^)l!8(*N-!kS(jKN!TSd(J#X%1^Lhc)>g^f8~hZT_XJ zmI0$8U)px+)sFX_vS$ml$pD`lc(?it6c}%nAM&yHy3a9J4%}x0cXzMNX1s~^nnhC? z%Yh^Ip8F1G7*-%Zmx2#JemYv0jD|{Ikld1i+#-IyjPXgI=xQ6tFn`q7SUDekKHss8 zchIp3$I~&Kq9;wq${jj(6Yot#XXEKu8tZw-EY=f!-lelsX*>U7*~BxG>g_#&!?nP{ z<~f<>CA1OD7R^DfNswz+^onOakP36v^u8~e}cUyfInZ`QAXbut)}n7P@pEI4|+fNbAy9FF3sNl$5{3k?h_iW zKCg)D^CkM!I0C0I7GJQv%z;xnW9`jY@jbJLkXhJcX@gRtb9}u$dnwh5k&Yje_SW01 zW%&U5)!rH)_}F|$F=>g`*o|8bd^)i*=<^o`t_ls9v&k4xO74(tJBh*erKPd&iUXhe zD+8|($L>ol4!q)P46G|@EG6IByjeYK=RZD;dops`<+G?ui~LGFw~=uOSKK?Sz9am6 zn|KFgNXcUc{3(d+c<|VS9bE67W{L9u$oX-#eSrxhbt_8(7=3w(XesIc&#oUjO^N+96+CGUfZsZ7}xQ(}97# zUqj}%DATxC%y#9*ka@LJ_5fwNL*dBxefXtP@K5>iQ>7wv^gwRuNi3JIHqd>R?0 zHLO=L&&%#gxpMl?Gv`j^zuM^8-d?No8o)E{i_Mgu!n(_k=9X2lF2ac(ued&(kU5L> z-OU-R`X{F~3}cO_2W#3FGp-DBCaNwx)$+mWx9jVWKl%V?@anamImSr0|23Sqa_glK zW1+KBseCIh#2)gj!kbOOEI_W+>i%}jKn-Iw>1Vpnn7f-8&N5#{aoLexqcoox#MBD^ z@oh{Q2RtL+@)aHKWi%>wT<`I5PDy^mG0QsVBfqHLyXiNvx)+Chlbn6Fk5+k33VGMd zza`faxe;!~KQ-Hl$1XqED~gTH?>&iB%vh>z9n{sI2y_`c%!uG5a#dgm zovxs-r4J04{fJTN?>|y+&`#%NV)29V^67nUoS#74y~W2qO-XMGiJr9F;S6IRv&@Id zQ|kJW{}-~qFRUP4UCF*#@p}%S4mo2w*8ewj?m%*Tq#&QFktbFxcWa2#U$(!ET=B=B zUvc!#%=R-Zq#eIRjtX2k^Wpk`NNyp6pPW;Rg5upi29dcI?)f1dW6+Ls5;!-~rfzC< zm_;AiJ1V%J2)Dm~)D~AZCUW@_uH{^JaNWaI$@LW1dM-cLHy?ky@*;oN_Layl?Uz%< zchFpge3d;gb^K0eEaua{i^7zV(RwV7kvBs6bN(WW?i^kI!2ou^!fV5?`mpc*uAap*R z_PMFp2%=vG^}rT`R@J<>XmyFu>IJnXf9#<%gL1Sj=N#xF-+hd{4*V{fcZ0c3=Jym|=TY5H zZ1`P-rV?8&^TVU$SrGeM#`9Qg;#FT=>njf#*z6_`$Rccx4D`Sj$D#pkZK|&gpB6c6 zbU)fN#74{_?nmO{B<5JB-#Tn{@PB`QN;+)7;+#QD$WUT7gXbM1JM11M+K0wW&K zYPa|Ri)lO2COL;c$V@4L*HVeEB}S!YBK|0e$w?vBR`xzkCr0jK+SP(D`bbE3;#9kl zU)q5V;5<@j^fCU{MSNd=Dz*%{Dl9p=Xt0t_KAlOH{7)h8tR??PtB>n>6H@74BZk6= zA2fAy-+!?&6`wJ=M!!J_>e(C-hJbPp@Kr3L&(gmH#Q7GquF8)%O zy}NlPcGa0&am?WbAHmaTi;;KBvc1NVe?sC2x`HDxx|=YpHaN(cDs;b>HavEhTC;k0 z_tElh1N_oJT}C~|nax%`^US`RYx4BG+ai}QGVM`?cI!Mw9u<*kUqf%nGcGYm5{p>& zLS{`CdB}+ih_>E|j0m=OLZeIu@n4(SBPMu=F6_q|qu?cVNKBJc_#fFO`zHK)t{!9G zgmG`|n{cpCLhzG3g2;ho8BS&Yr|=26u6G)AF#LbZmK%1{A$asK`}Cg)onfBvjJCr2)O zi)A{22xhmpz0|1)}M_%NpaOiOpN%tgcl_?HWE z+bg;3egoYmAXmP$S!Cuz_=819e#LLT$=|Y0BKAO?qKvfb+J}MlIM-S(*&`q9+y>`Q zGi#dIo2lD?&`#!*TNxuGpuxMM_ovR*{o9t__n@n+GgjtcYs8W_UFO^p{}c^=f$wCV zeoch<9Af>ypr7I-KLY+zk!^ZhE6*>a?~jBNKbB;yAxT_}$cs?=3OV!6aK^Uojn8NXsr zO8k}eJkfl!=^I#8IfyA_Af7TAZMYS#UG2Xql7;krrrEGeopBx z8SlFMr_Zcp?Y_-4Z^kLo%h#(#h|&X&D3@LxGO zANt`VIu$&d%$)V7f@d{3>jlpS>N*uXi-X{~)rO~qUoq`V>Vl3I$mqTZ;naFHGC^HT)BWeho6Rc+lYg$B?kZCr>d7V^S5QqJcc#%G;*{`jN=h} zL@qU|xeD2FsI7+ZuNm@BXfJPMYrO+l6@47#9}%5FZnP9pA!6n zf9Cn)SGilupJIQ)-Kri3_zkfTwb*9V`JA=(FZ;mGXFQ2)Xyw}`cu3|~-wC^6eU+HJ4zElKb%a&(6m$c%b-&T@Gh+Hu6ksDB8L8uk#;CQK1WT z(>OPM7wvK2OU_eTUfNE~m8R@_MAm6F)@Wl`kE;4=;m+Q`Zv;2#@2#;)-)-HM9TR!K ztGl{?&+x^SF4p{aeXH!xhAvKg-OMeg;1izm`nThEMnrIy6Mgjs-+#$3FcRm*b(z<{lLTrtyCt{=s#Z zomcUe`cUPb9*YMQGY6hd>_eLx(VW09``}s+O(WhE-uvigd@ox(snUwT?*liUjO+vCnkgXFtOS<~V@QcHs-{#FMsh z@GAAmI5mne4|geDk?K zbGOJCtfg*wCgnQe0MFN%JTJUnUlzKqKBQty+f3#y&Bj=Moi>zwY20tM+5^mIfVpfS z^|_4t>gmH=#)Q=OOWw)(D^lll>Rfgf<%S$zt}?J(2<3VlU+&?6a^(f%M#GosCDYtB zrJst;A$#Tq`kxO`mM>2q*ShSrKHk;Hv`pl{qNgV5I$JxIwNv~E+sS>3o%2p7I-p}N zfbV23v7ElPf3tc^a&szhWUrXUwFlboX><4%%l!pP&7P;olMLPFa<^VfZm_SB3lq%!PpRbbIFVfFh$*>mXZC4Ee%xX3 zk6kVdU{6Ya_H;@;cDeADlq(4JwGQc!3;lWa^;sep#&?nnHfr~G3+`t24ACbq@a$T~y5w0Eovbvq<&-2c4v0Us#=)29+(kk3 z=mEaNpJ2+4=w^W-GC^$HWy2YJ>BiVQ1YRBEImZ7SINHavu{OcJImYGkjLg<$Az{XN zLmw=g1e_}Z$8d~)bpVWI*HZ3=|b*iiU*OSedxGde5SAaeeKb^wfQK98I_)=vr zqP<+Pc}{jGy4vLJbfGKqHdpK+WbKdnf3m%2?exZP<{|D&>c-C!l+K5`p!1hJfBUXu z`d<7u`PCR7p~zIROC0=)tu^tN#(t7)e&bo6JPNN|%)LHmMz4$$-eKM|YlgW-$+NNM zvs-M>Mw!oYZO?|A&u*|iJI8!>jqO>A`E0W7+3Du9OKs0w=Cey|&jy&!#@U|5n9s)Y zOy-$ZTY8z#(`{wL%x6F1nb5^58)`luYL#XDw7qBO*JJVvP0q01L6a8qSv=29l!x8Q z*DLFCb#J;ilG~;*8QFe_d9ClwX`K07K0y4+^1GEYkG8P~g*E$0nsY+<*6!|_^E0*7 z3&`JIY|8QZrW~J(E}X|c)`7BCXv*<0{HsPzlenO38)LBVtbO_HLDTo;Zvub&KGqAc z?PM>j)FW#h)|t)1!$m()eD@MhYx&TA&9@7>lV_K?t!|e;~r7yBKrL%%cP6@%H@a6ZrO#rzAf7#AhPb z_fUP#_{%!!?Mc|_vQMqkn8vOjuIptbTF%)JyFMkMAL#{Z2DE$^!Y(-`lCq~9k++~Fz27FM0Xz*o8Ij6ZLIm8NOyPa zJ7Nuh{f2IAdKo)*-93o@7XAHbfbOoBatFvujb6A%WEp*%%Cn*}YyU9uOgWB}iG;-FZ$obEvqr1_omK~?t^yu~`+R?7N6Fb}V z7uaojctvEsCUQmY(aC%8XLsU9=AN>L&rN-G)K?Eb=z5#}_yhk%Z=dX(iR{8-x*oWX zdc=PG(^^9h=yH&Hx4dh}x;?q3{O8%L=Ci-qo^3Rr)${CRahlq5tlLH^Bg98%t|M=k zJdrcWZ_!q)`clkwwC(73SvQfme%YHUdbou>*8SOIExIfh{yd_~27N7Bk7I8`E^NcM z5K}Z4dBxhD8F%sL62sRe&ty$j{Dm_(zr2`pbzWmWHi!HruZXXSaU}bIoy25L2*_!| z+11ShhCN<+KK{;Z;wzGouj1d5F;po1&Ar$vLPuHG`wM4N{5fnuh2Uwd2OH;-^n|Ca zd@a}W-2ujty-}S;5_>{XkpX4Cxu#$U|d?tGQlJKAGtr*Dn(iZssVavZFdn@Wru#a$2``(Ii z%lbzu&&Q)zlIgGV9?FLE=_^^+>;_y-8BkHhSxeQ#vsZ1A@z&qJnRaQ&ZH@W9vClBZ z|5x@FHe%n}pMAtLBlaTJ@8X;CfV~uAHwq7^MfcG6G5%P}=z7dnPIOo}_Hf7EG;E4z z@z+zo8y?dXYu{qf;!A9%O{T)4Iu?$P7I$;LtP~tKEn(>q(4R zFJjDk6Jyqg7&CH(Er=o?YN$6Z!d>$+xei+NJ-80y%2fJE@%zkky&Ku@o`RpPsaW&n z!+TB3%pAzfPYpj-*_gK5@V_(fuZ9QoJyc~*pZGr%o;}4g_E76*Sk~k7Xv7y#4@|K$ zw(k6P<>tP!=IQYMiTjb{C@|i|_=})_-c9b&&cRC5Ec!-lrU}oNS33I|d6SVDQ$%L8 z6?gX)9a}x6NU6F@avdBkQ@s}MI^K*k!-p?*_VasLC*hp73W1&1eN?*GS-XktI*2Xe zBoAhW+P^ss8NfR2{w?fzI=osLeI!eAZVzm3Kwh=YN*mRxAygq|@{nx-c#2j#1h*G%z zg`1<=Z>>-}%rMvmf}JZMxb_6f03f@=t}b~ZL+ zV4KRAZybdVbz$xo$R)Nvg|*dD-O4Lv4nK;%5+Ah|lKH~nr&OP;tF$2Rgr+5qf!J$C zKL3wotebRbJkpj{5B~8ylXZq*?SY@VZV!EbNkDrZ1x}v$y=beOck(NJmq_2)@$id*9dt$T93l}KLbwoKFI~(@SX#lV*VTa)z9AxSTaAFuZ$u`V~l?v zct?rso!U>w$0e z`IeJ9^f3w!|9HpHwY~V>lBe=3?*$jV9BuuCau#0Oq;9_b(EL`>>o(Rl&t|+=_t)p& zqw_T-?Na_P;(sb}CVP4)Y5que>*cIBRq%T!zq{041qtx6BT@vvq3t_9Z-9?OfX2K)Kh^+v~VCsSyRgd49=&UF2aK!W!tg@c4OL zeeh)t`}@L28WP^FRPqa36h+;$n|07(+z)f8dm6Z(rl9Lk2t zML*q`%auXCVp%`zjo#m-_HLez?q01%7S#W`V?DM0td4ui?^pV{zplq0Ypt8E8BQz< z*HW(eT%}z0HB_N9ef=Chb+4=;U~9B0y^a3Gf8TlsG|pu_368nUfAaM{=-3l<%e2Vo z!`Hq_|FgenfrD6GV~8~*OEF699 z@cvzw$)Uteg%~{CVDj)F#rF@F(prPw9{toa88dz2r|VV~^#L16jUDlO+FFoIg5p zT#Mv76uU)JqltaVT1MXR=4!@G^*Hi(z}rpmw#fF!fhjpgqOsishRDnryesdiRmgdo zqKC`pk8C-dnCX-CBzgBS`>K*D_YLFuV{%`wU_Y|V)l!cw+_`6Rct_)m^7 zb{fB3xKpESJ!?>R(q^$&Wo(Ks3g_h@QKKoql5er@ahrfY={1= z_zsY7K?*eDn{&-@N#Ks;+eG&u6`Ngd%ZCN{0 zSZ~tu**|>7N0p7em9)B^(4I3!o6gPhO$bq1uS-%>8sU@dD8trsm$4R6##%%fYY}HL z2M+0%ns>%H-M5oUe{tSxv$R9{%$cS1NdRxF&xV?PCbqSdvHHvz>8!|)k=*MeTUL_4 ztd0Kq6x(D~I_2mmoI36M?oxY-&qH#Q2j4e7oPIh0ZS$m`B3Z|zpSlI~)64YHi#?+% zgieNCZ}ibqloPxj-PPT<44>{dha{KQK>yw!M=pOBd!hW5j@**9=(+>=gk;>RoL@<- z$UA3H&azVr*!LoKYBqN2+~=27;`?ik9p7X5d)SRLJxqfLzE%K3symF&=xv zI8V}U&yCdWxfuT+z)k!<)eh{rq;5X(_jjDH8tcD}w%hB@KH8R+i>_M7ce`kNuEb~c zyHH}eo-<>)$dz=V*Fh|o(Ch`uMZtTN+oueTx0l;DGcVqoIEeiolnJBESI7YLZ1mGl zw(9HRU9>OXeX`k35rm;T`#v`Q81%ZGv70u(O4BjcQAJ z$+bq`oC9o67BUID!UI3$@+-3F=Wlfn>^=|c+)aEeW#k20{ZtL8({I%nKvL=zA znElVg0*1iKyXm#jto^6u&TzLzLf`4v&~K#0HKp?)gfq zga75WybO}pDfdjnZvO`Q=OXj;vZoPaCjVKlDrQW1_`Y+0b=Y@Z?Y$#!CH@Ol&sBx} zh`&PB=XBx^@jU1m({4+8m>YYD@$eAq;klpdfiaE|=+9bpv}+%i;u!7f%@yw$E%N!# z;3Yc6-VU)z<20qFnsY6c$>WYGwaQULH+R5xoo?viZG12KJmvwVB`;C+5 z^}T)reUhlOJ}iAB@8LDE!I$t~$|afQwop!Z)EZ07oAj|%dSh@~-0B~zPok6Ett8xB zKj$17Khge862Cy3B@de1E6}3q!D%g=m(uD9;CDG!IXBhaI{O@@^;W@?_UJqX-ZM>rmhnUo<< zFzYoPl7*TI+TMCK*u=e39r%Nh^Sz&Y5a__Q9xQ<0-n#sM*&#FpGYM$faHWZ*vl z+z$3oT6I4;aKC|PL{3ZJ)MH~F;eU16k6W6chdp2DX7D(+U?Q}efPN(x0Cu*>fCT8T z&&h$`@+LMc?T-hBJhR%+z_)>TOSxFeQ7^n6<&WZC+GuZ^JdfnL)U)G;$ml@1tq?2s zF7I_dhMvO5`S68yx=Cx!J41O#nPlDzOu1eGZs7cG1oVxfY&o!`kEBmuZ=v7M zG|rMwK`&&W7sS75@AuazqxZY5TzkJiZRMFUzP*EQM`E8^JhR^V)>h8?HgNuv3~oMT zUWzx)8>Z}gM{>W29XuU6E0Q;kcJY5tf&7Or<-eVF@(t^$71BpatNW1zuAkG7A|Hk3 z7VWB!kt5vvz6x2c{-biw9_}Y9A># zvB-55ac;w2V=kXPRp~o%m~xlMq73qic;q*Ny*2VnuIx?mO{Txpk3NR z^(w6hZ)-qZYs*|Mk~>O#gOkr?d|^*Xj-s_?(^@*w=SYuqd)aFO%07=w{b%f*P}ppO`R$?cbL?F2b8> z@J$@Nel6<&^^V(~RIZEfsf;@B98Ed%G~&wkSJT%`-Id9s)Y!!`zZ=HYg1&5H&sZMs zwuXH$VAMx(1M|_k}W+Zpt(gA1VGd7wcLH#M&;WEOc2fW1sV6 zn%7XK9RItVEt3HMNi2m6yPyodaXLS!OkNYWYCrviUum(djX@I~#=GFW2pE#TSiV~X z4DNLpDq~9M9n4Np@HMZ#-pJK~ufbO>G4j2Ynmn0*662|;Nl#8sbiXQd?%j^0Clj^A z)7TuhIy~%G`X!v^R8pQ4pI8iW zrPa)XMRr`xH$ulv4sA~r|78yN!BoTUnoCZ=`N)jphxdo=T}(_I?N+ z(r3(t_mqGm_mgAkf3dHueyth3A~Ft*lrVy^1*F=6c5G?R@j>v9=9)^M`<=@l6xB&ib}(gX92z zy;5w#6X%x@ddpcx8o7SNPc44UJb2LgfLr$m=Fz?eY#*Wh9~ckm@ZmgsYxzHM`}(tA zRpyErAz{sui&9Z!A8^0sTGkGphBmUN$NHAZ{PJYJorwQN#$|TQ>Pjd6x2=7Z4RQOW z|Kt3R^Nq-CfwO{p;guDR{uPyuxC+h;({sONkT<`Aeok)7+)2&>uZExdeTTNa6}}ir zUMd%RcN?f*Vy$xNtJ&lOESjbI;_2%X?VB&0D)aFZ@A;=pr#4+kn>Ik_Wa6=;-hQ-6 zlN@a1_EX69bPMJ6wY0WzJ7XiXiUASq8)tmTxLB~;?K?=D?RY0Z!*_ruxN8qhYpH(F z)gpay7+ECwi#+(ob}>&;;ol5m8XU4OjePR5&LFZ=JCH zcy156-tc+F`u9-3jN@$HvA1y90PxNR?_}b`B=1+ciFbA{fjMqx47dwC*&nG;XN|*I zkwUJTj0R=@Ysi5J`mbD#tB{x^m#XeBr5%z-gtI^Wsqj%4b5a*;s%q(t$)QL1>qfUm2%6|Y+xx#d|;w~TeAk)_YR znSfje<}~K6n~|MO!0H9hGcSye)pOO)@vp}zkvQ)M*nPoucx*>4jR`& zPph9~k3}(bx(6QE$QY<2N0^L98G{<<154j&<~YhH?x8<@WsRjjfu9!9zrv}+RfGYz z1s=#{-1Jk!Dkjl)#q^!{#zo%XlZsBI-!E5{ir48wdA6E6hK~OD+Afg?{OsX!OhBkVrrKDfJvN+gY=k1RqR8J_sM= zCMv#pXR1DHAC?zc91jTlg&Dg7#RSp<9;16v(o z6_+vwICIV44E)uMg(PgeiRKu1gFKtoyG@LPEO1`TI3TB#cPZoG8Q^bogjYPnCF9_? z`Z$Q}avZRBt+(fPWZ|Xy7;qY6;CjWEkFU-c19AShuQkTHjDb32|2?{G5jfOq(3y}i$A@17y7tjqS~`!;sX=6{q}M1JHPe6`qh_TzxUO-d)mI5 zxUknMdH&PIPrUQol}~;3cE$%^z5RF#&wH<$%=01DnJGgxcg=KUM1s<@BH{kbZ3*}G zT4nt9)_+;UuNda&SuyNqleZ1Kuh%N$x3~WLAoaef_NjRDfy=kONnOToZ~eDQ?U>*6 zmiY}fc{zRjTlROorS`&vFEkUEKV- z!kF98U+ef*zU%FXTC`8%-Pn@tu;Gh;2DZ#aT#m@*5bEg@ z_D1D-TOwEe4IO6rB!bT!jdK#D&(EgMKX32zNWIU0L!bYKKL3I~KS%HLo_e3(NuU3g zK7Wfoe@pN4UaPLO^?4zEJ`A~T^k+}AUyc6l?dVehjVpTp?8lXH0W&HM9^)mls>4R&qyJ~H7+erF;lR3A26T7{|(Nmw>;%{JX%l>`l zw$lG!guP$+;U}@HenOwW$=sGn@%neMiSg~N-^AQ@E#vqNzL)-gQ;l4_OXjA;X36}P z1*G*4qBD0fPmw-0SO=g`-sdJNA=cn+% zCg#<`7r$}7U-`y{Sc5O{AHIE!Id{HMpF1-rtsSco$D@RL#%lM5rdV@7Yp(hdzL71q zdGzVvmIuC0XzFt!JD}-zoj2B*^Y3lYf0sG`-t|4_-$$-C?0m6tHqrM!UG5w6?@1?_ ze@mS*|F-j&*JPVv>FX7pL!aO?+JpPmC*)L1B zxh}gO__GxFwzJQ;gFXR1*i!CGdB(7{-naBKDe1tN8Hr52>Y|P{1INk%s zhNErk4ZAmZ87ua{ExC}1TZ(z~yZD*4f2p520-AhRKXV&>c#wV)Kl4%U|DAs353V}7 zpP4e9+H^8M^LEMy^E3aR=l_>}<}2x&6Zx5+F!BB&{mcuf>Kl9(H@B8?fhw|Njlb`tr z^gLBR^U-Dh9zXNXz9;S9pe_GRw14b7(Ef>2p#8tv&wM)l@O}Ku1+?qG$Gp2i|2uVi{p6GDcFJ^W)5&!EyOa;6+yBV( z|4ZFI722Liw?A#-{X^>Z`>ErH(Czme z`!(Qus67x25~UC)%!{EqvPXG%K14!38@NPfHWfylYevbNBGKjexvMvf9KN104KYhg9( zb4CnbwEtP&NzP7=j;yg%6>)m!sTfA z@tmopoC!q!1kTUeLp;lBd3Pq~UvREbf$9t|?!z7__M2y&r{r8lJl;C|D|?A;k$Ay3 z$R+y~exggA?$)LJXAQ4eV3e@#C~G@$z_)O}l(T1@hm3Z<#=4Gc7;)X?l9D|9Rpg(z z0~|KZR|-|~QdxA;@n@gyH_$6r_YFni8@i&Uj(r6ZCnho9)!1ieEdlF zxm&%+%e+$4hg53CVs_AX=Xb^L$0mMLgX6ct#IKJ2I~Dx$yTH%li)X;kox&O6`0%Qs zUp4fTv!2SK-68m-j+`Qrk58vviiz79;0BMBo3vX(c~_)b=!TxI%hbYJcx2Nxn z%otyZ;d}-13YUrwT=Nun=feEi`-XY*+!K_O*_7yuBzj}Uj za-pX()(bc5Am=7d4UxS*Xm5;L8WP&Z()Th7S{o0U0G$?@rD zIynpK$s776b!l%HvIXC2CtUOR-)RiNN2%aiMV?+5B>_y($39&m7FKJ@9Lbk1XqU~WG_tnxdJ+0 z9cEl3JM1*tmTAx^0k{^8YB|G3+9t9^=TH9Mh)mMLj6C;tx%p|8Az!K)4@clHktfyg zn($ej{w!9PFNcGT5ynHEIYvG(`Rr+1o2~I1i+rgUKXnlKQiLu#k$iat{M^Vt!7mUu zk%KY@+Htdu0g-(cZtt166`Q!(WsBfO*`T;hIT3F3>2jeRV_-Jz65S$sAUuo}4gPH! zQrfo}`6Buy8~s939$mlG62CG_&do!=OhcFL5&gomJG#&>x3}w;aL&c<&@aME9(Y~k zPCU5*gg;c;EWE!No)45emG^%er;iKde&D-hysKk;1U{ENHm5{)o6eE7%Rss(m~?Nn z=^Tsh<@9SE``{(s>XgTwt-f4zYq`mT*0}2yq`v4A^z(-gcjm!hbP(E24!)|z>lA^)>kLzY-;=LF6L@2?alBCAiijvZzl)Fm=4u#Sml9eI-5CBU95 zpWk86m1EC&u;&KD>*b|}Jy(uBH-j9srS0bcMfo*yW95^J#K;9OZdn0+Cvo;AM($J2 zU{RuFFK9UNx^hP6W^D0IX7R>$jAfQ*>v`Z)x*S`R&DcX=A*o*l)dn z`6V#lIzvhC4a`35PpiV_$bjb>(7WfJp{2b=UaT+G$n9^E7i*XEq2`7}CFe`xj@y{y zeDO#2qA}iPfge0RMeP3q_8c;g*nT_hS`DodlAsagiz)Xx-@01Kp(W*FDk>+QvAuFu zqLR*8VH+nTYH9K=vp;91@Lrca0yB@Zn;lB(`@%~rjI;ODuiA33Yo1FO6o*|C?Vnio zEoVJP`?tcsDa1o2Q%=^ReWw2Ou?OproQHu9N@bttv|CaN6PYitXSAT|%eEXJJnS^* z3yFLu_C~`OoE->#M26%I(hM2W4f}AIs>_(h&pH3?RL9JFCO^a1@q0N#AYja_xYQUk zR@Pg=gnYTP_K9}~4=lM;HZK1Ky`XNV{w-0%PB@dYf&hg-?DDKhjSS4*3eJT0G zBqrE%fHRihPvx_Pk9hKPTa?q^uB?w%(&Fjs!lK-k1o$EGr^@7M?6=*5PA<7Hvo%BM zrSFw&rcRmLPUF9VoJnHu)C`f)gVe$XWb}-F?$&XNyLD|JC2eMeyY*)Fc#@}F&u5m{ zM@zpsl>hy(>9KEj_wJoOgLvyB4o7Mdv9eDwuiQ;erL&iM#0(!3@U)pre+DjB1p5+;~UZR1+Xh$z4Jpmk8@2@GP4T7`S211v_qggx0 z(S9Xw2JPQmSsQ84Xjqt9VbMwWeKK_kPQ`rdMxR_nd&{V+I9@GOk(XuECHT$^Q_}9I zt_NuECfY0Uk0D`N`UA9g6ZziOK$}mUz0)6{y_=ROg}>}~$$XV(WzK%-W#pec;s{BV z=ee4D{-@+|yGMyly$G885}JHU-q8E0;}6i}6Y$A`CeXEYwc=hFV#-uAww>rUm!j$C#0m^@QcY@fXtUPPh85kF zv}zj+XgTE~zALYUxA0x)FpHQsAom64So59AI~j)>`Fu6(F!Em(YN}^|$Sn3|x2Bx& zVP!sNzlz*SE*iD5>RaMK<0F^9$8}~xN9In*FR!#Qp zBG*wZ=QF0Sd*Ge8+g|-DF7uPGj=XZpn+v(>w(V<(AhvxqvF+uI?FsBnAdi>6uR+ekc47BOEU(kKtukdz*sA6vbOQ6? zA;h>9zz@yDvaKer-2rb-P8Zegv^V#Ra zR;^}VWi4Yg!uD-F@<4~rII@3h?S&OMdooVm7TNzTvGzgRa>1#$B^SN;ecK{Ff|Iqy zj~XE_Uw>=7a?_}-i{}lPe*f&+Rr!6O$ zxHgS5B8fY!(et4WCvJ@EA78eu98HXxMog`g-3$**KptwpW{)m>oDt$|u4?T1`wxPA zKbr3k4q@LleB%jox9%qvU*aXPzc(CY{OHfSXZi}|ybkmEY;?>$=-}1Fx|fKrm%JP*s~?{z>t<2@7x`Xdf7{3%;pW{kc}_i6xrglK7$a>-M!7}uoO-Qt57^7Wf0FlC z;1%<{3Vf|{3vA`8z>~RyUTzN0tIMXgYz@c*lfZa6w%}^yVGeTfD&*r7P`H_!FA6v5T z68oz;4}J`DZXGajjdNf#v?^du7feo&@4=80V(VhJd9YRNyvQ?CPB?Yhv(&j2IpIW3 zgmuUX^IMry*m=?Vb_p^}%8Q&RXKYnNV~Js;O|5nG8Dwl4Om3r$2H*YI4* zb1u91kve@NawHwuW_&|#NAsIJ_(x!5(*C&@s;znBGbLtmN8Wg~HFsPlv5e9FPhR+X zrJR+rntkfE2Ri2@tE5i1@4=pGU*zyCw*q>+{r3eEyL^j;t2OxX|V?;!Mk#@02H^!^v;97CeMj zdA2-llH?f^FHvAxC+6Q`NKOcJ^NL(vcFpDv7dD~2wqva zTk$n9ReoHawV38S#+Tp9vjz=? zM{a$Uobrqt(bpENuJ$|&4XiwDQRK_)s$7yQa`{lMiNKb&OEEk=#eiM|Dx@C!nP-pCj(LAqeDmRxdysdM z&*WpiEuzhmhfi|wy$qk^nSAnH^6`EA`>ylx%}cyU&oLlvk2c#r2O0;C5%kO{kCEh1 zV~lJ7|6pT8>amZJt7!Y&-66gr84G&bWBgC>?L7LqD?VL%8uE+lQLfdrPh{$(y=^O3 zFEaS`34Vp=s@r*%+!N-R2DO*SnFbE#Fb;Hc2s%0xUEK|x-JLm14{{`{`Wz+>IesKc zsre>L@qWWzjkSZ7edG51$g5OEcpG^3=}g7@*)+vFZ*tp8XH{mWvw?InO(1koU#= z$m41&Q*Evj<>}7`>T5CISnEXOgwofc)tCYgGBA%^t+Eb1H_2Fs9t5ArI&_TbvmD6$ zt{&YIY>j9ivdq3lWVU;B_L*8*Iqg>MZDh`U4s8@3$mLu|tE`6q&R*79$4sJZ)mLpJ zgdW&#HFjDE9rW`OphcXW7Doqqe`?agDkHS$NttqJ@eMh9^ROX~nzV4@XUq6iqV8vN zsRIh)@w1gf4-I;(GU@Rlye;$?VA5j{^k8kWogR&Q+t%md!@UJtXU^KmvS^ z-F@v7rF}OtUizPv&78s6oPa#uz#Lb~WMY$D244C+fjO@}r(pf{eDKU+jv;g4diuVE zJRQ>4Bff51nT_o!&!_Y44cIO+XOeefhm}52ijCyy``E8JO9R}q&&5ZDt`?t|@If@P z*(&?H$EdQ?dcY9$+%w3cJ>-qiZDMHL z2+dNlJ0}6Nn7OjlC$_5OuF7uhktXN!h%dsT*_uO~vrBu+@u4>MQP!t2ro^6Yray1T zZ;D-9u$OhalwlQ>1yk{JQ%45&s{)^kUo}Pg`;RGwk`E`JHs*h!)a1ioDXgbw^kF?6 z-1RZ_S*X4i{mDYkJ3)q&lhZ-!36u4~g^sJHUDl^Ch5XjCMyO4l)sk)2qK(K48d9q#p%F$$UBQC(2)njFB<$!P9N} zxj$k9CBRQomj&xDz&hDEOO1mfm!Af$qq)A|UiyJ~%yW`YTjvjB9`oExGoSW*z!Vu1 zFFCi*JEy%&68~p<&hbht*Xxv#xym8nd46Zuf^|PPbgSrExn%w#^LTv@109~@8);YL z#iCzNddlIj(^udTS7@9ppc%luzXbhP&$>|)d0CSglg@-}AGuvy1-Hhtvf9faFLIhV*Fee)-0${DOhOprIMqph zTzxES&CNYl5124@NK3M+v^se%d8`kfOK$mS&HzU~6^9IJ&V}dZBb&0LkndAj8=|kK zhT~5`w#gnlIissxmoa9JK#OeT_W_aL3Gi)*R*=OvZDztBa=o>S4Qup zoQpBqL>VXlH>k?!T-LG{(eC8w?$KInkMv~j!)X6B@%xD!WKHL?rJ1A1uTi*}wx$9v z5;?e(x_`s-T|7_V`4F9E5zTJol*q~3`9HLq_*cPa z9nN^&(?e-(hDT#q+pM;&dHb=&MK-AkhCLZByv=zK_%*zZlo$IjSosp-e==T6X-*{` z$;X<(1#RPZu1NZ*GNoui3wm>pTgJo?=*>E69OpL3+4eGS1n)fdx`x58ZRD^igI}kq zaRqDP4~;P=d90oAD=4L$6PqLj9rG&i2E^eTIn&)b;VgI- zKJ&nSASMW1_=X&)iDR9C?U$#DBHQ_nuzb<@KdyV+Kim ztV=e=YC5a|*aO$cDI=tO8RetM8_YPY(ejj(`ZrbI0rGUq{OxYu9l)2=vNp@-8fctX z@9LpE9}3;&Y)cn*6f!_Ruim+<^Lh2+o3PHSM~)I&(s5q>0Qy&Q>D>%`X+u4I=!{eP zhV?Mct9SM2IIrH-cKmtu5%hQ9dG!zf(C1P^)32Gc+TTMyAa=UeUjnpjsHhypWaCLwUIMP3ZSR1Z;Bn#8hK9DB2F6D{dg?En;eN8SGY-HDqPL^O4o8+BzKC^Yn=J1qb~y8r zM#h1Rv2180@?3O>_ziVAjVza#Me%P=5ZS}?J;?7cp6ByFOmnxoMP@;RVq`)CV>mpN z_*2@b`z;N9|8~3I($x1Kfy-cEN~|_I|84PaqU+xlzoz&xw?vxHs|R|Y!fu$Eo8}c8 zZf#G`6dmsGUG2{Ww=K5kx_@+^OKb?e-v6O4p~D3^$8^7uZX1|=Q!D;Za2Fqv%*8GG zmO)>U<$unKTrPIJ$RUAY`A4mCMP|9TDJOf%TBe0CZx3bO-i>)XbN4dUYwV*}IfD>? z6SQgKS8~+4px183q4*`;5<5q~V}Fo;h_m~c$Gnbw-bMfDwmCW0p6RY2ugDqByD8xE z67MBHrImLsoZO=Y_;{M}8&2f;rPz4l^Df7p6x%pVIr>N(`GmzbnM=F%^MA-ytDpY^ zjbtt)I$zeYon_E;MeT?keh)ygk)n@ORnfF;%6W zG4*m*Uzy?qhxHdy<^c5|6Qcz$p+h{nek5ZfE>qcIuDk9ylBn#Exz5$nK47*1vzFgF zewBdp4-Uek2WSqvD zw1uORjyq9Yy^|WQFoZH}F9E8xOP~S0RqR=5(!G=Ym5c?}Tsgb-gXVE-C-%OvBGLgSEP79mkHG zg4C_AY2`u}3-<7<+E&{Ac2=2W>d!w-c{`EVc`SElSmDB*6X9#(Xtxa^)*zf% zgK%OEnu#@-xG;QG%BvH%k%xnEuG(BdFh<2-DjA2>6pusmo7|SBOb;Wvgf7S zL$0pt$kjCq{+UP)wNz~G9Q46K*6}k~zuyfFw(`CB%raQJPe4{Jr!4+=Ghcd~9!InY zdW-!i^F>*Q5?_eqT(@$4N$zRdw0N52wPWlGjCUEQi;)}HbNY9Sfica5p+a|AQwSC_ zr;u}foQyMg%5|feuSUa$hhM}FwQ|(F#QMg6a;~`B#~Et{;@g+Gwhvm%*p(b7lNb*o z@4Cv>{?F!$yNtRwwdZR8@5>ce1O7s*{h7zd9E+}P=prZkdcG4`R0aQ8x#FJYSzxX> z75@59$Q4&C{e;d7j6)W`+)Vf-l^p8-mpR#QD{EaDT&|gUJ^#O4%Qich#Z6g_%G7kSQWLqqC|2NCFQt%hq_B;1?lWhz6E>O1J$+JM&wvA{139>C4 zJpPkq+j*t`-1&vQGmUe1PPQ*Uj=cJ9%=;3EF`F~P?UP*iP1s1*+|E1)VHx|uw#W3+ zw!1hxVl%Qo3HzWQ_OQ%()fxV3)%1~BJh-&u36M$Rmq%bdn;m$yvIWc~Y(`WepTB!46#B)nn?w(t<@E)YLR zNO*JNuuH$T>V66uJwqPzJFxkFLmuVWMwK;w2fl(3=19zs z7T_;n-Xdc+R`a|QtL*zK`eU~bf8=^u&+3o=M*I-6ZYBL35B&#R)qmC1U%GvN!G``l z{V(r-!Mtbz=ZVDAUnQJfm7&BopI+_$+D#ig@I@lNoHct|R?2)aoB!o;P%Ip;P$G8+l9e#+aS38b;1vV+mk23ZH0x~#NfC+D7f7; z=?B4W?n!XF)57hV;JDo;xc&9g9|X56Pl8*vh1-naxVZ(ln=b!Ba7#G}ZV47{KM9Uo zf5C0-6}~uhs>pniM^)Gwv2KU=p=9xK#`?bz{V*T>f$Y*EJL`vI3ob^dU4(ASLdT6m z*JToG{-^4YrWW=;27f31HJK|&UA5Hp;W!6%$NKN4J~<=rYqLIGt_IZid1DJc)foSm zV4UbfD*C=g0J{N6QYXpbc4|aroUkBI^CpmTn-``QEtlOx-e^J^P zjxFHuyweZ7`zgjb%6Y_cYqFM)4>XpwoosN$7wKyZ#}_8?r<+H58}awIalY)KD?(FZ zR3%ONR9kXIOAKo_qK6WQbGb1#a{0N?q8$B{jo)ussrb>fiWv01(CF?h&}a*K3A=+> zF8YReTYUcRwjODDiL62Ld-s{{nuDyJuE+1v$XZqm_FC*~hF!7&8WX>;zZT!&8lA=+ zc8S=jLgNJ{jUNRES!-c0weJ5DT%+c>Yx27*eVp@@8d;BOqAh}ZCcJVsxR-;k6IxX# zI#<>AaIf1PUOQG@q^x7DbS&!y-twQx+Gy9l{6=&uF>CAjR&Tf1L(;F;fRp6Hku_Hp z_`VB_`BgnMxRrg|0&_AvCw7}Wn{Gb4)b@=06neQ!cy|2WcsU21{u`B9<06(}4SIjh z#LOB`sd4tNBh@qIxeJLYy-TfGjjg#_x0lB;zA_nKujzJj?rFr;^d97$k*qv7uByAY z0UyGIF~+_C;UmFuCVQWy-_HbxRlE~EwAQECgGQVNu?f?$v$2_doP~NjupTTq)B9|a zvLlkV?|miI_jwZMS5wy#HPm|t@7JkkdOsf?;?ti!5#l|Ea(8llajwHxLb-(VLcC@C z&b%>%a;ooEzWI~q4DT6h6z|V@{*RxAc)uK?`08o@48Hp%{hIne5v*&D=L}dg@3r8C zJw8dzd?!Ld9 zyk76XYYp$(`EZ}Ztm_Qccmmpdvqh^&Z|}f&2cKR_tU-NpXtQYZ(D5%^X{^})4v;P@kI|Wd#gKt zH_EI}>Fd2c@ZB#gzV7MW7Wgj0q^l>ay*;JK+BX8r&9=sN2YuGk?$-j#y=%dXXot6j zay7PcdRuBkO!|bkmlJ*ZTU$B3->)?L&lB5TZU*pv6<99Rl1sLJ2HvW`a_dbwq@30c zZ#VF~f#vSC`me8da^Slhb4)7(+hHW4Q$2y@>MWk>;}w6G)z5nSud{fdLnbAH$DOuv zdi#HA@|&lF-xA^9TWsZYcpHz0w-)}r!B$R(_qxR=QSG>IflkM@vC)zVG416<2VW8h zFWMSkvEJcK7<$nhMC-7h5;ifYeS%kf}XI9>* z6lYjPJoa9-gS`V>Qtx!yy* zGkkmH=*~92G0%whpM5^|eO4%Y$-a+WdiXy&}5 z0Xih_4<&A*cI=4DGHa%TPaf^pRCPQ17xt$NH)6vzr&=NSveCFEIoddT<$^VCpUhLk z?od`WuqKegK9^+SfisjUxN4OI4H_vg6cl>HufQ2xuq&Z!{!Jn!u1 zTt{*lw7yc-ujR|E9=^{n=#r`M-un6Tr(C(!WJ;l=?-yH{mi7ze%iBI?W5B}?*m|a zfxZ9bZa%^Pi}cR@Fs~hUgbuqr0JiKG7oEMIc;HO|aGw{r^sT@R?BB=Q;YR9ks{`OF z@Yz&>OWg3T0Ju8@?xya(eHlvYUhuZ_&Bk`PJ$1Ns0dU>KhGq%eBw`-};O-Z=UGU?F z?QnbPa2o^Q%6K_j;1VnBa&)F|pDpmlCBgZ;r5$c>9j+G0-}HZ+z?GO|@XdwZR=-7q zZ!n&d@zW3aC;Ksl*R%j!jjIOR!7XFF!Ie!$aJPUY16*{y~Ov* z&*%A?LI(Kvg!E?*Uz~sM%NP5;*fgHJLeYMaU$=kQma~mKOtK%Yp8W{Z7<09MZp(S4 zZIo|n5c&#jE&1>bvP$Ti9YEiB_7M8fc}@7tl1mJKX#7I@0l#cC{=yji#1j8|o!*`p z|MGDTy*lMR*dsB-%EkKkri;!yKIT+ndBu(h!?tkgw#4E}(S3T%XX`NU zV(f<@`FW!zI>Rg6*bn$bYi3i2$lukr{{K^NgO_58Mry)Rc(E4VvV6VKwFWQF*ZVHoFFs$f zQx4-pt7GgYZe?0o?3C1xP+6vpvva~!wX z`Z33Z6>$}Z&;r&z6lt|ag5_=a~$8K`+He8F~_mQJV;I* zC$_@^bhM1+CPyq|`5tpDr)`wId<{q1a-O4KMfYkE>bh^sjFl$Jk*mV){vi zt|uxZdn7u>jO-DO^Sc-`!RIi>UWMV<>tfG~eIT*P#qD%ttr?n#4INuFeB(XPWCeXv z%{kDPY^`QZK<-7hN=&~cTVFoST~p53>geBS|ChZCSkk}9NCTGny~x&=Syu@BX1DDd zk*#|DQV;xGW$`n8607$~w7->{b+VqsTtMgN6_nlOh-%Jf}3L6`Z7@IW;&57J-d#KjQjy#ra?T3VXvbCEX@nU=%eaBl|pi?GKf z&O+vU+R@yd3hQ33O!Pi;Imwq;CBLd#DE7SAHClo)S&J->qOQWd!m~%)MhO4rvR_;L z5|W>(u}9_$6R5B|GCU$%6*xb^RF%!+_@?9`JHIsSdOeMnm$Vkzf zA?#anqL;(a&*7AhV2&8#&4%`}7Abv#zTB5Gx|^Xdi}L1K`m%baxm=gcK zn=zIir^B7+8VSATk&7qfFJtOw-alqT$c-(BW_D|-5BH2c#Qg9ux?|)V=0iz}SLS@O z|2>5ILaBE#vf`O;O7vXtk~Loo=PfpzUF<*DJX^{6u?^R2xX*pYz_qcbvg2g9&KS^v zYsuXw#`V2BgX204T(PyIFRmFv%a?Ngo0&6pItu7p+8#onu}!02Uzp>bcerZbHE zi-N;Y9|y)%WyeNfd|ThaCr7yVtnLhBeHSnqRsf^Fvg6ml2<+qMz}@0Y>EkuGC^?_m z>iL9w_b-fk8h>>1K0be7M;}kW`NVy^Avbs*|Gg)B?danzHauRD`^P%B_mAU)(`@=f zw0F9)qk#54Z-e3IzW&k9Fcx>gCz(ru@ndDj^}wjI!FZhe+GU+#+y$Qm z6M*rM4MsWlRo>1prgs5@HF`a-=qO;^XM-`9d(T6iVVvFtJsN%nj1pzXS-`l%2IE%l zbC-685qeqhwrsv17`L#;2^crpU|h|;yP`9UCxIb6rOToy&sZO_s0n|QUG8lLr~0Vc zu^tDuJ9FD|>?0M}7u#T8DEO6khW%9+JifUY{MIQuz6epGN7!JTE%^PcGmLk;=<_uT zfiYIu@d+@JY%m6KAAf&m825F7N67+UY*2Q*4vfAw7~yhX+8M?lx}f#+B4FezJ6-{X zYJ>6hF8H^&GmNoa$ezr(z&Kmk;RnV(zO(d86Zf?XJHv?Yf^QP$0AsVV<8ff@vcdR} z`>F+I`E~7kD)M6d0c z&|~vYfN`0!<5pliYlHDC?%n7`(YKcFn16BbF|g)#V7#jAxEdI%Y%rE{AAfge7_Vgq zhfy*M7+aMc7Xf3j4Mv&V7Y4xSf~M2+fU!u~F&r30HW+ttU;mTNFy82bPcv@?#!_WR zA~5o7Fs5@~dwXXXDP7=^fPA0uH)Tg3U|6&(qdrTY*vEUrkCdFtZS`Ejy(izOr!gw? zg_GG17xwDVD{F?GSg#y9JGfrCGBR>`p$*rWS;28FIh%b0He3gBAAhrnYxv1=Epv9@ znmP2uxIUU39M?0zbv(GLHax!mEB!mIbKexfXO?|q=^(LlGOs0X=W2xO<*=rX-U}x z>J*msfiiQ-CNOL8QsLwU%ZA^3owL^7=Xn6j?;pQEo)??4nzAEYy`^e^vK&5YaSNht60M%4ktxpa5&h(y{q)}O~~&G0C^ z96bJMRQ(e?TDy3JARV3J&*OMA^Vsr{;PIhRwGBLe`cn7nA1R&e&tqaU+Y@;|GG1=U$1t_`4`ef#Oz!^*=Q5qF~u1!KQR%1B+FR6KUZjyZjdQt?5M z|KV=<6>wj9M8OK|i@#o(RPgNQN!7F_T`{Ac)}I+MxJTpbJxLiYv&WF{U=I8g)P9zL zH|~CmD0G#5BhuBw{B7K>nYvEt4;zody+7cQ=i;%7>^H=pM|LyyWX6HV<3<(5;@$7! zu^8!sLH;~)npx9&@IAo^*BMo@;BmW)$E`?bW1e)cd(Jk~*K2x#N1;*G89Z)s@wfr$ zjQ;*S#x-M)@)+>A(x_?)9+O-=u0$H&X!O&=*UXxwFd958ql)4PN4t0oM>@K%KaX)} z$1)$voMP|)ab7#&KJ5R&qo0dMPfGXp=dlIrgQj@Q!u?+pmKar^fJYY>j}Ayz$N2N8 zX=V&g!M6-2Of{-@frr<{!-I5Lv_Fr+X6!-VEu8RxQS}OVoIRw+f;yxNF7xN{hi2-9 zzB@W0(x@r`k8fQ(zCs$`=J2bR>Sk>wLThIKf0@@dW9vfPA2{Js%>UrA z#>HbL($Vexc`RzC&X?n?bHWJB|KM@2i^rXmZtKru63W$N`)vsxcz1Vs}q4ay4I|)s5^Gqb{V9zO-OOC>)L34?FE^_PQg^fON@w}k^ z=uefPHBbgB%j7|A^6fP6YmmnK4V6Y-I}7J8m8sdWcI?xqCgT;1NB6hP$m}Wa4i2D? zcIfv8(wFtK>E8^bFNm}Gza2=Q;n4p*klyFezasRaXSE~uMZrZ+!{M_De41LveHDtk zA8t-5K8rKJv$zwAeEJlRMrW(R_yytT!H<0Mv_^R79L}{cpFco`#n6;=(c*TLsJqeUkB`*!nT}CE=&a zL2VdyO>OwzFVII(j%CP0@uoxZ8-m|p{08AS5I;JviN{aM8HY5T!Suzi4}NrBLvb9` z|6}ko@r%ZfVyY>2l4m_~Csjd^3UW)1~*0j0ie6qJG~2zxMdi*-cyg z=#JVp_|X|mYy2p7G!#GV?;|J%_=5H2>Z?93XDZ6sFgB>_r&~kN?{V+!w3ZkLaNqk< zFV0|sEO{5qi};O>u+N+_+<|U{&Z9G`33oc_`M5IxKG^G$OYu!j_=XWTP%_bKWvxMM z!=xp17S9U}Uz35@hCYxf<9ZLIGvK4A_JDI2JC33r^B?(gkDhh-?gQWA&vH6UFhW}= zAN4FO!kwWu@6gajyxS6Qo)^7Tw!ixGt^seE7i$swb*4YghcPcMw~Ta={}X7A;u-v< zrO9|!j%PGS&7rw!ol$ikbSuUk-BkX4Shvr)&q>GAoUzPFuSG1_9JWgae3h#>?Rm&Z z|MqiT{;!bEc+y|T9gyD}GU9r#uw}$!K8p)p;go-bXJHz?pKO=ECcIJk|Ifv{0_p50 z{CO9G_kZE<2z|%V^F#>l)Ow54xKDB~m&<@(vv{+E&suJzm%8}AiZuD=-F3DGd=G)| zs%$Plc&%c)RKve1xCj2@zqxolgLH=F&ucMweFI)`+{WU;D~|Oo!`av>P8TjS(jRm2 zT1#p8>fL(%3A|nhuL*3+g1?|%I9-S{!4;H;+siW21%7&W{;9~{RD1Dc>-N$gbFRC+ zq~MuqFMW(E#2QA-;dWt=kCp9Gc(;*$vrGROlwRd8e+1-jM*gE*N4`72d#7XLLfGPZ zSN=(qe#k%n<5*WTU_2=1ddWuqP>b{b88LdU{7IC4z(0Q^g+w59If8<>`TR#&Z8WS;#~2tfBSX{%*tlzLbaSsRPo{+5UNs z`Fj0xa;hMQe7UEIj`jH-Y4X#% z+s%8;=#v8bi9Y`Tja#4PcqZ*;He?)f>GCPk(Tn|M{2lqbf$n1$-3Lfl-|bKL9OzEN zCsW~~D@VEj{&=^}8$ov*bpLSCy@7PbB7eF((A9u$n~Uxxq{%n$=Jz1zJ_Fqr7u~Z+ zS1jBz6zPmR{OPhlR|>kdF1iPhj)u?Pt=}I( z_cG{mTy#s3u7+RUO_vV3=Rvoa=(x@oQaXTcBIueLD+>Rp>wNbW{&il1XHw@!A2F)F zg`7XS^qGcqMwY)mgCS=*=+a$u*B~8zt3TZn*b~znSG{6aQZ-`t=x*SncpqDQuH9j7Q^)a=nVJ;owDSflQ4lST7 z`2*wV8QU&~bj|dqn+IJNBaVRHDX;wl?sT~ocShrW#u}ftU1l@oAvzO&c)J{kIkC&p z2|lSm8pZUDpvNFT)TL(-(&U?W*YOw0Mt(f#8V*8F>HkP)&+wOOdAHnR(ESA8 z&xb_E_I?-Xf*btlE`{&7skWLjLEF1!v-U>(!ZnTUU3)jaCxU6bXxQkN$aG}IsJdCli> zmGuw&4EsrYJvi%XpF1pD`!>8$2|Bt!$|9Wl-J6?!yM$kF+ zz2Gt4#UmMM^3A*3(7PC;#Gm2ju^eZMPDkImqAJ zmH#rz55K%S|5@lT8+6@VbP<&H`O~e29MMtak^j-e*&>~(T>&0pE*`;1SC8@M@xNxu z>mlDV{GfPeC*s^^kj>-5e~~8Nyj$N7z+)unesIy%BAtD?KV3QKI)LsQ7u~;+_KotV zdjoV{(0$>e+fV6{{&Ww!e92-5yZpVO`y8X{e^^Jo@8Yo=>FN>wJT^hrcc3eC(Ul@y zFx;PR9q7IW-Rmy8myynZuikBoT+sasbX#3?&m$c@)SvDzp!+}2ZFbQ;g>>~`f4W7W z`zPo&xacgT$v5woI~R1)2HdtNCqHrv#Cd?nLoOcKNRw~g&Exmru?2MZx#;dj+86In zcP;41mwTs+Za$^qr+4$a5_C_1ZjOsC6X`Pe;@xzkLAMrkGhKAkk0#tO{iVWia@`>8Si5780X?K2I*+{<=s3wLDsFHyPW8FE*VC$ zdim2WgAcW-x!Z$tC|T=XKH3?3o$)p5cnZ!3XnywIZ&WS8eRgRyw!;6r0P-$#>D3wO z4EX8Ydex0F@>4*!{##Em`Tgv5$>&D#R$y&idA&$y!$0rNTZ6p616>Oj-Tw}tOqcr8 zeFi%6<@}6i((g}E8oqirzYjroIp|Kh=#C*x{&+XtZqSi0=RYpGYNWHf_|uhwj(kU7 zy66rd?ThlKdl__6uTsx;{lXtXKIb{`^O9fb0~en?lP*H29IOf1y^VBZgtgDy%Vc;R}{^rsGp?nor(=`p)Y}cW$3+koLhp@3#GH=-$-Y zfOMDkxe;w$+Y#p^@N21cc|Xi~C{q^NC$-b}=-mj`{U~%_#b=?iK7InalP^waE?7S3 zUGW?EkX;<;FnYt6&rI3tlL{ZENU4wjK@ob-$w1 z29%L}md%xs_6gWGl!{(2;ycby)Z<(c_}zxzeEjSfZ?;bu?2`rTO8ov5@a$^%nG$d=eGn-cJh^t%SXN%&oj-$eW-;FpHqRrrm^kMtw| z^jQ2-@uTssDc|*I;57b>!fzygiTEYpHv&I8ySflg; zua)!eKqvUF>3z+Hn~h@nMtWw;sKm#^qZ3DTh)w*o^Wen0E*+T|+0&P}JvKXW>cHH@ z)5G!-A0M?L@vd|m?#adnG(q|&lW!M*Lz8fWA^hsnWs z9|_;Rq%wrg!aZmx!!eYhAIcDoGIYZHbOvRhenx$n>hdz^{OON<6MDGH5ruR%_Je`t z$iliWupBu9bva^@mU8U6?zff0v45xIKG0K4Ohu;G*88Z-_Vj*Npx$-+>(`I?eo(?m z{FU}_4CylL2Ltsk!kRBo?_IH4Z`_lo^v;=dae5ork6(=5yP)IawTTJ4U3%}N^!Ubl zqn;b-9n@3nU4)nuv3F|P#p#WG?nUXH4;@b*PEL5-rS~I9`>-zzw0A7leu4H*#o3Xx z_gd@=MDHNP+5MLGF6|^6^cQ3ATcG3AFRx0t)und^(zHJe)H@4ny+FNlaONX=$099y z?@GQnyQg5xr}%7Z7^~4ZAqKvq66`djB0de){e+2`{_!E%Zpi{k#u6=x$Z&7 zGS63FuCeENnq#r17<95>{pq(}NSNlb?_{zs#tK?@xaaw_CfY@&t6g}J7M)Y!CkoVg zuX~O12WOu5TcaRP?QdD5u)2?;vlTGMTgZ}si+C-78{XT2FZbduvYZC=%)5Wf} zQ{cLFDfFTJXa>HoXP?*j#h^9rXO6#Mw;g|c>{?%GQ!!}x9;@0P*7R;;`^l9@J)$AO;qjZM+t&h!Ud^dmt}F;7j=XEJ@gi#{IogPWnh zf$6)t>=zAsig{{^|3s!wa?wYCo?@PwqQ8Ra>7Es_rx*0Jr)-LTDAT{_qCbyz5N$;7 zCwliDr7vh{O#2A5fzP7(*iAI)o2W)FVkr=oq_ z8$VEgz#Vb+-;P`UjdK3hI4_$A-ZQ88G4kb+@5#n?8&)CneTMl~fUlAZ{}9=d=)L&S zzWl;*V|u^#Y8ClK5Kqc{Uj<)B55ro?*h|3ZZkVRNMS2$ZDxBecc?9;4k+d(L=IqOJ zJl@1NLZcF=wT(_Z8WMW@bfpL%SU6_EmfbLz03pK3J zVB?&(HQz7rwKIN_{Q~#S%NxS;Ps`qUYUop8Xrl(kN!mBl{ux1-)+u}MtaZ2+I=peF zN5W*69VQ@6zVARg$XeHJhrqS2lqCmyrNFW@RSsG&(f2_O(9?P*_Xh7%q;n{Am-S3O z)-!>6o6xcI$-W6OF1@=UU4}JHpx&{(rg7^XxYiZDQ!y7^jNXuUQF{MaS-<|C;}0dA z!e423-%%Rz>4AFxTDv=nGm_uZ?%Zwe6Uf>hYHUm6b?$4l&h6r?bMMUL`|YuYm=$op zeFpjije)z7pVqm`UWio;v{#(R_v(e}x&V1Drmp`6nP+PrO?ZLqgf>Fw_ytI3pd7S6 zxR|~ghnU6RW-~orJqTI(XBxIsTXpJ0*7nY~h63*_qWg@NRMLGm<8gj*CC)F#;rwE( zy5~r2cNnp$P1(-RSN4_D-=&|FA&=Nj*8b8@a(UhF-rG!r?q!%$4A_juoh?0`IacPx zvAt-H(`%Gu{7-Sk@_aP@*K=%yeI_7lmOuRu;|=yr9ncF1@q7Dk$1R;Pr#o{^ zXIxR!L>|}p?1k+}?pK`GtMVGw=ZpmdYgj?^RO9bp1;#zEy4Q(G+=n(eVF0H?jr5tD zjD@v@I5P?k>NgR0)J(jtZKK%S+W*sSzXoaFv(7nH5zkXan5WVZ3rl~0Jp3!G z*p_WD78i56Y%cWXbVdgB=5*l`xUa~i-y@{oh9>mGeH4MV40_O|-vciF9>crnu|^%; zMRW)B`vLLSbN=Dz_uVDXiPJCP+AAl+)z57uy$FM*3}}AIB@*g0wHcv3^;2 z$2?HK9K-{P|0Wh`sp}xvuL$dkPFPpeqCL~TWnhBq+#TcE+13=hgtK*&QD}OD=60M9 z>|MfT!MJ^t)76=X1?KjgJsmODoGwHij&a#Hf$Yn1(eAcdi#>I@b?vS`7^GB4jiMMvcgFJ=_Ax7&ZB6~`Vncm=Y+-|w=HrJ zOB-m5&9`V!bIQv7wN$B=Eq1&%(PpFtUDU( zkb{_FsgGEsMTZrrCu#4m#o!$m)W-zwkJa#5N_$BG-J34iuOXd%UlZk@*I4#u^k0#k zhP24ujlL|h^C25A6-DgjdN8iQIK+Kw);&i0Q!d&0NEa+=EW7B|#3;@f z$Hh45a*ShFxMU|%n&YP3vb{L(3~cW)f6%fkaMmg1?wO@!M?v-m$nNcuaT%3wZsU5b zo!(eR5XLF7ZP7F>Blu5RMg!h;!(G%7;Vv01kS;?z3GBBOQya@ToUUc$A}!_kdX|>) zEo9Jp5kG#Y`{fCw3vho)po}8Kz6RQg&LyQBSxAeF-KaCErw<|H8p!yZWbj<_3DVWG z8q2`F<&9*-#A_K9{k4qE=zoFZ&r`#jo=a-3*K^4_(0qaQ*6S{PUPe0OrpEf@B5p0P z%$xgaebSJYGH;&ISf6{E(P!4RTA$lNa~tNibuN9@kbTf@0_(twn6*HCVq9mK6)`S- z(8dDobA2=V)J)X+Oa#qiu+QzJ50BNiQaZf}eNvmyCq>(*!l(7=`8(Yv($FR*LSq?eiH&7sCTJO6q(#QfD2Md5|3*9a zmNe|seXSnp?D36d6t!9gqHRCmww}d|#iq^xa2kj-z&u)vE2VMw$}P0rbFwS+E`z_0ITCWUF%HG zFs<(z(5!|&FOv@3_KT2?PHJqw*nW-emx{A6v0rVh)@Lm0OX_G9>IiD@R*AX7rZ-}yt8CMej^>zYciCbQ4;$EzQgObe?01#7q zBK9>Pckmgp4G}*h?~a53>vDXpX6Nmm{lfV;S!Dycf2j z_IxMixa}^T|BiGu=9)mAF|IVSOAy8y(YXkI6VW*++8KAqZ$5|p<~tzgDVLmlqzgD+ z+O2mH`-a`)+pd;cP8QN4XLm>2HkGu`zYDfG4H-Eu8B3AQ<``+WjNFjMWx;#7sw`

=(Gk`ErPkqt|+c9WRG} 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 Xs6arJ4ydY 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ќ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 `tkhkhMq5BfS%j|Ed$; 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

    n4qKX%f%6Pi_bYazUrx#qjIA-4L-4LlUKQl; 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

    _!^RH}$>??{prV-i>uXK|1kfDE>tr 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⪻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 kag@pC_Wf$0S|KOL|0qJ4u)N zo-ym|q&^2eyt20Q!#6v?vy5c-RP>F|W@T!AG~Z-DM0AmmGnRe9WazuvuJ3>43{{3F z3__0aEy3w_Rq<`f$oSmC7W>kz&};&_r+jk^!tTj8m2Vl&!IQ1}bBB)7-`kNf!k<0Y zICHIU(J@CH;6ovD4BA}?e755cr2BY@O-$_9>JRNtp9EhX_|K%L#U?MlZrd1l1HQJR zH%M9||3!vxw<*38=#_@Q$_RK^?>IZ`Z68zG#u&Pm+pc9e@lOM0-NiBZtt7B7F_8U< zL9E9Ivo0TkJ$xv3^BCe2y}6m4!ja-t?(Sm_@k1?CLPz$%>n1UV@vOIjTakab_RueE>swA!4jaV^ zYy}PUDS&NW%Ayahb$HS*DqF-EiJ~{gXjPQ;pX|O)>eTzXy?1{U`19ecBA;q^JbRe6 zrL18ac_uSf)_)7IyD#7lri0xR=qLR~)@lK<)jm_?n>r}9e#{W;BK9#sKWn*^$J|{d z*ca|fQ-&`C2Ai;FGRF&7e^GU)1AG*l{%Q7>WDg)P0p1X!>=2vP3DQoYD@#3Yt8xCvjV(-p;L#o_g`+io_Yc-oO~`)1TYcr+*ZepQPUW+wfRk9jk3&+<`0uhtod< zr)0b`r_8U6{{*yH_e=NZG9T{a_*g{Xsg7%$-H*mo3)lA3rd5Yt{M?C~|8e)!OzhbvkNwu&z3u$eiz4SIWf$r!Eiq5F59gpWx5 zUDO%E*E_O4S(83Wo$hzz@`;P4oxzqN@%cm-lQJ(-*Gc-co<5zp#q86n(Y^ZgfRuk5 zJOmyN>~>NvoOgfkyj9Zwx8m}3+Fx(*;7C4p8a~~?y4Nng$PF%dbZS#Fcj*!0X}Itg zo&OuY%4@|}Ifi_?uQGf}e3eVdYa^|Q{oE&bm$M&d@3z6i?eOv#csl!|W{f6jYx2!* zUmbdj-k*2JYS%I6B70=+g|D`7hVE_Vr_I)KX9~VR-482E+kkr)_!9yyu07Xk*OT{F z;JqVntQN4RT&XNA2Ij)! zWIx2{LvpXPHC<)J$RLUBVC;d)IwkrHa$WeWG?HOtun-A=`ag22( z>#3rXg<53a2GFl+d<%D7;r=`w86Jj5K<1|h7Rc*7(dnfg$*TZ|#w(QJR$DnL=NEnh z3}~ybc0Sn(p5Q;BFi!fF6mI9QMmvj4n7i>87G1+yzsPxAYYo%ies>CE58y*``j_r? zPWB;0e`<+$pA{X-`ri(({w@1u(tkN)o6eav`yg}f>4UT%ZO@lIXRng>b|4NJ!<@4| zKbBKI>5}k#fpLoN^8jm^TfrX(d_ndR(ItDqHX7Ibz((58=M27fdaL4-vmt%K@~37S zf-izMVms-p@1nc)6?;m@_fN)(um9Rr=`q?7+LblUO7tOLV^oZT+Kc0e=;guLR)bH@3}B32I>mwAcm($5VakqV?AZ?XVd_RGp}IBr z;0#l)+mOe6>we>oU?p%p^@aD)CcaDTQzyIv|J@{qb^Zpw!3vuax}P*z(>NZV*_8v# zoZlFbBlF?`N7@tdWq`KouEmDAEPv-n%8rzMCwO9A9_`W>kxSBt0QsaIl{#$j-~Y?r zyN6d*U3>p)?M=wu33n30O-aB@0&2A?5DR4|@e)8$0WXzS5@Px}ZB*SRI zsc@#?OIw`2Y26B=-V4(~)&Un^x}W|a{su<*%M;A*W@?rn*8|xm*Mk}OniW{A5NH4c0bS9fRvT;TxR(+ z+9V0nPBBb$E|h08F{mryfN|>-(glAWUr%G zqnnv4HOx`H|822}Z?0{p(~JyM=|7 zrrd5P&t50bZZ{A3eBXL!gm*jN{^ERVW~?k2*+aT8Znx?g7~ScXr(NX5Dy{8r@~+*l zy>k-sMKW?yFXW`&$Vq*Wlh{9R^$@CT~Cak3)t6JVD~RSxsjaBUC8%0Nao_NwHE1on7wo?xnW|Avw7>hAel7zvHN5$+P=)zSpxMP9wR(TX

    bhQgo~}%-5-$CtS{%!P)%I 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�Syxl%=~QjyZ8GG`otHhMh&^k@NB* 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Π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%0D$!FJB#@mwzfuFJB$r^64Ct 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
    R1J`hj0BD`WJE- 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
    m`b7MQ!)mi?tie9@GTsjhW<(+oi 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 DuBJo0?nar!R( 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

    5)s4 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%0DQvtWOwAJlF%%SoO?bepj0s-yD#B3Xut;?;#2pMg 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

    U4BI^snY4T^{{Ahy?}gPV%lZ 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

    $ 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 literal 0 HcmV?d00001 From 07c828cab04a05b7c76d86646e544c88998bb5f7 Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 10:10:59 -0400 Subject: [PATCH 33/33] fixerino --- src/ui/gen2/OptionsMenu.lua | 14 -------------- tests/crystal_import_test.lua | 12 +++++++----- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/ui/gen2/OptionsMenu.lua b/src/ui/gen2/OptionsMenu.lua index e21f2b8a..42218d21 100644 --- a/src/ui/gen2/OptionsMenu.lua +++ b/src/ui/gen2/OptionsMenu.lua @@ -204,20 +204,6 @@ local ROWS = { text = function(options) return require("src.render.GbcPalette").modeLabel(options.color or "gbc") end }, - { label = Strings.source("GBC FX"), key = "gbcfx", port = true, - cycle = function(options, delta) - local GBCFX = require("src.render.GBCFX") - if not GBCFX.isSupported() then - options.gbcfx = 0 - return - end - local level = ((options.gbcfx or 0) + delta) % 5 - options.gbcfx = level - GBCFX.setLevel(level) - end, - text = function(options) - return require("src.render.GBCFX").levelLabel(options.gbcfx or 0) - end }, -- SHADER FX reaches Gen 2 too, not just Gen 1. Same "activate" shape as -- CONTROLS/TOUCH LAYOUT below (a pushed screen, not a `cycle` ladder) -- -- ShaderFXScreen is the shared list screen both generations push, `id` diff --git a/tests/crystal_import_test.lua b/tests/crystal_import_test.lua index 915d732b..00d82379 100644 --- a/tests/crystal_import_test.lua +++ b/tests/crystal_import_test.lua @@ -147,9 +147,12 @@ eq(#unexplained, 0, -- ------- 7. the Crystal-only assets the completeness gate pins -local importerSource = assert(io.open("src/import/RomImporter.lua", "r")) -local importerText = importerSource:read("*a") -importerSource:close() +local CacheContract = require("src.import.CacheContract") +local requiredFiles, isOverride = CacheContract.requiredFilesFor("crystal") +check(isOverride, "crystal has its own required-file list") + +local required = {} +for _, path in ipairs(requiredFiles) do required[path] = true end for _, path in ipairs({ "assets/generated/title/crystal_logo.png", "assets/generated/title/crystal_wordmark.png", @@ -158,8 +161,7 @@ for _, path in ipairs({ "assets/generated/intro/chris.png", "assets/generated/intro/kris.png", }) do - check(importerText:find(path, 1, true) ~= nil, - "RomImporter still requires " .. path) + check(required[path], "the crystal cache contract still requires " .. path) end S.finish()

    R_Y9K1@T6 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�k)UMIu*)BiV`>+De{~WEHGzG+-oUmF$iUT< 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

UMghxt9ow?_(Q7$U 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 =*tj~4&59G9Z47QdY1ljR7JiL~4JoIst* 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�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