<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="46">
  <CheatEntries>
    <CheatEntry>
      <ID>287</ID>
      <Description>"Toggle Compact View"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then return end

if not toggleCompactView then
    function toggleCompactView(sender, forceEnable)
        local isCompactMode = not (compactViewMenuItem.Caption == 'Compact View Mode')
        if forceEnable ~= nil then
            isCompactMode = not forceEnable
        end

        synchronize(function()
            compactViewMenuItem.Caption = isCompactMode and 'Compact View Mode' or 'Full View Mode'
            getMainForm().Splitter1.Visible = isCompactMode
            getMainForm().Panel4.Visible    = isCompactMode
            getMainForm().Panel5.Visible    = isCompactMode
        end)
    end
end

if not createCompactViewMenu then
    function createCompactViewMenu()
        if isCompactMenuCreated then return end

        synchronize(function()
            local mainMenu = getMainForm().Menu.Items
            compactViewMenuItem = createMenuItem(mainMenu)
            compactViewMenuItem.Caption = 'Compact View Mode'
            compactViewMenuItem.OnClick = toggleCompactView
            mainMenu.add(compactViewMenuItem)
        end)

        isCompactMenuCreated = true
    end
end

createCompactViewMenu()
toggleCompactView(nil, true)

[DISABLE]
{$lua}
if toggleCompactView then
    toggleCompactView(nil, false)
end
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>293</ID>
      <Description>"Toggle scripts"</Description>
      <Color>4080FF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript Async="1">[ENABLE]
{$lua}
if (syntaxcheck) then return end
-- attach process
local processName = "FFT_enhanced.exe"
local pid = getProcessIDFromProcessName(processName)
if pid ~= nil and pid &gt; 0 then
  local currentPid = getOpenedProcessID() or 0
  if currentPid ~= pid then
    openProcess(processName)
    print("Attached to: " .. processName)
    Sleep(333)
  else
    print("Already attached to: " .. processName)
  end
end

synchronize(function()
  getLuaEngine().menuItem5.doClick()
  getLuaEngine().Close()
end)

local enableBattleScripts = {

--[[
-- attach process
local processName = "game_exe.exe"
local pid = getProcessIDFromProcessName(processName)
if pid ~= nil and pid &gt; 0 then
  local currentPid = getOpenedProcessID() or 0
  if currentPid ~= pid then
    openProcess(processName)
    print("Attached to: " .. processName)
    Sleep(333)
  else
    print("Already attached to: " .. processName)
  end
end
synchronize(function()
  getLuaEngine().Close()
end)
--]]

  6, -- "Battle: selected char (LT or click)"
  15, -- "Battle: player side HP/MP/XP/Others"
  26, -- "Map: Status menu: get JP list"
  287, -- "Toggle Compact View"
  288, -- "Browse &amp; set item amount (non-equipped)"
  24, -- "Battle: JP XP multiplier"
  302, -- "Battle: XP multiplier"
  305, -- "Battle: keep min brave/faith after action"
  646, -- "Battle: set min jmp/mov/spd/atk..."
  654, -- "Battle: damage multiplier"
}
local addressList = getAddressList()
synchronize(function()
  for _, id in ipairs(enableBattleScripts) do
    local memRec = addressList.getMemoryRecordByID(id)
    if memRec and not memRec.Active then
      memRec.Active = true
      sleep(30)
    end
    addressList.refresh()
  end
end)
synchronize(function() getLuaEngine().Close() end)
[DISABLE]
{$lua}
if (syntaxcheck) then return end
synchronize(function()
  getLuaEngine().menuItem5.doClick()
  getLuaEngine().Close()
end)

local disableBattleScripts = {
  654, -- "Battle: damage multiplier"
  646, -- "Battle: set min jmp/mov/spd/atk..."
  630, -- "Attributes+"
  628, -- "Loc+"
  627, -- "Base stats+"
  626, -- "JP+"
  305, -- "Battle: keep min brave/faith after action"
  302, -- "Battle: XP multiplier"
  289, -- "item count must &gt;="
  29, -- "Generate list"
  28, -- "+List (do not delete this)"
  24, -- "Battle: JP XP multiplier"
  288, -- "Browse &amp; set item amount (non-equipped)"
  287, -- "Toggle Compact View"
  26, -- "Map: Status menu: get JP list"
  15, -- "Battle: player side HP/MP/XP/Others"
  6, -- "Battle: selected char (LT or click)"
}
local addressList = getAddressList()
synchronize(function()
  for _, id in ipairs(disableBattleScripts) do
    local memRec = addressList.getMemoryRecordByID(id)
    if memRec and memRec.Active then
      memRec.Active = false
      sleep(30)
    end
    addressList.refresh()
  end
end)
synchronize(function() getLuaEngine().Close() end)
-- Comments:
-- ID: 287, Description: "Toggle Compact View", Depth: 0
-- ID: 6, Description: "Battle: selected char (LT or click)", Depth: 0
--   ID: 627, Description: "Base stats+", Depth: 1
--   ID: 630, Description: "Attributes+", Depth: 1
--   ID: 628, Description: "Loc+", Depth: 1
--   ID: 626, Description: "JP+", Depth: 1
-- ID: 15, Description: "Battle: player side HP/MP/XP/Others", Depth: 0
--   ID: 302, Description: "Battle: XP multiplier", Depth: 1
--   ID: 24, Description: "Battle: JP XP multiplier", Depth: 1
--   ID: 305, Description: "Battle: keep min brave/faith after action", Depth: 1
--   ID: 654, Description: "Battle: damage multiplier", Depth: 1
--   ID: 646, Description: "Battle: set min jmp/mov/spd/atk...", Depth: 1
-- ID: 288, Description: "Browse &amp; set item amount (non-equipped)", Depth: 0
--   ID: 289, Description: "item count must &gt;=", Depth: 1
-- ID: 26, Description: "Map: Status menu: get JP list", Depth: 0
--   ID: 29, Description: "Generate list", Depth: 1
--   ID: 28, Description: "+List (do not delete this)", Depth: 1

</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>6</ID>
      <Description>"Battle: selected char (LT or click)"</Description>
      <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_BATT_SELECTED_CHAR,FFT_enhanced.exe,0F B7 41 30 66 89 42 0C ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 64) // should be unique
alloc(newmem,$1000,INJECT_BATT_SELECTED_CHAR)

label(code)
label(return)
label(i_batt_base_sel_char_addr)

newmem:
  mov [i_batt_base_sel_char_addr], rcx

code:
  movzx eax,word ptr [rcx+30]
  mov [rdx+0C],ax
  jmp return
align 10 cc
  i_batt_base_sel_char_addr:
  dq 0

INJECT_BATT_SELECTED_CHAR:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_BATT_SELECTED_CHAR)
registersymbol(i_batt_base_sel_char_addr)

[DISABLE]

INJECT_BATT_SELECTED_CHAR:
  db 0F B7 41 30 66 89 42 0C

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+21305C

