Files
gen1recomp/tests/game3_hidden_item_persistence_test.lua

73 lines
3.3 KiB
Lua

package.path = "./?.lua;./?/init.lua;" .. package.path
require("src.core.GameVersion").set("firered")
local Game3Cache = require("tests.game3_cache")
if not Game3Cache.bundle() then print("[skip] hidden_item_persistence: " .. tostring(Game3Cache.reason)) return end
local Field = require("src.core.game3.field")
local Flags = require("src.core.game3.scripting.flags")
local Space = require("src.core.game3.scripting.space")
local Runtime = require("src.core.game3.runtime")
local Bag = require("src.core.game3.bag")
local Items = require("src.core.game3.items")
local Message = require("src.ui.game3.message")
local Hud = require("src.ui.game3.hud")
local Start = require("src.ui.game3.start_menu")
local Schema = require("src.core.game3.save_schema_firered")
local SaveData = require("src.core.SaveData")
local hidden = { type = "hidden_item", x = 28, y = 57, flag = 0x3E9, item = 14, quantity = 1 }
local s = Schema.newGame({ name = "RED" })
s.map, s.x, s.y, s.playerX, s.playerY = "FR_VIRIDIAN_FOREST", 28, 58, 28, 58
local game = { session = s, data = { maps = { [s.map] = { bgEvents = { hidden } } } } }
Field._game, Field._session, Runtime._game, Runtime.session = game, s, game, s
Space.store = Flags.newStore()
Flags.setVar(Space.store, nil, 0x4070, 1)
Space.persistSession(nil, game)
s.bag = Bag.new()
assert(Field.pickUpHiddenItem(game, hidden))
Message.close()
assert(Flags.getFlag(Space.store, nil, hidden.flag), "pickup must mark the live store")
assert(Flags.getFlag(s, nil, hidden.flag), "pickup must persist the session snapshot")
for _ = 1, 3 do
Hud.openStartMenu(game, s)
assert(Start.isOpen())
Start.close(true)
assert(not Field.hiddenItemAt(game, 28, 57, 0))
assert(not Field.pickUpHiddenItem(game, hidden))
assert(Bag.get(s.bag, 14) == 1)
assert(not Field.useItemfinder(s, false))
end
print("PASS hidden_pickup_survives_start_menu")
s.flags = {}
assert(not Field.hiddenItemAt(game, 28, 57, 0))
assert(not Field.useItemfinder(s, false), "Itemfinder must prefer live flags over stale snapshots")
Space.persistSession(nil, game)
local restored = Schema.fromSaveTable(SaveData.decode(SaveData.encode(Schema.toSaveTable(s))))
assert(Flags.getFlag(restored, nil, hidden.flag))
assert(Bag.get(restored.bag, 14) == 1)
print("PASS hidden_itemfinder_and_save_roundtrip")
Flags.setFlag(Space.store, nil, hidden.flag, false)
Space.persistSession(nil, game)
s.bag = Bag.new()
assert(Bag.add(s.bag, 14, Items.GAME3_MAX_QTY))
assert(Field.pickUpHiddenItem(game, hidden))
Message.close()
assert(not Flags.getFlag(Space.store, nil, hidden.flag))
assert(not Flags.getFlag(s, nil, hidden.flag))
assert(Field.hiddenItemAt(game, 28, 57, 0) == hidden)
assert(Field.useItemfinder(s, false))
assert(Bag.remove(s.bag, 14, Items.GAME3_MAX_QTY))
assert(Field.pickUpHiddenItem(game, hidden))
Message.close()
assert(Bag.get(s.bag, 14) == 1)
assert(Flags.getFlag(Space.store, nil, hidden.flag))
print("PASS hidden_full_bag_does_not_consume")
local isolated = { map = s.map, flags = {}, bag = Bag.new(), x = 28, y = 58 }
Field._session = isolated
assert(Field.hiddenItemAt(game, 28, 57, 0) == hidden)
assert(Field.useItemfinder(isolated, false))
assert(Field.pickUpHiddenItem(game, hidden))
Message.close()
assert(Flags.getFlag(isolated, nil, hidden.flag))
assert(Bag.get(isolated.bag, 14) == 1)
assert(Bag.get(s.bag, 14) == 1)
print("PASS hidden_isolated_session_fallback")