diff --git a/NOTES.md b/NOTES.md index 464fe84..027678b 100644 --- a/NOTES.md +++ b/NOTES.md @@ -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). diff --git a/game/level.py b/game/level.py index de339e0..e0fdbc5 100644 --- a/game/level.py +++ b/game/level.py @@ -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')