Files
gen1recomp/tests/engine/item_pickup_autoclose_bug2479.lua

84 lines
3.7 KiB
Lua

package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.modkit")
local Data = T.fixtures.fresh()
local OW = require("src.world.OverworldController")
local TB = require("src.render.TextBox")
local Sound = require("src.core.Sound")
local Version = require("src.core.GameVersion")
local function set(fn, name, value)
for i = 1, 100 do
local key = debug.getupvalue(fn, i)
if key == name then debug.setupvalue(fn, i, value) return end
if not key then error(name) end
end
end
local source = {playing = true, isPlaying = function(s) return s.playing end}
local played
set(OW.talkTo,"mapScripts",{talkScript=function() return nil end})
Sound.play = function(_, name) played = name return source end
Sound.waitFrames = function() return 600 end
Data.field.hiddenItems.FIX_TOWN = {{x=3,y=3,item="FIX_BALL"}}
for _, version in ipairs({"red", "yellow"}) do
Version.set(version)
for _, hidden in ipairs({false, true}) do
for _, full in ipairs({false, true}) do
local save = require("src.core.SaveData").newGame()
save.inventory = {}
if full then for i=1,20 do save.inventory["FILL"..i]=1 end end
local pressed = false
local game = {data=Data, save=save, input={wasPressed=function() return pressed end, isDown=function() return false end}}
game.stack = {push=function(s,b) s.box=b end, pop=function(s) s.box=nil end}
set(OW.tryHiddenObject,"Game",game)
set(OW.tryHiddenObject,"TextBox",TB)
local npc={id="pickup",def={item="FIX_BALL",text=99}}
local ow=setmetatable({map={id="FIX_TOWN"},npcs={npc},entities={npc}}, {__index=OW})
if hidden then ow:tryHiddenObject(3,3) else ow:talkTo(npc) end
local box=game.stack.box
T.check(box ~= nil,"pickup opens textbox")
box.done=true
source.playing=true
for _=1,10 do box:update() end
local label=version.."_"..(hidden and "hidden" or "ball")..(full and "_full" or "_success")
T.eq(game.stack.box,box,label.." held")
if full then
T.eq(save.inventory.FIX_BALL,nil,label.." no award")
T.check(box:arrowVisible(),label.." arrow")
T.check(hidden and not (save.hiddenTaken or {}).FIX_TOWN_3_3 or not hidden and #ow.npcs==1,label.." retained")
else
T.eq(save.inventory.FIX_BALL,1,label.." one award")
T.eq(played,hidden and "Get_Item2" or "Get_Item1",label.." sound")
T.check(not box:arrowVisible(),label.." no arrow")
source.playing=false
box:update()
T.eq(game.stack.box,nil,label.." autoclose")
T.check(hidden and save.hiddenTaken.FIX_TOWN_3_3 or not hidden and #ow.npcs==0,label.." consumed")
end
end
end
end
local opts=TB.soundOpts({data=Data},"Get_Item1")
T.eq(opts.auto.wait,true,"ordinary soundOpts preserves button wait")
-- pokered/engine/events/pick_up_item.asm
Data.items.SECRET_KEY = { name = "SECRET KEY", keyItem = true }
local keySave = require("src.core.SaveData").newGame()
keySave.inventory = {}
local keyGame = { data = Data, save = keySave,
input = { wasPressed = function() return false end,
isDown = function() return false end } }
keyGame.stack = { push = function(s, b) s.box = b end,
pop = function(s) s.box = nil end }
set(OW.talkTo,"Game",keyGame)
set(OW.talkTo,"TextBox",TB)
local keyNpc = { id = "secret-key", def = { item = "SECRET_KEY", text = 99 } }
local keyOw = setmetatable({ map = { id = "FIX_TOWN" }, npcs = { keyNpc },
entities = { keyNpc } }, { __index = OW })
Version.set("red")
played = nil
keyOw:talkTo(keyNpc)
local keyBox = keyGame.stack.box
T.check(keyBox ~= nil, "Secret Key item ball opens textbox")
keyBox.auto.sound()
T.eq(played, "Get_Item1", "Secret Key item ball uses ordinary item jingle")
T.finish("item_pickup_autoclose_bug2479")