FFT_enhanced.exe+213036: B8 03 00 00 00  - mov eax,00000003
FFT_enhanced.exe+21303B: 66 89 42 02     - mov [rdx+02],ax
FFT_enhanced.exe+21303F: 0F B6 41 28     - movzx eax,byte ptr [rcx+28]
FFT_enhanced.exe+213043: 66 89 42 08     - mov [rdx+08],ax
FFT_enhanced.exe+213047: 0F B7 41 32     - movzx eax,word ptr [rcx+32]
FFT_enhanced.exe+21304B: 66 89 42 10     - mov [rdx+10],ax
FFT_enhanced.exe+21304F: 66 85 C0        - test ax,ax
FFT_enhanced.exe+213052: 75 08           - jne FFT_enhanced.exe+21305C
FFT_enhanced.exe+213054: 41 0F B7 C7     - movzx eax,r15w
FFT_enhanced.exe+213058: 66 89 42 10     - mov [rdx+10],ax
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+21305C: 0F B7 41 30     - movzx eax,word ptr [rcx+30]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+213060: 66 89 42 0C     - mov [rdx+0C],ax
FFT_enhanced.exe+213064: 66 44 89 72 0E  - mov [rdx+0E],r14w
FFT_enhanced.exe+213069: 0F B7 41 36     - movzx eax,word ptr [rcx+36]
FFT_enhanced.exe+21306D: 66 89 42 16     - mov [rdx+16],ax
FFT_enhanced.exe+213071: 66 85 C0        - test ax,ax
FFT_enhanced.exe+213074: 75 08           - jne FFT_enhanced.exe+21307E
FFT_enhanced.exe+213076: 41 0F B7 C7     - movzx eax,r15w
FFT_enhanced.exe+21307A: 66 89 42 16     - mov [rdx+16],ax
FFT_enhanced.exe+21307E: 0F B7 41 34     - movzx eax,word ptr [rcx+34]
FFT_enhanced.exe+213082: BE 64 00 00 00  - mov esi,00000064
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>8</ID>
          <Description>"base"</Description>
          <ShowAsHex>1</ShowAsHex>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>808080</Color>
          <VariableType>8 Bytes</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>7</ID>
          <Description>"Side ID"</Description>
          <DropDownList DisplayValueAsItem="1">0:Player side?
</DropDownList>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>4</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>9</ID>
          <Description>"EXP"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>28</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>297</ID>
          <Description>"Lv"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>29</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>627</ID>
          <Description>"Base stats+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>298</ID>
              <Description>"Max Brave"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>2A</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>299</ID>
              <Description>"Brave"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>2B</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>300</ID>
              <Description>"Max Faith"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>2C</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>301</ID>
              <Description>"Faith"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>2D</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>296</ID>
              <Description>"HP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>30</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>10</ID>
              <Description>"Max HP"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>32</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>11</ID>
              <Description>"MP"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>34</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>12</ID>
              <Description>"Max MP"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>36</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>630</ID>
          <Description>"Attributes+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>629</ID>
              <Description>"Phys atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>3E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>642</ID>
              <Description>"Magic atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>3F</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>643</ID>
              <Description>"Spd"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>40</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>644</ID>
              <Description>"Mov"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>42</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>645</ID>
              <Description>"Jmp"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>43</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>641</ID>
              <Description>"Right hand atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>44</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>631</ID>
              <Description>"Left hand atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>45</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>632</ID>
              <Description>"Right hand guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>46</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>634</ID>
              <Description>"Left hand guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>47</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>633</ID>
              <Description>"Shield phys guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>49</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>639</ID>
              <Description>"Shield phys guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>4A</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>637</ID>
              <Description>"Shield magic guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>4D</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>640</ID>
              <Description>"Shield magic guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>4E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>635</ID>
              <Description>"Cloak phys guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>48</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>638</ID>
              <Description>"Cloak magic guard%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>4C</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>636</ID>
              <Description>"Phys dodge%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>4B</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>628</ID>
          <Description>"Loc+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>19</ID>
              <Description>"X"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>4F</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>20</ID>
              <Description>"Y"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>50</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>21</ID>
              <Description>"Direction"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>51</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>626</ID>
          <Description>"JP+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>22</ID>
              <Description>"JP EXP 1"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>11E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>605</ID>
              <Description>"JP EXP 2"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>120</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>606</ID>
              <Description>"JP EXP 3"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>122</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>607</ID>
              <Description>"JP EXP 4"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>124</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>608</ID>
              <Description>"JP EXP 5"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>126</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>609</ID>
              <Description>"JP EXP 6"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>128</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>610</ID>
              <Description>"JP EXP 7"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>12A</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>611</ID>
              <Description>"JP EXP 8"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>12C</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>612</ID>
              <Description>"JP EXP 9"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>12E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>613</ID>
              <Description>"JP EXP 10"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>130</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>614</ID>
              <Description>"JP EXP 11"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>132</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>615</ID>
              <Description>"JP EXP 12"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>134</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>616</ID>
              <Description>"JP EXP 13"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>136</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>617</ID>
              <Description>"JP EXP 14"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>138</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>618</ID>
              <Description>"JP EXP 15"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>13A</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>619</ID>
              <Description>"JP EXP 16"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>13C</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>620</ID>
              <Description>"JP EXP 17"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>13E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>621</ID>
              <Description>"JP EXP 18"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>140</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>622</ID>
              <Description>"JP EXP 19"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>142</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>623</ID>
              <Description>"JP EXP"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>144</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>624</ID>
              <Description>"JP EXP"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>146</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>625</ID>
              <Description>"JP EXP"</Description>
              <DropDownListLink>HP</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>148</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>14</ID>
              <Description>"JP 1"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>F0</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>584</ID>
              <Description>"JP 2"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>F2</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>585</ID>
              <Description>"JP 3 (knight)"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>F4</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>586</ID>
              <Description>"JP 4"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>F6</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>587</ID>
              <Description>"JP 5"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>F8</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>588</ID>
              <Description>"JP 6"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>FA</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>589</ID>
              <Description>"JP 7"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>FC</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>590</ID>
              <Description>"JP 8"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>FE</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>591</ID>
              <Description>"JP 9"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>100</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>592</ID>
              <Description>"JP 10"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>102</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>593</ID>
              <Description>"JP 11"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>104</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>594</ID>
              <Description>"JP 12"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>106</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>595</ID>
              <Description>"JP 13"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>108</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>596</ID>
              <Description>"JP 14"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>10A</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>597</ID>
              <Description>"JP 15"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>10C</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>598</ID>
              <Description>"JP 16"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>10E</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>599</ID>
              <Description>"JP 17"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>110</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>600</ID>
              <Description>"JP 18"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>112</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>601</ID>
              <Description>"JP 19"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>114</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>602</ID>
              <Description>"JP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>116</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>603</ID>
              <Description>"JP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>118</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>604</ID>
              <Description>"JP"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>11A</Offset>
              </Offsets>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>13</ID>
          <Description>"CT (not for current one)"</Description>
          <DropDownListLink>HP</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>41</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>15</ID>
      <Description>"Battle: player side HP/MP/XP/Others"</Description>
      <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_BATT_GET_ALL_CHARS,FFT_enhanced.exe,45 0F B7 57 30) // should be unique
alloc(newmem,$1000,INJECT_BATT_GET_ALL_CHARS)

label(code)
label(return)
label(i_base_batt_chars_data ib_player_group vf_player_side_hp_min vf_player_side_mp_min)

newmem:
  push rax
  mov al, [ib_player_group]
  cmp [r15+4], al
  jne endp

check_hp:
  movzx eax, word ptr [r15+32]
  movzx r10d, word ptr [r15+30]
  vmovss xmm14, [vf_player_side_hp_min]
  vcvtsi2ss xmm15, xmm15, eax
  vmulss xmm13, xmm14, xmm15
  vcvtsi2ss xmm15, xmm15, r10d
  vucomiss xmm15, xmm13
  jae check_mp

  vcvtss2si eax, xmm13
  mov [r15+30], ax

