HUD-Kopf pixelig mit schwarzem Umriss, echte Tuergrafik (DOORS.BOB)

- Charakter-Icon im HUD: nearest-skalierter WECH-Kopf + schwarzer 1px-
  Umriss (Original-Look, Stefans Feedback). Eigene Mini-Kopf-Assets gibt
  es nicht (GAMEBAR.BOB[16] leer).
- DOORS.BOB entschluesselt: Frame 0 (Tuer mit Kopf-Schild) wird jetzt auf
  die Tuerposition geblittet; Frames 1-4 sind die Schluessel-Tueren mit
  farbigen Knaeufen (fuer die spaetere Schluessel-Logik), Frame 5 das
  Schild einzeln.

Szene deckungsgleich mit Stefans Original-Screenshot (Tuer mit Schild und
Punkten, pixeliger HUD-Kopf). --once exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 11:54:11 +02:00
co-authored by Claude Fable 5
parent 54e950141b
commit bb9c23aae5
2 changed files with 36 additions and 5 deletions
+14
View File
@@ -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).
+22 -5
View File
@@ -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)