better wirer behavior etc

This commit is contained in:
Your Name 2026-08-12 00:12:26 -04:00
parent bc4976b324
commit 6a5c2fc951
24 changed files with 11347 additions and 8198 deletions

View file

@ -938,7 +938,7 @@ function wireView()
wireDirtyRooms = {} wireDirtyRooms = {}
editorStatus = selectedCircuitId editorStatus = selectedCircuitId
and "Circuit selected. Drag to draw; right-drag erases; arrow keys pan." and "Circuit selected. Drag to draw; right-drag erases; arrow keys pan."
or "Click a wired door to select its circuit, then drag to its switches." or "Drag from a wired door and release on a switch."
end end
function worldView() function worldView()
@ -1027,10 +1027,12 @@ local function beginWireBrush(x, y, button)
end end
end end
if not selectedCircuitId then if not selectedCircuitId then
editorStatus = "Start by clicking a wired door." editorStatus = "Start by dragging from a wired door."
return return
end end
rememberWireRooms(gameWorld:ensureWireAt(cell, selectedCircuitId)) -- Do not materialize a wire until this stroke actually crosses into an
-- adjacent cell. Previously a click on a door wrote a zero-length track,
-- which later behaved like an orphaned circuit underneath that door.
else else
-- Prefer the selected circuit when several routes overlap here; otherwise -- Prefer the selected circuit when several routes overlap here; otherwise
-- adopt the top route. Repeated right-clicks can therefore remove every -- adopt the top route. Repeated right-clicks can therefore remove every
@ -1439,7 +1441,7 @@ function editorDraw()
love.graphics.printf("No circuit selected", 10, 54, sb.w - 20, "center") love.graphics.printf("No circuit selected", 10, 54, sb.w - 20, "center")
end end
love.graphics.printf( love.graphics.printf(
"Click a door to start a new run, or a wire to edit that run. Each run ends at one switch; start another run from the door for another switch.\n\nLeft-drag draws. Right-drag erases. Independent wires may share a cell without connecting.\n\nArrow keys pan by one room.", "Drag from a door to start a new run, or drag from a wire to edit that run. Release on a switch to terminate it; start another run from the door for another switch.\n\nLeft-drag draws. Right-drag erases. Independent wires may share a cell without connecting.\n\nArrow keys pan by one room.",
24, 100, sb.w - 48, "left" 24, 100, sb.w - 48, "left"
) )
if editorStatus then if editorStatus then

View file

