mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-29 15:08:50 -04:00
146 lines
5.4 KiB
Lua
146 lines
5.4 KiB
Lua
local U = require("tests.drivers.util")
|
|
local F = require("tests.drivers.em_fc_util").new("em_berry_tree")
|
|
|
|
return function(game)
|
|
if not F.boot(game) then return F.finish() end
|
|
F.givePartyAndRepel()
|
|
local Objects = require("src.core.game3.objects")
|
|
local BerryTrees = require("src.core.game3.rse.berry_trees")
|
|
local Rtc = require("src.core.game3.rtc")
|
|
local TimeEvents = require("src.core.game3.time_events")
|
|
local Runtime = require("src.core.game3.runtime")
|
|
local Space = require("src.core.game3.scripting.space")
|
|
local Message = require("src.ui.game3.message")
|
|
local Player = require("src.core.game3.player")
|
|
local Collision = require("src.core.game3.collision")
|
|
local Bag = require("src.core.game3.bag")
|
|
local Rse = require("src.core.game3.rse.init")
|
|
local C = require("src.core.game3.constants").of("emerald")
|
|
local session = Runtime.getSession()
|
|
|
|
Rtc.setFixed("2005-06-01T09:30:00")
|
|
TimeEvents.init(session)
|
|
F.check(F.flags().get("FLAG_SYS_CLOCK_SET"), "clock set so time-based events run")
|
|
|
|
local planted = 0
|
|
for i = 0, BerryTrees.COUNT - 1 do
|
|
local t = BerryTrees.peek(session, i)
|
|
if t and t.stage == BerryTrees.STAGE_BERRIES then planted = planted + 1 end
|
|
end
|
|
F.check(planted >= 8, "new game plants the fixed berry trees (" .. planted .. ")")
|
|
|
|
F.check(F.goTo(game, "EM_ROUTE104", 10, 10, "down"), "Route 104 loads")
|
|
local tree
|
|
for _, lid in ipairs(Objects._order) do
|
|
local eo = Objects._byId[lid]
|
|
local t = eo and eo.berryTree and BerryTrees.peek(session, eo.berryTree.id)
|
|
if t and t.stage == BerryTrees.STAGE_BERRIES and not tree then
|
|
local bx, by = eo.cellX, eo.cellY + 1
|
|
if Collision.isWalkable(bx, by) then tree = eo end
|
|
end
|
|
end
|
|
if not F.check(tree ~= nil, "found a fruiting berry tree with a walkable cell below") then return F.finish() end
|
|
local id = tree.berryTree.id
|
|
local lid = tree.localId
|
|
F.goTo(game, "EM_ROUTE104", tree.cellX, tree.cellY + 1, "up")
|
|
tree = Objects.find(lid)
|
|
U.wait(4)
|
|
F.check(tree.berryTree.visible and tree.berryTree.tree ~= nil, "berry tree draws its berry-stage sprite")
|
|
F.check(tree.invisible == true, "the tree object hides its OW sprite (drawn from the berry tree sheet)")
|
|
F.shot(game, "01_tree_with_berries.png", true)
|
|
|
|
local function waitPrompt(frames)
|
|
for _ = 1, frames or 300 do
|
|
if Message.isOpen and Message.isOpen() then return true end
|
|
if not (Space.vm and Space.vm:isRunning()) then return false end
|
|
U.wait(1)
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function talkThrough(taps)
|
|
for _ = 1, taps or 40 do
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
if not (Space.vm and Space.vm:isRunning()) then return true end
|
|
end
|
|
return not (Space.vm and Space.vm:isRunning())
|
|
end
|
|
|
|
local berryItem = BerryTrees.berryToItem(BerryTrees.peek(session, id).berry)
|
|
local before = Bag.get(session.bag, berryItem)
|
|
U.tap(game, "a")
|
|
waitPrompt()
|
|
F.check(Space.vm:isRunning(), "A on the tree runs BerryTreeScript")
|
|
F.shot(game, "02_want_to_pick.png", true)
|
|
talkThrough(60)
|
|
F.settle(game)
|
|
local after = Bag.get(session.bag, berryItem)
|
|
F.check(after > before, "picking adds berries to the bag (" .. before .. " -> " .. after .. ")")
|
|
F.check(BerryTrees.peek(session, id).stage == 0, "the picked tree is removed to soft soil")
|
|
U.wait(4)
|
|
F.check(not tree.berryTree.visible, "empty soil draws no tree")
|
|
|
|
Bag.add(session.bag, C:require("items", "ITEM_CHERI_BERRY"), 3)
|
|
Bag.add(session.bag, C:require("items", "ITEM_WAILMER_PAIL"), 1)
|
|
local BagMenu = require("src.ui.game3.bag_menu")
|
|
local bagShown = false
|
|
U.tap(game, "a")
|
|
waitPrompt()
|
|
for _ = 1, 600 do
|
|
if BagMenu.open and BagMenu._location == "berry_tree" then
|
|
if not bagShown then
|
|
bagShown = true
|
|
U.wait(30)
|
|
F.shot(game, "02b_choose_berry.png", true)
|
|
end
|
|
U.tap(game, "a")
|
|
U.wait(4)
|
|
elseif not Space.vm:isRunning() then
|
|
break
|
|
else
|
|
U.tap(game, "a")
|
|
U.wait(4)
|
|
end
|
|
end
|
|
F.check(bagShown, "Bag_ChooseBerry opens the bag on the BERRIES pocket")
|
|
F.settle(game)
|
|
local t = BerryTrees.peek(session, id)
|
|
F.check(t and t.stage == BerryTrees.STAGE_PLANTED and t.berry == 1, "a Cheri berry is planted (stage 1)")
|
|
U.wait(4)
|
|
F.shot(game, "03_planted.png", true)
|
|
|
|
U.tap(game, "a")
|
|
waitPrompt()
|
|
local watered = false
|
|
for _ = 1, 80 do
|
|
U.tap(game, "a")
|
|
U.wait(6)
|
|
if Player.watering then watered = true end
|
|
if not (Space.vm and Space.vm:isRunning()) then break end
|
|
end
|
|
F.settle(game)
|
|
F.check(watered, "the Wailmer Pail watering anim plays")
|
|
F.check(BerryTrees.peek(session, id).watered1, "watering marks stage 1 watered")
|
|
|
|
local stages = {}
|
|
for stage = 2, 5 do
|
|
Rtc.advance(3 * 60)
|
|
TimeEvents.run(session)
|
|
U.wait(2)
|
|
local sparkled = false
|
|
for _ = 1, 140 do
|
|
if tree.berryTree.func == "sparkle" then sparkled = true end
|
|
if sparkled and tree.berryTree.func == "normal" then break end
|
|
U.wait(1)
|
|
end
|
|
stages[#stages + 1] = BerryTrees.peek(session, id).stage
|
|
F.check(BerryTrees.peek(session, id).stage == stage, "three hours later the tree reaches stage " .. stage)
|
|
F.check(sparkled, "stage " .. stage .. " growth sparkles")
|
|
F.shot(game, string.format("%02d_stage_%d.png", 2 + stage, stage), true)
|
|
end
|
|
F.check(BerryTrees.peek(session, id).berryYield >= 2, "a watered Cheri tree yields berries ("
|
|
.. tostring(BerryTrees.peek(session, id).berryYield) .. ")")
|
|
F.finish()
|
|
end
|