Commit Graph
75 Commits
Author SHA1 Message Date
duffyduck 2fd654e963 Level-1-Video ausgewertet (Runde 1): Levelausgang = Tor in Blaetterwand, Summary zaehlt animiert hoch, Original-Charakterwahl mit Ganzkoerper-Sprites, Gegner-Kandidat gesichtet 2026-07-26 12:34:56 +02:00
duffyduck daa6994065 Mapper-Fix: VOLLSTAENDIGE Default-Belegung (145 Bindings, per Mapper-UI generiert) + nur hand_video auf F12 -- die 1-Zeilen-Datei hatte alle anderen Tasten gekillt 2026-07-26 12:22:45 +02:00
duffyduck 916f67a455 F12 = DOSBox-Videoaufnahme (mapper-tony.map; Strg+Alt+F5 kollidiert mit Linux-Konsolenwechsel) -- headless verifiziert: ZMBV 70fps + Tastatur intakt 2026-07-26 12:16:40 +02:00
duffyduck 6123320d07 DOSBox-Config: captures-Ordner fuer Stefans Durchspiel-Aufnahmen (Strg+Alt+F5) 2026-07-26 12:09:40 +02:00
duffyduck be1a77d95f Coco-Ast-Trigger auf nicht-solide Bit-8-Tiles beschraenkt (Standard-Boden ctype 40 enthaelt Bit 8 -- kein Festhalten an Waenden) 2026-07-26 12:06:40 +02:00
duffyduck 892d08f316 Levelende v1: Exit-Zone -> Zusammenfassungstafel (Original-Layout) -> Kartenfortschritt; TIME-OUT/Levelende-Tafeln bleiben bis Enter/Space stehen 2026-07-26 12:05:32 +02:00
duffyduck 291ba090e5 Aus-der-Tuer-Pose kommt immer: auch bei Bestaetigung desselben Charakters Spawn-Pose + Idle-Timer-Reset (Stefans Fund) 2026-07-26 12:01:07 +02:00
duffyduck 00320ef10b Duck-Blitzer beim Sprung entfernt, Stehen nach Spawn immer Slot 10 (020.png) statt frontal 17 2026-07-26 11:59:24 +02:00
duffyduck 8978fc7996 Kartenspur zwischen fertigen Leveln blau (KARTE3), zum aktuellen Punkt orange (KARTE1) -- Stefans Level-2-Durchspiel 2026-07-26 11:52:26 +02:00
duffyduck bced7ea1d1 Seitliche Steh-Pose = Slot 10/BOB 20 (Stefans Fund, alle Charaktere) -- Absprung-Hocke wieder Duck-Frame 2026-07-26 11:47:22 +02:00
duffyduck 7766692571 Karten-Fortschritt wie im Original: erledigte Punkte blau, bereister Weg als orange Punktspur, Unerreichtes unsichtbar (Stefans Durchspiel-Screenshots) 2026-07-26 11:38:55 +02:00
duffyduck 1cb0a12134 Wasser-Schaden auf Original-Messwert: sofort beim Eintritt, dann alle 3.8s (w1l1_run-Aufnahme, Herz-Pixelzaehlung) 2026-07-26 11:32:51 +02:00
duffyduck 5fd8a1a6e6 TIME-OUT-Tafel wie im Original (Menue-Rahmen + gelbe Schrift, 2.5s, dann Leben -1 und Respawn) 2026-07-26 11:29:45 +02:00
duffyduck fc3149a7a6 Sprungweite +1 Blattlaenge: AIR_SPEED_FACTOR 1.27 (Sprungweite 92->114px), Sprunghoehe zurueck auf -400 -- 'nicht hoeher sondern weiter' 2026-07-26 11:21:27 +02:00
duffyduck 0e8d38923a Sprunghoehe 3. Feinjustage: -430 (Scheitel ~99px, +1 Blattlaenge -- Stefans Live-DOSBox-Vergleich) 2026-07-26 11:19:11 +02:00
duffyduck 104d9a2a64 Sprungphasen korrekt: Slot 8 aufwaerts / Slot 9 fallen (Stefans Zuordnung), seitliches Stehen = Slot 0 2026-07-26 11:17:11 +02:00
duffyduck 98dbc3e69f Steh-Pose final: frontal (17) nur am Spawn/vor erster Bewegung, danach seitlich (8) -- Stefans Original-Screenshots 2026-07-26 11:12:10 +02:00
duffyduck bcd29cbc61 Steh-Pose auf Slot 17 (frontal, wie DOSBox-Referenz) korrigiert; Slot 8 nur noch als 0.17s-Uebergangspose, Idle-Warteanimation nach 4s 2026-07-26 10:59:34 +02:00
duffyduck b9532758cb Timeout-Fix: Levelzeit 0 loest Sterbeanimation + Leben-Abzug aus, Respawn mit frischer Zeit 2026-07-26 10:48:46 +02:00
duffyduck 696e3c1d8e ARE-Format geknackt (Sektor-Tabelle + Objektrecords, tools/are_dump.py): echte Item-/Tuer-/Gegner-Positionen -- plus Smacks' Wasserblasen v1 (ALT beim Schwimmen) 2026-07-26 03:10:21 +02:00
duffyduck 5afe598337 Sprunghoehe 2. Feinjustage: JUMP_VELOCITY -400 (Scheitel ~86px) -- Tony-Kopf am Ast, Smacks-Kopf am Blatt, per Level-Render verifiziert 2026-07-26 03:02:12 +02:00
duffyduck dc3cb3485d Sprunghoehe auf Ast/Blatt-Referenz justiert: JUMP_VELOCITY -380 (Scheitel 77px) -- Tony-Kopf erreicht den Ast, Smacks-Kopf das Blatt, gleiche Sprungkraft wie im Original 2026-07-26 02:46:38 +02:00
duffyduck 73b972ddd1 Spawn-Pose nach Leertasten-Charakterwechsel: gehaltene Menuetaste (jump_lock) bricht die Arm-hoch/Daumen-Pose nicht mehr ab 2026-07-26 02:37:51 +02:00
duffyduck ea644d094c Sterbe-Drops auf Slots 20/21 korrigiert (rotes Tuch/oranges Cappy statt lila 48/49) + Leertasten-Leak nach Tuer-Menue per jump_lock gefixt 2026-07-26 02:33:26 +02:00
duffyduck 6847f9be8c Smacks-Tauchsteuerung: sanftes Auf-/Abtauchen mit Hoch/Runter, Schwimmanimation bei jeder Bewegung, Space=Stoss/Oberflaechensprung (Hoch springt nicht mehr) 2026-07-26 02:05:03 +02:00
duffyduck eb798a825e Wasserschaden-Fix: can_swim statt swimming pruefen -- Smacks verlor beim Oberflaechensprung Herzen (swimming ist dort kurz False, obwohl noch im Wasser) 2026-07-25 18:39:16 +02:00
duffyduck 09264109ca Charaktersystem komplett auf Original-Slots umgebaut: alle 4 Figuren mit echten Animationen, Toucan-Flug, Coco-Hangeln, Smacks Sprung/Duck-Fix, Anker aus BOB-Headern, Wasser-Sofortschaden 2026-07-25 16:10:21 +02:00
duffyduck 6ac9d7fc6b NOTES: Animationssystem komplett dekodiert (BOB-Header = Slot+Anker, +50-Richtungsregel, universelle Slot-Semantik, Toucan-Flugphysik) 2026-07-25 15:53:20 +02:00
duffyduck ac6a736d28 Weltkarten-Daten fest eingebettet (SEGMENTS/LEVEL_NAMES), parse_worldmap raus aus dem Spiel -- Extraktor als tools/worldmap_extract.py, Laufzeit braucht nur noch PCKELL.DAT 2026-07-25 14:59:11 +02:00
duffyduck 9b5a5afce0 README: START.EXE als optionale Laufzeit-Abhaengigkeit der Weltkarte dokumentiert 2026-07-25 14:53:19 +02:00
duffyduck ad53d11536 Weltkarte pixelexakt: gemessene Blit-Anker (Basis=(x,218-y)), Punkt steht + Kopf blinkt darueber, Segment/Name-Zuordnung um 1 korrigiert (W1L0 hat keinen Kartenpunkt) 2026-07-25 14:52:49 +02:00
duffyduckandClaude Fable 5 ac5c2c135a Weltkarte: Blit-Anker-Offset (+5,+4) fuer Punkte/Pfad -- Binary-Koordinaten sind korrekt, der Anker stand nicht im Binary
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:38:26 +02:00
duffyduckandClaude Fable 5 bca944810e Weltkarte: y-Flip der Binary-Koordinaten + Original-Blinken (Punkt<->Kopf)
DOSBox-Nachmessung des blinkenden Level-1-Markers (real (59,153) vs
Binary-Label (53,56)): die Binary-y-Achse ist geflippt (screen_y=209-y).
Alle Pfade/Punkte jetzt an den Original-Positionen (W1 Wald unten, W2/W3
Berge/Schloss -- deckungsgleich mit Stefans Original-/Netz-Screenshots,
Kopf-am-Teich = W1L7). An der aktuellen Position wechseln Punkt und
Mini-Kopf im 0.5s-Rhythmus (Original-Verhalten laut Frame-Diff, die
Referenzbilder zeigen jeweils eine Phase).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:31:38 +02:00
duffyduckandClaude Fable 5 68be969e0d WELTKARTE mit Levelauswahl -- Pfad/Punkte/Namen live aus dem Binary
game/worldmap.py: parst Kartenpfad, Levelpunkt-Positionen und die 22
Levelnamen zur Laufzeit aus START.EXE (NE-Datensegment, Anker-Suche,
Fallback W1L1). Links/Rechts laesst die Kartenfigur (Mini-Kopf KARTE4-7
je Charakter) die Original-Wegpunkte ablaufen, der aktive Levelpunkt
blinkt orange/blau (KARTE0/2 -- Blinksequenz stand exakt so in der
Binary-Animationstabelle), Space/Return startet das Level, ESC -> Menue.
Kartenposition bleibt ueber Levelbesuche erhalten.

