Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
795b312
feat: end the slice with Dexter's absorb and the to-be-continued window
arudaev Oct 23, 2026
73a8b48
art: give the Hidden Garden parallax layers from a depth key
arudaev Oct 23, 2026
47be618
Merge remote-tracking branch 'origin/docs/139-dexter-sizes' into feat…
arudaev Oct 23, 2026
edcce5a
art: grow the Hidden Garden into a five-chunk prologue walk
arudaev Oct 24, 2026
54b96e2
feat: block frontal hits with the chair guard
Vatsal2005 Oct 24, 2026
245432c
test: line Dexter up at his measured 27 px
arudaev Oct 24, 2026
dd81862
chore: sync the lower stack with the current integration
Vatsal2005 Oct 24, 2026
1397868
Merge pull request #148 from THD-AI/art/50-prologue-chunks
arudaev Oct 24, 2026
f4da067
art: draw Rusty Creek's parallax layers from region-wide plates
arudaev Oct 24, 2026
a0cc2dd
art: keep Rusty Creek's parallax preview out of its image inventory
arudaev Oct 24, 2026
1da18b0
art: export Dexter at 27 px after approval
arudaev Oct 24, 2026
43d481b
Merge remote-tracking branch 'origin/main' into feature/58-slice-ending
arudaev Oct 24, 2026
8402050
art: line up the ending's Dexter at 27 and 46 px
arudaev Oct 24, 2026
8e9df27
Merge pull request #153 from THD-AI/art/139-dexter-export
arudaev Oct 24, 2026
65db51d
Merge pull request #138 from THD-AI/feature/58-slice-ending
arudaev Oct 24, 2026
35e9111
Merge pull request #151 from THD-AI/art/150-creek-region-plates
arudaev Oct 24, 2026
4fb4b9d
fix: retain act taps completed between frames
Vatsal2005 Oct 24, 2026
a23aac7
Merge remote-tracking branch 'origin/main' into feature/35-region-swap
arudaev Oct 24, 2026
9e227bb
feat: swap regions on the route from the garden to the maze
arudaev Oct 24, 2026
339c66f
Merge pull request #155 from THD-AI/feature/35-region-swap
arudaev Oct 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ npm --prefix game run dev # http://localhost:5173 – stages are genera
| F4 then Tab (dev) | hand over the pocket computer, then open the map |
| F6 / F7 (dev) | step through the sound loops / effects; M mutes |
| F8 (dev) | the THD.exe crossing |
| Shift + F8 (dev) | the end of the slice: Dexter absorbs, the glitch, "To be continued.", the credits |
| F9 / F10 (dev) | anomaly FX / atmosphere test chunks (V toggles, A switches the leaves, Esc closes) |

