<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="45">
  <CheatEntries>
    <CheatEntry>
      <ID>18</ID>
      <Description>"Get Data"</Description>
      <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : grim dawn.exe
  Version: 
  Date   : 2023-11/18
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_GET_DATA,Game.dll,F3 0F 10 81 EC 0D 00 00) // should be unique
alloc(newmem,$1000,INJECT_GET_DATA)

label(code)
label(return)
label(i_dbase_addr_2)
label(sd_min_hp_val)
label(is_fill_mp)
label(is_min_hp)

newmem:
  cmp qword ptr [i_dbase_addr_2], 0
  jne do_check
  mov qword ptr [i_dbase_addr_2], rcx

do_check:
chk_mana:
  cmp byte ptr [is_fill_mp], 1
  jne chk_hp

  vmovss xmm15, [rcx+00000E5C] // max mana   (E14+48)
  vmovss xmm14, [rcx+00000E68] // upkeep mana  (E20+48)
  vsubss xmm13, xmm15, xmm14
  vmovss [rcx+00000DEC], xmm13 // mana

chk_hp:
  cmp byte ptr [is_min_hp], 1
  jne endp
  vmovsd xmm15, [rcx+00000DD0] // HP  (D88+48)
  vmovsd xmm14, [sd_min_hp_val]
  vcomisd xmm15, xmm14
  jge endp

  vmovsd [rcx+00000DD0], xmm14

endp:

code:
  vmovss xmm0,[rcx+00000DEC]
  jmp return
align 10 cc
  i_dbase_addr_2:
  dq 0
  sd_min_hp_val:
  dq (double)500
  is_fill_mp:
  db 1
  is_min_hp:
  db 0

INJECT_GET_DATA:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_GET_DATA)
registersymbol(i_dbase_addr_2)
registersymbol(sd_min_hp_val)
registersymbol(is_fill_mp)
registersymbol(is_min_hp)


[DISABLE]

INJECT_GET_DATA:
  db F3 0F 10 81 EC 0D 00 00

unregistersymbol(INJECT_GET_DATA)
unregistersymbol(i_dbase_addr_2)
unregistersymbol(sd_min_hp_val)
unregistersymbol(is_fill_mp)
unregistersymbol(is_min_hp)

dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Character::GetCurrentMana

