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>
This commit is contained in:
2026-07-25 13:56:34 +02:00
co-authored by Claude Fable 5
parent 200fc6192d
commit f7f29a0309
2 changed files with 34 additions and 0 deletions
+20
View File
@@ -1621,3 +1621,23 @@ Tony-auf-Wasser+Frosties-Idle von Stefan als "sehr geil" abgenommen (kein Fix).
SMACKS Frame 48 -- jeweils der letzte Frame vor den Magenta-
Platzhaltern. Der als "gebueckt/kriechend" einsortierte Tony-50 war in
Wahrheit das Reinschauen.
## 25.07.2026 (11) -- Disassembly-Frage + Smacks-Sprung per Referenz geklaert
Stefans Frage: Animations-Zuordnungen aus dem Binary disassemblieren?
- Byte-Muster-Suche nach Frame-Tabellen (0,2,4..14 / 26,28,30,32 / 37,39,
41,43 als u8- und u16le-Folgen) in START.EXE und RTM.EXE: KEINE Treffer
-- die Sequenzen liegen nicht als nackte Tabellen im Binary (gepackt oder
als Code). Voll-Disassembly von 148KB 16-bit-Borland-Code waere ein
Wochenprojekt -- der empirische Weg (DOSBox-Frameserie) bleibt schneller
und sicherer.
- Stattdessen DOSBox-Session mit 0.12s-Intervall: per TUER zu Smacks
gewechselt (verifiziert dabei UNSER Tuer-/Menue-Design gegen das
Original: Menue-Layout deckungsgleich, Coco/Toucan grau ✓) und
Spruenge aufgenommen. ERKENNTNISSE:
1. Der Original-Sprung hat eine ABSPRUNG-HOCKE (Kauer-Frame im
Absprungmoment, dann Streckung im Flug) -- das fehlte bei uns
("Sprunganimation nicht richtig"-Gefuehl). Eingebaut:
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).
+14
View File
@@ -56,6 +56,8 @@ WATER_BOUNCE_V = -110.0 # Auto-Huepfer auf der Wasseroberflaeche
# (Endlosschleife, Stefans Beschreibung);
# manueller Sprung (voll) geht trotzdem
DEATH_ANIM_SECONDS = 2.4 # Tuch faellt, Figur fliegt aus dem Bild
JUMP_SQUAT_SECONDS = 0.09 # Absprung-Hocke (DOSBox-Referenz: kurzer
# Kauer-Frame im Absprungmoment, dann Streckung)
SOLID_BIT = 32
SLOPE_CT = 16
@@ -257,6 +259,7 @@ class Player:
self.spawn_t = 0.0 # Start-Sprite-Sequenz (Arm hoch/Daumen hoch)
self.force_frame = None # erzwungener Frame (Tuer-Peek, Tod)
self.hurt_t = 0.0 # Rest-Blinkzeit nach Schaden
self.jump_squat_t = 0.0 # Absprung-Hocke (kurz nach dem Absprung)
self._grounded_before = False
self.set_character(char, pos)
@@ -280,6 +283,8 @@ class Player:
def update(self, level, dt, keys):
if self.hurt_t > 0:
self.hurt_t -= dt
if self.jump_squat_t > 0:
self.jump_squat_t -= dt
if self.spawn_t > 0:
self.spawn_t -= dt
# Eingabe bricht die Start-Pose sofort ab
@@ -332,6 +337,7 @@ class Player:
self.vy = JUMP_VELOCITY
self.on_ground = False
self.idle_t = 0.0
self.jump_squat_t = JUMP_SQUAT_SECONDS
self.vy = min(self.vy + GRAVITY * dt, 480.0)
# X + Wandkollision. STEP_UP: die untersten Pixel der Hitbox blocken
@@ -428,6 +434,8 @@ class Player:
if self.ducking:
return self._pick('duck_r', 'duck_l')
if not self.on_ground:
if self.jump_squat_t > 0:
return self._pick('duck_r', 'duck_l') # Absprung-Hocke
return self._pick('jump_r', 'jump_l')
if self.vx:
if self.running and d['run_r']:
@@ -730,6 +738,12 @@ def run_level(clock, assets, audio_paths, map_name='W1L1'):
drop = player.surfs[player.d['drop_frame']]
canvas.blit(drop, (int(player.x - drop.get_width() / 2 - cam_x),
int(dying['drop_y'] - cam_y)))
# Tuer offen: Level abdunkeln (Original dimmt die Szene waehrend der
# Tuer-Interaktion -- DOSBox-Referenz)
if door_open_t is not None:
dim = pygame.Surface((VIEW_W, VIEW_H), pygame.SRCALPHA)
dim.fill((0, 0, 30, 120))
canvas.blit(dim, (0, 0))
# Wasser: dunkles Overlay unterhalb der Wasserlinie (im Original ein
# VGA-Palette-Effekt, nur bei machine=vgaonly sichtbar -- Stefans Fund)
wy = info.get('water_y')