<?xml version="1.0" encoding="utf-8"?>
<CheatTable UsesMono="1" CheatEngineTableVersion="52">
  <CheatEntries>
    <CheatEntry NoCheckbox="1">
      <ID>1337263245</ID>
      <Description>"Es necesario tener Cheat Engine actualizado a una version 7.5 o superior"</Description>
      <Color>804000</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263246</ID>
      <Description>"y ejecutarlo como Administrador para que la tabla funcione correctamente."</Description>
      <Color>804000</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263247</ID>
      <Description>"------------------------------------------------------------------------------"</Description>
      <Color>FF0080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263259</ID>
      <Description>"You need to have Cheat Engine updated to version 7.5 or higher"</Description>
      <Color>804000</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263260</ID>
      <Description>"and run it as Administrator for the table to function correctly."</Description>
      <Color>804000</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263261</ID>
      <Description>"------------------------------------------------------------------------------"</Description>
      <Color>FF0080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263248</ID>
      <Description>"TABLA CREADA POR ALBERTO47"</Description>
      <Color>FF0080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry NoCheckbox="1">
      <ID>1337263249</ID>
      <Description>"------------------------------------------------------------------------------"</Description>
      <Color>800080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>20</ID>
      <Description>"F2 - Activar proceso (Activar y esperar 3 segundos para pulsar F3) - Activate process"</Description>
      <Options moHideChildren="1"/>
      <Color>0000FF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
local process = 'Echoes.exe'
OpenProcess(process)
if syntaxcheck then return end
if process and readInteger(process) ~= 0 then
  mono_initialize()
  LaunchMonoDataCollector()
  local timeout = 0
  while (monopipe == nil or monopipe.Connected == false) and timeout &lt; 2000 do
    sleep(10)
    timeout = timeout + 10
  end
  if monopipe == nil or monopipe.Connected == false then
    error('Error: Mono data collector pipe timeout.')
  end
  if memrec then
    synchronize(function()
      for i = 0, memrec.Count - 1 do
        memrec.Child[i].Active = true
      end
    end)
  end
else
  error('Error: No active process detected.')
end


--Set Window Title
local title = "Echoes of Mystralia(39903502) 18.10.2026 - Alberto47"
if not((MainForm.Caption):match("Echoes")) then
MainForm.Caption = title..' ~ '..MainForm.Caption
end
{$asm}

[DISABLE]
{$lua}
if syntaxcheck then return end
if memrec then
  synchronize(function()
    for i = 0, memrec.Count - 1 do
      memrec.Child[i].Active = false
    end
  end)
end
{$asm}
</AssemblerScript>
      <Hotkeys>
        <Hotkey>
          <Action>Toggle Activation</Action>
          <Keys>
            <Key>113</Key>
          </Keys>
          <Description>F1 - Activar proceso</Description>
          <ID>0</ID>
          <ActivateSound>Activate</ActivateSound>
          <DeactivateSound>Deactivate</DeactivateSound>
        </Hotkey>
      </Hotkeys>
    </CheatEntry>
    <CheatEntry>
      <ID>0</ID>
      <Description>"F3 - Activar punteros  - Activate pointers"</Description>
      <Options moHideChildren="1"/>
      <Color>0000FF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : Echoes.exe
  Version: 
  Date   : 2026-10-19
  Author : alber
  Description : 

  &lt;Optional info&gt;
}

[ENABLE]

aobscanmodule(god,GameAssembly.dll,48 8B 81 F8 00 00 00 48 8B 48 50 48 85 C9) // should be unique
alloc(newmem,$1000,god)
alloc(p_god,8)

label(code)
label(return)

newmem:
  mov [p_god],rcx
code:
  mov rax,[rcx+000000F8]
  jmp return

god:
  jmp newmem
  nop 2
return:
registersymbol(god)
registersymbol(p_god)
[DISABLE]

god:
  db 48 8B 81 F8 00 00 00

