<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="45">
  <CheatEntries>
    <CheatEntry>
      <ID>18</ID>
      <Description>"***Suggestion: Enable after game save loaded***"</Description>
      <Color>8000FF</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>47</ID>
      <Description>"Active"</Description>
      <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$asm}
define(MAINEXE, $process)
alloc(newmem, $5010, MAINEXE)
label(i_warehouse_base)

newmem:
  i_warehouse_base:
  dq 0
  align 1000 0
  db 0
  align 1000 0
  db 0
  align 1000 0
  db 0
  align 1000 0
  db 0
  align 1000 0
  db 0

registersymbol(i_warehouse_base)
[DISABLE]
unregistersymbol(i_warehouse_base)
dealloc(newmem, $5010)
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>3</ID>
          <Description>"Coin, influence, &amp; warehouse stocks"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Anno1800.exe
  Version: 
  Date   : 2022-04-06
  Author : bbfox @ https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_MONEY_AND_WAREHOUSE_SLOT,$process,8B 48 20 48 8B C7 89 0F) // should be unique
alloc(newmem,$1000,INJECT_MONEY_AND_WAREHOUSE_SLOT)

label(code)
label(return)
label(i_money_addr1)
label(i_min_money)
label(i_influence_avail_addr)
label(i_influence_total_addr)
label(is_keep_warehouse_slot)
label(i_min_watermark)
label(i_max_watermark)

// 28 *2c 30 *34 *3c= 0
// 68 = 1
// 18 = #1010017 = coin
// 14 != 1A0

newmem:
  mov ecx, [rax+20]
  test ecx, ecx
  je code

  mov dword ptr [is_enemy], 0

{
  push rdx
  push rbx
  xor rdx, rdx
  xor rbx, rbx
  mov dword ptr [is_enemy], 1

  mov ebx, [rax+2c]
  add edx, ebx
  mov ebx, [rax+3c]
  add edx, ebx
  mov ebx, [rax+34]
  add edx, ebx
  test edx, edx
  je its_player
  jmp check_if_player_endp

its_player:
  mov dword ptr [is_enemy], 0

check_if_player_endp:
  pop rbx
  pop rdx


  cmp dword ptr [is_enemy], 1
  je check_enemy
}


  // check type, influence, coin for player
  mov ecx, [rax+18]
  cmp ecx, #1010190
  je to_influence

  cmp ecx, #1010017
  je check_coin

  //start check warehouse
  mov ecx, [rax+1C]  // max capacity
  test ecx, ecx
  je code

  mov cx, [rax+12]
  cmp ecx, F
  jne check_1a_next
  jmp check_1a

check_12_next:
  mov cx, [rax+12]
  cmp ecx, 1
  jne code

check_1a:
  mov cx, [rax+1A]
  cmp ecx, F
  jne check_1a_next
  jmp check_item_no

check_1a_next:
  mov cx, [rax+1A]
  cmp ecx, 1
  jne code

check_item_no:
  mov ecx,[rax+20] // item # must &gt;2
  cmp ecx, 2
  jbe code

  jmp to_warehouse

check_warehouse0:
  mov ecx, [rax+18]
  cmp ecx, #1010190
  ja check_warehouse1
  cmp ecx, #110000
  ja check_warehouse2
  jmp code
check_warehouse2: // DLC
  cmp ecx, #150000
  jb to_warehouse
  jmp code
check_warehouse1: // original
  cmp ecx, #1020000
  jb to_warehouse
  jmp code
  //end check warehouse

check_coin:
  push rbx
  push rdx
  xor rdx, rdx
  xor rbx, rbx
  mov rbx, [rax+20]
  cmp rbx, FFFF
  jle go_check_enemy

save_money_addr:
  mov ebx, [rax+2c]
  add edx, ebx
  mov ebx, [rax+3c]
  add edx, ebx
  mov ebx, [rax+34]
  add edx, ebx
  cmp edx, 0
  lea rbx, [rax+20]
  jne go_check_enemy

  mov [i_money_addr1], rbx
  mov ebx, [rax+20]
  mov edx, [i_min_money]
  cmp ebx, edx
  cmovb ebx, edx
  mov [rax+20], ebx
  jmp endp_money

