<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="46">
  <Files>
    <File Name="cemono.lua" Encoding="Ascii85">*mi@/,qM$luPM-f.Qhq8uaLCJs-5==p;CC{P11)}OIpmqHXz6XTB2;CvLuLfQg2xP[T3#RijtkYY}2qViq]h:c.ETCBm4eepM5r87m3Qsf-Quas)PKMbuC[R(iG3BQsGBf3-$Imc;IVlE}TiIuQpY*7^swBRh//JFC3iIby-i=$.V10N}Ej,h5;EN%Y@4lCgr,NEbiz!LYhxp+{P#nWFw{QqChHR@Ri{HJPOU}aLm(3?uNK{mPGZ$]WcDb)@82Vp{^PUnKs:h+h3A#Q/RF4r$ooE;$,%Ui)HC@lrd4HC;uWPU$a)Z]Qt}l^P;ZLEKk$ZvM8--%+VjUiYFpuNe*2.(lFc#LZ7t=Svj9O--IGxhQmULR5Dev8CbIhQwp{=?Q,(7f}OJtQRF#nDe=[#v]dy{9_TK*L5bD]l%xfPY[=WRW/]P#$*w%M*;25uA.:1;fHkgI6h$Uc+SuyN9EZ.,6_=n1hpmEAP].NHr)oBFc}PWFT[3*tos,445JZv3hT47Nqi.bIThKsNW,N5c,CpPc4z#GZbQii;Ze#FRbTT=[RJg=;K4wzMUJ02}ptUshNqN!(AGkG(23ONJ1J__APA6]IHbLINgao#GQ16)E9G%*Q,V=pKY;Tdu-TGA;.bt(v1+La2(x)]=PU([0YS=3vW:?7NN-vQKct{Y7q-P*$.n_dERsqt^YXk+/a8?!cXAVa:ZH,%LCkaoCJ%;)_H3Dd#R]wKuU%iTU)!^jSvROLL0JakK=ix)VQgOude8!Uxek)3C^yW=CLIh^]y!;BY(UkKBeFy$*z)QDX4HU)jOysEzJK1z4iuFp/^f=T4I?J@qhG;sqfyEjqu.9lpELs5Beub6M3xghpE^OWy7Y=X4g2E?)bb^8s.Sf@M(?Qq_O6zURylbAX#nqM9*X1KDj81anc@kcxT(#o![]SV]D_+-1/+Lv(cK9?6ZyAC-J@L}[*kOm)Jm)14(KYebb$;=?@RCXOo-RN}=,+_YKp5lAIea{Y4eh)K^IISrT.0fnOP9v3EjMG,(bC*/!uI]aI1aurd15.)IcSMc)N*ejr$Q}u6qdYHO_wNI)zk@Y3sI9p(?Zml?l9E$eY330n0=i:;-9znnf-$Lo/DzX#Y[ocbzvB(Va$Gc[/7Mg=rWCVDJil$n(cemA#TSO7kpBmpal{;F1U@2uYgqqGqZ)6YcRYQR}:Zr8(!8/^}w1Sy]wC_bk[uBdYEU_y]YIjJ1*[zL9Q8ED},hG?IJWpC2Kr2R.d[ld6lNMkaEiBE[Vdeg3eqsZhWg3^C?_}mqI(nsI54*ou,{maS!@.G{uQRf*%7VO:+kKVi3sg)vM(eQ:JKET5m!KSOd(eDP:ax1:==X,s=32+$KPh,Q!k:*wb6-DBVW03){hXVL.vEy%Vf@e195TZ3O-tl3CP35qH).JqYH]^r5pwD*Lu)yIJ}w*fEW*m$=CjqtIM}bWnO%pQskA?;.y9%herV;_9/t#sg5Cml!)?]9Ay)@J3w,z^3Pvju)2Ku@86rE/l*y%y21$eKTxC6kV:6FUX6*krjvfe;#Fw47[j,[^j?[,YVHW=[f4OsO/?7PoWv!,NR254}6m8pU(}-.eid5[Fx7Jd=ME}KMS,^v8j6WYK9_0)o1r)onqbb?T_Yt3H?46?.1G%Q=QobXmSvn5:sj2Bp4v1k)I#wxWtPel-9-gGDJnewvoC9PV1v)hQOZ,nYd{pbrl-XZId:+X@lb3Bj7j%IrZjyk-#YNdUFh7;a0Qytw:{/ZqT.{2*,I;;L4CeIlw3O2n,@0^eI$wj3jJb(2GSAxF*aa:%[ghfz9EH%(EzoD;!RH3F1UAFYJ}f8)%)j:6F=AK,.FV304SIh{rsw1nr+35c^6f]eRYlF]y.fYlIbx(8m?U=^nKNb],ZTmm{x)rag@]37Q?c,[+LUD5*bSfOd,HOxwaPab[D0Fq]ZkO6{7N#8Q0pxA)kjpH@twxo%3@jHb)2#]nAy1mde2Mq)gLm+veXsYh?i/D0[,OHc1/N;9M8*C4qyK2!(PpS,I$a9,[@bb^?)yJBz0EqvH8cNbrU7^7qM9Cc:]Z5jXf7Sy=;JRlhu1uYFL::BDraq6f(jHd+xh=Bm]hA}Vqhb_%j6N==mpC{bE12{GDOfB_Y^B]I=s=$o!RRu[TrG?)V)PHA:-hZNvomb+!z4K6/71un@Qf626E3y3/4{OL[Pc2Sl!d*Sg1vc%$i$Mr}0:LsX:vL,*lJ3Q?nO2})i5ADByY7N+UdvR+y+rkUpX_OFk{9)Sl[=H]KIwX5s4vHNX?l)*SiRmHTp};X,S+LOy;P-[Ley-qfO5#LC2L/E@+cI?L]JQC;oFyz#UMzSReSZZ?8kxFKtU5}%{T=Htr%y!^u/Ecot[LBJ3O;z!z[5^8EehMJy0hw0wznRlH7..rrP@DX.{,$(wsz;DHU,vhVkDo;xDau^i?g2MTKvLxcJ,y5vwUtrx;ACz2_]DyvCBexbTDM;HhGGZ!Uhmq*QA@r7mSJg6p0U/_j1XI:d%W$$k:!4I.WV.yuMT@Je6A4VOFIqz,gF(i]t3#%r9e;BZ0le;hw!RmsV-XE!%D5u@/obFs)?5kVZD!M644+;xsvR9R)7R4uD-s]$(V_1/vb.NW*</File>
  </Files>
  <CheatEntries>
    <CheatEntry>
      <ID>0</ID>
      <Description>"Enable"</Description>
      <Options moHideChildren="1"/>
      <Color>008000</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then return end

local cev = getCEVersion()
local cevm = '\n(Your CE Version: '.. cev ..')'

if cev == nil or cev &lt; 7.1 then
  local msg = 'Please update!\nIts required to use at least Cheat Engine 7.1! '..cevm
  messageDialog(msg, mtError, mbOK)
  return --yeah, no going forward here!
else if cev &lt; 7.5 then
  local msg = 'Update recommended!\nTable checked to work on public Cheat Engine 7.5 &amp; 7.6!'..cevm
  messageDialog(msg, mtWarning, mbOK)
  -- getting latest online version is possible but I don't want to add online checks! Activate in CE settings or
  -- https://www.cheatengine.org/forum/viewtopic.php?t=610628 or check manually ... whatever floats your boat
end end

var = var or {}
--- you may change the next 4 variables as you see fit
var.pn1 = 'Furry Titty 2.exe' -- string - primary name of the exe to attach
var.pn2 = 'Sex and the Furry Titty 3' -- string/nil - another possible name if provided
var.stopquery = true -- bool/nil - true to stop AAT after attaching / false continues ATT / nil queries
var.dbg = var.force or false -- bool - true for debug prints
--- dont change these lines or attaching/few functions wont work!
var.force = var.force or false --bool - true will preven value override
var.stopthread = false -- bool - true will stop autoAttachThread

if var.dbg then print(cevm) end

local function getProcID() -- returns ID or nil for predefines names
  --local dtg = {'pn1','pn2','dbg'}
  --local pn1,pn2,dbg = getlocdef(dtg)
  local pn1,pn2,dbg = var.pn1,var.pn2,var.dbg
  if dbg then print("gPID - start - ",pn1,pn2,dbg) end
  if not pn1 then print('ProcessID - no process name given/defined') error("PID failed") return end

  local pn = pn1
  local pid = getProcessIDFromProcessName(pn)
    --- check if the process name matches, else try workarounds
  if not pid then
    if dbg then print("gPID - pid not found, trying workarounds") end
    if pn2 then
      pn = pn2
      pid = getProcessIDFromProcessName(pn)
      else pn2 = '' end
    if not pid then
      local pn1s = pn1:match("(%w+)") --get first word
      local pn2s = pn2:match("(%w+)")
      local sname = ''
      for _,v in pairs(getProcesslist()) do --go through process list, we just need values
        sname = v:match("(%w+)")
        if sname == pn1s or sname == pn2s then --check if name matches
          ---print('attaching to: ',v) --v still has full process name
          ---strings_add(getAutoAttachList(), v)
          pn = v
          break
      end end
      pid = getProcessIDFromProcessName(pn)
  end end
  if dbg then print("gPID - end") end
  return pid,pn
  --pn[0], pn[1] = process:match("(%w+)(.+)") --get first word (and the rest) or (\w+)$ for the last word
  --print(pn[0], pn[1], tostring(pn[0] ~= 'name1' and pn[0] ~= 'name1'))
end

local autoAttachThread = function(th)
  --th.freeOnTerminate(true)
  if not th then print('AutoAttachThead - error creating the thread') error("Thread failed") return end
  --local dbg = getlocdef({'dbg'})
  local dbg = var.dbg
  if dbg then print('aat - AutoAttachThead start',i,Interval) end
  local Interval = 1000
  local laststate = nil

  for i=1,36000 do -- start timed loop, always with conditions to stop!
    if th.Terminated then return end
    if var.stopthread then th.terminate() return end
    local openid = getOpenedProcessID() --get current IDs
    local pid,pn = getProcID()
    local attach = nil

    if pid == nil then -- process not running, speed up
      if laststate~=0 then
        unsetSaP() disableMono() detach()
        print('Waiting for the process to come up')
      end
      if dbg then print('aat - Still waiting',i,Interval) end
      Interval,laststate = 1000,0
    else
      if openid and openid == pid then -- opened process already the correct one
        if laststate ~=1 and laststate ~=2 then attach = true end
        Interval,laststate = 15000,1
      else
        if openid ~= pid then -- process is running, attach it
          openProcess(pid)
          if laststate ~=2 then attach = true end
          laststate = 2
        else
          print('aat - Cant be, you found a loop-hole!',openid,pid,tostring(laststate),tostring(attach))
      end end
      if dbg then print('aat - pn:',pn,'oid/pid:',openid,pid,'state:',laststate,'i/int:',i,Interval,'q:',tostring(attach)) end
      if attach then
        local conAtt = var.stopquery and 7
        local msg = pn.." attached."
        print(msg)
        if var.stopquery==nil then
          msg = msg.."\nDo you want auto-attaching to silently continue?"
          conAtt = messageDialog(msg,mtConfirmation, mbYes, mbNo)
        end
        -- inputQuery('Some caption','some prompt','y')
        checkmono()--synchronize()
        if conAtt == 7 then
          if dbg then print('aat - Stopping the attach function') end
          th.terminate()
          return
        else print("Continuing to watch and attach if game closes/crashes.\nNote: you may cancle with: var.stopthread = true")
      end end
      if dbg then print('aat - Still there',i,Interval,tostring(conAtt)) end
    end
    sleep(Interval)
  end
end
--https://forum.cheatengine.org/viewtopic.php?t=579133
--https://github.com/cheat-engine/cheat-engine/issues/1093
--closeRemoteHandle()

function checkmono()
  --local dbg = getlocdef({'dbg'}) --get debug value
  local dbg = var.dbg
  if dbg then print("cm - start") end

  --code to check proc name moved to autoAttachThread
  print('Checking if game is loaded/mono is working ...')
  local addr = getAddressSafe('SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount')
  while not addr and not var.stopthread do --repeat ----wait till game is loaded
    disableMono()
    local monoresult = LaunchMonoDataCollector()
    if monoresult == 0 then
      local msg = 'Process found, but mono could not be launched. Probably newer CE Version needed.'
      print(msg)
      switchActiveMR(0) error("Mono failed") return
    else
      if dbg then print("Mono:",monoresult) end
    end
    if switchActiveMR(0,true) then --"Enable" script,activate it - returns if it did neeed to activate
      local msg = "Seems game is yet not fully loaded but CE (mono bug?) did disable the script. Got you covered and 'll retry. (Alt get/compile CE 7.5.2+)"
      print(msg)
      return
    end
    if not addr then sleep(1000) end --checkSynchronize(1000)
    addr = getAddressSafe('SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount') --monoSymbolList.FullyLoaded il2cpp
    if dbg then print('cm - Waiting for the game to fully load',tostring(addr)) end
  end --until (addr or var.stopthread)
  if dbg then print("cm - end") end
  addStructForOffsets()
end

function addStructForOffsets()
  local dbg = var.dbg
  if dbg then print("struct - start") end
  local s = findTableFile('cemono.lua').Stream
  local ls,le = load(readStringLocal(s.Memory,s.Size))
  if dbg then print(tostring(s),s.Memory,s.Size,tostring(ls),le) end
  --local ok, cem = pcall(ls)
  ls()

  -- clean Structures and Pointer
  if unsetSaP() then switchActiveMR(0) return end
  -- define the structures for offsets to get
  --[[local funcs = {{'','',true,2,0x1C,16}, -- NS/class/static fields/loop-start/start-offset/loop-offset
                 {'','',true,1,0x1C,16}, -- static fields are needed for enums
                 {'','MainGameScript',false}}

  -- if anything fails reasonaibly stop here. We only need the value, not key
  for _,v in ipairs(funcs) do
    if synchronize(addMonoStructure,unpack(v)) then switchActiveMR(0) return end
  end
  --if AppendStructChilds('BaseItems','EItems_SF') then switchActiveMR(0) return end]]

  local gmstart = monoStaticF('','GameController') --this gets the important starting addr
  if dbg then print("struct - gmstart:",tostring(gmstart)) end

  local shift=1
  if targetIs64Bit() then shift=33 end
  if not gmstart or (gmstart &gt;&gt; shift) &lt;= 0 then
    print('Error, could not get GlobalObjects. The table wont work!') switchActiveMR(0) return
  else
    unregisterSymbol("pgmstart")
    registerSymbol("pgmstart", gmstart, false)
    autoAssemble([[
    alloc(gmalloc,1024,pgmstart)
    registersymbol(gmalloc)
    ]])
  end

  if dbg then print("struct - end") end
  print('Done - you may start using the table now!')
end

function cycleFullCompact(sender,force)
	local state = not(compactmenuitem.Caption == 'Compact View Mode')
	if force~=nil then state = not force end
	compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'
	getMainForm().Splitter1.Visible = state
	getMainForm().Panel4.Visible    = state
	getMainForm().Panel5.Visible    = state
end

function addCompactMenu()
	if compactmenualreadyexists then return end
	local parent = getMainForm().Menu.Items
	compactmenuitem = createMenuItem(parent)
	parent.add(compactmenuitem)
	compactmenuitem.Caption = 'Compact View Mode'
	compactmenuitem.OnClick = cycleFullCompact
	compactmenualreadyexists = 'yes'
end

function switchActiveMR(idn,enable) ---expects an ID or name / bool to activate the MR instead disable
  local mr = nil
  if type(idn)=="number" then
    mr = getAddressList().getMemoryRecordByID(idn)
  else if type(idn)=="string" then
    mr = getAddressList().getMemoryRecordByDescription(idn)
  end end
  if var.dbg then print("swtichActive: trying with mr "..idn) end
  if not mr then print('swtichActive: MR renamed or wrong ID?',idn) error("Wrong MR") else
    if enable then
      if  mr.Active == false then
        mr.Active = true
        return true
      end
    else
      mr.Active = false
  end end
  return nil --returns either true if activated or nil
end

function disableMono()
  if cev == 7.6 then print("With CE 7.6 I experienced freezes of mono. If so, restart CE.") else
    if type(monopipe)=='userdata'then
      if monopipe.OnTimeout then
        if var.dbg then print("mono - OnTimeout") end
        monopipe.OnTimeout()
      else
        if var.dbg then print("mono - Destroy") end
        monopipe=nil,monopipe.Destroy()
      end
    else if var.dbg then print('monotype: '..type(monopipe)) end end end
  print("mono - finished")
end

function unsetSaP()
  local gmstart = getAddressSafe("pgmstart")

  if delAllStructures then delAllStructures() end
  --sr = removeMrChilds('BaseItems') --no need to if I can disable the script and the Populate * [DISABLE] parts takes care
  if gmstart then
    unregisterSymbol("pgmstart")
    if var.dbg then print("Structures and symbol removed") end
  end
  if var.dbg then print("unset-pgmstart:",tostring(gmstart)) end
end

function detach()
  openProcess("cheatengine*") --yeah if you rename CE, then you should be able to solve things yourself
  MainForm.ProcessLabel.Caption=0
  if var.dbg then print("detached process") end
end

var.aant = createThread(autoAttachThread)
--checkprocess()
--addStructForOffsets()
addCompactMenu()
cycleFullCompact(nil,true)


{$asm}
[DISABLE]

dealloc(gmalloc)
unregistersymbol(gmalloc)

{$lua}
if syntaxcheck then return end

if var.dbg then print("disabling script (main incl subs)") end

cycleFullCompact(nil,false)

--if var.aant.Terminated==false then var.aant.terminate() end
var.stopthread = true

--ignore returns, just execute what's possible
unsetSaP()
disableMono()
detach()
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>1</ID>
          <Description>"Set Boosters (check boost inbetween?)"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Furry Titty 2.exe
  Version: 
  Date   : 2023-12-18
  Author : Nironan

  Sets booster counts to fixed value
  injection rax/rcx=player, +c sets GameController
}

