mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-14 01:11:07 +02:00
61 lines
2.4 KiB
Lua
61 lines
2.4 KiB
Lua
-- The line the game itself prints, with the engine's wording as backup.
|
|
--
|
|
-- pokered prints most of what the player reads -- battle messages, item
|
|
-- results, field prompts -- and the importer extracts every one of those
|
|
-- labels. Writing the sentence again in Lua meant the screen showed a
|
|
-- near-miss of the game's own wording while the cache held the real line,
|
|
-- and on a localized import it showed English over translated data.
|
|
--
|
|
-- Callers pass the pokered label plus the literal they used to print, so
|
|
-- the literal stays catalog-backed (Strings) for a cache built before the
|
|
-- label, for a total conversion that dropped it, and for the pure-module
|
|
-- tests that run without a dataset.
|
|
--
|
|
-- The slots the extracted text carries ({USER}, {TARGET}, the {RAM:...}
|
|
-- buffers) are NOT in the token registry TextBox.substitute serves -- that
|
|
-- one only resolves {PLAYER}, {RIVAL} and three string buffers -- so they
|
|
-- are filled here, in argument order, before the box ever sees the string.
|
|
--
|
|
-- {PLAYER}/{RIVAL} are the two the registry CAN fill later, so they are
|
|
-- only consumed here when the caller clearly supplies them: an argument
|
|
-- count matching every slot. Matching just the other slots leaves those
|
|
-- two alone for that pass. Anything else means the extracted line cannot
|
|
-- carry what the call has to say -- a few labels stop at a dynamic marker
|
|
-- the decoder does not follow, e.g. _EnemysWeakText extracts as "The
|
|
-- enemy's weak!\nGet'm! " with nowhere to put the name -- so the engine's
|
|
-- own wording stands in rather than printing a sentence with a hole in it.
|
|
|
|
local Strings = require("src.core.Strings")
|
|
|
|
return function(data, label, fallback, ...)
|
|
local text = data and data.text and data.text[label]
|
|
if not text then return Strings(fallback, ...) end
|
|
local args = { ... }
|
|
if #args == 0 then return text end
|
|
|
|
local slots, named = 0, 0
|
|
for token in text:gmatch("%b{}") do
|
|
slots = slots + 1
|
|
if token == "{PLAYER}" or token == "{RIVAL}" then named = named + 1 end
|
|
end
|
|
local fillNamed
|
|
if #args == slots then
|
|
fillNamed = true
|
|
elseif #args == slots - named then
|
|
fillNamed = false
|
|
else
|
|
return Strings(fallback, ...)
|
|
end
|
|
|
|
local index = 0
|
|
return (text:gsub("%b{}", function(token)
|
|
if not fillNamed and (token == "{PLAYER}" or token == "{RIVAL}") then
|
|
return token
|
|
end
|
|
index = index + 1
|
|
local value = args[index]
|
|
if value == nil then return token end
|
|
return tostring(value)
|
|
end))
|
|
end
|