forked from Ports/goldeneye-pc-port
- D318 (RESOLVED): as-authored latent race — gas bit mid-monologue derails c78's pre-aim hold into a permanent ACT_ATTACK anim pin (actor_fire_or_aim_at_target_update moves only the endframe, never re-inits; N64-identical). NOT a port bug. Port-side watchdog port/src/d318watchdog.c (hooked in lv.c after g_GlobalTimer += ) detects the pinned state and re-inits the attack on confirm; GE_D318T=1 timeline diagnostic included. random.c gains an env-gated probe (GE_RANDPROBE) for bit-exact PRNG verification. Scratch evidence (dis/seqcmp scripts, addr dumps, session handoff) parked per house practice. - D320 (OPEN): swept every level's AI scripts for the same aim-hold -> _update shape: 17 lists in 8 levels. Facility ai_19 and Control ai_9 are HIGH (non-self-healing, same as ai_22); Depot ai_12 MED-HIGH (objective bit gated behind a stop-check). Bond-combat loops likely safe (sustained fire stays inside the shoot window by design; exercised every playtest). Classified as-authored latent race(s), faithfully reproduced. Probe-verify path + generalize-the-watchdog recommendation documented in findings.md. - gfx_pc.cpp: GE_D116 debug printf used %f for uint32_t args and %d for unsigned tile fields; casts added, build warning-free. Full ntsc-final configure+compile+link PASS. Accuracy sweep write-up in docs/dev/ACCURACY-AUDIT-2026-09-20.md (PRNG bit-exact; A1/shift32/wrapv/ PORT-hygiene/Gfx-Vtx/osVirtualToPhysical sweeps all clean or already fixed).
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
import re, sys
|
|
|
|
def draws(p):
|
|
out = []
|
|
for line in open(p, encoding="utf8", errors="replace"):
|
|
m = re.search(r"n=(\d+) t=(\d+) ra=([0-9a-f]+)", line)
|
|
if m:
|
|
out.append((int(m.group(2)), m.group(3)))
|
|
return out
|
|
|
|
a = draws(sys.argv[1])
|
|
b = draws(sys.argv[2])
|
|
print("draws:", len(a), len(b))
|
|
n = min(len(a), len(b))
|
|
|
|
# compare caller sequence only (ignore tick stamps)
|
|
first_ra = None
|
|
for i in range(n):
|
|
if a[i][1] != b[i][1]:
|
|
first_ra = i
|
|
break
|
|
if first_ra is None:
|
|
print("CALLER SEQUENCE IDENTICAL over", n, "draws")
|
|
else:
|
|
print("first caller divergence at draw", first_ra)
|
|
for j in range(max(0, first_ra - 3), min(n, first_ra + 4)):
|
|
tag = "same" if a[j][1] == b[j][1] else "DIFF <=="
|
|
print(" [%d] A t=%4d ra=%s B t=%4d ra=%s %s"
|
|
% (j, a[j][0], a[j][1], b[j][0], b[j][1], tag))
|
|
|
|
# tick-stamp divergence count (pacing jitter)
|
|
t_diff = sum(1 for i in range(n) if a[i][0] != b[i][0])
|
|
print("draws with differing tick stamps:", t_diff, "of", n)
|
|
if n:
|
|
print("final tick: A t=%d B t=%d" % (a[-1][0], b[-1][0]))
|