Game.GAME::Character::ContributeMiscConversionAttributes+E6: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+E7: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+E8: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+E9: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+EA: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+EB: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+EC: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+ED: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+EE: CC                       - int 3
Game.GAME::Character::ContributeMiscConversionAttributes+EF: CC                       - int 3
// ---------- INJECTING HERE ----------
Game.GAME::Character::GetCurrentMana: F3 0F 10 81 EC 0D 00 00  - movss xmm0,[rcx+00000DEC]
// ---------- DONE INJECTING  ----------
Game.GAME::Character::GetCurrentMana+8: 0F 57 C9                 - xorps xmm1,xmm1
Game.GAME::Character::GetCurrentMana+B: F3 0F 5F C1              - maxss xmm0,xmm1
Game.GAME::Character::GetCurrentMana+F: C3                       - ret
Game.GAME::Character::SetCurrentMana: 40 53                    - push rbx
Game.GAME::Character::SetCurrentMana+2: 48 83 EC 30              - sub rsp,30
Game.GAME::Character::SetCurrentMana+6: 48 8B D9                 - mov rbx,rcx
Game.GAME::Character::SetCurrentMana+9: 0F 29 74 24 20           - movaps [rsp+20],xmm6
Game.GAME::Character::SetCurrentMana+E: 48 81 C1 48 0E 00 00     - add rcx,00000E48
Game.GAME::Character::SetCurrentMana+15: BA 05 00 00 00           - mov edx,00000005
Game.GAME::Character::SetCurrentMana+1A: 0F 28 F1                 - movaps xmm6,xmm1
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>31</ID>
          <Description>"Fill mana?"</Description>
          <DropDownList DescriptionOnly="1" DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>is_fill_mp</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>32</ID>
          <Description>"Keep min HP?"</Description>
          <DropDownListLink>Fill mana?</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>is_min_hp</Address>
          <CheatEntries>
            <CheatEntry>
              <ID>33</ID>
              <Description>"min. HP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Double</VariableType>
              <Address>sd_min_hp_val</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>19</ID>
          <Description>"HP"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Double</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>DD0</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>35</ID>
          <Description>"Max HP"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>151C</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>22</ID>
          <Description>"Mana"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>DEC</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>36</ID>
          <Description>"Allowed max mana"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>12C0</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>21</ID>
          <Description>"Max Mana"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>E5C</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>20</ID>
          <Description>"Mana upkeep"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>E68</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>23</ID>
          <Description>"(X) Invisible flag"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C0C0C0</Color>
          <VariableType>Byte</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1C84</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>24</ID>
          <Description>"(X) God mode flag"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C0C0C0</Color>
          <VariableType>Byte</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1C86</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>25</ID>
          <Description>"(X) Get attacked flag"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C0C0C0</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>62C</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>26</ID>
          <Description>"Money"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1584</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>49</ID>
          <Description>"XP"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1624</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>47</ID>
          <Description>"Modifier pt"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1628</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>27</ID>
          <Description>"Attribute pt"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1628</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>29</ID>
          <Description>"Skill pt"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>162C</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>28</ID>
          <Description>"Devotion pt"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1630</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>48</ID>
          <Description>"Affinity"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>1634</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>41</ID>
          <Description>"Run speed"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>4B60</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>42</ID>
          <Description>"Max Run speed"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>4B64</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>45</ID>
          <Description>"Cast speed"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>4B68</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>46</ID>
          <Description>"Max cast speed"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>4B6C</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>43</ID>
          <Description>"Attack speed"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>4B70</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>44</ID>
          <Description>"Max attack speed"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Float</VariableType>
          <Address>i_dbase_addr_2</Address>
          <Offsets>
            <Offset>4B74</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>34</ID>
      <Description>"Fast skill CD"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : grim dawn.exe
  Version: 
  Date   : 2023-06-25
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_FAST_COOLDOWN,Game.dll,48 8B CF 0F 28 F0 E8 B8) // should be unique
alloc(newmem,$1000,INJECT_FAST_COOLDOWN)

label(code)
label(return)

newmem:
  vxorps xmm0,xmm0,xmm0

code:
  mov rcx,rdi
  movaps xmm6,xmm0
  jmp return



INJECT_FAST_COOLDOWN:
  jmp newmem
  nop
return:
registersymbol(INJECT_FAST_COOLDOWN)

[DISABLE]

INJECT_FAST_COOLDOWN:
  db 48 8B CF 0F 28 F0

unregistersymbol(INJECT_FAST_COOLDOWN)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Skill::StartCooldown+6D