Level ohne handgepflegte LEVEL_INFO erhalten einen generischen Spawn
(erste Bodenstelle) -- damit sind ALLE 22 Level anwaehlbar und spielbar
(Basis-Physik; Wasser/Tueren dort folgen mit den echten Leveldaten).

E2E: Karte -> laufen -> W1L3 spielen -> zurueck -> W1L2 -> QUIT rc=0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:18:30 +02:00
duffyduckandClaude Fable 5 cdf6da6f7d BINARY-DURCHBRUCH: NE-Overlay geparst, Original-Animationstabellen gefunden
START.EXE = MZ-Stub + ungepackte NE-Executable (Borland DPMI16). Im
DATA-Segment liegen die ANIMATIONSTABELLEN im Klartext (Format
[delay_ticks][frames...]ffff, 70Hz): Engine-Frame x2 = BOB-Frame.
Bestaetigt: Gehzyklus 0-14/17.5fps, Idle 16, Sprung 18, Renn-Rad
26-32. Uebernommen: ECHTE Frosties-Idle-Sequenz (46,48,46,44,...,20x5,
2.8fps) und Original-Anim-Timings (17.5fps Gehen/Rad).

Ausserdem im Binary gefunden: kompletter WELTKARTEN-LAUFPFAD + LEVELPUNKT-
Koordinaten + 22 Levelnamen (Grundlage fuer die Karten-Levelauswahl) und
den "Kellogg's Cheat-Mode" (Level-Waehler). Dump + Offsets in NOTES.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:06:45 +02:00
duffyduckandClaude Fable 5 f7f29a0309 Absprung-Hocke + Tuer-Dimmen (DOSBox-Referenz); Binary-Tabellensuche negativ
Stefans Frage nach Disassembly: Byte-Muster-Suche nach Frame-Tabellen in
START.EXE/RTM.EXE ohne Treffer (nicht als nackte Tabellen im Binary);
stattdessen DOSBox-Frameserie (0.12s) mit Tuer-Charakterwechsel zu Smacks:
- Original-Sprung hat eine Absprung-Hocke (Kauer-Frame im Absprungmoment,
  dann Streckung) -> JUMP_SQUAT_SECONDS=0.09 eingebaut (alle Charaktere).
