"""DIMENSION 5 -- query 6. The hub tile builder DOES compute enabled/disabled tile
destinations (GOTO_DRAFT_DISABLED, GOTO_MANAGER_QUEST_DISABLED). Find the SBC and
MANAGER-QUEST tile cases and the exact gate condition, and whether an ENABLED variant
destination exists (GOTO_MANAGER_QUEST / GOTO_SBC / GOTO_SQUAD_BUILDING...).

Map the gate-byte accessor vtable slots read at the top of FUN_1800b2680 to model
displacements (slot 0x2c8/0x2d0/0x320) by reading each stub's disp32.
"""
import traceback
try:
    print("=== search enabled/disabled destination strings across binary ===")
    for n in (b"GOTO_MANAGER_QUEST", b"GOTO_SBC", b"GOTO_SQUAD_BUILDING",
              b"GOTO_SQUAD_BUILDING_SETS", b"MANAGER_QUEST", b"SQUAD_BUILDING_SETS",
              b"GOTO_DRAFT"):
        for h in find_all(n):
            print("  %#x %r" % (h, rd_str(h, 60)))

    # map model vtable slots to disp: read accessor stub bytes 0f b6 81 <disp32> c3
    print("\n=== model gate-byte accessor slots (DAT_1802e6398 vtable static 0x18021c2a0) ===")
    vtbase = 0x18021c2a0
    for slot in (0x2c8, 0x2d0, 0x320, 0x2b0, 0x270, 0x2e0):
        tgt = qword(vtbase + slot)
        b = read_bytes(tgt, 8)
        disp = None
        if b[0:3] == bytes.fromhex("0fb681"):
            disp = int.from_bytes(b[3:7], "little")
        print("  slot +%#x -> %#x  bytes=%s  disp=%s"
              % (slot, tgt, b.hex(), hex(disp) if disp is not None else "?"))

    # Now dump the hub builder and print the SBC + manager-quest tile blocks with context
    d = dec(0x1800b2680)
    lines = d.splitlines()
    print("\n=== hub builder around SBC tile image + 0x110 + 0x230 manager quest ===")
    for i, ln in enumerate(lines):
        if ("GameHub_SBS" in ln or "MANAGER_QUEST" in ln or "0x230" in ln
                or "0x110" in ln or "DREAMSQUAD" in ln):
            lo = max(0, i-14); hi = min(len(lines), i+4)
            print("  --- ctx @line %d ---" % i)
            for j in range(lo, hi):
                print("   " + lines[j].strip()[:150])
except Exception:
    traceback.print_exc()
