Male eine begrenzt lange Zündschnur über ein Feld explosiver Objekte, zünde ein Ende an,
schau der gestaffelten Kettenreaktion zu. Ziel dieses Prototyps: prüfen, ob der Sog trägt
(Fremder-Sog-Test, 3–5 Tester ohne Erklärung). Voller Kontext:
../webgame-planung/PROTOTYPE-KICKOFF.md + PLANNING.md §4/§5/§6.
npm install
npm run dev # Dev-Server (http://localhost:5187)
npm run build # Portal-Build nach dist/ (~1,2 MB, < 8 MB)
npm test # 159 Unit-Tests des deterministischen Kerns
npm run sim # Balance-Simulation: 16-Ante-Tabelle (Potenzial/Ziel/5 Draft-Profile)
npm run check # gibt es nicht — nutze: npm run typecheck && npm test && npm run build- Ziehen = Zündschnur malen. Das Wire-Budget (oben links) zählt runter und kappt hart bei 0.
- Tippen (auf ein Schnur-Ende) = zünden. Die Flamme läuft die Schnur ab, getroffene Objekte explodieren, ihr Boom-Radius reißt Nachbarn gratis mit (die eine Gratis-Combo).
- Nochmal ziehen vor dem Zünden = neu malen.
- Ziel schlagen → weiter: nach jedem Board ein Upgrade-Draft (1 von 3), dann das nächste, schwerere Board. Ziel verfehlt → Run-Tod.
- Nach dem Run-Tod irgendwo tippen = neuer Run (Board 1, fixer Run-Seed).
Fass = großer Boom-Radius (Hub), Böller = kleiner. Auf Board SEED 173:
- Ein Cluster antippen kostet ~47px Draht → ~6 Objekte.
- Die gerade Brücke zwischen beiden Hub-Fässern kostet ~405px → alle 13, Combo bis 11. Der Multiplikator klettert nur an den gratis mitgerissenen Objekten hoch → wer aus wenig Draht eine große Kette zündet, kassiert die späten, hoch multiplizierten Booms.
Der Fuse-Frenzy-Loop ist zu einem Run gestapelt: eine Kette generierter Boards mit
steigendem Ziel. Schlägst du das Ziel eines Boards, wählst du 1 von 3 Upgrades und
spielst das nächste, schwerere Board; verfehlst du es, ist der Run vorbei. Der beste
Run-Score liegt in localStorage.
- Board pro Ante — die Objektzahl wächst pro Ante (
RUN.board, 11 → 26), ab Ante 3 wachsen auch die Boom-Radien (RUN.radius, +5 %/Ante, Cap +40 %); fixer Run-Seed (RUN.seed) für Vergleichbarkeit. - Korridor-/Struktur-Seed-Scan (
RUN.seedScanK,RUN.structure) — pro Ante werden 64 Kandidaten-Boards bewertet: kein Langweiler-Start, das Ziel steigt garantiert monoton, und in Antes 4–11 hat jedes Board einen Neben-Cluster (15–40 %), den die beste Einzel-Zündung nicht erreicht — Headroom für Taktik-Karten. Details: Spec §3A. - Ziel-Kurve (exponentiell) — Ziel = Basis-Potenzial des gescannten Boards (OHNE
Spieler-Upgrades) ×
baseFraction×growthFactor^(Ante−1) (RUN.target). Kein Deckel: die Kurve holt jeden Build ein, Run-Länge = Build-Stärke. Kalibriert pernpm run sim: ohne Drafts Tod ~Ante 3–5, gemischt ~10, bester Build (Stats) ~11. - Kaskaden-Zoo (Slice 1.5): Ab Ante 3 Zeitzünder (lädt 450 ms auf, dann fetter
Boom — Wellen-Rhythmus), ab Ante 5 Gaskanister (explodiert als gerichteter Strahl,
Richtung pro Board zufällig), ab Ante 2 Überladung (glühendes Objekt: +2 Combo-Steps,
wenn es als Ketten-Glied explodiert — belohnt Routing durch es). Der Board-Mix
verschiebt sich pro Ante (
RUN.mix: früh fasslastig, spät böllerlastig). - Upgrades ohne tote Karten (
src/game/upgrades.ts, Pool 10 Karten): Zweite Schnur (wird nach Kauf zur Leiter „Längere zweite Schnur", 0.6 → 0.8 → 1.0), Doppel-Zündung (einmalig), Lange Lunte (+40 % Draht / −20 % Boom, einmalig), Sprung-Segment / Größere Booms / Steilere Combo / Mehr Punkte / Fette Zeitzünder / Gas-Booster / Kettenzünder (stapelbar). Besessenes verschwindet aus dem Draft-Pool (availableUpgrades). - Reiner Kern, test-first —
upgrades/targeting/runund der geteiltepropagateFromArrival/fuseSeedTimes-Kaskaden-Kern sind rein und getestet; die Szene spielt den Run nur ab (im Browser verifiziert, Run bis Ante 11 = kalibrierter Stats-Tod). - Meta (Slice 2): Random-Seed pro Run (jede Kette neu; der Kern bleibt pro Seed
deterministisch). Zünder-Währung: 1 pro geschaffter Ante, auch im Fehl-Run;
Meilensteine beim ersten Erreichen von Ante 5/8/11 (+10/+20/+30, einmalig, sofort
gutgeschrieben). Unlock-Shop am Run-Ende: Basis-Pool = die 6 Slice-1-Karten, die
4 Zoo-Karten kosten 15/25/35/50 Zünder; danach Start-Loadouts (Tradeoffs:
„Schnurmeister"/„Doppelzünder" — Werkzeug ab Start, −10 % Draht) für 60/80. Alles in
einem
localStorage-JSON (fuseFrenzy.meta.v1), rein insrc/game/meta.ts. - Feel & Sound: Synthetische SFX (
src/game/audio.ts, WebAudio, keine Asset-Dateien) mit Combo-Pitch (jeder Ketten-Boom klettert einen Halbton — die Kaskade wird hörbar wilder), Boom-Klang pro Objekt-Typ, Zeitzünder-Ticken, Meilenstein-/Kauf-/Run-Tod-Sounds. Mute-Knopf (🔊/🔇) im HUD, persistiert. Leiser Ambient-Loop, dessen Intensität mit der Ante steigt (AUDIO.music: falseschaltet ihn ab). Juice: Zeitlupen-Hit bei fetten Combos, Überladungs-Flash, Combo-Partikel, HUD-Puls beim Zielbruch. Textfreie Geister-Schnur beim allerersten Board (verschwindet bei der ersten Berührung). Die Backend-Naht (SoundBackend) ist für ein späteres Sample-Upgrade vorbereitet. - Balance-Sim (
npm run sim,scripts/balance-sim.ts) — deterministisches Spielermodell (Greedy-Schnur, Taktik nur wenn nützlich, Sprung modelliert) über 16 Antes × 5 Draft-Profile (inkl. „gemischt (Basis-Pool)" = Neuspieler ohne Unlocks). Jeder Knopf-Dreh ist sofort als Kurve sichtbar.
| Konstante | Wirkung | aktuell |
|---|---|---|
FUSE.wireBudget |
wichtigster Knopf. Full-Clear-Brücke braucht ~405px. | 450 (tight) |
FUSE.flameSpeed |
Wie schnell die Flamme läuft (Zeit ∝ Länge). | 330 px/s |
FUSE.chainStaggerMs |
Lesbarkeit der Kette (Abstand zwischen Boom-Generationen). | 105 ms |
BOARD_SPEC.barrel/firecracker.boomRadius |
Wie weit Booms greifen (Konnektivität). | 165 / 88 |
SCORE_CFG.comboStep |
Wie stark der Combo-Multiplikator klettert. | 1 |
SEED |
Das fixe Test-Board (Scheibe 0). | 173 |
RUN.target |
wichtigster Run-Knopf: exponentielle Ziel-Kurve (Basis-Anteil, ×g/Ante). | 0.24 / 1.45 |
RUN.boomFactorStep / basePointsBonus / comboStepBonus |
Stärke der Stat-Picks. | +30 % / +100 / +1 |
RUN.secondFuseBudgetStep / Max |
Leiter der zweiten Schnur. | +0.2 bis 1.0 |
RUN.structure |
Neben-Cluster-Fenster (Taktik-Headroom, Antes 4–11). | 0.15–0.4 |
RUN.seedScanK |
Kandidaten pro Ante im Seed-Scan (Board-Qualität). | 96 |
RUN.mix |
Typ-Mix pro Ante (Start-Antes Zeitzünder/Gas, Fass-Anteil). | timed@3, gas@5 |
RUN.overcharge |
Überladung: Start-Ante, Anzahl, Combo-Bonus. | @2 / 1 / +2 |
BOARD_SPEC.timed / gas |
Zeitzünder-Verzögerung/-Radius, Strahl-Maße. | 450 ms/210 · 260×56 |
RUN.meta |
Zünder-Ökonomie: Verdienst, Meilensteine, Preise, Loadout-Malus. | 1/Ante · 5/8/11 · s. config |
AUDIO |
Sound-Lautstärken, Ambient an/aus, Combo-Pitch-Cap. | Master 0.5 · Musik 0.12 · Cap 12 |
SOUNDS (audio.ts) |
Synth-Definition je Sound-Event (Feel-Knopf). | 14 Events |
JUICE.slowmo* / flash* |
Zeitlupen-Hit-Schwelle/-Stärke, Überladungs-Flash. | Combo 8 · 0.35× · 350 ms |
Deterministischer Kern (getestet, rein, viewport-unabhängig) getrennt vom Feel:
game/rng.ts— mulberry32, seed → identische Sequenz.game/geometry.ts— Polyline-Länge, Punkt→Segment-Projektion,firstTouchArc(erstes Berühr-Intervall → Zünd-Bogenlänge).game/board.ts— Board aus Seed (Rejection-Sampling, Mindestabstand, Typ-Verteilung).game/propagation.ts—computeCascade: Dijkstra über Ankunftszeit, jedes Objekt genau einmal, zeitlich sortierte Detonations-Liste.game/scoring.ts— Combo-Multiplikator an den Chain-Detonationen.scenes/GameScene.ts— spielt diese Liste als Timeline ab (Flamme, Boom-Ringe, Screenshake, Zahlen-Pop) + Zeichnen/Zünden/Restart. Feel-Schicht, im Browser verifiziert.
- Kein Onboarding — Absicht, kein Bug. Der Kickoff verbietet Tutorial/Onboarding ausdrücklich; der Fremdtest misst genau, ob der Tester von selbst eine Schnur zieht. Zieht niemand → das ist ein valides Hypothesen-Signal, kein Defekt. Fallback (Backlog): eine minimale, textfreie Geste-Andeutung (Geister-Schnur), falls der Sog am „ersten Zug" scheitert.
- Schleifen-Schnur — Zündzeitpunkt gefixt, Tiefenordnung noch offen. Malte man eine
Schnur, die dasselbe Objekt zweimal passiert (erst streifend, dann näher), zündete es
erst beim zweiten, näheren Vorbeilauf. Behoben:
firstTouchArc(geometry.ts) zerlegt die Polyline in zusammenhängende Berühr-Intervalle und nimmt im ersten den nächsten Punkt; bei einfacher Passage ist das Ergebnis bitgleich zu vorher,npm run simbyte-identisch. Die Polyline wird dafür beiignitionEnd: 'end'umgedreht (sonst wäre die Doppel-Zündung falsch — durch Test abgesichert). Varianten und Verwerfungen:docs/explore/schleifen-schnur.md. Ebenfalls behoben (Tiefenordnung): Der Flammenkopf lag auf Depth 9/10 vor den Körpern (5) und verdeckte ein noch nicht detoniertes Objekt beim Passieren. Er liegt jetzt auf 4 — vor dem gebrannten Draht (3), hinter den Körpern (5); die Flamme läuft hinter den Objekten durch, genau wie die Schnur ohnehin gezeichnet wird (GameScene.ts:762-765). Am Gerät noch gegenzuprüfen: in dichten Boards (Ante 10+, ~24 Objekte, Radien +40 %) könnte die Flamme dadurch schlechter zu verfolgen sein. Rückweg ist eine Zeile. - Zündzeiten sind balance-relevant, nicht kosmetisch. Merksatz aus dem obigen Fix:
scoreCascade(scoring.ts:41) hebt den Multiplikator nur ancause === 'chain'. Verschiebt ein Eingriff Seed-Zeiten global nach vorn, kann ein Objekt vonfusezuchainkippen und der Score wandert — deshalb war der naheliegende Fix („erster Eintritt in den Berührradius", verschiebt jede Zündung um bis zu 91 ms) trotz kleinem Diff die teure Variante. Jede künftige Änderung anfuseSeedTimesgehört gegennpm run simgeprüft, nicht nur gegen die Unit-Tests. - Ziel-Kurven-Feinschliff ist ein Playtest-Knopf. Die Kurve ist per Sim kalibriert
(ohne Drafts Tod 3–5, gemischt ~10, Stats ~11), aber ob sie sich am Finger fair
anfühlt, entscheidet der Fremdtest —
RUN.target(baseFraction/growthFactor) bleibt der wichtigste Balance-Knopf. - Taktik-Karten sind Feel-Optionen, keine Score-Maschinen (bewusst, Slice-1-Stand). Auf gut vernetzten Boards schlägt Stat-Stacking jede Reichweiten-Taktik (der Combo-Multiplikator klettert nur an Ketten-Gliedern — jeder Seed kostet eines). Der Struktur-Scan gibt zweiter Schnur & Co. in Antes 4–11 echtes Terrain (Neben-Cluster), aber der stärkste Build bleibt Stats. Echte Build-Diversität (Synergien, multiplikative Taktik) = Slice-1.5-Backlog; ob die Taktik-Karten sich am Gerät gut anfühlen, prüft der Fremdtest.
- Sprung-Segment-Geste braucht Geräte-Feintuning (Scheibe 1). Ein Sprung wird ausgelöst,
wenn ein einzelner Zug eine Lücke >
FUSE.jumpGapüberbrückt und eine Ladung frei ist (nur mit dem Upgrade). Der Schwellwert ist heuristisch; ob er sich am Finger natürlich anfühlt (keine versehentlichen Sprünge bei schnellen Zügen), ist am echten Gerät zu prüfen. Ohne das Upgrade ist das Zeichnen unverändert.
Level-Editor, Objekt-Zoo, weitere Combos, Sterne, echter Daily-Wechsel, Leaderboard, Poki-SDK/Ads, Meta/Skins, Sound, Tutorial, finale Art. Baudrang → ins Backlog, nicht bauen.