- Original dimmt den Level waehrend der Tuer-Sequenz ab -> Overlay
  waehrend door_open_t.
- Nebenbei verifiziert: unser Charakter-Menue ist deckungsgleich mit dem
  Original (Layout, graue Koepfe fuer nicht verfuegbare Charaktere).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:56:34 +02:00
duffyduckandClaude Fable 5 200fc6192d Wasser-Regeln (kein Ducken, 1.5s-Schaden), Schadens-Blinken, echte Peek-Frames
- Nicht-Schwimmer koennen im Wasser nicht mehr ducken.
- Herzverlust im Wasser alle 1.5s statt 5s.
- Nach Schaden blinkt die Figur 0.9s (Sichtbarkeits-Toggle; beim Tod
  deaktiviert, damit die Anim nicht unsichtbar haengt).
- Tuer-Reinschauen nutzt die echten Sprites: TONY 50 (Rueckenansicht),
  SMACKS 48 (Stefans Fund -- jeweils letzter Frame vor den Platzhaltern).

Verifiziert: Duck-Verbot im Wasser, Blink-Muster wechselt, --once exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:48:39 +02:00
duffyduckandClaude Fable 5 10c5a5b69c Wasser-Bounce, Tod-Animation (Tuch/Kappe), Tuer-Peek, Duck-Kamera-Grace
Stefans fuenfte Feedback-Runde:
- Nicht-Schwimmer huepfen endlos auf der Wasseroberflaeche (~6px Auto-
  Bounce) statt statisch zu stehen; Steuerung und voller Ausstiegs-Sprung
  bleiben moeglich. Kein Idle im Wasser.