Game.GAME::Skill::StartCooldown+45: 48 8B CF              - mov rcx,rdi
Game.GAME::Skill::StartCooldown+48: 48 8B 18              - mov rbx,[rax]
Game.GAME::Skill::StartCooldown+4B: FF 15 67 2C 14 00     - call qword ptr [Game.dll+4EE128]
Game.GAME::Skill::StartCooldown+51: 8B D0                 - mov edx,eax
Game.GAME::Skill::StartCooldown+53: 48 8B CE              - mov rcx,rsi
Game.GAME::Skill::StartCooldown+56: FF 93 A8 00 00 00     - call qword ptr [rbx+000000A8]
Game.GAME::Skill::StartCooldown+5C: 48 8B 5C 24 40        - mov rbx,[rsp+40]
Game.GAME::Skill::StartCooldown+61: 40 0F B6 D5           - movzx edx,bpl
Game.GAME::Skill::StartCooldown+65: 48 8B CF              - mov rcx,rdi
Game.GAME::Skill::StartCooldown+68: E8 73 00 00 00        - call Game.GAME::Skill::GetCooldownTime
// ---------- INJECTING HERE ----------
Game.GAME::Skill::StartCooldown+6D: 48 8B CF              - mov rcx,rdi
// ---------- DONE INJECTING  ----------
Game.GAME::Skill::StartCooldown+70: 0F 28 F0              - movaps xmm6,xmm0
Game.GAME::Skill::StartCooldown+73: E8 B8 03 00 00        - call Game.GAME::Skill::GetMaxCooldownCharges
Game.GAME::Skill::StartCooldown+78: 48 8B 74 24 50        - mov rsi,[rsp+50]
Game.GAME::Skill::StartCooldown+7D: 48 8B 6C 24 48        - mov rbp,[rsp+48]
Game.GAME::Skill::StartCooldown+82: 83 F8 01              - cmp eax,01
Game.GAME::Skill::StartCooldown+85: 7E 09                 - jle Game.GAME::Skill::StartCooldown+90
Game.GAME::Skill::StartCooldown+87: 83 BF B0 01 00 00 00  - cmp dword ptr [rdi+000001B0],00
Game.GAME::Skill::StartCooldown+8E: 7F 38                 - jg Game.GAME::Skill::StartCooldown+C8
Game.GAME::Skill::StartCooldown+90: 0F 57 C9              - xorps xmm1,xmm1
Game.GAME::Skill::StartCooldown+93: F3 0F 5A CE           - cvtss2sd xmm1,xmm6
}
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>50</ID>
      <Description>"EXP multiplier"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : grim dawn.exe
  Version: 
  Date   : 2023-06-26
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_EXP_MULTI,Game.dll,01 51 7C 40 32 FF) // should be unique
alloc(newmem,$1000,INJECT_EXP_MULTI)

label(code)
label(return)
label(vf_exp_multi)

newmem:
  vmovss xmm14, [vf_exp_multi]
  cvtsi2ss xmm15, edx
  vmulss xmm13, xmm14, xmm15
  vcvtss2si edx, xmm13

code:
  add [rcx+7C],edx
  xor dil,dil
  jmp return
align 10 cc
  vf_exp_multi:
  dd (float)3.33333

INJECT_EXP_MULTI:
  jmp newmem
  nop
return:
registersymbol(INJECT_EXP_MULTI)
registersymbol(vf_exp_multi)

[DISABLE]

INJECT_EXP_MULTI:
  db 01 51 7C 40 32 FF

unregistersymbol(INJECT_EXP_MULTI)
unregistersymbol(vf_exp_multi)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Item::SetIgnoreItemSkillCache+93A

