<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="51">
  <CheatEntries>
    <CheatEntry>
      <ID>26</ID>
      <Description>"[$LUA+ASM] Get Money (instance)"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>define(OriginalCode,db 48 63 08 89 4D E8 48 63 40 04 89 45 EC 48 63 45 E8)
[ENABLE]
{$lua}
local ceKnowsThisAddress = getAddress(select(2,splitDisassembledString(disassemble("Game.Simulation.CitySystem:OnUpdate+a6"))):gsub("mov r11,", ""));
local ceCantGetThisAddress = ceKnowsThisAddress and readByte(ceKnowsThisAddress)~=0x49 and getAddress(select(2,splitDisassembledString(disassemble(ceKnowsThisAddress+0x001e))):gsub("mov r11,", "")) or 0;
local AssemblyAddress = ceCantGetThisAddress~=0 and ceCantGetThisAddress+0x0083;
if not AssemblyAddress then return 'test al,al',synchronize(function() messageDialog("Couldn't find instance. First try load city.") end) end;
return " define(ReadOnlyAddress,"..string.format("%X",AssemblyAddress)..") \n registersymbol(ReadOnlyAddress)"
{$asm}
alloc(newmem,1)
label(from_newmem_Return)
registersymbol(newmem)
//  |
label(GameCityPlayerMoney)
registersymbol(GameCityPlayerMoney)
//  |
newmem:
mov [GameCityPlayerMoney],rax  // technically this is an instance but CE or and GAME will crash on lookup from this address
OriginalCode
jmp from_newmem_Return
dq 00
GameCityPlayerMoney:
dq 00
//  |
ReadOnlyAddress:
jmp far newmem
nop 3
from_newmem_Return:
//  |
[DISABLE]
ReadOnlyAddress:
OriginalCode
dealloc(newmem)
unregistersymbol(ReadOnlyAddress newmem GameCityPlayerMoney)
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>22</ID>
          <Description>"m_Money"</Description>
          <ShowAsSigned>1</ShowAsSigned>
          <VariableType>4 Bytes</VariableType>
          <Address>GameCityPlayerMoney</Address>
          <Offsets>
            <Offset>0</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>23</ID>
          <Description>"m_Unlimited"</Description>
          <ShowAsSigned>1</ShowAsSigned>
          <VariableType>Byte</VariableType>
          <Address>GameCityPlayerMoney</Address>
          <Offsets>
            <Offset>4</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>34</ID>
      <Description>"[$LUA+ASM] Get XP (Instance)"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>define(OriginalCodeBytes,db 48 63 08 89 4D D0 48 63 48 04 89 4D D4 48 63 48 08)
[ENABLE]
{$lua}
local ceKnowsThisAddress = getAddress(select(2,splitDisassembledString(disassemble("Game.Simulation.CitySystem:OnUpdate+116"))):gsub("mov r11,", ""));
local ceCantGetThisAddress = ceKnowsThisAddress and readByte(ceKnowsThisAddress)~=0x49 and getAddress(select(2,splitDisassembledString(disassemble(ceKnowsThisAddress+0x0026))):gsub("mov r11,", "")) or 0;
local AssemblyAddress = ceCantGetThisAddress~=0 and ceCantGetThisAddress+0x0093;
if not AssemblyAddress then return 'test al,al',synchronize(function() messageDialog("Couldn't find instance. First try load city.") end) end;
return " define(ReadOnlyAddress2,"..string.format("%X",AssemblyAddress)..") \n registersymbol(ReadOnlyAddress2)"
{$asm}
alloc(newmem,2048)
label(returnhere)

label(GameCityXP)
registersymbol(GameCityXP)

newmem:
mov [GameCityXP],rax // technically this is an instance but CE or and GAME will crash on lookup from this address
OriginalCodeBytes
jmp returnhere

GameCityXP:
dq 00

ReadOnlyAddress2:
jmp far newmem
nop 3
returnhere:

[DISABLE]
ReadOnlyAddress2:
OriginalCodeBytes
unregistersymbol(ReadOnlyAddress2 GameCityXP)
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>35</ID>
          <Description>"m_XP"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <VariableType>4 Bytes</VariableType>
          <Address>GameCityXP</Address>
          <Offsets>
            <Offset>0</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>36</ID>
          <Description>"m_MaximumPopulation"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <VariableType>4 Bytes</VariableType>
          <Address>GameCityXP</Address>
          <Offsets>
            <Offset>4</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>37</ID>
          <Description>"m_MaximumIncome"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <VariableType>4 Bytes</VariableType>
          <Address>GameCityXP</Address>
          <Offsets>
            <Offset>8</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>38</ID>
          <Description>"m_XPRewardRecord"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <VariableType>4 Bytes</VariableType>
          <Address>GameCityXP</Address>
          <Offsets>
            <Offset>C</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
