<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="45">
  <CheatEntries>
    <CheatEntry>
      <ID>0</ID>
      <Description>"--------------------------------------------------"</Description>
      <Color>808080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>1</ID>
      <Description>"Game: The Lamplighters League"</Description>
      <Color>9B9B00</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>2</ID>
      <Description>"Process: LamplightersLeague.exe"</Description>
      <Color>9B9B00</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>3</ID>
      <Description>"Platform: Game Pass / Steam"</Description>
      <Color>9B9B00</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>4</ID>
      <Description>"Version: Initial Release"</Description>
      <Color>9B9B00</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>5</ID>
      <Description>"Engine: Unity"</Description>
      <Color>9B9B00</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>6</ID>
      <Description>"--------------------------------------------------"</Description>
      <Color>808080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>7</ID>
      <Description>"Table Maker: ImJustMaxie"</Description>
      <Color>024DB0</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>8</ID>
      <Description>"Table Version: 1.3"</Description>
      <Color>024DB0</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>9</ID>
      <Description>"Credits:"</Description>
      <Color>024DB0</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>10</ID>
      <Description>"--------------------------------------------------"</Description>
      <Color>808080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>11</ID>
      <Description>"[X] &lt;== Discord server"</Description>
      <Color>954A4A</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{$LUA}
if syntaxcheck then return end
ShellExecute('https://discord.gg/C2YZkYFAtD')
[enable]
error()
[disable]
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>12</ID>
      <Description>"[X] &lt;== Donate to my Ko-fi"</Description>
      <Color>954A4A</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{$LUA}
if syntaxcheck then return end
ShellExecute('https://ko-fi.com/imjustmaxie')
[enable]
error()
[disable]
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>13</ID>
      <Description>"[] &lt;== Disable Without Execute (use if game crashes)"</Description>
      <Color>286FFF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{$LUA}
if syntaxcheck then return end

AddressList.disableAllWithoutExecute()
deleteAllRegisteredSymbols()
[enable]
error()
[disable]			
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>41</ID>
      <Description>"broken stuff"</Description>
      <Color>808080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>14</ID>
      <Description>"[X] &lt;== Activation (wait for IL2CPP symbol enum)"</Description>
      <Options moHideChildren="1" moManualExpandCollapse="1" moDeactivateChildrenAsWell="1"/>
      <Color>8000FF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{$LUA}
if syntaxcheck then return end

[ENABLE]
local tbl = {string.sub(getAddressList().getMemoryRecord(2).Description,10)}
local a = getProcessIDFromProcessName(tbl[1]) or error(showMessage('No process found.\nPlease run the process.'))
local b = getProcessIDFromProcessName(process)
if not b or b ~= a then openProcess(a) end
if not monopipe then LaunchMonoDataCollector() end

[DISABLE]
if monopipe then monopipe.destroy();monopipe = nil end
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>15</ID>
          <Description>"[X] &lt;== Main"</Description>
          <Options moHideChildren="1" moManualExpandCollapse="1" moDeactivateChildrenAsWell="1"/>
          <Color>8000FF</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{$LUA}
if syntaxcheck then return end

