mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
123feef3a1
CLOSES #2425, CLOSES #2428, CLOSES #2431, CLOSES #2432, CLOSES #2433, CLOSES #2435, CLOSES #2436, CLOSES #2437, CLOSES #2440
212 lines
7.5 KiB
Lua
212 lines
7.5 KiB
Lua
local U = require("tests.drivers.util")
|
|
local DIR = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/game3_item_pc_screens"
|
|
|
|
local ITEM_POTION = 13
|
|
local ITEM_ANTIDOTE = 14
|
|
local ITEM_BURN_HEAL = 15
|
|
local ITEM_ICE_HEAL = 16
|
|
local ITEM_ESCAPE_ROPE = 85
|
|
local ITEM_REPEL = 86
|
|
local ITEM_TM01 = 289
|
|
|
|
local failures = 0
|
|
local function result(ok, label)
|
|
print((ok and "PASS " or "FAIL ") .. label)
|
|
if not ok then failures = failures + 1 end
|
|
return ok
|
|
end
|
|
|
|
local function finish()
|
|
if failures == 0 then
|
|
print("PASS item_pc_screens")
|
|
love.event.quit(0)
|
|
else
|
|
print("FAIL item_pc_screens failures=" .. failures)
|
|
love.event.quit(1)
|
|
end
|
|
end
|
|
|
|
local function waitFor(pred, n)
|
|
for _ = 1, n do
|
|
if pred() then return true end
|
|
U.wait(1)
|
|
end
|
|
return pred()
|
|
end
|
|
|
|
return function(game)
|
|
for _ = 1, 900 do
|
|
if game.phase == "boot" and game.boot then break end
|
|
U.wait(1)
|
|
end
|
|
game:_handleBootAction({ action = "new_game", name = "RED" })
|
|
U.wait(240)
|
|
|
|
local Runtime = require("src.core.game3.runtime")
|
|
local Bag = require("src.core.game3.bag")
|
|
local Storage = require("src.core.game3.storage")
|
|
local PcMenu = require("src.ui.game3.pc_menu")
|
|
local ItemPc = require("src.ui.game3.item_pc")
|
|
local BagMenu = require("src.ui.game3.bag_menu")
|
|
|
|
local session = Runtime.getSession()
|
|
if not result(session ~= nil, "new game reached the game3 field") then return finish() end
|
|
local st = Storage.ensure(session)
|
|
st.items = {
|
|
{ id = ITEM_POTION, qty = 1 },
|
|
{ id = ITEM_REPEL, qty = 5 },
|
|
{ id = ITEM_ANTIDOTE, qty = 2 },
|
|
{ id = ITEM_BURN_HEAL, qty = 1 },
|
|
{ id = ITEM_ICE_HEAL, qty = 3 },
|
|
{ id = ITEM_ESCAPE_ROPE, qty = 1 },
|
|
{ id = ITEM_TM01, qty = 1 },
|
|
}
|
|
Bag.add(session.bag, ITEM_POTION, 3)
|
|
Bag.add(session.bag, ITEM_REPEL, 1)
|
|
|
|
PcMenu.show({ session = session, startMode = "player_pc" })
|
|
U.wait(10)
|
|
U.tap(game, "a")
|
|
U.wait(10)
|
|
result(PcMenu.mode == "item_storage", "ITEM STORAGE opened")
|
|
U.tap(game, "a")
|
|
local opened = waitFor(function() return ItemPc.isOpen() and not ItemPc._fx end, 120)
|
|
-- pokefirered/src/player_pc.c:378
|
|
result(opened, "WITHDRAW ITEM opened the full-screen item PC")
|
|
U.wait(10)
|
|
U.shot(game, DIR .. "/item_pc_withdraw_list.png")
|
|
|
|
for _ = 1, 6 do U.tap(game, "down"); U.wait(4) end
|
|
result(ItemPc.scroll == 2 and ItemPc.row == 4, "list scrolls like ListMenu (scroll=" .. ItemPc.scroll .. " row=" .. ItemPc.row .. ")")
|
|
U.wait(10)
|
|
U.shot(game, DIR .. "/item_pc_withdraw_scrolled_tm.png")
|
|
for _ = 1, 6 do U.tap(game, "up"); U.wait(4) end
|
|
U.tap(game, "down")
|
|
U.wait(4)
|
|
|
|
U.tap(game, "select")
|
|
U.wait(6)
|
|
result(ItemPc.mode == "move" and ItemPc.moveOrig == 1, "SELECT starts move mode on REPEL")
|
|
U.tap(game, "down")
|
|
U.wait(4)
|
|
U.tap(game, "down")
|
|
U.wait(6)
|
|
U.shot(game, DIR .. "/item_pc_move_mode.png")
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(st.items[2].id == ITEM_ANTIDOTE and st.items[3].id == ITEM_REPEL, "REPEL moved below ANTIDOTE")
|
|
result(ItemPc.mode == "list" and ItemPc.scroll + ItemPc.row == 2, "cursor stays on REPEL")
|
|
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(ItemPc.mode == "submenu", "A opens the WITHDRAW / GIVE / CANCEL menu")
|
|
U.shot(game, DIR .. "/item_pc_submenu.png")
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(ItemPc.mode == "qty" and ItemPc.qty == 1, "WITHDRAW asks how many")
|
|
U.tap(game, "up")
|
|
U.wait(4)
|
|
U.tap(game, "up")
|
|
U.wait(6)
|
|
result(ItemPc.qty == 3, "quantity went to 3")
|
|
U.shot(game, DIR .. "/item_pc_withdraw_how_many.png")
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(ItemPc.mode == "result" and tostring(ItemPc.resultText):find("Withdrew", 1, true) ~= nil,
|
|
"gText_WithdrewQuantItem: " .. tostring(ItemPc.resultText))
|
|
U.shot(game, DIR .. "/item_pc_withdrew.png")
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(st.items[3].id == ITEM_REPEL and st.items[3].qty == 2 and Bag.get(session.bag, ITEM_REPEL) == 4,
|
|
"3 REPEL moved from the PC to the bag")
|
|
result(ItemPc.mode == "list", "back on the item list")
|
|
|
|
local PartyMenu = require("src.ui.game3.party_menu")
|
|
session.party = {}
|
|
require("src.core.game3.party").giveMon(session, 6, 36)
|
|
session.party[1].item = ITEM_REPEL
|
|
session.party[1].heldItem = ITEM_REPEL
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
U.tap(game, "down")
|
|
U.wait(4)
|
|
U.tap(game, "a")
|
|
local partyOpen = waitFor(function() return PartyMenu.isOpen() and PartyMenu.mode == "give" end, 120)
|
|
result(partyOpen and st.items[3].qty == 2 and Bag.get(session.bag, ITEM_REPEL) == 4,
|
|
"GIVE opens the party menu without touching the PC or bag")
|
|
U.wait(20)
|
|
U.tap(game, "a")
|
|
U.wait(10)
|
|
if PartyMenu.mode == "message" then
|
|
U.shot(game, DIR .. "/item_pc_give_already_holding.png")
|
|
U.tap(game, "a")
|
|
U.wait(10)
|
|
end
|
|
-- pokefirered/src/party_menu.c:5468
|
|
result(PartyMenu.mode == "yesno", "mon already holding REPEL asks to switch")
|
|
U.shot(game, DIR .. "/item_pc_give_switch_yesno.png")
|
|
U.tap(game, "a")
|
|
U.wait(10)
|
|
result(PartyMenu.mode == "message", "Yes shows gText_SwitchedPkmnItem: " .. tostring(PartyMenu._messageText))
|
|
U.shot(game, DIR .. "/item_pc_give_switched.png")
|
|
U.tap(game, "a")
|
|
local back = waitFor(function() return not PartyMenu.isOpen() and ItemPc.mode == "list" end, 120)
|
|
-- pokefirered/src/party_menu.c:5563
|
|
result(back and st.items[3].id == ITEM_REPEL and st.items[3].qty == 1 and Bag.get(session.bag, ITEM_REPEL) == 5
|
|
and session.party[1].item == ITEM_REPEL, "switch from the PC: PC REPEL -1, bag REPEL +1")
|
|
U.wait(10)
|
|
|
|
U.tap(game, "b")
|
|
local closed = waitFor(function() return not ItemPc.isOpen() end, 120)
|
|
U.wait(10)
|
|
result(closed and PcMenu.mode == "item_storage" and PcMenu.cursor == 1,
|
|
"B turns the item PC off and returns to ITEM STORAGE")
|
|
|
|
U.tap(game, "down")
|
|
U.wait(6)
|
|
U.tap(game, "a")
|
|
local bagOpen = waitFor(function() return BagMenu.isOpen() and not BagMenu._open end, 120)
|
|
-- pokefirered/src/player_pc.c:324
|
|
result(bagOpen and BagMenu._location == "itempc" and BagMenu.currentPocket() == "ITEMS",
|
|
"DEPOSIT ITEM opened the bag on the ITEMS pocket")
|
|
U.wait(10)
|
|
U.shot(game, DIR .. "/item_pc_deposit_bag.png")
|
|
U.tap(game, "right")
|
|
U.wait(20)
|
|
result(BagMenu.currentPocket() == "ITEMS", "no pocket switching in the deposit bag")
|
|
local potionRow
|
|
for i, r in ipairs(BagMenu.list()) do
|
|
if r.id == ITEM_POTION or tonumber(r.id) == ITEM_POTION then potionRow = i end
|
|
end
|
|
for _ = 1, 10 do
|
|
if BagMenu.cursor == potionRow then break end
|
|
U.tap(game, BagMenu.cursor < (potionRow or 1) and "down" or "up")
|
|
U.wait(6)
|
|
end
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(BagMenu.mode == "deposit", "POTION x3 asks how many to deposit")
|
|
U.tap(game, "up")
|
|
U.wait(6)
|
|
U.shot(game, DIR .. "/item_pc_deposit_how_many.png")
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(BagMenu.mode == "deposit_done" and tostring(BagMenu._depositText):find("Deposited", 1, true) ~= nil,
|
|
"gText_DepositedStrVar2StrVar1s: " .. tostring(BagMenu._depositText))
|
|
-- pokefirered/src/item_menu.c:1569
|
|
result(Bag.get(session.bag, ITEM_POTION) == 3 and st.items[1].qty == 3 and BagMenu.list()[BagMenu.cursor].id == ITEM_POTION,
|
|
"bag keeps POTION x3 under the Deposited box")
|
|
U.shot(game, DIR .. "/item_pc_deposited.png")
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
result(Bag.get(session.bag, ITEM_POTION) == 1 and st.items[1].qty == 3, "2 POTION moved from the bag to the PC")
|
|
U.tap(game, "b")
|
|
local bagClosed = waitFor(function() return not BagMenu.isOpen() end, 120)
|
|
U.wait(10)
|
|
result(bagClosed and PcMenu.mode == "item_storage" and PcMenu.cursor == 2,
|
|
"closing the deposit bag returns to ITEM STORAGE on DEPOSIT")
|
|
PcMenu.close()
|
|
U.wait(10)
|
|
finish()
|
|
end
|