- Tod bei 0 Herzen: Tony verliert sein HALSTUCH (Frame 38 = Tony ohne
  Tuch, Frame 40 = Tuch einzeln -- die Assets waren dafuer gebaut!),
  fliegt aus dem Bild, Tuch flattert herab; Smacks analog mit Kappe
  (26/29). Danach Respawn mit Leben-1, bei 0 Leben zurueck zur Karte.
- Tuer-Peek: Figur zeigt waehrend der Offen-Sekunde einen Reinschau-Frame.
- Duck-Kamera: 0.2s-Grace gegen X11-Autorepeat-/on_ground-Flackern
  ("Kamera geht sporadisch wieder rauf").

Verifiziert: Bounce-Amplitude ~6px endlos, voller Sprung aus dem Wasser,
Tod-Sprites gesichtet (Tuch/Kappe), --once exit 0, E2E rc=0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:38:08 +02:00
duffyduckandClaude Fable 5 0ad97e7180 Tuer-Oeffnungs-Sequenz, Slope-Landungs-Fix, Kamera-Logik, Sprite-Feinschliff
Stefans vierte Feedback-Runde:
- Sprites sinken 4px in den Boden ein (Fuesse standen sichtbar UEBER den
  Blaettern; Original laesst sie einsinken).
- Echte Steh-Frames: Tony 16/17, Smacks-Walkzyklus ohne die Steh-Frames
  12-15 ("letzter Lauf-Frame blieb beim Anhalten stehen").
- Tuer: DOORS[0] ist die OFFENE Tuer -> Ruhe = Tile-Tuer + Kopf-Schild
  (DOORS[5]); ALT oeffnet die Tuer sichtbar und nach 1s folgt die Aktion
  (Charakterwechsel-Menue) -- Muster fuer alle Tueren inkl. der
  Schluessel-Tueren (DOORS 1-4).
- Slope-Landung: Swept-Kollision ueber alle ueberstrichenen Zeilen +
  Herkunftsbedingung -- kein Durchfallen mehr bei schnellen Landungen
  (Stress-Test: 50 Drops ueber die Hangbreite, 0 Durchfaller).
- Kamera: Figur steht bei ~75% Bildhoehe; DUCKEN gehalten (>=1.2s) faehrt
  die Kamera sanft ~40px nach unten (Wasser unter Abgruenden sichtbar).

Verifiziert: Tunneling-Stresstest 0/50, Idle-Frames korrekt, Standbild
(Fuesse in Blaettern, Schild auf zu-Tuer, Kamerahoehe), --once exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 13:25:44 +02:00
duffyduckandClaude Fable 5 bb9c23aae5 HUD-Kopf pixelig mit schwarzem Umriss, echte Tuergrafik (DOORS.BOB)
- Charakter-Icon im HUD: nearest-skalierter WECH-Kopf + schwarzer 1px-
  Umriss (Original-Look, Stefans Feedback). Eigene Mini-Kopf-Assets gibt
  es nicht (GAMEBAR.BOB[16] leer).