function reMEMR(address,address2,struct,bIncludePointers,bUseStructNames)
--&lt;START&gt;
         if address and struct then
         ---
            local a,s,p,e,m,o
                  a = getAddressList()
                  ---
				  s = a.MouseHighlightedRecord or a.SelectedRecord
                  if not s or s.Type ~= vtAutoAssembler then s = a.createMemoryRecord(); s.Description = 'Structure'; s.IsGroupHeader = true end
                  if s.Async then s.Async = false end
                  s.Options = '[moHideChildren,moManualExpandCollapse]'
                  ---
                  p = a.createMemoryRecord()
                  if address2 then p.Address = address2; p.Description = address2
                  else p.Address = address; p.Description = address end
                  p.IsAddressGroupHeader = true
                  p.DontSave = true
                  p.Options = '[moHideChildren,moManualExpandCollapse]'
                  p.AppendToEntry(s)
                  ---
                  for i=0,struct.Count-1 do
                      ---
                      e = struct.Element[i]
                      if e.Vartype == vtPointer and not bIncludePointers then goto skipcreate
                      else m = a.createMemoryRecord() end
                      ---
                      if not address2 then
                         m.Address = '+0'
                         m.OffsetCount = 1
                         if bUseStructNames and e.Name ~= '' then m.OffsetText[0] = ('%s.%s'):format(struct.Name,e.Name)
                         else m.OffsetText[0] = ('%X'):format(e.Offset) end
                      else
                         if bUseStructNames and e.Name ~= '' then m.Address = ('+%s.%s'):format(struct.Name,e.Name)
                         else m.Address = ('+%X'):format(e.Offset) end
                      end
                      ---
                      m.AppendToEntry(p)
                      if e.Vartype ~= vtPointer then m.Type = e.Vartype
                      else
                              m.Type = vtQword
                              m.ShowAsHex = true
                              m.AppendToEntry(p)

                              if e.ChildStruct and e.ChildStruct ~= struct then
                                 m.IsAddressGroupHeader = true
                                 m.Options = '[moHideChildren,moManualExpandCollapse]'
                                 ---
                                 for n=0,e.ChildStruct.Count-1 do
                                     local mm,ee
                                     ---
                                           mm = a.createMemoryRecord()
                                           ee = e.ChildStruct.Element[n]
                                           ---
                                           if ee.Vartype ~= vtPointer then
                                              mm.Type = ee.Vartype
                                              if ee.Vartype == vtUnicodeString then mm.Type = vtString; mm.String.Unicode = true; m.String.Size = 0x100 end
                                              if ee.Vartype == vtString then mm.Type = vtString; mm.String.Size = 0x100 end
                                           else mm.Type = vtQword; mm.ShowAsHex = true
                                           end
                                           ---
                                           if ee.Name == '' then mm.Description = string.format('[%04X] %s',ee.Offset,mm.VarType)
                                           else mm.Description = string.format('[%04X] %s',ee.Offset,ee.Name) end
                                           mm.Address = '+0'
                                           mm.OffsetCount = 1
                                           mm.Offset[0] = ee.offset
                                           ---
                                           --
                                           mm.AppendToEntry(m)
                                     ---
                                 end
                              end
                              ---
                      end
                      ---
                      if e.Vartype == vtUnicodeString then m.Type = vtString; m.String.Unicode = true; m.String.Size = 0x100 end
                      if e.Vartype == vtString then m.Type = vtString; m.String.Size = 0x100 end
                      if e.Name == "" then m.Description = string.format('[%04X] %s',e.offset,m.VarType)
                      else m.Description = string.format('[%04X] %s',e.offset,e.Name) end
                      ---
                      ::skipcreate::
                  end
            ---
         end
--&lt;END&gt;
end

function reSEMR(address,address2,bStructureOnly,bIncludePointers,bUseStructNames,intAutoGuessSize,bIncludeStatics,bIncludeConstants)
--&lt;START&gt;
         if address then
            local struct = createStructure('stru_' .. string.gsub(address,"[[%]]",""))
                  if monopipe then
                     local class
                     if address2 then class = mono_object_getClass(getAddress(address2))
                     else class = mono_object_getClass(getAddress(('[%s]'):format(address))) end
                     local fields = mono_class_enumFields(class,true)
                     struct.beginUpdate()
                           if fields then
                              --mono_structureDissectOverrideCallback(struct, getAddress(address2))
			                  --using the one above does create structs easily but not reliable
                              ---
                              for i=1,#fields do
                                  local cf    = fields[i]
                                        if not bIncludeStatics and cf.isStatic then goto skip end
                                        if not bIncludeConstants and cf.isConst then goto skip end
                                        local e = struct.addElement()
                                              e.Offset = cf.offset
                                              e.Name   = cf.name
                                              e.Vartype= monoTypeToVarType(cf.monotype)
                                  ::skip::
                              end
                              ---
                           end
                     struct.endUpdate()
                  else
                      if address2 then
                         if intAutoGuessSize then struct.autoGuess(address2,0,intAutoGuessSize)
                         else struct.autoGuess(address2,0,0x1000) end
                      else
                         if intAutoGuessSize then struct.autoGuess(address2,0,intAutoGuessSize)
                         else struct.autoGuess(('[%s]'):format(address),0,0x1000) end
                      end
                  end
            struct.addToGlobalStructureList()
            if not bStructureOnly then reMEMR(address,address2,struct,bIncludePointers,bUseStructNames) end
         end
--&lt;END&gt;
end

function reSEMRize(address,bStructureOnly,bIncludePointers,bUseStructNames,intAutoGuessSize,bIncludeStatics,bIncludeConstants)

--ARGUMENTS:

--address                    = address or symbolname
--bStructureOnly    OPTIONAL = creates structures only
--bIncludePointers  OPTIONAL = Includes pointer addresses in memrec creation
--bUseStructNames   OPTIONAL = Uses structure element names as memrec descriptions
--intAutoGuess      OPTIONAL = Used to specify autoguess range (integer or hex) if mono is not used
--bIncludeStatics   OPTIONAL = Includes static fields in structure creation
--bIncludeConstants OPTIONAL = Includes constant fields in structure creation