go_check_enemy:
  mov dword ptr [is_enemy], 1

endp_money:
  pop rdx
  pop rbx

  cmp dword ptr [is_enemy], 1
  je check_enemy

  jmp code


to_influence:
  push rbx
  lea rbx, [rax+20]
  mov [i_influence_avail_addr], rbx
  lea rbx, [rax+1C]
  mov [i_influence_total_addr], rbx
  pop rbx
  jmp code

to_warehouse:
  push rbx
  mov ebx, [rax+68]
  cmp ebx, 1
  pop rbx
  je code

  cmp dword ptr [is_keep_warehouse_slot], 1
  jne code

  // check if warehouse data exists
  cmp qword ptr [i_warehouse_base], 0
  je code

  // check if warehouse slot id saved in script "Click warehouse -&gt; set stock size"
  push r14
  push rdi
  xor r14, r14
  mov dword ptr [is_warehouse_id_found], 0

loop1:
  mov rdi, i_warehouse_base
  lea rdi, [rdi+r14d*8]
  cmp qword ptr [rdi], 0
  je check_endp
  cmp qword ptr [rdi], rax
  je check_found
  inc r14d
  cmp r14d, #2000
  jae check_endp
  jmp loop1

check_found:
  mov dword ptr [is_warehouse_id_found], 1

check_endp:
  pop rdi
  pop r14
  //  --------------------------

  cmp dword ptr [is_warehouse_id_found], 1
  jne code

  push rcx
  push rbx

  mov ebx, [rax+20]
  mov ecx, [rax+1C]

wh_check_min:
  cmp ebx, 1
  ja wh_check_min1
  jmp warehouse_endp

wh_check_min1:
  cmp ebx, dword ptr [i_min_watermark]
  ja wh_check_max
  mov ebx, [i_min_watermark]
  mov [rax+20], ebx
  jmp warehouse_endp

wh_check_max:
  cmp ecx, dword ptr [i_max_watermark]
  jb warehouse_endp
  mov ebx, [rax+1C]
  sub ebx, dword ptr [i_max_watermark]
  mov [rax+20], ebx
  jmp warehouse_endp


warehouse_endp:
  pop rbx
  pop rcx

  jmp code

check_enemy:


code:
  mov ecx,[rax+20]
  mov rax,rdi
  jmp return

align 10 cc
  i_money_addr1:
  dq 0
  i_min_money:
  dd #100000
  i_influence_avail_addr:
  dq 0
  i_influence_total_addr:
  dq 0
  is_enemy:
  dd 1
  is_keep_warehouse_slot:
  dd 0
  i_min_watermark:
  dd #55
  i_max_watermark:
  dd #10
  is_warehouse_id_found:
  dd 0


INJECT_MONEY_AND_WAREHOUSE_SLOT:
  jmp newmem
  nop
return:

registersymbol(i_min_watermark)
registersymbol(i_max_watermark)
registersymbol(is_keep_warehouse_slot)
registersymbol(i_influence_total_addr)
registersymbol(i_influence_avail_addr)
registersymbol(i_min_money)
registersymbol(i_money_addr1)
registersymbol(INJECT_MONEY_AND_WAREHOUSE_SLOT)

[DISABLE]

INJECT_MONEY_AND_WAREHOUSE_SLOT:
  db 8B 48 20 48 8B C7

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Anno1800.exe+109DF52

