From 6503e982db6a7765f9b9dd9abccbf6f2ce5d50fa Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 12:10:15 -0400 Subject: [PATCH 1/2] potential fix for shaders --- src/render/ShaderFX.lua | 16 +++++++++++++--- src/ui/ShaderFXScreen.lua | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/render/ShaderFX.lua b/src/render/ShaderFX.lua index 9d41b833..5862e66d 100644 --- a/src/render/ShaderFX.lua +++ b/src/render/ShaderFX.lua @@ -371,9 +371,13 @@ 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) + local okFfi, ffi = pcall(require, "ffi") + if not okFfi or type(ffi) ~= "table" then + return nil, "this build has no ffi, so presets cannot be converted here" + end + local ok, l, lerr = pcall(ensureLib) if not ok then return nil, "ffi.load failed: " .. tostring(l) end + if not l then return nil, tostring(lerr or libError or "librashader bridge not available") 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) @@ -780,7 +784,7 @@ 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) +local function doConvert(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 @@ -797,6 +801,12 @@ function ShaderFX.convert(entry, es) return true end +function ShaderFX.convert(entry, es) + local ok, res, err = pcall(doConvert, entry, es) + if not ok then return false, tostring(res) end + return res, err +end + -- Two independent slots. "shaderfx" stays main's option key, so existing -- saves keep meaning what they already meant. ShaderFX.SLOTS = { "main", "secondary" } diff --git a/src/ui/ShaderFXScreen.lua b/src/ui/ShaderFXScreen.lua index 8c7a1b75..9a4eb3c9 100644 --- a/src/ui/ShaderFXScreen.lua +++ b/src/ui/ShaderFXScreen.lua @@ -119,6 +119,7 @@ function ShaderFXScreen.new(game, slot) item.entry.name, tostring(err)) end applyRowState(item) + if not ok then item.right = Strings("FAILED") end return end From 4794ddcfdf0650bcc94457db66d63a52581753e7 Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Mon, 24 Aug 2026 12:35:35 -0400 Subject: [PATCH 2/2] chris (and all gen2) fix --- src/import/RomExtractorGen2.lua | 7 ++----- tools/make_gold_manifest.py | 3 +++ tools/rom_manifest_crystal.json | 4 ++++ tools/rom_manifest_gold.json | 4 ++++ tools/rom_manifest_silver.json | 4 ++++ 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/import/RomExtractorGen2.lua b/src/import/RomExtractorGen2.lua index 2e8aea2c..d9d61276 100644 --- a/src/import/RomExtractorGen2.lua +++ b/src/import/RomExtractorGen2.lua @@ -56,9 +56,6 @@ local MAP_GROUP_COUNT = 26 -- constants/map_constants.asm NUM_MAP_GROUPS -- "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 } -- A tileset sheet is 96 tiles (128x48 at 8x8), and its PalMap packs two -- 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. @@ -5716,8 +5713,8 @@ function RomExtractorGen2:extractMenuGfx() -- Four OAM tiles at $31 -- normal, statused, fainted, empty -- and OBJ -- colour 0 is transparent (engine/battle/trainer_huds.asm:47-99, :225-232). - local balls = self.symbols["LoadBallIconGFX.gfx"] or BALL_ICON_GFX - self:write2bpp(self.rom:bytes(balls[1], balls[2], 4 * 16), 32, 8, + local balls = self:symbol("LoadBallIconGFX.gfx") + self:write2bpp(self.rom:bytes(balls.bank, balls.address, 4 * 16), 32, 8, "battle/hud/balls.png", true) hud.balls = "assets/generated/battle/hud/balls.png" hud.ballsFirstTile = 0x31 diff --git a/tools/make_gold_manifest.py b/tools/make_gold_manifest.py index e9564f9e..0df9587f 100644 --- a/tools/make_gold_manifest.py +++ b/tools/make_gold_manifest.py @@ -778,6 +778,9 @@ REQUIRED_SYMBOLS = { # nine fill cells. "HP:" and the ten HP-bar cells come from # FontBattleExtra, which is already extracted. "EnemyHPBarBorderGFX", "HPExpBarBorderGFX", "ExpBarGFX", + # gfx/battle/balls.2bpp, the four party-ball OAM tiles + # (engine/battle/trainer_huds.asm LoadBallIconGFX). + "LoadBallIconGFX.gfx", # gfx/stats/stats_tiles.png + gfx/stats/pages.pal, StatsScreen_LoadFont # and _CGB_StatsScreenHPPals (#1558) "StatsScreenPageTilesGFX", "StatsScreenPagePals", diff --git a/tools/rom_manifest_crystal.json b/tools/rom_manifest_crystal.json index b4e7546c..8d45d7b8 100644 --- a/tools/rom_manifest_crystal.json +++ b/tools/rom_manifest_crystal.json @@ -17024,6 +17024,10 @@ 32, 21684 ], + "LoadBallIconGFX.gfx": [ + 11, + 16754 + ], "LoadOpponentTrainerAndPokemon.resample": [ 126, 16418 diff --git a/tools/rom_manifest_gold.json b/tools/rom_manifest_gold.json index e42afb81..597818e6 100644 --- a/tools/rom_manifest_gold.json +++ b/tools/rom_manifest_gold.json @@ -15084,6 +15084,10 @@ 64, 24169 ], + "LoadBallIconGFX.gfx": [ + 11, + 16804 + ], "LoadOrientedFrontpic": [ 20, 22948 diff --git a/tools/rom_manifest_silver.json b/tools/rom_manifest_silver.json index 789fb014..1e4f86ed 100644 --- a/tools/rom_manifest_silver.json +++ b/tools/rom_manifest_silver.json @@ -15084,6 +15084,10 @@ 64, 24169 ], + "LoadBallIconGFX.gfx": [ + 11, + 16804 + ], "LoadOrientedFrontpic": [ 20, 22948