--&lt;START&gt;
         if address then
            local c,s,address2
                  if string.find(address,"]") or string.find(address,'0x') then address2 = address end
                  --if address2 then print(address .. ' - ' .. address2) else print(address .. ' - nil') end
                  c = getStructureCount()
                  if c &gt; 0 then
                       for i=0,c-1 do
                           s = getStructure(i)
                           if s.Name == 'stru_' .. string.gsub(address,"[[%]]","") then
                              if not bStructureOnly then
                                 local struct = s
                                 reMEMR(address,address2,struct,bIncludePointers,bUseStructNames)
                                 return
                              end
                              return
                           end
                           if i == c-1 then reSEMR(address,address2,bStructureOnly,bIncludePointers,bUseStructNames,intAutoGuessSize,bIncludeStatics,bIncludeConstants) end
                       end
                  else
                      reSEMR(address,address2,bStructureOnly,bIncludePointers,bUseStructNames,intAutoGuessSize,bIncludeStatics,bIncludeConstants)
                  end
         end
--&lt;END&gt;
end

function reSEMRizer()
---
   local caption1,message1 = 'Input Address',"Input your address / symbolname here (case sensitive, include '0x' prefix for addresses):"
   local input = inputQuery(caption1,message1,0)
   if input then
      local initMemRec = messageDialog("Do you want to create a structure only?\n(This will ignore existing same structure)",mtConfirmation,mbYes,mbNo)
	  if initMemRec == mrYes then
	     reSEMRize(input,true)
		 return
	  end
      local responsa = messageDialog("Do you want to include pointer addresses?",mtConfirmation,mbYes,mbNo)
	  local responsa2 = messageDialog('Do you want to use structure naming?',mtConfirmation,mbYes,mbNo)
	  if initMemRec == mrNo then
	     if responsa == mrYes then 
	        if responsa2 == mrYes then
		       reSEMRize(input,nil,true,true)
		    end
		    if responsa2 == mrNo then
		       reSEMRize(input,nil,true)
		    end
	     end
	     if responsa == mrNo then 
	        if responsa2 == mrYes then
		       reSEMRize(input,nil,nil,true)
		    end
		    if responsa2 == mrNo then
		       reSEMRize(input)
		    end
		 end
	  end
   end
---
end

--retrieves class field offsets
function getClassOffsets(classname,offsetname,namespace)
		 if not namespace then namespace = '' end
         local cid = mono_findClass(namespace,classname)
         local fields = mono_class_enumFields(cid,true)

         for i = 1,#fields do
             if fields[i].name == offsetname then
                return fields[i].offset
             end
         end

end

-- i forgot what this does
function getExStaticFieldAddress(classname,offsetname,namespace)
		 if not namespace then namespace = '' end
         local cid = mono_findClass(namespace,classname)
         local fields = mono_class_enumFields(cid,true)

         for i = 1,#fields do
             if fields[i].name == offsetname then
                return readPointer(cid+0xB8) + fields[i].offset
             end
         end

end

-- retrieves the static field value for a static class field
function getFValues(classname,offsetname,namespace)
		 if not namespace then namespace = '' end
         local cid = mono_findClass(namespace,classname)
         local fields = mono_class_enumFields(cid,true)

         for i = 1,#fields do
             if fields[i].name == offsetname then
                return mono_class_getStaticFieldValue(cid,fields[i].field)
             end
         end
end


-- Retrieves static field address + class field offset
function getSFValues(classname,offsetname,namespace,bNoPointer)
      if not namespace then namespace = '' end
      local cid = mono_findClass(namespace,classname)
      local fields = mono_class_enumFields(cid,true)
      local sfa = mono_class_getStaticFieldAddress('',cid)
      for i=1,#fields do
          if fields[i].name == offsetname then
             if bNoPointer then
                return sfa+fields[i].offset
             else
                return readPointer(sfa+fields[i].offset)
             end
          end
      end
end

function clearStructs()

        local c = getStructureCount()-1
		
		for i = c,0,-1 do
			getStructure(i).removeFromGlobalStructureList()
		end

end

function killChildren()

         local sr = AddressList.MouseHighlightedRecord or AddressList.SelectedRecord
         for i=sr.Count-1,0,-1 do
             memoryrecord_delete(sr.Child[i])
         end

end

{$ASM}
[enable]

{$LUA}
if syntaxcheck then return end