check_mp:
  movzx eax, word ptr [r15+36]
  movzx r10d, word ptr [r15+34]
  vmovss xmm14, [vf_player_side_mp_min]
  vcvtsi2ss xmm15, xmm15, eax
  vmulss xmm13, xmm14, xmm15
  vcvtsi2ss xmm15, xmm15, r10d
  vucomiss xmm15, xmm13
  jae endp

  vcvtss2si eax, xmm13
  mov [r15+34], ax

endp:
  pop rax

code:
  movzx r10d,word ptr [r15+30]
  jmp return
align 10 cc
  vf_player_side_hp_min:
  dd (float)0.7
  vf_player_side_mp_min:
  dd (float)0.75
  ib_player_group:
  db 0
  align 10 cc
  i_base_batt_chars_data:
  dq 0
  align 100 0
  db 0
  align 100 0
  db 0
  align 100 0
  db 0
  align 100 0
  db 0

INJECT_BATT_GET_ALL_CHARS:
  jmp newmem
return:
registersymbol(INJECT_BATT_GET_ALL_CHARS)
registersymbol(i_base_batt_chars_data ib_player_group vf_player_side_hp_min vf_player_side_mp_min)

[DISABLE]

INJECT_BATT_GET_ALL_CHARS:
  db 45 0F B7 57 30

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+2021D0

FFT_enhanced.exe+2021A6: 75 07                    - jne FFT_enhanced.exe+2021AF
FFT_enhanced.exe+2021A8: 45 85 F6                 - test r14d,r14d
FFT_enhanced.exe+2021AB: 75 02                    - jne FFT_enhanced.exe+2021AF
FFT_enhanced.exe+2021AD: B3 01                    - mov bl,01
FFT_enhanced.exe+2021AF: 41 8B 8F FC 01 00 00     - mov ecx,[r15+000001FC]
FFT_enhanced.exe+2021B6: 49 8D 97 4C 01 00 00     - lea rdx,[r15+0000014C]
FFT_enhanced.exe+2021BD: E8 66 45 FE FF           - call FFT_enhanced.exe+1E6728
FFT_enhanced.exe+2021C2: 41 0F B6 4F 06           - movzx ecx,byte ptr [r15+06]
FFT_enhanced.exe+2021C7: 49 8D 57 66              - lea rdx,[r15+66]
FFT_enhanced.exe+2021CB: 45 0F B7 47 32           - movzx r8d,word ptr [r15+32]
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+2021D0: 45 0F B7 57 30           - movzx r10d,word ptr [r15+30]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+2021D5: 44 8B 8C 24 B0 00 00 00  - mov r9d,[rsp+000000B0]
FFT_enhanced.exe+2021DD: 88 9C 24 90 00 00 00     - mov [rsp+00000090],bl
FFT_enhanced.exe+2021E4: 89 8C 24 88 00 00 00     - mov [rsp+00000088],ecx
FFT_enhanced.exe+2021EB: 49 8D 4F 61              - lea rcx,[r15+61]
FFT_enhanced.exe+2021EF: 48 89 94 24 80 00 00 00  - mov [rsp+00000080],rdx
FFT_enhanced.exe+2021F7: 8B 94 24 B8 00 00 00     - mov edx,[rsp+000000B8]
FFT_enhanced.exe+2021FE: 48 89 4C 24 78           - mov [rsp+78],rcx
FFT_enhanced.exe+202203: 48 8D 0D A6 1F AD 03     - lea rcx,[FFT_enhanced.exe+3CD41B0]
FFT_enhanced.exe+20220A: 48 89 4C 24 70           - mov [rsp+70],rcx
FFT_enhanced.exe+20220F: 8B 8C 24 A0 00 00 00     - mov ecx,[rsp+000000A0]
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>307</ID>
          <Description>"Not god mode"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>16</ID>
          <Description>"Player side ID"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>ib_player_group</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>17</ID>
          <Description>"min. HP ratio"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Float</VariableType>
          <Address>vf_player_side_hp_min</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>18</ID>
          <Description>"min. MP ratio"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Float</VariableType>
          <Address>vf_player_side_mp_min</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>302</ID>
          <Description>"Battle: XP multiplier"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_XP_MULTI2,FFT_enhanced.exe,44 03 C0 45 3B C5) // should be unique
alloc(newmem,$1000,INJECT_XP_MULTI2)

label(code)
label(return)
label(vf_xp_multi2)

newmem:
  push rdx
  mov dl, [ib_player_group]
  cmp [rbx+4], dl
  jne endp

  vmovss xmm14, [vf_xp_multi2]
  vcvtsi2ss xmm15, xmm15, eax
  vmulss xmm15, xmm15, xmm14
  vcvtss2si eax, xmm15

endp:
  pop rdx

code:
  add r8d,eax
  cmp r8d,r13d
  jmp return
align 10 cc
  vf_xp_multi2:
  dd (float)2

INJECT_XP_MULTI2:
  jmp newmem
  nop
return:
registersymbol(INJECT_XP_MULTI2)
registersymbol(vf_xp_multi2)

[DISABLE]

INJECT_XP_MULTI2:
  db 44 03 C0 45 3B C5

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+27F523

FFT_enhanced.exe+27F4FC: 46 0F 45 34 98        - cmovne r14d,[rax+r11*4]
FFT_enhanced.exe+27F501: 0F B6 05 02 AA 52 00  - movzx eax,byte ptr [FFT_enhanced.exe+7A9F0A]
FFT_enhanced.exe+27F508: 44 0F B6 43 28        - movzx r8d,byte ptr [rbx+28]
FFT_enhanced.exe+27F50D: 6B C8 64              - imul ecx,eax,64
FFT_enhanced.exe+27F510: B8 1F 85 EB 51        - mov eax,51EB851F
FFT_enhanced.exe+27F515: F7 E1                 - mul ecx
FFT_enhanced.exe+27F517: 48 8B CB              - mov rcx,rbx
FFT_enhanced.exe+27F51A: 8B FA                 - mov edi,edx
FFT_enhanced.exe+27F51C: C1 EF 05              - shr edi,05
FFT_enhanced.exe+27F51F: 40 0F B6 C7           - movzx eax,dil
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+27F523: 44 03 C0              - add r8d,eax
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+27F526: 45 3B C5              - cmp r8d,r13d
FFT_enhanced.exe+27F529: 45 0F 47 C5           - cmova r8d,r13d
FFT_enhanced.exe+27F52D: 44 88 43 28           - mov [rbx+28],r8b
FFT_enhanced.exe+27F531: E8 B6 55 FF FF        - call FFT_enhanced.exe+274AEC
FFT_enhanced.exe+27F536: 85 C0                 - test eax,eax
FFT_enhanced.exe+27F538: 75 09                 - jne FFT_enhanced.exe+27F543
FFT_enhanced.exe+27F53A: 44 38 3D F5 A9 52 00  - cmp [FFT_enhanced.exe+7A9F36],r15b
FFT_enhanced.exe+27F541: 74 06                 - je FFT_enhanced.exe+27F549
FFT_enhanced.exe+27F543: 8A 43 29              - mov al,[rbx+29]
FFT_enhanced.exe+27F546: 88 46 02              - mov [rsi+02],al
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>304</ID>
              <Description>"multiplier"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_xp_multi2</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>24</ID>
          <Description>"Battle: JP XP multiplier"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_XP_MULTI,FFT_enhanced.exe,0F B7 84 7B 1E 01 00 00) // should be unique
