mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-26 07:21:22 +02:00
Merge pull request #1734 from BoLayerDev/feature/mew-dock-occupancy-seam
Add composable map occupancy and active-block APIs
This commit is contained in:
@@ -118,6 +118,47 @@ function WorldAPI:current()
|
||||
facing = p and p.facing }
|
||||
end
|
||||
|
||||
local function validBlockCoordinate(value)
|
||||
return type(value) == "number" and value == value
|
||||
and value ~= math.huge and value ~= -math.huge
|
||||
and value == math.floor(value)
|
||||
end
|
||||
|
||||
-- Read one block from the active Gen 1 map without exposing the mutable block
|
||||
-- array. Requiring the expected map id makes a stale signature fail closed
|
||||
-- if a warp or reload moved the player before the caller completed its check.
|
||||
-- Block coordinates are zero-based, matching replaceBlock.
|
||||
function WorldAPI:activeBlockAt(mapId, bx, by)
|
||||
local ow = self:overworld()
|
||||
if not ow or not ow.map then return nil, NO_OVERWORLD end
|
||||
local map = ow.map
|
||||
if map.id ~= mapId then return nil, "map is not active" end
|
||||
if not validBlockCoordinate(bx) or not validBlockCoordinate(by) then
|
||||
return nil, "invalid block coordinates"
|
||||
end
|
||||
local def = map.def
|
||||
if not def or not validBlockCoordinate(def.width) or def.width <= 0
|
||||
or not validBlockCoordinate(def.height) or def.height <= 0 then
|
||||
return nil, "block unavailable"
|
||||
end
|
||||
if bx < 0 or by < 0 or bx >= def.width or by >= def.height then
|
||||
return nil, "block coordinates out of bounds"
|
||||
end
|
||||
if type(def.blocks) ~= "table" or type(map.blockAt) ~= "function" then
|
||||
return nil, "block unavailable"
|
||||
end
|
||||
local stored = def.blocks[by * def.width + bx + 1]
|
||||
if not validBlockCoordinate(stored) or stored < 0 then
|
||||
return nil, "block unavailable"
|
||||
end
|
||||
local ok, blockId = pcall(map.blockAt, map, bx, by)
|
||||
if not ok or not validBlockCoordinate(blockId) or blockId < 0
|
||||
or blockId ~= stored then
|
||||
return nil, "block unavailable"
|
||||
end
|
||||
return blockId
|
||||
end
|
||||
|
||||
-- Companion UIs may offer party ordering while the player is in free roam.
|
||||
-- The same guard that makes opening a menu safe keeps scripts, transitions,
|
||||
-- movement and screens above the overworld from observing a mid-action swap.
|
||||
|
||||
Reference in New Issue
Block a user