Anno1800.exe+109DF36: 8B 48 1C        - mov ecx,[rax+1C]
Anno1800.exe+109DF39: 2B D1           - sub edx,ecx
Anno1800.exe+109DF3B: 78 61           - js Anno1800.exe+109DF9E
Anno1800.exe+109DF3D: 89 17           - mov [rdi],edx
Anno1800.exe+109DF3F: 48 8B C7        - mov rax,rdi
Anno1800.exe+109DF42: 48 8B 5C 24 30  - mov rbx,[rsp+30]
Anno1800.exe+109DF47: 48 8B 74 24 38  - mov rsi,[rsp+38]
Anno1800.exe+109DF4C: 48 83 C4 20     - add rsp,20
Anno1800.exe+109DF50: 5F              - pop rdi
Anno1800.exe+109DF51: C3              - ret
// ---------- INJECTING HERE ----------
Anno1800.exe+109DF52: 8B 48 20        - mov ecx,[rax+20]
// ---------- DONE INJECTING  ----------
Anno1800.exe+109DF55: 48 8B C7        - mov rax,rdi
Anno1800.exe+109DF58: 89 0F           - mov [rdi],ecx
Anno1800.exe+109DF5A: 48 8B 5C 24 30  - mov rbx,[rsp+30]
Anno1800.exe+109DF5F: 48 8B 74 24 38  - mov rsi,[rsp+38]
Anno1800.exe+109DF64: 48 83 C4 20     - add rsp,20
Anno1800.exe+109DF68: 5F              - pop rdi
Anno1800.exe+109DF69: C3              - ret
Anno1800.exe+109DF6A: 48 8B 02        - mov rax,[rdx]
Anno1800.exe+109DF6D: 48 8B CA        - mov rcx,rdx
Anno1800.exe+109DF70: FF 50 40        - call qword ptr [rax+40]
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>8</ID>
              <Description>"Player coin"</Description>
              <ShowAsSigned>1</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>[i_money_addr1]</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>9</ID>
              <Description>"Min. coin"</Description>
              <ShowAsSigned>1</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>i_min_money</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>11</ID>
              <Description>"Influence total"</Description>
              <ShowAsSigned>1</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>[i_influence_total_addr]</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>10</ID>
              <Description>"Influence available"</Description>
              <ShowAsSigned>1</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>[i_influence_avail_addr]</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>48</ID>
              <Description>"+Player warehouse stock#"</Description>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>49</ID>
                  <Description>"1. "Click warehouse -&gt; set stock size" must be enabled"</Description>
                  <Color>8000FF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
                <CheatEntry>
                  <ID>50</ID>
                  <Description>"2. Then select any player warehouse"</Description>
                  <Color>8000FF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
                <CheatEntry>
                  <ID>51</ID>
                  <Description>"3. If any new items are added, you must click warehouse again"</Description>
                  <Color>8000FF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
                <CheatEntry>
                  <ID>12</ID>
                  <Description>"Keep warehouse stock (at least &gt;=2; not fully tested)"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_keep_warehouse_slot</Address>
                  <CheatEntries>
                    <CheatEntry>
                      <ID>13</ID>
                      <Description>"  Stock min. value"</Description>
                      <ShowAsSigned>0</ShowAsSigned>
                      <Color>C08000</Color>
                      <VariableType>4 Bytes</VariableType>
                      <Address>i_min_watermark</Address>
                    </CheatEntry>
                    <CheatEntry>
                      <ID>14</ID>
                      <Description>"  Stock max value = (Capacity - X), X ="</Description>
                      <ShowAsSigned>0</ShowAsSigned>
                      <Color>C08000</Color>
                      <VariableType>4 Bytes</VariableType>
                      <Address>i_max_watermark</Address>
                    </CheatEntry>
                  </CheatEntries>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>53</ID>
          <Description>"Selected player ship/building: HP refill (not god mode)"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Anno1800.exe
  Version: 
  Date   : 2023-04-06
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_SELECTED_PLAYER_SHIP,$process,0F BF 56 3E E9 ?? ?? ?? ?? 48 83 7C 3B 10 01) // should be unique
alloc(newmem,$2200,INJECT_SELECTED_PLAYER_SHIP)

alloc(INJECT_SELECTED_PLAYER_SHIPo, 9)

label(code)
label(return)
label(i_sel_ship_base_addr)
label(i_ships_base_addr)

INJECT_SELECTED_PLAYER_SHIPo:
  readmem(INJECT_SELECTED_PLAYER_SHIP, 9)