alloc(newmem,$1000,INJECT_XP_MULTI)

label(code)
label(return)
label(vf_xp_multi)

newmem:
  push rax
  mov al, [ib_player_group]
  cmp [rbx+rdi*2+4], al
  jne endp

xp_multi:
  vcvtsi2ss xmm15, xmm15, edx
  vmovss xmm14, [vf_xp_multi]
  vmulss xmm15, xmm14, xmm15
  vmovss xmm13, [vf_31999]
  vucomiss xmm15, xmm13
  jbe @F
  movaps xmm15, xmm13

@@:
  vcvtss2si edx, xmm15

endp:
  pop rax

code:
  movzx eax,word ptr [rbx+rdi*2+0000011E]
  jmp return
align 10 cc
  vf_xp_multi:
  dd (float)4.5
  vf_31999:
  dd (float)31999

INJECT_XP_MULTI:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_XP_MULTI)
registersymbol(vf_xp_multi)

[DISABLE]

INJECT_XP_MULTI:
  db 0F B7 84 7B 1E 01 00 00

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+27F703

FFT_enhanced.exe+27F6DC: 75 04                    - jne FFT_enhanced.exe+27F6E2
FFT_enhanced.exe+27F6DE: 84 C9                    - test cl,cl
FFT_enhanced.exe+27F6E0: 78 E9                    - js FFT_enhanced.exe+27F6CB
FFT_enhanced.exe+27F6E2: 0F B7 84 7B F0 00 00 00  - movzx eax,word ptr [rbx+rdi*2+000000F0]
FFT_enhanced.exe+27F6EA: 41 B8 0F 27 00 00        - mov r8d,0000270F
FFT_enhanced.exe+27F6F0: 03 C2                    - add eax,edx
FFT_enhanced.exe+27F6F2: 8B CF                    - mov ecx,edi
FFT_enhanced.exe+27F6F4: 41 3B C0                 - cmp eax,r8d
FFT_enhanced.exe+27F6F7: 41 0F 4F C0              - cmovg eax,r8d
FFT_enhanced.exe+27F6FB: 66 89 84 7B F0 00 00 00  - mov [rbx+rdi*2+000000F0],ax
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+27F703: 0F B7 84 7B 1E 01 00 00  - movzx eax,word ptr [rbx+rdi*2+0000011E]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+27F70B: 03 C2                    - add eax,edx
FFT_enhanced.exe+27F70D: 41 3B C0                 - cmp eax,r8d
FFT_enhanced.exe+27F710: 41 0F 4F C0              - cmovg eax,r8d
FFT_enhanced.exe+27F714: 0F B7 D0                 - movzx edx,ax
FFT_enhanced.exe+27F717: 66 89 84 7B 1E 01 00 00  - mov [rbx+rdi*2+0000011E],ax
FFT_enhanced.exe+27F71F: E8 4C 56 FF FF           - call FFT_enhanced.exe+274D70
FFT_enhanced.exe+27F724: 44 8B C0                 - mov r8d,eax
FFT_enhanced.exe+27F727: 8B C7                    - mov eax,edi
FFT_enhanced.exe+27F729: 99                       - cdq 
FFT_enhanced.exe+27F72A: 2B C2                    - sub eax,edx
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>25</ID>
              <Description>"multiplier"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_xp_multi</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>305</ID>
          <Description>"Battle: keep min brave/faith after action"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_KEEP_MIN_BR_FA,FFT_enhanced.exe,41 0F B6 5A 2B) // should be unique
alloc(newmem,$1000,INJECT_KEEP_MIN_BR_FA)

label(code)
label(return)
label(ib_min_brfa_value)

newmem:
  push rax
  mov al, [ib_player_group]
  cmp [r10+4], al
  jne endp

  mov al, [ib_min_brfa_value]
  cmp [r10+2A], al
  jae @F
  mov [r10+2A], al

@@:
  cmp [r10+2B], al
  jae @F
  mov [r10+2B], al

@@:
  cmp [r10+2C], al
  jae @F
  mov [r10+2C], al

@@:
  cmp [r10+2D], al
  jae @F
  mov [r10+2D], al

endp:
  pop rax

code:
  movzx ebx,byte ptr [r10+2B]
  jmp return
align 10 cc
  ib_min_brfa_value:
  db #80

INJECT_KEEP_MIN_BR_FA:
  jmp newmem
return:
registersymbol(INJECT_KEEP_MIN_BR_FA)
registersymbol(ib_min_brfa_value)

[DISABLE]

INJECT_KEEP_MIN_BR_FA:
  db 41 0F B6 5A 2B

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+F4F0A7B

FFT_enhanced.exe+F4F0A43: 0F 8E 7B 22 AD F9        - jng FFT_enhanced.exe+8FC2CC4
FFT_enhanced.exe+F4F0A49: 41 81 F1 14 54 98 05     - xor r9d,05985414
FFT_enhanced.exe+F4F0A50: 41 81 D1 2F 09 F3 39     - adc r9d,39F3092F
FFT_enhanced.exe+F4F0A57: 0F 82 23 9D 64 05        - jb FFT_enhanced.exe+14B3A780
FFT_enhanced.exe+F4F0A5D: 40 53                    - push rbx
FFT_enhanced.exe+F4F0A5F: 48 83 EC 20              - sub rsp,20
FFT_enhanced.exe+F4F0A63: 4C 8B 15 66 36 37 F2     - mov r10,[FFT_enhanced.exe+18640D0]
FFT_enhanced.exe+F4F0A6A: 0F B7 0D 89 94 2B F1     - movzx ecx,word ptr [FFT_enhanced.exe+7A9EFA]
FFT_enhanced.exe+F4F0A71: 45 0F B6 4A 3E           - movzx r9d,byte ptr [r10+3E]
FFT_enhanced.exe+F4F0A76: 45 0F B6 5A 3F           - movzx r11d,byte ptr [r10+3F]
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+F4F0A7B: 41 0F B6 5A 2B           - movzx ebx,byte ptr [r10+2B]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+F4F0A80: E8 AB 3E DC F0           - call FFT_enhanced.exe+2B4930
FFT_enhanced.exe+F4F0A85: 0F B6 48 05              - movzx ecx,byte ptr [rax+05]
FFT_enhanced.exe+F4F0A89: 84 C9                    - test cl,cl
FFT_enhanced.exe+F4F0A8B: 75 43                    - jne FFT_enhanced.exe+F4F0AD0
FFT_enhanced.exe+F4F0A8D: 89 D9                    - mov ecx,ebx
FFT_enhanced.exe+F4F0A8F: 66 44 89 0D 59 94 2B F1  - mov [FFT_enhanced.exe+7A9EF0],r9w
FFT_enhanced.exe+F4F0A97: 41 0F AF C9              - imul ecx,r9d
FFT_enhanced.exe+F4F0A9B: B8 1F 85 EB 51           - mov eax,51EB851F
FFT_enhanced.exe+F4F0AA0: F7 E1                    - mul ecx
FFT_enhanced.exe+F4F0AA2: C1 EA 05                 - shr edx,05
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>306</ID>
              <Description>"value"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_brfa_value</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>654</ID>
          <Description>"Battle: damage multiplier"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-05
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_DAMAGE_MULTI,FFT_enhanced.exe,0F B7 47 30 2B C2 85 C0 41 0F 4E CE 8A D1 E8 F2) // should be unique
alloc(newmem,$1000,INJECT_DAMAGE_MULTI)

