From 98dbc3e69fa48c1fce43f18693f07eb69bd1d3bb Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 26 Jul 2026 11:12:10 +0200 Subject: [PATCH] Steh-Pose final: frontal (17) nur am Spawn/vor erster Bewegung, danach seitlich (8) -- Stefans Original-Screenshots --- NOTES.md | 13 +++++++++++++ game/level.py | 24 ++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/NOTES.md b/NOTES.md index 779e9e9..ec901cd 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1986,3 +1986,16 @@ Slot 8 laeuft 0.17s beim Anhalten, Idle-Warteanimation (Schachtel) jetzt nach 4s (Timeline: ~4s). Slot 18 = zweite Frontal-Pose (Variante), noch ungenutzt. Damit ist auch klar: Slot-17-Frames sind KEINE Schadensposen. Alle 4 Charaktere haben Slot 17 (Coco sogar als Richtungs-Paar). + +## 26.07.2026 (27) -- Steh-Pose, die Zweite: frontal NUR am Spawn + +Stefans Screenshots (unsere frontale Pose vs. Original seitlich): +Eintrag (26) war ueberkorrigiert. Original-Verhalten: +- Spawn/Charakterwechsel, noch nie bewegt -> FRONTAL (Slot 17) + (deshalb zeigten die sess_level-Frames vom Levelstart frontal) +- nach der ersten Bewegung -> SEITLICH in Blickrichtung (Slot 8) +Umgesetzt ueber player.moved-Flag (Reset bei set_character/Respawn). +Wichtig fuers Protokoll: die DOSBox-"Checks" liefen gegen GESPEICHERTE +Frameserien aus frueheren Capture-Sessions (Scratchpad), nicht live -- +und die zeigten nur den Spawn-Fall. Idle-Warteanimation (Schachtel nach +4s) unveraendert. diff --git a/game/level.py b/game/level.py index f619560..4b59fc8 100644 --- a/game/level.py +++ b/game/level.py @@ -86,12 +86,12 @@ SLOPE_CT = 16 # Charakter hat, ergibt sich daraus, WELCHE Slots sein BOB enthaelt # (nur Tony hat 13-16 = rennen, nur Smacks/Toucan 25-28 = schwimmen, # nur Toucan 29-31 als Richtungs-Paare = fliegen, nur Coco 35-44 = hangeln). -# Slot 17 = FRONTALE Steh-Pose (DOSBox-Abgleich stand_timeline.png: das -# Original steht mit Bauch zur Kamera -- BOB 34 bei Tony). Slot 8 (BOB 16) -# ist nur eine Seiten-/Uebergangspose und sah beim Stehen falsch aus -# (Stefans Feedback "Stand-Animation passt nicht"). -SLOT_IDLE = 17 -SLOT_IDLE_LANDING = 8 # kurze Pose direkt nach der Landung (Tabelle [4][8,8,8]) +# Steh-Posen (Stefans Screenshots + DOSBox-Serien, 26.07.2026): +# - Am SPAWN (noch nie bewegt) steht das Original FRONTAL: Slot 17. +# - Nach Bewegung steht es SEITLICH in Blickrichtung: Slot 8 (BOB 16). +SLOT_STAND_FRONT = 17 +SLOT_STAND_SIDE = 8 +SLOT_IDLE = SLOT_STAND_SIDE # Fallback-Slot (existiert bei allen Chars) SLOT_JUMP = 9 # Springen/Fallen SLOT_SQUAT = 10 # Absprung-Hocke SLOT_ARMUP = 11 # Arm hoch / Daumen hoch (Spawn-Pose, Tabelle [70][10,11,10]) @@ -291,6 +291,8 @@ class Player: self.jump_lock = False # Sprung gesperrt, bis Taste losgelassen # (Leertaste aus dem Tuer-Menue "leckte" # sonst als Sofortsprung ins Level) + self.moved = False # schon bewegt seit Spawn/Charakterwechsel? + # (frontale vs. seitliche Steh-Pose) self._grounded_before = False self.set_character(char, pos) @@ -313,6 +315,7 @@ class Player: # Start-Sprite-Sequenz beim Levelstart/Charakterwechsel (Stefans # Beobachtung: Tony streckt die Hand nach oben, Smacks Daumen hoch) self.spawn_t = SPAWN_ANIM_SECONDS + self.moved = False def sprite(self, slot): '''(Surface, ax, ay) fuer einen Slot; Blickrichtung links = +50 @@ -363,6 +366,7 @@ class Player: self.vx = move * speed if move: self.facing = move + self.moved = True self.anim_t += dt * (RUN_ANIM_FPS / WALK_ANIM_FPS if self.running else 1.0) self.idle_t = 0.0 else: @@ -581,10 +585,9 @@ class Player: if self.idle_t >= IDLE_ANIM_AFTER: i = int((self.idle_t - IDLE_ANIM_AFTER) * IDLE_WAIT_FPS) % len(ANIM_IDLE_WAIT) return ANIM_IDLE_WAIT[i] - if self.idle_t < 0.17: - # kurze Uebergangspose beim Anhalten/Landen (Original [4][8,8,8]) - return SLOT_IDLE_LANDING - return SLOT_IDLE + # Original-Verhalten (Stefans Screenshots): frontal nur solange die + # Figur sich seit Spawn/Tuer noch nie bewegt hat, danach seitlich + return SLOT_STAND_SIDE if self.moved else SLOT_STAND_FRONT def draw(self, screen, cam_x, cam_y): # Schadens-Blinken: nach Herzverlust flackert die Figur kurz @@ -818,6 +821,7 @@ def run_level(clock, assets, audio_paths, map_name='W1L1'): player.x, player.y = spawn_px player.vy = 0.0 player.spawn_t = SPAWN_ANIM_SECONDS + player.moved = False start = time.monotonic() # neuer Versuch = frische Levelzeit # Tuer-Sequenz: offen zeigen (Figur schaut rein), nach 1s die Aktion