unregistersymbol(god)
unregistersymbol(p_god)
dealloc(newmem)
dealloc(p_god)
{
// ORIGINAL CODE - INJECTION POINT: GameAssembly.dll+9D82E1

GameAssembly.dll+9D82CB: CC                    - int 3 
GameAssembly.dll+9D82CC: CC                    - int 3 
GameAssembly.dll+9D82CD: CC                    - int 3 
GameAssembly.dll+9D82CE: CC                    - int 3 
GameAssembly.dll+9D82CF: CC                    - int 3 
BorealysGames.Dungeons.Troupes.Player.GetControllerType: 40 53                 - push rbx
GameAssembly.dll+9D82D2: 48 83 EC 20           - sub rsp,20
GameAssembly.dll+9D82D6: 33 DB                 - xor ebx,ebx
GameAssembly.dll+9D82D8: 48 39 99 F8 00 00 00  - cmp [rcx+000000F8],rbx
GameAssembly.dll+9D82DF: 74 4C                 - je GameAssembly.dll+9D832D
// ---------- INJECTING HERE ----------
GameAssembly.dll+9D82E1: 48 8B 81 F8 00 00 00  - mov rax,[rcx+000000F8]
// ---------- DONE INJECTING  ----------
GameAssembly.dll+9D82E8: 48 8B 48 50           - mov rcx,[rax+50]
GameAssembly.dll+9D82EC: 48 85 C9              - test rcx,rcx
GameAssembly.dll+9D82EF: 74 44                 - je GameAssembly.dll+9D8335
GameAssembly.dll+9D82F1: 33 D2                 - xor edx,edx
GameAssembly.dll+9D82F3: 48 89 7C 24 30        - mov [rsp+30],rdi
GameAssembly.dll+9D82F8: E8 13 1D 08 02        - call ControllerHelper.GetLastActiveController
GameAssembly.dll+9D82FD: 48 8B F8              - mov rdi,rax
GameAssembly.dll+9D8300: 48 85 C0              - test rax,rax
GameAssembly.dll+9D8303: 74 1B                 - je GameAssembly.dll+9D8320
GameAssembly.dll+9D8305: 33 D2                 - xor edx,edx
}
</AssemblerScript>
      <Hotkeys>
        <Hotkey>
          <Action>Toggle Activation</Action>
          <Keys>
            <Key>114</Key>
          </Keys>
          <ID>0</ID>
          <ActivateSound>Activate</ActivateSound>
          <DeactivateSound>Deactivate</DeactivateSound>
        </Hotkey>
      </Hotkeys>
      <CheatEntries>
        <CheatEntry>
          <ID>12</ID>
          <Description>"F4 Vida y Escudo infinito / Life &amp; Shield infinite"</Description>
          <Options moHideChildren="1" moActivateChildrenAsWell="1" moDeactivateChildrenAsWell="1"/>
          <Color>0080FF</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Echoes.exe
  Version:
  Date   : 2026-10-19
  Author : alber
  Description :

  &lt;Optional info&gt;
}

[ENABLE]

aobscanmodule(escudo,GameAssembly.dll,29 79 34 48 8B 4B 20 48 85 C9 74 ** 48 8B 41 18) // should be unique
alloc(newmem,$1000,escudo)

label(code)
label(return)
label(cleanup)

newmem:
  push rax                // Guardamos registros para no alterar el juego
  push rbx
  push rdx                // Usaremos rdx como contenedor temporal del valor de 4 bytes

  // 1. Cargamos la dirección base de p_god
  mov rax, [p_god]
  test rax, rax
  je cleanup

  // 2. LEER desde [p_god + 100 + 30]
  mov rbx, [rax+100]      // Puntero intermedio de la ruta 100
  test rbx, rbx
  je cleanup
  mov edx, [rbx+30]       // Leemos el valor de 4 bytes y lo guardamos en edx

  // 3. ESCRIBIR en [p_god + 80 + 30] y [p_god + 80 + 34]
  mov rbx, [rax+80]       // Puntero intermedio de la ruta 80
  test rbx, rbx
  je cleanup

  mov [rbx+30], edx       // Asignamos el valor leído al destino +30
  mov dword ptr [rbx+34], (int)1000 // Asignamos 1000 (4 bytes) al destino +34

cleanup:
  pop rdx
  pop rbx
  pop rax                 // Restauramos los registros

code:
  //sub [rcx+34],edi
  mov rcx,[rbx+20]
  jmp return

escudo:
  jmp newmem
  nop 2
return:
registersymbol(escudo)

[DISABLE]

escudo:
  db 29 79 34 48 8B 4B 20

unregistersymbol(escudo)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: GameAssembly.dll+A18AFA