label(code)
label(return)
label(vf_damage_to_player vf_damage_to_enemy i_max_damage_to_player is_limit_damage_to_player)

newmem:
  mov dword ptr [i_player_tag], 0
  mov al, [ib_player_group]
  cmp [rdi+4], al
  jne calc_damage

  mov dword ptr [i_player_tag], 1

  cmp dword ptr [is_limit_damage_to_player], 1
  jne calc_damage
  cmp edx, [i_max_damage_to_player]
  jbe calc_damage
  movzx edx, [i_max_damage_to_player]

calc_damage:
  movaps, xmm14, [vf_damage_to_player]
  vcvtsi2ss xmm15, xmm15, edx
  vshufps xmm15, xmm15, xmm15, 0
  vmulps xmm15, xmm14, xmm15

  cmp dword ptr [i_player_tag], 1
  je post_proc

to_enemy:
  vshufps xmm15, xmm15, xmm15, 1

post_proc:
  vcvtss2si edx, xmm15
  mov dword ptr [i_player_tag], 0

code:
  movzx eax,word ptr [rdi+30]
  sub eax,edx
  jmp return
align 10 cc
  vf_damage_to_player:
  dd (float)0.9
  vf_damage_to_enemy:
  dd (float)1.1
  dd 0 0
  is_limit_damage_to_player:
  dd 1
  i_max_damage_to_player:
  dw #20
  dw 0
  i_player_tag:
  dd 0

INJECT_DAMAGE_MULTI:
  jmp newmem
  nop
return:
registersymbol(INJECT_DAMAGE_MULTI)
registersymbol(vf_damage_to_player vf_damage_to_enemy i_max_damage_to_player is_limit_damage_to_player)

[DISABLE]

INJECT_DAMAGE_MULTI:
  db 0F B7 47 30 2B C2

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+2161D3

FFT_enhanced.exe+2161B7: 48 85 C0              - test rax,rax
FFT_enhanced.exe+2161BA: 74 23                 - je FFT_enhanced.exe+2161DF
FFT_enhanced.exe+2161BC: 8B D5                 - mov edx,ebp
FFT_enhanced.exe+2161BE: 40 38 68 27           - cmp [rax+27],bpl
FFT_enhanced.exe+2161C2: 7D 04                 - jnl FFT_enhanced.exe+2161C8
FFT_enhanced.exe+2161C4: 0F BF 50 06           - movsx edx,word ptr [rax+06]
FFT_enhanced.exe+2161C8: 66 83 78 2C 64        - cmp word ptr [rax+2C],64
FFT_enhanced.exe+2161CD: 75 10                 - jne FFT_enhanced.exe+2161DF
FFT_enhanced.exe+2161CF: 85 D2                 - test edx,edx
FFT_enhanced.exe+2161D1: 7E 0C                 - jle FFT_enhanced.exe+2161DF
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+2161D3: 0F B7 47 30           - movzx eax,word ptr [rdi+30]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+2161D7: 2B C2                 - sub eax,edx
FFT_enhanced.exe+2161D9: 85 C0                 - test eax,eax
FFT_enhanced.exe+2161DB: 41 0F 4E CE           - cmovle ecx,r14d
FFT_enhanced.exe+2161DF: 8A D1                 - mov dl,cl
FFT_enhanced.exe+2161E1: E8 F2 E5 EC FF        - call FFT_enhanced.exe+E47D8
FFT_enhanced.exe+2161E6: 4C 8B 05 CB DE 64 01  - mov r8,[FFT_enhanced.exe+18640B8]
FFT_enhanced.exe+2161ED: 0F B7 53 30           - movzx edx,word ptr [rbx+30]
FFT_enhanced.exe+2161F1: 44 0F B7 4B 34        - movzx r9d,word ptr [rbx+34]
FFT_enhanced.exe+2161F6: 4D 85 C0              - test r8,r8
FFT_enhanced.exe+2161F9: 74 44                 - je FFT_enhanced.exe+21623F
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>655</ID>
              <Description>"Limit damage to player?"</Description>
              <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>4 Bytes</VariableType>
              <Address>is_limit_damage_to_player</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>656</ID>
              <Description>"Max damage to player"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>2 Bytes</VariableType>
              <Address>i_max_damage_to_player</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>657</ID>
              <Description>"Multiplier to player"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_damage_to_player</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>658</ID>
              <Description>"Multiplier to enemy"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_damage_to_enemy</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>646</ID>
          <Description>"Battle: set min jmp/mov/spd/atk..."</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-05
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_SET_SPD_JMP_MOV,FFT_enhanced.exe,0F B6 47 42 66 89 43 30) // should be unique
alloc(newmem,$1000,INJECT_SET_SPD_JMP_MOV)

label(code)
label(return)
label(ib_min_jmp ib_min_mov ib_min_spd ib_min_atk ib_min_matk ib_min_dodge)

newmem:
  mov al, [ib_player_group]
  cmp [rdi+4], al
  jne endp

  mov al, [ib_min_jmp]
  cmp [rdi+43], al
  jae @F
  mov [rdi+43], al

@@:
  mov al, [ib_min_mov]
  cmp [rdi+42], al
  jae @F
  mov [rdi+42], al

@@:
  mov al, [ib_min_spd]
  cmp [rdi+40], al
  jae @F
  mov [rdi+40], al

@@:
  mov al, [ib_min_atk]
  cmp [rdi+3E], al
  jae @F
  mov [rdi+3E], al

@@:
  mov al, [ib_min_matk]
  cmp [rdi+3F], al
  jae @F
  mov [rdi+3F], al

@@:
  mov al, [ib_min_dodge]
  cmp [rdi+4B], al
  jae @F
  mov [rdi+4B], al

@@:

endp:

code:
  movzx eax,byte ptr [rdi+42]
  mov [rbx+30],ax
  jmp return
  ib_min_jmp:
  db 4
  ib_min_mov:
  db 6
  ib_min_spd:
  db 7
  ib_min_atk:
  db 7
  ib_min_matk:
  db 7
  ib_min_dodge:
  db 25


INJECT_SET_SPD_JMP_MOV:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_SET_SPD_JMP_MOV)
registersymbol(ib_min_jmp ib_min_mov ib_min_spd ib_min_atk ib_min_matk ib_min_dodge)
[DISABLE]

INJECT_SET_SPD_JMP_MOV:
  db 0F B6 47 42 66 89 43 30

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+35B4DF

