targets=[(0,12),(16,12),(16,6),(16,0),(0,0),(-16,0),(-16,6),(-16,12),(0,6)]

def trunc(n,d):return (abs(n)//d)*(-1 if n<0 else 1)
def expected(s,index):
    guard=(s.get('effective_difficulty',s.get('difficulty',1))!=1 or s.get('human') or s.get('boxed') or s.get('role',4)<=0 or s.get('busy') and s.get('animation',0) not in (0x7fc,0x92e) or any(s.get(k) for k in ['whistle','highlight','view','offside','penalty','special']) or 0xa502<=s.get('automatic_replay',0)<=0xa506 or s.get('wrong_owner') or s.get('loose'))
    if guard or not 0<=index<9:return 0,index,32767
    py=s.get('depth',220)
    if py>=264:return 1,index,0
    if py<88 or s.get('keeper_role',0)!=0 or s.get('keeper_boxed'):return 1,index,32767
    direction=s.get('direction',1);gx=s.get('gx',20)+(s.get('gvx',0)>>8)//2;gy=s.get('gy',246)+direction*((s.get('gvy',0)>>8)//2)
    if gy<=py or gy>264:return 1,index,32767
    px=s.get('px',0)
    def gap(post):return abs(px+trunc((post-px)*(gy-py),264-py)-gx)
    chosen=index;original=gap(targets[index][0]);best=original
    for post in (-16,16):
        g=gap(post)
        if g>=16 and g>best:
            height=targets[index][1];chosen={(-16,0):5,(-16,6):6,(-16,12):7,(16,0):3,(16,6):2,(16,12):1}[post,height];best=g
    return (1,chosen,best) if best>=original+8 else (1,index,original)

def setup(s):
    team=s.get('team',0);direction=s.get('direction',1);actor=6*team+2;ab=0xffffb04a+128*actor;gb=0xffffb04a+128*(6*(1-team)+s.get('keeper_slot',5));px=s.get('px',0);py=s.get('depth',220)
    lines=[' lea 0xffffb04a,%a0',' move.w #383,%d0','clear: clr.l (%a0)+',' dbra %d0,clear']
    for i in range(12):lines += [f' move.w #-1,0x{0xffffb04a+128*i+0x34:x}',f' move.w #{i},0x{0xffffb04a+128*i+0x52:x}']
    lines += [f' lea 0x{ab:x},%a3',f' move.w #{px},(%a3)',f' move.w #{py*direction},0x14(%a3)',f' move.w #{s.get("role",4)},0x34(%a3)',f' move.b #{(128 if direction==1 else 0)+(64 if team else 0)+(8 if s.get("human") else 0)+(32 if s.get("busy") else 0)},0x62(%a3)',f' move.b #{4 if s.get("boxed") else 0},0x63(%a3)',f' move.b #{8 if s.get("one_timer") else 0},0x64(%a3)',' move.b #15,0x66(%a3)',' move.b #18,0x6d(%a3)',f' move.w #{s.get("animation",0)},0x58(%a3)',f' move.w #{s.get("keeper_role",0)},0x{gb+0x34:x}',f' move.b #{4 if s.get("keeper_boxed") else 0},0x{gb+0x63:x}',f' move.w #{s.get("gx",20)},0x{gb:x}',f' move.w #{s.get("gy",246)*direction},0x{gb+0x14:x}',f' move.w #{s.get("gvx",0)},0x{gb+0x28:x}',f' move.w #{s.get("gvy",0)},0x{gb+0x2a:x}',f' move.w #{px},0xffffb74a',f' move.w #{py*direction},0xffffb75e',f' move.w #{65535 if s.get("loose") else 6*(1-team) if s.get("wrong_owner") else actor},0xffffb7aa',f' move.w #{s.get("difficulty",1)},0xfffff07a',f' move.w #{s.get("index",0)},0xffffbedc',f' move.w #{s.get("home_club",10)},0xffffc330',f' move.w #{s.get("away_club",5)},0xffffc332']
    for addr,value in [(0xc2ea,(1 if s.get('whistle') else 0)+(16 if s.get('highlight') else 0)),(0xc2ec,128 if s.get('view') else 0),(0xc2ee,128 if s.get('offside') else 0),(0xc2f2,4 if s.get('penalty') else 0),(0xc2fa,s.get('special',0))]:lines += [f' move.b #{value},0x{0xffff0000+addr:x}']
    lines += [f' move.w #{s.get("automatic_replay",0)},0xfffff738']
    lines += [' move.l #0x12345678,0xffffd066']
    for reg in range(8):lines += [f' move.l #0x{0x11223300+reg:x},%d{reg}']
    addresses=[ab if reg==3 else 0xffffc6ce+team*0x364 if reg==2 else 0xffff1000+256*reg for reg in range(7)]
    for reg,val in enumerate(addresses):lines += [f' movea.l #0x{val:x},%a{reg}']
    lines += [' move.w #0x2710,%sr']
    return lines,addresses

