Files
gen1recomp/tests/engine/vitamin_rose_text_sfx_bug2332.lua

174 lines
5.2 KiB
Lua

-- engine/items/item_effects.asm:1310-1317
-- data/text/text_6.asm:71-77
package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.harness")
local check, eq, same = T.check, T.eq, T.same
love = love or require("tests.love_stub")
local game
local played = {}
package.loaded["src.core.Sound"] = {
play = function(_, name)
local boxes = 0
if game then
for _, s in ipairs(game.stack.states) do
if type(s) == "table" and s.textBox then boxes = boxes + 1 end
end
end
played[#played + 1] = { name = name, boxes = boxes }
end,
playCry = function() end,
}
local jingles = {}
package.loaded["src.render.TextBox"] = {
new = function(_, text, done, opts)
return { textBox = true, text = text, done = done, opts = opts }
end,
strip = function(text)
if type(text) ~= "string" then return text end
return (text:gsub("{DONE}", ""):gsub("{PROMPT}", ""))
end,
soundOpts = function(_, sound, opts)
jingles[#jingles + 1] = sound
opts = opts or {}
opts.auto = { sound = sound, wait = true }
return opts
end,
}
package.loaded["src.inventory.ItemEffects"] = nil
package.loaded["src.ui.BagMenu"] = nil
package.loaded["src.ui.PartyMenu"] = nil
local ItemEffects = require("src.inventory.ItemEffects")
local BagMenu = require("src.ui.BagMenu")
local PartyMenu = require("src.ui.PartyMenu")
require("src.ui.Screens").invalidate()
local Fixtures = require("tests.modkit.fixtures")
local Bag = require("src.inventory.Bag")
local Pokemon = require("src.pokemon.Pokemon")
local SaveData = require("src.core.SaveData")
local Data = Fixtures.fresh()
local VITAMIN_NAMES = {
HP_UP = "HP UP", PROTEIN = "PROTEIN", IRON = "IRON",
CARBOS = "CARBOS", CALCIUM = "CALCIUM",
}
local idx = 200
for id, name in pairs(VITAMIN_NAMES) do
idx = idx + 1
Data.items[id] = { id = id, index = idx, name = name, price = 9800,
tossable = true }
end
local function heard(name)
for _, p in ipairs(played) do
if p.name == name then return p end
end
return nil
end
local function gengar()
local mon = Pokemon.new(Data, "FIXMON_A", 20)
mon.nickname = "GENGAR"
return mon
end
do
local save = SaveData.newGame()
for id, stat in pairs({ HP_UP = "HEALTH", PROTEIN = "ATTACK",
IRON = "DEFENSE", CARBOS = "SPEED",
CALCIUM = "SPECIAL" }) do
played = {}
local result, msgs, extra = ItemEffects.use(Data, save, id, gengar())
eq(result, "consumed", id .. " is consumed")
eq(msgs and msgs[1], "GENGAR's\n" .. stat .. " rose.",
id .. " prints VitaminStatRoseText's layout")
check(not (extra and extra.useJingle),
id .. " does not defer Heal_Ailment to the end of the text")
check(heard("Heal_Ailment") ~= nil,
id .. " plays Heal_Ailment itself, before PrintText")
end
end
do
local mon = gengar()
mon.statExp = { special = 25600 }
played = {}
local result = ItemEffects.use(Data, SaveData.newGame(), "CALCIUM", mon)
eq(result, "failed", "a maxed stat is refused")
eq(heard("Heal_Ailment"), nil, "and the refusal plays no Heal_Ailment")
end
local function freshGame()
local mon = gengar()
local g = {
data = Data,
save = {
party = { mon },
player = { name = "RED", id = 1 },
inventory = {},
options = {},
flags = {},
money = 0,
},
}
g.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,
}
g.input = { pressed = nil }
function g.input:wasPressed(b) return self.pressed == b end
Bag.add(g.save, "CALCIUM", 2)
return g, mon
end
do
local mon
game, mon = freshGame()
played, jingles = {}, {}
local list = BagMenu.new(game, {})
game.stack:push(list)
local row
for i, r in ipairs(list.items) do
if r.value == "CALCIUM" then row = i end
end
if check(row ~= nil, "CALCIUM is in the bag") then
list.index = row
list.onChoose(list.items[row], list)
local sub = game.stack:top()
if sub and sub.items and sub.items[1] and sub.items[1].onSelect then
game.stack:pop()
sub.items[1].onSelect()
end
local picker = game.stack:top()
if check(getmetatable(picker) == PartyMenu, "the party picker opened") then
game.input.pressed = "a"
picker:update(1 / 60)
game.input.pressed = nil
eq(mon.statExp.special, 2560, "CALCIUM raised SPECIAL stat exp")
local p = heard("Heal_Ailment")
if check(p ~= nil, "Heal_Ailment played through the bag flow") then
eq(p.boxes, 0, "before the rose box was pushed")
end
same(jingles, {}, "no end-of-text jingle is armed on the rose box")
local box = game.stack:top()
if check(type(box) == "table" and box.textBox, "the rose line prints") then
eq(box.text, "GENGAR's\nSPECIAL rose.", "with the cart's line break")
eq(box.opts, nil, "as a plain prompt box")
end
local partyUp = false
for _, s in ipairs(game.stack.states) do
if getmetatable(s) == PartyMenu then partyUp = true end
end
check(partyUp, "the party menu stays drawn under the message")
end
end
game = nil
end
T.finish()