From e44a9c815c8200ce4365e1053772b5afb32a1518 Mon Sep 17 00:00:00 2001 From: NotSoToothless <67082114+FURRO404@users.noreply.github.com> Date: Fri, 19 Jun 2026 18:28:52 -0700 Subject: [PATCH] fix zone issues (#1343) --- BOT/render_replay.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/BOT/render_replay.py b/BOT/render_replay.py index 28c8ae6..e1ecd7b 100644 --- a/BOT/render_replay.py +++ b/BOT/render_replay.py @@ -1127,13 +1127,22 @@ def _capture_areas_from_zone_geometry(zone_geometry: dict | None) -> list[dict]: radius = float(zdata.get("radius", 0.0) or 0.0) except Exception: continue + tm = { + "a0": [radius, 0.0, 0.0], + "a2": [0.0, 0.0, radius], + "center": [cx, float(center[1]), cz], + } if radius > 0.0 else None out.append({ "name": f"replay_zone_{letter}", - "type": "Sphere", + # Conquest/domination capture points are axis-aligned circles, so a + # synthesized circular tm reproduces the outline exactly from the + # replay's own center+radius — no mission .blk geometry required. + "type": "Cylinder", "x": cx, "z": cz, "radius": radius, - "tm": None, + "zone_letter": letter, + "tm": tm, }) return out @@ -1445,6 +1454,9 @@ def _draw_capture_areas(img: Image.Image, capture_areas: list[dict], def _capture_zone_letter(cap: dict, fallback_idx: int) -> str: labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + explicit = cap.get("zone_letter") + if isinstance(explicit, str) and explicit: + return explicit.upper() name = str(cap.get("name") or "") m = re.search(r"(?:^|_)([A-Za-z])$", name) if m: @@ -2993,9 +3005,9 @@ def _render_air_only_gob( air_cols, air_trail_cols = assign_colors(air_active, team_won) shadow_color = np.array([0, 0, 0], dtype=np.uint8) - capture_areas = resolve_capture_areas(mission_def, mission_def_path, battle_type) + capture_areas = _capture_areas_from_zone_geometry(d.get("ZoneGeometry")) if not capture_areas: - capture_areas = _capture_areas_from_zone_geometry(d.get("ZoneGeometry")) + capture_areas = resolve_capture_areas(mission_def, mission_def_path, battle_type) if capture_areas: print("Capture : " + ", ".join( f"{c['name']}({c['type']})" for c in capture_areas @@ -3225,9 +3237,9 @@ def render_gob( tc0, tc1 = _expand_bounds_by_pixels(tc0, tc1, canvas=canvas, pad_px=MAP_PAD_PX) tc0, tc1 = _clamp_bounds_to_base(tc0, tc1, base_tc0, base_tc1) print(f"ok ({coord_src}) X=[{tc0[0]}, {tc1[0]}] Z=[{tc0[1]}, {tc1[1]}]") - capture_areas = resolve_capture_areas(mission_def, mission_def_path, battle_type) + capture_areas = _capture_areas_from_zone_geometry(d.get("ZoneGeometry")) if not capture_areas: - capture_areas = _capture_areas_from_zone_geometry(d.get("ZoneGeometry")) + capture_areas = resolve_capture_areas(mission_def, mission_def_path, battle_type) if capture_areas: print("Capture : " + ", ".join( f"{c['name']}({c['type']})" for c in capture_areas @@ -4123,9 +4135,9 @@ def export_replay_json(replay_path: Path) -> dict: if e.get("PlayerID", 0) != 0 and e.get("ModelName", "").startswith("tankModels/") and e.get("Path")] - capture_areas = resolve_capture_areas(mission_def, mission_def_path, battle_type) + capture_areas = _capture_areas_from_zone_geometry(d.get("ZoneGeometry")) if not capture_areas: - capture_areas = _capture_areas_from_zone_geometry(d.get("ZoneGeometry")) + capture_areas = resolve_capture_areas(mission_def, mission_def_path, battle_type) if level_data: try: base_c0, base_c1, _ = select_tank_coords(level_data, use_alt_map_coord)