WELTKARTE mit Levelauswahl -- Pfad/Punkte/Namen live aus dem Binary

game/worldmap.py: parst Kartenpfad, Levelpunkt-Positionen und die 22
Levelnamen zur Laufzeit aus START.EXE (NE-Datensegment, Anker-Suche,
Fallback W1L1). Links/Rechts laesst die Kartenfigur (Mini-Kopf KARTE4-7
je Charakter) die Original-Wegpunkte ablaufen, der aktive Levelpunkt
blinkt orange/blau (KARTE0/2 -- Blinksequenz stand exakt so in der
Binary-Animationstabelle), Space/Return startet das Level, ESC -> Menue.
Kartenposition bleibt ueber Levelbesuche erhalten.

Level ohne handgepflegte LEVEL_INFO erhalten einen generischen Spawn
(erste Bodenstelle) -- damit sind ALLE 22 Level anwaehlbar und spielbar
(Basis-Physik; Wasser/Tueren dort folgen mit den echten Leveldaten).

E2E: Karte -> laufen -> W1L3 spielen -> zurueck -> W1L2 -> QUIT rc=0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 14:18:30 +02:00
co-authored by Claude Fable 5
parent cdf6da6f7d
commit 68be969e0d
4 changed files with 251 additions and 6 deletions
+19 -3
View File
@@ -154,9 +154,7 @@ class Level:
def __init__(self, assets, map_name):
container = assets.container
self.name = map_name
self.info = LEVEL_INFO.get(map_name, dict(spawn=(2, 2), time=599,
chars=['TONY'], water_y=None,
door_px=None))
self.info = LEVEL_INFO.get(map_name)
world = map_name[:2]
self.width, self.height, self.cells = parse_map(container.entries[map_name + '.MAP'])
palette = get_world_palette(container.entries, world)
@@ -181,6 +179,24 @@ class Level:
self.surface = self.surface.convert()
self.palette = palette
# Level ohne handgepflegte LEVEL_INFO (alle ausser W1L1): Spawn
# generisch suchen -- erste Spalte mit Boden und Luft darueber.
if self.info is None:
spawn = (3, 5)
for tx in range(2, self.width - 2):
for ty in range(2, self.height - 1):
if (self.cells[ty * self.width + tx][1] & SOLID_BIT
and self.cells[(ty - 1) * self.width + tx][1] == 0
and self.cells[(ty - 2) * self.width + tx][1] == 0):
spawn = (tx, ty)
break
else:
continue
break
self.info = dict(spawn=spawn, time=599,
chars=['TONY', 'SMACKS'], water_y=None,
door_px=None)
# PIXELGENAUE Slope-Laufflaechen (Stefans "steht in der Luft"-Bug,
# 2. Runde): statt einer 45-Grad-Annahme wird pro Slope-Tile (ctype
# 16) und Spalte der oberste Nicht-Himmel-Pixel der TILE-GRAFIK als