oActorIsPlayer = getClassOffsets('Actor','&lt;IsPlayer&gt;k__BackingField','Wiseguy.Tactical')
oActorIsNPC = getClassOffsets('Actor','&lt;IsNPC&gt;k__BackingField','Wiseguy.Tactical')
oActorCanBeTargeted = getClassOffsets('Actor','&lt;CanBeTargeted&gt;k__BackingField','Wiseguy.Tactical')
oHealthAndArmor = getClassOffsets('Actor','_healthAndArmor','Wiseguy.Tactical')
oActorStress = getClassOffsets('HealthAndArmor','_stress','Wiseguy.Tactical')
oActorHealth = getClassOffsets('HealthAndArmor','_health','Wiseguy.Tactical')

oAbilityActor = getClassOffsets('Ability','actor','Wiseguy.Tactical')
oAbilityCharges = getClassOffsets('Ability','_abilityCharges','Wiseguy.Tactical')
oAbilityCooldown = getClassOffsets('Ability','_cooldown','Wiseguy.Tactical')
oAbilityCooldownLastTimeUsed = getClassOffsets('Ability','abilityCooldownLastRoundUsed','Wiseguy.Tactical')

oFrameworkCurValue = getClassOffsets('ValCurrency','current','Framework.Data')
oFrameworkMaxStat = getClassOffsets('ValCurrency','maxStat','Framework.Data')
oFrameworkMaxStatAttributeName = getClassOffsets('ModifierStacks','&lt;attributeName&gt;k__BackingField','Framework.Data')
oFrameworkMaxStatStacks = getClassOffsets('ModifierStacks','stacks','Framework.Data')
oFrameworkMaxStatStackDCache = getClassOffsets('ModifierStack','dCache','Framework.Data')

vPTGodMode = getExStaticFieldAddress('HealthAndArmor','&lt;PlayerGodMode&gt;k__BackingField','Wiseguy.Tactical')

{$ASM}

alloc(samba,2048)


[disable]

unregistersymbol(*)
dealloc(*)

{$LUA}
if syntaxcheck then return end

oActorIsPlayer = nil
oActorIsNPC = nil
oActorCanBeTargeted = nil
oHealthAndArmor = nil
oActorStress = nil
oActorHealth = nil

oAbilityActor = nil
oAbilityCharges = nil
oAbilityCooldown = nil
oAbilityCooldownLastTimeUsed = nil

oFrameworkCurValue = nil
oFrameworkMaxStat = nil
oFrameworkMaxStatAttributeName = nil
oFrameworkMaxStatStacks = nil
oFrameworkMaxStatStackDCache = nil

vPTGodMode = nil

clearStructs()

</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>19</ID>
              <Description>"Player Team"</Description>
              <Options moHideChildren="1" moManualExpandCollapse="1" moDeactivateChildrenAsWell="1"/>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript>{
  Wiseguy.Tactical.Actor.get_BasicActions
}

[ENABLE]
aobscanregion(aob_getactorinfo,Wiseguy.Tactical.Actor.get_BasicActions,Wiseguy.Tactical.Actor.get_BasicActions+2000,F2xxxxxxxx488Bxxxxxx4883xxxxxxC3)
registersymbol(aob_getactorinfo)
alloc(newmem_getactorinfo,$500)
label(return_getactorinfo)

registersymbol(bkp_getactorinfo)
registersymbol(actorflag)

