"""DIMENSION 5 SBC/Objectives.

HYPOTHESIS Q1: enableSquadBuildingSetsFeature (atom 0x100) is READ as an input that
gates the SBC menu -- OR it is an OUTPUT name only ever emitted (like IS_TRADING_ENABLED
turned out to be). Decide by string xrefs: if the only lea to the literal is inside a
publisher (contiguous .rdata name run, straight-line stores), it is output-only.

CONTROL: enableObjectives -- known to have a settings-switch arm (CLEAR-only). Its
literal should be referenced somewhere that is NOT a publisher. And IS_TRADING_ENABLED
literal -> should resolve to the publisher FUN_18006cc60 (proven output name), the
NEGATIVE control for "publisher == output-only".

Q2: SBC set-list deser 0x180154990 + FUT/SBC_USE_STUBS string. What gates stub SBCs.
"""
import traceback
try:
    def show_str_xrefs(label, needle):
        print("\n=== %s : %r ===" % (label, needle))
        hits = find_all(needle)
        print("  string occurrences:", [hex(h) for h in hits])
        for h in hits:
            print("  literal @%#x = %r" % (h, rd_str(h, 60)))
            # references land on the string addr itself for lea r8,[rip+..]
            for a in (h, h - 4):
                xs = xrefs_to(a)
                if xs:
                    print("    xrefs_to(%#x):" % a)
                    for frm, typ, fn, ent in xs:
                        print("      from %#x  %s  in %s (%#x)" % (frm, typ, fn, ent))

    show_str_xrefs("SBC feature flag", b"enableSquadBuildingSetsFeature\x00")
    show_str_xrefs("Objectives flag (control)", b"enableObjectives\x00")
    show_str_xrefs("Objectives-as-mgr flag", b"enableObjectivesAsManagerTasks\x00")
    show_str_xrefs("IS_TRADING_ENABLED (output-name neg control)", b"IS_TRADING_ENABLED\x00")

    # SBC_USE_STUBS -- brief says deser 0x180154990 checks FUT/SBC_USE_STUBS
    for n in (b"SBC_USE_STUBS", b"USE_STUBS", b"FUT/SBC"):
        print("\n=== search %r ===" % n)
        for h in find_all(n):
            print("  @%#x = %r" % (h, rd_str(h - 8, 80)))

    print("\n=== dec 0x180154990 (SBC set-list deser per brief) ===")
    d = dec(0x180154990)
    print("LEN", len(d))
    print(d)
except Exception:
    traceback.print_exc()
