Initial commit

This commit is contained in:
James Campbell
2026-07-21 19:36:02 -04:00
commit d84e4627c3
39 changed files with 4386 additions and 0 deletions

88
levels/level1.yaml Normal file
View File

@@ -0,0 +1,88 @@
# Level 1 — "Low Battery"
# A gentle-ish introduction to the fact that nothing here can be trusted.
#
# Map legend: #=solid -=one-way platform P=spawn G=goal(charger) .=empty
# Trap coords are [col, row], 0-based from the top-left of the map.
name: "1 — Low Battery"
tile_size: 32
battery_seconds: 40
map: |
.........................
.........................
.......#####.............
.........................
.........................
..............#####......
.........................
....###..................
.........................
.................####....
.........................
.P.....................G.
##########.###.##########
traps:
# The 4th tile of this ledge isn't really there — a classic pit-trap step.
- type: block
at: [7, 7]
fake: true
# A rhythmic floor spike near the start. Timed, so you can learn to read it.
- type: spike
at: [5, 11]
direction: up
trigger: { timer: { interval: 1.2, up_time: 0.7 } }
# The little island between the pits looks safe. It is — for a quarter
# second. Keep moving and you pass; hesitate and it strikes.
- type: spike
at: [12, 11]
direction: up
trigger: { within: 1.6 }
delay: 0.25
# A wall turret raking the upper platform with arrows (always firing).
- type: arrow_shooter
at: [22, 5]
direction: left
speed: 240
interval: 1.4
# This tile extends the right-hand ledge... until you step over it, then it
# drops (mode: once — extends while triggered, retracts when not). Two
# conditions: you're close AND directly above it. Because the sensors track
# the block, it keeps dropping as you ride it down.
- type: block
at: [21, 9]
move: [0, 4]
speed: 220
sense: current # rides down with you (senses from its live position)
trigger:
all:
- { within: 5 }
- { dir: above, aligned: true }
# A ferry platform between the low ledges — ride it, don't rush it. A patrol
# is just a block with a path and (the default) `always` trigger.
- type: block
at: [9, 10]
path: [[9, 10], [14, 10], [14, 6]]
mode: loop
speed: 110
sprite: patrol_block
# A stepping block that gives way a beat after you land on it.
- type: block
at: [16, 11]
crumble: true
crumble_delay: 0.4
respawn: 2.5
# An invisible catch-wall below the dropper — a vertical array of invisible
# blocks (this is what used to be an invisible_wall).
- type: block
at: [22, 10]
invisible: true
count: [1, 3]

104
levels/level2.yaml Normal file
View File

@@ -0,0 +1,104 @@
# Level 2 — "3% Remaining"
# Shorter fuse, meaner traps, more things that move when you least want them to.
name: "2 — 3% Remaining"
tile_size: 32
battery_seconds: 32
battery_pct: 4 # bar reads ~empty to match the theme (real time is 32s)
map: |
.........................
....#####................
.........................
.........................
.......----........###...
.........................
...###...........###.....
.........................
..........#..#...........
.........................
.P..................G....
#####.####.#####...######
traps:
# Ceiling spikes that stab down when you pass beneath — proximity triggered.
- type: spike
at: [8, 2]
direction: down
trigger: { within: 2.0 }
# A static spike hazard in the middle lane (a deadly block = spike block).
- type: block
at: [13, 4]
deadly: true
- type: block
at: [13, 5]
deadly: true
- type: block
at: [13, 6]
deadly: true
# A spiked platform patrolling the low run — jump it, never land on it.
# (Demonstrates a *mobile* mount: a block rides the patrolling block AND runs
# its own motion, lunging up to catch a player leaping over while it keeps
# sliding left/right with its carrier. Spikes ride on top of that block.)
- type: block
at: [6, 10]
path: [[6, 10], [9, 10]]
mode: pingpong
speed: 130
sprite: patrol_block
mounts:
# Rests one tile above the patrol block; springs three tiles up when the
# player is above it, then settles back — all while riding along.
- type: block
at: [0, -1]
move: [0, -3]
speed: 320
mode: once
trigger: { dir: above, range: 5, aligned: true }
mounts:
- type: spike
at: [0, -1] # spikes on top of the lunging block, riding with it
trigger: always
direction: up
# Two of the mid platform's tiles are fake — the middle looks fully floored.
- type: block
at: [11, 8]
fake: true
- type: block
at: [12, 8]
fake: true
# A block that slides sideways into you as you approach the gap.
- type: block
at: [16, 6]
move: [-3, 0]
speed: 260
trigger: { within: 3.0 }
# Crossfire: turrets from both walls at the goal approach.
- type: arrow_shooter
at: [23, 8]
direction: left
speed: 300
interval: 1.1
- type: arrow_shooter
at: [0, 4]
direction: right
speed: 220
interval: 1.7
trigger: { within: 8 }
# The single pillar before the goal (col 17 on the floor row) is a lie.
- type: block
at: [17, 11]
fake: true
# Crumbling stairs up to the exit.
- type: block
at: [19, 9]
crumble: true
crumble_delay: 0.3
respawn: 2.0