Game.GAME::Item::SetIgnoreItemSkillCache+929: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+92A: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+92B: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+92C: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+92D: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+92E: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+92F: CC                       - int 3 
Game.GAME::Item::SetIgnoreItemSkillCache+930: 48 89 5C 24 18           - mov [rsp+18],rbx
Game.GAME::Item::SetIgnoreItemSkillCache+935: 57                       - push rdi
Game.GAME::Item::SetIgnoreItemSkillCache+936: 48 83 EC 30              - sub rsp,30
// ---------- INJECTING HERE ----------
Game.GAME::Item::SetIgnoreItemSkillCache+93A: 01 51 7C                 - add [rcx+7C],edx
// ---------- DONE INJECTING  ----------
Game.GAME::Item::SetIgnoreItemSkillCache+93D: 40 32 FF                 - xor dil,dil
Game.GAME::Item::SetIgnoreItemSkillCache+940: 8B 41 74                 - mov eax,[rcx+74]
Game.GAME::Item::SetIgnoreItemSkillCache+943: 48 8B D9                 - mov rbx,rcx
Game.GAME::Item::SetIgnoreItemSkillCache+946: 39 41 78                 - cmp [rcx+78],eax
Game.GAME::Item::SetIgnoreItemSkillCache+949: 0F 83 34 01 00 00        - jae Game.GAME::Item::SetIgnoreItemSkillCache+A83
Game.GAME::Item::SetIgnoreItemSkillCache+94F: 48 89 74 24 48           - mov [rsp+48],rsi
Game.GAME::Item::SetIgnoreItemSkillCache+954: 33 F6                    - xor esi,esi
Game.GAME::Item::SetIgnoreItemSkillCache+956: 0F 29 74 24 20           - movaps [rsp+20],xmm6
Game.GAME::Item::SetIgnoreItemSkillCache+95B: F3 0F 10 35 39 7D 43 00  - movss xmm6,[Game.GAME::WeaponArmor_Offhand::`vftable'+F14]
Game.GAME::Item::SetIgnoreItemSkillCache+963: 8B 43 78                 - mov eax,[rbx+78]
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>51</ID>
          <Description>"multiplier"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Float</VariableType>
          <Address>vf_exp_multi</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>40</ID>
      <Description>"Bypass Ingredient Check on Transmute"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : grim dawn.exe
  Version: 
  Date   : 2023-06-26
  Author :
}

[ENABLE]

aobscanmodule(INJECT_TRANS1,grim dawn.exe,0F 84 D6 00 00 00 48 8B 47) // should be unique
aobscanmodule(INJECT_TRANS2,grim dawn.exe,48 8B 5C 24 38 66 C7 87 C1) // should be unique
alloc(newmem,$1000,INJECT_TRANS1)

label(code)
label(return)

newmem:
  jmp INJECT_TRANS2
code:

  //je "grim dawn.exe"+17D305
  jmp return

INJECT_TRANS1:
  jmp newmem
  nop
return:
registersymbol(INJECT_TRANS1)

[DISABLE]

INJECT_TRANS1:
  db 0F 84 D6 00 00 00

unregistersymbol(INJECT_TRANS1)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: grim dawn.exe+17D229

grim dawn.exe+17D208: 74 11                 - je "grim dawn.exe"+17D21B
grim dawn.exe+17D20A: 48 3B CE              - cmp rcx,rsi
grim dawn.exe+17D20D: 74 0E                 - je "grim dawn.exe"+17D21D
grim dawn.exe+17D20F: 48 8B D6              - mov rdx,rsi
grim dawn.exe+17D212: E8 89 60 0E 00        - call "grim dawn.exe"+2632A0
grim dawn.exe+17D217: 84 C0                 - test al,al
grim dawn.exe+17D219: 75 02                 - jne "grim dawn.exe"+17D21D
grim dawn.exe+17D21B: 33 DB                 - xor ebx,ebx
grim dawn.exe+17D21D: 80 BF 70 27 00 00 00  - cmp byte ptr [rdi+00002770],00
grim dawn.exe+17D224: 48 8B 74 24 30        - mov rsi,[rsp+30]
// ---------- INJECTING HERE ----------
grim dawn.exe+17D229: 0F 84 D6 00 00 00     - je "grim dawn.exe"+17D305
// ---------- DONE INJECTING  ----------
grim dawn.exe+17D22F: 48 8B 47 60           - mov rax,[rdi+60]
grim dawn.exe+17D233: 48 8D 4F 60           - lea rcx,[rdi+60]
grim dawn.exe+17D237: FF 90 A0 00 00 00     - call qword ptr [rax+000000A0]
grim dawn.exe+17D23D: 84 C0                 - test al,al
grim dawn.exe+17D23F: 0F 84 C0 00 00 00     - je "grim dawn.exe"+17D305
grim dawn.exe+17D245: 48 8D 8F 98 02 00 00  - lea rcx,[rdi+00000298]
grim dawn.exe+17D24C: 48 8B 01              - mov rax,[rcx]
grim dawn.exe+17D24F: FF 90 A0 00 00 00     - call qword ptr [rax+000000A0]
grim dawn.exe+17D255: 84 C0                 - test al,al
grim dawn.exe+17D257: 0F 84 A8 00 00 00     - je "grim dawn.exe"+17D305
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>61</ID>
          <Description>"Not fully tested -- may not working"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>52</ID>
      <Description>"Shattered Realm: stop timer"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : grim dawn.exe
  Version: 
  Date   : 2023-07-30
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_Shattered_timer_LOCK,Game.dll,2B C2 89 81 6C 01 00 00) // should be unique
alloc(newmem,$1000,INJECT_Shattered_timer_LOCK)

label(code)
label(return)

newmem:

code:
  //sub eax,edx

  //sub with zero and set flags
  sub eax, 0
  mov [rcx+0000016C],eax
  jmp return

INJECT_Shattered_timer_LOCK:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_Shattered_timer_LOCK)

[DISABLE]

INJECT_Shattered_timer_LOCK:
  db 2B C2 89 81 6C 01 00 00

unregistersymbol(INJECT_Shattered_timer_LOCK)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::PlayStats::UpdateBonusTimer+13

Game.GAME::PlayStats::IsSurvivalScoreLocked+C: CC                    - int 3 
Game.GAME::PlayStats::IsSurvivalScoreLocked+D: CC                    - int 3 
Game.GAME::PlayStats::IsSurvivalScoreLocked+E: CC                    - int 3 
Game.GAME::PlayStats::IsSurvivalScoreLocked+F: CC                    - int 3 
Game.GAME::PlayStats::UpdateBonusTimer: 40 53                 - push rbx
Game.GAME::PlayStats::UpdateBonusTimer+2: 48 83 EC 20           - sub rsp,20
Game.GAME::PlayStats::UpdateBonusTimer+6: 8B 81 6C 01 00 00     - mov eax,[rcx+0000016C]
Game.GAME::PlayStats::UpdateBonusTimer+C: 48 8B D9              - mov rbx,rcx
Game.GAME::PlayStats::UpdateBonusTimer+F: 85 C0                 - test eax,eax
Game.GAME::PlayStats::UpdateBonusTimer+11: 7E 7C                 - jle Game.GAME::PlayStats::UpdateBonusTimer+8F
// ---------- INJECTING HERE ----------
Game.GAME::PlayStats::UpdateBonusTimer+13: 2B C2                 - sub eax,edx
// ---------- DONE INJECTING  ----------
Game.GAME::PlayStats::UpdateBonusTimer+15: 89 81 6C 01 00 00     - mov [rcx+0000016C],eax
Game.GAME::PlayStats::UpdateBonusTimer+1B: 0F B6 89 70 01 00 00  - movzx ecx,byte ptr [rcx+00000170]
Game.GAME::PlayStats::UpdateBonusTimer+22: 84 C9                 - test cl,cl
Game.GAME::PlayStats::UpdateBonusTimer+24: 74 14                 - je Game.GAME::PlayStats::UpdateBonusTimer+3A
Game.GAME::PlayStats::UpdateBonusTimer+26: 3D 10 27 00 00        - cmp eax,00002710
Game.GAME::PlayStats::UpdateBonusTimer+2B: 7C 09                 - jl Game.GAME::PlayStats::UpdateBonusTimer+36
Game.GAME::PlayStats::UpdateBonusTimer+2D: C6 83 70 01 00 00 00  - mov byte ptr [rbx+00000170],00
Game.GAME::PlayStats::UpdateBonusTimer+34: EB 39                 - jmp Game.GAME::PlayStats::UpdateBonusTimer+6F
Game.GAME::PlayStats::UpdateBonusTimer+36: 84 C9                 - test cl,cl
Game.GAME::PlayStats::UpdateBonusTimer+38: 75 35                 - jne Game.GAME::PlayStats::UpdateBonusTimer+6F
}
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>57</ID>
      <Description>"Inventory: set item min. count"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : grim dawn.exe
  Version: 
  Date   : 2023-07-30
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

//aobscanmodule(INJECT_SET_ITEM_CNT,Game.dll,ERROR: Could not find unique AOB, tried code "8B 87 34 01 00 00") // should be unique
aobscanregion(INJECT_SET_ITEM_CNT,"Game.GAME::Item::SetSoulbound"+39D,"Game.GAME::Item::SetSoulbound"+40E,8B 87 34 01 00 00) // should be unique
alloc(newmem,$1000,INJECT_SET_ITEM_CNT)

label(code)
label(return)
label(i_target_item_cnt)

newmem:
  // safety check
  mov eax,[rdi+0000012C]
  test eax, eax
  jnz code
  mov eax,[rdi+00000130]
  test eax, eax
  jnz code
  mov eax,[rdi+00000138]
  test eax, eax
  jnz code

  // check number
  mov eax,[rdi+00000134]
  cmp eax, [i_min_item_cnt]
  jb code
  cmp eax, [i_target_item_cnt]
  jae code
  mov eax, [i_target_item_cnt]
  mov [rdi+00000134], eax

code:
  mov eax,[rdi+00000134]
  jmp return
align 10 cc
  i_min_item_cnt:
  dd 2
  i_target_item_cnt:
  dd 50


INJECT_SET_ITEM_CNT:
  jmp newmem
  nop
return:
registersymbol(INJECT_SET_ITEM_CNT)
registersymbol(i_target_item_cnt)

[DISABLE]

INJECT_SET_ITEM_CNT:
  db 8B 87 34 01 00 00

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Item::SetSoulbound+3E2

Game.GAME::Item::SetSoulbound+3A6: 45 33 C0                 - xor r8d,r8d
Game.GAME::Item::SetSoulbound+3A9: E8 02 B3 F6 FF           - call Game.GAME::FilterFunction&lt;GAME::CharacterAction&gt;::operator=+620
Game.GAME::Item::SetSoulbound+3AE: 8B 87 20 01 00 00        - mov eax,[rdi+00000120]
Game.GAME::Item::SetSoulbound+3B4: 89 83 20 01 00 00        - mov [rbx+00000120],eax
Game.GAME::Item::SetSoulbound+3BA: F2 0F 10 87 24 01 00 00  - movsd xmm0,[rdi+00000124]
Game.GAME::Item::SetSoulbound+3C2: F2 0F 11 83 24 01 00 00  - movsd [rbx+00000124],xmm0
Game.GAME::Item::SetSoulbound+3CA: 8B 87 2C 01 00 00        - mov eax,[rdi+0000012C]
Game.GAME::Item::SetSoulbound+3D0: 89 83 2C 01 00 00        - mov [rbx+0000012C],eax
Game.GAME::Item::SetSoulbound+3D6: 8B 87 30 01 00 00        - mov eax,[rdi+00000130]
Game.GAME::Item::SetSoulbound+3DC: 89 83 30 01 00 00        - mov [rbx+00000130],eax
// ---------- INJECTING HERE ----------
Game.GAME::Item::SetSoulbound+3E2: 8B 87 34 01 00 00        - mov eax,[rdi+00000134]
// ---------- DONE INJECTING  ----------
Game.GAME::Item::SetSoulbound+3E8: 89 83 34 01 00 00        - mov [rbx+00000134],eax
Game.GAME::Item::SetSoulbound+3EE: 8B 87 38 01 00 00        - mov eax,[rdi+00000138]
Game.GAME::Item::SetSoulbound+3F4: 89 83 38 01 00 00        - mov [rbx+00000138],eax
Game.GAME::Item::SetSoulbound+3FA: 8B 87 3C 01 00 00        - mov eax,[rdi+0000013C]
Game.GAME::Item::SetSoulbound+400: 89 83 3C 01 00 00        - mov [rbx+0000013C],eax
Game.GAME::Item::SetSoulbound+406: 48 8B C3                 - mov rax,rbx
Game.GAME::Item::SetSoulbound+409: 48 8B 5C 24 30           - mov rbx,[rsp+30]
Game.GAME::Item::SetSoulbound+40E: 48 83 C4 20              - add rsp,20
Game.GAME::Item::SetSoulbound+412: 5F                       - pop rdi
Game.GAME::Item::SetSoulbound+413: C3                       - ret 
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>58</ID>
          <Description>"Requirement: Item count must &gt;= 2"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>59</ID>
          <Description>"Notice: Sell and buy back to reflect changes"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>60</ID>
          <Description>"Target count"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_target_item_cnt</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>62</ID>
      <Description>"Grim Dawn v1.2.0.0 (x64)  /  https://opencheattables.com  /  CE 7.5+"</Description>
      <Color>00A452</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