newmem_getactorinfo:

  // RBX = Actor Base Address

  @@:
  test rdi,rdi
  je cave_getactorinfo
  cmp byte ptr [rdi+$oActorIsPlayer],1
  jne cave_getactorinfo

  check_one: //AP check
  cmp byte ptr [actorflag],1
  jne @f

  push rcx
  sub rcx,rcx
  //mov rcx,bkp_getactorinfo
  mov cl,[bkp_getactorinfo+4]
  fld qword ptr [tempval]
  fstp qword ptr [rax+rcx]
  sub rcx,rcx
  pop rcx

  check_two:  // noEnemyTarget check
  cmp byte ptr [actorflag+4],1
  je @f
  cmp byte ptr [rdi+$oActorCanBeTargeted],1
  je check_three
  mov byte ptr [rdi+$oActorCanBeTargeted],1
  jmp check_three

      @@:
      cmp byte ptr [rdi+$oActorCanBeTargeted],0
      je check_three
      mov byte ptr [rdi+$oActorCanBeTargeted],0

  check_three: // noActorStress check
  cmp byte ptr [actorflag+8],1
  jne check_four

      @@:
      push rcx
      sub rcx,rcx
      mov rcx,[rdi+$oHealthAndArmor]
      test rcx,rcx
      je @f
      mov rcx,[rcx+$oActorStress]
      test rcx,rcx
      je @f
      fldz
      fstp qword ptr [rcx+$oFrameworkCurValue]

      @@:
      sub rcx,rcx
      pop rcx


  check_four: // maxHealth check
  cmp byte ptr [actorflag+C],1
  jne check_five

      @@:
      push rcx
      sub rcx,rcx
      mov rcx,[rdi+$oHealthAndArmor]
      test rcx,rcx
      je c5end

      mov rcx,[rcx+$oActorHealth]
      test rcx,rcx
      je c5end

      push rbx
      push rax
      push rdx
      sub rbx,rbx
      sub rax,rax
      sub rdx,rdx

      lea rbx,[rcx+$oFrameworkCurValue]  // RBX = address of currentHealth
      mov rcx,[rcx+$oFrameworkMaxStat]
      test rcx,rcx
      je @f

      mov rax,[rcx+$oFrameworkMaxStatAttributeName]
      test rax,rax
      je @f

      cmp byte ptr [rax+14],'M'
      jne @f
      cmp byte ptr [rax+16],'a'
      jne @f
      cmp byte ptr [rax+18],'x'
      jne @f
      cmp byte ptr [rax+1A],'H'
      jne @f
      cmp byte ptr [rax+1C],'e'
      jne @f
      cmp byte ptr [rax+1E],'a'
      jne @f
      cmp byte ptr [rax+20],'l'
      jne @f
      cmp byte ptr [rax+22],'t'
      jne @f
      cmp byte ptr [rax+24],'h'
      jne @f

      mov rcx,[rcx+$oFrameworkMaxStatStacks]
      test rcx,rcx
      je @f
      cmp dword ptr [rcx+18],0 // count
      jle @f

      mov rdx,[rcx+30] // third instance MaxHealthMultiplier
      test rdx,rdx
      je @f

      sub rax,rax
      mov rax,[rcx+28] // second instance MaxHealthOffsetter
      test rax,rax
      je @f

      mov rcx,[rcx+20] // first instance MaxHealthBase
      test rcx,rcx
      je @f

      fld qword ptr [rcx+oFrameworkMaxStatStackDCache] // MaxHealthBase
      fadd qword ptr [rax+oFrameworkMaxStatStackDCache]   // MaxHealthOffsetter
      fmul qword ptr [rdx+oFrameworkMaxStatStackDCache] // MaxHealthMultiplier
      fstp qword ptr [rbx]
      //fstp qword ptr [rbx]

      @@:
      sub rdx,rdx
      sub rax,rax
      sub rbx,rbx
      pop rdx
      pop rax
      pop rbx

      c5end:
      sub rcx,rcx
      pop rcx

  check_five:


  cave_getactorinfo:
  readmem(aob_getactorinfo,14)
  {
  cvttsd2si eax,[rax+20]
  mov rbx,[rsp+30]
  add rsp,20
  }
  jmp return_getactorinfo

  align 10, CC

  tempval:
  dq (double)99999

  actorflag:
  dd 0      // MAX AP Check
  dd 0      // No Enemy Target Check
  dd 0      // No Actor Stress Check
  dd 0      // Max Health Check

  align 10,CC

  bkp_getactorinfo:
  readmem(aob_getactorinfo,14)

aob_getactorinfo:
  jmp far newmem_getactorinfo
  return_getactorinfo:

[DISABLE]
aob_getactorinfo:
  readmem(bkp_getactorinfo,14)

unregistersymbol(*)
dealloc(*)

{
// ORIGINAL CODE - INJECTION POINT: GameAssembly.dll+32834F2
}
</AssemblerScript>
              <CheatEntries>
                <CheatEntry>
                  <ID>29</ID>
                  <Description>"God Mode"</Description>
                  <Options moHideChildren="1" moManualExpandCollapse="1" moDeactivateChildrenAsWell="1"/>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]
$vPTGodMode:
db 01

[disable]
$vPTGodMode:
db 00
</AssemblerScript>
                  <CheatEntries>
                    <CheatEntry>
                      <ID>40</ID>
                      <Description>"Easy Kills (requires God Mode for now)"</Description>
                      <VariableType>Auto Assembler Script</VariableType>
                      <AssemblerScript Async="1">[ENABLE]
aobscanregion(aob_ohktest,Framework.Data.ValCurrency.Spend,Framework.Data.ValCurrency.Spend+2000,F2xxxxxxxx0F29xxxxxxF2xxxxxxxx83)
registersymbol(aob_ohktest bkp_ohktest)
alloc(newmem_ohktest,$100,aob_ohktest)
label(return_ohktest bkp_ohktest)

newmem_ohktest:

  test rbx,rbx
  je cave_ohktest

  stt:
  push rdx
  push rcx
  sub rdx,rdx
  sub rcx,rcx