GameAssembly.dll+A18AD6: 0F 5B C0           - cvtdq2ps xmm0,xmm0
GameAssembly.dll+A18AD9: 0F 2F C1           - comiss xmm0,xmm1
GameAssembly.dll+A18ADC: 41 0F 97 C7        - seta r15b
GameAssembly.dll+A18AE0: 45 84 F6           - test r14b,r14b
GameAssembly.dll+A18AE3: 0F 85 C5 00 00 00  - jne GameAssembly.dll+A18BAE
GameAssembly.dll+A18AE9: 85 FF              - test edi,edi
GameAssembly.dll+A18AEB: 7E 5B              - jle GameAssembly.dll+A18B48
GameAssembly.dll+A18AED: 48 8B 4B 78        - mov rcx,[rbx+78]
GameAssembly.dll+A18AF1: 48 85 C9           - test rcx,rcx
GameAssembly.dll+A18AF4: 0F 84 41 01 00 00  - je GameAssembly.dll+A18C3B
// ---------- INJECTING HERE ----------
GameAssembly.dll+A18AFA: 29 79 34           - sub [rcx+34],edi
// ---------- DONE INJECTING  ----------
GameAssembly.dll+A18AFD: 48 8B 4B 20        - mov rcx,[rbx+20]
GameAssembly.dll+A18B01: 48 85 C9           - test rcx,rcx
GameAssembly.dll+A18B04: 74 0E              - je GameAssembly.dll+A18B14
GameAssembly.dll+A18B06: 48 8B 41 18        - mov rax,[rcx+18]
GameAssembly.dll+A18B0A: 48 8B 51 28        - mov rdx,[rcx+28]
GameAssembly.dll+A18B0E: 48 8B 49 40        - mov rcx,[rcx+40]
GameAssembly.dll+A18B12: FF D0              - call rax
GameAssembly.dll+A18B14: 48 8B 4B 50        - mov rcx,[rbx+50]
GameAssembly.dll+A18B18: 48 85 C9           - test rcx,rcx
GameAssembly.dll+A18B1B: 74 2B              - je GameAssembly.dll+A18B48
}
</AssemblerScript>
          <Hotkeys>
            <Hotkey>
              <Action>Toggle Activation</Action>
              <Keys>
                <Key>115</Key>
              </Keys>
              <ID>0</ID>
              <ActivateSound TTS="EN">Infinite Shield Activated</ActivateSound>
              <DeactivateSound TTS="EN">Infinite Shield Deactivated</DeactivateSound>
            </Hotkey>
          </Hotkeys>
          <CheatEntries>
            <CheatEntry NoCheckbox="1">
              <ID>2</ID>
              <Description>"Vida / Life"</Description>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+80</Address>
              <Offsets>
                <Offset>30</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry NoCheckbox="1" ValueOnActivate="1000" RestoreOnDeactivate="1">
              <ID>3</ID>
              <Description>"Escudo / Shield"</Description>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+80</Address>
              <Offsets>
                <Offset>34</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry ValueOnActivate="1" ValueOnDeactivate="0">
          <ID>4</ID>
          <Description>"El inventario no disminuye / Inventory not decrease"</Description>
          <DropDownList ReadOnly="1" DescriptionOnly="1" DisplayValueAsItem="1">0:No
1:Si/Yes
</DropDownList>
          <VariableType>Byte</VariableType>
          <Address>[p_god]+C8</Address>
          <Offsets>
            <Offset>30</Offset>
            <Offset>38</Offset>
          </Offsets>
          <CheatEntries>
            <CheatEntry>
              <ID>7</ID>
              <Description>"Perlas del Alma / Soulbead"</Description>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+C8</Address>
              <Offsets>
                <Offset>20</Offset>
                <Offset>20</Offset>
                <Offset>10</Offset>
                <Offset>28</Offset>
                <Offset>38</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>8</ID>
              <Description>"Sabiduria Eterna / Eternal Wisdom"</Description>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+C8</Address>
              <Offsets>
                <Offset>20</Offset>
                <Offset>28</Offset>
                <Offset>10</Offset>
                <Offset>28</Offset>
                <Offset>38</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>9</ID>
              <Description>"Eco Restaurado / Mended Echo"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+C8</Address>
              <Offsets>
                <Offset>20</Offset>
                <Offset>30</Offset>
                <Offset>10</Offset>
                <Offset>28</Offset>
                <Offset>38</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>10</ID>
              <Description>"Fragmento de Eco / Echo Fragment"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+C8</Address>
              <Offsets>
                <Offset>20</Offset>
                <Offset>60</Offset>
                <Offset>10</Offset>
                <Offset>28</Offset>
                <Offset>38</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>11</ID>
              <Description>"Leccion Ancestral / Ancient Lesson"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <VariableType>4 Bytes</VariableType>
              <Address>[p_god]+C8</Address>
              <Offsets>
                <Offset>20</Offset>
                <Offset>40</Offset>
                <Offset>10</Offset>
                <Offset>28</Offset>
                <Offset>38</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
  <LuaScript>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().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; addCompactMenu(); cycleFullCompact(nil,true)

function setTheme(c, cb, cap) local mf=getMainForm(); local al=getAddressList(); mf.Color=c; mf.Foundlist3.Color=c; al.Control[0].BackgroundColor=c; AddressList.CheckboxColor=cb; themeMenu.Caption='Theme: '..cap; end; function addThemeMenu() if thememenuexists then return end; local m=getMainForm().Menu.Items; themeMenu=createMenuItem(m); m.add(themeMenu); themeMenu.Caption='Theme'; local function addSub(n,f) local s=createMenuItem(themeMenu); s.Caption=n; s.OnClick=f; themeMenu.add(s) end; addSub('Dark Mode', function() setTheme(0x000000, 0x0000FF, 'Dark') end); addSub('Light Mode', function() setTheme(0xFFFFFF, 0x000000, 'Light') end); addSub('Default', function() setTheme(clDefault, clDefault, 'Default') end); thememenuexists='yes' end; addThemeMenu();




</LuaScript>
</CheatTable>