- DOORS.BOB entschluesselt: Frame 0 (Tuer mit Kopf-Schild) wird jetzt auf
  die Tuerposition geblittet; Frames 1-4 sind die Schluessel-Tueren mit
  farbigen Knaeufen (fuer die spaetere Schluessel-Logik), Frame 5 das
  Schild einzeln.

Szene deckungsgleich mit Stefans Original-Screenshot (Tuer mit Schild und
Punkten, pixeliger HUD-Kopf). --once exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:54:11 +02:00
duffyduckandClaude Fable 5 54e950141b HUD final: GAMEBAR.PCC pur (weisse Boxen), Original-Ziffern, 6 Herzen
Stefans Korrektur: Box-Innenflaechen sind im Original WEISS (die Grafik
hatte es schon richtig -- Dunkelrot-Fuellung entfernt, Grafik-":" damit
nativ sichtbar). Zahlen jetzt in der Original-HUD-Font: GAMEBAR.BOB-
Ziffern (7x13), gerendert mit der GAMEBAR.PCC-Palette -> sattes Rot mit
dunkler Umrandung, gleiche Farbe wie der Doppelpunkt. Herzen: 6 Stueck im
3x2-Grid (Original-Screenshot), Start/Reset auf 6.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:46:46 +02:00
duffyduckandClaude Fable 5 6c3d6ea7a7 Echte GAMEBAR.PCC als HUD, pixelgenaue Slopes, Step-up, Wasser-Grund
Stefans dritte Feedback-Runde:
- HUD nutzt jetzt die ECHTE GAMEBAR.PCC aus PCKELL.DAT (Stefans Fund):
  Kellogg's-Leiste, Boxrahmen und Uhr-":" kommen aus der Original-Grafik;
  weisse Box-Innenflaechen werden beim Laden dunkelrot gefuellt (macht die
  Original-Engine zur Laufzeit ebenso). Inhalte an den gemessenen Box-
  Positionen; HUD_H=25 (Grafikhoehe), VIEW_H=175.
- Slopes PIXELGENAU: Laufflaeche = oberster Nicht-Himmel-Pixel der Tile-
  Grafik pro Spalte (die Haenge sind ~1:2, nicht 45 Grad -- Ursache des
  restlichen Schwebens). Sky-Index vom haeufigsten Luft-Tile. Reine
  Himmel-Spalten tragen nicht.
- STEP_UP=6: Mini-Stufen (Plateau-Kante ueber Hangende) werden beim Laufen
  ueberwunden; hohe Waende blocken weiterhin.
- Unterste Map-Zeile immer solide (Grafik-Bodenstreifen ohne ctypes) --
  kein Steckenbleiben mehr beim Tieftauchen.
- Smacks-Steh-Frames 12/13 statt 0/1 (Anhalte-Sprite-Bug).

Verifiziert: Slope-Drop exakt auf Grafikkante, Plateau-Aufstieg, Wand-
Integritaet, Smacks-Idle, --once exit 0, E2E rc=0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:39:21 +02:00
duffyduckandClaude Fable 5 7eb7f6f3b7 Wasser-Mechanik nach Original, Slope-Schweben-Fix, Spawn-Pose, HUD v3
Stefans zweite Feedback-Runde:
- Nicht-Schwimmer (Tony & Co.) tauchen nicht mehr unter: die Wasser-
  oberflaeche traegt (14px Eintauchtiefe, springen von dort moeglich,
  Herzverlust laeuft) -- wie im Original-Screenshot. Schwimmer (Smacks)
  loesen nahe der Oberflaeche mit der Sprungtaste einen echten Sprung aus
  und kommen wieder aus dem Wasser raus (vorher unmoeglich).
- Slope-Schweben gefixt: Luft-Snap nur bei echter Durchdringung; Bergauf-
  Toleranz nur fuer bereits Gelandete.
- Start-Sprite-Sequenz beim Levelstart/Charakterwechsel (Tony Arm hoch,
  Smacks Daumen hoch, Frame 22, ~1.1s, durch Eingabe abbrechbar).
- Rennsprungweite: RUN_SPEED 185 -> 200 ("bis hinter die Blume").
- HUD v3 nach Original-Referenz: helle Creme-Rahmen, hoehere Boxen,
  Cerealien-Icon in voller Groesse, leere Herz-Plaetze dunkel.