{$try}
  @@:
  cmp r9d,0x7F
  jne nnd
  cmp r10d,0xD
  je nnd
  {mov rdx,[rbx+A8]
  test rdx,rdx
  je nnd
  mov rdx,[rdx+600]
  test rdx,rdx
  je nnd}
  //cmp dword ptr [rdx+8],1 // 1- enemy, 0- player?
  //jne nnd

  fld qword ptr [tempval]
  fstp qword ptr [rax+10]
  jmp nnd

{$except}
  nnd:
  sub rcx,rcx
  sub rdx,rdx
  pop rcx
  pop rdx

  cave_ohktest:
  readmem(aob_ohktest,15)
  {
  movsd xmm6,[rdi+20]
  movaps [rsp+20],xmm7
  movsd xmm7,[rax+10]
  }
  jmp return_ohktest

  align 10,CC

  tempval:
  dq (double)Inf

  align 10,CC

  bkp_ohktest:
  readmem(aob_ohktest,15)

aob_ohktest:
  jmp far newmem_ohktest
  nop
  return_ohktest:

[DISABLE]
aob_ohktest:
  readmem(bkp_ohktest,15)

unregistersymbol(*)
dealloc(*)

{
// ORIGINAL CODE - INJECTION POINT: GameAssembly.dll+5AFB0D
}
</AssemblerScript>
                    </CheatEntry>
                  </CheatEntries>
                </CheatEntry>
                <CheatEntry>
                  <ID>32</ID>
                  <Description>"Max Health"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]
actorflag+C:
db 01

[disable]
actorflag+C:
db 00
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>30</ID>
                  <Description>"Max Ammo"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>{
  GameAssembly.dll+5B1AAE
}
[ENABLE]
aobscanregion(aob_actorweapon,Framework.Data.ValCurrency.get_IsFull,Framework.Data.ValCurrency.get_IsFull+2000,F2xxxxxxxx4885xx74xx488Bxx488Bxxxxxxxxxx488BxxxxxxxxxxFFxxF2xxxxxx66)
registersymbol(aob_actorweapon bkp_actorweapon)
alloc(newmem_actorweapon,$200)
label(return_actorweapon)

newmem_actorweapon:
  push rdx
  push rax
  push rcx

  sub rdx,rdx
  sub rax,rax
  sub rcx,rcx

  // maxStat
  mov rdx,[rbx+$oFrameworkMaxStat]
  test rdx,rdx
  je @f

  // attribute name check
  mov rax,[rdx+$oFrameworkMaxStatAttributeName]
  test rax,rax
  je @f

  cmp byte ptr [rax+14],'M'
  jne @f
  cmp byte ptr [rax+16],'a'
  jne @f
  cmp byte ptr [rax+18],'x'
  jne @f
  cmp byte ptr [rax+1A],'A'
  jne @f
  cmp byte ptr [rax+1C],'m'
  jne @f
  cmp byte ptr [rax+1E],'m'
  jne @f
  cmp byte ptr [rax+20],'o'
  jne @f

  // stacks
  mov rdx,[rdx+$oFrameworkMaxStatStacks]
  test rdx,rdx
  je @f

  // Count
  cmp [rdx+18],0
  jle @f

  mov rdx,[rdx+20]
  fld qword ptr [rdx+oFrameworkMaxStatStackDCache]
  fstp qword ptr [rbx+$oFrameworkCurValue]

  @@:
  sub rcx,rcx
  sub rax,rax
  sub rdx,rdx
  pop rcx
  pop rax
  pop rdx

  cave_actorweapon:
  readmem(aob_actorweapon,8)
  reassemble(aob_actorweapon+8)
  reassemble(aob_actorweapon+A)
  reassemble(aob_actorweapon+D)
  {
  movsd xmm6,[rbx+20]
  test rcx,rcx
  je GameAssembly.dll+5B1AE5
  mov rdx,[rcx]
  mov rax,[rdx+1F8]
  }
  jmp return_actorweapon

  align 10,CC

  bkp_actorweapon:
  readmem(aob_actorweapon,20)

aob_actorweapon:
  jmp far newmem_actorweapon
  db 90 90 90 90 90 90
return_actorweapon:

[DISABLE]
aob_actorweapon:
  readmem(bkp_actorweapon,20)

unregistersymbol(*)
dealloc(*)
{
// ORIGINAL CODE - INJECTION POINT: GameAssembly.dll+5B1AAE
}
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>27</ID>
                  <Description>"Max Action Points"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]
actorflag:
db 01

[disable]
actorflag:
db 00
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>38</ID>
                  <Description>"Max Ability Charges"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[ENABLE]
