pixelsp33d.de — Build Plan
A pixel-art parallax sidescroller. Player avatar Pixel, antagonist kn00t, levels narrated by Moritz (alias pixelsp33d). Levelling up = gaining speed.
1. Asset inventory (gathered — all in assets/src/)
| Source | What it actually is | Use |
|---|---|---|
pixelsp33d.jpg (150×150) | Orange blob/taco with eyes + “PIXEL” wordmark. YT/Discord avatar | HUD score badge (as specced) |
pixel/robot3bild, pixel/unknown | Voxel/Minecraft-style robot: white body, cyan eyes, copper antenna, control panel, copper feet | Player sprite base (proposed) |
pixel/kleki_2021_06_03 | Hand-drawn brown mouse/bear head | Interlude art / secret |
kn00t/gdrive/*.png | 8 native 16×16 pixel-art portraits: Cyber, Diving, EvilOriginal, God, InBlack, OpenHair, RedShirt, Lazy | Per-level boss forms — zero conversion needed |
kn00t/kn00t_1..3.webp | 3 more kn00t busts (straw hat / top hat / eyepatch), ~16×16 upscaled | Extra boss forms, dialogue portraits |
kn00t/kn00t_67.gif | 2-frame kn00t idle loop, straw hat + rainbow shirt | The “6-7” special cameo (spec req.) |
kn00t/nifty_1 | kn00t full-body wizard, yellow hat, rainbow shirt | Boss full-body sprite reference |
kn00t/nifty_2 | Red mushroom house with rainbow-lit door | Level scenery / hub |
kn00t/nifty_3 | Yellow horned creature, blue eyes | Collectible companion / powerup |
kn00t/nifty_4 | Red “piXELSP33D” wordmark | Title screen logo |
bg/signal-*.jpg ×5 | Real photos by Moritz: puffy blue sky · mackerel sky w/ tree · field w/ power pylons · 2× above-the-clouds from a plane wing | Parallax backgrounds, one set per level |
video/VID-20210802-WA0000.mp4 (3.2s) | Hand-drawn stick-figure flipbook on lined paper | Prequel cutscene |
video/VDSL_Video_1622044168870.mp4 (18.2s, w/ audio) | nifty.ink drawing replay — art appearing stroke by stroke | “Meanwhile …” interlude |
Everything downloaded: Discord CDN links all live (11 files), gdrive kn00t/ folder pulled via rclone (16 files), local photos + videos copied in (originals left in place — nothing moved or deleted).
2. Design decisions
Items (spec asked me to decide food vs. obstacle)
| Item | Role | Effect |
|---|---|---|
| Pizza | Food | +10 energy |
| Kebap | Food | +25 energy |
| vegan Schnitzel | Food (rare, Moritz’s own) | +40 energy, full heal |
| Lidl River Cola | Speed pickup | +1 speed tier — the levelling currency |
| Football | Context-dependent | Obstacle everywhere (−15 energy, knockback) — except the Soccer level, where it’s the objective |
Rationale: speed is the progression axis, so exactly one item grants it. The football flipping role between levels is the cheap trick that makes the Soccer scene feel authored rather than reskinned.
Egg-dish enemy family (from the 2026-08-02 family-lunch brainstorm)
A moving opponent in the spirit of the Commander Keen snail — Moritz’s own dislike of Eierspeisen (egg dishes) made the antagonist. Two variants of the same creature, opposite intent. Prototyped and working in the Lidl Lunch level.
| Item | Role | Effect |
|---|---|---|
| Drop Chicken | Harmless, patrols like a Keen snail | +8 energy on contact — safe, even edible |
| Poison Egg | Obstacle, patrols like a Keen snail | −35 energy on contact (harder-hitting than Football — “possibly fatal”) |
| uervel knight | Powerup | Once collected, touching a Poison Egg defeats it instead of damaging the player (+5 energy, counts as a collected item) |
The knight is deliberately scoped to counter only the egg-dish family, not Football — different scene, different mechanic, keeps each obstacle type meaningful on its own.
Secret areas & the uervel knight’s second path
The brainstorm gave the knight two ways to earn it: (1) a hard-to-reach placed item, (2) a hidden level behind a Commander-Keen-style “pipe.” Path 1 is what’s implemented today (the knight sits on a jump-up crate in Lidl Lunch). For path 2 and other secrets, three portal ideas came out of discussion — each assigned a distinct role rather than left redundant:
- Minigolf hole (chosen) — sinking into the cup instead of finishing the hole normally is the portal into a hidden bonus level, the project’s answer to Keen’s pipe. Natural fit since Minigolf is already planned as level 1.
- Mushroom house door — the kn00t nifty.ink art (
assets/src/kn00t/nifty_2.webp, red mushroom house with a rainbow-lit door) is already drawn and already “his.” Leaning toward combining it with a treasure trove: a separate bonus-loot secret, not knight-related, reachable through that door. - River Cola crate stack — good secret-entrance idea, earmarked for a later level (not yet assigned); a stack of crates at the back of a level as a crawl-in point, no new art needed.
None of these hidden levels are built yet — this section records the decision on what each secret is for, ahead of P4 level construction.
Movement → level mapping
Each level teaches one verb and reuses the previous ones.
| # | Scene | Verb | Background | Boss form |
|---|---|---|---|---|
| 0 | Prequel | — | lined paper | — |
| 1 | Minigolf | Jump | mackerel sky + tree | Lazykn00t |
| 2 | Lidl Lunch | Walk / Run | puffy blue sky | kn00tInBlack |
| 3 | Soccer w/ friends | Run (sprint) | field + power pylons | kn00tRedShirt |
| 4 | Tanzstunde | Sneak (rhythm) | mackerel sky, dusk grade | kn00tOpenHair |
| 5 | Above the Clouds | Fly / Jet | plane wing ×2 | Cyberkn00t → EvilOriginalkn00t |
| ★ | Post-game | all | — | Godkn00t |
Divingkn00t is held for a bonus/underwater stage. The 6-7 gif cameos as a non-hostile easter egg between levels 3 and 4. Minigolf’s hole doubles as the secret portal to the hidden bonus level (see Secret areas above).
Player sprite set (10 sprites, the spec’s ceiling)
idle · run_1 · run_2 · run_3 · run_4 · jump_rise · fall · sneak · fly · hurt
Derived from the voxel robot at 16×24 px, palette-locked.
3. Technical approach
Locked decisions (2026-08-02): player = the voxel robot · vanilla TypeScript + Canvas2D · static dist/ build, hosting deferred · narration ships as timed captions with empty audio slots.
- Internal resolution 384×216, integer-scaled to viewport. Nearest-neighbour everywhere. No sub-pixel positions for sprites — that’s what kills pixel art.
- Parallax: 4 layers per level (far sky · cloud band · midground silhouette · ground), each a strip pixelized from the source photo, scroll factors
0.1 / 0.25 / 0.55 / 1.0. Speed tier multiplies scroll rate, so levelling up is visible in the background, not just a number. - Pixelization pipeline: ImageMagick script, committed and re-runnable — downsample → quantize to a shared 32-colour palette → optional Floyd-Steinberg on skies only → upscale for layer strips. Source art stays in
assets/src/, generated art inassets/gen/. Never hand-editgen/. - Cutscenes: videos → frame-extracted at ~8fps → pixelized → played back as sprite-sheet animations in-canvas. Keeps everything one renderer, no
<video>element, no codec worries. - Narration: per-level timed caption track (German, in the voice of pixelsp33d) plus an audio slot per line, empty for now. Dropping in Moritz’s recordings later is a data change, not a code change.
- Build: Vite → static
dist/, no server requirement. Deployable to any static host when the domain is ready; the atproto score layer (P6) is the only piece that will later want a Worker or equivalent.
atproto integration
Pentaract is early — only games.gamesgamesgamesgames.game is published; scores/achievements are conceptual, not implemented. So:
- Publish one
games.gamesgamesgamesgames.gamerecord for pixelsp33d (name, summary, type, modes) — real interop where it exists. - Define our own
de.pixelsp33d.*lexicons for what Pentaract lacks:run(a scored playthrough),trophy(incl. the opcraft-themed one),speedTier. Shaped to be replaceable by Pentaract equivalents when they land. - Scores render with the PIXEL blob badge, as specced.
4. Phases
| Phase | Output | Rough size |
|---|---|---|
| P0 Asset pipeline | tools/pixelize.sh, palette, assets/gen/ populated, contact sheets to eyeball | small |
| P1 Player + kn00t sprites | 10 Pixel sprites, boss sprite sheets from the 16×16 portraits | medium |
| P2 Engine core | canvas loop, fixed timestep, input, integer camera, 4-layer parallax, collision | medium |
| P3 Gameplay | energy/speed model, items, obstacles, the 5 movement verbs, boss encounters, egg-dish enemy + uervel knight — done, prototyped in Lidl Lunch | large |
| P4 Levels 1–5 | level data files, per-level backgrounds, tuning, the three secret-area portals (Minigolf hole, mushroom-house treasure trove, River Cola crate stack) | large |
| P5 Narrative | prequel/interlude/sequel cutscene player, caption system, narration slots | medium |
| P6 atproto + score | game record, run/trophy lexicons, score screen with PIXEL badge | medium |
| P7 Ship | static dist/ build + mobile touch controls; deployment to pixelsp33d.de left to you | small |
Playable vertical slice = P0–P3 with level 2 only. That’s the first thing worth showing Moritz.
5. Open dependencies
- Narration audio from Moritz (not blocking — caption-first).
- Hosting choice for pixelsp33d.de, deferred by decision. Build stays host-agnostic until then.
- Pentaract’s score/achievement lexicons don’t exist yet; our
de.pixelsp33d.*records are the stopgap and may need migrating if upstream lands equivalents. - Discord CDN links in
ASSETS.txtare signed and will expire — assets are already pulled intoassets/src/, so this only matters if we need re-downloads.