Verifiziert: Physik-Sims (Wade+Absprung, Smacks-Ausstiegssprung, Decken-
Kollision unter der Bruecke korrekt) + E2E rc=0 + --once exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:19:44 +02:00
duffyduckandClaude Fable 5 07b347b607 Charakter-System, Wasser, Renn/Idle-Animationen, echtes HUD
Stefans Feedback-Paket (7 annotierte Screenshots):
- Player-Klasse mit CHAR_DEFS: Tony (RENNEN mit ALT -- echte Rad-Animation,
  Frames 26-33) und Smacks (SCHWIMMEN, Frames 37-44; kein Rennen) spielbar;
  Coco/Toucan vorbereitet. Idle-Packungs-Animation nach 5s Stillstand
  (Tony 44-49, Smacks 31-36). Sprung-Frames 18/19 (gestreckt).
- Sprunghoehe kalibriert (-360, ~72px: "Tony kommt mit dem Kopf an den Ast").
- WASSER (Stefans Fund: nur bei DOSBox machine=vgaonly sichtbar): water_y
  pro Level + dunkelblaues Overlay; Nicht-Schwimmer verlieren alle 5s ein
  Herz, 0 Herzen -> Respawn/Leben-1, 0 Leben -> Karte. Smacks schwimmt
  schadlos (traege Wasserphysik, Space = Schwimmstoss).
- TUER mit Kopf-Symbol (Level-1-Haus): ALT im STEHEN oeffnet das
  Charakter-Auswahlmenue "MIT WEM MOECHTEST DU SPIELEN?" -- WECH_1-4 =
  farbige Koepfe, WECH_5-8 = grau (nicht verfuegbar; Level 1: nur
  Tony+Smacks). Auswahl blinkt, Wechsel uebernimmt die Position.
- HUD nach Referenz-Screenshot: Keks-Box mit Cerealien-Icon (ITE0-3) des
  aktiven Charakters, Herz-Box als 2x2-Grid, Charakter-Kopf-Box (zeigt die
  gewaehlte Figur) + Leben, Uhr.
- Level-Metadaten (Charaktere/Wasserlinie/Tuer/Spawn) v1 als LEVEL_INFO-
  Konstanten -- Original-Quelle ist vermutlich das .ARE-Format (Header
  enthaelt BE-Pixelkoordinaten, Analyse in NOTES.md, noch offen).

Verifiziert: E2E (Xvfb+XTEST) -- Tuer->Menue->Smacks, HUD wechselt auf
Smacks-Kopf+Puff-Icon, Wasser-Overlay sichtbar, ESC/QUIT rc=0; --once ok.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 10:49:09 +02:00
duffyduckandClaude Fable 5 0bb66b73a4 Level-Feedback: Laufrichtung, Schraegen-Kollision, HUD, Rennen
Stefans annotierter Live-Test-Screenshot, alle 4 Punkte:
- Laufrichtung gefixt: TONY.BOB gerade Frames = rechts (war vertauscht,
  Figur lief rueckwaerts).
- Schraegen-Kollision: ctype 16 = Slope-Tile (per ctype-Farbvisualisierung
  exakt auf dem Grashang der Referenz identifiziert -- keine Tuer). 45-Grad-
  Diagonale, Richtung per Nachbar-Heuristik, am Fussmittelpunkt geprueft,
  Snap nur bei fallender Bewegung (kein Herunterziehen im Sprung).
  Simulation verifiziert: Hang hoch bis Plateau, kein Durchfallen mehr.
- HUD: weisse Kellogg's-Leiste (Schriftzug aus KELLOGGS.PCC gecroppt),
  Herzen als echte GAMEBAR-Sprites (10=voll/11=leer), Uhr-Box/Layout neu
  verteilt und Startzeit 9:59 (4-stellige Anzeige passt immer in die Zeile).
- RENNEN: ALT halten (Original-Anleitung: Tonys Faehigkeit) bzw. LSHIFT,
  185 px/s + schnellere Laufanimation.

Verifiziert: Slope-Simulation (min_y=559=Plateau, kein Durchfallen),
HUD-Standbild (Leiste/Herzen/Uhr komplett), E2E-Lauf rc=0, --once exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 10:01:14 +02:00
duffyduckandClaude Fable 5 973e290cf6 LEVEL 1 SPIELBAR: game/level.py -- Tiles, Kamera, Tony-Physik, HUD, Musik
Weltkarte: SPACE startet Level 1 (Original-Verhalten per DOSBox-Referenz:
Return tut dort nichts, kein sichtbarer Level-Cursor am Spielstart).

