Files
gen1recomp/tests/engine/game3_object_spawn_elevation_2737_test.lua
T

99 lines
4.1 KiB
Lua

-- pokeemerald/src/event_object_movement.c:7737, pokeemerald/src/event_object_movement.c:4931
package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.harness")
local check, eq = T.check, T.eq
love = love or require("tests.love_stub")
local GameVersion = require("src.core.GameVersion")
GameVersion.set("emerald")
local Collision = require("src.core.game3.collision")
local Objects = require("src.core.game3.objects")
local FieldView = require("src.core.game3.field_view")
local W, H = 19, 9
local elev = {}
for y = 0, H - 1 do
for x = 0, W - 1 do elev[y * W + x] = 3 end
end
elev[5 * W + 17] = 4
elev[5 * W + 2] = 15
elev[6 * W + 4] = 0
local layout = { width = W, height = H, pair = "spawn_elev_test" }
function layout:elevAt(x, y) return elev[y * W + x] end
function layout:collAt() return 0 end
function layout:midAt() return 0x200 end
function layout:collArray()
local c = {}
for i = 1, W * H do c[i] = 0 end
return c
end
local mapDef = { midLayout = layout, pair = layout.pair, warps = {} }
Collision.bindMap({ save = { position = {} } }, "SPAWN_ELEV_TEST", mapDef)
local defs = {
{ localId = 1, x = 17, y = 5, elevation = 3, graphicsId = 7, movementType = 0x0A },
{ localId = 2, x = 2, y = 5, elevation = 3, graphicsId = 7, movementType = 0x0A },
{ localId = 3, x = 4, y = 6, elevation = 3, graphicsId = 7, movementType = 0x0A },
}
local pool = Objects.spawnFromDefs(defs, mapDef, nil)
local stone, multi, trans = pool.byId[1], pool.byId[2], pool.byId[3]
check(stone and multi and trans, "objects spawned")
eq(stone.elevation, 3, "template elevation before first update")
local savedById, savedOrder, savedTracks = Objects._byId, Objects._order, Objects._tracks
Objects._byId, Objects._order, Objects._tracks = pool.byId, pool.order, {}
Objects.update({ save = { position = {} } })
eq(stone.elevation, 4, "spawn_elevation_follows_metatile")
eq(stone.currentElevation, 4, "spawn current elevation follows metatile")
eq(multi.elevation, 3, "multi-level tile keeps template elevation")
eq(trans.elevation, 3, "transition tile keeps previous elevation")
eq(trans.currentElevation, 0, "transition tile sets current elevation 0")
check(not stone.spawnElevation, "spawn update runs once")
local under, over = FieldView.applyDrawOrder({
{ kind = "npc", eventObject = stone, elevation = stone.elevation, y = 5 * 16 },
}, {}, {}, 0)
eq(#over, 1, "mr_stone_draws_over_bg1")
eq(#under, 0, "mr stone not under top layer")
local savedMapId, savedDefs = Objects._mapId, Objects._defs
Objects._mapId, Objects._defs = "SPAWN_ELEV_TEST", defs
local snap = Objects.snapshot()
eq(#snap.list, 0, "snapshot has no row for a spawn-resolved elevation")
Objects._mapId, Objects._defs = savedMapId, savedDefs
Objects._byId, Objects._order, Objects._tracks = savedById, savedOrder, savedTracks
local NW, NH = 5, 5
local nelev = {}
for y = 0, NH - 1 do
for x = 0, NW - 1 do nelev[y * NW + x] = 3 end
end
nelev[1 * NW + 1] = 4
local nlayout = { width = NW, height = NH, pair = "spawn_elev_neighbor" }
function nlayout:elevAt(x, y) return nelev[y * NW + x] end
function nlayout:collAt() return 0 end
function nlayout:midAt() return 0x200 end
function nlayout:collArray()
local c = {}
for i = 1, NW * NH do c[i] = 0 end
return c
end
local nmapDef = { midLayout = nlayout, pair = nlayout.pair, warps = {} }
local npool = Objects.spawnFromDefs({
{ localId = 1, x = 1, y = 1, elevation = 3, graphicsId = 7, movementType = 0x0A },
{ localId = 2, x = 3, y = 3, elevation = 3, graphicsId = 7, movementType = 0x0A },
}, nmapDef, nil)
local raised, flat = npool.byId[1], npool.byId[2]
eq(raised.elevation, 3, "neighbor template elevation before first tick")
eq(layout:elevAt(1, 1), 3, "active map cell under the neighbor NPC is elevation 3")
Objects.tickPool(npool, { save = { position = {} } }, nil)
eq(raised.elevation, 4, "neighbor_pool_spawn_elevation_follows_own_metatile")
eq(raised.currentElevation, 4, "neighbor pool current elevation follows own metatile")
eq(flat.elevation, 3, "neighbor pool flat tile keeps template elevation")
check(not raised.spawnElevation, "neighbor pool spawn update runs once")
GameVersion.set("firered")
T.finish("game3_object_spawn_elevation_2737_test")