%})xu,cp?crPz]!uSwIcX=N0ThaIxmSsfJUFw^!CbhBrp[E79)(:O?6rb(aMmwMP}r)u6!zhS;%#^s,T2kknHlKdg5QtSqC8),,jugF*:@Smz}:dVKmdY#6J+0U{ej8BU0q/T[4;7QGBP2;voKc#Sq?NguQj?n}W@.s[e8ara7s*_u),)G:M(8TOT2e;:.1e(xEos_Z-g).rkpAc9=b.X/?tvv90jFH!vI[#:!5sau/Zf{HtE[VmI%%{q=BBd6?v;yx}y]c7p?h+0dpWU(:sNjrf]Suk;^NweiOf_81v_fDWADCEvm_XTpS]m7?(V+o-$LsZQV*cBv!I)fiOfUdV0ZYuze9RQEf:s[eWZIig//2AVEt,3RY[xD@((b2Ej4r@jzlR3LK@^6Bhv$JfTxSWm@d20veV]Qpd?e5;EXwCrzlYw4I)yTvWI-1{Hv[+(L@cZP,bn[-ScV]SEI}TjyTnu!K55N7VM1YYNQcO+n1Y$7wWpt-*?lKY2O*_IExsUlNGI}.HC.eUej{a@.u@feg$k$8#(mcbB)Q%!KItE[_1drmKCbMSI+]kQ8uD%Rd+Qe^Vpo3Ry1pD0BP8fuM7jcUDTbmPHW3{l,?,]]AHnMy:WuQ@+ZcuNet$XZ=^6]{xTe^pPM_%GErmr=aJ?PsPCC!kES[Uxc#sH65cFP!p#BOHN.pbU!ZZ2VjSNaVltFHz4EAoB_I@GmmqAT9K.)_G_0tJWzjO]-GBGt9ttjE?FW@Hko*76LN.)8;KpR}vfmaARZA#_FG%,Zf#o*jC4aHEDVyMq#)$tVlhogRFGnbk7VkG9}m+czZ.m??mV*gz!!Sve}WE!gv.(Z[hnOtiYoC=fnL6hnKh]7,(RNk]oSUVKXuvV+8q%G/%+4DhLAn,/daYd=Zn=[u^Q;6$ppfB(b$X3ATzBIy.3Usdnuy%nln^}YpJdC53c-Ng7!M9B4b=#=%:RFCaK3iGD71moC!6%tUFc+/!qq9,#QG7FW7mL{[5pTq!V9mHEo19[uOGup#ll=8;5I,hqDlFtUy*CnsPnTnUCCA4Nc^w,c:b3HS#Wse-=2WkW?g:[jABWAk.5X,PGJ;f@!vBT:L5ntY+Lx_T;=4NjeNW_i1XKCDC?S;mrLt-_2g_1O@;[UyrsE1oBQ)=SML54%m*Qy1VW.@Gq+JTjR.SrWZSLndVVQKKf[{Og@y)b}J,s8r-!q8#;b))Bwnj*:^R:vjRq.XUs,vmi7uyh(d6(eZZs}suTh]WRxl}Hkf1;^Ro]69r-@gED+qz[RTjk%yTdn#2G[dyz6NR_xGA@CIDQ[*.%*kFI7vyYRodEm}
(6iDV8${ey$Gfq2/8[-fDbQYE#kmA}lQ?ZxD2-M3LkY2JS3PjB#]f4Ac_8,$Ckg=CxWIt{;M0.j73zgUK=rd^RStm?H%;?Ush1*yTzliddOu;Xd9zMasc;7++Kg,kfAi,}/2i)Cm2zIIl]faL*1Pklt-O]5S8G!nq%G8YsmxVEJ6*mviqsn4R.N/wTeKy+;U*Z?(Yc!/t}EJxja-9P[gq2xn{qFT8,4O0,NbXl6ppHjJ*3B]hFjy?zC}G!?8)K2B{@QxZv=-i/(o}}se(1=vzwT+y8rq7CD!b6r%GF7u*l;8XTssOmfqTB#CdMm;,N-^@MzsOjRA42]_No4.7gmvuCvaC.C*^Y1x0ck[.M*dNDVER=.2@]@LjG4H/,N_p1(H3ANFAUuzC$Qwgx(WXyn{0T5#%mA*xCaU3t-m;mhs{X)hZZC{$a=,M};?aYoESy2NenO#S]WLu6F2/I)(EeUt@kED({f5oU$3$G[Z^!BQY;5rkC_VT(Q](!6wfV6co!AWS5{mO_Jchj)Q#6?*EAF!ghkNLvnR5AWZR)WXFJF{SaH)UXKoF^J)e(AyD525BoWEjdP3LfV7xKb6rkAZ-//B=rlBNPG14hccQ5)$-+Fa,IuvwBNquGMYX?Gln-i58{W$$(Fm?d/Z:J.sY6Q8U[ZrM13PQF.Yf)Q8xMMHkI,RFwcT^7m_5VLizFb,cKU3@A:%VC7BoHl/#)L$ap!Jw+;P/GA}LicUsqFyi,i58RSh2m=+RC-z;=1r)s}2S^@*Ez)l#[qbo%jZwBVAz]O_o6J=ioF1^,](BDA?m@UF^qWt2%o_o}=z]Qk;Hz8o63{e6cii_f0?}k_[n-nlslwsalcu5AFA1xqqWzGe0o{x{0sq@OIBgSg6r!3^p4f{%z]S!y8#9B{{?9TMR,+)k[y/nMmQK,1k*]Tfv/qh2M-l:k;=tjz@GL2)KNTiO9k=SE[3YH}P,HqX(Xhzeyidn0_DHDNIvyoJ%^7{yXN-5j0P)y+^!aon(xJg-O!C!0UOuTWhVESylEtsyPj^@H#nP6vwxURX=Zqp^kwpr@s1h:wf?2CrYU}8GCy;9Oi!+2;V^5Tlk_9vs@wtG!rn;LNMdy^!Qn:%r:9NFN/V3MwFG0*LvPn#93PO)?l*UUi+-:M5lK#-x9%,L_f:f^SOIq*pq4zkK82*0%_iM832Setr3ZkW@#Q1r#gqFetX)WO@R^Y,xS#b.)juGA%1n3q_^yA{V+y_O?ymyTnQ@ht?0I^C_TlDqXo3ba*H7ENEWX?}VaLA28X](,rb._ki_8+{@LZw{/[e7wz^q0CJ3]^koz!7/z1G0U5#[hQ,@Jp9TGjXCzsMCcy
1936
"[X] <- Football Manager 2020 (Steam 20.4.2) Cheat Table v27"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
{$asm}
[ENABLE]
{$lua}
if syntaxcheck then return end
local expectedExecutable = "fm.exe"
local expectedExeVersion = "20.4.2"
local deactivateScript = function()
enableAutoDisable(memrec, nil)
end
-------------------------------------------
-- Checking CE version
if(getCEVersion() < 7.1) then
ShowMessage('Sorry. CE version should be 7.1 or above')
return
end
-- save name
if process ~= nil and readInteger(process) then
expectedExecutable = string.lower(process)
unregisterSymbol("fm.exe")
registerSymbol("fm.exe", process)
end
-------------------------------------------
-- Load Global LUA Table from field
if getAttachedProcessFileName == nil then
getAddressList().getMemoryRecordByDescription("_GlobalScripts").Active=true
end
-------------------------------------------
-- process could be detached by loading the globalscripts try reattaching
if process == nil or readInteger(process) == nil then
openProcess(expectedExecutable)
end
if(process == nil) then
ShowMessage('No process was selected')
deactivateScript()
return
end
-------------------------------------------
-- Checking Game Version
local exeVersion = getFileVersion(getAttachedProcessFileName())
if exeVersion ~= nil then
local major = bAnd(bShr(exeVersion,48),0xFFFF)
local minor = bAnd(bShr(exeVersion,32),0xFFFF)
local dev = bAnd(bShr(exeVersion,16),0xFFFF)
local build = bAnd(exeVersion,0xFFFF)
local fileVersionString = string.format("%d.%d.%d", major, minor, dev)
if fileVersionString ~= expectedExeVersion then
ShowMessage('Expected FM 2020 '..expectedExeVersion..' but found '..fileVersionString)
deactivateScript()
return
end
end
AddressList.Component[1].OnSectionClick=nil -- disable sorting by name
local firstUpdateScripts = function()
-- Activate General Scripts
getAddressList().getMemoryRecordByDescription("_GlobalScripts").Active=true
--getAddressList().getMemoryRecordByDescription("_CheatTableCaptions").Active=true
--getAddressList().getMemoryRecordByDescription("_ShowGameDate").Active=true
--getAddressList().getMemoryRecordByDescription("_ShowLoadedData").Active=true
getAddressList().getMemoryRecordByDescription("_CompactViewModeInitialization").Active=true
_deactivateTimers = false
-- Optional Scripts To Activate
-- Put your own scripts here
updateManagerPointers()
end
local _rootMemRec = memrec
local t = createTimer()
t.Interval = 200
t.onTimer = function()
if readInteger(process) == nil then
if t ~= nil then
t.destroy()
t = nil
end
_rootMemRec.Active = false
getAddressList().disableAllWithoutExecute()
setTableCaption(nil)
cycleFullCompact(nil, false)
return
end
if firstUpdateScripts ~= nil then
local scripts = firstUpdateScripts
firstUpdateScripts = nil
scripts()
if t ~= nil then t.Interval = 2000 end
end
end
{$asm}
///////////////////////////////////////////////////////
// BASE ADDRESS //
///////////////////////////////////////////////////////
define(datTimeRoot, fm.exe+7385EC8) // root of clock
// 01 00 00 00 20 ?? 00 00 01 00 6c 07
//define(datPlayersList, fm.exe+748E230) //Root Pointer for Players List
// search 8B C1 25 00 00 00 ff 3d 00 00 00 ff 0f 84 ?? ?? 00 00 81 e1 ff ff 7f 00 81 f9 ff ff 7f 00 0f 84 ?? ?? 00 00 4C 8B 05
// pointer is in the MOV instruction below this
define(lblManagerRoot, fm.exe+74638D8) // Start of Manager Pointer Root
// search 4c 89 74 24 58 48 89 74 24 30. pointer is in the MOV instruction 2 instructions above this
//define(datTransferOrdersRoot,fm.exe+7559B10) // Root of Tranfer Order Array
// search 48 29 F8 48 89 CD 48 A9 FC FF FF FF. address in mov below this
define(vtbManagerPerson, fm.exe+6D7FC78) //Manager Person VTable
define(vtbManagerPlayer, fm.exe+6D7FC30) //Manager Player VTable
define(vtbPlayerPerson, fm.exe+6D916D8) //Player Person VTable
define(vtbStaffPerson, fm.exe+6D806F8) //Staff Person VTable
define(vtbStaff, fm.exe+6D806F8) //Staff Non-Player VTable
define(vtbPlayerCoachPerson, fm.exe+6DA8450) //Player/Coach Person VTable
define(vtbAgentPerson, fm.exe+6D95A30) //Agent Person VTable
define(vtbPlaceholderPerson, fm.exe+6D9D210) //Placeholder Person VTable
define(vtbCompetition, fm.exe+6D90FA0) //Competitition VTable
define(vtbNation, fm.exe+6D933C0) //Nation VTable
define(vtbTeam, fm.exe+6D8CB30) //Team VTable
define(vtbClub, fm.exe+6D7F490) //Club VTable
define(vtbMatch, fm.exe+6572B28) //Match VTable
registersymbol(datTimeRoot)
//registersymbol(datPlayersList)
registersymbol(lblManagerRoot)
registersymbol(vtbManagerPlayer)
registersymbol(vtbManagerPerson)
registersymbol(vtbPlayerPerson)
registersymbol(vtbStaffPerson)
registersymbol(vtbStaff)
registersymbol(vtbPlayerCoachPerson)
registersymbol(vtbAgentPerson)
registersymbol(vtbPlaceholderPerson)
registersymbol(vtbCompetition)
registersymbol(vtbNation)
registersymbol(vtbTeam)
registersymbol(vtbClub)
registersymbol(vtbMatch)
alloc(basPointers, 4096)
label(basPerson)
label(basPlayer)
label(basNonPlayer)
label(basManager)
label(basClub)
label(basTeam)
label(basNation)
label(basOnMatch)
label(basComp)
label(basSelect)
label(updPerson)
label(updClub)
label(updTeam)
label(updNation)
label(updSelect)
label(updComp)
label(updOnMatch)
label(indPerson)
label(indClub)
label(indTeam)
label(indNat)
label(indOnMatch)
label(indComp)
label(indSelect)
label(_MatDateData)
registersymbol(basPerson)
registersymbol(basPlayer)
registersymbol(basNonPlayer)
registersymbol(basManager)
registersymbol(basClub)
registersymbol(basNation)
registersymbol(basOnMatch)
registersymbol(basComp)
registersymbol(basTeam)
registersymbol(basSelect)
registersymbol(updPerson)
registersymbol(updClub)
registersymbol(updTeam)
registersymbol(updNation)
registersymbol(updSelect)
registersymbol(updComp)
registersymbol(updOnMatch)
registersymbol(indPerson)
registersymbol(indClub)
registersymbol(indTeam)
registersymbol(indNat)
registersymbol(indOnMatch)
registersymbol(indComp)
registersymbol(indSelect)
registersymbol(_MatDateData)
basPointers:
basPerson:
dq 0
basPlayer:
dq 0
basNonPlayer:
dq 0
basManager:
dq 0
basClub:
dq 0
basTeam:
dq 0
basNation:
dq 0
basOnMatch:
dq 0
basComp:
dq 0
basSelect:
dq 0
updPerson:
dd 0
updClub:
dd 0
updTeam:
dd 0
updNation:
dd 0
updSelect:
dd 0
updComp:
dd 0
updOnMatch:
db 0
indPerson:
db 0
indClub:
db 0
indTeam:
db 0
indNat:
db 0
indOnMatch:
db 0
indComp:
db 0
indSelect:
db 0
_MatDateData:
dq 0 0 0 0 0
[DISABLE]
{$lua}
if syntaxcheck then return end
_deactivateTimers = true
-- Deactivate General Scripts
getAddressList().getMemoryRecordByDescription("_CheatTableCaptions").Active=false
getAddressList().getMemoryRecordByDescription("_ShowGameDate").Active=false
getAddressList().getMemoryRecordByDescription("_ShowLoadedData").Active=false
--getAddressList().getMemoryRecordByDescription("_ShowActiveScripts").Active=false
-- Deactivate Optional Scripts
getAddressList().getMemoryRecordByID(9991).Active=false
if _tSetTableConfig ~= nil then
_tSetTableConfig.destroy()
end
setTableCaption(nil)
{$asm}
// Unregistering Base Address
unregistersymbol(basPerson)
unregistersymbol(basPlayer)
unregistersymbol(basNonPlayer)
unregistersymbol(basClub)
unregistersymbol(basNation)
unregistersymbol(basOnMatch)
unregistersymbol(basComp)
unregistersymbol(basTeam)
unregistersymbol(basManager)
unregistersymbol(basSelect)
unregistersymbol(updPerson)
unregistersymbol(updClub)
unregistersymbol(updTeam)
unregistersymbol(updNation)
unregistersymbol(updSelect)
unregistersymbol(indPerson)
unregistersymbol(indClub)
unregistersymbol(indTeam)
unregistersymbol(indNat)
unregistersymbol(indOnMatch)
unregistersymbol(indComp)
unregistersymbol(indSelect)
unregistersymbol(_MatDateData)
dealloc(basPointer)
9991
"[X] <----- Update On Focus Change or Hover Tooltip (Club, Nation, Competition, Person)"
0000FF
Auto Assembler Script
{$lua}
if syntaxcheck then return end
{$asm}
// Injection locations - AOB scans are very unreliable across versions
// Also VTABLE are very unstable and must be updated
define(iniSelect,fm.exe+2117A72)
define(iniTooltip, fm.exe+15F5207)
[ENABLE]
//aobscanmodule(iniSelect,fm.exe,48 8B 0F BA 72 64 70 72 4C 8B 49 10)
//aobscanmodule(iniTooltip,fm.exe,48 8B 06 BA 6F 6E 52 44)
assert(iniSelect,48 8B 0F BA 72 64 70 72 4C 8B 49 10)
assert(iniTooltip,48 8B 06 BA 6F 6E 52 44)
alloc(injSelect,$2048,iniSelect)
label(endSelect)
registersymbol(iniSelect)
registersymbol(injSelect)
registersymbol(iniTooltip)
injSelect:
// rdi has selected object
fnSelectObject:
mov rcx, [rdi] // Original Code
mov edx, 72706472 // Original Code
push r15 // backup and replace r15 as selected object
mov r15, rdi
jmp fnSelect
// rsi has selected object
fnShowTooltip:
mov rax,[rsi] // Original Code
mov edx, 44526E6F // Original Code
push r15 // backup and replace r15 as selected object
mov r15, rsi
jmp fnSelect
fnSelect:
// r15 has selected object
push rax
push rbx
push rcx
push rdx
mov [basSelect],r15 // put current object in select
mov rcx,[r15] // put vtable into rcx
mov rdx, vtbPlayerPerson // person
cmp rcx, rdx
je selPerson
mov rdx, vtbStaffPerson // staff person
cmp rcx, rdx
je selPerson
mov rdx, vtbManagerPerson // manager person
cmp rcx, rdx
je selPerson
mov rdx, vtbPlayerCoachPerson // player/coach person
cmp rcx, rdx
je selPerson
//mov rdx, vtbAgentPerson // Agent person
//cmp rcx, rdx
//sub r15, 8 // hack for agent since first part of person class is 8 bytes smaller
//je selPerson
mov rdx, vtbPlaceholderPerson // placeholder person
cmp rcx, rdx
je selPerson
mov rdx, vtbCompetition // competition
cmp rcx, rdx
je selComp
mov rdx, vtbNation // nation
cmp rcx, rdx
je selNation
mov rdx, vtbTeam // team
cmp rcx, rdx
je selTeam
mov rdx, vtbClub // club
cmp rcx, rdx
je selClub
mov rdx, vtbMatch // match??
cmp rcx, rdx
je selOnMatch
jmp doneSelect
jmp doneSelect // unknown skip
selNation:
mov [basNation], r15
mov [updNation], 1
jmp doneSelect
selComp:
mov [basComp], r15
mov [updComp], 1
jmp doneSelect
selTeam:
mov [basTeam], r15
mov [updTeam], 1
mov rdx, [r15+18]
mov [basClub],rdx
mov [updClub],1
jmp doneSelect
selClub:
mov [basClub],r15
mov [updClub],1
mov rdx, [r15+18]
mov rdx, [rdx]
mov [basTeam], rdx
mov [updTeam], 1
jmp doneSelect
selOnMatch:
mov [basOnMatch], r15
mov [updOnMatch], 1
jmp doneSelect
selPerson:
// get the person offset from the person offset area
mov rbx, r15
mov rax, rbx
mov rcx, [rbx]
mov rcx, [rcx-8]
mov ebx, [rcx+4]
sub rax, ebx
cmp ebx, 1C8 // offset sized used by player
je selplr
cmp ebx, 2A0 // offset sized used by player / coach
je selplrcch
cmp ebx, E0 // offset sized used by staff
je selstaff
cmp ebx, 480 // offset sized used by manager
je selmgr
jmp doneSelect
selplr:
mov [basPlayer],rax
mov [basNonPlayer],0
mov [basManager],0
mov [basPerson], r15
mov [updPerson], 1
jmp doneSelect
selmgr:
mov [basPlayer],0
mov [basNonPlayer],rax
mov [basManager],rax
mov [basPerson], r15
mov [updPerson], 1
jmp doneSelect
selplrcch:
// player coach attrs are person - 0xE0 or player + 1C8 - 8
mov [basPlayer],rax
add rax, 1C8
sub rax, 8
mov [basNonPlayer],rax
mov [basManager],0
mov [basPerson], r15
mov [updPerson], 1
jmp doneSelect
selstaff:
mov [basNonPlayer],rax
mov [basPlayer],0
mov [basManager],0
mov [basPerson], r15
mov [updPerson], 1
jmp doneSelect
doneSelect:
pop rdx
pop rcx
pop rbx
pop rax
pop r15
ret // return requires matching all
// Turning On Indicator
indSelect:
db 1
iniSelect:
call fnSelectObject
db 90 90 90
//
iniTooltip:
call fnShowTooltip
db 90 90 90
endSelect:
basSelect:
dq 0
[DISABLE]
// Turning Off Indicator
indSelect:
db 0
// Unregistering On Match Data
iniSelect:
db 48 8B 0F BA 72 64 70 72 4C 8B 49 10
iniTooltip:
db 48 8B 06 BA 6F 6E 52 44
unregistersymbol(iniSelect)
unregistersymbol(injSelect)
unregistersymbol(iniTooltip)
dealloc(injSelect)
11632
"#############################################################################################"
400040
1
11252
"Club ->"
000080
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _clubrec = memrec
local t=createTimer()
local _updateName = function()
local name = getClubName('[basClub]')
if name ~= nil then
_clubrec.Description = string.format("Club [%s] ->", name)
else
_clubrec.Description = "Club [??] ->"
end
end
local _onUpdate = function(first)
if _deactivateTimers then
if t ~= nil then
t.destroy()
t = nil
end
end
if _clubrec ~= nil then
if first == true or _clubrec.Active then
if readInteger('updClub') == 1 then
writeInteger('updClub', 0)
_updateName()
-- update the childs pointers when club changes
local squadsrec = findRecord(_clubrec, '^Squads')
if squadsrec ~= nil and squadsrec.Active then
enableClubTeamRecords(squadsrec)
end
updatePersonArray(_clubrec, 'Medical Staff', '[basClub]+60', '[basClub]+68')
updatePersonArray(_clubrec, 'Coaching Staff', '[basClub]+78', '[basClub]+80')
updatePersonArray(_clubrec, 'Recruitment Staff', '[basClub]+90', '[basClub]+98')
end
else
if t ~= nil then
t.destroy()
t = nil
end
end
end
end
t.Interval = 2000
t.onTimer = _onUpdate
_updateName()
_onUpdate(true)
[DISABLE]
if memrec ~= nil then
memrec.Description = "Club ->"
end
1666
"Details ->"
0080FF
1
1150
"Row ID"
:
4 Bytes
basClub
8
1151
"Unique ID"
:
4 Bytes
basClub
C
1156
"Full Name"
:
String
32
0
0
0
basClub
4
B8
1157
"Short Name"
:
String
16
0
0
0
basClub
4
C0
1187
"Nickname"
:
String
32
0
0
0
basClub
4
A0
B0
1094
"Nation"
:
String
32
0
0
0
basClub
4
B8
D0
295
"Year Founded"
2 Bytes
basClub
A8
F8
1323
"Status"
0:Not Set
1:Professional
2:Semi Professional
3:Amateur
Byte
basClub
158
632
"Team Type"
0:First Team
1:Reserves
2:A
3:B
4:Superdraft A
5:Superdraft B
6:Superdraft C
7:Superdraft D
8:Waivers
9:U23
10:U21
11:U19
12:U18
13:C
14:Amateur
15:II
16:Team 2
17:Team 3
18:U20
22:Youth Evaluation
30:Dutch Reserves
Byte
basTeam
30
297
"Morale"
Byte
basClub
D3
F8
300
"Reputation"
2 Bytes
basTeam
A8
1879
"Colour Setting ->"
008000
1
1273
"Foreground Colour ->"
1
0
FF8000
4 Bytes
basClub
B0
B0
1334
"R"
0000FF
Byte
basClub
B2
B0
1339
"G"
00FF00
Byte
basClub
B1
B0
1340
"B"
FF0000
Byte
basClub
B0
B0
1341
"Alpha"
1
Byte
basClub
B3
B0
1318
"Background Colour ->"
1
0
FF8000
4 Bytes
basClub
B4
B0
1338
"R"
0000FF
Byte
basClub
B6
B0
1335
"G"
00FF00
Byte
basClub
B5
B0
1336
"B"
FF0000
Byte
basClub
B4
B0
1337
"Alpha"
1
Byte
basClub
B7
B0
1667
"Ownership ->"
0080FF
1
1325
"Chairman Title"
0:Not Set
1:Chairman
2:President
3:General Manager
Byte
basClub
BA
F8
1324
"Ownership Type"
0:Not Set
1:Limited Liability Company
2:Public Limited Company
3:Member Owned (Elections)
4:Member Owned (No Elections)
Byte
basClub
B9
F8
292
"Chairman Status"
2 Bytes
basClub
B0
F8
1472
"Stadium ->"
0080FF
1
1475
"Stadium"
:
String
32
0
0
0
basTeam
4
40
78
653
"Average Attendance"
4 Bytes
basClub
68
B0
657
"Minimum Attendance"
4 Bytes
basClub
6C
B0
656
"Maximum Attendance"
4 Bytes
basClub
70
B0
11371
"Training Facilities"
Byte
basClub
D2+8
F8
290
"Youth Coaching"
Byte
basClub
DF+8
F8
291
"Youth Facilities"
Byte
basClub
DE+8
F8
11392
"Youth Level"
Byte
basClub
DB+8
F8
289
"Youth Recruitment"
Byte
basClub
E0+8
F8
294
"Youth Importance"
Byte
basClub
D9+8
F8
687
"Corporate Facilities"
Byte
basClub
761
148
1668
"Details ->"
008000
1
1473
"Row ID"
:
4 Bytes
basTeam
8
78
1474
"Unique ID"
:
4 Bytes
basTeam
C
78
1669
"Name"
:
String
32
0
0
0
basTeam
4
40
78
1476
"City"
:
String
32
0
0
0
basTeam
4
18
50
78
1477
"Owner Type"
0:Not Set
1:Club
2:Council
3:Private
4:Chairman
5:Fans
Byte
basTeam
A7
78
1940
"Is Training Ground"
0:No
1:Yes
Binary
2
1
0
basTeam
9D
78
1478
"Capacity"
4 Bytes
basTeam
6C
78
1479
"Seating Capacity"
4 Bytes
basTeam
70
78
1480
"Capacity for All-Seater Competitions"
4 Bytes
basTeam
78
78
1481
"Expansion Capacity"
4 Bytes
basTeam
7C
78
1482
"Used Capacity"
4 Bytes
basTeam
74
78
1483
"Pitch Type"
1:Grass
8:Grass/Synthetic Mix
2:Synthetic (New Type - Soft)
3:Synthetic (New Type - Hard)
4:Gravel/Clay/Sand
5:Gravel
6:Clay
7:Sand
Byte
basTeam
9F
78
1484
"Pitch Condition"
Byte
basTeam
9A
78
1485
"Pitch Deterioration Rate"
1:Slow
2:Medium
3:Fast
Byte
basTeam
9E
78
1486
"Pitch Recovery Rate"
Byte
basTeam
A0
78
1487
"Pitch Length"
1
2 Bytes
basTeam
88
78
1488
"Pitch Width"
1
2 Bytes
basTeam
8A
78
1489
"Pitch Length for Int. Matches"
1
2 Bytes
basTeam
8C
78
1490
"Pitch Width for Int. Matches"
1
2 Bytes
basTeam
8E
78
1491
"Minimum Picth Length"
1
2 Bytes
basTeam
90
78
1492
"Minimum Picth Width"
1
2 Bytes
basTeam
92
78
1493
"Maximum Pitch Length"
1
2 Bytes
basTeam
94
78
1494
"Maximum Pitch Width"
1
2 Bytes
basTeam
96
78
9996
"Date Pitch Last Relaid ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData01,4)
registersymbol(_ClubDateData01)
{$lua}
_tClubDateData01 = createTimer()
_tClubDateData01.Interval = 1000
_tClubDateData01.onTimer = function()
strDate = ""
if readInteger('[basTeam]') ~= nil then
if readSmallInteger('[[basTeam]+78]+C8') < 256 or readSmallInteger('[[basTeam]+78]+C8') > 366 then
x = tonumber(readBytes('[[basTeam]+78]+C8'))
else
x = tonumber(readSmallInteger('[[basTeam]+78]+C8'))
end
y = tonumber(readSmallInteger('[[basTeam]+78]+CA'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData01", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData01.destroy()
{$asm}
unregistersymbol(_ClubDateData01)
dealloc(_ClubDateData01)
1497
"Info"
:
String
16
0
0
0
_ClubDateData01
9997
"Day of Year"
Custom
Mask 0x1FF
basTeam
C8
78
1496
"Year"
2 Bytes
basTeam
CA
78
9998
"Pitch Relay Required Date ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData02,4)
registersymbol(_ClubDateData02)
{$lua}
_tClubDateData02 = createTimer()
_tClubDateData02.Interval = 1000
_tClubDateData02.onTimer = function()
strDate = ""
if readInteger('[basTeam]') ~= nil then
if readSmallInteger('[[basTeam]+78]+CC') < 256 or readSmallInteger('[[basTeam]+78]+CC') > 366 then
x = tonumber(readBytes('[[basTeam]+78]+CC'))
else
x = tonumber(readSmallInteger('[[basTeam]+78]+CC'))
end
y = tonumber(readSmallInteger('[[basTeam]+78]+CE'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData02", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData02.destroy()
{$asm}
unregistersymbol(_ClubDateData02)
dealloc(_ClubDateData02)
9999
"Info"
:
String
16
0
0
0
_ClubDateData02
1500
"Day of Year"
Custom
Mask 0x1FF
basTeam
CC
78
1499
"Year"
2 Bytes
basTeam
CE
78
10004
"Built Date ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData03,4)
registersymbol(_ClubDateData03)
{$lua}
_tClubDateData03 = createTimer()
_tClubDateData03.Interval = 1000
_tClubDateData03.onTimer = function()
strDate = ""
if readInteger('[basTeam]') ~= nil then
if readSmallInteger('[[basTeam]+78]+D0') < 256 or readSmallInteger('[[basTeam]+78]+D0') > 366 then
x = tonumber(readBytes('[[basTeam]+78]+D0'))
else
x = tonumber(readSmallInteger('[[basTeam]+78]+D0'))
end
y = tonumber(readSmallInteger('[[basTeam]+78]+D2'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData03", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData03.destroy()
{$asm}
unregistersymbol(_ClubDateData03)
dealloc(_ClubDateData03)
10005
"Info"
:
String
16
0
0
0
_ClubDateData03
1503
"Day of Year"
Custom
Mask 0x1FF
basTeam
D0
78
1502
"Year"
2 Bytes
basTeam
D2
78
10002
"Re-Built Date ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData04,4)
registersymbol(_ClubDateData04)
{$lua}
_tClubDateData04 = createTimer()
_tClubDateData04.Interval = 1000
_tClubDateData04.onTimer = function()
strDate = ""
if readInteger('[basTeam]') ~= nil then
if readSmallInteger('[[basTeam]+78]+D4') < 256 or readSmallInteger('[[basTeam]+78]+D4') > 366 then
x = tonumber(readBytes('[[basTeam]+78]+D4'))
else
x = tonumber(readSmallInteger('[[basTeam]+78]+D4'))
end
y = tonumber(readSmallInteger('[[basTeam]+78]+D6'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData04", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData04.destroy()
{$asm}
unregistersymbol(_ClubDateData04)
dealloc(_ClubDateData04)
10003
"Info"
:
String
16
0
0
0
_ClubDateData04
1506
"Day of Year"
Custom
Mask 0x1FF
basTeam
D4
78
1505
"Year"
2 Bytes
basTeam
D6
78
1507
"Latitude"
Float
basTeam
60
78
1508
"Longitude"
Float
basTeam
64
78
1509
"State"
16:Very Poor
11:Poor
6:Average
2:Good
1:Very Good
Byte
basTeam
9C
78
1510
"Used By National Team"
0:No Matches
1:All Matches
2:Major Matches
3:Medium Matches
4:Minor Matches
5:Major Matches and Some Medium Matches
6:Minor Matches and Some Medium Matches
Byte
basTeam
A4
78
1511
"Used By National U21 Team"
0:No Matches
4:Minor Matches
3:Medium Matches
2:Major Matches
1:All Matches
Byte
basTeam
A5
78
1512
"Used By National U19 Team"
0:No Matches
4:Minor Matches
3:Medium Matches
2:Major Matches
1:All Matches
Byte
basTeam
A6
78
1944
"Not Used In Continental Final"
0:No
1:Yes
Binary
7
1
0
basTeam
AA
78
1942
"Extinct"
0:No
1:Yes
Binary
0
1
0
basTeam
9D
78
1943
"Is Covered"
0:No
1:Yes
Binary
0
1
0
basTeam
AA
78
1945
"Retractable Roof"
0:No
1:Yes
Binary
6
1
0
basTeam
AA
78
1946
"Has Undersoil Heating"
0:No
1:Yes
Binary
1
1
0
basTeam
AA
78
1941
"Has Digital Ad Hoarding"
0:No
1:Yes
Binary
6
1
0
basTeam
9D
78
1948
"Is An Old Stadium **I'm not sure with this option"
0:No
1:Yes
Binary
5
1
0
basTeam
9D
78
237
"Finances ->"
0080FF
1
1670
"General ->"
008000
1
686
"Balance"
1
4 Bytes
basClub
18
148
706
"Transfer Budget (Season)"
1
4 Bytes
basClub
680
148
705
"Transfer Budget (Rem.)"
1
4 Bytes
basClub
67C
148
12116
"Transfer Budget (??)"
1
4 Bytes
basClub
688
148
704
"Trn. Income Made Available (%)"
1
Byte
basClub
684
148
703
"Weekly Wage Budget"
1
4 Bytes
basClub
6B8
148
702
"Weekly Wage Budget Used"
1
4 Bytes
basClub
6C4
148
701
"Highest Wage Allowed"
1
4 Bytes
basClub
6BC
148
12115
"Maximum Salary Allowed /w"
1
4 Bytes
basClub
6C0
148
700
"Highest Wage Paid /w"
1
4 Bytes
basClub
6D8
148
699
"Highest Staff Wage Paid /w"
1
4 Bytes
basClub
6DC
148
697
"Sugar Daddy"
0:None
1:Front End
2:Back End
3:Underwriter
4:Underwriter Expects Return
1
Byte
basClub
3D
148
689
"In Administration"
0:No
1:Yes
1
Byte
basClub
74D
148
10000
"Embargo Start Date ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData05,4)
registersymbol(_ClubDateData05)
{$lua}
_tClubDateData05 = createTimer()
_tClubDateData05.Interval = 1000
_tClubDateData05.onTimer = function()
strDate = ""
if readInteger('[basClub]') ~= nil then
if readSmallInteger('[[basClub]+148]+30') < 256 or readSmallInteger('[[basClub]+148]+30') > 366 then
x = tonumber(readBytes('[[basClub]+148]+30'))
else
x = tonumber(readSmallInteger('[[basClub]+148]+30'))
end
y = tonumber(readSmallInteger('[[basClub]+148]+32'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData05", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData05.destroy()
{$asm}
unregistersymbol(_ClubDateData05)
dealloc(_ClubDateData05)
10001
"Info"
:
String
16
0
0
0
_ClubDateData05
710
"Day of Year"
Custom
Mask 0x1FF
basClub
30
148
709
"Year"
2 Bytes
basClub
32
148
10012
"Embargo End Date ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData06,4)
registersymbol(_ClubDateData06)
{$lua}
_tClubDateData06 = createTimer()
_tClubDateData06.Interval = 1000
_tClubDateData06.onTimer = function()
strDate = ""
if readInteger('[basClub]') ~= nil then
if readSmallInteger('[[basClub]+148]+34') < 256 or readSmallInteger('[[basClub]+148]+34') > 366 then
x = tonumber(readBytes('[[basClub]+148]+34'))
else
x = tonumber(readSmallInteger('[[basClub]+148]+34'))
end
y = tonumber(readSmallInteger('[[basClub]+148]+36'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData06", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData06.destroy()
{$asm}
unregistersymbol(_ClubDateData06)
dealloc(_ClubDateData06)
10013
"Info"
:
String
16
0
0
0
_ClubDateData06
708
"Day of Year"
Custom
Mask 0x1FF
basClub
34
148
707
"Year"
2 Bytes
basClub
36
148
10010
"Embargo Appeal Date ->"
FF0000
Auto Assembler Script
[ENABLE]
alloc(_ClubDateData07,4)
registersymbol(_ClubDateData07)
{$lua}
_tClubDateData07 = createTimer()
_tClubDateData07.Interval = 1000
_tClubDateData07.onTimer = function()
strDate = ""
if readInteger('[basClub]') ~= nil then
if readSmallInteger('[[basClub]+148]+38') < 256 or readSmallInteger('[[basClub]+148]+38') > 366 then
x = tonumber(readBytes('[[basClub]+148]+38'))
else
x = tonumber(readSmallInteger('[[basClub]+148]+38'))
end
y = tonumber(readSmallInteger('[[basClub]+148]+3A'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_ClubDateData07", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tClubDateData07.destroy()
{$asm}
unregistersymbol(_ClubDateData07)
dealloc(_ClubDateData07)
10011
"Info"
:
String
16
0
0
0
_ClubDateData07
719
"Day of Year"
Custom
Mask 0x1FF
basClub
38
148
720
"Year"
2 Bytes
basClub
3A
148
690
"Stadium Rental Per Year"
1
4 Bytes
basClub
6AC
148
694
"Match Ticket Price Ratio"
1
Float
basClub
24
148
696
"Average Match Ticket Price"
1
Float
basClub
1C
148
11564
"General: Match Ticket Price"
1
Float
basClub
71C
148
693
"Season Ticket Price Ratio"
1
Float
basClub
28
148
695
"Average Season Ticket Price"
1
Float
basClub
20
148
692
"Season Ticket Change Ratio"
1
Float
basClub
2C
148
1278
"Number Of Season Ticket Holders"
1
4 Bytes
basClub
94+4
F8
691
"Latest Season Ticket Sales"
1
4 Bytes
basClub
7DC
148
698
"Youth Grant Income"
1
4 Bytes
basClub
690
148
688
"Starting Last Years Turnover"
1
4 Bytes
basClub
6B0
148
12075
"Season Ticket Holders (only during pre-season)"
1
4 Bytes
basClub
718
148
12199
"Estimated Final Season Ticket Holders? (only during pre-season)"
1
4 Bytes
basClub
71E
148
12114
"Season Ticket Revenue"
1
4 Bytes
basClub
2a4
148
254
"More Options ->"
FF0000
1
711
"FFP Max Weekly Wage Total"
1
4 Bytes
basClub
6F4
148
12121
"FFP Max Allowed Weekly Wage Total"
1
4 Bytes
basClub
728
148
717
"Entered FS Bankrupt State"
1
4 Bytes
basClub
498
148
716
"Training Expansion Flag"
1
Byte
basClub
4A6
148
715
"Youth Expansion Flag"
1
Byte
basClub
4A7
148
714
"Stadium Rental Percentage Of Gate Receipts"
1
Byte
basClub
4B1
148
712
"Corporate Facilities Revenue Level"
1
Byte
basClub
4B2
148
713
"Increase Staff Wages"
1
Byte
basClub
4B3
148
12172
"Income (Last Month) ->"
FF0000
1
12173
"Sponsorship"
1
4 Bytes
basClub
424
148
12167
"Income (This Season) ->"
FF0000
1
12168
"Sponsorship"
1
4 Bytes
basClub
52C
148
12169
"Income (Last Season) ->"
FF0000
1
12170
"Sponsorship"
1
4 Bytes
basClub
634
148
759
"Debts ->"
008000
1
762
"1 ->"
FF0000
1
764
"Source"
0:None
1:Bank
2:Chairman
3:Company Voluntary Agree
4:Players Union
5:State Loan
6:Supporters Trust
7:Gift Repayable When Profitable
8:Gift Repayable on Departure
9:Gift Non Repayable
10:Loan Repayable on Promotion to Top Division
11:Loan Repayable when Established in Top Division
12:Director
13:PIK Loan (Total Amount of Loan Repayable on Maturity)
14:Lump Sum Paid on Promotion to Top Division
15:Miscellaneous
1
Byte
"fm.exe"+69BB9F8
18
0
40
F8
18
10
760
"Amount"
1
4 Bytes
"fm.exe"+69BB9F8
0
0
40
F8
18
10
854
"Monthly Payable"
1
4 Bytes
"fm.exe"+69BB9F8
4
0
40
F8
18
10
853
"Monthly Interest"
1
4 Bytes
"fm.exe"+69BB9F8
8
0
40
F8
18
10
766
"Start Date ->"
292CCC
1
769
"Day of Year"
0
Custom
Mask 0x1FF
"fm.exe"+69BB9F8
14
0
40
F8
18
10
768
"Year"
0
2 Bytes
"fm.exe"+69BB9F8
16
0
40
F8
18
10
767
"End Date ->"
292CCC
1
770
"Day of Year"
0
Custom
Mask 0x1FF
"fm.exe"+69BB9F8
10
0
40
F8
18
10
771
"Year"
0
2 Bytes
"fm.exe"+69BB9F8
12
0
40
F8
18
10
763
"2 ->"
FF0000
1
765
"Source"
0:None
1:Bank
2:Chairman
3:Company Voluntary Agree
4:Players Union
5:State Loan
6:Supporters Trust
7:Gift Repayable When Profitable
8:Gift Repayable on Departure
9:Gift Non Repayable
10:Loan Repayable on Promotion to Top Division
11:Loan Repayable when Established in Top Division
12:Director
13:PIK Loan (Total Amount of Loan Repayable on Maturity)
14:Lump Sum Paid on Promotion to Top Division
15:Miscellaneous
1
Byte
"fm.exe"+69BB9F8
18
8
40
F8
18
10
761
"Amount"
1
4 Bytes
"fm.exe"+69BB9F8
0
8
40
F8
18
10
855
"Monthly Payable"
1
4 Bytes
"fm.exe"+69BB9F8
4
8
40
F8
18
10
856
"Monthly Interest"
1
4 Bytes
"fm.exe"+69BB9F8
8
8
40
F8
18
10
772
"Start Date ->"
292CCC
1
773
"Day of Year"
0
Custom
Mask 0x1FF
"fm.exe"+69BB9F8
14
8
40
F8
18
10
774
"Year"
0
2 Bytes
"fm.exe"+69BB9F8
16
8
40
F8
18
10
775
"End Date ->"
292CCC
1
776
"Day of Year"
0
Custom
Mask 0x1FF
"fm.exe"+69BB9F8
10
8
40
F8
18
10
777
"Year"
0
2 Bytes
"fm.exe"+69BB9F8
12
8
40
F8
18
10
658
"Tactical Attributes ->"
0080FF
1
671
"Attacking"
Byte
basClub
74
B0
670
"Depth"
Byte
basClub
75
B0
669
"Directness"
Byte
basClub
76
B0
668
"Flamboyancy"
Byte
basClub
77
B0
667
"Flexibility"
Byte
basClub
78
B0
666
"Free Roles"
Byte
basClub
79
B0
665
"Marking"
Byte
basClub
7A
B0
664
"Offside"
Byte
basClub
7B
B0
663
"Pressing"
Byte
basClub
7C
B0
662
"Sitting Back"
Byte
basClub
7D
B0
661
"Tempo"
Byte
basClub
7E
B0
660
"Use Of Playmaker"
Byte
basClub
7F
B0
659
"Width"
Byte
basClub
80
B0
674
"Preferred Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basClub
81
B0
673
"Second Preferred Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basClub
82
B0
672
"Defensive Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basClub
83
B0
675
"Attacking Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basClub
84
B0
1286
"Supporter Profile ->"
0080FF
1
1326
"Loyalty"
Byte
basClub
C7+8
F8
1331
"Passion"
Byte
basClub
C8+8
F8
1330
"Patience"
Byte
basClub
C9+8
F8
1329
"Affluence"
Byte
basClub
CA+8
F8
1328
"Temperament"
Byte
basClub
CB+8
F8
1327
"Expectations"
Byte
basClub
CC+8
F8
11233
"Selected Squad ->"
4080FF
1
11239
"Details ->"
FF0000
1
11240
"Row ID"
:
4 Bytes
basTeam
8
11241
"Unique ID"
:
4 Bytes
basTeam
C
11242
"Full Name"
:
String
32
0
0
1
basTeam
4
B8
18
11243
"Short Name"
:
String
16
0
0
1
basTeam
4
C0
18
11244
"Nickname"
:
String
32
0
0
1
basTeam
4
A0
B0
18
11248
"Team Type"
0:First Team
1:Reserves
2:A
3:B
4:Superdraft A
5:Superdraft B
6:Superdraft C
7:Superdraft D
8:Waivers
9:U23
10:U21
11:U19
12:U18
13:C
14:Amateur
15:II
16:Team 2
17:Team 3
18:U20
22:Youth Evaluation
30:Dutch Reserves
Byte
basTeam
30
11250
"Reputation"
2 Bytes
basTeam
A8
11138
"Squads ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enableClubTeamRecords(memrec)
[DISABLE]
disableArrayRecord(memrec, 'Squads ->')
11332
"Medical Staff ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enablePersonArray(memrec, 'Medical Staff', '[basClub]+60', '[basClub]+68')
[DISABLE]
disableArrayRecord(memrec, 'Medical Staff ->')
11333
"Coaching Staff ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enablePersonArray(memrec, 'Coaching Staff', '[basClub]+78', '[basClub]+80')
[DISABLE]
disableArrayRecord(memrec, 'Coaching Staff ->')
11334
"Recruitment Staff ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enablePersonArray(memrec, 'Recruitment Staff', '[basClub]+90', '[basClub]+98')
[DISABLE]
disableArrayRecord(memrec, 'Recruitment Staff ->')
12065
"Nation ->"
000080
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _clubrec = memrec
local _updateName = function()
local name = getNationName('[basNation]')
if name ~= nil then
_clubrec.Description = string.format("Nation [%s] ->", name)
else
_clubrec.Description = "Nation [??] ->"
end
end
local t=createTimer()
local _onUpdate = function(first)
if _deactivateTimers == true then
if t ~= nil then
t.destroy()
t = nil
end
end
if _clubrec ~= nil then
if first == true or _clubrec.Active then
if readInteger('updNation') == 1 then
writeInteger('updNation', 0)
_updateName()
-- update the childs pointers when club changes
local squadsrec = findRecord(_clubrec, '^Squads')
if squadsrec ~= nil and squadsrec.Active then
enableNationTeamRecords(squadsrec)
end
--updatePersonArray(_clubrec, 'Medical Staff', '[basNation]+60', '[basNation]+68')
updatePersonArray(_clubrec, 'Coaching Staff', '[basNation]+78', '[basNation]+80')
--updatePersonArray(_clubrec, 'Recruitment Staff', '[basNation]+90', '[basNation]+98')
end
else
if t ~= nil then
t.destroy()
t = nil
end
end
end
end
t.Interval = 2000
t.onTimer = _onUpdate
_updateName()
_onUpdate(true)
[DISABLE]
if memrec ~= nil then
memrec.Description = "Nation ->"
end
1609
"Details ->"
0080FF
1
1527
"Row ID"
4 Bytes
basNation
8
1528
"Unique ID"
4 Bytes
basNation
C
1529
"Name"
String
32
0
0
1
basNation
4
B8
1531
"Short Name"
String
32
0
0
1
basNation
4
C0
1532
"Three Letter Name"
String
3
0
0
1
basNation
4
D0
1533
"Nationality Name"
String
32
0
0
1
basNation
4
D8
1534
"Capital"
String
32
0
0
1
basNation
4
18
1F0
1535
"Continent"
String
32
0
0
1
basNation
4
18
1F8
1536
"Currency"
String
32
0
0
1
basNation
4
18
208
1550
"Average Attendance"
4 Bytes
basNation
68
B0
1552
"Minimum Attendance"
4 Bytes
basNation
6C
B0
1551
"Maximum Attendance"
4 Bytes
basNation
70
B0
1880
"Colour Setting ->"
008000
1
1598
"Foreground Colour ->"
1
0
FF8000
4 Bytes
basNation
B0
B0
1599
"R"
0000FF
Byte
basNation
B2
B0
1600
"G"
00FF00
Byte
basNation
B1
B0
1601
"B"
FF0000
Byte
basNation
B0
B0
1602
"Alpha"
1
Byte
basNation
B3
B0
1603
"Background Colour ->"
1
0
FF8000
4 Bytes
basNation
B4
B0
1604
"R"
0000FF
Byte
basNation
B6
B0
1605
"G"
00FF00
Byte
basNation
B5
B0
1606
"B"
FF0000
Byte
basNation
B4
B0
1607
"Alpha"
1
Byte
basNation
B7
B0
1610
"Information (NOT WORKING )->"
C0C0C0
1
1554
"Economic Factor"
Byte
basNation
8AD
1546
"FA Financial Power"
Byte
basNation
8AE
1547
"Years To Gain Nationality"
Byte
basNation
8AF
1537
"Gain Nationality Type"
1:Continuous
2:Accumulative
Byte
basNation
210
1947
"Max Youth Age"
Byte
basNation
8B0
1545
"State Of Development"
1:Developed
2:Developing
3:Third World
Byte
basNation
8A8
1555
"Game Importance"
1:Very Important
2:Important
3:Unimportant
4:Useless
Byte
basNation
8A9
1557
"Worldwide Governing Body Full Member"
0:No
1:Yes
Byte
basNation
8AA
1654
"Year Affiliated"
2 Bytes
basNation
894
1587
"Year Affiliated to Federation"
2 Bytes
basNation
896
1586
"Year Association Formed"
2 Bytes
basNation
898
1541
"FIFA Position"
2 Bytes
basNation
2A8
1540
"FIFA Ranking Points"
2 Bytes
basNation
2AA
1548
"Foreign Manager Likelihood"
Byte
basNation
8BA
1558
"FA Patience"
Byte
basNation
8B9
1556
"Youth Rating"
Byte
basNation
89A
1611
"Attribute Templates ->"
008000
1
1589
"Adaptability"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B2
1596
"Ambition"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B3
1595
"Controversy"
1:Good (6-7)
2:Above Average (8-9)
3:Average (10-11)
4:Below Average (12-13)
5:Poor (14-15)
Byte
basNation
8B4
1594
"Loyalty"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B5
1593
"Pressure"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B6
1592
"Professionalism"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B7
1591
"Sportsmanship"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B1
1590
"Temperament"
1:Poor (6-7)
2:Below Average (8-9)
3:Average (10-11)
4:Above Average (12-13)
5:Good (14-15)
Byte
basNation
8B8
1566
"Tactical Attributes ->"
0080FF
1
1567
"Attacking"
Byte
basNation
74
B0
1568
"Depth"
Byte
basNation
75
B0
1569
"Directness"
Byte
basNation
76
B0
1570
"Flamboyancy"
Byte
basNation
77
B0
1571
"Flexibility"
Byte
basNation
78
B0
1572
"Free Roles"
Byte
basNation
79
B0
1573
"Marking"
Byte
basNation
7A
B0
1574
"Offside"
Byte
basNation
7B
B0
1575
"Pressing"
Byte
basNation
7C
B0
1576
"Sitting Back"
Byte
basNation
7D
B0
1577
"Tempo"
Byte
basNation
7E
B0
1578
"Use Of Playmaker"
Byte
basNation
7F
B0
1579
"Width"
Byte
basNation
80
B0
1580
"Preferred Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basNation
81
B0
1581
"Second Preferred Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basNation
82
B0
1582
"Defensive Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basNation
83
B0
1583
"Attacking Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
Byte
basNation
84
B0
1612
"Transfer Values ->"
0080FF
1
1613
"Reputation 50 - 549"
4 Bytes
basNation
0
4D8+10
1632
"Reputation 550 - 1,049"
4 Bytes
basNation
4
4D8+10
1631
"Reputation 1,050 - 1,549"
4 Bytes
basNation
8
4D8+10
1630
"Reputation 1,550 - 2,049"
4 Bytes
basNation
C
4D8+10
1629
"Reputation 2,050 - 2,549"
4 Bytes
basNation
10
4D8+10
1628
"Reputation 2,550 - 3,049"
4 Bytes
basNation
14
4D8+10
1627
"Reputation 3,050 - 3,549"
4 Bytes
basNation
18
4D8+10
1626
"Reputation 3,550 - 4,049"
4 Bytes
basNation
1C
4D8+10
1625
"Reputation 4,050 - 4,549"
4 Bytes
basNation
20
4D8+10
1624
"Reputation 4,550 - 5,049"
4 Bytes
basNation
24
4D8+10
1623
"Reputation 5,050 - 5,549"
4 Bytes
basNation
28
4D8+10
1622
"Reputation 5,550 - 6,049"
4 Bytes
basNation
2C
4D8+10
1621
"Reputation 6,050 - 6,549"
4 Bytes
basNation
30
4D8+10
1620
"Reputation 6,550 - 7,049"
4 Bytes
basNation
34
4D8+10
1619
"Reputation 7,050 - 7,549"
4 Bytes
basNation
38
4D8+10
1618
"Reputation 7,550 - 8,049"
4 Bytes
basNation
3C
4D8+10
1617
"Reputation 8,050 - 8,549"
4 Bytes
basNation
40
4D8+10
1616
"Reputation 8,550 - 9,049"
4 Bytes
basNation
44
4D8+10
1615
"Reputation 9,050 - 9,549"
4 Bytes
basNation
48
4D8+10
1614
"Reputation 9,550 - 10,000"
4 Bytes
basNation
4C
4D8+10
1633
"Weekly Wage Values ->"
0080FF
1
1634
"Reputation 50 - 549"
4 Bytes
basNation
0
4E0+10
1635
"Reputation 550 - 1,049"
4 Bytes
basNation
4
4E0+10
1636
"Reputation 1,050 - 1,549"
4 Bytes
basNation
8
4E0+10
1637
"Reputation 1,550 - 2,049"
4 Bytes
basNation
C
4E0+10
1638
"Reputation 2,050 - 2,549"
4 Bytes
basNation
10
4E0+10
1639
"Reputation 2,550 - 3,049"
4 Bytes
basNation
14
4E0+10
1640
"Reputation 3,050 - 3,549"
4 Bytes
basNation
18
4E0+10
1641
"Reputation 3,550 - 4,049"
4 Bytes
basNation
1C
4E0+10
1642
"Reputation 4,050 - 4,549"
4 Bytes
basNation
20
4E0+10
1643
"Reputation 4,550 - 5,049"
4 Bytes
basNation
24
4E0+10
1644
"Reputation 5,050 - 5,549"
4 Bytes
basNation
28
4E0+10
1645
"Reputation 5,550 - 6,049"
4 Bytes
basNation
2C
4E0+10
1646
"Reputation 6,050 - 6,549"
4 Bytes
basNation
30
4E0+10
1647
"Reputation 6,550 - 7,049"
4 Bytes
basNation
34
4E0+10
1648
"Reputation 7,050 - 7,549"
4 Bytes
basNation
38
4E0+10
1649
"Reputation 7,550 - 8,049"
4 Bytes
basNation
3C
4E0+10
1650
"Reputation 8,050 - 8,549"
4 Bytes
basNation
40
4E0+10
1651
"Reputation 8,550 - 9,049"
4 Bytes
basNation
44
4E0+10
1652
"Reputation 9,050 - 9,549"
4 Bytes
basNation
48
4E0+10
1653
"Reputation 9,550 - 10,000"
4 Bytes
basNation
4C
4E0+10
12066
"Squads ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enableNationTeamRecords(memrec)
[DISABLE]
disableArrayRecord(memrec, 'Squads ->')
12067
"Coaching Staff ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enablePersonArray(memrec, 'Coaching Staff', '[basNation]+78', '[basNation]+80')
[DISABLE]
disableArrayRecord(memrec, 'Coaching Staff ->')
12068
"Competition ->"
000080
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _memrec = memrec
local _updateName = function()
local name = getCompetitionName('[basComp]')
if name ~= nil then
_memrec.Description = string.format("Competition [%s] ->", name)
else
_memrec.Description = "Competition [??] ->"
end
end
local t=createTimer()
local _onUpdate = function(first)
if _deactivateTimers then
if t ~= nil then
t.destroy()
t = nil
end
end
if _memrec ~= nil then
if _memrec.Active or first == true then
if readInteger('updComp') == 1 then
writeInteger('updComp', 0)
_updateName()
end
else
if t ~= nil then
t.destroy()
t = nil
end
end
end
end
t.Interval = 2000
t.onTimer = _onUpdate
_updateName()
_onUpdate(true)
[DISABLE]
if memrec ~= nil then
memrec.Description = "Competition ->"
end
1665
"Details ->"
0080FF
1
959
"Row ID"
:
4 Bytes
basComp
8
961
"Unique ID"
:
4 Bytes
basComp
C
968
"Full Name"
String
32
0
0
1
basComp
4
58
962
"Short Name"
String
32
0
0
1
basComp
4
60
970
"Three Letter Name"
String
3
0
0
1
basComp
4
68
972
"Nation"
:
String
32
0
0
0
basComp
4
B8
78
997
"Continent"
:
String
32
0
0
0
basComp
4
18
70
1314
"Lowest Official Category Allowed"
-1:Not Available
0:None
1:European Elite Group
2:European Elite Development Group
3:European First Group
4:European Second Group
5:European Third Group
1
Byte
basComp
18F+8
967
"Reputation"
2 Bytes
basComp
16A+8
983
"Original Reputation"
2 Bytes
basComp
16C+8
985
"Last Reputation Position"
-1:Not Available
1
2 Bytes
basComp
16E+8
984
"Cur. Reputation Position"
-1:Not Available
1
2 Bytes
basComp
170+8
986
"% of Top Division Rep."
Byte
basComp
172+8
991
"% of Wage Budget Turnover"
Byte
basComp
18C+8+3
994
"Uses Extra Officials"
0:No
1:Yes
Byte
basComp
18A+8+3
995
"Uses Seated Stadiums Only"
0:No
1:Yes
Byte
basComp
18B+8+3
992
"Type"
0:Domestic Top Division
1:Domestic Division
2:Domestic Main Cup
3:Domestic League Cup
4:Domestic Cup
5:Super Cup
6:International Finals
7:International Qualifiers
8:Reserve Division
9:Club Friendly
10:Main Continental Intarnational Finals
11:Main Continental International Qualifiers
12:Club Finals
13:Friendly
14:Domestic Other Division
15:U21 International Finals
16:U21 International Qualifiers
17:U19 International Finals
18:U19 International Qualifiers
19:U23 International Finals
20:U23 International Qualifiers
31:U22 International Finals
32:U22 International Qualifiers
21:Club Champions Cup
22:Cup Winners Cup
23:Reserve Cup
24:International Friendly
25:U20 International Finals
26:All Stars Cup
27:U20 International Qualifiers
28:Inactive Competition
29:Inactive Other Competition
33:U23 Division
34:U22 Division
35:U21 Division
36:U20 Division
37:U19 Division
38:U18 Division
39:Youth Cup
Byte
basComp
189+8+3
993
"Name Type"
0:Original Database Name
1:Friendly Name
2:Reserves League Name
3:U19 League Name
4:Name on Server Only
5:U21 League Name
6:U18 League Name
7:U20 League Name
8:Reserves Cup Name
9:U19 Cup Name
10:U21 Cup Name
11:U18 Cup Name
12:U20 Cup Name
13:Youth Cup U19 Name
14:Friendly Cup
Byte
basComp
186+8+3
1313
"Competition Level"
0:(Highest)
Byte
basComp
188+8+3
11562
"Substitutions (Display Only)"
2:3 From 3
6:3 From 4
5:3 From 4 (+Gk)
1:3 From 5
3:3 From 5 (+Gk)
11:3 From 5 + 1 Extra Time Sub
12:3 From 5 + 1 Extra Time Sub (+Gk)
13:3 From 5 + 2 Extra Time Sub
14:3 From 5 + 2 Extra Time Sub (+Gk)
7:3 From 6
15:3 From 6 (+Gk)
0:3 From 7
4:3 From 7 (+Gk)
44:3 From 7 + 1 Extra Time
52:3 From 7 + 2 Extra Time
22:3 From 9
43:3 From 9 + 1 Extra Time
34:3 From 9+Gk
41:3 From 10
25:3 From 11
8:3 From 12
45:3 From 12 + 1 Extra Time
50:4 From 12
29:4 From 4+Gk
26:4 From 9
20:5 From 7
48:5 From 12
51:5 From 7 + 1 Extra Time
32:5 From 7+Gk
16:5 From 8
17:5 From 9
49:5 From 9 + 1 Extra Time
46:6 From 11
33:6 From 12
30:6 From 7
24:6 From 9
35:7 From 12
9:7 From 7
47:7 From 9
23:7(home), 5(away) subs named, max 3 used
36:8 From 12
37:9 From 12
38:10 From 12
39:11 From 12
18:12 From 12
28:All From 10 (home), 12(away)
40:All Substitutions
19:No Substitutions
42:Use Highest Division Rules
31:Use Lowest Division Rules
000000
Byte
basComp
E2
A0
0
140
C8
1312
"Uses Squad Numbers (Inactive Comps Only)"
0:No
1:Yes
Byte
basComp
187+8+3
979
"Minimum Pitch Length"
1
2 Bytes
basComp
160+8
982
"Minimum Pitch Width"
1
2 Bytes
basComp
162+8
981
"Maximum Pitch Length"
1
2 Bytes
basComp
164+8
980
"Maximum Pitch Width"
1
2 Bytes
basComp
166+8
10008
"Winter Ball Start Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_CompDateData01,4)
registersymbol(_CompDateData01)
{$lua}
_tCompDateData01 = createTimer()
_tCompDateData01.Interval = 1000
_tCompDateData01.onTimer = function()
strDate = ""
if readInteger('[basComp]') ~= nil then
if readSmallInteger('[basComp]+148+8') < 256 or readSmallInteger('[basComp]+148+8') > 366 then
x = tonumber(readBytes('[basComp]+148+8'))
else
x = tonumber(readSmallInteger('[basComp]+148+8'))
end
y = tonumber(readSmallInteger('[basComp]+14A+8'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_CompDateData01", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tCompDateData01.destroy()
{$asm}
unregistersymbol(_CompDateData01)
dealloc(_CompDateData01)
10009
"Info"
:
String
16
0
0
0
_CompDateData01
976
"Day of Year"
Custom
Mask 0x1FF
basComp
148+8
975
"Year"
2 Bytes
basComp
14A+8
10006
"Winter Ball End Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_CompDateData02,4)
registersymbol(_CompDateData02)
{$lua}
_tCompDateData02 = createTimer()
_tCompDateData02.Interval = 1000
_tCompDateData02.onTimer = function()
strDate = ""
if readInteger('[basComp]') ~= nil then
if readSmallInteger('[basComp]+14C+8') < 256 or readSmallInteger('[basComp]+14C+8') > 366 then
x = tonumber(readBytes('[basComp]+14C+8'))
else
x = tonumber(readSmallInteger('[basComp]+14C+8'))
end
y = tonumber(readSmallInteger('[basComp]+14E+8'))
strDate = getFMDate(x, y)
else
strDate = "Not Loaded"
end
writeString("_CompDateData02", strDate)
end
{$asm}
[DISABLE]
{$lua}
_tCompDateData02.destroy()
{$asm}
unregistersymbol(_CompDateData02)
dealloc(_CompDateData02)
10007
"Info"
:
String
16
0
0
0
_CompDateData02
1881
"Day of Year"
Custom
Mask 0x1FF
basComp
14C+8
973
"Year"
2 Bytes
basComp
14E+8
1878
"Colour Setting ->"
008000
1
964
"Foreground Colour ->"
1
FF8000
4 Bytes
basComp
128+8
1139
"R"
0000FF
Byte
basComp
12A+8
1140
"G"
00FF00
Byte
basComp
129+8
1141
"B"
FF0000
Byte
basComp
128+8
1142
"Alpha"
1
Byte
basComp
12B+8
965
"Background Colour ->"
1
FF8000
4 Bytes
basComp
12C+8
1135
"R"
0000FF
Byte
basComp
12E+8
1136
"G"
00FF00
Byte
basComp
12D+8
1137
"B"
FF0000
Byte
basComp
12C+8
1138
"Alpha"
1
Byte
basComp
12F+8
966
"Trim Colour ->"
1
FF8000
4 Bytes
basComp
130+8
1134
"R"
0000FF
Byte
basComp
132+8
1144
"G"
00FF00
Byte
basComp
131+8
1145
"B"
FF0000
Byte
basComp
130+8
1146
"Alpha"
1
Byte
basComp
133+8
963
"Winter Ball Colour ->"
1
FF8000
4 Bytes
basComp
158+8
1143
"R"
0000FF
Byte
basComp
15A+8
1133
"G"
00FF00
Byte
basComp
159+8
1132
"B"
FF0000
Byte
basComp
158+8
1131
"Alpha"
1
Byte
basComp
15B+8
13
"Contract Types ->"
0080FF
1
12
"Squad Status ->"
008000
1
11
"Key Player"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
173+8
19
"First Team"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
174+8
18
"Rotation"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
175+8
17
"Backup"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
176+8
16
"Hot Prospect"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
177+8
15
"Youngster"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
178+8
14
"Job Type ->"
008000
1
20
"Manager"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
179+8
27
"Ast. Manager"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
17A+8
26
"Coach"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
17B+8
25
"Fitness Coach"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
17D+8+3
24
"Goalkeeping Coach"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
17E+8+3
23
"Youth Team Coach"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
17C+8+3
22
"Scout"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
180+8+3
21
"Physio"
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
6:-
Byte
basComp
17F+8+3
31
"Media Policies ->"
0080FF
1
1676
"Pre-Match Press Conferences ->"
008000
1
30
"Frequency"
0:Not Set
1:None
2:Rivals Games
3:Big Games
4:All Games
Byte
basComp
0
E0-18
1677
"Obligatory"
0:No
1:Yes
Byte
basComp
3
E0-8
35
"Manager Only"
0:No
1:Yes
Byte
basComp
4
E0-8
34
"Minimum Questions (Max. 127)"
1
Byte
basComp
1
E0
37
"Maximum Questions (Max. 127)"
1
Byte
basComp
2
E0
1678
"Post-Match Press Conferences ->"
008000
1
1679
"Frequency"
0:Not Set
1:None
2:Rivals Games
3:Big Games
4:All Games
Byte
basComp
5
E0
40
"Obligatory"
0:No
1:Yes
Byte
basComp
8
E0
41
"Manager Only"
0:No
1:Yes
Byte
basComp
9
E0
42
"Minimum Questions (Max. 127)"
1
Byte
basComp
6
E0
43
"Maximum Questions (Max. 127)"
1
Byte
basComp
7
E0
11254
"Person ->"
000080
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _personrec = memrec
local updateHeader = function()
local name = getPersonName('[basPerson]')
if name ~= nil then
_personrec.Description = string.format("Person [%s] ->", name)
else
_personrec.Description = "Person [??] ->"
end
updatePlayerClauseRecords(_personrec)
updatePersonRelationships(_personrec)
end
if _tPersonNameTimer ~= nil then _tPersonNameTimer.destroy() end
_tPersonNameTimer=createTimer()
_tPersonNameTimer.Interval = 1000
_tPersonNameTimer.onTimer = function()
if _personrec ~= nil then
if _personrec.Active == false then
if _tPersonNameTimer ~= nil then _tPersonNameTimer.destroy() end
_tPersonNameTimer = nil
else
if readInteger('updPerson') == 1 then
writeInteger('updPerson', 0)
updateHeader()
end
end
end
end
_tPersonNameTimer.Enabled = true
updateHeader()
[DISABLE]
if _tPersonNameTimer ~= nil then _tPersonNameTimer.destroy() end
_tPersonNameTimer = nil
if memrec ~= nil then
memrec.Description = "Person ->"
end
1661
"Details ->"
0080FF
1
1716
"Row ID"
1
4 Bytes
basPerson
8
1717
"Unique ID"
1
4 Bytes
basPerson
C
1718
"First Name"
:
1
String
32
0
0
0
basPerson
4
0
58
1779
"Last Name"
:
1
String
32
0
0
0
basPerson
4
0
60
1778
"Common Name"
:
1
String
32
0
0
0
basPerson
4
0
68
1777
"Full Name"
:
1
String
32
0
0
0
basPerson
4
48
1720
"Ethnicity"
-1:Unknown
0:Northern European
1:Mediterranean / Hispanic
2:North African / Middle Eastern
3:African / Caribbean
4:Asian
5:South East Asian
6:Pacific Islander
7:Native American
8:Native Australian
9:Mixed Race (Black / White)
10:East Asian
1
Byte
basPerson
91
1725
"Hair Colour"
0:Unknown
1:Blonde
2:Light Brown
3:Dark Brown
4:Red
5:Black
6:Grey
8:Changeable (Normal)
9:Changeable (Dramatic)
1
Byte
basPerson
92
1724
"Hair Length"
4:Unknown
0:Bald
1:Short
2:Medium
3:Long
1
Byte
basPerson
93
1723
"Skin Tone"
-1:Unknown
0:Skin Tone 1
1:Skin Tone 2
2:Skin Tone 3
3:Skin Tone 4
4:Skin Tone 5
5:Skin Tone 6
6:Skin Tone 7
7:Skin Tone 8
8:Skin Tone 9
9:Skin Tone 10
10:Skin Tone 11
11:Skin Tone 12
12:Skin Tone 13
13:Skin Tone 14
14:Skin Tone 15
15:Skin Tone 16
16:Skin Tone 17
17:Skin Tone 18
18:Skin Tone 19
19:Skin Tone 20
1
Byte
basPerson
94
10014
"Date Of Birth ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerDateData01,20)
registersymbol(_PerDateData01)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerDateData01")
{$asm}
[DISABLE]
unregistersymbol(_PerDateData01)
dealloc(_PerDateData01)
10015
"Info"
:
String
16
0
0
0
_PerDateData01
462
"Day of Year"
Custom
Mask 0x1FF
basPerson
44
463
"Year"
2 Bytes
basPerson
46
410
"Declared For Nation"
0:No
1:Yes
Byte
basPlayer
1B1
407
"International Apps"
Byte
basPerson
164
406
"International Goals"
Byte
basPerson
166
1515
"Youth Apps"
Byte
basPerson
165
1516
"Youth Goals"
Byte
basPerson
167
177
"Club Contract ->"
0080FF
1
12122
"Loan Contract ->"
0080FF
1
12123
"Club"
:
1
String
32
0
0
0
basPerson
4
B8
18
10
0
D0
12124
"Job"
0:Free
1:Player
2:Coach
3:Player/Coach
4:Chairman
6:Director
8:Managing Director
10:Director of Football
12:Physiotherapist
14:Scout
16:Manager
17:Player/Manager
20:Assistant Manager
21:Player/Assistant Manager
22:Media Pundit
24:General Manager
26:Fitness Coach
27:Player/Fitness Coach
34:Goalkeeper Coach
35:Player/Goalkeeper Coach
36:Chief Data Analyst
38:Chief Doctor
40:Head of Sports Science
42:U18 Data Analyst
44:Chief Scout
45:Player/Chief Scout
46:U18 Sports Scientis
48:U23 Sports Scientist
49:Player/Youth Team Coach
50:Head of Physiotherapy
52:U19 Manager
54:First Team Coach
64:Head of Youth Development
65:Player/Head of Youth Development
66:Owner
70:President
144:Caretaker Manager
1
Byte
basPerson
1C
0
D0
12128
"Weekly Wage"
1
4 Bytes
basPerson
18
0
D0
12130
"Start Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerLoanDateData02,20)
registersymbol(_PerLoanDateData02)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerLoanDateData02")
{$asm}
[DISABLE]
unregistersymbol(_PerLoanDateData02)
dealloc(_PerLoanDateData02)
12131
"Info"
:
String
16
0
0
1
_PerLoanDateData02
12132
"Day of Year"
Custom
Mask 0x1FF
basPerson
3C
0
D0
12133
"Year"
2 Bytes
basPerson
3E
0
D0
12134
"End Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerLoanDateData03,20)
registersymbol(_PerLoanDateData03)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerLoanDateData03")
{$asm}
[DISABLE]
unregistersymbol(_PerLoanDateData03)
dealloc(_PerLoanDateData03)
12135
"Info"
:
String
16
0
0
1
_PerLoanDateData03
12136
"Day of Year"
Custom
Mask 0x1FF
basPerson
40
0
D0
12137
"Year"
2 Bytes
basPerson
42
0
D0
12138
"Sign Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerLoanDateData04,20)
registersymbol(_PerLoanDateData04)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerLoanDateData04")
{$asm}
[DISABLE]
unregistersymbol(_PerLoanDateData04)
dealloc(_PerLoanDateData04)
12139
"Info"
:
String
16
0
0
1
_PerLoanDateData04
12140
"Day of Year"
Custom
Mask 0x1FF
basPerson
44
0
D0
12141
"Year"
2 Bytes
basPerson
46
0
D0
12142
"Join Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerLoanDateData05,20)
registersymbol(_PerLoanDateData05)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerLoanDateData05")
{$asm}
[DISABLE]
unregistersymbol(_PerLoanDateData05)
dealloc(_PerLoanDateData05)
12143
"Info"
:
String
16
0
0
1
_PerLoanDateData05
12144
"Day of Year"
Custom
Mask 0x1FF
basPerson
14C
12145
"Year"
2 Bytes
basPerson
14E
12146
"Transfer Status"
4:Not Set
5:Transfer Listed
6:Listed for Loan
7:Transfer and Load Listed
12:Transfer Lister by Request
15:Listed by Request & Loan Listed
68:Not Available for Loan
69:Transfer Listed / NA for Loan
76:Listed by Request / NA for Loan
1
Byte
basPerson
4E
0
D0
12147
"Agreed Play Time"
-1:Invalid
0:Not Set
1:Key Player
2:First Team Regular
3:Regular Starter
4:Squad Player
5:Impact Sub
6:Squad Player (Rotation)
7:Fringe Player
8:Fringe Player (Bad?)
9:Emergency Backup
10:Breakthrough Prospect
11:Future Prospect
12:Hot Prospect
13:Youngster
14:Regular (not 1st)
15:First-Choice Goalkeeper
16:Cup Goalkeeper
17:Domestic Cup Goalkeeper
18:Continental Cup Goalkeeper
19:Cup Goalkeeper
20:Backup Goalkeeper
21:Emergency Backup (GK)
22:Surplus to Requirements
23:Scouting Required
1
Byte
basPerson
4C
0
D0
12148
"Agreed Play Time (Copy)"
-1:Invalid
0:Not Set
1:Key Player
2:First Team Regular
3:Regular Starter
4:Squad Player
5:Impact Sub
6:Squad Player
7:Fringe Player
8:Fringe Player (Bad?)
9:Fringe Player (Bad?)
10:Breakthrough Prospect
11:Future Prospect
12:Hot Prospect
13:Youngster
14:Regular (not 1st)
15:First-Choice Goalkeeper
16:Cup Goalkeeper
17:Domestic Cup Goalkeeper
18:Continental Cup Goalkeeper
19:Cup Goalkeeper
20:Backup Goalkeeper
21:Emergency Backup
22:Surplus to Requirements
23:Scouting Required
1
Byte
basPerson
4D
0
D0
12149
"Squad Number"
-1:Not Set
1
Byte
basPerson
54
0
D0
12150
"Happiness"
1
Byte
basPerson
4F
0
D0
180
"Club"
:
1
String
32
0
0
0
basPerson
4
B8
18
10
C8
172
"Job"
0:Free
1:Player
2:Coach
3:Player/Coach
4:Chairman
6:Director
8:Managing Director
10:Director of Football
12:Physiotherapist
14:Scout
16:Manager
17:Player/Manager
20:Assistant Manager
21:Player/Assistant Manager
22:Media Pundit
24:General Manager
26:Fitness Coach
27:Player/Fitness Coach
34:Goalkeeper Coach
35:Player/Goalkeeper Coach
36:Chief Data Analyst
38:Chief Doctor
40:Head of Sports Science
42:U18 Data Analyst
44:Chief Scout
45:Player/Chief Scout
46:U18 Sports Scientis
48:U23 Sports Scientist
49:Player/Youth Team Coach
50:Head of Physiotherapy
52:U19 Manager
54:First Team Coach
64:Head of Youth Development
65:Player/Head of Youth Development
66:Owner
70:President
144:Caretaker Manager
1
Byte
basPerson
1C
C8
117
"Value"
1
4 Bytes
basPlayer
128+8
163
"Asking Price (aprox)"
-1:Not Set
1
4 Bytes
basPlayer
12C+8
179
"Contract Type"
-1:Invalid
0:Part Time
1:Full Time
2:Amateur
3:Youth
4:Non-Contract
5:Future Professional
7:Generation Adidas (USA)
8:Senior Minimum Salary (USA)
9:Reserve (USA)
11:Designated Player (USA)
13:Designated Player
16:Guest Player (Australia)
18:Mature Age Rookie Player (Australia)
1
Byte
basPerson
9A
C8
170
"Weekly Wage"
1
4 Bytes
basPerson
18
C8
178
"Loyalty Bonus"
1
4 Bytes
basPerson
90
C8
10016
"Start Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerDateData02,20)
registersymbol(_PerDateData02)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerDateData02")
{$asm}
[DISABLE]
unregistersymbol(_PerDateData02)
dealloc(_PerDateData02)
10017
"Info"
:
String
16
0
0
0
_PerDateData02
181
"Day of Year"
Custom
Mask 0x1FF
basPerson
3C
C8
184
"Year"
2 Bytes
basPerson
3E
C8
10024
"End Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerDateData03,20)
registersymbol(_PerDateData03)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerDateData03")
{$asm}
[DISABLE]
unregistersymbol(_PerDateData03)
dealloc(_PerDateData03)
10025
"Info"
:
String
16
0
0
0
_PerDateData03
183
"Day of Year"
Custom
Mask 0x1FF
basPerson
40
C8
182
"Year"
2 Bytes
basPerson
42
C8
10022
"Sign Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerDateData04,20)
registersymbol(_PerDateData04)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerDateData04")
{$asm}
[DISABLE]
unregistersymbol(_PerDateData04)
dealloc(_PerDateData04)
10023
"Info"
:
String
16
0
0
0
_PerDateData04
189
"Day of Year"
Custom
Mask 0x1FF
basPerson
44
C8
188
"Year"
2 Bytes
basPerson
46
C8
10020
"Join Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_PerDateData05,20)
registersymbol(_PerDateData05)
{$lua}
if syntaxcheck then return end
local t = startDateTimer(memrec, "_PerDateData05")
{$asm}
[DISABLE]
unregistersymbol(_PerDateData05)
dealloc(_PerDateData05)
10021
"Info"
:
String
16
0
0
0
_PerDateData05
1828
"Day of Year"
Custom
Mask 0x1FF
basPerson
14C
1829
"Year"
2 Bytes
basPerson
14E
175
"Transfer Status"
4:Not Set
5:Transfer Listed
6:Listed for Loan
7:Transfer and Load Listed
12:Transfer Lister by Request
15:Listed by Request & Loan Listed
68:Not Available for Loan
69:Transfer Listed / NA for Loan
76:Listed by Request / NA for Loan
1
Byte
basPerson
4E
C8
12104
"Agreed Play Time"
-1:Invalid
0:Not Set
1:Key Player
2:First Team Regular
3:Regular Starter
4:Squad Player
5:Impact Sub
6:Squad Player (Rotation)
7:Fringe Player
8:Fringe Player (Bad?)
9:Emergency Backup
10:Breakthrough Prospect
11:Future Prospect
12:Hot Prospect
13:Youngster
14:Regular (not 1st)
15:First-Choice Goalkeeper
16:Cup Goalkeeper
17:Domestic Cup Goalkeeper
18:Continental Cup Goalkeeper
19:Cup Goalkeeper
20:Backup Goalkeeper
21:Emergency Backup (GK)
22:Surplus to Requirements
23:Scouting Required
1
Byte
basPerson
4C
C8
12105
"Agreed Play Time (Copy)"
-1:Invalid
0:Not Set
1:Key Player
2:First Team Regular
3:Regular Starter
4:Squad Player
5:Impact Sub
6:Squad Player
7:Fringe Player
8:Fringe Player (Bad?)
9:Fringe Player (Bad?)
10:Breakthrough Prospect
11:Future Prospect
12:Hot Prospect
13:Youngster
14:Regular (not 1st)
15:First-Choice Goalkeeper
16:Cup Goalkeeper
17:Domestic Cup Goalkeeper
18:Continental Cup Goalkeeper
19:Cup Goalkeeper
20:Backup Goalkeeper
21:Emergency Backup
22:Surplus to Requirements
23:Scouting Required
1
Byte
basPerson
4D
C8
174
"Squad Number"
-1:Not Set
1
Byte
basPerson
54
C8
1517
"Happiness"
1
Byte
basPerson
4F
C8
11331
"Clauses & Bonuses ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enablePlayerClauseRecords(memrec)
[DISABLE]
disableArrayRecord(memrec, 'Clauses & Bonuses ->')
110
"Person Data ->"
0080FF
1
1662
"Attributes ->"
008000
1
102
"Adaptability"
Byte
basPerson
80
109
"Ambition"
Byte
basPerson
81
103
"Controversy"
Byte
basPerson
87
108
"Loyalty"
Byte
basPerson
82
107
"Pressure"
Byte
basPerson
83
106
"Professionalism"
Byte
basPerson
84
105
"Sportmanship"
Byte
basPerson
85
104
"Temperament"
Byte
basPerson
86
1682
"Job Preferences ->"
008000
1
1683
"Manager"
Byte
basPerson
0
128
1711
"Ast. Manager"
Byte
basPerson
1
128
1710
"Coach"
Byte
basPerson
2
128
1709
"Fitness Coach"
Byte
basPerson
6
128
1708
"Goalkeeping Coach"
Byte
basPerson
5
128
1707
"Physio"
Byte
basPerson
3
128
1706
"Scout"
Byte
basPerson
4
128
1705
"Chief Data Analyst"
Byte
basPerson
A
128
1704
"Head of Sports Science"
Byte
basPerson
B
128
1703
"Director of Football"
Byte
basPerson
8
128
1702
"Head of Youth Development"
Byte
basPerson
9
128
1701
"Chairman"
Byte
basPerson
7
128
11464
"Preferred Moves ->"
008000
1
11465
"Player Traits"
1
8 Bytes
basPerson
108
11466
"Runs With Ball Down Left"
1
Binary
0
1
0
basPerson
108
11473
"Runs With Ball Down Right"
1
Binary
1
1
0
basPerson
108
11472
"Runs With Ball Down Center"
1
Binary
2
1
0
basPerson
108
11471
"Gets Into Opposition Area"
1
Binary
3
1
0
basPerson
108
11470
"Moves Into Channels"
1
Binary
4
1
0
basPerson
108
11469
"Gets Forward Whenever Possible"
1
Binary
5
1
0
basPerson
108
11468
"Plays Short Simple Passes"
1
Binary
6
1
0
basPerson
108
11467
"Tries Killer Balls Often"
1
Binary
7
1
0
basPerson
108
11474
"Shoots From Distance"
1
Binary
0
1
0
basPerson
109
11475
"Shoots With Power"
1
Binary
1
1
0
basPerson
109
11476
"Places Shots"
1
Binary
2
1
0
basPerson
109
11477
"Curls Ball"
1
Binary
3
1
0
basPerson
109
11478
"Likes to Round Keeper"
1
Binary
4
1
0
basPerson
109
11479
"Likes to Try To Break Offside Trap"
1
Binary
5
1
0
basPerson
109
11527
"Unused?"
1
C0C0C0
Binary
6
1
0
basPerson
109
11528
"Marks Opponent Tightly"
1
Binary
7
1
0
basPerson
109
11483
"Unused"
1
C0C0C0
Binary
0
1
0
basPerson
10A
11481
"Argues With Officials"
1
Binary
1
1
0
basPerson
10A
11484
"Plays with Back To Goal"
1
Binary
2
1
0
basPerson
10A
11485
"Comes Deep To Get Ball"
1
Binary
3
1
0
basPerson
10A
11486
"Plays One-Twos"
1
Binary
4
1
0
basPerson
10A
11487
"Likes To Lob Keeper"
1
Binary
5
1
0
basPerson
10A
11488
"Dictates Tempo"
1
Binary
6
1
0
basPerson
10A
11489
"Attempts Overhead Kicks"
1
Binary
7
1
0
basPerson
10A
11490
"Looks For Pass Rather Than Attempting To Score"
1
Binary
0
1
0
basPerson
10B
11491
"Plays No Through Balls"
1
Binary
1
1
0
basPerson
10B
11492
"Stops Play"
1
Binary
2
1
0
basPerson
10B
11493
"Knocks Ball Past Opponent"
1
Binary
3
1
0
basPerson
10B
11529
"Unused"
1
C0C0C0
Binary
4
1
0
basPerson
10B
11530
"Unused"
1
C0C0C0
Binary
5
1
0
basPerson
10B
11496
"Dwells On Ball"
1
Binary
6
1
0
basPerson
10B
11497
"Arrives Late In Opponents' Area"
1
Binary
7
1
0
basPerson
10B
11498
"Tries To Play Way Out Of Trouble"
1
Binary
0
1
0
basPerson
10C
11499
"Stays Back At All Times"
1
Binary
1
1
0
basPerson
10C
11500
"Avoids Using Weaker Foot"
1
Binary
2
1
0
basPerson
10C
11534
"Unused"
1
C0C0C0
Binary
3
1
0
basPerson
10C
11502
"Tries Long Range Free Kicks"
1
Binary
4
1
0
basPerson
10C
11503
"Dives Into Tackles"
1
Binary
5
1
0
basPerson
10C
11504
"Does Not Dive Into Tackles"
1
Binary
6
1
0
basPerson
10C
11505
"Cuts Inside From Both Wings"
1
Binary
7
1
0
basPerson
10C
11506
"Hugs Line"
1
Binary
0
1
0
basPerson
10D
11531
"Unused"
1
C0C0C0
Binary
1
1
0
basPerson
10D
11508
"Tries First Time Shots"
1
Binary
2
1
0
basPerson
10D
11509
"Tries Long Range Passes"
1
Binary
3
1
0
basPerson
10D
11532
"Unused"
1
C0C0C0
Binary
4
1
0
basPerson
10D
11511
"Hits Free Kick With Power"
1
Binary
5
1
0
basPerson
10D
11533
"Unused"
1
C0C0C0
Binary
6
1
0
basPerson
10D
11513
"Likes To Switch Ball To Other Flank"
1
Binary
7
1
0
basPerson
10D
11516
"Possesses Long Flat Throw"
1
Binary
2
1
0
basPerson
10E
11517
"Runs With Ball Often"
1
Binary
3
1
0
basPerson
10E
11518
"Runs With Ball Rarely"
1
Binary
4
1
0
basPerson
10E
11520
"Does not Move Into Channels"
1
Binary
6
1
0
basPerson
10E
11521
"Uses Long Throw To Start Counter Attacks"
1
Binary
7
1
0
basPerson
10E
11522
"Refrains From Taking Long Shots"
1
Binary
0
1
0
basPerson
10F
11523
"Cuts Inside From Left Wing"
1
Binary
1
1
0
basPerson
10F
11524
"Cuts Inside From Right Wing"
1
Binary
2
1
0
basPerson
10F
11525
"Crosses Early"
1
Binary
3
1
0
basPerson
10F
11526
"Brings Ball Out of Defense"
1
Binary
4
1
0
basPerson
10F
11536
"Unused"
1
C0C0C0
Binary
5
1
0
basPerson
10F
11538
"Unused"
1
C0C0C0
Binary
6
1
0
basPerson
10F
11537
"Unused"
1
C0C0C0
Binary
7
1
0
basPerson
10F
11071
"Relationships ->"
FF0000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
enablePersonRelationships(memrec, true)
[DISABLE]
disableArrayRecord(memrec, 'Relationships ->')
1663
"Player Data ->"
0080FF
1
1664
"General ->"
008000
1
7
"Current Ability"
1
2 Bytes
basPlayer
158+8
8
"Potential Ability"
1
2 Bytes
basPlayer
15A+8
5
"Current Rep."
1
2 Bytes
basPlayer
154+8
4
"Home Rep."
1
2 Bytes
basPlayer
152+8
6
"World Rep."
1
2 Bytes
basPlayer
156+8
408
"Height"
1
000000
2 Bytes
basPlayer
15E+8
409
"Weight"
1
2 Bytes
basPlayer
15C+8
68
"Left Foot"
1
Byte
basPlayer
18B+8
67
"Right Foot"
1
Byte
basPlayer
18C+8
1938
"Has No Work Permit"
0:No
1:Yes
Binary
1
1
0
basPlayer
FA+8
1939
"Treated As Non-EU In Italy"
0:No
1:Yes
Binary
3
1
0
basPlayer
FA+8
3
"Match Exercise (Condition)"
1
2 Bytes
basPlayer
158
1
"Match Sharpness (Fitness)"
1
2 Bytes
basPlayer
154
2
"Jadedness"
1
2 Bytes
basPlayer
156
468
"Morale"
1
Byte
basPlayer
1B3
11462
"Training ->"
008000
1
11405
"Training Intensity Level"
-1:Automatic
0:Half Intensity
1:Normal Intensity
2:Double Intensity
1
Byte
basPlayer
58
11406
"Training Info"
8:Normal Training
10:No Pitch or Gym Work
11:On Vacation
1
1
Binary
0
4
0
basPlayer
59
11407
"Training No Pitch or Gym Until ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_trainingDay01,20)
registersymbol(_trainingDay01)
{$lua}
local t = createTimer()
t.Interval = 100
t.onTimer = function()
if memrec == nil then return end
local addr = getAddressSafe("_trainingDay01")
if addr == nil then
t.destroy()
memrec.Active = false
return
end
local strDate = "Not Loaded"
if memrec.Active then
t.Interval = 2000
local dayRec = findRecord(memrec, '^Day of Year')
local yearRec = findRecord(memrec, '^Year')
if dayRec ~= nil and yearRec ~= nil then
local day = bAnd(readSmallInteger(dayRec.getCurrentAddress()), 0x1FF)
local year = readSmallInteger(yearRec.getCurrentAddress())
strDate = getFMDate(day, year)
end
local addr = getAddressSafe("_trainingDay01")
if addr ~= nil then
-- zero text
writeQword(addr, 0)
writeQword(addr+0x8, 0)
writeString(addr, strDate)
end
else
t.destroy()
end
end
{$asm}
[DISABLE]
unregistersymbol(_trainingDay01)
dealloc(_trainingDay01)
11408
"Info"
:
String
16
0
0
1
_trainingDay01
11409
"Day of Year"
Custom
Mask 0x1FF
basPlayer
48
11410
"Year"
2 Bytes
basPlayer
4A
11454
"Training Unknown Date ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_trainingDay02,20)
registersymbol(_trainingDay02)
{$lua}
local t = createTimer()
t.Interval = 100
t.onTimer = function()
if memrec == nil then return end
local addr = getAddressSafe("_trainingDay02")
if addr == nil then
t.destroy()
memrec.Active = false
return
end
local strDate = "Not Loaded"
if memrec.Active then
t.Interval = 2000
local dayRec = findRecord(memrec, '^Day of Year')
local yearRec = findRecord(memrec, '^Year')
if dayRec ~= nil and yearRec ~= nil then
local day = bAnd(readSmallInteger(dayRec.getCurrentAddress()), 0x1FF)
local year = readSmallInteger(yearRec.getCurrentAddress())
strDate = getFMDate(day, year)
end
local addr = getAddressSafe("_trainingDay02")
if addr ~= nil then
-- zero text
writeQword(addr, 0)
writeQword(addr+0x8, 0)
writeString(addr, strDate)
end
else
t.destroy()
end
end
{$asm}
[DISABLE]
unregistersymbol(_trainingDay02)
dealloc(_trainingDay02)
11455
"Info"
:
String
16
0
0
1
_trainingDay02
11456
"Day of Year"
Custom
Mask 0x1FF
basPlayer
44
11457
"Year"
2 Bytes
basPlayer
46
11458
"Training Vacation Until ->"
008000
Auto Assembler Script
[ENABLE]
alloc(_trainingDay03,20)
registersymbol(_trainingDay03)
{$lua}
local t = createTimer()
t.Interval = 100
t.onTimer = function()
if memrec == nil then return end
local addr = getAddressSafe("_trainingDay03")
if addr == nil then
t.destroy()
memrec.Active = false
return
end
local strDate = "Not Loaded"
if memrec.Active then
t.Interval = 2000
local dayRec = findRecord(memrec, '^Day of Year')
local yearRec = findRecord(memrec, '^Year')
if dayRec ~= nil and yearRec ~= nil then
local day = bAnd(readSmallInteger(dayRec.getCurrentAddress()), 0x1FF)
local year = readSmallInteger(yearRec.getCurrentAddress())
strDate = getFMDate(day, year)
end
local addr = getAddressSafe("_trainingDay03")
if addr ~= nil then
-- zero text
writeQword(addr, 0)
writeQword(addr+0x8, 0)
writeString(addr, strDate)
end
else
t.destroy()
end
end
{$asm}
[DISABLE]
unregistersymbol(_trainingDay03)
dealloc(_trainingDay03)
11459
"Info"
:
String
16
0
0
1
_trainingDay03
11460
"Day of Year"
Custom
Mask 0x1FF
basPlayer
40
11461
"Year"
2 Bytes
basPlayer
42
85
"Positions ->"
008000
1
1307
"Role Used To Fill Empty Attributes"
-1:Automatic
0:Goalkeeper
12:Sweeper Keeper
14:Libero
2:Full-Back
3:Wing-Back
36:No-Nonsense Full-Back
38:Complete Wing-Back
44:Inverted Wing-Back
1:Central Defender
24:Ball Playing Defender
29:No-Nonsense Centre-Back
4:Defensive Midfielder
15:Deep Lying Playmaker
33:Anchor Man
35:Half Back
39:Regista
28:Ball Winning Midfielder
46:Roaming Playmaker
6:Wide Midfielder
30:Defensive Winger
43:Wide Playmaker
5:Central Midfielder
16:Box To Box Midfielder
17:Advanced Playmaker
7:Winger
27:Inside Forward
49:Inverted Winger
42:Wide Target Man
45:Raumdeuter
9:Attacking Midfielder
37:Enganche
41:Shadow Striker
32:Trequartista
31:Pressing Forward
10:Deep Lying Forward
40:False Nine
11:Advanced Forward
18:Target Man
19:Poacher
20:Complete Forward
47:Mezzala
50:Segundo Volante
48:Carrilero
1
Byte
basPlayer
1B3+8
84
"GK"
1
Byte
basPlayer
164+8
99
"SW"
1
Byte
basPlayer
165+8
98
"DL"
1
Byte
basPlayer
166+8
97
"DC"
1
Byte
basPlayer
167+8
96
"DR"
1
Byte
basPlayer
168+8
87
"WBL"
1
Byte
basPlayer
171+8
86
"WBR"
1
Byte
basPlayer
172+8
95
"DM"
1
Byte
basPlayer
169+8
94
"ML"
1
Byte
basPlayer
16A+8
93
"MC"
1
Byte
basPlayer
16B+8
92
"MR"
1
Byte
basPlayer
16C+8
91
"AML"
1
Byte
basPlayer
16D+8
90
"AMC"
1
Byte
basPlayer
16E+8
89
"AMR"
1
Byte
basPlayer
16F+8
88
"ST"
1
Byte
basPlayer
170+8
1305
"Preferred Central Position"
0:Not Set
1:Right
2:Left
3:Right Or Central When Three
4:Left Or Central When Three
5:Central When Three
6:Right Of Two Or Right / Central When Three
7:Left Of Two Or Left / Central When Three
1
Byte
basPlayer
1B2+8
1731
"Injury ->"
008000
1
412
"Row ID"
000000
4 Bytes
basPlayer
8
10
0
0
D8+8
1733
"Unique ID"
000000
4 Bytes
basPlayer
C
10
0
0
D8+8
1732
"Name"
:
000000
String
32
0
0
0
basPlayer
4
18
10
0
0
D8+8
1735
"Minimum Days"
000000
2 Bytes
basPlayer
2C
0
0
D8+8
1734
"Extra Days"
000000
2 Bytes
basPlayer
2E
0
0
D8+8
1737
"Treatment"
1:Physio
2:Specialist
4:Injection
8:Isolation
3:Physio / Specialist
5:Physio / Injection
9:Physio / Isolation
6:Specialist / Injection
10:Specialist / Isolation
12:Injection / Isolation
7:Physio / Specialist / Injection
11:Physio / Specialist / Isolation
13:Physio / Injection / Isolation
14:Specialist / Injection / Isolation
15:Physio / Specialist / Injection / Isolation
000000
2 Bytes
basPlayer
34
0
0
D8+8
867
"Unhappinesses ->"
008000
1
857
"1 ->"
FF0000
1
870
"Motive"
2 Bytes
basPerson
14
0
28
C8
874
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
0
28
C8
10827
"Info"
1
Byte
basPerson
17
0
28
C8
868
"Start Date ->"
800080
1
405
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
0
28
C8
873
"Year"
2 Bytes
basPerson
2
0
28
C8
869
"End Date ->"
800080
1
872
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
0
28
C8
871
"Year"
2 Bytes
basPerson
6
0
28
C8
947
"2 ->"
FF0000
1
948
"Motive"
Byte
basPerson
15
8
28
C8
949
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
8
28
C8
950
"Start Date ->"
800080
1
951
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
8
28
C8
952
"Year"
2 Bytes
basPerson
2
8
28
C8
953
"End Date ->"
800080
1
954
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
8
28
C8
955
"Year"
2 Bytes
basPerson
6
8
28
C8
938
"3 ->"
FF0000
1
939
"Motive"
Byte
basPerson
15
10
28
C8
940
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
10
28
C8
941
"Start Date ->"
800080
1
942
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
10
28
C8
943
"Year"
2 Bytes
basPerson
2
10
28
C8
944
"End Date ->"
800080
1
945
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
10
28
C8
946
"Year"
2 Bytes
basPerson
6
10
28
C8
929
"4 ->"
FF0000
1
930
"Motive"
Byte
basPerson
15
18
28
C8
931
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
18
28
C8
932
"Start Date ->"
800080
1
933
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
18
28
C8
934
"Year"
2 Bytes
basPerson
2
18
28
C8
935
"End Date ->"
800080
1
936
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
18
28
C8
937
"Year"
2 Bytes
basPerson
6
18
28
C8
920
"5 ->"
FF0000
1
921
"Motive"
Byte
basPerson
15
20
28
C8
922
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
20
28
C8
923
"Start Date ->"
800080
1
924
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
20
28
C8
925
"Year"
2 Bytes
basPerson
2
20
28
C8
926
"End Date ->"
800080
1
927
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
20
28
C8
928
"Year"
2 Bytes
basPerson
6
20
28
C8
911
"6 ->"
FF0000
1
912
"Motive"
Byte
basPerson
15
28
28
C8
913
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
28
28
C8
914
"Start Date ->"
800080
1
915
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
28
28
C8
916
"Year"
2 Bytes
basPerson
2
28
28
C8
917
"End Date ->"
800080
1
918
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
28
28
C8
919
"Year"
2 Bytes
basPerson
6
28
28
C8
902
"7 ->"
FF0000
1
903
"Motive"
Byte
basPerson
15
30
28
C8
904
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
30
28
C8
905
"Start Date ->"
800080
1
906
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
30
28
C8
907
"Year"
2 Bytes
basPerson
2
30
28
C8
908
"End Date ->"
800080
1
909
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
30
28
C8
910
"Year"
2 Bytes
basPerson
6
30
28
C8
893
"8 ->"
FF0000
1
894
"Motive"
Byte
basPerson
15
38
28
C8
895
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
38
28
C8
896
"Start Date ->"
800080
1
897
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
38
28
C8
898
"Year"
2 Bytes
basPerson
2
38
28
C8
899
"End Date ->"
800080
1
900
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
38
28
C8
901
"Year"
2 Bytes
basPerson
6
38
28
C8
884
"9 ->"
FF0000
1
885
"Motive"
Byte
basPerson
15
40
28
C8
886
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
40
28
C8
887
"Start Date ->"
800080
1
888
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
40
28
C8
889
"Year"
2 Bytes
basPerson
2
40
28
C8
890
"End Date ->"
800080
1
891
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
40
28
C8
892
"Year"
2 Bytes
basPerson
6
40
28
C8
875
"10 ->"
FF0000
1
876
"Motive"
Byte
basPerson
15
48
28
C8
877
"Type"
-1:Slight concerned
1:Concerned
2:Internal
3:Public
4:Alienated
1
Byte
basPerson
16
48
28
C8
878
"Start Date ->"
800080
1
879
"Day of Year"
Custom
Mask 0x1FF
basPerson
0
48
28
C8
880
"Year"
2 Bytes
basPerson
2
48
28
C8
881
"End Date ->"
800080
1
882
"Day of Year"
Custom
Mask 0x1FF
basPerson
4
48
28
C8
883
"Year"
2 Bytes
basPerson
6
48
28
C8
82
"Physical Attributes ->"
008000
1
442
"Acceleration"
Byte
basPlayer
195+8
453
"Agility"
Byte
basPlayer
1A1+8
452
"Balance"
Byte
basPlayer
19D+8
451
"Jumping Reach"
Byte
basPlayer
19A+8
450
"Natural Fitness"
Byte
basPlayer
1A5+8
449
"Pace"
Byte
basPlayer
199+8
448
"Stamina"
Byte
basPlayer
198+8
447
"Strength"
Byte
basPlayer
197+8
81
"Mental Attributes ->"
008000
1
47
"Aggression"
Byte
basPlayer
1A0+8
39
"Anticipation"
Byte
basPlayer
184+8
49
"Bravery"
Byte
basPlayer
19E+8
73
"Composure"
Byte
basPlayer
1A7+8
72
"Concentration"
Byte
basPlayer
1A8+8
38
"Decision"
Byte
basPlayer
185+8
74
"Determination"
Byte
basPlayer
1A6+8
66
"Flair"
Byte
basPlayer
18D+8
52
"Leadership"
Byte
basPlayer
19B+8
32
"Off The Ball"
Byte
basPlayer
179+8
36
"Positioning"
Byte
basPlayer
187+8
64
"Teamwork"
Byte
basPlayer
18F+8
46
"Vision"
Byte
basPlayer
17D+8
63
"Work Rate"
Byte
basPlayer
190+8
80
"Technical Attributes ->"
008000
1
415
"Corners"
Byte
basPlayer
18E+8
428
"Crossing"
Byte
basPlayer
173+8
427
"Dribbling"
Byte
basPlayer
174+8
426
"Finishing"
Byte
basPlayer
175+8
425
"First Touch"
Byte
basPlayer
189+8
424
"Free Kick Taking"
Byte
basPlayer
196+8
423
"Heading"
Byte
basPlayer
176+8
422
"Long Shots"
Byte
basPlayer
177+8
421
"Long Throws"
Byte
basPlayer
191+8
420
"Marking"
Byte
basPlayer
178+8
419
"Passing"
Byte
basPlayer
17A+8
418
"Penalty Taking"
Byte
basPlayer
17B+8
417
"Tackling"
Byte
basPlayer
17C+8
416
"Technique"
Byte
basPlayer
18A+8
83
"Goalkeeping Attributes ->"
008000
1
429
"Aerial Reach"
Byte
basPlayer
17F+8
439
"Command Of Area"
Byte
basPlayer
180+8
438
"Communication"
Byte
basPlayer
181+8
437
"Eccentricity"
Byte
basPlayer
192+8
436
"Handling"
Byte
basPlayer
17E+8
435
"Kicking"
Byte
basPlayer
182+8
434
"One On Ones"
Byte
basPlayer
186+8
433
"Reflexes"
Byte
basPlayer
188+8
432
"Rushing Out"
Byte
basPlayer
193+8
431
"Tendency To Punch"
Byte
basPlayer
194+8
430
"Throwing"
Byte
basPlayer
183+8
100
"Hidden Attributes ->"
008000
1
441
"Dirtiness"
Byte
basPlayer
19C+8
446
"Consistency"
Byte
basPlayer
19F+8
445
"Imp. Matches"
Byte
basPlayer
1A2+8
444
"Injury Proneness"
Byte
basPlayer
1A3+8
443
"Versatility"
Byte
basPlayer
1A4+8
11165
"Staff Data ->"
0080FF
1
11166
"General ->"
008000
1
11167
"Current Ability"
1
2 Bytes
basNonPlayer
CA
11168
"Potential Ability"
1
2 Bytes
basNonPlayer
CC
11169
"Current Rep."
1
2 Bytes
basNonPlayer
C6
11170
"Home Rep."
1
2 Bytes
basNonPlayer
C4
11171
"World Rep."
1
2 Bytes
basNonPlayer
C8
11172
"Preferred Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
1
Byte
basNonPlayer
D1
11173
"Second Preferred Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
1
Byte
basNonPlayer
D2
11174
"Defensive Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
1
Byte
basNonPlayer
D3
11175
"Attacking Formation"
0:Not Set
25:3-1-3-1-2 DM
60:3-1-4-2 DM
34:3-2-3-2 DM
31:3-4-2-1 DM
35:3-4-3 DM Wide
27:4-1-2-3 DM AM Narrow
26:4-1-2-3 DM Narrow
19:4-1-3-1-1 DM AM Narrow
52:4-1-3-2 DM
20:4-1-3-2 DM Narrow
32:4-1-4-1 DM
53:4-1-4-1 DM Asm AM(L)
50:4-1-4-1 DM Asm AM(R)
4:4-1-4-1 DM Wide
23:4-2-1-3 DM Wide
22:4-2-2-2 DM
62:4-2-2-2 DM AM Narrow
24:4-2-2-2 DM Narrow
54:4-2-3-1 DM
40:4-2-3-1 DM AM Narrow
29:4-2-3-1 DM Wide
18:4-2-3-1 Narrow
21:4-2-3-1 Wide
55:4-2-3-1-0 DM
28:4-2-4 DM Wide
51:4-2-4-0 DM Wide
14:4-3-1-2 Narrow
12:4-3-2-1 Narrow
36:4-3-3 Narrow
16:4-4-1-1
33:4-4-1-1 2DM
3:4-4-2
7:4-4-2 Diamond Narrow
8:4-5-1
42:5-1-2-2 DM Narrow
30:5-1-2-2 DM WB
56:5-1-3-1 DM WB
41:5-2-1-2 WB
57:5-2-2-1 DM
59:5-2-2-1 WB
58:5-2-2-1-0 DM
47:5-2-3 Narrow
2:5-3-2 WB
38:5-4-1
15:5-4-1 Diamond WB
61:5-4-1 WB Wide
1
Byte
basNonPlayer
D4
11176
"Coaching Style"
0:Not Set
1:General
2:Goalkeeping
3:Fitness
4:Attacking
5:Defending
6:Physio
7:Tactical
8:Mental
1
Byte
basNonPlayer
D6
11177
"Coaching License"
0:None
7:National C License
6:National B License
5:National A License
4:Continental C License
3:Continental B License
2:Continental A License
1:Continental Pro License
249:Studying To National C License
250:Studying To National B License
251:Studying To National A License
252:Studying To Continental C License
253:Studying To Continental B License
254:Studying To Continental A License
255:Studying To Continental Pro License
0
Byte
basPerson
16a
11178
"Tactical Attributes ->"
1
008000
1
11179
"Attacking"
1
Byte
basNonPlayer
10
11180
"Depth"
1
Byte
basNonPlayer
23
11181
"Directness"
1
Byte
basNonPlayer
13
11182
"Flamboyancy"
1
Byte
basNonPlayer
24
11183
"Flexibility"
1
Byte
basNonPlayer
25
11184
"Free Roles"
1
Byte
basNonPlayer
15
11185
"Marking"
1
Byte
basNonPlayer
17
11186
"Offside"
1
Byte
basNonPlayer
18
11187
"Pressing"
1
Byte
basNonPlayer
1A
11188
"Sitting Back"
1
Byte
basNonPlayer
20
11189
"Tempo"
1
Byte
basNonPlayer
28
11190
"Use Of Playmaker"
1
Byte
basNonPlayer
21
11191
"Use Of Subtitutions"
1
Byte
basNonPlayer
22
11192
"Width"
1
Byte
basNonPlayer
29
11193
"Non Tactical Attributes ->"
1
008000
1
11194
"Buying Players"
1
Byte
basNonPlayer
1E
11195
"Hardness Of Training"
1
Byte
basNonPlayer
26
11196
"Mind Games"
1
Byte
basNonPlayer
1F
11197
"Squad Rotation"
1
Byte
basNonPlayer
27
11198
"Coaching Attributes ->"
1
008000
1
11199
"Working w/ Youngsters (Max: 20)"
1
Byte
basNonPlayer
1C
11200
"Attacking"
1
Byte
basNonPlayer
32
11201
"Defending"
1
Byte
basNonPlayer
33
11202
"Fitness"
1
Byte
basNonPlayer
34
11203
"GK Distribution"
1
Byte
basNonPlayer
3a
11204
"GK Handling"
1
Byte
basNonPlayer
39
11205
"GK Shot Stopping"
1
Byte
basNonPlayer
2B
11206
"Mental"
1
Byte
basNonPlayer
35
11207
"Player"
1
Byte
basNonPlayer
2A
11208
"Tactical"
1
Byte
basNonPlayer
37
11209
"Technical"
1
Byte
basNonPlayer
36
11210
"Man Management"
1
Byte
basNonPlayer
2E
11211
"Dirtiness Allowance"
1
Byte
basNonPlayer
38
11212
"Versatility"
1
Byte
basNonPlayer
3B
11213
"Mental Attributes ->"
1
008000
1
11214
"Adaptability (Max: 20)"
1
Byte
basPerson
80
11215
"Level of Discipline (Max: 20)"
1
Byte
basNonPlayer
14
11216
"Determination"
1
Byte
basNonPlayer
1D
11217
"Judging CA"
1
Byte
basNonPlayer
2c
11218
"Judging PA"
1
Byte
basNonPlayer
2d
12072
"Judging Staff"
1
Byte
basNonPlayer
42
11219
"Motivating"
1
Byte
basNonPlayer
2F
11220
"Tactical Knowledge"
1
Byte
basNonPlayer
31
11221
"Physiotherapy"
1
Byte
basNonPlayer
30
11222
"Sports Science"
1
Byte
basNonPlayer
3F
12073
"Negotiating"
1
Byte
basNonPlayer
41
11223
"Chairman Attributes ->"
1
008000
1
11224
"Business"
1
Byte
basNonPlayer
11
11225
"Interference"
1
Byte
basNonPlayer
16
11226
"Patience"
1
Byte
basNonPlayer
19
11227
"Resources"
1
Byte
basNonPlayer
1B
11228
"Analyst Attributes ->"
1
008000
1
11229
"Judging Player Data"
1
Byte
basNonPlayer
3C
11230
"Judging Team Data"
1
Byte
basNonPlayer
3D
11231
"Presenting Data"
1
Byte
basNonPlayer
3E
11255
"Manager Data ->"
0080FF
1
11613
"Number of Messages"
2 Bytes
basManager
da
11323
"Become Unsackable (Not Working)"
0:No
2:Yes
C0C0C0
Byte
basManager
2A0
11324
"Squad Registration Options (Not Working)"
0:No
1:Allow Squad Registration Anytime
2:Allow Squad Numbers Anytime
3:Allow both
C0C0C0
Byte
basManager
2A1
11639
"Match ->"
000080
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _matchrec = memrec
local updateHeader = function()
local hometeam = readQword('[[basOnMatch]+18]+8')
local awayteam = readQword('[[basOnMatch]+18]+10')
local time = formatFMDate('[[basOnMatch]+18]+4c')
if hometeam ~= nil and awayteam ~= nil then
local name = getTeamName(hometeam)..' vs '..getTeamName(awayteam)..' @ '..time
_matchrec.Description = string.format("Match [%s] ->", name)
else
_matchrec.Description = "Match [??] ->"
end
end
local updateDate = function()
local matchdate = formatFMDate('[[basOnMatch]+18]+4c')
local addr = getAddressSafe('_MatDateData')
if addr ~= nil then
writeString(addr, matchdate)
writeBytes(addr+string.len(matchdate), 0)
end
end
if _tMatchNameTimer ~= nil then _tMatchNameTimer.destroy() end
_tMatchNameTimer=createTimer()
_tMatchNameTimer.Interval = 5000
_tMatchNameTimer.onTimer = function()
if _matchrec ~= nil then
if _matchrec.Active == false then
if _tMatchNameTimer ~= nil then _tMatchNameTimer.destroy() end
_tMatchNameTimer = nil
else
if readInteger('updOnMatch') == 1 then
writeInteger('updOnMatch', 0)
updateHeader()
end
updateDate()
end
end
end
_tMatchNameTimer.Enabled = true
updateHeader()
updateDate()
[DISABLE]
if _tMatchNameTimer ~= nil then _tMatchNameTimer.destroy() end
_tMatchNameTimer = nil
if memrec ~= nil then
memrec.Description = "Match ->"
end
1768
"Match Information ->"
0080FF
1
1919
"Date"
:
000000
String
20
0
0
1
_MatDateData
1757
"Competition"
:
String
32
0
0
1
basOnMatch
4
58
18
20
18
1766
"Venue"
:
String
32
0
0
1
basOnMatch
4
40
28
18
1769
"Attendance"
4 Bytes
basOnMatch
5C
18
1770
"Attendance (Away)"
4 Bytes
basOnMatch
60
18
1767
"Teams ->"
0080FF
1
11638
"Home Team"
:
String
16
0
0
1
basOnMatch
4
C0
18
8
18
12063
"Home Team Type"
0:First Team
1:Reserves
2:A
3:B
4:Superdraft A
5:Superdraft B
6:Superdraft C
7:Superdraft D
8:Waivers
9:U23
10:U21
11:U19
12:U18
13:C
14:Amateur
15:II
16:Team 2
17:Team 3
18:U20
22:Youth Evaluation
30:Dutch Reserves
Byte
basOnMatch
30
8
18
1762
"Home Score"
Byte
basOnMatch
64
18
1764
"Away Team"
:
String
16
0
0
1
basOnMatch
4
C0
18
10
18
12064
"Away Team Type"
0:First Team
1:Reserves
2:A
3:B
4:Superdraft A
5:Superdraft B
6:Superdraft C
7:Superdraft D
8:Waivers
9:U23
10:U21
11:U19
12:U18
13:C
14:Amateur
15:II
16:Team 2
17:Team 3
18:U20
22:Youth Evaluation
30:Dutch Reserves
Byte
basOnMatch
30
10
18
1763
"Away Score"
Byte
basOnMatch
69
18
1761
"#############################################################################################"
400040
1
1656
"Helper Scripts ->"
000080
1
11140
"[X] <----- Focus Manager (Set Player, Club, Nation, Competition to self)"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
updateManagerPointers()
local _currec = memrec
_tManagerUpdate = createTimer()
_tManagerUpdate.Interval = 100
_tManagerUpdate.onTimer = function()
_currec.Active = false
if _tManagerUpdate ~= nil then
_tManagerUpdate.Enabled = false
_tManagerUpdate.destroy()
end
_tManagerUpdate = nil
end
_tManagerUpdate.Enabled = true
[DISABLE]
if _tManagerUpdate ~= nil then
_tManagerUpdate.Enabled = false
_tManagerUpdate.destroy()
end
_tManagerUpdate = nil
11591
"Instant Scripts ->"
1
11340
"Manager's Club ->"
808000
1
11342
"[X] <----- Set Match Condition/Fitness to Max for Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
writeSmallInteger(playerPtr+0x158, 12749)
writeSmallInteger(playerPtr+0x154, 12749)
-- some users claim jadedness < 0 increase injuries so set to 0 for now
if readSignedShortInteger(playerPtr+0x156) > 0 then
writeSmallInteger(playerPtr+0x156, 0)
end
--print(hex(k), hex(playerPtr), getPlayerName(playerPtr),
-- tostring(readSignedShortInteger(playerPtr+0x150)),
-- tostring(readSignedShortInteger(playerPtr+0x14c)),
-- tostring(readSignedShortInteger(playerPtr+0x14E))
-- )
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11343
"[X] <----- Set Happiness to Max for Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
writeBytes(playerPtr+0x1B3, 20)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11344
"[X] <----- Set Training Happiness to Max for Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local person = getPersonFromPlayer(playerPtr)
local name = getPersonName(person)
local result = nil
forEachRelationInPerson(person, function(k, addr)
local type = readBytes(addr+0xB)
if type == 71 then
-- local level = readBytes(addr+0xC)
-- if level < 100 then print(hex(k), hex(playerPtr), getPersonName(person), hex(addr), tostring(type), tostring(level)) end
writeBytes(addr+0xC, 127)
return false -- break loop
end
end)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11345
"[X] <----- Set Favourite Person to Max with all members of same Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
local updateRelations = function(k, addr)
local type = readBytes(addr+0xB)
if type == 1 or type == 2 then
local otherPerson = readQword(addr)
local otherClub = getPersonClub(otherPerson)
if otherClub == club then
if type == 2 then
-- change disliked to favourite
writeBytes(addr+0xB, 1)
end
local level = readBytes(addr+0xC)
if level < 100 then
-- print(hex(k), getPersonName(otherPerson), hex(addr), tostring(type), tostring(level))
writeBytes(addr+0xC, 100)
end
end
end
end
forEachPlayerInClub(club, function(k, playerPtr)
forEachRelationInPerson(getPersonFromPlayer(playerPtr), updateRelations)
end)
forEachStaffInClub(club, function(k, playerAddr)
local person = getPersonFromPlayer(playerAddr)
forEachRelationInPerson(person, updateRelations)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11403
"[X] <----- Set Tactical Familiarity to Max for all Players in Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local forEachTrainingValue = function(playerPtr, func)
local addr = getAddressSafe(playerPtr)
if addr == nil then return end
addr = readQword(addr+0xE8)
if addr == nil then return end
local startAddr = addr+0x18
if startAddr == nil then return end
local endAddr = addr+0xF8
if endAddr == nil then return end
local blockIdx = 0
forEach(startAddr, endAddr, 0x20, function(i, blkAddr)
local addr = getAddressSafe(blkAddr)
if addr == nil then return end
local startAddr = readQword(addr+0x0)
if startAddr == nil then return end
local endAddr = readQword(addr+0x8)
if endAddr == nil then return end
local blockIdx = readInteger(addr+0x18)
if blockIdx ~= i-1 then return end
forEach(startAddr, endAddr, 0x4, function(valueIdx, valueAddr)
func(valueAddr, blockIdx, valueIdx)
end)
end)
end
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
forEachTrainingValue(playerPtr, function(valueAddr, blockIdx, valueIdx)
local value = readInteger(valueAddr)
local lower = bAnd(value, 0x00003FFF)
local upper = bAnd(value, 0xFFFFC000)
if lower < 10000 then
writeInteger(valueAddr, bOr(upper, 10000))
end
end)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12118
"[X] <----- Reduce Injury to 1 Day"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local daysAddr = getAddressSafe('[[['..hex(playerPtr)..'+E0]]]+2C')
if daysAddr ~= nil then
if readBytes(daysAddr) > 1 then
writeBytes(daysAddr, 1)
end
daysAddr = getAddressSafe('[[['..hex(playerPtr)..'+E0]]]+2E')
if daysAddr ~= nil then
writeBytes(daysAddr, 0)
end
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12164
"Advanced"
C0C0C0
1
11370
"[X] <----- Set Contract Start Date to Today for Club (Decreases Offers)"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local today = getCurrentDay()
local year = getCurrentYear()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local person = getPersonFromPlayer(playerPtr)
local name = getPersonName(person)
local result = nil
local contractPtr = readQword(person + 0xC8)
if contractPtr ~= nil then
writeSmallInteger(contractPtr + 0x3C, today)
writeSmallInteger(contractPtr + 0x3E, year)
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11557
"[X] <----- Set Contract Start Date to Join Date for Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local person = getPersonFromPlayer(playerPtr)
local name = getPersonName(person)
local result = nil
local contractPtr = readQword(person + 0xC8)
if contractPtr ~= nil then
local day = readSmallInteger(person+0x14C)
local year = readSmallInteger(person+0x14E)
writeSmallInteger(contractPtr + 0x3C, day)
writeSmallInteger(contractPtr + 0x3E, year)
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12174
"[X] <----- Adjust Wage to Approximate National Wage for Reputation"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local nation = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local contract = readQword(person + 0xC8)
local wage = readInteger(contract + 0x18)
local rep = readSmallInteger(playerPtr + 0x15C)
local repint, reppart = math.modf((rep-50)/500)
if repint < 0 then repint = 0 end
if repint >= 20 then repint = 19 end
local tablewage = readQword(nation + 0x4F0)
local wagelow = readInteger(tablewage + repint*4)
local wagehigh =readInteger(tablewage + (repint+1)*4)
local repwage = ((wagehigh - wagelow) * reppart) + wagelow
local wageint, wagepart = math.modf(repwage)
if wageint > wage then
print(string.format("Adjusted wage from %6d to %6d for %-20s (Rep: %d)", wage, wageint, getPersonName(person), rep ))
writeInteger(contract + 0x18, wageint)
else
print(string.format("Wage Held at %6d instead %6d for %-20s (Rep: %d)", wage, wageint, getPersonName(person), rep ))
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12196
"[X] <----- Adjust Minimum Release Clauses to 5x Yearly Wages or 3x Value"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local nation = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local clauseAddr = hex(person)
local clausesStart = readQword('['..clauseAddr..'+C8]+60')
local clausesEnd = readQword('['..clauseAddr..'+C8]+68')
if clausesStart == nil or clausesEnd == nil then return end
local contract = readQword(person + 0xC8)
local wage = readInteger(contract + 0x18)
local plyvalue = readInteger(playerPtr + 0x130)
-- adjust release to 5 times yearly salary rounded to 1 MM
local plywagval = math.round(wage*52*5, 1000000) + 1000000
-- adjust release to 3 times value rounded to 1 MM
local plyrelval = math.round(plyvalue*3, 1000000) + 1000000
if plywagval > plyrelval then plyrelval = plywagval end
local n = (clausesEnd-clausesStart)/0x8
local count = 0
local elem
forEach(clausesStart, clausesEnd, 0x8, function(k, addr)
local type = readSmallInteger(addr+0x6)
local value = readSignedInteger(addr)
local info = readSignedShortInteger(addr+0x4)
-- minimum release clause
if type == 0 or type == 16 or type == 17 or type == 18 or type == 27 then
local typeName = typeOptionMaps['bonusType'][type]
if plyrelval > value then
print(string.format("Adjusted '%s' from %d to %d for %s", typeName, value, plyrelval, getPersonName(person)))
writeInteger(addr, plyrelval)
else
print(string.format("Did not adjust '%s' from %d to %d for %s", typeName, value, plyrelval, getPersonName(person)))
end
end
end)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11346
"Manager's Nation ->"
808000
1
11352
"[X] <----- Set Match Condition/Fitness to Max for Nation"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
writeSmallInteger(playerPtr+0x150+8, 12749)
writeSmallInteger(playerPtr+0x14C+8, 12749)
-- some users claim jadedness < 0 increase injuries so set to 0 for now
if readSignedShortInteger(playerPtr+0x14E+8) > 0 then
writeSmallInteger(playerPtr+0x14E+8, 0)
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12171
"[X] <----- Set Favourite Person to Max with all members of Manager's Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
local nation = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
local updateRelations = function(k, addr)
local type = readBytes(addr+0xB)
if type == 1 or type == 2 then
local otherPerson = readQword(addr)
local otherClub = getPersonClub(otherPerson)
if otherClub == club then
if type == 2 then
-- change disliked to favourite
writeBytes(addr+0xB, 1)
end
local level = readBytes(addr+0xC)
if level < 100 then
-- print(hex(k), getPersonName(otherPerson), hex(addr), tostring(type), tostring(level))
writeBytes(addr+0xC, 100)
end
end
end
end
forEachPlayerInClub(nation, function(k, playerPtr)
forEachRelationInPerson(getPersonFromPlayer(playerPtr), updateRelations)
end)
forEachStaffInClub(nation, function(k, playerAddr)
local person = getPersonFromPlayer(playerAddr)
forEachRelationInPerson(person, updateRelations)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11396
"Current Player ->"
808000
1
11397
"[X] <----- Set Match Condition/Fitness to Max"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local personPtr = getPersonFromPlayer(playerPtr)
if personPtr == nil then return end
writeSmallInteger(playerPtr+0x150+8, 12749)
writeSmallInteger(playerPtr+0x14C+8, 12749)
-- some users claim jadedness < 0 increase injuries so set to 0 for now
if readSignedShortInteger(playerPtr+0x14E+8) > 0 then
writeSmallInteger(playerPtr+0x14E+8, 0)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11398
"[X] <----- Set Happiness to Max"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local personPtr = getPersonFromPlayer(playerPtr)
if personPtr == nil then return end
writeBytes(playerPtr+0x1AB+8, 20)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11399
"[X] <----- Set Training Happiness to Max"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local name = getPersonName(person)
local result = nil
forEachRelationInPerson(person, function(k, addr)
local type = readBytes(addr+0xB)
if type == 71 then
-- local level = readBytes(addr+0xC)
-- if level < 100 then print(hex(k), hex(playerPtr), getPersonName(person), hex(addr), tostring(type), tostring(level)) end
writeBytes(addr+0xC, 127)
return false -- break loop
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11401
"[X] <----- Set Favourite Person to Max with all members of same Club"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local personPtr = getPersonFromPlayer(playerPtr)
if personPtr == nil then return end
local updateClubRelations = function(k, addr)
local type = readBytes(addr+0xB)
if type == 1 or type == 2 then
local otherPerson = readQword(addr)
local otherClub = getPersonClub(otherPerson)
if otherClub == club then
if type == 2 then
-- change disliked to favourite
writeBytes(addr+0xB, 1)
end
local level = readBytes(addr+0xC)
if level < 100 then
-- print(hex(k), getPersonName(otherPerson), hex(addr), tostring(type), tostring(level))
writeBytes(addr+0xC, 100)
end
end
end
end
local updatePersonRelations = function(k, addr)
local type = readBytes(addr+0xB)
if type == 1 or type == 2 then
local otherPerson = readQword(addr)
if otherPerson == person then
if type == 2 then
-- change disliked to favourite
writeBytes(addr+0xB, 1)
end
local level = readBytes(addr+0xC)
if level < 100 then
-- print(hex(k), getPersonName(otherPerson), hex(addr), tostring(type), tostring(level))
writeBytes(addr+0xC, 100)
end
end
end
end
forEachRelationInPerson(person, updateClubRelations)
forEachStaffInClub(club, function(k, playerAddr)
local person = getPersonFromPlayer(playerAddr)
forEachRelationInPerson(person, updatePersonRelations)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
11402
"[X] <----- Set Tactical Familiarity to Max"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local personPtr = getPersonFromPlayer(playerPtr)
if personPtr == nil then return end
local forEachTrainingValue = function(playerPtr, func)
local addr = getAddressSafe(playerPtr)
if addr == nil then return end
addr = readQword(addr+0xE8)
if addr == nil then return end
local startAddr = addr+0x18
if startAddr == nil then return end
local endAddr = addr+0xF8
if endAddr == nil then return end
local blockIdx = 0
forEach(startAddr, endAddr, 0x20, function(i, blkAddr)
local addr = getAddressSafe(blkAddr)
if addr == nil then return end
local startAddr = readQword(addr+0x0)
if startAddr == nil then return end
local endAddr = readQword(addr+0x8)
if endAddr == nil then return end
local blockIdx = readInteger(addr+0x18)
if blockIdx ~= i-1 then return end
forEach(startAddr, endAddr, 0x4, function(valueIdx, valueAddr)
func(valueAddr, blockIdx, valueIdx)
end)
end)
end
forEachTrainingValue(playerPtr, function(valueAddr, blockIdx, valueIdx)
local value = readInteger(valueAddr)
local lower = bAnd(value, 0x00003FFF)
local upper = bAnd(value, 0xFFFFC000)
-- print(hex(blockIdx), hex(valueIdx), hex(valueAddr), hex(value), lower)
if lower < 10000 then
writeInteger(valueAddr, bOr(upper, 10000))
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12117
"[X] <----- Reduce Injury to 1 Day"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local daysAddr = getAddressSafe('[[[[basPlayer]+E0]]]+2C')
if daysAddr ~= nil then
if readBytes(daysAddr) > 1 then
writeBytes(daysAddr, 1)
end
daysAddr = getAddressSafe('[[[[basPlayer]+E0]]]+2E')
if daysAddr ~= nil then
writeBytes(daysAddr, 0)
end
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12165
"Advanced"
C0C0C0
1
11400
"[X] <----- Set Contract Start Date to Today (Decreases Offers)"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local today = getCurrentDay()
local year = getCurrentYear()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local name = getPersonName(person)
local result = nil
local contractPtr = readQword(person + 0xC8)
if contractPtr ~= nil then
writeSmallInteger(contractPtr + 0x3C, today)
writeSmallInteger(contractPtr + 0x3E, year)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12071
"[X] <----- Set Contract Start Date to Join Date"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local today = getCurrentDay()
local year = getCurrentYear()
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local name = getPersonName(person)
local contractPtr = readQword(person + 0xC8)
if contractPtr ~= nil then
local day = readSmallInteger(person+0x14C)
local year = readSmallInteger(person+0x14E)
writeSmallInteger(contractPtr + 0x3C, day)
writeSmallInteger(contractPtr + 0x3E, year)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12175
"[X] <----- Adjust Wage to Approximate National Wage for Reputation"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local nation = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local contract = readQword(person + 0xC8)
local wage = readInteger(contract + 0x18)
local rep = readSmallInteger(playerPtr + 0x15C)
local repint, reppart = math.modf((rep-50)/500)
if repint < 0 then repint = 0 end
if repint >= 20 then repint = 19 end
local tablewage = readQword(nation + 0x4F0)
local wagelow = readInteger(tablewage + repint*4)
local wagehigh =readInteger(tablewage + (repint+1)*4)
local repwage = ((wagehigh - wagelow) * reppart) + wagelow
local wageint, wagepart = math.modf(repwage)
if wageint > wage then
print(string.format("Adjusted wage from %6d to %6d for %s (Rep: %d)", wage, wageint, getPersonName(person), rep ))
writeInteger(contract + 0x18, wageint)
else
print(string.format("Wage Held at %6d instead %6d for %s: (Rep: %d)", wage, wageint, getPersonName(person), rep ))
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12198
"[X] <----- Adjust Minimum Release Clauses to 5x Yearly Wages or 3x Value"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local nation = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local clauseAddr = hex(person)
local clausesStart = readQword('['..clauseAddr..'+C8]+60')
local clausesEnd = readQword('['..clauseAddr..'+C8]+68')
if clausesStart == nil or clausesEnd == nil then return end
local contract = readQword(person + 0xC8)
local wage = readInteger(contract + 0x18)
local plyvalue = readInteger(playerPtr + 0x130)
-- adjust release to 5 times yearly salary rounded to 1 MM
local plywagval = math.round(wage*52*5, 1000000) + 1000000
-- adjust release to 3 times value rounded to 1 MM
local plyrelval = math.round(plyvalue*3, 1000000) + 1000000
if plywagval > plyrelval then plyrelval = plywagval end
local n = (clausesEnd-clausesStart)/0x8
local count = 0
local elem
forEach(clausesStart, clausesEnd, 0x8, function(k, addr)
local type = readSmallInteger(addr+0x6)
local value = readSignedInteger(addr)
local info = readSignedShortInteger(addr+0x4)
-- minimum release clause
if type == 0 or type == 16 or type == 17 or type == 18 or type == 27 then
local typeName = typeOptionMaps['bonusType'][type]
if plyrelval > value then
print(string.format("Adjust '%s' from %d to %d for %s", typeName, value, plyrelval, getPersonName(person)))
writeInteger(addr, plyrelval)
else
print(string.format("Dont adjust '%s' from %d to %d for %s", typeName, value, plyrelval, getPersonName(person)))
end
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12208
"[X] <----- Set Player to Club's Nationality (Cannot be undone) [EXPERIMENTAL]"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
if club == nil then return end
local nation = getClubNation(club)
if nation == nil then return end
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local plyrNation = getPersonNation(person)
if plyrNation == nil then return end
if plyrNation ~= nation then
setPersonNation(person, nation)
-- print(string.format("%s: Old '%x' New '%x'", getPersonName(person), plyrNation, nation))
local result = nil
forEachRelationInPerson(person, function(k, addr)
local type = readBytes(addr+0xB)
if type == 8 then -- Born in Nation
writeQword(addr, nation)
return false -- break loop
end
end)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12338
"[X] <----- Set Player Training Nation to Club Nation (Cannot be undone) [EXPERIMENTAL]"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
if club == nil then return end
local nation = getClubNation(club)
if nation == nil then return end
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local plyrNation = getPersonNation(person)
if plyrNation == nil then return end
if plyrNation ~= nation then
local result = nil
forEachRelationInPerson(person, function(k, addr)
local type = readBytes(addr+0xB)
if type == 70 then -- Trained in Nation
writeQword(addr, nation)
return false -- break loop
end
end)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12209
"[X] <----- Set Player Youth Training Club to Current Club (Cannot be undone) [EXPERIMENTAL]"
C000C0
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
if club == nil then return end
local nation = getClubNation(club)
if nation == nil then return end
local playerPtr = getAddressSafe('[basPlayer]')
if playerPtr == nil then return end
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local plyrNation = getPersonNation(person)
if plyrNation == nil then return end
if plyrNation ~= nation then
local result = nil
forEachRelationInPerson(person, function(k, addr)
local type = readBytes(addr+0xB)
if type == 72 then -- Trained at Club
writeQword(addr, club)
return false -- break loop
end
end)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12107
"Periodic Scripts ->"
1
12108
"Manager's Club ->"
808000
1
12109
"[X] <----- Set Match Condition/Fitness to Max for Club (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
writeSmallInteger(playerPtr+0x150+8, 12749)
writeSmallInteger(playerPtr+0x14C+8, 12749)
-- some users claim jadedness < 0 increase injuries so set to 0 for now
if readSignedShortInteger(playerPtr+0x14E+8) > 0 then
writeSmallInteger(playerPtr+0x14E+8, 0)
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil or not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
t.Enabled = true
[DISABLE]
12157
"[X] <----- Set Happiness to Max for Club (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
writeBytes(playerPtr+0x1AB+8, 20)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil or not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
t.Enabled = true
[DISABLE]
12158
"[X] <----- Set Training Happiness to Max for Club (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local person = getPersonFromPlayer(playerPtr)
if person == nil then return end
local name = getPersonName(person)
local result = nil
forEachRelationInPerson(person, function(k, addr)
local type = readBytes(addr+0xB)
if type == 71 then
-- local level = readBytes(addr+0xC)
-- if level < 100 then print(hex(k), hex(playerPtr), getPersonName(person), hex(addr), tostring(type), tostring(level)) end
writeBytes(addr+0xC, 127)
return false -- break loop
end
end)
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil or not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
t.Enabled = true
[DISABLE]
12120
"[X] <----- Reduce Injury to 1 Day for Club (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
local daysAddr = getAddressSafe('[[['..hex(playerPtr)..'+E0]]]+2C')
if daysAddr ~= nil then
if readBytes(daysAddr) > 1 then
writeBytes(daysAddr, 1)
end
daysAddr = getAddressSafe('[[['..hex(playerPtr)..'+E0]]]+2E')
if daysAddr ~= nil then
writeBytes(daysAddr, 0)
end
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil or not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
t.Enabled = true
[DISABLE]
12110
"[X] <----- Infinite Transfer Budget (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
if club ~= nil then
writeInteger('['..hex(club)..'+148]+018', 999999999) -- Balance
writeInteger('['..hex(club)..'+148]+67C', 999999999) -- Transfer Budget (Rem.)
writeInteger('['..hex(club)..'+148]+680', 999999999) -- Transfer Budget (Season)
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil then return end
if not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
[DISABLE]
12111
"[X] <----- Infinite Wage Budget (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonClub(getPersonFromPlayer(getManagerPtr()))
if club ~= nil then
writeInteger('['..hex(club)..'+148]+6BC', 2000000) -- Highest Wage Allowed
writeInteger('['..hex(club)..'+148]+6B8', 999999999) -- Weekly Wage Budget
end
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil then return end
if not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
[DISABLE]
12112
"Manager's Nation ->"
808000
1
12113
"[X] <----- Set Match Condition/Fitness to Max for Nation (Run every 60s)"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
local club = getPersonNationContract(getPersonFromPlayer(getManagerPtr()))
forEachPlayerInClub(club, function(k, playerPtr)
writeSmallInteger(playerPtr+0x150+8, 12749)
writeSmallInteger(playerPtr+0x14C+8, 12749)
-- some users claim jadedness < 0 increase injuries so set to 0 for now
if readSignedShortInteger(playerPtr+0x14E+8) > 0 then
writeSmallInteger(playerPtr+0x14E+8, 0)
end
end)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil or not _currec.Active then
t.Enabled = false
t.destroy()
t = nil
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
t.Enabled = true
[DISABLE]
12151
"Selected Players (from Manager's Club) ->"
808000
1
12154
"[X] <----- Run Scheduled Updates (Run every 60s)"
FF0000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
-- uncheck the Run Update box
_selPlayerPeriodic["RunRec"] = memrec
if _selPlayerPeriodic["Players"] == nil then
_selPlayerPeriodic["Players"] = {}
end
local reportrec = memrec.Child[0]
if reportrec == nil then
-- create single record
reportrec = createRecord(memrec, "Initializing", vtCustom, nil, nil )
reportrec.Color = 0x404040
reportrec.DontSave = true
else
reportrec.Description = "Initializing"
reportrec.Color = 0x404040
end
_selPlayerPeriodic["RunRec"] = reportrec
local onUpdateFit = function(info)
local playerPtr = info["playeraddr"]
writeSmallInteger(playerPtr+0x150+8, 12749)
writeSmallInteger(playerPtr+0x14C+8, 12749)
-- some users claim jadedness < 0 increase injuries so set to 0 for now
if readSignedShortInteger(playerPtr+0x14E+8) > 0 then
writeSmallInteger(playerPtr+0x14E+8, 0)
end
end
local onUpdateHappy = function(info)
local playerPtr = info["playeraddr"]
writeBytes(playerPtr+0x1AB+8, 20)
end
local onUpdateTrainHappy = function(info)
local playerPtr = info["playeraddr"]
writeBytes(playerPtr+0x1AB+8, 20)
end
local onUpdateReduceInjury = function(info)
local playerPtr = info["playeraddr"]
local addr = hex(playerPtr)
local daysAddr = getAddressSafe('[[['..addr..'+E0]]]+2C')
if daysAddr ~= nil then
if readBytes(daysAddr) > 1 then
writeBytes(daysAddr, 1)
end
daysAddr = getAddressSafe('[[['..addr..'+E0]]]+2E')
if daysAddr ~= nil then
writeBytes(daysAddr, 0)
end
end
end
local _updateFunc = function()
if _G['_selPlayerPeriodic'] == nil then return end
local updateFuncs = {}
if _selPlayerPeriodic["OptFit"] == 1 then
updateFuncs[#updateFuncs+1]=onUpdateFit
end
if _selPlayerPeriodic["OptHappy"] == 1 then
updateFuncs[#updateFuncs+1]=onUpdateHappy
end
if _selPlayerPeriodic["OptTrainHappy"] == 1 then
updateFuncs[#updateFuncs+1]=onUpdateTrainHappy
end
if _selPlayerPeriodic["OptReduceInjury"] == 1 then
updateFuncs[#updateFuncs+1]=onUpdateReduceInjury
end
if next(updateFuncs) == nil then
-- options ok
reportrec.Description = "ERROR: No Options Selected"
reportrec.Color = 0x0000FF
return
end
local players = _selPlayerPeriodic["Players"]
local k
local info
local update
for k, info in pairs(players) do
local uid = info["uid"]
local playerptr = info["playeraddr"]
local personptr = info["personaddr"]
local ptrid = readInteger(personptr+0xC)
if uid ~= ptrid then
players[k] = nil
end
end
if players == nil or next(players) == nil then
reportrec.Description = "ERROR: No Players Selected"
reportrec.Color = 0x0000FF
return
end
local updated = 0
for _, info in pairs(players) do
for k, update in ipairs(updateFuncs) do
update(info)
end
updated = updated + 1
end
reportrec.Description = string.format("Updated %s players", updated)
reportrec.Color = 0x000000
end
_selPlayerPeriodic["UpdateFunc"] = _updateFunc
local _currec = memrec
local t = createTimer()
_selPlayerPeriodic["Timer"] = t
t.Interval = 100 -- run fast first time
t.onTimer = function()
if t == nil then
_selPlayerPeriodic["Timer"] = nil
elseif not _currec.Active or _deactivateTimers then
t.Enabled = false
t.destroy()
t = nil
_selPlayerPeriodic["Timer"] = nil
_currec.Active = false
elseif _updateFunc ~= nil then
_updateFunc()
t.Interval = 60000 -- slow down
end
end
t.Enabled = true
[DISABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["UpdateFunc"] = nil
local t = _selPlayerPeriodic["Timer"]
if t ~= nil then
_selPlayerPeriodic["Timer"] = nil
t.Enabled = false
t.destroy()
end
_selPlayerPeriodic["RunRec"] = nil
12153
"[X] <----- Reset Selected Players List"
000080
Auto Assembler Script
// This script is her to just reset everything for strange cases like
// user loads a different game with different players list
{$lua}
if syntaxcheck then return end
[ENABLE]
local _updateFunc = function()
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
-- uncheck the Run Update box
local runrec = _selPlayerPeriodic["RunRec"]
if runrec ~= nil then
playersrec.Active = false
end
-- kill run timer if active
local timer = _selPlayerPeriodic["Timer"]
if timer ~= nil then
_selPlayerPeriodic["Timer"] = nil
timer.Enabled = False
timer.destroy()
end
-- close the players list
local playersrec = _selPlayerPeriodic["PlayersRec"]
if playersrec ~= nil then
playersrec.Active = false
end
-- empty the players structures
_selPlayerPeriodic["Players"] = {}
-- clear options???? (no for now)
end
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
if _updateFunc ~= nil then
_updateFunc()
_updateFunc = nil
end
end
t.Enabled = true
[DISABLE]
12155
"Select Updates to Run (check ones to perform)"
000000
1
12156
"[X] <----- Set Match Condition/Fitness to Max"
C08000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptFit"] = 1
local updateFunc = _selPlayerPeriodic["UpdateFunc"]
if updateFunc ~= nil then
updateFunc()
end
[DISABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptFit"] = 0
local updateFunc = _selPlayerPeriodic["UpdateFunc"]
if updateFunc ~= nil then
updateFunc()
end
12159
"[X] <----- Set Happiness to Max"
C08000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptHappy"] = 1
local updateFunc = _selPlayerPeriodic["UpdateFunc"]
if updateFunc ~= nil then
updateFunc()
end
[DISABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptHappy"] = 0
local updateFunc = _selPlayerPeriodic["UpdateFunc"]
if updateFunc ~= nil then
updateFunc()
end
12161
"[X] <----- Set Training Happiness to Max"
C08000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptTrainHappy"] = 1
[DISABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptTrainHappy"] = 0
12160
"[X] <----- Reduce Injury "
C08000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptReduceInjury"] = 1
[DISABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["OptReduceInjury"] = 0
12162
"Select Players ->"
008000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["PlayersRec"] = memrec
local onEnableSquadTeamRecords = function(memrec)
if memrec ~= nil then
-- store address in adjacent record
local teamAddr = memrec.getCurrentAddress()
if teamAddr == nil or teamAddr == 0 then
local addrRecord = findRecord(memrec.Parent, '^Address')
teamAddr = readQword(addrRecord.getCurrentAddress())
end
if teamAddr == nil or teamAddr == 0 then
disableArrayRecord(memrec, memrec.Description)
return
end
local playersList = _selPlayerPeriodic["Players"]
if playersList == nil then
playersList = {}
_selPlayerPeriodic["Players"] = playersList
end
local teamsStart = readQword(teamAddr+0x38)
local teamsEnd = readQword(teamAddr+0x40)
-- print(hex(teamAddr), hex(teamsStart),hex(teamsEnd))
local elements = memrec
if elements ~= nil then
local n = (teamsEnd-teamsStart)/0x8
local added = 0
local elem
forEach(teamsStart, teamsEnd, 0x8, function(k, elemAddr)
local rec = elements.Child[added]
local addr = readQword(elemAddr) -- indirect through pointer
if addr == 0 then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(addr)
if person == nil then return end
local name = getPersonName(person)
if name == nil then return end
-- print(name, hex(person))
local uid = readInteger(person+0xC)
if uid == nil then return end
local playerInfo = {
["name"] = name,
["uid"] = uid,
["playeraddr"] = addr,
["personaddr"] = person,
}
local desc = string.format("%-2d: %s", k, name)
if rec == nil then
-- create single record
rec = createRecord(elements, desc, vtCustom, addr, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xc000c0
rec.DontSave = true
rec.OnActivate = function(record, before, currentstate)
local playersList = _selPlayerPeriodic["Players"]
if playersList == nil then
playersList = {}
_selPlayerPeriodic["Players"] = playersList
end
playersList[uid] = playerInfo
-- print(playerInfo["name"], playerInfo["uid"], hex(playerInfo["playeraddr"]), hex(playerInfo["personaddr"]))
local updateFunc = _selPlayerPeriodic["UpdateFunc"]
if updateFunc ~= nil then
updateFunc()
end
return true
end
rec.OnDeactivate = function(record, before, currentstate)
local playersList = _selPlayerPeriodic["Players"]
if playersList == nil then
playersList = {}
_selPlayerPeriodic["Players"] = playersList
end
playersList[uid] = nil
local updateFunc = _selPlayerPeriodic["UpdateFunc"]
if updateFunc ~= nil then
updateFunc()
end
return true
end
if playersList[uid] ~= nil then
rec.Active = true
end
else
rec.setAddress(addr)
rec.Description = desc
end
added = added + 1
end)
-- purge unnecessary
local i
for i=(elements.Count-1),added,-1 do
elements.Child[i]:Destroy()
end
end
end
end
if memrec ~= nil then
local clubAddr = getPersonClub(getPersonFromPlayer(getManagerPtr()))
if clubAddr == nil or clubAddr == 0 then
return
end
local teamsStart = readQword(clubAddr+0x18)
local teamsEnd = readQword(clubAddr+0x20)
local elements = memrec
if elements ~= nil then
local n = (teamsEnd-teamsStart)/0x8
local elem
local count = 0
forEach(teamsStart, teamsEnd, 0x8, function(k, elemAddr)
local rec = elements.Child[count]
local addr = readQword(elemAddr) -- indirect through pointer
local val = readBytes(addr+0x30, 1)
local name = typeOptionMaps["clubType"][val]
if name == nil then
name = string.format("%d", val)
end
local desc = string.format("%2d: %s ->", k, name)
if rec == nil then
rec = createRecord(elements, desc, vtCustom, addr, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xFF0000
rec.DontSave = true
rec.OnActivate = function(record, before, currentstate)
onEnableSquadTeamRecords(record)
return true
end
rec.OnDeactivate = function(record, before, currentstate)
disableArrayRecord(record, record.Description)
return true
end
else
rec.Description = desc
rec.setAddress(addr)
end
count = count + 1
end)
-- purge unnecessary
local i
for i=(elements.Count-1),count,-1 do
elements.Child[i]:Destroy()
end
end
end
[DISABLE]
disableArrayRecord(memrec, memrec.Description)
if _G['_selPlayerPeriodic'] == nil then
_selPlayerPeriodic = {}
end
_selPlayerPeriodic["PlayersRec"] = nil
12082
"Code Modification Scripts ->"
1
12078
"[X] <----- Prevent Club Player Attribute Decreases"
C000C0
Auto Assembler Script
{ Game : fm.exe
Version: v1
Date : 2019-11-10
Author : figment
This script prevents player attributes from decreasing if member of same
club as the manager.
There are some additional checks before min/max that I dont understand below
but those rarely make changes afterwords.
R13 - Holds Player Pointer address
R12 - Holds block of values to change
RDI - Holds already recalculated values that have changed
Strategy is to first verify player is member of club, if yes then
just alter the new values to match existing values when new value is lower.
}
define(lblUpdatePlayerAttrs,fm.exe+542A5B7)
define(datUpdatePlayerAttrs,BD 64 00 00 00 0F 1F 40 00 0F BE 1F 41 88 1C 24)
// trainers manipulate the max value (100 to 125)
//define(matUpdatePlayerAttrs,BD * 00 00 00 0F 1F 40 00 0F BE 1F 41 88 1C 24)
[ENABLE]
assert(lblUpdatePlayerAttrs,datUpdatePlayerAttrs)
alloc(injUpdatePlayerAttrs,$1000,lblUpdatePlayerAttrs)
//label(code)
label(retUpdatePlayerAttrs)
label(skipUpdatePlayerAttrs)
label(loopUpdatePlayerAttrs)
injUpdatePlayerAttrs:
push rax
push rbx
push rcx
push rdx
// RBX = getPersonClub(getPersonFromPlayer(r13))
mov rax, [r13+8] // vtable offsets
mov eax, [rax+8] // offset to person data area
mov rbx, r13
add rbx, eax
add rbx, A8 //C8+8-28
// rbx is player pointer
// this is because of using data area instead of person ptr
//(agents and others use different offsets from players)
// Club Pointer
mov rbx,[rbx]
cmp rbx, 0
je leaveUpdatePlayerAttrs // exit if no club contract
mov rbx,[rbx+10]
cmp rbx, 0
je leaveUpdatePlayerAttrs // exit if no team
mov rbx,[rbx+18]
cmp rbx, 0
je leaveUpdatePlayerAttrs // exit if no club
// RCX = getPersonClub(getPersonFromPlayer(getAddressSafe('[[[lblManagerRoot]+18]]')))
mov rax, [lblManagerRoot]
cmp rax, 0
je leaveUpdatePlayerAttrs
mov rax, [rax+18]
cmp rax, 0
je leaveUpdatePlayerAttrs
mov rax, [rax]
cmp rax, 0
je leaveUpdatePlayerAttrs
mov rcx, [rax] // vtable
mov rdx, vtbManagerPlayer
cmp rcx, rdx
jne leaveUpdatePlayerAttrs // exit if not expected vtable
mov rcx, rax // store manager person pointer in ecx
mov rax, [rax+8] // vtable offsets
mov eax, [rax+8] // offset to person data area
add rcx, eax
add rcx, A8 //C8+8-28
// rbx is player pointer
// this is because of using data area instead of person ptr
//(agents and others use different offsets from players)
// Club Pointer
mov rcx,[rcx]
cmp rcx, 0
je leaveUpdatePlayerAttrs // exit if no club contract ???
mov rcx,[rcx+10]
cmp rcx, 0
je leaveUpdatePlayerAttrs // exit if no team
mov rcx,[rcx+18]
cmp rcx, 0
je leaveUpdatePlayerAttrs // exit if no club
cmp rbx, rcx
jne leaveUpdatePlayerAttrs // verify player is member of same club as manager
// begin attr loop update
push r12 // current parameters array (byte[])
push rdi // new parameters array (short[])
mov ecx, 45 // hard coded length of list
loopUpdatePlayerAttrs:
movsx eax, byte ptr [r12]
movsx ebx, byte ptr [rdi]
cmp bl,al
jge skipUpdatePlayerAttrs
mov [rdi], al // overwrite value
skipUpdatePlayerAttrs:
inc r12
add rdi, 2
loop loopUpdatePlayerAttrs
pop rdi
pop r12
leaveUpdatePlayerAttrs:
pop rdx
pop rcx
pop rbx
pop rax
//mov ebp,00000064 //
mov ebp,0000007D // Increase max to 25
jmp retUpdatePlayerAttrs
lblUpdatePlayerAttrs:
jmp injUpdatePlayerAttrs
retUpdatePlayerAttrs:
[DISABLE]
lblUpdatePlayerAttrs:
db datUpdatePlayerAttrs
// mov ebp,00000064
dealloc(injUpdatePlayerAttrs)
{
// ORIGINAL CODE - INJECTION POINT: "fm.exe"+23A3A11A
"fm.exe"+23A3A0E2: BB 05 00 00 00 - mov ebx,00000005
"fm.exe"+23A3A0E7: 41 0F B7 E9 - movzx ebp,r9w
"fm.exe"+23A3A0EB: 41 BB 18 FC FF FF - mov r11d,FFFFFC18
"fm.exe"+23A3A0F1: 44 8D 53 FB - lea r10d,[rbx-05]
"fm.exe"+23A3A0F5: 41 81 FE E8 03 00 00 - cmp r14d,000003E8
"fm.exe"+23A3A0FC: 0F 8C CE FC FF FF - jl fm.exe+23A39DD0
"fm.exe"+23A3A102: 4C 8B A4 24 50 05 00 00 - mov r12,[rsp+00000550]
"fm.exe"+23A3A10A: 48 8D BC 24 90 00 00 00 - lea rdi,[rsp+00000090]
"fm.exe"+23A3A112: 48 8B 74 24 30 - mov rsi,[rsp+30]
"fm.exe"+23A3A117: 45 30 DB - xor r11l,r11l
// ---------- INJECTING HERE ----------
"fm.exe"+23A3A11A: BD 64 00 00 00 - mov ebp,00000064
// ---------- DONE INJECTING ----------
"fm.exe"+23A3A11F: 90 - nop
"fm.exe"+23A3A120: 0F BE 1F - movsx ebx,byte ptr [rdi]
"fm.exe"+23A3A123: 41 88 1C 24 - mov [r12],bl
"fm.exe"+23A3A127: 48 85 F6 - test rsi,rsi
"fm.exe"+23A3A12A: 74 74 - je fm.exe+23A3A1A0
"fm.exe"+23A3A12C: 4C 8B 56 18 - mov r10,[rsi+18]
"fm.exe"+23A3A130: 4D 85 D2 - test r10,r10
"fm.exe"+23A3A133: 74 6B - je fm.exe+23A3A1A0
"fm.exe"+23A3A135: 4D 8B 02 - mov r8,[r10]
"fm.exe"+23A3A138: 45 31 F6 - xor r14d,r14d
}
12106
"[X] <----- Prevent Club Staff Attribute Decreases"
C000C0
Auto Assembler Script
{ Game : fm.exe
Version: v1
Date : 2019-11-15
Author : figment
This script prevents staff attributes from decreasing if member of same
club as the manager.
There are some additional checks before min/max that I dont understand below
but those rarely make changes afterwords.
R10-10 - Holds Staff Pointer address
R10 - Holds block of values to change
R9 - Holds already recalculated values that have changed
Strategy is to first verify Staff is member of club, if yes then
just alter the new values to match existing values when new value is lower.
}
define(lblUpdateStaffAttrs,fm.exe+53E09E0)
define(datUpdateStaffAttrs,BF 64 00 00 00 45 32 C0 44 8D 6F B0 0F 1F 40 00)
[ENABLE]
assert(lblUpdateStaffAttrs,datUpdateStaffAttrs)
alloc(injUpdateStaffAttrs,$1000,lblUpdateStaffAttrs)
//label(code)
label(retUpdateStaffAttrs)
label(skipUpdateStaffAttrs)
label(loopUpdateStaffAttrs)
injUpdateStaffAttrs:
push rax
push rbx
push rcx
push rdx
// RBX = getPersonClub(getPersonFromStaff(r13))
mov rbx, r10
sub rbx, 10 // rbx now staff pointer
mov rcx, [rbx] // vtable (can be null or otherwise invalid if wrong structure)
mov rdx, vtbStaff
cmp rcx, rdx
jne leaveUpdateStaffAttrs // exit if not expected vtable
mov rax, [rbx+8] // vtable offsets
mov eax, [rax+8] // offset to person data area
add rbx, eax // rbx now person section
add rbx, 8
mov rcx, [rbx-28] // vtable addr
mov rdx, vtbStaffPerson
cmp rcx, rdx
jne leaveUpdateStaffAttrs // exit if not expected vtable
add rbx, A0 //C8-28
// rbx is Person Data pointer
// this is because of using data area instead of person ptr
//(agents and others use different offsets from Staffs)
// Club Pointer
mov rbx,[rbx]
cmp rbx, 0
je leaveUpdateStaffAttrs // exit if no club contract
mov rbx,[rbx+10]
cmp rbx, 0
je leaveUpdateStaffAttrs // exit if no team
mov rbx,[rbx+18]
cmp rbx, 0
je leaveUpdateStaffAttrs // exit if no club
// RCX = getPersonClub(getPersonFromStaff(getAddressSafe('[[[lblManagerRoot]+18]]')))
mov rax, [lblManagerRoot]
cmp rax, 0
je leaveUpdateStaffAttrs
mov rax, [rax+18]
cmp rax, 0
je leaveUpdateStaffAttrs
mov rax, [rax]
cmp rax, 0
je leaveUpdateStaffAttrs
mov rcx, [rax] // vtable
mov rdx, vtbManagerPlayer
cmp rcx, rdx
jne leaveUpdateStaffAttrs // exit if not expected vtable
mov rcx, rax // store manager person pointer in ecx
mov rax, [rax+8] // vtable offsets
mov eax, [rax+8] // offset to person data area
add rcx, eax
add rcx, A8 //C8+8-28
// rbx is Staff Data pointer
// this is because of using data area instead of person ptr
//(agents and others use different offsets from Staffs)
// Club Pointer
mov rcx,[rcx]
cmp rcx, 0
je leaveUpdateStaffAttrs // exit if no club contract ???
mov rcx,[rcx+10]
cmp rcx, 0
je leaveUpdateStaffAttrs // exit if no team
mov rcx,[rcx+18]
cmp rcx, 0
je leaveUpdateStaffAttrs // exit if no club
cmp rbx, rcx
jne leaveUpdateStaffAttrs // verify Staff is member of same club as manager
// begin attr loop update
push r10 // current parameters array (byte[])
push r9 // new parameters array (short[])
mov ecx, 33 // hard coded length of list
loopUpdateStaffAttrs:
movsx eax, byte ptr [r10]
movsx ebx, byte ptr [r9]
cmp bl,al
jge skipUpdateStaffAttrs
mov [r9], al // overwrite value
skipUpdateStaffAttrs:
inc r10
add r9, 2
loop loopUpdateStaffAttrs
pop r9
pop r10
leaveUpdateStaffAttrs:
pop rdx
pop rcx
pop rbx
pop rax
// mov edi,00000064 // original code
mov edi,0000007D // max 125
jmp retUpdateStaffAttrs
lblUpdateStaffAttrs:
jmp injUpdateStaffAttrs
retUpdateStaffAttrs:
[DISABLE]
lblUpdateStaffAttrs:
db datUpdateStaffAttrs
// mov ebp,00000064
dealloc(injUpdateStaffAttrs)
1658
"Tools ->"
0080FF
1
1660
"[X] <----- Skin Toner"
000000
Auto Assembler Script
[ENABLE]
LuaCall(fm2020_ST.show())
[DISABLE]
LuaCall(fm2020_ST.close())
1659
"[X] <----- Date Converter"
000000
Auto Assembler Script
[ENABLE]
LuaCall(fm2020_DC.show())
[DISABLE]
LuaCall(fm2020_DC.close())
1930
"Table Settings ->"
808080
Auto Assembler Script
[ENABLE]
LuaCall(messageDialog(strInfo.msg3,0, mbok))
[DISABLE]
12376
"_GlobalScripts"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
--------------------------------------------------------------------------------
-- LUA SCRIPT FOR FOOTBALL MANAGER 2020 CHEAT TABLE VERSION 1.0
-- UPDATED BY FIGMENT (TheHologram) AROUND NOV 2019
-- ORIGINAL VERSION CREATED AT APRIL 28, 2019 BY TDG6661 for FM 2019
-- EDITING MAY CAUSE SOME FUNCTION NOT WORK PROPERLY
--------------------------------------------------------------------------------
-- Auto Attach
--getAutoAttachList().add('fm.exe')
--speak('Football Manager 2020 Cheat table activated!')
-- Arrays List
getDaysInMonthA = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
getDaysInMonthB = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
strMonths = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
strInfo = {
msg0 = "Created by tdg6661, more info see Read Me! also visit official thread on FearLess Revolution!",
msg1 = "Press OVERVIEW more times on game screen if table shows wrong values!",
msg2 = "DO NOT edit anything outside the match!",
msg3 = "ADVANCED USER ONLY!",
opt1 = "This option sets your Balance, Transfer Budget (Season) and Transfer Budget (Rem.) to £999,999,999 and freeze it.\n\nNOTE: You can also edit the value by yourself.",
opt2 = "This option sets your Weekly Wage Budget to £999,999,999 and Highest Wage Allowed to £2,000,000 this option also freeze the value.\n\nNOTE: You can also edit the value by yourself.",
opt3 = "This option will allow you to buy any player without losing your budget or increasing expenditure, BUT you still need budget equal to player's price for transfer confirmation.",
opt4 = "Only work for your team, activate one day before match. This option will make your team incredibly insane on the pitch, try to test on a match. One thing, you will see your player fitness stuck at 69%, don't worry about that it will not affect your players, this happen because the game only process value at 1 - 10000 on the graphical bar.\n\nNOTE: You can also edit the value by yourself."
}
-- Global Variables
-- variable to deactivate timers
if _G['_deactivateTimers'] == nil then
_deactivateTimers = true
end
-- Functions with hard coded addresses
-- returns primary player manager
function getManagerPtr()
return getAddressSafe('[[[lblManagerRoot]+18]]')
end
function getCurrentHour()
local addr = getAddressSafe('datTimeRoot')
if addr == nil then return nil end
local currentTime = readBytes(addr+1)
if currentTime == nil then return nil end
currentTime = bShr(currentTime, 1)
local currentHour = 0
local currentMin = 0
if currentTime ~= 0 then
currentHour = (bShr(currentTime-1,2) + 6) % 24 -- (divide by 4 + 6)
currentMin = ((currentTime-1) % 4) * 15
end
return string.format("%d:%02d", currentHour, currentMin)
end
function getCurrentDay()
local addr = getAddressSafe('datTimeRoot')
if addr == nil then return nil end
local currentDate = readSmallInteger(addr)
if currentDate ~= nil then
return bAnd(currentDate, 0x1FF)
end
return nil
end
function getCurrentYear()
local addr = getAddressSafe('datTimeRoot')
if addr == nil then return nil end
return readSmallInteger(addr+2)
end
-- General Functions
function getAttachedProcessFileName()
local m = enumModules();
if (#m > 0) then
return m[1].PathToFile;
end
return nil;
end
function math.sign(v)
return (v >= 0 and 1) or -1
end
function math.round(v, bracket)
bracket = bracket or 1
return math.floor(v/bracket + math.sign(v) * 0.5) * bracket
end
local function getLeapYear(x)
return x % 4 == 0 and (x % 100 ~= 0 or x % 400 == 0)
end
function getFMDate(x, y, w)
z=1
strFMDate = ""
if x == nil or y == nil then
return strFMDate
end
if getLeapYear(y)==true then
while x > getDaysInMonthA[z] do
x = x - getDaysInMonthB[z]
z=z+1
end
if x == 0 and z == 3 then
x = 29
z = 2
end
else
while x > getDaysInMonthA[z] do
x = x - getDaysInMonthA[z]
z=z+1
end
end
strFMDate = x.." "..strMonths[z].." "..y
if w ~= nil then
strFMDate = strFMDate.." "..w
end
return strFMDate
end
function formatFMDate(addr, skiptime)
local addr = getAddressSafe(addr)
if addr == nil then return '' end
local year = readSmallInteger(addr+2)
local day = bAnd(readSmallInteger(addr), 0x1FF)
local time = bShr(readBytes(addr+1), 1)
local hour = 0
local min = 0
if time ~= 0 then
hour = (bShr(time-1,2) + 6) % 24 -- (divide by 4 + 6)
min = ((time-1) % 4) * 15
end
if skiptime and time == 0 then
return getFMDate(day, year)
else
return getFMDate(day, year, string.format("%d:%02d", hour, min))
end
end
-- Compact View Mode
function cycleFullCompact(sender,force)
local state = not(compactmenuitem.Caption == 'Compact View Mode')
if force~=nil then state = not force end
compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'
getMainForm().Splitter1.Visible = state
getMainForm().Panel4.Visible = state
getMainForm().Panel5.Visible = state
end
function addCompactMenu()
if compactmenualreadyexists then return end
local parent = getMainForm().Menu.Items
compactmenuitem = createMenuItem(parent)
parent.add(compactmenuitem)
compactmenuitem.Caption = 'Compact View Mode'
compactmenuitem.OnClick = cycleFullCompact
compactmenualreadyexists = 'yes'
end
-- Data Loader
function getGameDate(state)
strGameDate = ""
if state == true then
if readInteger(process) ~= nil then
strGameDate = getFMDate(getCurrentDay(), getCurrentYear(), getCurrentHour())
else
strGameDate = "Game Is Not Loaded Yet"
end
end
return strGameDate
end
function getMessageCounts(state)
strMessageCounts = ""
if state == true then
local manager = getManagerPtr()
n = readSmallInteger(manager..'+DA')
if n ~= nil then
if n > 0 and n < 1000 then
strMessageCounts = " | "..n.." unread message(s)"
else
strMessageCounts = " | No unread message(s)"
end
end
end
return strMessageCounts
end
function getStuffName(state)
strStuffName = ""
if state == true then
local playerPtr = getManagerPtr()
local personPtr = getPersonFromPlayer(playerPtr)
local clubPtr = getPersonClub(personPtr)
if personPtr ~= nil then
local x = getPersonName(personPtr)
if x ~= nil then
strStuffName = strStuffName.." | Manager: "
if x ~= nil then
strStuffName = strStuffName..x
end
end
end
if clubPtr ~= nil then
strStuffName = strStuffName.." | Club: "
local x = getClubName(clubPtr)
if x ~= nil then
strStuffName = strStuffName..x
end
end
local selectedPtr = getAddressSafe('[basPerson]')
if selectedPtr ~= nil then
x = getPersonName(selectedPtr)
if x ~= nil then
strStuffName = strStuffName.." | Selected: "
if x ~= nil then
z = readInteger(hex(selectedPtr)..'+C')
strStuffName = strStuffName..x.." (ID: "..z..")"
end
end
end
end
return strStuffName
end
-- Table Configurations
function setTableCaption(state)
if state == true then
return setProperty(MainForm, "Caption", strGameDate..strStuffName)
else
return setProperty(MainForm, "Caption", "Cheat Engine "..getCEVersion())
end
end
--------------------------------------------------------------------------------
-- LUA SCRIPT FOR GUI TOOLS
-- EDITING MAY CAUSE SOME FUNCTION NOT WORK PROPERLY
--------------------------------------------------------------------------------
-- Date Converter GUI
function tdg6661_DC_Convert(sender)
x = tonumber(getProperty(fm2020_DC.DC_TextBox_1, "Text"))
y = tonumber(getProperty(fm2020_DC.DC_TextBox_2, "Text"))
z = getFMDate(x, y)
return setProperty(fm2020_DC.DC_TextBox_3, "Text", z)
end
-- Footer Text Links
function tdg6661_GN_Link1(sender)
shellExecute("https://fearlessrevolution.com/viewtopic.php?f=4&t=10802")
end
function tdg6661_GN_Link2(sender)
shellExecute("https://www.cheatengine.org/")
end
-- Helpers for Dynamic Node creation
function hex(a, c)
if a == nil then
return "(nil)"
end
local fmt = "%X"
if type(c) == "number" then
fmt = "%0"..c.."X"
end
return string.format(fmt, a)
end
function pointerSize()
if targetIs64Bit() then
return 8
end
return 4
end
function readSignedInteger(address)
local value = readInteger(address)
if value ~= nil and targetIs64Bit() and bShr(value,31) == 1 then
return bOr(0xFFFFFFFF00000000,value)
end
return value
end
function readSignedShortInteger(address)
local value = readSmallInteger(address)
if value ~= nil and bShr(value,15) == 1 then
if targetIs64Bit() then
return bOr(0xFFFFFFFFFFFF0000,value)
else
return bOr(0xFFFF0000,value)
end
end
return value
end
function readSignedByte(address)
local value = readBytes(address, 1)
if value ~= nil and bShr(value,7) == 1 then
if targetIs64Bit() then
return bOr(0xFFFFFFFFFFFFFF00,value)
else
return bOr(0xFFFFFF00,value)
end
end
return value
end
function getFlag(desc)
local result = false
if memrec ~= nil then
local rec = findRecord(memrec, desc)
if rec == nil then
rec = getAddressList().createMemoryRecord()
rec.Description = desc
rec.IsGroupHeader = true
rec.appendToEntry(memrec)
end
result = rec.Active
end
return result
end
function getCodeOffset(addr, off)
if addr == nil or addr == 0 then
return nil
end
local o = readSignedInteger(addr + off)
if o ~= nil then
return addr + o + off + 4
end
return nil
end
function followAddress(addr, offs, opts)
if type(opts) ~= "table" then
opts = {}
end
if type(opts["debug"]) ~= "boolean" then
opts["debug"] = false
end
local i
for i = 1,#offs do
if addr ~= nil then
local ot = type(offs[i])
if ot == "table" then
if type(offs[i]["offset"]) ~= "number" then
return nil
end
if offs[i]["rc"] == true then
addr = getCodeOffset(addr, offs[i]["offset"])
elseif offs[i]["r32"] == true then
addr = readInteger(addr + offs[i]["offset"])
else
addr = readPointer(addr + offs[i]["offset"])
end
elseif ot == "number" then
addr = readPointer(addr + offs[i])
else
return nil
end
if opts["debug"] then
print(" "..hex(addr))
end
end
end
if type(opts["endingoffset"]) == "number" then
addr = addr + opts["endingoffset"]
end
return addr
end
if timers == nil then
timers = {}
end
if aobscans == nil then
aobscans = {}
end
function getTimer()
if memrec ~= nil then
local id = memrec.id
if timers[id] == nil then
timers[id] = createTimer()
timers[id].Enabled = false
timers[id].Interval = getFreezeTimer().Interval
end
return timers[id]
end
return nil
end
function killTimer()
if memrec ~= nil then
local id = memrec.id
if timers[id] ~= nil then
timers[id]:Destroy()
timers[id] = nil
end
end
end
function setScan(name, opts)
if memrec == nil then
return false
end
if aobscans[memrec.id] ~= nil then
aobscans[memrec.id][name] = nil
end
if opts["bytes"] == nil then
return false
end
local perm = opts["perm"]
if perm == nil then
perm = "-C-W+X" -- Not CopyOnWrite, Not Writable, but executable by default
end
local startaddress = 0
local endaddress = 0x7FFFFFFFFFFFFFFF
if opts["module"] ~= nil then
startaddress = getAddress(opts["module"])
endaddress = startaddress + getModuleSize(opts["module"])
end
local bytes = opts["bytes"]
local ms = createMemScan()
local success = false
if aobscans[memrec.id] == nil then
aobscans[memrec.id] = {}
end
if ms ~= nil then
ms.firstScan(soExactValue, vtByteArray, 0, bytes, "", startaddress, endaddress, perm, fsmNotAligned, "1", true, false, false, false)
ms.waitTillDone()
local fl = createFoundList(ms)
if fl ~= nil then
fl.initialize()
if fl.Count > 0 then
aobscans[memrec.id][name] = {}
local i
for i=0,fl.Count-1 do
table.insert(aobscans[memrec.id][name], tonumber("0x"..fl.Address[i]))
end
end
fl:Destroy()
end
ms:Destroy()
if success then
return true
end
end
return false
end
function setScans(list, perm)
local k,v
for k,v in pairs(list) do
setScan(k, v, perm)
end
end
function getScan(name)
if memrec ~= nil then
local id = memrec.id
if aobscans[id] ~= nil then
if aobscans[id][name] ~= nil then
return aobscans[id][name]
end
end
end
return nil
end
function forEach(startaddress, toaddress, itemsize, func)
if startaddress < toaddress then
local addr = startaddress
local k = 1
while addr < toaddress do
local r = func(k, addr)
if r == false then
break
end
addr = addr + itemsize
k = k + 1
end
end
end
function bsearch(key, startaddress, count, itemsize, cmpfunc)
local itemlow = 0
local itemhigh = count-1
while itemlow <= itemhigh do
local pos = ((itemhigh-itemlow) // 2) + itemlow
local r = cmpfunc(key, startaddress + pos*itemsize)
if r == 0 then
return startaddress + pos*itemsize
elseif r < 0 then
itemhigh = pos - 1
else
itemlow = pos + 1
end
end
return nil
end
function tforEach(mytable, myfunc)
local keys = {}
local k,v
for k,v in pairs(mytable) do
table.insert(keys, k)
end
table.sort(keys)
for k,v in ipairs(keys) do
myfunc(v, mytable[v])
end
end
function readSignedInteger(address)
local value = readInteger(address)
if targetIs64Bit and bShr(value,31) == 1 then
return bOr(0xFFFFFFFF00000000,value)
end
return value
end
function createRecord(parent, desc, vartype, addr, offsets)
rec = getAddressList().createMemoryRecord()
rec.Description = desc
rec.VarType = vartype
if addr ~= nil then
rec.setAddress(addr, offsets)
end
rec.DontSave = true
if vartype == vtCustom then
rec.IsGroupHeader = true
rec.options = "[moHideChildren]"
end
rec.appendToEntry(parent)
return rec
end
function findRecord(parent, desc)
if parent == nil and memrec ~= nil then
parent = memrec
end
local found
if parent ~= nil and parent.Count > 0 then
local i
local cdesc
for i = 0, parent.Count-1 do
if string.match(parent.Child[i].Description, desc) ~= nil then
found = parent.Child[i]
break
end
end
end
return found
end
function getHeader(parent, desc)
if parent == nil and memrec ~= nil then
parent = memrec
end
local rec = findRecord(parent,desc)
if rec == nil then
rec = getAddressList().createMemoryRecord()
rec.Description = desc
rec.IsGroupHeader = true
if parent ~= nil then
rec.appendToEntry(parent)
end
end
return rec
end
function getPersonName(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
if addr == nil or addr == 0 then return nil end
local person = hex(addr)
local commonName = readString(getAddressSafe('[['..person..'+68]+0]+4'))
if commonName ~= nil then return commonName end
local personName = readString(getAddressSafe('['..person..'+48]+4'))
if personName ~= nil then return personName end
local firstName = readString(getAddressSafe('[['..person..'+58]+0]+4'))
local lastName = readString(getAddressSafe('[['..person..'+60]+0]+4'))
if firstName ~= nil and lastName ~= nil then
return firstName .. " " .. lastName
elseif firstName ~= nil then
return firstName
else
return nil
end
end
function getPersonFromPlayer(addr)
if addr == nil or addr == 0 then return nil end
local playerPtr = getAddressSafe(addr)
if playerPtr == nil or playerPtr == 0 then return nil end
local personOffset = readSignedInteger(getAddressSafe("["..hex(playerPtr).."+8]+4"))
--print('Player Indirect:',hex(playerPtr), hex(personOffset))
if personOffset == nil then return nil end
personOffset = personOffset + 8 -- require offset due to position of vtable offsets
if personOffset == 0x1C8 or personOffset == 0x2A0 or
personOffset == 0x0E0 or personOffset == 0x480 then
return playerPtr + personOffset
end
return nil
end
function getPlayerFromPerson(addr)
if addr == nil or addr == 0 then return nil end
local personPtr = getAddressSafe(addr)
if personPtr == nil or personPtr == 0 then return nil end
local vtablePtr = readQword(personPtr) - 8
if vtablePtr == nil or vtablePtr == 0 then return nil end
local offset = readInteger('['..hex(vtablePtr)..']+4')
if offset == 0x1C8 or offset == 0x2A0 or
offset == 0x0E0 or offset == 0x480 then
return personPtr-offset
end
return nil
end
function getPlayerName(addr)
if addr == nil or addr == 0 then return nil end
return getPersonName(getPersonFromPlayer(addr))
end
function getPersonClub(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
return readQword(getAddressSafe("[["..hex(addr).."+C8]+10]+18"))
end
function getPersonNation(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
if addr == nil then return nil end
return readQword(addr+0x78)
end
function setPersonNation(addr, nation)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
if addr == nil then return nil end
return writeQword(addr+0x78, nation)
end
function getClubNation(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
if addr == nil then return nil end
return readQword(addr+0xD0)
end
function getCompetitionName(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
return readString(getAddressSafe('['..hex(addr)..'+58]+4'))
end
function getNationName(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
return readString(getAddressSafe('['..hex(addr)..'+b8]+4'))
end
function getClubName(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
return readString(getAddressSafe('['..hex(addr)..'+b8]+4'))
end
function getTeamName(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
local x = readString(getAddressSafe('[['..hex(addr)..'+18]+b8]+4'))
if x ~= nil then
local name = getTeamDesc(addr)
if name ~= nil then
x = x..':'..name
end
end
return x
end
function getTeamDesc(addr)
if addr == nil or addr == 0 then return nil end
addr = getAddressSafe(addr)
if addr ~= nil then
local val = readBytes(addr+0x30, 1)
return typeOptionMaps['clubType'][val]
end
return nil
end
function enableAutoDisable(memrec, callback)
local _currec = memrec
local t = createTimer()
t.Interval = 100
t.onTimer = function()
_currec.Active = false
if callback ~= nil then
callback(_currec)
end
if t ~= nil then
t.Enabled = false
t.destroy()
end
t = nil
end
t.Enabled = true
end
function disableArrayRecord(memrec, desc)
if memrec ~= nil then
if desc == nil then
memrec.Description = "Records (??) ->"
else
memrec.Description = desc
end
local i
for i=memrec.Count-1,0,-1 do
memrec.Child[i]:Destroy()
end
end
end
function enableNationTeamRecords(memrec)
-- club and nation use same underlying structure
local nationAddr = readQword('basNation')
if nationAddr ~= nil then
enableClubTeamRecords(memrec, nationAddr, 'Nation')
else
disableArrayRecord(memrec, 'Squads -->')
end
end
function enableClubTeamRecords(memrec, addr, type)
if memrec ~= nil then
local clubAddr = addr
if type == nil then type = 'Club' end
if clubAddr == nil or clubAddr == 0 then
clubAddr = memrec.getCurrentAddress()
end
if clubAddr == nil or clubAddr == 0 then
clubAddr = readQword('bas'..type)
end
if clubAddr == nil or clubAddr == 0 then
disableArrayRecord(memrec, 'Squads -->')
return
end
local teamsStart = readQword(clubAddr+0x18)
local teamsEnd = readQword(clubAddr+0x20)
local elements = memrec
if elements ~= nil then
local n = (teamsEnd-teamsStart)/0x8
elements.Description = string.format("Squads (%2d)->", n)
local elem
local count = 0
forEach(teamsStart, teamsEnd, 0x8, function(k, elemAddr)
local rec = elements.Child[count]
local addr = readQword(elemAddr) -- indirect through pointer
local val = readBytes(addr+0x30, 1)
local name = typeOptionMaps["clubType"][val]
if name == nil then
name = string.format("%d", val)
end
local desc = string.format("%2d: %s ->", k, name)
if rec == nil then
rec = createRecord(elements, desc, vtCustom, nil, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xFF0000
rec.DontSave = true
elem = createRecord(rec, 'Type', vtByte, addr+0x30, nil )
elem.DisplayAsDropDownListItem = true
elem.DropDownList.Text = typeOptionStringMaps["clubType"]
elem = createRecord(rec, 'Reputation', vtWord, addr+0xA8, nil )
elem.ShowAsSigned = true
elem = createRecord(rec, 'Squad (??) ->', vtCustom, addr, nil )
elem.options = "[moHideChildren,moDeactivateChildrenAsWell]"
elem.Color = 0xFF0000
elem.OnActivate = function(record, before, currentstate)
enableSquadTeamRecords(record)
return true
end
elem.OnDeactivate = function(record, before, currentstate)
disableArrayRecord(record, 'Squad (??) ->')
return true
end
else
rec.Description = desc
findRecord(rec, '^Squad').setAddress(addr)
findRecord(rec, '^Type').setAddress(addr+0x30)
findRecord(rec, '^Reputation').setAddress(addr+0xA8)
end
count = count + 1
end)
-- purge unnecessary
local i
for i=(elements.Count-1),count,-1 do
elements.Child[i]:Destroy()
end
end
end
end
function updateClubTeamRecords(memrec)
if memrec ~= nil then
local elements = findRecord(memrec.Parent, '^Records [(]')
if elements ~= nil then
if elements.Active then
enableClubTeamRecords(elements)
else
elements.Active = true
end
end
end
end
function enableSquadTeamRecords(memrec)
if memrec ~= nil then
-- store address in adjacent record
local teamAddr = memrec.getCurrentAddress()
if teamAddr == nil or teamAddr == 0 then
local addrRecord = findRecord(memrec.Parent, '^Address')
teamAddr = readQword(addrRecord.getCurrentAddress())
end
if teamAddr == nil or teamAddr == 0 then
disableArrayRecord(memrec, "Squad (??) ->")
return
end
local teamsStart = readQword(teamAddr+0x38)
local teamsEnd = readQword(teamAddr+0x40)
local elements = memrec
if elements ~= nil then
local n = (teamsEnd-teamsStart)/0x8
elements.Description = string.format("Squad (%-2d) ->", n)
local added = 0
local elem
forEach(teamsStart, teamsEnd, 0x8, function(k, elemAddr)
local rec = elements.Child[added]
local addr = readQword(elemAddr) -- indirect through pointer
if addr == 0 then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(addr)
if person == nil then return end
local name = getPersonName(person)
if name == nil then return end
local desc = string.format("%-2d: %s", k, name)
if rec == nil then
-- create single record
rec = createRecord(elements, desc, vtCustom, addr, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xc000c0
rec.DontSave = true
rec.OnActivate = function(record, before, currentstate)
setPlayerFocus(record.getCurrentAddress())
return false
end
else
rec.setAddress(addr)
rec.Description = desc
end
added = added + 1
end)
-- purge unnecessary
local i
for i=(elements.Count-1),added,-1 do
elements.Child[i]:Destroy()
end
end
end
end
function updateSquadTeamRecords(memrec)
if memrec ~= nil then
local elements = findRecord(memrec.Parent, '^Squad [(]')
if elements ~= nil then
if elements.Active then
enableSquadTeamRecords(elements)
else
elements.Active = true
end
end
end
end
function enablePersonArray(memrec, title, startAddr, endAddr )
if memrec ~= nil then
-- store address in adjacent record
local teamsStart = readQword(getAddressSafe(startAddr))
if teamsStart == nil then return end
local teamsEnd = readQword(getAddressSafe(endAddr))
if teamsEnd == nil then return end
local elements = memrec
if elements ~= nil then
local n = (teamsEnd-teamsStart)/0x8
elements.Description = string.format("%s (%2d) ->", title, n)
local added = 0
local elem
forEach(teamsStart, teamsEnd, 0x8, function(k, elemAddr)
local rec = elements.Child[added]
local addr = readQword(elemAddr) -- indirect through pointer
if addr == 0 then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(addr)
if person == nil then return end
local name = getPersonName(person)
if name == nil then return end
local desc = string.format("%-2d: %s", k, name)
if rec == nil then
-- create single record
rec = createRecord(elements, desc, vtCustom, addr, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xc000c0
rec.DontSave = true
rec.OnActivate = function(record, before, currentstate)
setPlayerFocus(record.getCurrentAddress())
return false
end
else
rec.setAddress(addr)
rec.Description = desc
end
added = added + 1
end)
-- purge unnecessary
local i
for i=(elements.Count-1),added,-1 do
elements.Child[i]:Destroy()
end
end
end
end
function updatePersonArray(memrec, title, startAddr, endAddr)
if memrec ~= nil then
local elements = findRecord(memrec.Parent, '^'..title)
if elements ~= nil then
if elements.Active then
enableSquadTeamRecords(elements, title, startAddr, endAddr)
else
elements.Active = true
end
end
end
end
function enableContractClauseRecords(memrec, clausesStart, clausesEnd)
local elements = memrec
if clausesStart == nil or clausesEnd == nil then
return
end
if elements ~= nil then
local n = (clausesEnd-clausesStart)/0x8
elements.Description = string.format("Clauses & Bonuses (%2d) ->", n)
local count = 0
local elem
forEach(clausesStart, clausesEnd, 0x8, function(k, addr)
if k > 100 then return false end -- limit to 100 just in case
local rec = elements.Child[count]
local type = readSmallInteger(addr+0x6)
local value = readSignedInteger(addr)
local info = readSignedShortInteger(addr+0x4)
local typeName = typeOptionMaps['bonusType'][type]
-- local valueName = typeOptionMaps['bonusValue'][value]
local desc = string.format("%-2d: %s = v:%d i:%d", k, typeName, value, info)
if rec == nil then
rec = createRecord(elements, desc, vtCustom, nil, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xc000c0
rec.DontSave = true
elem = createRecord(rec, 'Type', vtWord, addr+0x6, nil )
elem.DisplayAsDropDownListItem = true
elem.DropDownList.Text = typeOptionStringMaps["bonusType"]
elem = createRecord(rec, 'Value', vtDword, addr, nil )
elem.DisplayAsDropDownListItem = true
elem.DropDownList.Text = typeOptionStringMaps["bonusValue"]
elem = createRecord(rec, 'Info', vtWord, addr+0x4, nil )
elem.ShowAsSigned = true
else
rec.Description = desc
findRecord(rec, '^Type').setAddress(addr+0x6)
findRecord(rec, '^Value').setAddress(addr)
findRecord(rec, '^Info').setAddress(addr+0x4)
end
count = count + 1
end)
-- purge unnecessary
local i
for i=(elements.Count-1),count,-1 do
elements.Child[i]:Destroy()
end
end
end
function enablePlayerClauseRecords(memrec)
if memrec ~= nil then
-- store address in adjacent record
local clauseAddr = memrec.getCurrentAddress()
if clauseAddr == nil or clauseAddr == 0 then
clauseAddr = readQword('basPerson')
end
if clauseAddr == nil or clauseAddr == 0 then
disableArrayRecord(memrec, "Clauses & Bonuses (??) ->")
return
end
local clausesStart = readQword('['..hex(clauseAddr)..'+C8]+60')
local clausesEnd = readQword('['..hex(clauseAddr)..'+C8]+68')
enableContractClauseRecords(memrec, clausesStart, clausesEnd)
end
end
function updatePlayerClauseRecords(memrec)
-- expected to be updated from Person Node
if memrec ~= nil then
local clubelem = findRecord(memrec, '^Club Contract')
if clubelem ~= nil and clubelem.Active then
local clauses = findRecord(clubelem, '^Clauses')
if clauses ~= nil and clauses.Active then
enablePlayerClauseRecords(clauses)
end
end
end
end
function enablePersonRelationships(memrec, purge)
if memrec ~= nil then
local i
local relationshipsStart = getAddressSafe('[[[basPerson]+88]+0]')
local relationshipsEnd = getAddressSafe('[[[basPerson]+88]+8]')
if purge then
for i=(memrec.Count-1),0,-1 do
memrec.Child[i]:Destroy()
end
end
local elements = memrec
if elements ~= nil then
local n = (relationshipsEnd-relationshipsStart)/0x10
local personName = getPersonName('[basPerson]')
if personName ~= nil then
elements.Description = string.format("Relationships (%2d) [%s] ->", n, personName)
else
elements.Description = string.format("Relationships (%2d)->", n)
end
elements.options = "[moHideChildren,moDeactivateChildrenAsWell]"
local k
local val
local name
local level
local id
local count=0
forEach(relationshipsStart, relationshipsEnd, 0x10, function(k, addr)
if k > 100 then return false end -- limit to 100 just in case
local rec = elements.Child[count]
local viewRec = nil
if rec == nil then
rec = createRecord(elements, string.format('%2d ->', k), vtCustom, nil, nil )
rec.options = "[moHideChildren,moDeactivateChildrenAsWell]"
rec.Color = 0xFF0000
local elem
elem = createRecord(rec, 'Relationship Type', vtByte, addr+0xB, nil )
elem.DisplayAsDropDownListItem = true
elem.DropDownList.Text = typeOptionStringMaps["relationships"]
elem = createRecord(rec, 'Record Type', vtByte, addr+0xA, nil )
elem.DisplayAsDropDownListItem = true
elem.DropDownList.Text = typeOptionStringMaps["relationRecord"]
elem = createRecord(rec, 'Reference Unique ID', vtQword, addr, nil )
elem.ShowAsHex = true
-- set focus
elem = createRecord(rec, '[X] <- Set Focus to ??', vtCustom, addr, nil )
elem.options = "[moHideChildren,moDeactivateChildrenAsWell]"
elem.Color = 0xc000c0
elem.DontSave = true
viewRec = elem
elem = createRecord(rec, 'Info', vtWord, addr+0x8, nil )
elem.ShowAsSigned = true
elem = createRecord(rec, 'Level', vtByte, addr+0xC, nil )
elem.ShowAsSigned = true
elem = createRecord(rec, 'Flag', vtByte, addr+0xD, nil )
elem.ShowAsSigned = true
else
rec.Description = desc
local setRecordAddr = function(rec, name, addr)
local elem = findRecord(rec, name)
if elem ~= nil then
elem.setAddress(addr)
end
return elem
end
setRecordAddr(rec, '^Relationship Type', addr+0xB)
setRecordAddr(rec, '^Record Type', addr+0xA)
setRecordAddr(rec, '^Reference Unique ID', addr)
viewRec = setRecordAddr(rec, '^... .. Set Focus to', addr)
setRecordAddr(rec, '^Info', addr+0x8)
setRecordAddr(rec, '^Level', addr+0xC)
setRecordAddr(rec, '^Flag', addr+0xD)
end
local id = readQword(addr)
local rtype = readBytes(addr+0xA, 1)
local level = readSignedByte(addr+0xC)
local val = readBytes(addr+0xB, 1)
local name = typeOptionMaps["relationships"][val]
if name == nil then
name = string.format("Unknown %3d", val)
end
local desc = nil
if rtype == 2 then
desc = getNationName(hex(id))
viewRec.OnActivate = function(record, before, currentstate)
setNationFocus(readQword(record.getCurrentAddress()))
return false
end
elseif rtype == 1 then
desc = getClubName(hex(id))
viewRec.OnActivate = function(record, before, currentstate)
setClubFocus(readQword(record.getCurrentAddress()))
return false
end
elseif rtype == 3 then
desc = getPersonName(hex(id))
viewRec.OnActivate = function(record, before, currentstate)
setPersonFocus(readQword(record.getCurrentAddress()))
return false
end
elseif rtype == 4 then
desc = getTeamName(hex(id))
viewRec.OnActivate = function(record, before, currentstate)
setTeamFocus(readQword(record.getCurrentAddress()))
return false
end
end
if desc == nil then desc = hex(id) end
rec.Description = string.format("%2d: %-24s (%-20s | Level: %3d) ->", k, name, desc, level)
viewRec.Description = "[X] <- Set Focus to " .. desc
count = count + 1
end)
-- purge unnecessary
for i=(elements.Count-1),count,-1 do
elements.Child[i]:Destroy()
end
end
end
end
function updatePersonRelationships(memrec)
-- expected to be updated from Person Node
if memrec ~= nil then
local level0 = findRecord(memrec, '^Person Data')
if level0 ~= nil and level0.Active then
local level1 = findRecord(level0, '^Relationships')
if level1 ~= nil and level1.Active then
enablePersonRelationships(level1)
end
end
end
end
function getPersonClubTeam(personPtr)
local addr = getAddressSafe(personPtr)
if addr == nil then return nil end
local clubContractPtr = readQword(addr+0xC8)
if clubContractPtr == nil then return nil end
return readQword(clubContractPtr+0x10)
end
function getClubFromTeam(teamPtr)
local addr = getAddressSafe(teamPtr)
if addr == nil then return nil end
return readQword(addr+0x18)
end
function getCompetitionFromTeam(teamPtr)
local addr = getAddressSafe(teamPtr)
if addr == nil then return nil end
return readQword(addr+0x50)
end
function getPersonClub(personPtr)
local addr = getAddressSafe(personPtr)
if addr == nil then return nil end
local clubContractPtr = readQword(addr+0xC8)
if clubContractPtr == nil then return nil end
return getClubFromTeam(readQword(clubContractPtr+0x10))
end
function getPersonNationContract(personPtr)
local addr = getAddressSafe(personPtr)
if addr == nil then return nil end
local nationContractPtr = readQword(addr+0xD0)
if nationContractPtr == nil then return nil end
local clubContractPtr = readQword(nationContractPtr+0x10)
if clubContractPtr == nil then return nil end
return getClubFromTeam(readQword(clubContractPtr+0x10))
end
function forEachTeamInClub(clubPtr, func)
local clubAddr = getAddressSafe(clubPtr)
if clubAddr == nil then return end
local teamsStart = readQword(clubAddr+0x18)
if teamsStart == nil then return end
local teamsEnd = readQword(clubAddr+0x20)
if teamsEnd == nil then return end
forEach(teamsStart, teamsEnd, 0x8, func)
end
function forEachPlayerInTeam(teamPtr, func)
local teamAddr = getAddressSafe(teamPtr)
if teamAddr == nil then return end
local startAddr = readQword(teamAddr+0x38)
if startAddr == nil then return end
local endAddr = readQword(teamAddr+0x40)
if endAddr == nil then return end
forEach(startAddr, endAddr, 0x8, func)
end
function forEachPlayerInClub(clubPtr, func)
local count = 0
forEachTeamInClub(clubPtr, function(k, addr)
local resolveAddr = readQword(addr)
if resolveAddr == nil then return end
forEachPlayerInTeam(resolveAddr, function(k, addr)
if k > 100 then return false end -- limit to 100 just in case
local resolveAddr = readQword(addr)
if resolveAddr == nil then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(resolveAddr)
if person == nil then return end
func(count, resolveAddr)
count = count + 1
end)
end)
end
function forEachCoachInClub(clubPtr, func)
local clubAddr = getAddressSafe(clubPtr)
if clubAddr == nil then return end
local startAddr = readQword(clubAddr+0x78)
if startAddr == nil then return end
local endAddr = readQword(clubAddr+0x80)
if endAddr == nil then return end
local count = 0
forEach(startAddr, endAddr, 0x8, function(k, addr)
if k > 100 then return false end -- limit to 100 just in case
local resolveAddr = readQword(addr)
if resolveAddr == nil then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(resolveAddr)
if person == nil then return end
func(count, resolveAddr)
count = count + 1
end)
end
function forEachMedicalInClub(clubPtr, func)
local clubAddr = getAddressSafe(clubPtr)
if clubAddr == nil then return end
local startAddr = readQword(clubAddr+0x60)
if startAddr == nil then return end
local endAddr = readQword(clubAddr+0x68)
if endAddr == nil then return end
local count = 0
forEach(startAddr, endAddr, 0x8, function(k, addr)
if k > 100 then return false end -- limit to 100 just in case
local resolveAddr = readQword(addr)
if resolveAddr == nil then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(resolveAddr)
if person == nil then return end
func(count, resolveAddr)
count = count + 1
end)
end
function forEachRecruiterInClub(clubPtr, func)
local clubAddr = getAddressSafe(clubPtr)
if clubAddr == nil then return end
local startAddr = readQword(clubAddr+0x90)
if startAddr == nil then return end
local endAddr = readQword(clubAddr+0x98)
if endAddr == nil then return end
local count = 0
forEach(startAddr, endAddr, 0x8, function(k, addr)
if k > 100 then return false end -- limit to 100 just in case
local resolveAddr = readQword(addr)
if resolveAddr == nil then return end
-- this will validate player pointer somewhat
local person = getPersonFromPlayer(resolveAddr)
if person == nil then return end
func(count, resolveAddr)
count = count + 1
end)
end
function forEachStaffInClub(clubPtr, func)
forEachCoachInClub(clubPtr, func)
forEachMedicalInClub(clubPtr, func)
forEachRecruiterInClub(clubPtr, func)
end
function forEachRelationInPerson(personPtr, func)
local addr = getAddressSafe(personPtr)
if addr == nil then return end
addr = readQword(addr+0x88)
if addr == nil then return end
local startAddr = readQword(addr+0x0)
if startAddr == nil then return end
local endAddr = readQword(addr+0x8)
if endAddr == nil then return end
forEach(startAddr, endAddr, 0x10, func)
end
-- set pointers related to current manager
function updateManagerPointers()
if readInteger(process) == nil then return end
local personOffset = nil
local nonPlayer = getManagerPtr()
if nonPlayer ~= nil then
writeQword('basPlayer', 0)
writeQword('basNonPlayer', nonPlayer)
writeQword('basManager', nonPlayer)
personOffset = readSignedInteger(getAddressSafe("["..hex(nonPlayer).."+8]+4"))
end
if nonPlayer == nil or personOffset == nil then
writeQword('basPlayer', 0)
writeQword('basNonPlayer', 0)
writeQword('basManager', 0)
writeQword('basPerson', 0)
writeInteger('updPerson', 1)
writeQword('basTeam', 0)
writeInteger('updTeam', 1)
writeQword('basClub', 0)
writeInteger('updClub', 1)
writeQword('basNation', 0)
writeInteger('updNation', 1)
writeQword('basComp', 0)
writeInteger('updComp', 1)
else
local personPtr = nonPlayer + 8 + personOffset
writeQword('basPerson', personPtr)
writeInteger('updPerson', 1)
local hexPerson = hex(personPtr)
local clubContractPtr = readQword(getAddressSafe("["..hexPerson.."+C8]"))
local teamPtr = readQword(getAddressSafe("["..hexPerson.."+C8]+10"))
writeQword('basTeam', teamPtr)
writeInteger('updTeam', 1)
local clubPtr = readQword(getAddressSafe("[["..hexPerson.."+C8]+10]+18"))
writeQword('basClub', clubPtr)
writeInteger('updClub', 1)
local nationContractPtr = readQword(getAddressSafe("["..hexPerson.."+D0]"))
local nationClubPtr = readQword(getAddressSafe("[[["..hexPerson.."+D0]+10]+10]+18"))
writeQword('basNation', nationClubPtr)
writeInteger('updNation', 1)
local compPtr = getCompetitionFromTeam(teamPtr)
writeQword('basComp', compPtr)
writeInteger('updComp', 1)
end
end
function setNationFocus(addr)
writeQword('basNation', addr)
writeInteger('updNation', 1)
end
function setCompFocus(addr)
writeQword('basComp', addr)
writeInteger('updComp', 1)
end
function setClubFocus(addr)
writeQword('basClub', addr)
writeInteger('updClub', 1)
local k
local team
forEachTeamInClub(addr, function(k, team)
writeQword('basTeam', team)
writeInteger('updTeam', 1)
return false
end)
end
function setTeamFocus(addr)
writeQword('basTeam', addr)
writeInteger('updTeam', 1)
writeQword('basClub', getClubFromTeam(addr))
writeInteger('updClub', 1)
end
function setPlayerFocus(addr)
--print(string.format('Player: %s', hex(getAddressSafe(addr))))
return setPersonFocus(getPersonFromPlayer(addr))
end
function setPersonFocus(addr)
local person = getAddressSafe(addr)
--print('Person: ', hex(person), getPersonName(person) )
if person == nil then return nil end
local personOffset = readSignedInteger("[["..hex(person).."]-8]+4")
--print(string.format('Person Offset: %s', hex(personOffset)))
if personOffset == nil then
--print('personOffset is nil')
return false
elseif personOffset == 0x1C8 then -- normal player data size
writeQword('basPerson', person)
writeQword('basPlayer', person-personOffset)
writeQword('basNonPlayer', 0)
writeQword('basManager', 0)
writeInteger('updPerson', 1)
return true
elseif personOffset == 0x2A0 then -- normal player/coach data size
writeQword('basPerson', person)
writeQword('basPlayer', person-personOffset)
writeQword('basNonPlayer', person-personOffset+0x1C8-8)
writeQword('basManager', 0)
writeInteger('updPerson', 1)
return true
elseif personOffset == 0x0E0 then -- normal staff data size
writeQword('basPerson', person)
writeQword('basPlayer', 0)
writeQword('basNonPlayer', person-personOffset)
writeQword('basManager', 0)
writeInteger('updPerson', 1)
return true
elseif personOffset == 0x480 then -- normal manager data size
writeQword('basPerson', person)
writeQword('basPlayer', 0)
writeQword('basNonPlayer', person-personOffset)
writeQword('basManager', person-personOffset)
writeInteger('updPerson', 1)
return true
else
--print(hex(personOffset))
end
return false
end
function startDateTimer(memrec, symbolname)
local _saverec = memrec
local _savename = symbolname
local _first = true
if memrec == nil or symbolname == nil then return end
local t = createTimer()
t.Interval = 200
t.onTimer = function()
if _deactivateTimers then
if t ~= nil then
t.destroy()
t = nil
end
end
if _saverec == nil then return end
local addr = getAddressSafe(process)
if addr == nil or t == nil then
if t ~= nil then
t.destroy()
t = nil
end
_saverec.Active = false
return
end
addr = getAddressSafe(_savename)
if addr == nil then
if not _first then
_saverec.Active = false
t.destroy()
t = nil
end
else
local strDate = "Not Loaded"
if _saverec.Active then
local dayRec = findRecord(_saverec, '^Day.*')
if dayRec ~= nil then
strDate = formatFMDate(dayRec.getCurrentAddress(), true)
end
local addr = getAddressSafe(_savename)
if addr ~= nil then
writeString(addr, strDate)
writeBytes(addr+string.len(strDate), 0) -- null terminate
end
else
if t ~= nil then
t.destroy()
t = nil
end
end
end
if _first then t.Interval = 2000 end
_first = false
end
return t
end
-- END OF SCRIPT
-- START OF CUSTOM TYPE STRINGS
local relationRecordTypes = {
[0] = "Status",
[1] = "Club",
[2] = "Nation",
[3] = "Person",
[4] = "Team",
[5] = "Stadium",
}
local relationRecordTypesString = ""
tforEach(relationRecordTypes, function(k,v)
relationRecordTypesString = relationRecordTypesString .. k .. ":" .. v .. "\r\n"
end)
local relationshipTypes = {
[ 0] = "None",
[ 1] = "Favourite Person",
[ 2] = "Disliked Person",
[ 3] = "Favourite Club",
[ 4] = "Disliked Club",
[ 5] = "Rival Club",
[ 6] = "Rival Nation",
[ 7] = "Relative Born in Nation",
[ 8] = "Born in Nation",
[ 9] = "Has Nationality",
[ 10] = "International Retirement",
[ 11] = "Player in Temporary Team",
[ 12] = "Manager in Temporary Team",
[ 13] = "Superdraft Allocation",
[ 14] = "Famous Old Star",
[ 15] = "Pundit for Nation",
[ 16] = "Disliked Teammate",
[ 17] = "Disliked Assistant Manager",
[ 18] = "Disliked Manager",
[ 19] = "Sold Star Player",
[ 20] = "Sold Youngster",
[ 21] = "Waiver Draft Allocation",
[ 22] = "Rival Person",
[ 23] = "Reserve Stadium",
[ 24] = "Unknown 24",
[ 25] = "Registered for Squad",
[ 26] = "Newly Selected In Squad",
[ 27] = "Newly Unselected from Squad",
[ 28] = "Selected for Other Team / Ineligible",
[ 29] = "Club Has Squad Selection",
[ 30] = "Player Form (Media)",
[ 31] = "Big Name Purchase (Media)",
[ 32] = "Player Unhappy at Sale of Player (Media)",
[ 33] = "Long Serving Player Leaves (Media)",
[ 34] = "Transfer Rumour (Media)",
[ 35] = "Player Requests Leave (Media)",
[ 36] = "Wait (Media)",
[ 37] = "Player Contract (Media)",
[ 38] = "Poll (Media)",
[ 39] = "Player Morale (Media)",
[ 40] = "Remove Player Morale (Media)",
[ 41] = "Transfer Speculation (Media)",
[ 42] = "RPS (Media)",
[ 43] = "Agent Approach (Media)",
[ 44] = "Player Conflict (Media)",
[ 50] = "Job Application",
[ 60] = "Sell Player End of Season",
[ 61] = "Getting Improved Contract if Play Well",
[ 62] = "Improved Contract at the End of the Season",
[ 63] = "Will Get Opportunities at the End of the Season",
[ 64] = "Not Selling Player",
[ 65] = "Not Getting Improved Contract",
[ 66] = "Will be Selected when Chosen",
[ 70] = "Trained in Nation",
[ 71] = "Training Happiness",
[ 72] = "Trained at Club",
[ 80] = "45 Minutes Only (IFI)",
[ 81] = "Withdrawn (IFI)",
[ 82] = "Unhappy at being withdrawn (IFI)",
[ 85] = "PRAT Player",
[ 86] = "Recent Media",
[ 87] = "Transfer Rumour",
[ 88] = "Serious Injury",
[ 90] = "Unbeaten Run (TFN)",
[ 91] = "Straight Wins (TFN)",
[ 92] = "Games without Win",
[ 93] = "Straight Defeats",
[ 95] = "Injury Crisis at Club",
[ 96] = "Player Praise",
[106] = "Games Played",
[117] = "Games Played",
}
local relationshipTypesString = ""
tforEach(relationshipTypes, function(k,v)
relationshipTypesString = relationshipTypesString .. k .. ":" .. v .. "\r\n"
end)
local clubTypes = {
[ 0] = "First Team",
[ 1] = "Reserves",
[ 2] = "A",
[ 3] = "B",
[ 4] = "Superdraft A",
[ 5] = "Superdraft B",
[ 6] = "Superdraft C",
[ 7] = "Superdraft D",
[ 8] = "Waivers",
[ 9] = "U23",
[10] = "U21",
[11] = "U19",
[12] = "U18",
[13] = "C",
[14] = "Amateur",
[15] = "II",
[16] = "Team 2",
[17] = "Team 3",
[18] = "U20",
[22] = "Youth Evaluation",
[30] = "Dutch Reserves",
}
local clubTypesString = ""
tforEach(clubTypes, function(k,v)
clubTypesString = clubTypesString .. k .. ":" .. v .. "\r\n"
end)
local bonusTypes = {
[ 0] = "Minimum Fee Release / None",
[ 1] = "Relegation Release",
[ 2] = "Non Promotion Release",
[ 3] = "Yearly Wage Rise (%)",
[ 4] = "Promotion Wage Rise",
[ 5] = "Relegation Wage Drop",
[ 6] = "Non-Playing Job Offer Release",
[ 7] = "Sell On Fee (%)",
[ 8] = "Sell On Fee (%)",
[ 9] = "Sell On Fee Profit (%)",
[10] = "Seasonal Landmark Goal Bonus",
[11] = "One-Year Extension After League Games (Final Season)",
[12] = "Match Highest Earner",
[13] = "Wage After Reaching Club League Games",
[14] = "Top Division Promotion Wage Rise",
[15] = "Top Division Relegation Wage Drop",
[16] = "Minimum Fee Release Clause (Foreign Clubs)",
[17] = "Minimum Fee Release Clause (Domestic Clubs in Higher Division)",
[18] = "Minimum Fee Release Clause (Domestic Clubs)",
[19] = "Wage After Reaching International Appearances",
[22] = "Optional Contract Extension By Club",
[25] = "One-Year Extension After League Games (Promoted Final Season)",
[26] = "One-Year Extension After League Games (Avoid Relegation Final Season)",
[27] = "Minimum Fee Release Clause (Clubs in a Major Continental Competition)",
[29] = "Contract Extension After Promotion",
[30] = "Injury Release Clause",
[31] = "Minimum Fee Release Clause (Clubs in a Continental Competition)",
[32] = "Appearance Fee",
[33] = "Goal Bonus",
[34] = "Clean Sheet Bonus",
[35] = "Team of the Year Bonus (Division)",
[36] = "Top Goalscorer Bonus (Division)",
[37] = "International Cap Bonus",
[38] = "Unused Substitute Fee",
[54] = "Will Leave At End Of Contract",
[55] = "Active Relegation Release Clause",
[56] = "Active Non Promotion Release Clause",
[57] = "Committee Assigned Minimum Fee Release Clause",
}
local bonusTypesString = ""
tforEach(bonusTypes, function(k,v)
bonusTypesString = bonusTypesString .. k .. ":" .. v .. "\r\n"
end)
local bonusValues = {
[-1] = "Not Available",
[ 0] = "None",
}
local bonusValuesString = ""
tforEach(bonusValues, function(k,v)
bonusValuesString = bonusValuesString .. k .. ":" .. v .. "\r\n"
end)
-- acutally assign
typeOptionMaps = {
["relationRecord"] = relationRecordTypes,
["relationships"] = relationshipTypes,
["clubType"] = clubTypes,
["bonusType"] = bonusTypes,
["bonusValue"] = bonusValues,
}
typeOptionStringMaps = {
["relationRecord"] = relationRecordTypesString,
["relationships"] = relationshipTypesString,
["clubType"] = clubTypesString,
["bonusType"] = bonusTypesString,
["bonusValue"] = bonusValuesString,
}
-- END OF CUSTOM TYPE STRINGS
-- START OF CUSTOM TYPES
if _G['_globalsRegistered'] == nil then
registerCustomTypeAutoAssembler([[
alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)
TypeName:
db 'Mask 0x3FFF',0
ByteSize:
dd 4
ConvertRoutine:
[32-bit]
push ebp
mov ebp,esp
push ecx
mov ecx,[ebp+8]
[/32-bit]
mov eax,[ecx]
and eax, 0x3FFF
[64-bit]
ret
[/64-bit]
[32-bit]
pop ecx
pop ebp
ret 4
[/32-bit]
ConvertBackRoutine:
[32-bit]
push ebp
mov ebp,esp
push edx
push ecx
mov edx,[ebp+0c]
mov ecx,[ebp+08]
[/32-bit]
push eax
push ecx
mov eax,ecx
and eax,0x3FFF
mov ecx,[edx]
and ecx,0xFFFFC000
or eax,ecx
pop ecx
mov [edx],eax
pop eax
[64-bit]
//everything is back to what it was, so exit
ret
[/64-bit]
[32-bit]
pop ecx
pop edx
pop ebp
ret 8
[/32-bit]
]])
registerCustomTypeAutoAssembler([[
alloc(TypeName,256)
alloc(ByteSize,4)
alloc(ConvertRoutine,1024)
alloc(ConvertBackRoutine,1024)
TypeName:
db 'Mask 0x1FF',0
ByteSize:
dd 4
ConvertRoutine:
[32-bit]
push ebp
mov ebp,esp
push ecx
mov ecx,[ebp+8]
[/32-bit]
mov eax,[ecx]
and eax, 0x1FF
[64-bit]
ret
[/64-bit]
[32-bit]
pop ecx
pop ebp
ret 4
[/32-bit]
ConvertBackRoutine:
[32-bit]
push ebp
mov ebp,esp
push edx
push ecx
mov edx,[ebp+0c]
mov ecx,[ebp+08]
[/32-bit]
push eax
push ecx
mov eax,ecx
and eax,0x1FF
mov ecx,[edx]
and ecx,0xFFFFFE00
or eax,ecx
pop ecx
mov [edx],eax
pop eax
[64-bit]
//everything is back to what it was, so exit
ret
[/64-bit]
[32-bit]
pop ecx
pop edx
pop ebp
ret 8
[/32-bit]
]])
_globalsRegistered = true
end
-- END OF CUSTOM TYPES
enableAutoDisable(memrec, nil) -- auto deactivate this
[DISABLE]
1935
"_CheatTableCaptions"
FF8000
Auto Assembler Script
{$lua}
if syntaxcheck then return end
[ENABLE]
_tCheatTableCaptions = createTimer()
_tCheatTableCaptions.Interval = 1000
_tCheatTableCaptions.onTimer = function()
_GetGameDateState = getAddressList().getMemoryRecordByDescription("_ShowGameDate").Active
_GetLoadedDataState = getAddressList().getMemoryRecordByDescription("_ShowLoadedData").Active
-- Getting Options' State
getGameDate(_GetGameDateState)
getStuffName(_GetLoadedDataState)
-- Calling Functions
setTableCaption(true)
end
[DISABLE]
setTableCaption(false)
_tCheatTableCaptions.destroy()
1937
"_ShowGameDate"
400080
Auto Assembler Script
[ENABLE]
[DISABLE]
1950
"_ShowLoadedData"
400080
Auto Assembler Script
[ENABLE]
[DISABLE]
1951
"_ShowActiveScripts"
400080
Auto Assembler Script
[ENABLE]
[DISABLE]
1883
"_CompactViewModeInitialization"
FF8000
Auto Assembler Script
[ENABLE]
LuaCall(addCompactMenu(); cycleFullCompact(nil,true))
[DISABLE]
LuaCall(cycleFullCompact(nil,false))
1655
"Allocated Pointers ->"
0080FF
1
11143
"basPerson"
1
8 Bytes
basPerson
11141
"basPlayer"
1
8 Bytes
basPlayer
11142
"basNonPlayer"
1
8 Bytes
basNonPlayer
11585
"basManager"
1
8 Bytes
basManager
11144
"basClub"
1
8 Bytes
basClub
11148
"basTeam"
1
8 Bytes
basTeam
11145
"basNation"
1
8 Bytes
basNation
11146
"basOnMatch"
1
8 Bytes
basOnMatch
11147
"basComp"
1
8 Bytes
basComp
11589
"Selected Object"
1
8 Bytes
basSelect
12094
"Update ->"
008080
1
12095
"updPerson"
1
Byte
updPerson
12099
"updClub"
1
Byte
updClub
12100
"updTeam"
1
Byte
updTeam
12101
"updNation"
1
Byte
updNation
12102
"updOnMatch"
1
Byte
updOnMatch
12103
"updComp"
1
Byte
updComp
12083
"VTables ->"
008080
1
12084
"basPerson"
1
4 Bytes
basPerson
0
12085
"basPlayer"
1
4 Bytes
basPlayer
0
12086
"basNonPlayer"
1
4 Bytes
basNonPlayer
0
12087
"basManager"
1
4 Bytes
basManager
0
12088
"basClub"
1
4 Bytes
basClub
0
12089
"basTeam"
1
4 Bytes
basTeam
0
12090
"basNation"
1
4 Bytes
basNation
0
12091
"basOnMatch"
1
4 Bytes
basOnMatch
0
12092
"basComp"
1
4 Bytes
basComp
0
12093
"Selected Object"
1
4 Bytes
basSelect
0
11325
"Useful Static Addresses ->"
0080FF
1
11636
"Current time (15 minute intervals after 6 AM)"
Binary
1
7
0
datTimeRoot+1
11611
"Current Day"
Custom
Mask 0x1FF
datTimeRoot
11612
"Current Year"
2 Bytes
datTimeRoot+2
11327
"Human Manager (Primary)"
1
000000
8 Bytes
lblManagerRoot
0
18
11328
"basPerson vtable offset 0"
1
4 Bytes
basPerson
0
-8
0
11329
"basPerson vtable offset 1"
1
4 Bytes
basPerson
4
-8
0
11330
"basPerson vtable offset 2"
1
4 Bytes
basPerson
8
-8
0
1097
"#############################################################################################"
400040
1
10433
"Read Me!"
0080FF
Auto Assembler Script
[enable]
{$LUA}
getMainForm().CommentButton.doClick()
{$ASM}
nop
[disable]
randomvalue
07E60000
fm.exe
fm.exe
This table is for Football Manager 2020 and prepared by figment (TheHologram).
.
How To Use:
[1] Open Football Manager 2020
[2] Open Cheat Engine
[3] Attach to fm.exe / "Football Manager 2020" process
[4] Load the table
[5] Select "[X] <- Football manager 2020 ..."
[6] Select "[X] <----- Update On Focus Change or Tooltip Show (Club, Nation, Competition, Person)"
If this does not stay activated then the version of the game may not match the table.
[7] Select Club, Nation, Competition or Person or hover over (i) tooltips to update current pointers.
[8] Choose the values you want to change within the table
.
Acknowledgements
* This is fork of Football Manager 2019 table created by tdg6661.