Level 1 = W1L1.MAP -- per Template-Matching des DOSBox-Gameplay-Screenshots
gegen die gerenderten Maps identifiziert (W1L0 ist NICHT Level 1).

game/level.py:
- Level: MAP+ICO+Weltpalette laden, komplette Map einmalig vorrendern,
  Kamera blittet 320x176-Ausschnitt (HUD 320x24 darunter, wie Original).
- Kollision: MAP-ctype Bit 32 = solide (40=Boden, 32=Fuellung; empirisch
  an der Spawn-Plattform verifiziert).
- Tony: TONY.BOB (53 Frames; 8-Phasen-Gehzyklus, gerade=links/ungerade=
  rechts), AABB-Physik gegen das Tile-Grid, laufen/springen/ducken,
  Fusspunkt-basiert. Physikwerte v1 nach Gefuehl (Feinschliff nach Test).
- HUD-Nachbildung (Keks/Item/Score/Herzen/Leben/Uhr 10:00-Countdown) mit
  FON_1B-Ziffern; GAMEBAR-Icons geladen (Original-Ziffern-Palette unklar).
- Levelmusik: ONGAME2 Song 0 als v1-ANNAHME (nach Gehoer korrigieren, wie
  beim Factor5-Sound); wird im Audio-Preload mitgerendert.
- ESC -> zurueck zur Karte (Titelmusik loopt wieder), Fenster-X -> Ende.

Verifiziert: E2E unter Xvfb mit gehaltenen XTEST-Tasten -- laufen (Kamera
scrollt), springen, Plattformkante runterfallen, unterm Brueckenbogen
zurueck, ESC->Karte->Menue->QUIT rc=0. Level-Standbild deckungsgleich zur
DOSBox-Referenz. --once-Regression exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 01:17:44 +02:00
duffyduckandClaude Fable 5 4517efbdf8 NOTES.md: Factor5-Tail + Menuesystem-Session dokumentiert; README: raw/-Restverweis
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 23:13:49 +02:00
duffyduckandClaude Fable 5 c8f7d4d990 Hauptmenue, Optionen, Anleitung, Highscores und Weltkarte implementiert
Per DOSBox-Referenzaufnahmen (Xvfb + XTEST-Tastensimulation) den kompletten
Original-Menuefluss erfasst und nachgebaut:
- ESC am stehenden Titelbild oeffnet das Hauptmenue (Original-Verhalten --
  Space/Return tun dort nichts, per Einzeltasten-Sessions verifiziert; das
  Original zeigt auch nach 115s passiv keinen Attract-Loop).
- Hauptmenue: HIGHSCORES/ANLEITUNG/OPTIONEN/START/QUIT in roter FON_2-
  Schrift, Default-Auswahl START, der selektierte Eintrag BLINKT (so zeigt
  das Original den Cursor). PARTY1/PARTY2-Charaktergruppen links/rechts,
  Credits-Ticker in gelber FON_1-Schrift unter der Box.
- OPTIONEN: MUSIK EIN/AUS (wirkt auf pygame.mixer.music), EFFEKTE EIN/AUS
  (Flag fuer spaeteres Gameplay), EXIT.
- ANLEITUNG: gelbe Texttafel (Original-Joystick-Text auf Tastatur uebertragen).
- HIGHSCORES: Tabelle NAME/SCORE/ITEMS/LEV mit den Original-Defaults.
- START: Weltkarte (KARTE.PCC, kompletter Screen) -- v1 statisch, Taste
  zurueck ins Menue; Levelauswahl/Animationen folgen mit dem Gameplay.
- QUIT: Programm-Ende.

Technik (game/menu.py):
- BitmapFont-Parser fuer die Original-Fonts: FON_1/FON_1B (9x7-Zellen,
  8px-Vorschub -- nur so passen die 32-Zeichen-Zeilen der Anleitung in die
  Box) und FON_2 (16x15-Zellen, 3 Reihen). Outline-Rendering fuer die gelbe
  Schrift (Original zeichnet sie ueberall mit schwarzem Rand).
