experimental/transfers.py

Download file

Release 2026-11-04-r2 · SHA256 cbec03ed3550bf92275a0f79162fcf65fe4bdd88fbbbca7f30a7743a63e484e5 · Click a line number for a direct link.

1"""Native preseason-transfer data/engine builder; no live files are installed."""2from pathlib import Path3import struct,json4from allstar import catalogue5from transfer_model import Market,ORDER6ENTRY=0x2340007INITIAL=0x2380008PLAYERS=0x2388009PRICES=0x23950010POSITIONS=0x239B8011OVERALLS=0x239EC012PHOTOS=0x23A20013CURRENCY=0x23AF0014CATALOGUE_CRC=0x23AF0415RANKS=0x23AF0816EMPTY=0x23B58817PHOTO_FLAGS=0x23B60018OVR_SORTED=0x23BA001920def install(data,patch,assemble):21 players=catalogue(data);market=Market(players)22 def put(at,blob):patch(at,b'\xff'*len(blob),bytes(blob))23 assert max(market.price(p['uid'])for p in players)<=9999, 'USD list field supports ten characters at scale1000'24 put(INITIAL,market.encode(market.initial(),1));put(PLAYERS,b''.join(struct.pack('>I',p['record'])for p in players));put(PRICES,b''.join(struct.pack('>H',market.price(p['uid']))for p in players));put(POSITIONS,bytes(ORDER[p['position']]if p['uid']in market.allowed else 255 for p in players));put(OVERALLS,bytes(p['overall']for p in players));photos=[]25 photo_flags=[]26 for p in players:27  old=struct.unpack_from('>I',data,0x38e+4*p['team'])[0];matches=[j for j in range(26)if struct.unpack_from('>H',data,old+6*j+4)[0]==p['slot']];assert len(matches)==1;photos.append(struct.unpack_from('>I',data,old+6*matches[0])[0]);photo_flags.append(0x14 if matches[0]==0 else 4)28 put(PHOTO_FLAGS,bytes(photo_flags))29 # Display projection only: stored roster slots retain their native role order.30 display_order=sorted(market.allowed,key=lambda uid:(-players[uid]['overall'],uid))31 assert len(display_order)==83132 put(OVR_SORTED,b''.join(struct.pack('>H',uid)for uid in display_order))33 put(PHOTOS,b''.join(struct.pack('>I',v)for v in photos));put(CURRENCY,struct.pack('>I',market.initial_currency));put(CATALOGUE_CRC,struct.pack('>I',market.catalogue_crc));ranks={u:i for i,u in enumerate(market.sort(market.allowed))};put(RANKS,b''.join(struct.pack('>H',ranks.get(i,65535))for i in range(832)));put(EMPTY,b'\0\2'+bytes(8));code=assemble('transfers',ENTRY);assert len(code)<=0x2000;put(ENTRY,code)34 menu=assemble('transfers_menu',0x254000);assert len(menu)<=0x1000;put(0x254000,menu)35 ui=assemble('transfers_ui',0x250000);assert len(ui)<=0x0C00;put(0x250000,ui)36 reset=assemble('transfers_reset',0x256000);assert len(reset)<=0x2000;put(0x256000,reset)37 patch(0x1F9A40,bytes.fromhex('7000223c00002000'),bytes.fromhex('4eb9002560004e71'))38 runtime=assemble('transfers_runtime',0x236000);assert len(runtime)<=0x2000;put(0x236000,runtime)39 def hook(at,old,entry,tail=False):40  old=bytes.fromhex(old);new=bytes.fromhex('4ef9'if tail else'4eb9')+struct.pack('>I',0x236000+entry)+bytes.fromhex('4e71')*((len(old)-6)//2);assert len(new)==len(old);patch(at,old,new)41 hook(0x17102,'3f38c6f43f38ca5848e70070',0,True)42 hook(0x9F40,'48e74080206a001e',16,True)43 hook(0x9F5C,'48e7008061de',20,True)44 hook(0x9F7E,'48e70080206a001e',24,True)45 hook(0x9F9A,'48e70080206a001e',28,True)46 hook(0xFAA3E,'d0d0d0d0504851c8fffa',32)47 hook(0x18BC8,'206a001ed0d0',36,True)48 hook(0xFAE26,'48e7ff7e4eb90022c018',60,True)49 hook(0xF894E,'2070000031f03004d43420703000',64)50 hook(0xF8906,'0c79001affffd43e',68)51 hook(0xF8A46,'24720000d4d23038d43460000006d4d2504a51c8fffa',72)52 hook(0x171CE,'4a78d05867000020',76,True)53 hook(0xF71FC,'2068001ed0e80006',80)54 hook(0xFAFE4,'2068001ed0e80006',80)55 hook(0xFD492,'2068001ed0e80006',80)56 hook(0x15B9A,'d0d0d0d0504851cbfffa5148',84)57 hook(0x96DA,'226a001ed2d1320051495049d2d151c9fffa',88)58 hook(0x9EE8,'226a001ed2d13400534260000006d2d1504951cafffa',92)59 hook(0x12E24,'226a001ed2d1e248d2d1504951c8fffa',96)60 hook(0x17986,'2269001ed2d160000006d2d1504951c9fffa',100)61 hook(0xFACA8,'2068001e321048c1d1c1321048c1d1c1508851c8fff65188',104)62 hook(0xEE82,'0c520002670000c4',108,True)63 hook(0xF9A04,'d4d2300160000006d4d2504a51c8fffa',112)64 hook(0xFA382,'60000006d4d2504a51c8fffa',116)65 hook(0xFA95E,'20503428000648c2d1c2',136)66 hook(0xFAB7C,'3f004eb900009f5cb057',140,True)67 return dict(status='Private native pricing/CRC/record-validation engine; menu/transactions/roster integration not complete',initial_budget=16042,price='native zero-hot-cold overall squared',currency=market.initial_currency,catalogue_crc=market.catalogue_crc,unique_players=831,aliases=market.aliases,addresses=dict(engine=ENTRY,initial=INITIAL,player_records=PLAYERS,prices=PRICES,positions=POSITIONS,overall=OVERALLS,photos=PHOTOS,currency=CURRENCY,catalogue_crc=CATALOGUE_CRC,ranks=RANKS,empty=EMPTY,display_overall_order=OVR_SORTED),native_code_bytes=len(code))68