[ENABLE]

aobscanregion(aobBossters,SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+20,SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+60,83 38 00 66 66 90 49) // should be unique
alloc(newmem,$1000,aobBossters)
registersymbol(aobBossters)

label(code)
label(return)

newmem:
  mov rax,qword ptr [rax+30] //boostersById
  mov rax,qword ptr [rax+18] //entries
  mov dword ptr [rax+30],(int)666 //5 Moves
  mov dword ptr [rax+48],(int)666 //Free moves
  mov dword ptr [rax+60],(int)666 //Bomb
  mov dword ptr [rax+78],(int)666 //Needle

code:
// useless code
//  cmp dword ptr [rax],00
//  nop 3
  jmp return

aobBossters:
  jmp newmem
  nop
return:

[DISABLE]

aobBossters:
  db 83 38 00 66 66 90

unregistersymbol(aobBossters)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+28

SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount: 55                             - push rbp
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+1: 48 8B EC                       - mov rbp,rsp
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+4: 48 83 EC 30                    - sub rsp,30
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+8: 48 89 4D F8                    - mov [rbp-08],rcx
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+c: 48 B8 00 36 B1 30 63 01 00 00  - mov rax,0000016330B13600
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+16: 48 8B 00                       - mov rax,[rax]
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+19: 48 8B 40 70                    - mov rax,[rax+70]
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+1d: 48 8B 4D F8                    - mov rcx,[rbp-08]
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+21: 48 63 51 60                    - movsxd  rdx,dword ptr [rcx+60]
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+25: 48 8B C8                       - mov rcx,rax
// ---------- INJECTING HERE ----------
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+28: 83 38 00                       - cmp dword ptr [rax],00
// ---------- DONE INJECTING  ----------
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+2b: 66 66 90                       - nop 3
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+2e: 49 BB 30 C1 3C 6C 65 01 00 00  - mov r11,Player:getBooster
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+38: 41 FF D3                       - call r11
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+3b: 48 8D 65 00                    - lea rsp,[rbp+00]
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+3f: 5D                             - pop rbp
SweetSugar.Scripts.GUI.Boost.BoostIcon:BoostCount+40: C3                             - ret 
1656C3CC0F1: 00 00                          - add [rax],al
1656C3CC0F3: 00 00                          - add [rax],al
1656C3CC0F5: 00 00                          - add [rax],al
1656C3CC0F7: 00 01                          - add [rcx],al
}
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>2</ID>
          <Description>"Enable Dev Consolve via key (default: v)"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Furry Titty 2.exe
  Version:
  Date   : 2024-03-13
  Author : Nironan

  Enable Dev Consolve by calling a function
}