- PARTY-Sprites via make_border_bg_transparent freigestellt (papierweisser
  BG wie bei den Rauser-Assets -- ein Schwarz-Replace loescht faelschlich
  die Konturen, per Vergleichsrender nachgewiesen und verworfen).
- intro.py: Zustandsautomat Titelbild <-> Menue <-> Weltkarte; wait_for_key
  unterscheidet jetzt Fenster-X ('quit') von Taste ('key').

Verifiziert: End-to-End-Lauf des Remakes unter Xvfb mit echten XTEST-Tasten
-- Intro -> ESC -> Menue -> START -> Karte -> zurueck -> Optionen -> Anleitung
-> Highscores -> QUIT beendet sauber (rc=0); alle Screens als Screenshots
gegen die DOSBox-Referenz geprueft. python -m game --once weiterhin exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 23:12:52 +02:00
duffyduckandClaude Fable 5 949a7eeda2 Factor5-Sound vollstaendig: Ausklang-Tail im TFMX-Renderer (loop_mode-Stopp + Fade)
Stefans Meldung "Factor5-Zeit zu kurz, Soundfile nicht ganz abgespielt" -- die
Ursache lag im Renderer: real_song_end markiert nur das Ende der TRACK-SEQUENZ
(2.4s), die dann noch klingenden Samples wurden hart abgeschnitten.

- render_tfmx.c: neues optionales 6. CLI-Arg tail_max_seconds. Im Tail-Modus
  wird loop_mode=0 gesetzt -- tfmx.h laesst den Sequencer bei song_end dann
  STEHEN (kein Restart, keine neuen Noten), waehrend die Paula-Voices weiter
  ausklingen. (Erster Versuch ohne loop_mode-Stopp nahm stattdessen die
  naechste Loop-Iteration auf -- per RMS-Selbstaehnlichkeit nachgewiesen.)
  Tail endet bei ~300ms Stille oder tail-Limit; bei Limit-Ende (loopende
  Samples ohne natuerliches Ende) wird ein 600ms-Fade-out angewendet.
- Factor5 ("Brausen") loopt auf Paula-Ebene endlos -> Tail 2.6s => Gesamt
  exakt 5.0s (DOSBox-Messung ~4.8s Screendauer, Stefans "ca. 5 Sekunden"),
  sauber ausgeblendet. Rauser-Sting endet natuerlich bei 2.34s.
- audio.py: tail_seconds-Parameter, Cache-Suffix _tail (alte abgeschnittene
  Caches greifen nicht mehr). intro.py: Jingles mit Tail, Titelmusik bewusst
  ohne (exakter Loop-Punkt-Schnitt fuers nahtlose pygame-Loopen).

Screen haelt weiterhin exakt Songlaenge (jetzt 5.0s), verifiziert: WAV klingt
aus (RMS 2065->261), --once headless exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 22:22:31 +02:00
duffyduckandClaude Opus 4.8 ccad606a43 Titelbild in voller Aufloesung (320x480 anamorph statt halbiert)
Stefan-Frage "hatte das Titelbild nicht bessere Aufloesung?" -- ja, bestaetigt.
Die 4 Quadranten KELL256A-D (je 160x240 nativ) wurden bisher auf halbe Hoehe
(160x120) gestaucht -> 320x240, also die halbe vertikale Aufloesung verworfen
(gleiche Fehlklasse wie der Rauser-0.5x-Downscale). Ein RMSE-Vergleich der
beiden Varianten gegen die echte DOSBox-Referenzaufnahme belegt eindeutig die
volle Variante:
  voll (320x480, anamorph angezeigt): RMSE 0.014
  halbiert (320x240):                 RMSE 0.083  (6x schlechter)

Fix: build_title_quadrants nutzt die nativen 160x240-Quadranten -> 320x480-
Bild; angezeigt wird es anamorph auf die volle Fenstergroesse gestreckt
(_blit_title: 320x480 -> 960x720, x3 Breite / x1.5 Hoehe), womit alle 480
Zeilen erhalten bleiben. render_title_wipe_frame arbeitet automatisch bei
320x480 (Hoehe aus get_height()). pcc_surface_half_height entfernt (ungenutzt).

Verifiziert: neues Titelbild sichtbar schaerfer, deckungsgleich zur Referenz;
python -m game --once (headless) exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 01:59:19 +02:00