FFT_enhanced.exe+35B4B7: 66 89 43 24  - mov [rbx+24],ax
FFT_enhanced.exe+35B4BB: 0F B6 47 2B  - movzx eax,byte ptr [rdi+2B]
FFT_enhanced.exe+35B4BF: 66 89 43 26  - mov [rbx+26],ax
FFT_enhanced.exe+35B4C3: 0F B6 47 2D  - movzx eax,byte ptr [rdi+2D]
FFT_enhanced.exe+35B4C7: 66 89 43 28  - mov [rbx+28],ax
FFT_enhanced.exe+35B4CB: 0F B7 47 08  - movzx eax,word ptr [rdi+08]
FFT_enhanced.exe+35B4CF: 66 C1 E8 0C  - shr ax,0C
FFT_enhanced.exe+35B4D3: 66 89 43 2A  - mov [rbx+2A],ax
FFT_enhanced.exe+35B4D7: 0F B6 47 01  - movzx eax,byte ptr [rdi+01]
FFT_enhanced.exe+35B4DB: 66 89 43 2C  - mov [rbx+2C],ax
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+35B4DF: 0F B6 47 42  - movzx eax,byte ptr [rdi+42]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+35B4E3: 66 89 43 30  - mov [rbx+30],ax
FFT_enhanced.exe+35B4E7: 0F B6 47 40  - movzx eax,byte ptr [rdi+40]
FFT_enhanced.exe+35B4EB: 66 89 43 32  - mov [rbx+32],ax
FFT_enhanced.exe+35B4EF: 0F B6 47 43  - movzx eax,byte ptr [rdi+43]
FFT_enhanced.exe+35B4F3: 66 89 43 34  - mov [rbx+34],ax
FFT_enhanced.exe+35B4F7: 0F B6 47 44  - movzx eax,byte ptr [rdi+44]
FFT_enhanced.exe+35B4FB: 66 89 43 36  - mov [rbx+36],ax
FFT_enhanced.exe+35B4FF: 0F B6 47 45  - movzx eax,byte ptr [rdi+45]
FFT_enhanced.exe+35B503: 66 89 43 38  - mov [rbx+38],ax
FFT_enhanced.exe+35B507: 0F B6 47 46  - movzx eax,byte ptr [rdi+46]
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>647</ID>
              <Description>"min. jmp"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_jmp</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>648</ID>
              <Description>"min. mov"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_mov</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>649</ID>
              <Description>"min. spd"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_spd</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>650</ID>
              <Description>"min. atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_atk</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>651</ID>
              <Description>"min. m. atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_matk</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>652</ID>
              <Description>"min. phys dodge%"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_dodge</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>288</ID>
      <Description>"Browse &amp; set item amount (non-equipped)"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_GET_EQUIPS,FFT_enhanced.exe,43 0F B6 0C 08 03) // should be unique
alloc(newmem,$1000,INJECT_GET_EQUIPS)

label(code)
label(return)
label(ib_equip_min_threshold ib_equip_set_amount_to)

newmem:
  mov cl, [ib_equip_min_threshold]
  cmp [r8+r9], cl
  jb code

  mov cl, [ib_equip_set_amount_to]
  cmp [r8+r9], cl
  jae code
  mov [r8+r9], cl

code:
  movzx ecx,byte ptr [r8+r9]
  jmp return
align 10 cc
  ib_equip_min_threshold:
  db 2
  align 10 0
  ib_equip_set_amount_to:
  db 34

INJECT_GET_EQUIPS:
  jmp newmem
return:
registersymbol(INJECT_GET_EQUIPS)
registersymbol(ib_equip_min_threshold ib_equip_set_amount_to)

[DISABLE]

INJECT_GET_EQUIPS:
  db 43 0F B6 0C 08

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+280768

FFT_enhanced.exe+280743: CC                    - int 3 
FFT_enhanced.exe+280744: B8 FF 03 00 00        - mov eax,000003FF
FFT_enhanced.exe+280749: 41 B8 03 01 00 00     - mov r8d,00000103
FFT_enhanced.exe+28074F: 66 23 C8              - and cx,ax
FFT_enhanced.exe+280752: 8D 41 FF              - lea eax,[rcx-01]
FFT_enhanced.exe+280755: 66 41 3B C0           - cmp ax,r8w
FFT_enhanced.exe+280759: 77 1C                 - ja FFT_enhanced.exe+280777
FFT_enhanced.exe+28075B: 44 0F B7 C1           - movzx r8d,cx
FFT_enhanced.exe+28075F: 4C 8D 0D 8A 10 F2 00  - lea r9,[FFT_enhanced.exe+11A17F0]
FFT_enhanced.exe+280766: 33 C0                 - xor eax,eax
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+280768: 43 0F B6 0C 08        - movzx ecx,byte ptr [r8+r9]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+28076D: 03 CA                 - add ecx,edx
FFT_enhanced.exe+28076F: 0F 49 C1              - cmovns eax,ecx
FFT_enhanced.exe+280772: 43 88 04 08           - mov [r8+r9],al
FFT_enhanced.exe+280776: C3                    - ret 
FFT_enhanced.exe+280777: 33 C0                 - xor eax,eax
FFT_enhanced.exe+280779: C3                    - ret 
FFT_enhanced.exe+28077A: CC                    - int 3 
FFT_enhanced.exe+28077B: CC                    - int 3 
FFT_enhanced.exe+28077C: 48 8B C4              - mov rax,rsp
FFT_enhanced.exe+28077F: 48 89 58 08           - mov [rax+08],rbx
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>289</ID>
          <Description>"item count must &gt;="</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>ib_equip_min_threshold</Address>
          <CheatEntries>
            <CheatEntry>
              <ID>290</ID>
              <Description>"Caution: 0 = get all"</Description>
              <Color>8000FF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>291</ID>
          <Description>"Set amount to:"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>ib_equip_set_amount_to</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>26</ID>
      <Description>"Map: Status menu: get JP list"</Description>
      <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-04
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_GET_CHAR_JP_LIST,FFT_enhanced.exe,0F 10 87 80 00 00 00 0F) // should be unique
alloc(newmem,$1000,INJECT_GET_CHAR_JP_LIST)

label(code)
label(return)
label(i_equip_screen_jp_addr)

newmem:
  push r15
  push r13
  push rcx
  xor r13, r13

loop1:
  mov r15, i_equip_screen_jp_addr
  lea r15, [r15+r13*8]
  cmp qword ptr [r15], rdi
  je endp

  cmp qword ptr [r15], 0
  je write_it

  inc r13
  cmp r13, #60
  ja endp
  jmp loop1

write_it:
  mov [r15], rdi
  jmp endp

endp:
  pop rcx
  pop r13
  pop r15

code:
  movups xmm0,[rdi+00000080]
  jmp return
align 10 cc
  i_equip_screen_jp_addr:
  dq 0
  align 100 0
  db 0
  align 100 0
  db 0
  align 100 0
  db 0

INJECT_GET_CHAR_JP_LIST:
  jmp newmem
  nop 2
return:
registersymbol(INJECT_GET_CHAR_JP_LIST)
registersymbol(i_equip_screen_jp_addr)

[DISABLE]

INJECT_GET_CHAR_JP_LIST:
  db 0F 10 87 80 00 00 00

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+280CC5

