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")