diff --git a/NOTES.md b/NOTES.md index 3b0d792..d5d0729 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1553,3 +1553,17 @@ Herzen: 6 (3x2-Grid, Frame 10 mit PCC-Palette), leere Plaetze bleiben weiss. hearts-Start/-Reset = 6. HUD-Render deckungsgleich mit Stefans Original-Screenshot. --once/E2E ok. + +## 25.07.2026 (7) -- Charakter-Icon + echte Tuergrafik + +- HUD-Charakter-Kopf: WECH-Koepfe jetzt NEAREST-skaliert (pixelig statt + weichgezeichnet) + schwarzer 1px-Umriss -- Original-Look (Stefans Hinweis + "schwarzer Rand drum"). Eigene Mini-Kopf-Assets existieren offenbar nicht + (GAMEBAR.BOB[16] ist leer, W1ANI.ICO sind Tile-Animationen). +- DOORS.BOB entschluesselt: Frame 0 = Tuer MIT Kopf-Schild (32x48), Frames + 1-4 = Tueren mit ROTEN/GRUENEN/BLAUEN Knaeufen (Schluessel-Tueren!), + Frame 5 = Kopf-Schild einzeln. Das Level blittet jetzt DOORS[0] auf die + Tuerposition (statt des improvisierten Mini-Symbols) -- deckungsgleich + mit Stefans Original-Screenshot (Kopf-Schild + Punkte). +- Nebenfund: W1ANI/W2ANI/W3ANI.ICO = Tile-ANIMATIONSPHASEN (broeckelnde + Bloecke etc.) -- fuer spaeter (animierte Tiles). diff --git a/game/level.py b/game/level.py index 5f1a171..4ea4c10 100644 --- a/game/level.py +++ b/game/level.py @@ -439,10 +439,23 @@ class Hud: self.bar = assets.pcc_surface('GAMEBAR').convert() self.item_icons = {n: intro.make_border_bg_transparent(assets.pcc_surface(n)) for n in ('ITE0', 'ITE1', 'ITE2', 'ITE3')} + # Kleine Charakter-Koepfe: WECH-Koepfe pixelig (nearest) verkleinert + # + schwarzer 1px-Umriss -- Stefans Feedback: das Original-Icon ist + # ein klarer Pixel-Kopf mit schwarzem Rand (kein weichgezeichnetes + # Bild). Gleicher Stil wie das Tuerschild in DOORS.BOB. self.heads_small = [] for i in range(1, 5): head = intro.make_border_bg_transparent(assets.pcc_surface(f'WECH_{i}')) - self.heads_small.append(pygame.transform.smoothscale(head, (17, 16))) + small = pygame.transform.scale(head, (15, 14)) + outlined = pygame.Surface((17, 16), pygame.SRCALPHA) + mask = small.copy() + tint = pygame.Surface(mask.get_size(), pygame.SRCALPHA) + tint.fill((0, 0, 0, 255)) + mask.blit(tint, (0, 0), special_flags=pygame.BLEND_RGBA_MULT) + for dx, dy in ((0, 1), (2, 1), (1, 0), (1, 2)): + outlined.blit(mask, (dx, dy)) + outlined.blit(small, (1, 1)) + self.heads_small.append(outlined) def _number(self, canvas, x, y, value, width): s = str(max(0, int(value))).rjust(width, '0')[-width:] @@ -532,8 +545,12 @@ def run_level(clock, assets, audio_paths, map_name='W1L1'): player = Player(assets, info['chars'][0], spawn_px) hud = Hud(assets) door = pygame.Rect(info['door_px']) if info.get('door_px') else None - door_head = pygame.transform.smoothscale( - intro.make_border_bg_transparent(assets.pcc_surface('WECH_1')), (16, 15)) + # Echte Tuergrafik: DOORS.BOB Frame 0 = Tuer MIT Kopf-Schild (32x48, + # exakt Tuergroesse; Frames 1-4 sind die Schluessel-Tueren mit farbigen + # Knaeufen -- fuer spaeter). + door_frames = parse_bob(assets.container.entries['DOORS.BOB']) + door_pal = get_bob_palette(assets.container.entries, 'DOORS') + door_sprite = _frames_to_surfaces(door_frames, door_pal)[0] if pygame.mixer.get_init(): path = audio_paths.get(('ONGAME2', None)) @@ -597,9 +614,9 @@ def run_level(clock, assets, audio_paths, map_name='W1L1'): cam_y = max(0, min(int(player.y) - VIEW_H * 2 // 3, map_h_px - VIEW_H)) canvas.blit(level.surface, (0, 0), (cam_x, cam_y, VIEW_W, VIEW_H)) - # Tuer-Symbol (Kopf ueber dem Tuerfenster -- Charakterwechsel-Hinweis) + # Tuer mit Kopf-Schild (DOORS.BOB Frame 0) ueber der Tile-Tuer if door: - canvas.blit(door_head, (door.x + door.w // 2 - 8 - cam_x, door.y - cam_y)) + canvas.blit(door_sprite, (door.x - cam_x, door.y - cam_y)) player.draw(canvas, cam_x, cam_y) # Wasser: dunkles Overlay unterhalb der Wasserlinie (im Original ein # VGA-Palette-Effekt, nur bei machine=vgaonly sichtbar -- Stefans Fund)