@ -8,6 +8,7 @@ require "libs/TSerial"
require "_debug_helpers" require "_debug_helpers"
require "_helpers" require "_helpers"
require "input" require "input"
require "profiler"
require "color" require "color"
require "room" require "room"
require "world" require "world"
@ -145,6 +146,7 @@ function love.draw()
love.graphics.draw(finalCanvas, 0, 0) love.graphics.draw(finalCanvas, 0, 0)
love.graphics.draw(sideBarCanvas, sideBarBox.x, sideBarBox.y) love.graphics.draw(sideBarCanvas, sideBarBox.x, sideBarBox.y)
love.graphics.print("Current FPS: "..tostring(love.timer.getFPS( )), 10, 10) love.graphics.print("Current FPS: "..tostring(love.timer.getFPS( )), 10, 10)
PerfProfiler:draw()
Dialogue.draw() Dialogue.draw()
love.graphics.setCanvas() love.graphics.setCanvas()
@ -164,6 +166,13 @@ function love.draw()
end end
function love.keypressed(key) function love.keypressed(key)
-- Developer CPU sampling: record a representative moving sequence, then
-- press F9 again to write folded stacks for flamegraph.pl.
if key == "f9" then
PerfProfiler:toggle()
return
end
-- Available even while a dialogue is open, so the player never has to -- Available even while a dialogue is open, so the player never has to
-- dismiss something important just to change the colour treatment. -- dismiss something important just to change the colour treatment.
if key == "f4" then if key == "f4" then

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,76 +1,60 @@
{ {
wires={
},
objects={ objects={
{ {
color="red", color="red",
y=4,
x=8, x=8,
class="toilet" class="toilet",
y=4
}, },
{ {
color="red", color="red",
y=4,
x=6, x=6,
class="toilet" class="toilet",
y=4
}, },
{ {
color="red", color="red",
y=4,
x=4, x=4,
class="toilet" class="toilet",
y=4
}, },
{ {
color="green", color="green",
y=4,
x=8, x=8,
class="toilet" class="toilet",
y=4
}, },
{ {
color="green", color="green",
y=4,
x=6, x=6,
class="toilet" class="toilet",
y=4
}, },
{ {
color="green", color="green",
y=4,
x=4, x=4,
class="toilet" class="toilet",
y=4
}, },
{ {
color="blue", color="blue",
y=4,
x=8, x=8,
class="toilet" class="toilet",
y=4
}, },
{ {
color="blue", color="blue",
y=4,
x=6, x=6,
class="toilet" class="toilet",
y=4
}, },
{ {
color="blue", color="blue",
y=4,
x=4, x=4,
class="toilet" class="toilet",
}, y=4
{
color="red",
y=8,
x=6,
class="player"
},
{
color="green",
y=8,
x=6,
class="player"
},
{
color="blue",
y=8,
x=6,
class="player"
} }
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -1,207 +1,186 @@
{ {
objects={
{
color="green",
x=3,
y=5,
active=true,
class="player"
},
{
color="blue",
x=3,
y=5,
active=true,
class="player"
},
{
color="red",
x=3,
y=5,
active=true,
class="player"
},
{
color="green",
x=2,
y=4,
class="box"
},
{
color="blue",
x=2,
y=9,
class="box"
},
{
color="blue",
x=3,
y=6,
class="box"
},
{
color="red",
x=2,
y=9,
class="box"
},
{
color="red",
x=3,
y=6,
class="box"
},
{
color="red",
x=3,
y=9,
class="wired_switch"
},
{
color="green",
x=3,
y=9,
class="wired_switch"
},
{
color="blue",
x=3,
y=9,
class="wired_switch"
},
{
color="green",
x=3,
y=4,
class="wired_switch"
}
},
wires={ wires={
{ {
circuit="wire_6a7bd969_000a",
edges=6, edges=6,
x=4, x=4,
y=3, y=3
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=10, edges=10,
x=5, x=5,
y=3, y=3
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=10, edges=10,
x=6, x=6,
y=3, y=3
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=12, edges=12,
x=7, x=7,
y=3, y=3
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=6, edges=6,
x=10, x=10,
y=3, y=3
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=10, edges=10,
x=11, x=11,
y=3, y=3
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=2, edges=2,
x=3, x=3,
y=4, y=4
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=9, edges=9,
x=4, x=4,
y=4, y=4
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=3, edges=3,
x=7, x=7,
y=4, y=4
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=10, edges=10,
x=8, x=8,
y=4, y=4
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=10, edges=10,
x=9, x=9,
y=4, y=4
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bd969_000a",
edges=9, edges=9,
x=10, x=10,
y=4, y=4
circuit="wire_6a7bd969_000a"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=2, edges=2,
x=3, x=3,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=4, x=4,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=5, x=5,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=6, x=6,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=7, x=7,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=8, x=8,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=9, x=9,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=10, x=10,
y=9, y=9
circuit="wire_6a7bdb2a_0001"
}, },
{ {
circuit="wire_6a7bdb2a_0001",
edges=10, edges=10,
x=11, x=11,
y=9, y=9
circuit="wire_6a7bdb2a_0001" }
},
objects={
{
color="red",
x=2,
class="box",
y=9
},
{
color="red",
x=3,
class="box",
y=6
},
{
color="green",
x=2,
class="box",
y=4
},
{
color="blue",
x=2,
class="box",
y=9
},
{
color="blue",
x=3,
class="box",
y=6
},
{
color="red",
x=3,
class="wired_switch",
y=9
},
{
color="green",
x=3,
class="wired_switch",
y=9
},
{
color="blue",
x=3,
class="wired_switch",
y=9
},
{
color="green",
x=3,
class="wired_switch",
y=4
} }
} }
} }

1012
rooms/room_10_15.sav Normal file

File diff suppressed because it is too large Load diff

6
rooms/room_13_13.sav Normal file
View file

@ -0,0 +1,6 @@
{
objects={
},
wires={
}
}

1153
rooms/room_13_14.sav Normal file

File diff suppressed because it is too large Load diff

957
rooms/room_14_14.sav Normal file
View file

@ -0,0 +1,957 @@
{
objects={
{
x=1,
color="blue",
y=11,
class="static_wall"
},
{
x=2,
color="blue",
y=11,
class="static_wall"
},
{
x=3,
color="blue",
y=11,
class="static_wall"
},
{
x=4,
color="blue",
y=11,
class="static_wall"
},
{
x=5,
color="blue",
y=11,
class="static_wall"
},
{
x=6,
color="blue",
y=11,
class="static_wall"
},
{
x=7,
color="blue",
y=11,
class="static_wall"
},
{
x=8,
color="blue",
y=11,
class="static_wall"
},
{
x=9,
color="blue",
y=11,
class="static_wall"
},
{
x=10,
color="blue",
y=11,
class="static_wall"
},
{
x=11,
color="blue",
y=11,
class="static_wall"
},
{
x=11,
color="blue",
y=10,
class="static_wall"
},
{
x=11,
color="blue",
y=9,
class="static_wall"
},
{
x=11,
color="blue",
y=8,
class="static_wall"
},
{
x=11,
color="blue",
y=7,
class="static_wall"
},
{
x=11,
color="blue",
y=5,
class="static_wall"
},
{
x=11,
color="blue",
y=2,
class="static_wall"
},
{
x=11,
color="blue",
y=3,
class="static_wall"
},
{
x=11,
color="blue",
y=4,
class="static_wall"
},
{
x=11,
color="blue",
y=3,
class="static_wall"
},
{
x=11,
color="blue",
y=2,
class="static_wall"
},
{
x=11,
color="blue",
y=1,
class="static_wall"
},
{
x=10,
color="blue",
y=1,
class="static_wall"
},
{
x=9,
color="blue",
y=2,
class="static_wall"
},
{
x=8,
color="blue",
y=2,
class="static_wall"
},
{
x=7,
color="blue",
y=2,
class="static_wall"
},
{
x=7,
color="blue",
y=1,
class="static_wall"
},
{
x=6,
color="blue",
y=1,
class="static_wall"
},
{
x=5,
color="blue",
y=1,
class="static_wall"
},
{
x=4,
color="blue",
y=1,
class="static_wall"
},
{
x=3,
color="blue",
y=1,
class="static_wall"
},
{
x=2,
color="blue",
y=1,
class="static_wall"
},
{
x=1,
color="blue",
y=1,
class="static_wall"
},
{
x=2,
color="blue",
y=1,
class="static_wall"
},
{
x=3,
color="blue",
y=1,
class="static_wall"
},
{
x=4,
color="blue",
y=1,
class="static_wall"
},
{
x=5,
color="blue",
y=1,
class="static_wall"
},
{
x=6,
color="blue",
y=1,
class="static_wall"
},
{
x=7,
color="blue",
y=1,
class="static_wall"
},
{
x=8,
color="blue",
y=1,
class="static_wall"
},
{
x=9,
color="blue",
y=1,
class="static_wall"
},
{
color="blue",
circuit="wire_6a7be918_000b",
x=11,
y=6,
class="wired_door"
},
{
x=1,
color="blue",
y=7,
class="static_wall"
},
{
x=1,
color="blue",
y=6,
class="static_wall"
},
{
x=1,
color="blue",
y=2,
class="static_wall"
},
{
x=1,
color="red",
y=11,
class="static_wall"
},
{
x=2,
color="red",
y=11,
class="static_wall"
},
{
x=3,
color="red",
y=11,
class="static_wall"
},
{
x=4,
color="red",
y=11,
class="static_wall"
},
{
x=5,
color="red",
y=11,
class="static_wall"
},
{
x=6,
color="red",
y=11,
class="static_wall"
},
{
x=7,
color="red",
y=11,
class="static_wall"
},
{
x=8,
color="red",
y=11,
class="static_wall"
},
{
x=9,
color="red",
y=11,
class="static_wall"
},
{
x=10,
color="red",
y=11,
class="static_wall"
},
{
x=11,
color="red",
y=11,
class="static_wall"
},
{
x=11,
color="red",
y=10,
class="static_wall"
},
{
x=11,
color="red",
y=9,
class="static_wall"
},
{
x=11,
color="red",
y=8,
class="static_wall"
},
{
x=11,
color="red",
y=7,
class="static_wall"
},
{
x=11,
color="red",
y=5,
class="static_wall"
},
{
x=11,
color="red",
y=2,
class="static_wall"
},
{
x=11,
color="red",
y=3,
class="static_wall"
},
{
x=11,
color="red",
y=4,
class="static_wall"
},
{
x=11,
color="red",
y=3,
class="static_wall"
},
{
x=11,
color="red",
y=2,
class="static_wall"
},
{
x=11,
color="red",
y=1,
class="static_wall"
},
{
x=10,
color="red",
y=1,
class="static_wall"
},
{
x=9,
color="red",
y=2,
class="static_wall"
},
{
x=8,
color="red",
y=2,
class="static_wall"
},
{
x=7,
color="red",
y=2,
class="static_wall"
},
{
x=7,
color="red",
y=1,
class="static_wall"
},
{
x=6,
color="red",
y=1,
class="static_wall"
},
{
x=5,
color="red",
y=1,
class="static_wall"
},
{
x=4,
color="red",
y=1,
class="static_wall"
},
{
x=3,
color="red",
y=1,
class="static_wall"
},
{
x=2,
color="red",
y=1,
class="static_wall"
},
{
x=1,
color="red",
y=1,
class="static_wall"
},
{
x=2,
color="red",
y=1,
class="static_wall"
},
{
x=3,
color="red",
y=1,
class="static_wall"
},
{
x=4,
color="red",
y=1,
class="static_wall"
},
{
x=5,
color="red",
y=1,
class="static_wall"
},
{
x=6,
color="red",
y=1,
class="static_wall"
},
{
x=7,
color="red",
y=1,
class="static_wall"
},
{
x=8,
color="red",
y=1,
class="static_wall"
},
{
x=9,
color="red",
y=1,
class="static_wall"
},
{
color="red",
circuit="wire_6a7be918_000b",
x=11,
y=6,
class="wired_door"
},
{
x=1,
color="red",
y=7,
class="static_wall"
},
{
x=1,
color="red",
y=6,
class="static_wall"
},
{
x=1,
color="red",
y=2,
class="static_wall"
},
{
x=1,
color="green",
y=11,
class="static_wall"
},
{
x=2,
color="green",
y=11,
class="static_wall"
},
{
x=3,
color="green",
y=11,
class="static_wall"
},
{
x=4,
color="green",
y=11,
class="static_wall"
},
{
x=5,
color="green",
y=11,
class="static_wall"
},
{
x=6,
color="green",
y=11,
class="static_wall"
},
{
x=7,
color="green",
y=11,
class="static_wall"
},
{
x=8,
color="green",
y=11,
class="static_wall"
},
{
x=9,
color="green",
y=11,
class="static_wall"
},
{
x=10,
color="green",
y=11,
class="static_wall"
},
{
x=11,
color="green",
y=11,
class="static_wall"
},
{
x=11,
color="green",
y=10,
class="static_wall"
},
{
x=11,
color="green",
y=9,
class="static_wall"
},
{
x=11,
color="green",
y=8,
class="static_wall"
},
{
x=11,
color="green",
y=7,
class="static_wall"
},
{
x=11,
color="green",
y=5,
class="static_wall"
},
{
x=11,
color="green",
y=2,
class="static_wall"
},
{
x=11,
color="green",
y=3,
class="static_wall"
},
{
x=11,
color="green",
y=4,
class="static_wall"
},
{
x=11,
color="green",
y=3,
class="static_wall"
},
{
x=11,
color="green",
y=2,
class="static_wall"
},
{
x=11,
color="green",
y=1,
class="static_wall"
},
{
x=10,
color="green",
y=1,
class="static_wall"
},
{
x=9,
color="green",
y=2,
class="static_wall"
},
{
x=8,
color="green",
y=2,
class="static_wall"
},
{
x=7,
color="green",
y=2,
class="static_wall"
},
{
x=7,
color="green",
y=1,
class="static_wall"
},
{
x=6,
color="green",
y=1,
class="static_wall"
},
{
x=5,
color="green",
y=1,
class="static_wall"
},
{
x=4,
color="green",
y=1,
class="static_wall"
},
{
x=3,
color="green",
y=1,
class="static_wall"
},
{
x=2,
color="green",
y=1,
class="static_wall"
},
{
x=1,
color="green",
y=1,
class="static_wall"
},
{
x=2,
color="green",
y=1,
class="static_wall"
},
{
x=3,
color="green",
y=1,
class="static_wall"
},
{
x=4,
color="green",
y=1,
class="static_wall"
},
{
x=5,
color="green",
y=1,
class="static_wall"
},
{
x=6,
color="green",
y=1,
class="static_wall"
},
{
x=7,
color="green",
y=1,
class="static_wall"
},
{
x=8,
color="green",
y=1,
class="static_wall"
},
{
x=9,
color="green",
y=1,
class="static_wall"
},
{
color="green",
circuit="wire_6a7be918_000b",
x=11,
y=6,
class="wired_door"
},
{
x=1,
color="green",
y=7,
class="static_wall"
},
{
x=1,
color="green",
y=6,
class="static_wall"
},
{
x=1,
color="green",
y=2,
class="static_wall"
},
{
x=6,
color="red",
y=8,
class="wired_switch"
}
},
wires={
{
circuit="wire_6a7be918_000b",
x=9,
y=6,
edges=6
},
{
circuit="wire_6a7be918_000b",
x=10,
y=6,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=11,
y=6,
edges=8
},
{
circuit="wire_6a7be918_000b",
x=9,
y=7,
edges=5
},
{
circuit="wire_6a7bec68_0012",
x=1,
y=8,
edges=10
},
{
circuit="wire_6a7bec68_0012",
x=2,
y=8,
edges=10
},
{
circuit="wire_6a7bec68_0012",
x=3,
y=8,
edges=10
},
{
circuit="wire_6a7bec68_0012",
x=4,
y=8,
edges=10
},
{
circuit="wire_6a7bec68_0012",
x=5,
y=8,
edges=10
},
{
circuit="wire_6a7be8d1_000a",
x=6,
y=8,
edges=0
},
{
circuit="wire_6a7bec68_0012",
x=6,
y=8,
edges=8
},
{
circuit="wire_6a7be918_000b",
x=8,
y=8,
edges=6
},
{
circuit="wire_6a7be918_000b",
x=9,
y=8,
edges=9
},
{
circuit="wire_6a7be918_000b",
x=8,
y=9,
edges=5
},
{
circuit="wire_6a7be918_000b",
x=1,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=2,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=3,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=4,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=5,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=6,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=7,
y=10,
edges=10
},
{
circuit="wire_6a7be918_000b",
x=8,
y=10,
edges=9
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,548 +1,586 @@
{ {
wires={
},
objects={ objects={
{ {
class="static_wall", color="red",
color="blue",
x=1, x=1,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=2, x=2,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=3, x=3,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=4, x=4,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=5, x=5,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=6, x=6,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=7, x=7,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=8, x=8,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=9, x=9,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=10, x=10,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=2 y=2
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=3 y=3
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=4 y=4
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=5 y=5
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=6 y=6
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=7 y=7
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=8 y=8
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=9 y=9
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=10 y=10
}, },
{ {
class="static_wall", color="red",
color="blue",
x=1, x=1,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=2, x=2,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=3, x=3,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=5, x=5,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=6, x=6,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=7, x=7,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=8, x=8,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=9, x=9,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=10, x=10,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="red",
color="blue",
x=11, x=11,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall",
color="red", color="red",
x=1, x=8,
y=1 class="box",
y=4
}, },
{ {
class="static_wall",
color="red", color="red",
x=2, x=7,
y=1 class="spiky_box_2x1_11",
y=3
}, },
{ {
class="static_wall",
color="red", color="red",
x=3, x=6,
y=1 class="spiky_box_2x1_11",
y=4
}, },
{ {
class="static_wall",
color="red", color="red",
x=4, x=4,
class="spiky_box_2x1_11",
y=4
},
{
color="red",
x=3,
class="box_2x2_11-10",
y=3
},
{
color="green",
x=1,
class="static_wall",
y=1 y=1
}, },
{ {
color="green",
x=2,
class="static_wall", class="static_wall",
color="red", y=1
},
{
color="green",
x=3,
class="static_wall",
y=1
},
{
color="green",
x=4,
class="static_wall",
y=1
},
{
color="green",
x=5, x=5,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=6, x=6,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=7, x=7,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=8, x=8,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=9, x=9,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=10, x=10,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=2 y=2
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=3 y=3
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=4 y=4
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=5 y=5
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=6 y=6
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=7 y=7
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=8 y=8
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=9 y=9
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=10 y=10
}, },
{ {
class="static_wall", color="green",
color="red",
x=1, x=1,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=2, x=2,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=3, x=3,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=5, x=5,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=6, x=6,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=7, x=7,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=8, x=8,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=9, x=9,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=10, x=10,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="green",
color="red",
x=11, x=11,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall",
color="green",
x=1,
y=1
},
{
class="static_wall",
color="green",
x=2,
y=1
},
{
class="static_wall",
color="green",
x=3,
y=1
},
{
class="static_wall",
color="green", color="green",
x=4, x=4,
class="box",
y=3
},
{
color="blue",
x=1,
class="static_wall",
y=1 y=1
}, },
{ {
color="blue",
x=2,
class="static_wall", class="static_wall",
color="green", y=1
},
{
color="blue",
x=3,
class="static_wall",
y=1
},
{
color="blue",
x=4,
class="static_wall",
y=1
},
{
color="blue",
x=5, x=5,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=6, x=6,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=7, x=7,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=8, x=8,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=9, x=9,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=10, x=10,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=1 y=1
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=2 y=2
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=3 y=3
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=4 y=4
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=5 y=5
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=6 y=6
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=7 y=7
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=8 y=8
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=9 y=9
}, },
{ {
class="static_wall", color="blue",
color="green",
x=11, x=11,
class="static_wall",
y=10 y=10
}, },
{ {
class="static_wall", color="blue",
color="green",
x=1, x=1,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=2, x=2,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=3, x=3,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=5, x=5,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=6, x=6,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=7, x=7,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=8, x=8,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=9, x=9,
class="static_wall",
y=11 y=11
}, },
{ {
class="static_wall", color="blue",
color="green",
x=10, x=10,
y=11
},
{
class="static_wall", class="static_wall",
color="green",
x=11,
y=11 y=11
}, },
{ {
color="blue",
x=11,
class="static_wall",
y=11
},
{
x=5,
class="npc", class="npc",
x=5,
y=2 y=2
} }
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,232 +1,252 @@
{ {
rooms={ rooms={
{ {
x=10,
name="3", name="3",
y=10 y=10,
x=10
}, },
{ {
x=12,
name="5", name="5",
y=10 y=10,
x=12
}, },
{ {
x=12,
name="village_1", name="village_1",
y=9 y=9,
x=12
}, },
{ {
x=11,
name="village_4", name="village_4",
y=8 y=8,
x=11
}, },
{ {
x=11,
name="yellow_1", name="yellow_1",
y=7 y=7,
x=11
}, },
{ {
x=11,
name="yellow_3", name="yellow_3",
y=6 y=6,
x=11
}, },
{ {
x=12,
name="yellow_2", name="yellow_2",
y=7 y=7,
x=12
}, },
{ {
x=11,
name="yellow_4", name="yellow_4",
y=5 y=5,
x=11
}, },
{ {
x=11,
name="yellow_5", name="yellow_5",
y=4 y=4,
x=11
}, },
{ {
x=10,
name="yellow_6", name="yellow_6",
y=5 y=5,
x=10
}, },
{ {
x=1,
name="default", name="default",
y=1 y=1,
x=1
}, },
{ {
x=3,
name="old_yellow_3", name="old_yellow_3",
y=1 y=1,
x=3
}, },
{ {
x=5,
name="test_patt", name="test_patt",
y=1 y=1,
x=5
}, },
{ {
x=7,
name="test_patt_update", name="test_patt_update",
y=1 y=1,
x=7
}, },
{ {
x=9,
name="white_asymmetrical", name="white_asymmetrical",
y=1 y=1,
x=9
}, },
{ {
x=11,
name="white_ok", name="white_ok",
y=1 y=1,
x=11
}, },
{ {
x=13,
name="white_primary", name="white_primary",
y=1 y=1,
x=13
}, },
{ {
x=15,
name="yellow_arches", name="yellow_arches",
y=1 y=1,
x=15
}, },
{ {
x=17,
name="yellow_asymmetrical", name="yellow_asymmetrical",
y=1 y=1,
x=17
}, },
{ {
x=1,
name="yellow_cc_moustache", name="yellow_cc_moustache",
y=3 y=3,
x=1
}, },
{ {
x=3,
name="yellow_color_changing_levvel_1", name="yellow_color_changing_levvel_1",
y=3 y=3,
x=3
}, },
{ {
x=7,
name="yellow_smile", name="yellow_smile",
y=3 y=3,
x=7
}, },
{ {
x=9,
name="2", name="2",
y=10 y=10,
x=9
}, },
{ {
x=11,
name="room_11_09", name="room_11_09",
y=9 y=9,
x=11
}, },
{ {
x=9,
name="yellow_skull", name="yellow_skull",
y=3 y=3,
x=9
}, },
{ {
x=5,
name="jorge_room", name="jorge_room",
y=5 y=5,
x=5
}, },
{ {
x=11,
name="4", name="4",
y=10 y=10,
x=11
}, },
{ {
x=1,
name="room_01_05", name="room_01_05",
y=5 y=5,
x=1
}, },
{ {
x=2,
name="ok", name="ok",
y=8 y=8,
x=2
}, },
{ {
x=5,
name="room_05_18", name="room_05_18",
y=18 y=18,
x=5
}, },
{ {
x=9,
name="village_start", name="village_start",
y=11 y=11,
x=9
}, },
{ {
x=4,
name="spiky_test", name="spiky_test",
y=8 y=8,
x=4
}, },
{ {
x=5,
name="corner_trimino_test", name="corner_trimino_test",
y=7 y=7,
x=5
}, },
{ {
x=6,
name="tetromino_loop_t", name="tetromino_loop_t",
y=7 y=7,
x=6
}, },
{ {
x=5,
name="corner_trimino_test_copy", name="corner_trimino_test_copy",
y=6 y=6,
x=5
}, },
{ {
x=7,
name="blocker_test", name="blocker_test",
y=7 y=7,
x=7
}, },
{ {
x=5,
name="spiky_test_2", name="spiky_test_2",
y=8 y=8,
x=5
}, },
{ {
x=5,
name="spiky_test_3", name="spiky_test_3",
y=9 y=9,
x=5
}, },
{ {
x=3,
name="jorge2", name="jorge2",
y=14 y=14,
x=3
}, },
{ {
x=8,
name="room_08_07", name="room_08_07",
y=7 y=7,
x=8
}, },
{ {
x=13,
name="village_3", name="village_3",
y=8 y=8,
x=13
}, },
{ {
x=12,
name="village_2", name="village_2",
y=8 y=8,
x=12
}, },
{ {
x=14,
name="room_14_07", name="room_14_07",
y=7 y=7,
x=14
}, },
{ {
x=9,
name="room_09_13", name="room_09_13",
y=13 y=13,
x=9
}, },
{ {
x=8,
name="room_08_13", name="room_08_13",
y=13 y=13,
x=8
},
{
name="room_10_15",
y=15,
x=9
},
{
name="room_13_14",
y=14,
x=13
},
{
name="room_14_14",
y=14,
x=14
},
{
name="room_13_13",
y=13,
x=13
} }
}, },
lastRoom="room_09_13", lastRoom="room_14_14",
width=18, width=18,
height=18 height=18
} }

File diff suppressed because it is too large Load diff

View file

@ -183,6 +183,54 @@ test("a door requires every independent switch run at its terminal", function()
assertTrue(world.circuitState.doorPowered[wiredDoor]) assertTrue(world.circuitState.doorPowered[wiredDoor])
end) end)
test("an orphaned stub at a door does not block a valid switch run", function()
local world, roomA, _, wiredDoor = makeWorld()
roomA.wires[1][1].abandoned_stroke = 0
world.collidableMatrices.blue[1] = {[4] = {}}
world:resolveCircuits()
assertTrue(world.circuitState.doorPowered[wiredDoor])
assertTrue(wiredDoor.powered)
end)
test("selecting a parked colour changes to its room", function()
local function player()
local entity = {switched = false}
function entity:playSwitchSound(success) self.switched = success end
return entity
end
local function room(name, players, active)
local entity = {name = name, player = players, activeColors = active, colorsPlayerHas = {}}
for color in pairs(players) do table.insert(entity.colorsPlayerHas, color) end
function entity:getPossibleColors() return self.colorsPlayerHas end
function entity:setActiveColor(color, value) self.activeColors[color] = value end
function entity:getActiveColors()
local colors = {}
for color, value in pairs(self.activeColors) do if value then table.insert(colors, color) end end
return colors
end
return entity
end
local roomA = room("a", {red = player()}, {red = true, green = false, blue = false})
local roomB = room("b", {blue = player()}, {red = false, green = false, blue = false})
local world = setmetatable({
levels = {a = roomA, b = roomB},
roomByName = {a = {name = "a", x = 1, y = 1}, b = {name = "b", x = 2, y = 1}},
}, {__index = World})
world.flushRuntime = function(self) self.flushed = true end
local oldCurrentRoom, oldSetEditorRoomName = currentRoom, setEditorRoomName
currentRoom = roomA
setEditorRoomName = function() end
assertTrue(world:switchPlayerColor(roomA, "blue"))
assertTrue(currentRoom == roomB)
assertFalse(roomA.activeColors.red)
assertTrue(roomB.activeColors.blue)
assertTrue(roomB.player.blue.switched)
assertTrue(world.flushed)
currentRoom, setEditorRoomName = oldCurrentRoom, oldSetEditorRoomName
end)
test("one run cannot terminate at two different switches", function() test("one run cannot terminate at two different switches", function()
local second = switch("red", 1, 2) local second = switch("red", 1, 2)
local world, _, roomB = makeWorld(second) local world, _, roomB = makeWorld(second)

View file

@ -429,13 +429,16 @@ function World:resolveCircuits()
local position = {x = x, y = y} local position = {x = x, y = y}
local key = cellKey(position) local key = cellKey(position)
local tracks = self.wireMatrix[y] and self.wireMatrix[y][x] local tracks = self.wireMatrix[y] and self.wireMatrix[y][x]
local runCount, powered = 0, tracks ~= nil -- A circuit can be started with a click before the author drags its
-- first segment. Those zero-length fragments are not a completed
-- electrical run, so they must not permanently lock a door that also
-- has real door-to-switch routes. Only valid components participate
-- in the door's AND condition.
local runCount, powered = 0, true
for circuitId in pairs(tracks or {}) do for circuitId in pairs(tracks or {}) do
runCount = runCount + 1
local component = components[circuitId] and components[circuitId][key] local component = components[circuitId] and components[circuitId][key]
if not component or not component.valid then if component and component.valid then
powered = false runCount = runCount + 1
else
for switch in pairs(component.switches) do for switch in pairs(component.switches) do
if not switchPressed[switch] then powered = false end if not switchPressed[switch] then powered = false end
end end
@ -676,7 +679,35 @@ end
function World:switchPlayerColor(room, color) function World:switchPlayerColor(room, color)
local player = room.player[color] local player = room.player[color]
if not player then return false end if not player then
-- A colour copy can be parked in another world room. Number keys are a
-- direct way to resume controlling it: keep every copy where it is, but
-- make its owner the active room and select that colour there.
local destination
for name, candidate in pairs(self.levels or {}) do
if self:roomLocation(name) and candidate.player[color] then
destination = candidate
break
end
end
if not destination then return false end
for _, possibleColor in ipairs(room:getPossibleColors()) do
room:setActiveColor(possibleColor, false)
end
for _, possibleColor in ipairs(destination:getPossibleColors()) do
destination:setActiveColor(possibleColor, possibleColor == color)
end
currentRoom = destination
self.lastRoom = destination.name
destination.player[color]:playSwitchSound(true)
self:markDirty(room)
self:markDirty(destination)
self:flushRuntime()
setEditorRoomName(destination.name)
return true
end
local activeColors = room:getActiveColors() local activeColors = room:getActiveColors()
local canSwitch = #activeColors ~= 1 or activeColors[1] ~= color local canSwitch = #activeColors ~= 1 or activeColors[1] ~= color
if canSwitch then if canSwitch then