newmem:
  mov [i_sel_ship_base_addr], rsi
  mov dx, [rsi+40]
  inc dx
  mov [rsi+3E], dx

  // set &amp; check existing ships to list start
  push r14
  push rdi

  xor r14, r14
  mov dword ptr [is_ship_id_found], 0

loop1:
  mov rdi, i_ships_base_addr
  lea rdi, [rdi+r14d*8]
  cmp qword ptr [rdi], 0
  je check_endp

  // fill hp
  //mov dx, [rdi+40]
  //mov [rdi+3E], dx
  // *******

  cmp qword ptr [rdi], rsi
  jne check_not_found_yet
  mov dword ptr [is_ship_id_found], 1
  jmp check_endp

check_not_found_yet:
  inc r14d
  cmp r14d, #500 // max 1000 entries (capacity = 2000h = 1024*8 = 1024 entries)
  ja check_endp_f
  jmp loop1

check_endp:
  cmp dword ptr [is_ship_id_found], 0 // ship not found in list
  jne check_endp_f

  mov [rdi], rsi


check_endp_f:
  pop rdi
  pop r14

  // set &amp; check existing ships to list end

code:
  movsx edx,word ptr [rsi+3E]
  //jmp Anno1800.exe+18DB331
  reassemble(INJECT_SELECTED_PLAYER_SHIP+4)
  jmp return
  align 10 cc
  is_ship_id_found:
  dd 0
  i_sel_ship_base_addr:
  dq 0
  i_ships_base_addr:
  dq 0
  align 1000 0
  db 0
  align 1000 0
  db 0


INJECT_SELECTED_PLAYER_SHIP:
  jmp newmem
  nop 4
return:
registersymbol(INJECT_SELECTED_PLAYER_SHIP)
registersymbol(INJECT_SELECTED_PLAYER_SHIPo)
registersymbol(i_sel_ship_base_addr)
registersymbol(i_ships_base_addr)

[DISABLE]

INJECT_SELECTED_PLAYER_SHIP:
  //db 0F BF 56 3E E9 A9 FE FF FF
  readmem(INJECT_SELECTED_PLAYER_SHIPo, 9)

