Replace box variants with a moveable adhesion property

Collapse the spiky/sticky/skewer box-variant assets into a single per-
instance `adhesion` property on any moveable block, chosen in the editor
via a dropdown next to the colour picker and stored in the .sav alongside
the class.

- spiky -> sticky: soft grab on every true edge (goopy shader)
- skewer -> gluey: rigid weld on every true edge (spiked outline)
- old trailing-face sticky is removed; its saves fold into new sticky

Move the spike geometry + drawGlueySprite into shaders.lua, fold drawing
and the adhesion flag into GenericMoveable, and delete the three
Generic{Sticky,Spiky,Skewer} classes and box_variants.lua. Room:createEntity
normalises legacy spiky_/skewer_/sticky_ class prefixes so old saves load,
and serialization emits `adhesion`. World/map previews and the movement
proxy follow the rename.

Backfill rooms/*.sav to the new format via tools/backfill_adhesion.lua
(41 objects across 8 files). Update tests to the two-mode model; the two
tests asserting the removed lateral-shear limitation are dropped and a
legacy-load migration test added. 27/27 pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Your Name 2026-08-21 16:34:01 -04:00
parent c348b81a93
commit 7d84f595e4
25 changed files with 4010 additions and 3797 deletions

View file

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