From cdf6da6f7dca29e4968b160d370bed963310e91c Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 25 Jul 2026 14:06:45 +0200 Subject: [PATCH] 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 --- NOTES.md | 40 ++++++++++++++++++++++++++++++++++++++++ game/level.py | 10 ++++++---- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/NOTES.md b/NOTES.md index 027678b..91a3bfd 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1641,3 +1641,43 @@ Stefans Frage: Animations-Zuordnungen aus dem Binary disassemblieren? JUMP_SQUAT_SECONDS=0.09 zeigt kurz den Duck-Frame. 2. Die TUER-SEQUENZ DIMMT DEN LEVEL AB (Szene dunkel waehrend der Interaktion) -- eingebaut (Overlay waehrend door_open_t). + +## 25.07.2026 (12) -- BINARY-DURCHBRUCH: NE-Overlay + Original-Animationstabellen + +Stefans Frage "sollen wir Disassembly versuchen?" -- JA, und es hat sich +gelohnt (kein Voll-Disassembly noetig!): + +**START.EXE-Struktur:** MZ-Stub (3.6KB) + NE-Executable als Overlay ab +Offset 3646 (Borland DPMI16, UNGEPACKT, 7 Segmente: 5 CODE ~100KB, 2 DATA). +Borland-Pascal-Shortstrings ("GAMEDATA\" + Name + ".BOB" wird zur Laufzeit +konkateniert -- deshalb fand die fruehe Dateinamen-Suche keine .ARE/.MAP). +String-Fund: "Willkommen im Kellogg's Cheat-Mode" -- Level-Waehler per +Pfeiltasten existiert im Original! + +**ANIMATIONSTABELLEN im DATA-Segment (@143858 ff., Format +[delay_ticks][frame...] 0xffff, 70Hz-Ticks):** +FORMEL: Engine-Frame x2 = unser BOB-Frame (gerade=rechts, +1=links)! +- [0,4] 0..7 -> Gehzyklus 0,2..14, delay 4 = 17.5 fps +- [4] 8,8,8 -> Idle 16 (bestaetigt unsere Zuordnung) +- [4] 9 -> Sprung 18 (bestaetigt) +- [4] 10,10,10 -> Frontal 20 +- [4] 13,14,15,16 -> RENN-RAD 26,28,30,32 (bestaetigt!) +- [25] 23,24,23,22,...,10x5 -> ECHTE Frosties-Sequenz + 46,48,46,44,...,20x5 (delay 25 = 2.8 fps) -- uebernommen. +- Weitere Listen mit globalen Sprite-Indizes (100er/200er/400er/500er/ + 900er) = andere BOBs/Items/Karten-Sprites (Basis-Offsets noch offen). + +**WELTKARTEN-DATEN (@145114-146760):** kompletter Karten-LAUFPFAD als +Records [x,y,flag,25] ((58,40)->...ueber die ganze Karte), dazwischen +[x,y]-Paare = LEVELPUNKT-Positionen ((53,56),(108,51),(126,81),(142,53) +...), am Ende die 22 Levelnamen W1L0..W3L7 als Pascal-Strings. => Die +Weltkarten-Levelauswahl liegt komplett im Binary -- perfekte Grundlage +fuer den naechsten Meilenstein! Voll-Dump gesichert (Session-Scratchpad +anim_tables.txt; bei Bedarf neu erzeugbar, Offsets dokumentiert). + +**Angewendet:** Walk/Rad-FPS auf 17.5 (Original-Timing), Frosties-Sequenz +exakt uebernommen, Idle 2.8 fps. + +**Offen:** globale Sprite-Basis-Offsets pro BOB entschluesseln (dann sind +ALLE Animationszuordnungen inkl. Smacks-Sprung exakt abzulesen); Karten- +pfad in die Weltkarte einbauen; Cheat-Mode-Aktivierung finden. diff --git a/game/level.py b/game/level.py index e0fdbc5..5a96152 100644 --- a/game/level.py +++ b/game/level.py @@ -41,10 +41,10 @@ GRAVITY = 900.0 JUMP_VELOCITY = -360.0 SWIM_GRAVITY = 240.0 # Smacks im Wasser: traege sinken SWIM_KICK = -140.0 # Schwimmstoss mit Space -WALK_ANIM_FPS = 12.0 -RUN_ANIM_FPS = 14.0 +WALK_ANIM_FPS = 17.5 # Original: delay 4 Ticks @70Hz (Binary-Tabelle) +RUN_ANIM_FPS = 17.5 # Rad hat dasselbe delay 4 IDLE_ANIM_AFTER = 5.0 # Sekunden Stillstand bis zur Idle-Animation -IDLE_ANIM_FPS = 2.5 +IDLE_ANIM_FPS = 2.8 # Original: delay 25 Ticks @70Hz WATER_DAMAGE_EVERY = 1.5 # im Wasser: alle 1.5s ein Herz (Stefan: 5s war arg lang) SPAWN_ANIM_SECONDS = 1.1 # Start-Sprite beim Levelstart/Charakterwechsel SPRITE_SINK = 4 # Fuesse sinken optisch in die Blaetter/Gras ein @@ -73,7 +73,9 @@ CHAR_DEFS = { # Lauf-Frame bleibt stehen"-Bug) idle_r=16, idle_l=17, jump_r=18, jump_l=19, duck_r=24, duck_l=25, swim_r=None, swim_l=None, - idle_anim_r=[44, 46, 48], idle_anim_l=[45, 47, 49], + # ECHTE Sequenz aus der Binary-Animationstabelle (@143966, x2): + idle_anim_r=[46, 48, 46, 44, 46, 44, 46, 44, 46, 48, 46, 44, 46, 20, 20, 20, 20, 20], + idle_anim_l=[47, 49, 47, 45, 47, 45, 47, 45, 47, 49, 47, 45, 47, 21, 21, 21, 21, 21], spawn_frame=22, # Arm nach oben gestreckt death_frame=38, drop_frame=40, # erschrocken; fallendes HALSTUCH peek_frame=50, # in die Tuer reinschauen (Rueckenansicht -- Stefans Fund)