unregistersymbol(*)
dealloc(newmem)
unregistersymbol(INJECT_SELECTED_PLAYER_SHIPo)
dealloc(INJECT_SELECTED_PLAYER_SHIPo)
{
// ORIGINAL CODE - INJECTION POINT: Anno1800.exe+18DB47F

Anno1800.exe+18DB452: 48 8D 4D 97        - lea rcx,[rbp-69]
Anno1800.exe+18DB456: E8 C5 C2 66 FF     - call Anno1800.exe+F47720
Anno1800.exe+18DB45B: 90                 - nop 
Anno1800.exe+18DB45C: 48 8B 7D A7        - mov rdi,[rbp-59]
Anno1800.exe+18DB460: 48 85 FF           - test rdi,rdi
Anno1800.exe+18DB463: 0F 84 D5 06 00 00  - je Anno1800.exe+18DBB3E
Anno1800.exe+18DB469: BB FF FF FF FF     - mov ebx,FFFFFFFF
Anno1800.exe+18DB46E: E9 D5 04 00 00     - jmp Anno1800.exe+18DB948
Anno1800.exe+18DB473: 48 83 7C 3B 10 00  - cmp qword ptr [rbx+rdi+10],00
Anno1800.exe+18DB479: 0F 85 8E 06 00 00  - jne Anno1800.exe+18DBB0D
// ---------- INJECTING HERE ----------
Anno1800.exe+18DB47F: 0F BF 56 3E        - movsx edx,word ptr [rsi+3E]
// ---------- DONE INJECTING  ----------
Anno1800.exe+18DB483: E9 A9 FE FF FF     - jmp Anno1800.exe+18DB331
Anno1800.exe+18DB488: 48 83 7C 3B 10 01  - cmp qword ptr [rbx+rdi+10],01
Anno1800.exe+18DB48E: 0F 85 79 06 00 00  - jne Anno1800.exe+18DBB0D
Anno1800.exe+18DB494: 4C 8B 44 3B 18     - mov r8,[rbx+rdi+18]
Anno1800.exe+18DB499: 4D 8B CE           - mov r9,r14
Anno1800.exe+18DB49C: 4D 8B 00           - mov r8,[r8]
Anno1800.exe+18DB49F: 48 8D 55 AF        - lea rdx,[rbp-51]
Anno1800.exe+18DB4A3: 48 8B 4D 7F        - mov rcx,[rbp+7F]
Anno1800.exe+18DB4A7: E8 74 BE 66 FF     - call Anno1800.exe+F47320
Anno1800.exe+18DB4AC: 90                 - nop 
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>57</ID>
              <Description>"Try to refill the HP of other players' ships or buildings if they ever clicked"</Description>
              <Options moHideChildren="1"/>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript>{ Game   : Anno1800.exe
  Version: 
  Date   : 2023-04-07
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_REFRESH_PLAYER_OBJECT_HP,$process,66 89 43 3E 66 85 C0) // should be unique
alloc(newmem,$1000,INJECT_REFRESH_PLAYER_OBJECT_HP)

label(code)
label(return)

newmem:
  push r14
  push rdi
  push rax

  xor r14, r14

loop1:
  mov rdi, i_ships_base_addr
  lea rdi, [rdi+r14d*8]
  cmp qword ptr [rdi], 0
  je check_endp

  // fill hp
  mov rdi, [rdi]
  mov ax, [rdi+40]
  inc ax
  mov [rdi+3E], ax
  // *******

check_not_found_yet:
  inc r14d
  cmp r14d, #500 // max 1000 entries (capacity = 2000h = 1024*8 = 1024 entries)
  ja check_endp
  jmp loop1

check_endp:
  pop rax
  pop rdi
  pop r14

code:
  mov [rbx+3E],ax
  test ax,ax
  jmp return

INJECT_REFRESH_PLAYER_OBJECT_HP:
  jmp newmem
  nop 2
return:
registersymbol(INJECT_REFRESH_PLAYER_OBJECT_HP)

[DISABLE]

INJECT_REFRESH_PLAYER_OBJECT_HP:
  db 66 89 43 3E 66 85 C0

unregistersymbol(INJECT_REFRESH_PLAYER_OBJECT_HP)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Anno1800.exe+CAA131

Anno1800.exe+CAA108: 48 89 45 C0              - mov [rbp-40],rax
Anno1800.exe+CAA10C: 48 83 65 B0 01           - and qword ptr [rbp-50],01
Anno1800.exe+CAA111: 48 C7 45 B0 01 00 00 00  - mov qword ptr [rbp-50],00000001
Anno1800.exe+CAA119: 4C 89 6D B8              - mov [rbp-48],r13
Anno1800.exe+CAA11D: 8B CE                    - mov ecx,esi
Anno1800.exe+CAA11F: 85 F6                    - test esi,esi
Anno1800.exe+CAA121: 66 41 0F 4E CD           - cmovle cx,r13w
Anno1800.exe+CAA126: 0F B7 43 40              - movzx eax,word ptr [rbx+40]
Anno1800.exe+CAA12A: 66 3B C1                 - cmp ax,cx
Anno1800.exe+CAA12D: 66 0F 4D C1              - cmovge ax,cx
// ---------- INJECTING HERE ----------
Anno1800.exe+CAA131: 66 89 43 3E              - mov [rbx+3E],ax
// ---------- DONE INJECTING  ----------
Anno1800.exe+CAA135: 66 85 C0                 - test ax,ax
Anno1800.exe+CAA138: 7F 17                    - jg Anno1800.exe+CAA151
Anno1800.exe+CAA13A: 48 8B 43 08              - mov rax,[rbx+08]
Anno1800.exe+CAA13E: 8B 48 58                 - mov ecx,[rax+58]
Anno1800.exe+CAA141: C1 E9 04                 - shr ecx,04
Anno1800.exe+CAA144: F6 C1 01                 - test cl,01
Anno1800.exe+CAA147: 75 08                    - jne Anno1800.exe+CAA151
Anno1800.exe+CAA149: 48 8B CB                 - mov rcx,rbx
Anno1800.exe+CAA14C: E8 5F D0 FF FF           - call Anno1800.exe+CA71B0
Anno1800.exe+CAA151: 48 8B CB                 - mov rcx,rbx
}
</AssemblerScript>
              <CheatEntries>
                <CheatEntry>
                  <ID>59</ID>
                  <Description>"Notice: If the game becomes slow, disable this script"</Description>
                  <Color>8000FF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>54</ID>
              <Description>"HP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_sel_ship_base_addr</Address>
              <Offsets>
                <Offset>3E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>55</ID>
              <Description>"Max HP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_sel_ship_base_addr</Address>
              <Offsets>
                <Offset>40</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>39</ID>
          <Description>"Click ship cargo -&gt; set stock size"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Anno1800.exe
  Version:
  Date   : 2023-04-05
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_CLICK_CARGO,$process,8B 58 20 85 DB 78 2A) // should be unique
alloc(newmem,$1000,INJECT_CLICK_CARGO)

