KAZIK/tools/generators/make_hall_layout.py
Artvasil09 797ee366dc feat: implement upper lounge, manual stairs, cabaret, and casino terminals
- Native player-controlled stairs, upper lounge bar, and Hell Tower infernal portal
- Cabaret stage with musical acts, audience seating, and interaction
- Dedicated cash/trophy wall terminals with native balance and achievement screens
- Projecting 3D wall lanterns with ray/plane intersection
- Six roaming guests with seated poses and card rank rendering updates
- Synchronized launcher hash and updated binaries
2026-10-18 21:36:12 +03:00

81 lines
3.3 KiB
Python

"""Offline map compiler; collision and rendering consume the same MASM data."""
from collections import deque
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
def reachable(grid, start):
visited, pending = {start}, deque([start])
while pending:
x, y = pending.popleft()
for point in ((x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)):
a, b = point
if 0 <= a < 32 and 0 <= b < 32 and not grid[b][a] and point not in visited:
visited.add(point)
pending.append(point)
return visited
def main():
hall = [[1 if x in (0, 31) or y in (0, 31) else 0 for x in range(32)] for y in range(32)]
# Cabaret enclosure, arcade divider, central pillars and rear reception.
for y in range(1, 7):
hall[y][9] = hall[y][22] = 2
for x in range(9, 23):
hall[1][x] = 2
for y in (7, 8, 9, 10, 14, 15, 18, 19, 20):
hall[y][9] = 1
for x, y in ((11, 11), (24, 11), (11, 19), (24, 19)):
hall[y][x] = 2
for x in range(13, 19):
hall[30][x] = 4
for x in range(27, 31):
hall[8][x] = hall[12][x] = 1
targets = [(12, 8), (16, 10), (20, 8), (24, 8), (6, 8), (6, 11),
(6, 14), (10, 15), (14, 15), (18, 15), (22, 15), (28, 10),
(28, 14), (29, 14), (12, 22), (20, 22), (16, 25), (18, 25),
(16, 29), (6, 25), (27, 25)]
assert all(point in reachable(hall, (16, 27)) for point in targets)
# Dedicated indoor concrete, never a street facade or refuse-container texture.
bunker = [[92] * 32 for _ in range(32)]
for y in range(11, 24):
for x in range(14, 20):
bunker[y][x] = 0
for y in range(24, 29):
for x in range(15, 18):
bunker[y][x] = 0
assert (16, 12) in reachable(bunker, (16, 26))
upper = [[125]*32 for _ in range(32)]
for y in range(13,25):
for x in range(3,16):
upper[y][x] = 0
# Enclosed, manually traversed stairwells with level landings at either end.
up_stairs = [[102]*32 for _ in range(32)]
for y in range(20,22):
for x in range(2,18):
up_stairs[y][x] = 0
down_stairs = [[92]*32 for _ in range(32)]
for y in range(20,23):
for x in range(2,18):
down_stairs[y][x] = 0
for y in range(13,23):
for x in range(15,18):
down_stairs[y][x] = 0
for grid, start, targets in ((upper,(4,21),[(7,18),(12,20),(9,23),(13,16)]),
(up_stairs,(3,21),[(16,21)]),
(down_stairs,(3,21),[(16,21),(16,14)])):
assert all(point in reachable(grid,start) for point in targets)
output = ["; Generated by make_hall_layout.py. Doorways and interactable approaches are checked.", ".data"]
for name, grid in (("hallLayout3D", hall), ("bunkerMap3D", bunker),
("upperLoungeMap3D",upper), ("upperStairMap3D",up_stairs),
("basementStairMap3D",down_stairs)):
for index, row in enumerate(grid):
output.append((name if index == 0 else " " * len(name)) + " db " + ",".join(map(str, row)))
output.append(".code")
(ROOT / "src_graphics/hall_layout.inc").write_text("\n".join(output) + "\n", encoding="ascii")
print("Hall and bunker: every interaction approach is reachable")
if __name__ == "__main__":
main()