feat(maps): set_cell_material / get_cell_material public APIs
Mirrors the existing set_vertex / get_vertex pattern. Bounds and unknown-layer guards raise the same shape of error as the v3 write-API family. Lazy-allocates layer.cells_material on first write so maps that never use cell-tile painting stay byte-clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
36
init.lua
36
init.lua
@@ -1583,6 +1583,42 @@ function M.get_vertex(layer_name, vx, vy, map_id)
|
|||||||
return v == 1 or v == true
|
return v == 1 or v == true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- 0.5.7: set/clear the per-cell material flag at (cx, cy) on the named
|
||||||
|
-- layer. painted: bool. Lazy-allocates layer.cells_material on first
|
||||||
|
-- write. Out-of-bounds raises a bounds error. Unknown layer raises a
|
||||||
|
-- layer-not-found error.
|
||||||
|
function M.set_cell_material(layer_name, cx, cy, painted, map_id)
|
||||||
|
local m = require_map(map_id)
|
||||||
|
local layer = m.layers[layer_name]
|
||||||
|
if not layer then
|
||||||
|
error(string.format("maps.set_cell_material: no layer '%s'", layer_name))
|
||||||
|
end
|
||||||
|
local w, h = m.size.w, m.size.h
|
||||||
|
if cx < 0 or cx >= w or cy < 0 or cy >= h then
|
||||||
|
error(string.format("maps.set_cell_material: out of bounds (%d, %d) for %dx%d map",
|
||||||
|
cx, cy, w, h))
|
||||||
|
end
|
||||||
|
local cm = ensure_cells_material(layer, w, h)
|
||||||
|
cm[cy * w + cx + 1] = painted and 1 or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 0.5.7: read the per-cell material flag. Returns false if
|
||||||
|
-- layer.cells_material is absent or the entry is unset. Does NOT
|
||||||
|
-- include vertex-derived material — call cell_material_slot or render
|
||||||
|
-- if you need the effective state.
|
||||||
|
function M.get_cell_material(layer_name, cx, cy, map_id)
|
||||||
|
local m = require_map(map_id)
|
||||||
|
local layer = m.layers[layer_name]
|
||||||
|
if not layer then
|
||||||
|
error(string.format("maps.get_cell_material: no layer '%s'", layer_name))
|
||||||
|
end
|
||||||
|
local w, h = m.size.w, m.size.h
|
||||||
|
if cx < 0 or cx >= w or cy < 0 or cy >= h then return false end
|
||||||
|
if layer.cells_material == nil then return false end
|
||||||
|
local v = layer.cells_material[cy * w + cx + 1]
|
||||||
|
return v ~= nil and v ~= 0 and v ~= false
|
||||||
|
end
|
||||||
|
|
||||||
function M.set_roof(x, y, value, map_id)
|
function M.set_roof(x, y, value, map_id)
|
||||||
local map = require_map(map_id)
|
local map = require_map(map_id)
|
||||||
if x < 0 or y < 0 or x >= map.size.w or y >= map.size.h then
|
if x < 0 or y < 0 or x >= map.size.w or y >= map.size.h then
|
||||||
|
|||||||
Reference in New Issue
Block a user