aobscanregion(aob_maxcharges,Wiseguy.Tactical.Ability.get_Charges,Wiseguy.Tactical.Ability.get_Charges+2000,4889xxxxxx574883xxxx80xxxxxxxxxxxx488Bxx75xx488DxxxxxxxxxxE8xxxxxxxxC6xxxxxxxxxxxx488Bxxxxxxxxxx4533xx33xxE8xxxxxxxx84xx74xx488Bxxxxxxxxxx4533xx488BxxE8xxxxxxxx488Bxx4889xxxxxxxxxx488DxxxxxxxxxxE8xxxxxxxx488Bxxxxxxxxxx488Bxxxxxx4883xxxx5FC3xxxxxxxxxxxxxxxx0FB6)

registersymbol(aob_maxcharges bkp_maxcharges)
alloc(newmem_maxcharges,$200)
label(return_maxcharges)

newmem_maxcharges:

  test rcx,rcx
  je cave_maxcharges

  stt:
  push rdx
  push rax
  sub rdx,rdx
  sub rax,rax

  @@:
  mov rdx,[rcx+$oAbilityActor]        // actor
  test rdx,rdx
  je nnd

  @@:
  cmp byte ptr [rdx+$oActorIsPlayer],1   // isPlayer bool
  jne nnd
  sub rdx,rdx

  mov rdx,[rcx+$oAbilityCharges]      // _abilityCharges
  lea rax,[rdx+$oFrameworkCurValue]   // currentValue address

  fld qword ptr [tempval]
  fstp qword ptr [rax]

  nnd:
  sub rax,rax
  sub rdx,rdx
  pop rax
  pop rdx

  cave_maxcharges:
  readmem(aob_maxcharges,10)
  reassemble(aob_maxcharges+A)
  {
  mov [rsp+08],rbx
  push rdi
  sub rsp,20
  cmp byte ptr [GameAssembly.dll+47E5CA7],00
  }
  jmp return_maxcharges

  align 10,CC

  bkp_maxcharges:
  readmem(aob_maxcharges,17)

  align 10,CC

  tempval:
  dq (double)999

aob_maxcharges:
  jmp newmem_maxcharges
  db 90 90 90
  return_maxcharges:

[DISABLE]
aob_maxcharges:
  readmem(bkp_maxcharges,17)

unregistersymbol(*)
dealloc(*)

{
// ORIGINAL CODE - INJECTION POINT: Wiseguy.Tactical.Ability.get_Charges
}
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>31</ID>
                  <Description>"No Stress"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]
actorflag+8:
db 01

[disable]
actorflag+8:
db 00
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>28</ID>
                  <Description>"Enemy Won't Target"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]
actorflag+4:
db 01

[disable]
actorflag+4:
db 00
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>39</ID>
                  <Description>"No AI Detection (Realtime Mode)"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>define(address,"Wiseguy.AI.RealTimeAIUpdateManager.Update")
define(bytes,40 53 48 83 EC 30)

[enable]
address:
mov al,1
ret
nop
db 90 90

[disable]
address:
db bytes

</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>43</ID>
                  <Description>"No Ability Cooldown Turns"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript Async="1">define(address,"Wiseguy.Tactical.Ability.get_CooldownTurnsRemaining")

[ENABLE]
alloc(newmem,$200)

label(code)
label(return)

label(bkp_noabilitycooldown)
registersymbol(bkp_noabilitycooldown)

newmem:

  test rcx,rcx
  je code

  stt:
  push rbx
  sub rbx,rbx

{$try}
  @@:
  mov rbx,[rcx+$oAbilityActor]  // actor
  test rbx,rbx
  je nnd
  @@:
  cmp byte ptr [rbx+$oActorIsPlayer],1
  jne nnd
  sub rbx,rbx
  @@:
  cmp dword ptr [rcx+$oAbilityCooldownLastTimeUsed],0
  jle nnd
  mov dword ptr [rcx+$oAbilityCooldownLastTimeUsed],0
  jmp nnd

{$except}
  nnd:
  sub rbx,rbx
  pop rbx

  code:
  readmem(address,10)
  {mov [rsp+10],rbx
  push rdi
  sub rsp,20}
  reassemble(address+A)
  // cmp byte ptr [GameAssembly.dll+ 47E5CA4],00
  jmp return

  align 10,CC

  bkp_noabilitycooldown:
  readmem(address,17)

address:
  jmp far newmem
  db 90 90 90
return:

[DISABLE]

address:
  readmem(bkp_noabilitycooldown,17)

unregistersymbol(*)
dealloc(*)

{
// ORIGINAL CODE - INJECTION POINT: Wiseguy.Tactical.Ability.get_CooldownTurnsRemaining
}
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>46</ID>
                  <Description>"Free Card Upgrades"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]