FFT_enhanced.exe+280C8E: 0F 10 47 52              - movups xmm0,[rdi+52]
FFT_enhanced.exe+280C92: 0F 11 83 9B 00 00 00     - movups [rbx+0000009B],xmm0
FFT_enhanced.exe+280C99: 0F 10 4F 62              - movups xmm1,[rdi+62]
FFT_enhanced.exe+280C9D: 0F 11 8B AB 00 00 00     - movups [rbx+000000AB],xmm1
FFT_enhanced.exe+280CA4: 0F B7 47 72              - movzx eax,word ptr [rdi+72]
FFT_enhanced.exe+280CA8: 66 89 83 BB 00 00 00     - mov [rbx+000000BB],ax
FFT_enhanced.exe+280CAF: F2 0F 10 47 74           - movsd xmm0,[rdi+74]
FFT_enhanced.exe+280CB4: F2 0F 11 83 BD 00 00 00  - movsd [rbx+000000BD],xmm0
FFT_enhanced.exe+280CBC: 8B 47 7C                 - mov eax,[rdi+7C]
FFT_enhanced.exe+280CBF: 89 83 C5 00 00 00        - mov [rbx+000000C5],eax
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+280CC5: 0F 10 87 80 00 00 00     - movups xmm0,[rdi+00000080]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+280CCC: 0F 11 83 CA 00 00 00     - movups [rbx+000000CA],xmm0
FFT_enhanced.exe+280CD3: 0F 10 8F 90 00 00 00     - movups xmm1,[rdi+00000090]
FFT_enhanced.exe+280CDA: 0F 11 8B DA 00 00 00     - movups [rbx+000000DA],xmm1
FFT_enhanced.exe+280CE1: F2 0F 10 87 A0 00 00 00  - movsd xmm0,[rdi+000000A0]
FFT_enhanced.exe+280CE9: F2 0F 11 83 EA 00 00 00  - movsd [rbx+000000EA],xmm0
FFT_enhanced.exe+280CF1: 8B 87 A8 00 00 00        - mov eax,[rdi+000000A8]
FFT_enhanced.exe+280CF7: 89 83 F2 00 00 00        - mov [rbx+000000F2],eax
FFT_enhanced.exe+280CFD: 0F B7 87 AC 00 00 00     - movzx eax,word ptr [rdi+000000AC]
FFT_enhanced.exe+280D04: 66 89 83 F6 00 00 00     - mov [rbx+000000F6],ax
FFT_enhanced.exe+280D0B: 0F 10 87 AE 00 00 00     - movups xmm0,[rdi+000000AE]
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>27</ID>
          <Description>"Usage: enter / leave main menu"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>30</ID>
          <Description>"Do not edit data when in Job / troops menu"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>285</ID>
          <Description>"Recommend: edit actived jobs only"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>31</ID>
          <Description>"addr (should not be zero)"</Description>
          <ShowAsHex>1</ShowAsHex>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>808080</Color>
          <VariableType>8 Bytes</VariableType>
          <Address>i_equip_screen_jp_addr</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>29</ID>
          <Description>"Generate list"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript Async="1">[ENABLE]
{$lua}
if syntaxcheck then return end

local baseSymbol = "i_equip_screen_jp_addr"
local parentName = "+List (do not delete this)"
local addressList = getAddressList()

-- 顏色設定
local evenColor = 0xFF8000
local oddColor = 0xAA8044
local jpEvenColor = 0x80FF80
local jpOddColor = 0xC0C0C0

-- 開始讀取地址清單
local listStartAddr = getAddressSafe(baseSymbol)
if not listStartAddr then
  print("Symbol not found: " .. baseSymbol)
  return
end

local maxItems = 60
local charIndex = 1

synchronize(function()
  -- 取得或建立 parent node
  local parentRecord = addressList.getMemoryRecordByDescription(parentName)
  if not parentRecord then
    parentRecord = addressList.createMemoryRecord()
    parentRecord.Description = parentName
    parentRecord.IsGroupHeader = true
    parentRecord.Options = "[moHideChildren]"
  end

  -- 清除舊的子節點
  while parentRecord.Count &gt; 0 do
    parentRecord.Child[0].destroy()
  end

  -- 建立所有角色 nodes
  for n = 0, maxItems - 1 do
    local ptrAddr = listStartAddr + n * 8
    local itemAddr = readQword(ptrAddr)

    -- 如果讀到 0，停止
    if itemAddr == 0 then
      break
    end

    -- 建立角色群組節點
    local charNode = addressList.createMemoryRecord()
    charNode.Description = string.format("Char[%02d]", charIndex)
    charNode.IsGroupHeader = true
    charNode.Options = "[moHideChildren]"
    charNode.Parent = parentRecord
    charNode.Color = (charIndex % 2 == 1) and evenColor or oddColor

    -- 建立 JP[01] 到 JP[22]
    for i = 1, 22 do
      local jpNode = addressList.createMemoryRecord()
      jpNode.Description = string.format("JP[%02d]", i)
      jpNode.Address = string.format("%X", itemAddr + (i - 1) * 2 + 0x80)
      jpNode.Type = vtWord
      jpNode.ShowAsHex = false
      jpNode.Parent = charNode
      jpNode.Color = (i % 2 == 1) and jpEvenColor or jpOddColor
    end

    charIndex = charIndex + 1
  end

  parentRecord.Active = true
end)

print(string.format("%d records created.", charIndex - 1))
closeLuaEngine()

[DISABLE]
{$lua}
if syntaxcheck then return end

local PARENT_NAME = "+List (do not delete this)"
local addressList = getAddressList()

synchronize(function()
  local parent = addressList.getMemoryRecordByDescription(PARENT_NAME)
  if not parent then
    print("Parent node not found: " .. PARENT_NAME)
    return
  end

  -- 刪除所有子節點
  while parent.Count &gt; 0 do
    parent.Child[0].destroy()
  end

  parent.Active = false
  print("All records cleared!")
end)
closeLuaEngine()

</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>28</ID>
          <Description>"+List (do not delete this)"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>292</ID>
      <Description>"FINAL FANTASY TACTICS - The Ivalice Chronicles  /  https://opencheattables.com"</Description>
      <Color>009500</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
  <LuaScript>--[[
[ENABLE]
{$lua}
if syntaxcheck then return end
]]--
-- **デバッグモードの設定 (デフォルト: 無効)**
local debugMode = false

-- AOBScanModule関数
if not AOBScanModule then
    function AOBScanModule(moduleName, signature, scanOptions)
        local baseAddr = nil
        local maxAddr = 0
        local modList

        synchronize(function()
            modList = enumModules()
        end)

        for _, mod in ipairs(modList) do
            if string.lower(mod.Name) == string.lower(moduleName) then
                baseAddr = mod.Address
                maxAddr = baseAddr + mod.Size
                break
            end
        end

        if not baseAddr then
            if debugMode then print("❗ Error: Module " .. moduleName .. " not found!") end
            return nil
        end

        if debugMode then
            print(string.format("✔️ %s Base Address: 0x%X", moduleName, baseAddr))
            print(string.format("🔬 Scanning Range: 0x%X - 0x%X", baseAddr, maxAddr))
        end

        local ms = createMemScan()

        synchronize(function()
            ms.firstScan(
                soExactValue,
                vtByteArray,
                nil,
                signature,
                nil,
                baseAddr,
                maxAddr,
                scanOptions or "+X+R",
                fsmNotAligned,
                "1",
                true,
                true,
                false,
                false
            )
        end)

        ms.waitTillDone()

        local results = createFoundList(ms)
        results.initialize()

        local addr
        synchronize(function()
            if results.getCount() &gt; 0 then
                addr = results[0]
            end
        end)

        if addr then
            if debugMode then print("🔦 AOB found at: 0x" .. addr) end
        else
            if debugMode then print("💔 AOB not found in " .. moduleName) end
        end

        results.destroy()
        ms.destroy()
        return addr
    end
end

registerLuaFunctionHighlight('AOBScanModule')

--[[
test AOBScanModule()
local aob_addr_str = AOBScanModule("???.exe", "48 8B 05 ?? ?? ?? ?? 33 ED 48 8B 88", "+X+R")
if aob_addr_str then
    print("🔦 Final AOB Address: 0x" .. aob_addr_str)
else
    print("💔 AOB not found in ???.exe")
end
]]--