label(code)
label(return)
label(i_min_cargo_size)

newmem:
  mov ebx,[rax+20]
  cmp ebx, [i_min_cargo_size]
  jae code
  mov ebx, [i_min_cargo_size]
  mov [rax+20], ebx

code:
  mov ebx,[rax+20]
  test ebx,ebx
  jmp return

align 10 cc
  i_min_cargo_size:
  dd #1000

INJECT_CLICK_CARGO:
  jmp newmem
return:
registersymbol(i_min_cargo_size)
registersymbol(INJECT_CLICK_CARGO)

[DISABLE]

INJECT_CLICK_CARGO:
  db 8B 58 20 85 DB

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Anno1800.exe+23B8C2A

Anno1800.exe+23B8C09: 48 8B 48 08     - mov rcx,[rax+08]
Anno1800.exe+23B8C0D: 48 3B 48 10     - cmp rcx,[rax+10]
Anno1800.exe+23B8C11: 74 03           - je Anno1800.exe+23B8C16
Anno1800.exe+23B8C13: 8B 79 08        - mov edi,[rcx+08]
Anno1800.exe+23B8C16: 49 8B 0C 24     - mov rcx,[r12]
Anno1800.exe+23B8C1A: 48 85 C9        - test rcx,rcx
Anno1800.exe+23B8C1D: 74 3C           - je Anno1800.exe+23B8C5B
Anno1800.exe+23B8C1F: 41 8B D6        - mov edx,r14d
Anno1800.exe+23B8C22: E8 69 A9 F2 FD  - call Anno1800.exe+2E3590
Anno1800.exe+23B8C27: 48 8B C8        - mov rcx,rax
// ---------- INJECTING HERE ----------
Anno1800.exe+23B8C2A: 8B 58 20        - mov ebx,[rax+20]
// ---------- DONE INJECTING  ----------
Anno1800.exe+23B8C2D: 85 DB           - test ebx,ebx
Anno1800.exe+23B8C2F: 78 2A           - js Anno1800.exe+23B8C5B
Anno1800.exe+23B8C31: 74 1A           - je Anno1800.exe+23B8C4D
Anno1800.exe+23B8C33: 48 8B 40 10     - mov rax,[rax+10]
Anno1800.exe+23B8C37: 48 2B 41 08     - sub rax,[rcx+08]
Anno1800.exe+23B8C3B: 48 83 E0 F0     - and rax,-10
Anno1800.exe+23B8C3F: 48 83 F8 10     - cmp rax,10
Anno1800.exe+23B8C43: B8 00 00 00 00  - mov eax,00000000
Anno1800.exe+23B8C48: 0F 45 D8        - cmovne ebx,eax
Anno1800.exe+23B8C4B: EB 12           - jmp Anno1800.exe+23B8C5F
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>45</ID>
              <Description>"Min. size"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>i_min_cargo_size</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>42</ID>
          <Description>"Click warehouse -&gt; set stock size"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Anno1800.exe
  Version:
  Date   : 2023-04-05
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_CLICK_WAREHOUSE,$process,8B 48 20 89 4C 24 40 44) // should be unique
alloc(newmem,$1000,INJECT_CLICK_WAREHOUSE)

