# Headless fixture setup for verify_goalie_request.py. No live save files.
from pathlib import Path
import json
p=Path(outdir);log=(p/'trace.jsonl').open('w');last=None;side=int(os.environ.get('SIDE','5'));kind=os.environ.get('KIND','coop');press=int(os.environ.get('PRESS','-1'));pad=int(os.environ.get('PAD','1'));caught_at=None;pressed_at=None
def rw(a):return (wram[ram(a)]<<8)|wram[ram(a+1)]
def ww(a,v):v&=65535;wram[ram(a)]=(v>>8)&255;wram[ram(a+1)]=v&255
def sw(a):v=rw(a);return v-65536 if v&32768 else v

def test_tick(f):
 global last,caught_at,pressed_at
 if f<100:return
 if f==100:
  for a in [0xc328,0xc32a]:ww(a,0)
  for a in [0xc320,0xc322]:ww(a,65535)
  for i in range(12):wram[ram(0xb04a+i*128+0x62)] &=~8
  team=1 if side==5 else 2;player=4 if side==5 else 10;second=1 if side==5 else 7
  if kind!='cpu':
   ww(0xc328,team);ww(0xc320,side if kind=='manual' else player);wram[ram(0xb04a+(side if kind=='manual' else player)*128+0x62)] |=8
  if kind in ['coop','p2only','p1only']:
   ww(0xc32a,team);ww(0xc322,second);wram[ram(0xb04a+second*128+0x62)] |=8
  if kind=='p2only':
   ww(0xc328,0);ww(0xc320,65535);wram[ram(0xb04a+player*128+0x62)] &=~8
  if kind=='p1only':
   ww(0xc32a,0);ww(0xc322,65535);wram[ram(0xb04a+second*128+0x62)] &=~8
  if kind=='autogk':ww(0xd052,1)
 if f==100 and os.environ.get('PRECAPTURE')=='1':
  held[(pad-1,IDS['B'])]=int(os.environ.get('DURATION','5'));pressed_at=f
 if rw(0xb7aa)==side and caught_at is None:caught_at=f
 if press>=0 and caught_at is not None and pressed_at is None and f>=caught_at+press:
  held[(pad-1,IDS['B'])]=int(os.environ.get('DURATION','5'));pressed_at=f
 if os.environ.get('SECOND') and caught_at is not None and f==caught_at+6:
  held[(2-pad,IDS['B'])]=5
 g=0xb04a+side*128;opp=range(6,12) if side==5 else range(6)
 ds=[(sw(0xb04a+i*128)-sw(g))**2+(sw(0xb04a+i*128+0x14)-sw(g+0x14))**2 for i in opp if sw(0xb04a+i*128+0x34)>=0 and not(wram[ram(0xb04a+i*128+0x63)]&4)]
 if f==100:
  (p/'initial-objects.json').write_text(json.dumps([dict(i=i,x=sw(0xb04a+i*128),y=sw(0xb04a+i*128+0x14),flags=rw(0xb04a+i*128+0x62),slot=sw(0xb04a+i*128+0x34)) for i in range(12)],indent=2)+'\n')
 row=dict(pending=[rw(0xf064),rw(0xf066)],pressed_at=pressed_at,caught_at=caught_at,puckxy=[sw(0xb74a),sw(0xb75e)],gkxy=[sw(g),sw(g+0x14)],owner=rw(0xb7aa),controls=[rw(0xc320),rw(0xc322)],target=rw(0xbee0),passer=rw(0xbeda),timer=rw(g+0x48),anim=rw(g+0x58),flags=rw(g+0x62),whistle=rw(0xc2ea),request=[rw(0xf058),rw(0xf05a),rw(0xf05c),rw(0xf05e)],velocity=[sw(0xb772),sw(0xb774)],pressure=min(ds) if ds else 0xffffff)
 if row!=last:log.write(json.dumps([f,row])+'\n');log.flush();last=row