define(addrDev,GameController:Update)
define(bytes,48 83 EC 08 48 83 C4 08)

[ENABLE]
assert(addrDev,bytes)

//aobscan(aobEnableDev,ERROR: Could not find unique AOB, tried code "48 83 EC 08 48 83 C4 08") // should be unique
alloc(EnableDev,$100,addrDev)
registersymbol(EnableDev)

EnableDev:
  dq 0
  dq #118 //v
EnableDev+10:
//  sub rsp,08
//  add rsp,08
  push rbp
  cmp byte ptr [EnableDev],01 //check if the console should be opened
  jne short @f
  mov byte ptr [EnableDev],00
  mov r11,GameController:showDevView
  call r11
@@:
  lea rsp,[rbp+00]
  pop rbp
  jmp return

addrDev:
  jmp EnableDev+10
  nop 3
return:

[DISABLE]

addrDev:
  db bytes

dealloc(EnableDev)

{
// ORIGINAL CODE - INJECTION POINT: GameController:Update

115AD4D093B: 00 00        - add [rax],al
115AD4D093D: 00 00        - add [rax],al
115AD4D093F: 00 01        - add [rcx],al
115AD4D0941: 04 01        - add al,01
115AD4D0943: 00 04 02     - add [rdx+rax],al
115AD4D0946: 00 00        - add [rax],al
115AD4D0948: 00 00        - add [rax],al
115AD4D094A: 00 00        - add [rax],al
115AD4D094C: 00 00        - add [rax],al
115AD4D094E: 00 00        - add [rax],al
// ---------- INJECTING HERE ----------
GameController:Update: 48 83 EC 08  - sub rsp,08
// ---------- DONE INJECTING  ----------
GameController:Update+4: 48 83 C4 08  - add rsp,08
GameController:Update+8: C3           - ret
115AD4D0959: 00 00        - add [rax],al
115AD4D095B: 00 00        - add [rax],al
115AD4D095D: 00 00        - add [rax],al
115AD4D095F: 00 01        - add [rcx],al
115AD4D0961: 04 01        - add al,01
115AD4D0963: 00 04 02     - add [rdx+rax],al
115AD4D0966: 00 00        - add [rax],al
115AD4D0968: 00 00        - add [rax],al
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>3</ID>
              <Description>"Open dev console (CTRL+H to change key)"</Description>
              <DropDownList DisplayValueAsItem="1">0: No
1: Yes
</DropDownList>
              <ShowAsSigned>0</ShowAsSigned>
              <VariableType>Byte</VariableType>
              <Address>EnableDev</Address>
              <Hotkeys>
                <Hotkey>
                  <Action>Set Value</Action>
                  <Keys>
                    <Key>86</Key>
                  </Keys>
                  <Value>1</Value>
                  <ID>4</ID>
                </Hotkey>
              </Hotkeys>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>4</ID>
      <Description>"Print debug infos to report (on errors)"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then return end

if not var then
  print("Try enable first please")
else
  local gmstart = tostring(getAddressSafe("gmstart") or nil)
  local monopt
  if monopipe then monopt = tostring(monopipe.OnTimeout) else monopt='nil' end
  print(getCEVersion(),process,' p/m:',gmstart,monopt)

  var.force = true
  switchActiveMR(0)
  switchActiveMR(0,true)
end

{$asm}

[DISABLE]
{$lua}
var.force = false
switchActiveMR(0)
</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
