level editor improvements

This commit is contained in:
Your Name 2026-08-07 00:56:33 -04:00
parent 886679816b
commit a8b469876d
41 changed files with 8367 additions and 8312 deletions

View file

@ -533,43 +533,40 @@ function Room:nextRoomCheck()
end
-- Instantiate one object from the flat {class,color,x,y} schema. `class` is a
-- key: the built-in behaviour classes (door/switch/player) plus the two generic
-- grid pieces (wall/static_wall), and finally any art asset resolved by name via
-- the globalAssetProperties registry (this is what the level editor places).
-- Instantiate one object from the flat {class,color,x,y} schema. `class` names an
-- art asset, and its .meta declares the behaviour ("door"/"switch"/"player"/
-- "moveable"); anything without a .meta defaults to immoveable. npc is the one
-- keyword handled directly since it has no art.
function Room:createEntity(class, color, x, y)
if class == "npc" then
self:registerNpc(x, y)
return
end
local props = globalAssetProperties and globalAssetProperties[class]
local behavior = props and props.class or "immoveable"
local entity
if class == "door" then
if behavior == "door" then
entity = Door:new(x, y)
self:registerDoor(entity)
elseif class == "switch" then
elseif behavior == "switch" then
entity = Switch:new(x, y, color)
self:registerSwitch(entity, color)
elseif class == "player" then
elseif behavior == "player" then
entity = Player:new(x, y, color)
self:registerPlayer(entity, color)
self:setActiveColor(color, true)
elseif class == "wall" then
entity = GenericUnmoveable:new(x, y, color, sprites.box[color])
self:registerCollidable(entity, {color})
elseif class == "static_wall" then
entity = GenericUnmoveable:new(x, y, color, sprites.wall)
self:registerCollidable(entity, {color})
elseif class == "npc" then
self:registerNpc(x, y)
else
-- generic art asset placed via the editor, resolved by name
local props = globalAssetProperties and globalAssetProperties[class]
if props and props.sprites and props.sprites[color] then
local sprite = loadPlaceImage(props.sprites[color])
if props.class == "moveable" then
entity = GenericMoveable:new(x, y, color, sprite, class)
else
entity = GenericUnmoveable:new(x, y, color, sprite)
end
self:registerCollidable(entity, {color})
elseif props and props.sprites and props.sprites[color] then
local sprite = loadPlaceImage(props.sprites[color])
if behavior == "moveable" then
entity = GenericMoveable:new(x, y, color, sprite, class)
else
entity = GenericUnmoveable:new(x, y, color, sprite)
end
self:registerCollidable(entity, {color})
end
if entity then entity.saveClass = class end
return entity
end
@ -667,7 +664,7 @@ function Room:attemptPlace(name, props, mouseX, mouseY, color)
end
function Room:load(name)
local room = love.filesystem.read("rooms/" .. name .. ".sav")
local room = readFromSource("rooms/" .. name .. ".sav")
if not room then
-- no save yet: start with a blank room to build in the editor
print("no save for '" .. name .. "', starting blank")
@ -686,7 +683,7 @@ function Room:save()
local name = self.name or "test"
local room = TSerial.pack(self:serialize(), nil, true)
local success = love.filesystem.write("rooms/" .. name .. ".sav", room)
local success = writeToSource("rooms/" .. name .. ".sav", room)
if not success then error "great job u fool" end
end