-- AOBScanModuleN関数
if not AOBScanModuleN then
    function AOBScanModuleN(moduleName, signature, maxResults, scanOptions)
        local baseAddr = nil
        local maxAddr = 0
        local modList

        synchronize(function()
            modList = enumModules()
        end)

        for _, mod in ipairs(modList) do
            if string.lower(mod.Name) == string.lower(moduleName) then
                baseAddr = mod.Address
                maxAddr = baseAddr + mod.Size
                break
            end
        end

        if not baseAddr then
            if debugMode then print("❗ Error: Module " .. moduleName .. " not found!") end
            return nil
        end

        if debugMode then
            print(string.format("✔️ %s Base Address: 0x%X", moduleName, baseAddr))
            print(string.format("🔬 Scanning Range: 0x%X - 0x%X", baseAddr, maxAddr))
        end

        local ms = createMemScan()

        synchronize(function()
            ms.firstScan(
                soExactValue,
                vtByteArray,
                nil,
                signature,
                nil,
                baseAddr,
                maxAddr,
                scanOptions or "+X+R",
                fsmNotAligned,
                "1",
                true,
                true,
                false,
                false
            )
        end)

        ms.waitTillDone()

        local results = createFoundList(ms)
        results.initialize()

        local addrs = {}
        synchronize(function()
            local count = results.getCount()
            for i = 0, math.min(maxResults - 1, count - 1) do
                table.insert(addrs, results[i])
                if debugMode then
                    print(string.format("🔦 AOB[%d] found at: 0x%s", i + 1, results[i]))
                end
            end
        end)

        if #addrs == 0 and debugMode then
            print("💔 AOB not found in " .. moduleName)
        end

        results.destroy()
        ms.destroy()

        return addrs
    end
end

registerLuaFunctionHighlight('AOBScanModuleN')


-- 搜尋並取出最多5筆結果
--[[
local list = AOBScanModuleN("GameModule.exe", "12 34 56 ?? 78", 5)

if list then
    for i, addr in ipairs(list) do
        print(string.format("地址 %d: 0x%s", i, addr))
    end
end
]]--


-- Lua scripts that table checkbox will not be checked with "NO_ACTIVATE" in comment/script body
if not onMemRecPostExecute then
    function onMemRecPostExecute(memoryrecord, newState, succeeded)
        if memoryrecord.Type == vtAutoAssembler and memoryrecord.Script:find("NO_ACTIVATE") and newState and succeeded then
            synchronize(function()
                memoryrecord.disableWithoutExecute()
            end)
        end
    end
end

-- Memory record IDs now allowed to be 'locked'
IDs = {999999, 9999999}

-- Determine event trigger sequence
if not contains then
    function contains(table, val)
       for i = 1, #table do
          if table[i] == val then
             return true
          end
       end
       return false
    end
end

if not onMemRecPreExecute then
    function onMemRecPreExecute(memoryrecord, newstate)
        if contains(IDs, memoryrecord.ID) and newstate then
            synchronize(function()
                if not memoryrecord.OnActivate then
                    memoryrecord.OnActivate = function(memoryrecord, before, currentstate)
                        return false
                    end
                end
            end)
        end
    end
end

-- Utility Functions
-- Clear lua engine log
if not clearLuaLog then
    function clearLuaLog()
        synchronize(function()
          getLuaEngine().MenuItem5.doClick()
        end)
    end
end
registerLuaFunctionHighlight('clearLuaLog')

-- Close lua engine log
if not closeLuaEngine then
    function closeLuaEngine()
        synchronize(function()
          getLuaEngine().Close()
        end)
    end
end
registerLuaFunctionHighlight('closeLuaEngine')

-- Clear lua engine log &amp; close lua engine
if not closeLuaEngine2 then
    function closeLuaEngine2()
        synchronize(function()
          getLuaEngine().MenuItem5.doClick()
          getLuaEngine().Close()
        end)
    end
end
registerLuaFunctionHighlight('closeLuaEngine2')

if not getProcessNameFromPID then
	function getProcessNameFromPID(pid)
	  local sl = createStringList()
	  getProcessList(sl)
	  local hexPid = string.format("%X", pid):upper()

	  for i = 0, sl.Count - 1 do
		local entry = sl[i]
		local hexid, name = entry:match("^(%x+)%-(.+)$")
		if hexid and name then
		  if tonumber(hexid, 16) == pid then
			return name
		  end
		end
	  end
	  return "(unknown)"
	end
end
registerLuaFunctionHighlight('getProcessNameFromPID')

if not printProcessInfo then
	function printProcessInfo()
	  local pid = getOpenedProcessID()
	  local name = getProcessNameFromPID(pid)
	  print(string.format("📎 Attached to process: %s (PID: %d / 0x%X)", name, pid, pid))
	end
end
registerLuaFunctionHighlight('printProcessInfo')

if not dumpProcessListAndFindPID then
	function dumpProcessListAndFindPID()
	  local pid = getOpenedProcessID()
	  print(string.format("💭 Current PID: %d / 0x%X", pid, pid))

	  local sl = createStringList()
	  getProcessList(sl)

	  print("🧾 Dumping process list:")
	  for i = 0, sl.Count - 1 do
		local entry = sl[i]
		print(string.format("[%d] %s", i, entry))

		-- 嘗試解析並比對 PID
		local name, hexid = entry:match("(.+)%-(%x+)$")
		if name and hexid then
		  local parsed = tonumber(hexid, 16)
		  if parsed == pid then
			print("🔦 Match found in process list:")
			print(string.format("Name: %s | PID: %s (0x%s)", name, parsed, hexid))
		  end
		end
	  end
	end
end
registerLuaFunctionHighlight('dumpProcessListAndFindPID')

if not toHex32 then
	function toHex32(num)
		local hexstr = "0123456789ABCDEF"
		local result = ""
		if num &lt; 0 then
			num = (num + (1 &lt;&lt; 32)) % (1 &lt;&lt; 32) -- 轉成32-bit補數
		end
		for i = 1, 8 do -- 32-bit 一共8個hex位
			local n = num &amp; 0xF -- 取最低4 bit
			result = hexstr:sub(n + 1, n + 1) .. result
			num = num &gt;&gt; 4 -- 右移4 bit
		end
		return result
	end
end
registerLuaFunctionHighlight('toHex32')

if not toHex then
	function toHex(num)
		local hexstr = "0123456789ABCDEF"
		local result = ""
		if num &lt; 0 then
			num = (num + (1 &lt;&lt; 64)) % (1 &lt;&lt; 64)  -- 轉成64-bit補數
		end
		for i = 1, 16 do -- 每4 bit 一個 hex字，64-bit總共16個hex位
			local n = num &amp; 0xF -- 取最低4bit
			result = hexstr:sub(n + 1, n + 1) .. result
			num = num &gt;&gt; 4 -- 右移4bit
		end
		return result
	end
end	
registerLuaFunctionHighlight('toHex')

synchronize(function() AddressList.Header.OnSectionClick = nil end)
--[[
[DISABLE]
{$lua}

if AOBScanModule then
    AOBScanModule = nil
end
if onMemRecPostExecute then
    onMemRecPostExecute = nil
end
if onMemRecPreExecute then
    onMemRecPreExecute = nil
end
if clearLuaLog then
    clearLuaLog = nil
end
if closeLuaEngine then
    closeLuaEngine = nil
end
if closeLuaEngine2 then
    closeLuaEngine2 = nil
end
]]--
</LuaScript>
</CheatTable>