// Step 1 - Bypass Ink Requirement Check
// Step 2 - Bypass Ink Price Confirmation Check
// Step 3 - Intercept Item (e.g Ink) Price and set to zero
// Step 4 (Optional) - Set Ink Price Display to Zero [Visual only]

aobscanregion(aob_cardup1,Wiseguy.Metagame.MetagameUpgradeCardManager.CanInkUpgrade,Wiseguy.Metagame.MetagameUpgradeCardManager.CanInkUpgrade+2000,3Bxxxxxxxx488Bxxxxxx0Fxxxxxxxxxxxx5BC332)
aobscanregion(aob_cardup2,Wiseguy.Metagame.MetagameUpgradeCardManager.DoInkUpgrade,Wiseguy.Metagame.MetagameUpgradeCardManager.DoInkUpgrade+2000,0F9Exx4022xx74)
aobscanregion(aob_cardup3,Wiseguy.Metagame.TeamInventory.SpendItems,Wiseguy.Metagame.TeamInventory.SpendItems+2000,488Bxx8Bxx488Bxx4CxxxxxxxxxxxxFFxxxxxxxxxx488BxxxxxxxxxxE8)
aobscanregion(aob_cardupvisual,Wiseguy.UI.UICardLargeController.ShowPreview,Wiseguy.UI.UICardLargeController.ShowPreview+2000,8Bxxxxxxxxxx488Dxxxxxx33xx89xxxxxxE8xxxxxxxx488Bxx4885xx74xx488Bxx488Bxx488BxxxxE8xxxxxxxx4885xx0F84xxxxxxxx83xxxxxx0F86xxxxxxxx488Dxxxx488Bxx4889xxE8xxxxxxxx4533xx488Bxx488B)

alloc(cave_cardup,$300)

//registersymbol(aob_cardup3)
registersymbol(bkp_cardup1 bkp_cardup2 bkp_cardup3 bkp_cardupvisual)

/////---

cave_cardup:

  bkp_cardup1:
  readmem(aob_cardup1,2)

  align 10,CC

  bkp_cardup2:
  readmem(aob_cardup2,3)

  align 10,CC

  bkp_cardup3:
  readmem(aob_cardup3,15)

  align 10,CC

  bkp_cardupvisual:
  readmem(aob_cardupvisual,17)

  align 10,CC

  newmem_cardup3:

    @@:
    sub edi,edi

    code_cardup3:
    readmem(aob_cardup3,15)
    {mov rax,[rbx]
    mov edx,edi --&gt; EDI stores the price, but EDX will be used as temp value
    mov rcx,rbx
    mov r8,[rax+000001D0}
    jmp return_cardup3

  align 10,CC

  newmem_cardupvisual:

    @@:
    sub eax,eax

    code_cardupvisual:
    //readmem(aob_cardupvisual,6)
    reassemble(aob_cardupvisual+6)
    reassemble(aob_cardupvisual+B)
    reassemble(aob_cardupvisual+D)
    {//mov eax,[rsi+000000C0]
    lea rcx,[rsp+48]
    xor edx,edx
    mov [rsp+48],eax}
    jmp return_cardupvisual


/////---

aob_cardup1:
  db 39 C0
  // cmp eax,eax

aob_cardup2:
  db B0 01 90
  {mov al, 1
  nop}

aob_cardup3:
  jmp far newmem_cardup3
  db 90
return_cardup3:

aob_cardupvisual:
  jmp far newmem_cardupvisual
  db 90 90 90
return_cardupvisual:

[disable]
aob_cardup1:
  readmem(bkp_cardup1,2)

aob_cardup2:
  readmem(bkp_cardup2,3)

aob_cardup3:
  readmem(bkp_cardup3,15)

aob_cardupvisual:
  readmem(bkp_cardupvisual,17)

unregistersymbol(*)
dealloc(*)
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>36</ID>
                  <Description>"Ignore Recipe / Skill Requirements and Costs (refresh Supplier tab)"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[enable]
aobscanmodule(aob_freerecipecost,GameAssembly.dll,448Bxxxx4533xx488Bxx488Bxxxxxx4883xxxx5FE9xxxxxxxx488B)
registersymbol(aob_freerecipecost bkp_freerecipecost)
alloc(bkp_freerecipecost,4)

bkp_freerecipecost:
readmem(aob_freerecipecost,4)

aob_freerecipecost:
xor r8d,r8d
nop

Wiseguy.Metagame.Recipe.CanAfford:
mov al,1
ret
db 90 90


[disable]
aob_freerecipecost:
readmem(bkp_freerecipecost,4)

Wiseguy.Metagame.Recipe.CanAfford:
db 48 89 5C 24 08

unregistersymbol(*)
dealloc(*)
</AssemblerScript>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