Dev keys exist only in `npm run dev`, never in the preview or production build. Movement keys and the URL options arrive with lane B's stack (#111 → …).
Expand Down
4 changes: 2 additions & 2 deletions art/sprites/boards.json
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@
]
]
},
"review": "To review (24 Oct, #139): redrawn in the approved plush proportions; 27 px = 0.35 of the hero as in dexter-stages (compare.py)."
"review": "✅ Approved 24 Oct by Alexander (#141). 27 px = 0.35 of the hero as in the approved Dexter stages (docs/04, compare.py lineup); exported to game/public/assets/sprites/ with export_atlas.py. The looping previews below are at twice game size."
},
{
"id": "dexter-acts",
Expand Down Expand Up @@ -816,7 +816,7 @@
]
]
},
"review": "To review (24 Oct, #139): redrawn in the approved plush proportions; 27 px = 0.35 of the hero as in dexter-stages (compare.py)."
"review": "✅ Approved 24 Oct by Alexander (#141). 27 px = 0.35 of the hero as in the approved Dexter stages (docs/04, compare.py lineup); exported to game/public/assets/sprites/ with export_atlas.py. The looping previews below are at twice game size."
},
{
"id": "intro-anomaly",
Expand Down
2 changes: 1 addition & 1 deletion art/sprites/dexter-acts.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

![Dexter · gestures](images/dexter-acts-preview.png)

**Review:** To review (24 Oct, #139): redrawn in the approved plush proportions; 27 px = 0.35 of the hero as in dexter-stages (compare.py).
**Review:** ✅ Approved 24 Oct by Alexander (#141). 27 px = 0.35 of the hero as in the approved Dexter stages (docs/04, compare.py lineup); exported to game/public/assets/sprites/ with export_atlas.py. The looping previews below are at twice game size.

## In motion

Expand Down
2 changes: 1 addition & 1 deletion art/sprites/dexter.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

![Dexter · moves](images/dexter-preview.png)

**Review:** To review (24 Oct, #139): redrawn in the approved plush proportions; 27 px = 0.35 of the hero as in dexter-stages (compare.py).
**Review:** ✅ Approved 24 Oct by Alexander (#141). 27 px = 0.35 of the hero as in the approved Dexter stages (docs/04, compare.py lineup); exported to game/public/assets/sprites/ with export_atlas.py. The looping previews below are at twice game size.

## In motion

Expand Down
Binary file added art/sprites/previews/ending-lineup.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 7 additions & 3 deletions art/stages/hidden-garden/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# Hidden Garden – stage chunks

The prologue, drawn from the approved [Hidden Garden concept](../../locations/hidden-garden-clean.md) as a flat side elevation with its figures removed. One chunk, `hg-0-0` (2160×720): the bench where Dexter sits at the start (x ≈ 190–320), the stone path and the timber jetty (path top y = 441), the end of the jetty where Dexter points (x ≈ 1290–1323), and one wrong patch in the pond's reflection below it – a rusty girder with a ladder that isn't there. Clean only.
The prologue, drawn from the approved [Hidden Garden concept](../../locations/hidden-garden-clean.md) as a flat side elevation: **five chunks, 10 800 px**, about 70 s of walking plus Dexter's waits and two detours ([docs/04 – Hidden Garden, the prologue level](../../../docs/04-WORLD-AND-LEVELS.md#hidden-garden--the-prologue-level), #50). `hg-4-0` is the approved pond chunk (the jetty where Dexter points, the wrong reflection). The four before it were grown leftwards from it with [grow_stage.py](../../../scripts/grow_stage.py) – scenery first, one masked repaint per route feature, the seams between new chunks repainted (docs/09): `hg-0-0` the gate (Dexter's bench, a birch log), `hg-1-0` the hill (an oak on the crest, a hollow behind the grass), `hg-2-0` the terraces (a shed with a ladder to its roof), `hg-3-0` the boardwalk (a gap with stepping stones). Clean only.

**Layers** ([layers.json](layers.json), `python scripts/split_layers.py art/stages/hidden-garden`): [03 rear](layers/hg-0-0.03-rear.png) · [04 water](layers/hg-0-0.04-water.png) · [05 play](layers/hg-0-0.05-play.png) · [07 foreground](layers/hg-0-0.07-foreground.png). Everything above the path is one rear layer at scroll 1.0, and the foreground also scrolls at 1.0: rectangles and colours would tear the big tree or the reeds at another speed, so sky/far/mid parallax waits for hand-drawn masks.
**Layers** (#142): each chunk's depth key comes from the model, its masks from the key ([depth_layers.py](../../../scripts/depth_layers.py), [layers.json](layers.json)). Sky, far and mid scroll at 0.1, 0.25 and 0.6 (docs/04) from plates filled where nearer layers hide them; the foreground at 1.2. The pond keeps its exact rules for path, water and foreground; the grown chunks take every band from their key. **Collision**: walk lines traced from each key's play band (`depth_layers.py collision`), spawns, Dexter's waypoints and triggers placed by hand; overlays in [collision/](collision/).

The whole walk: [prologue.png](images/prologue.png) · the parallax at three camera positions: [parallax.png](images/parallax.png) (`python scripts/compare.py parallax art/stages/hidden-garden`).

| | |
| --- | --- |
| [![Hidden Garden · the bench and the pond](images/hg-0-0-preview.png)](hg-0-0.md)<br>**[Hidden Garden · the bench and the pond](hg-0-0.md)** | |
| [![Hidden Garden · the gate](images/hg-0-0-preview.png)](hg-0-0.md)<br>**[Hidden Garden · the gate](hg-0-0.md)** | [![Hidden Garden · the hill](images/hg-1-0-preview.png)](hg-1-0.md)<br>**[Hidden Garden · the hill](hg-1-0.md)** |
| [![Hidden Garden · the terraces](images/hg-2-0-preview.png)](hg-2-0.md)<br>**[Hidden Garden · the terraces](hg-2-0.md)** | [![Hidden Garden · the boardwalk](images/hg-3-0-preview.png)](hg-3-0.md)<br>**[Hidden Garden · the boardwalk](hg-3-0.md)** |
| [![Hidden Garden · the bench and the pond](images/hg-4-0-preview.png)](hg-4-0.md)<br>**[Hidden Garden · the bench and the pond](hg-4-0.md)** | |
288 changes: 286 additions & 2 deletions art/stages/hidden-garden/boards.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,297 @@
{
"name": "Hidden Garden – stage chunks",
"readme": "The prologue, drawn from the approved [Hidden Garden concept](../../locations/hidden-garden-clean.md) as a flat side elevation with its figures removed. One chunk, `hg-0-0` (2160×720): the bench where Dexter sits at the start (x ≈ 190–320), the stone path and the timber jetty (path top y = 441), the end of the jetty where Dexter points (x ≈ 1290–1323), and one wrong patch in the pond's reflection below it – a rusty girder with a ladder that isn't there. Clean only.\n\n**Layers** ([layers.json](layers.json), `python scripts/split_layers.py art/stages/hidden-garden`): [03 rear](layers/hg-0-0.03-rear.png) · [04 water](layers/hg-0-0.04-water.png) · [05 play](layers/hg-0-0.05-play.png) · [07 foreground](layers/hg-0-0.07-foreground.png). Everything above the path is one rear layer at scroll 1.0, and the foreground also scrolls at 1.0: rectangles and colours would tear the big tree or the reeds at another speed, so sky/far/mid parallax waits for hand-drawn masks.",
"readme": "The prologue, drawn from the approved [Hidden Garden concept](../../locations/hidden-garden-clean.md) as a flat side elevation: **five chunks, 10 800 px**, about 70 s of walking plus Dexter's waits and two detours ([docs/04 – Hidden Garden, the prologue level](../../../docs/04-WORLD-AND-LEVELS.md#hidden-garden--the-prologue-level), #50). `hg-4-0` is the approved pond chunk (the jetty where Dexter points, the wrong reflection). The four before it were grown leftwards from it with [grow_stage.py](../../../scripts/grow_stage.py) – scenery first, one masked repaint per route feature, the seams between new chunks repainted (docs/09): `hg-0-0` the gate (Dexter's bench, a birch log), `hg-1-0` the hill (an oak on the crest, a hollow behind the grass), `hg-2-0` the terraces (a shed with a ladder to its roof), `hg-3-0` the boardwalk (a gap with stepping stones). Clean only.\n\n**Layers** (#142): each chunk's depth key comes from the model, its masks from the key ([depth_layers.py](../../../scripts/depth_layers.py), [layers.json](layers.json)). Sky, far and mid scroll at 0.1, 0.25 and 0.6 (docs/04) from plates filled where nearer layers hide them; the foreground at 1.2. The pond keeps its exact rules for path, water and foreground; the grown chunks take every band from their key. **Collision**: walk lines traced from each key's play band (`depth_layers.py collision`), spawns, Dexter's waypoints and triggers placed by hand; overlays in [collision/](collision/).\n\nThe whole walk: [prologue.png](images/prologue.png) · the parallax at three camera positions: [parallax.png](images/parallax.png) (`python scripts/compare.py parallax art/stages/hidden-garden`).",
"model": "gpt-image-2.5-sunburst",
"size": "2160x720",
"style": "FORMAT: a STAGE CONCEPT for a 2D side-scroller explored in all four directions - one wide 2:1 image in strict side view, drawn like an architect's ELEVATION: every path, wall, bed and building runs PARALLEL to the screen from left to right; depth comes only from layers stacked behind each other, never from things receding toward a vanishing point; no path, corridor or bed leads into the distance. The hero is small, about one ninth of the image height. Build real level structure into the scenery: a main route plus at least one higher branch and one lower branch or underground pocket, smooth hills and slopes (some steep enough to slide down), ledges with grabbable edges, something to climb (ladder, vines, scaffold, stairs), a dead end with a small reward glint. DEPTH in clear layers: hazy far background, mid-ground, the play layer, and a dark, out-of-focus foreground of leaves and grass partly covering the bottom edge and corners as if the camera sits behind foliage; reflections where there is water; a few falling leaves. LOOK: detailed hi-bit pixel art, fine 2-pixel grain, the warm palette and light of the style master. TONE: secret horror - calm and pretty first. No text, no logos, no UI.",
"people": "No people, no animals, no plush toys and no characters of any kind: this is an empty stage the game puts its characters into.",
"boards": [
{
"id": "hg-0-0",
"title": "Hidden Garden · the gate",
"inputs": [
"repo:art/locations/images/hidden-garden-clean.png",
"repo:art/direction/images/style-master-preview.png"
],
"prompt": "The way into the garden: at the left edge an old wrought-iron garden gate stands open in a tall trimmed hedge (x=20-220, up to y=200). A gravel path at y=441 runs across the whole chunk. A wooden park bench with iron legs faces the viewer on the path at x=700-860 (seat at y=405, back up to y=370), under an old lantern post at x=900. Low flowering shrubs and the first reeds behind the path. Near the right edge a fallen birch log lies across the path at x=1700-1830, its top at y=411 (30 px high). Late-afternoon autumn light from the left, golden reeds, orange and yellow trees, a hazy blue conifer line far behind, warm stone and weathered timber, as in the pond chunk next to it. The walkable surface is clearly readable: a lit top edge, darker below.",
"factor": 1,
"review": "To review (24 Oct, #50): grown leftwards from the pond with grow_stage.py; route feature repainted; seams joined.",
"route": {
"walk": [
[
[
0,
441
],
[
1700,
441
],
[
1700,
411
],
[
1830,
411
],
[
1830,
441
],
[
2160,
441
]
]
],
"structure": [
[
20,
200,
220,
441
],
[
700,
370,
860,
441
]
]
},
"keyed": false,
"colours": 256
},
{
"id": "hg-1-0",
"title": "Hidden Garden · the hill",
"inputs": [
"repo:art/locations/images/hidden-garden-clean.png",
"repo:art/direction/images/style-master-preview.png"
],
"prompt": "A gravel path at y=441 at both edges rolls over a smooth grassy hill: it starts rising at x=320, reaches the round crest at x=1080, y=331, and comes back down to y=441 at x=1840 - gentle slopes, no steps. An old oak with a wide autumn crown stands on the crest (trunk at x=1040-1120). Under the hill's left flank, behind a curtain of tall golden grass, a small dark hollow opens below the path: its floor at y=521 from x=440 to x=700, its roof the hill itself; the grass curtain hangs from the path's edge. Late-afternoon autumn light from the left, golden reeds, orange and yellow trees, a hazy blue conifer line far behind, warm stone and weathered timber, as in the pond chunk next to it. The walkable surface is clearly readable: a lit top edge, darker below.",
"factor": 1,
"review": "To review (24 Oct, #50): grown leftwards from the pond with grow_stage.py; route feature repainted; seams joined.",
"route": {
"walk": [
[
[
0,
441
],
[
320,
441
],
[
700,
370
],
[
1080,
331
],
[
1460,
370
],
[
1840,
441
],
[
2160,
441
]
],
[
[
440,
521
],
[
700,
521
]
]
],
"hollow": [
[
440,
450,
700,
521
]
]
},
"keyed": false,
"colours": 256
},
{
"id": "hg-2-0",
"title": "Hidden Garden · the terraces",
"inputs": [
"repo:art/locations/images/hidden-garden-clean.png",
"repo:art/direction/images/style-master-preview.png"
],
"prompt": "Old stone garden terraces. A gravel path at y=441 from x=0 to x=480. Three stone terrace steps rise to the right, each 40 px high: a step face at x=480 up to y=401, at x=620 up to y=361, at x=760 up to y=321. A flat stone terrace at y=321 runs from x=760 to x=1320, with a small weathered wooden garden shed standing on it from x=930 to x=1140 (walls up from y=321, its flat roof at y=170) and a wooden ladder leaning on the shed's right wall at x=1150-1180 from the terrace up to the roof. On the roof a small glint. Steps go down again on the right, 40 px each: at x=1320 to y=361, at x=1460 to y=401, at x=1600 to y=441, then the gravel path at y=441 to the right edge. Late-afternoon autumn light from the left, golden reeds, orange and yellow trees, a hazy blue conifer line far behind, warm stone and weathered timber, as in the pond chunk next to it. The walkable surface is clearly readable: a lit top edge, darker below.",
"factor": 1,
"review": "To review (24 Oct, #50): grown leftwards from the pond with grow_stage.py; route feature repainted; seams joined.",
"route": {
"walk": [
[
[
0,
441
],
[
480,
441
],
[
480,
401
],
[
620,
401
],
[
620,
361
],
[
760,
361
],
[
760,
321
],
[
1320,
321
],
[
1320,
361
],
[
1460,
361
],
[
1460,
401
],
[
1600,
401
],
[
1600,
441
],
[
2160,
441
]
]
],
"structure": [
[
930,
170,
1140,
321
]
],
"ladder": [
[
1150,
170,
1180,
321
]
]
},
"keyed": false,
"colours": 256
},
{
"id": "hg-3-0",
"title": "Hidden Garden · the boardwalk",
"inputs": [
"repo:art/locations/images/hidden-garden-clean.png",
"repo:art/direction/images/style-master-preview.png"
],
"prompt": "A timber boardwalk on low wooden posts runs through tall golden reeds. Its walking surface is at y=441 from x=0 to x=880. At x=880-1000 the boardwalk is broken off: a 120 px gap over dark ditch water (the water surface at y=500). From x=1000 the boardwalk continues at y=441 to x=1500, then a low stone path at y=441 continues to the right edge, where it meets the stone path and the low wall of the existing strip. Three flat stepping stones stand in the ditch below the gap, tops at y=480, at x=900, x=940 and x=975, as a lower way across. Late-afternoon autumn light from the left, golden reeds, orange and yellow trees, a hazy blue conifer line far behind, warm stone and weathered timber, as in the pond chunk next to it. The walkable surface is clearly readable: a lit top edge, darker below.",
"factor": 1,
"review": "To review (24 Oct, #50): grown leftwards from the pond with grow_stage.py; route feature repainted; seams joined.",
"route": {
"below": [
478,
"water"
],
"walk": [
[
[
0,
441
],
[
880,
441
]
],
[
[
1000,
441
],
[
2160,
441
]
],
[
[
890,
470
],
[
925,
470
]
],
[
[
935,
470
],
[
965,
470
]
],
[
[
972,
470
],
[
995,
470
]
]
]
},
"keyed": false,
"colours": 256
},
{
"id": "hg-4-0",
"title": "Hidden Garden · the bench and the pond",
"factor": 1,
"keyed": false,
Expand All @@ -24,4 +308,4 @@
]
}
]
}
}
12 changes: 10 additions & 2 deletions art/stages/hidden-garden/chunks.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
{
"region": "hidden-garden",
"note": "Chunk ids are grid positions (column-row); art names the plate each state is drawn on.",
"chunks": {"hg-0-0": "hg-0-0"},
"art": {"clean": "images/{chunk}.png"}
"chunks": {
"hg-0-0": "hg-0-0",
"hg-1-0": "hg-1-0",
"hg-2-0": "hg-2-0",
"hg-3-0": "hg-3-0",
"hg-4-0": "hg-4-0"
},
"art": {
"clean": "images/{chunk}.png"
}
}
Binary file modified art/stages/hidden-garden/collision/hg-0-0.clean.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading