Add multi-cell box shapes with per-cell collision
Generate 1x2/2x1 dominoes, 2x2 (square + 4 L-trominoes) and all
connected 3x2/2x3 polyominoes as R/G/B channel masks, reusing the
distance-based concentric-ring format that reproduces box_r/g/b
exactly. Outer silhouette keeps a 1px margin; connected cells stay
seamless. Each shape ships a {class="moveable"} .meta so getAllAssets
auto-registers it as a GenericMoveable.
Wire the occupied-cell shape (precomputed once by getAllAssets via
getCellsFromSprite) through to entities: createEntity now passes the
cached cells as cellShape, so an L/U/notched block collides on its real
cells and its gaps read as empty space. Fix the per-colour cache that
was reset every channel so only one colour survived.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
art/game/__pycache__/
|
||||||
1
art/game/box_1x2_1-1.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_1x2_1-1_b.png
Normal file
|
After Width: | Height: | Size: 131 B |
BIN
art/game/box_1x2_1-1_g.png
Normal file
|
After Width: | Height: | Size: 144 B |
BIN
art/game/box_1x2_1-1_r.png
Normal file
|
After Width: | Height: | Size: 131 B |
1
art/game/box_2x1_11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x1_11_b.png
Normal file
|
After Width: | Height: | Size: 129 B |
BIN
art/game/box_2x1_11_g.png
Normal file
|
After Width: | Height: | Size: 147 B |
BIN
art/game/box_2x1_11_r.png
Normal file
|
After Width: | Height: | Size: 134 B |
1
art/game/box_2x2_01-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x2_01-11_b.png
Normal file
|
After Width: | Height: | Size: 162 B |
BIN
art/game/box_2x2_01-11_g.png
Normal file
|
After Width: | Height: | Size: 184 B |
BIN
art/game/box_2x2_01-11_r.png
Normal file
|
After Width: | Height: | Size: 166 B |
1
art/game/box_2x2_10-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x2_10-11_b.png
Normal file
|
After Width: | Height: | Size: 171 B |
BIN
art/game/box_2x2_10-11_g.png
Normal file
|
After Width: | Height: | Size: 189 B |
BIN
art/game/box_2x2_10-11_r.png
Normal file
|
After Width: | Height: | Size: 176 B |
1
art/game/box_2x2_11-01.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x2_11-01_b.png
Normal file
|
After Width: | Height: | Size: 168 B |
BIN
art/game/box_2x2_11-01_g.png
Normal file
|
After Width: | Height: | Size: 187 B |
BIN
art/game/box_2x2_11-01_r.png
Normal file
|
After Width: | Height: | Size: 169 B |
1
art/game/box_2x2_11-10.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x2_11-10_b.png
Normal file
|
After Width: | Height: | Size: 165 B |
BIN
art/game/box_2x2_11-10_g.png
Normal file
|
After Width: | Height: | Size: 187 B |
BIN
art/game/box_2x2_11-10_r.png
Normal file
|
After Width: | Height: | Size: 165 B |
1
art/game/box_2x2_11-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x2_11-11_b.png
Normal file
|
After Width: | Height: | Size: 140 B |
BIN
art/game/box_2x2_11-11_g.png
Normal file
|
After Width: | Height: | Size: 160 B |
BIN
art/game/box_2x2_11-11_r.png
Normal file
|
After Width: | Height: | Size: 146 B |
1
art/game/box_2x3_01-01-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_01-01-11_b.png
Normal file
|
After Width: | Height: | Size: 173 B |
BIN
art/game/box_2x3_01-01-11_g.png
Normal file
|
After Width: | Height: | Size: 196 B |
BIN
art/game/box_2x3_01-01-11_r.png
Normal file
|
After Width: | Height: | Size: 177 B |
1
art/game/box_2x3_01-11-01.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_01-11-01_b.png
Normal file
|
After Width: | Height: | Size: 195 B |
BIN
art/game/box_2x3_01-11-01_g.png
Normal file
|
After Width: | Height: | Size: 221 B |
BIN
art/game/box_2x3_01-11-01_r.png
Normal file
|
After Width: | Height: | Size: 198 B |
1
art/game/box_2x3_01-11-10.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_01-11-10_b.png
Normal file
|
After Width: | Height: | Size: 190 B |
BIN
art/game/box_2x3_01-11-10_g.png
Normal file
|
After Width: | Height: | Size: 220 B |
BIN
art/game/box_2x3_01-11-10_r.png
Normal file
|
After Width: | Height: | Size: 194 B |
1
art/game/box_2x3_01-11-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_01-11-11_b.png
Normal file
|
After Width: | Height: | Size: 173 B |
BIN
art/game/box_2x3_01-11-11_g.png
Normal file
|
After Width: | Height: | Size: 195 B |
BIN
art/game/box_2x3_01-11-11_r.png
Normal file
|
After Width: | Height: | Size: 177 B |
1
art/game/box_2x3_10-10-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_10-10-11_b.png
Normal file
|
After Width: | Height: | Size: 182 B |
BIN
art/game/box_2x3_10-10-11_g.png
Normal file
|
After Width: | Height: | Size: 200 B |
BIN
art/game/box_2x3_10-10-11_r.png
Normal file
|
After Width: | Height: | Size: 187 B |
1
art/game/box_2x3_10-11-01.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_10-11-01_b.png
Normal file
|
After Width: | Height: | Size: 201 B |
BIN
art/game/box_2x3_10-11-01_g.png
Normal file
|
After Width: | Height: | Size: 223 B |
BIN
art/game/box_2x3_10-11-01_r.png
Normal file
|
After Width: | Height: | Size: 204 B |
1
art/game/box_2x3_10-11-10.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_10-11-10_b.png
Normal file
|
After Width: | Height: | Size: 198 B |
BIN
art/game/box_2x3_10-11-10_g.png
Normal file
|
After Width: | Height: | Size: 222 B |
BIN
art/game/box_2x3_10-11-10_r.png
Normal file
|
After Width: | Height: | Size: 200 B |
1
art/game/box_2x3_10-11-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_10-11-11_b.png
Normal file
|
After Width: | Height: | Size: 182 B |
BIN
art/game/box_2x3_10-11-11_g.png
Normal file
|
After Width: | Height: | Size: 200 B |
BIN
art/game/box_2x3_10-11-11_r.png
Normal file
|
After Width: | Height: | Size: 187 B |
1
art/game/box_2x3_11-01-01.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-01-01_b.png
Normal file
|
After Width: | Height: | Size: 179 B |
BIN
art/game/box_2x3_11-01-01_g.png
Normal file
|
After Width: | Height: | Size: 198 B |
BIN
art/game/box_2x3_11-01-01_r.png
Normal file
|
After Width: | Height: | Size: 180 B |
1
art/game/box_2x3_11-01-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-01-11_b.png
Normal file
|
After Width: | Height: | Size: 191 B |
BIN
art/game/box_2x3_11-01-11_g.png
Normal file
|
After Width: | Height: | Size: 215 B |
BIN
art/game/box_2x3_11-01-11_r.png
Normal file
|
After Width: | Height: | Size: 193 B |
1
art/game/box_2x3_11-10-10.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-10-10_b.png
Normal file
|
After Width: | Height: | Size: 176 B |
BIN
art/game/box_2x3_11-10-10_g.png
Normal file
|
After Width: | Height: | Size: 198 B |
BIN
art/game/box_2x3_11-10-10_r.png
Normal file
|
After Width: | Height: | Size: 176 B |
1
art/game/box_2x3_11-10-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-10-11_b.png
Normal file
|
After Width: | Height: | Size: 195 B |
BIN
art/game/box_2x3_11-10-11_g.png
Normal file
|
After Width: | Height: | Size: 229 B |
BIN
art/game/box_2x3_11-10-11_r.png
Normal file
|
After Width: | Height: | Size: 199 B |
1
art/game/box_2x3_11-11-01.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-11-01_b.png
Normal file
|
After Width: | Height: | Size: 179 B |
BIN
art/game/box_2x3_11-11-01_g.png
Normal file
|
After Width: | Height: | Size: 199 B |
BIN
art/game/box_2x3_11-11-01_r.png
Normal file
|
After Width: | Height: | Size: 181 B |
1
art/game/box_2x3_11-11-10.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-11-10_b.png
Normal file
|
After Width: | Height: | Size: 176 B |
BIN
art/game/box_2x3_11-11-10_g.png
Normal file
|
After Width: | Height: | Size: 199 B |
BIN
art/game/box_2x3_11-11-10_r.png
Normal file
|
After Width: | Height: | Size: 177 B |
1
art/game/box_2x3_11-11-11.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_2x3_11-11-11_b.png
Normal file
|
After Width: | Height: | Size: 149 B |
BIN
art/game/box_2x3_11-11-11_g.png
Normal file
|
After Width: | Height: | Size: 169 B |
BIN
art/game/box_2x3_11-11-11_r.png
Normal file
|
After Width: | Height: | Size: 155 B |
1
art/game/box_3x2_001-111.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_3x2_001-111_b.png
Normal file
|
After Width: | Height: | Size: 179 B |
BIN
art/game/box_3x2_001-111_g.png
Normal file
|
After Width: | Height: | Size: 206 B |
BIN
art/game/box_3x2_001-111_r.png
Normal file
|
After Width: | Height: | Size: 180 B |
1
art/game/box_3x2_010-111.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_3x2_010-111_b.png
Normal file
|
After Width: | Height: | Size: 194 B |
BIN
art/game/box_3x2_010-111_g.png
Normal file
|
After Width: | Height: | Size: 229 B |
BIN
art/game/box_3x2_010-111_r.png
Normal file
|
After Width: | Height: | Size: 196 B |
1
art/game/box_3x2_011-110.meta
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{class="moveable"}
|
||||||
BIN
art/game/box_3x2_011-110_b.png
Normal file
|
After Width: | Height: | Size: 188 B |
BIN
art/game/box_3x2_011-110_g.png
Normal file
|
After Width: | Height: | Size: 222 B |