label(code)
label(return)
label(i_min_stock_size)

newmem:
  push r14
  push rdi

  xor r14, r14
  //xor rdi, rdi

loop1:
  mov rdi, i_warehouse_base
  lea rdi, [rdi+r14d*8]
  cmp qword ptr [rdi], 0
  je store_and_endp
  cmp qword ptr [rdi], rax
  je endp
  inc r14d
  cmp r14d, #1000
  jae endp
  jmp loop1


store_and_endp:
  mov [rdi], rax

endp:

  pop rdi
  pop r14


  mov ecx,[rax+20]
  cmp ecx, [i_min_stock_size]
  jae code
  mov ecx, [i_min_stock_size]
  mov dword ptr [rax+20], ecx

code:
  mov ecx,[rax+20]
  mov [rsp+40],ecx
  jmp return

align 10 cc
  i_min_stock_size:
  dd #31

INJECT_CLICK_WAREHOUSE:
  jmp newmem
  nop 2
return:
registersymbol(i_min_stock_size)
registersymbol(INJECT_CLICK_WAREHOUSE)
[DISABLE]

INJECT_CLICK_WAREHOUSE:
  db 8B 48 20 89 4C 24 40

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Anno1800.exe+241D623

Anno1800.exe+241D5F8: 0F 1F 84 00 00 00 00 00  - nop dword ptr [rax+rax+00000000]
Anno1800.exe+241D600: 48 3B C2                 - cmp rax,rdx
Anno1800.exe+241D603: 0F 84 CD 01 00 00        - je Anno1800.exe+241D7D6
Anno1800.exe+241D609: 48 8B 40 08              - mov rax,[rax+08]
Anno1800.exe+241D60D: 44 3B 48 10              - cmp r9d,[rax+10]
Anno1800.exe+241D611: 75 ED                    - jne Anno1800.exe+241D600
Anno1800.exe+241D613: 48 85 C0                 - test rax,rax
Anno1800.exe+241D616: 48 0F 44 C1              - cmove rax,rcx
Anno1800.exe+241D61A: 48 3B C1                 - cmp rax,rcx
Anno1800.exe+241D61D: 0F 84 B3 01 00 00        - je Anno1800.exe+241D7D6
// ---------- INJECTING HERE ----------
Anno1800.exe+241D623: 8B 48 20                 - mov ecx,[rax+20]
// ---------- DONE INJECTING  ----------
Anno1800.exe+241D626: 89 4C 24 40              - mov [rsp+40],ecx
Anno1800.exe+241D62A: 44 8B 58 1C              - mov r11d,[rax+1C]
Anno1800.exe+241D62E: 44 89 5D C3              - mov [rbp-3D],r11d
Anno1800.exe+241D632: 45 33 C0                 - xor r8d,r8d
Anno1800.exe+241D635: 48 8B 50 48              - mov rdx,[rax+48]
Anno1800.exe+241D639: 4C 8B 50 50              - mov r10,[rax+50]
Anno1800.exe+241D63D: 49 3B D2                 - cmp rdx,r10
Anno1800.exe+241D640: 74 19                    - je Anno1800.exe+241D65B
Anno1800.exe+241D642: 80 7A 24 00              - cmp byte ptr [rdx+24],00
Anno1800.exe+241D646: 75 0F                    - jne Anno1800.exe+241D657
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>44</ID>
              <Description>"Min. size"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>i_min_stock_size</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>46</ID>
      <Description>"Anno 1800 17.0.1222998 /  https://opencheattables.com  /  CE 7.5+"</Description>
      <Color>800080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
  <Comments>ｂｂｆｏｘ＠ｈｔｔｐｓ：／／ｏｐｅｎｃｈｅａｔｔａｂｌｅｓ．ｏｒｇ
</Comments>
</CheatTable>
