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:
+19
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user