<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="46">
  <CheatEntries>
    <CheatEntry>
      <ID>0</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>1</ID>
      <Description>"Toggle scripts (auto attach)"</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

if (syntaxcheck) then return 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)
--]]
  2, -- "Battle: selected char (LT or click)"
  87, -- "Battle: HP/MP/XP/Others"
  146, -- "Browse &amp; set item amount (non-equipped)"
  150, -- "Browse &amp; set poach materials amount"
  153, -- "Get money"
  156, -- "Map: Status menu: get characters data"
  4939, -- "Fast tavern errands (儲け話) complete"
  123, -- "Battle: XP multiplier"
  125, -- "Battle: JP XP multiplier"
  129, -- "Battle: keep min brave/faith after action"
  132, -- "Battle: damage multiplier"
  139, -- "Battle: set min jmp/mov/spd/atk..."
  133, -- "Enable Check point #2"
  0, -- "Toggle Compact View"
}
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 = {
  166, -- "Expand selected char"
  165, -- "(Auto mode) Expand selected char"
  169, -- "Modify all EXP value to 99"
  168, -- "Modify all JP EXP value to 1200, if not zero &amp; &lt; 1200"
  167, -- "Modify all JP value to 8000, if not zero"
  163, -- "Get selected char address"
  137, -- "Multiplier to enemy"
  133, -- "Enable Check point #2"
  111, -- "to enemy"
  98, -- "to player"
  170, -- "+List (do not delete this)"
  162, -- "Generate list (may take minutes...)"
  161, -- "~count"
  147, -- "item count must &gt;="
  139, -- "Battle: set min jmp/mov/spd/atk..."
  132, -- "Battle: damage multiplier"
  129, -- "Battle: keep min brave/faith after action"
  125, -- "Battle: JP XP multiplier"
  123, -- "Battle: XP multiplier"
  119, -- "Force set as enemy"
  95, -- "Some Buffs/Debuffs settings+"
  41, -- "JP+"
  37, -- "Loc+"
  20, -- "Attributes+"
  11, -- "Base stats+"
  4939, -- "Fast tavern errands (儲け話) complete"
  171, -- "FINAL FANTASY TACTICS - The Ivalice Chronicles  /  https://opencheattables.com"
  156, -- "Map: Status menu: get characters data"
  153, -- "Get money"
  150, -- "Browse &amp; set poach materials amount"
  146, -- "Browse &amp; set item amount (non-equipped)"
  87, -- "Battle: HP/MP/XP/Others"
  2, -- "Battle: selected char (LT or click)"
  0, -- "Toggle Compact View"
}
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: 0, Description: "Toggle Compact View", Depth: 0
-- ID: 2, Description: "Battle: selected char (LT or click)", Depth: 0
--   ID: 11, Description: "Base stats+", Depth: 1
--   ID: 20, Description: "Attributes+", Depth: 1
--   ID: 37, Description: "Loc+", Depth: 1
--   ID: 41, Description: "JP+", Depth: 1
-- ID: 87, Description: "Battle: HP/MP/XP/Others", Depth: 0
--   ID: 95, Description: "Some Buffs/Debuffs settings+", Depth: 1
--     ID: 98, Description: "to player", Depth: 2
--     ID: 111, Description: "to enemy", Depth: 2
--   ID: 119, Description: "Force set as enemy", Depth: 1
--   ID: 123, Description: "Battle: XP multiplier", Depth: 1
--   ID: 125, Description: "Battle: JP XP multiplier", Depth: 1
--   ID: 129, Description: "Battle: keep min brave/faith after action", Depth: 1
--   ID: 132, Description: "Battle: damage multiplier", Depth: 1
--     ID: 133, Description: "Enable Check point #2", Depth: 2
--     ID: 137, Description: "Multiplier to enemy", Depth: 2
--   ID: 139, Description: "Battle: set min jmp/mov/spd/atk...", Depth: 1
-- ID: 146, Description: "Browse &amp; set item amount (non-equipped)", Depth: 0
--   ID: 147, Description: "item count must &gt;=", Depth: 1
-- ID: 150, Description: "Browse &amp; set poach materials amount", Depth: 0
-- ID: 4939, Description: "Fast tavern errands (儲け話) complete", Depth: 0
-- ID: 153, Description: "Get money", Depth: 0
-- ID: 156, Description: "Map: Status menu: get characters data", Depth: 0
--   ID: 161, Description: "~count", Depth: 1
--   ID: 162, Description: "Generate list (may take minutes...)", Depth: 1
--     ID: 163, Description: "Get selected char address", Depth: 2
--       ID: 166, Description: "Expand selected char", Depth: 3
--       ID: 165, Description: "(Auto mode) Expand selected char", Depth: 3
--     ID: 167, Description: "Modify all JP value to 8000, if not zero", Depth: 2
--     ID: 168, Description: "Modify all JP EXP value to 1200, if not zero &amp; &lt; 1200", Depth: 2
--     ID: 169, Description: "Modify all EXP value to 99", Depth: 2
--   ID: 170, Description: "+List (do not delete this)", Depth: 1
-- ID: 171, Description: "FINAL FANTASY TACTICS - The Ivalice Chronicles  /  https://opencheattables.com", Depth: 0

</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>2</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,$process,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 i_friend_foe_tmp)

newmem:
  mov [i_batt_base_sel_char_addr], rcx
  mov al, [rcx+5]
  and al, #16
  mov [i_friend_foe_tmp], al

code:
  movzx eax,word ptr [rcx+30]
  mov [rdx+0C],ax
  jmp return
align 10 cc
  i_batt_base_sel_char_addr:
  dq 0
  i_friend_foe_tmp:
  db 0

INJECT_BATT_SELECTED_CHAR:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_BATT_SELECTED_CHAR)
registersymbol(i_batt_base_sel_char_addr i_friend_foe_tmp)

[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>3</ID>
          <Description>"base address"</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>4</ID>
          <Description>"char ID? (ref only)"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>0</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>2489</ID>
          <Description>"Job ID? (ref only)"</Description>
          <DropDownListLink>Job.ID</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>3</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>5</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>6</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>7</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>8</ID>
          <Description>"Hearts"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Byte</VariableType>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>7</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>9</ID>
          <Description>"Controllable?"</Description>
          <DropDownListLink>YesNo</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Binary</VariableType>
          <BitStart>4</BitStart>
          <BitLength>1</BitLength>
          <ShowAsBinary>0</ShowAsBinary>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>1</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>10</ID>
          <Description>"Firend/Foe?"</Description>
          <DropDownList DisplayValueAsItem="1">0:Friend
1:Foe
</DropDownList>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>Binary</VariableType>
          <BitStart>4</BitStart>
          <BitLength>1</BitLength>
          <ShowAsBinary>0</ShowAsBinary>
          <Address>i_batt_base_sel_char_addr</Address>
          <Offsets>
            <Offset>5</Offset>
          </Offsets>
        </CheatEntry>
        <CheatEntry>
          <ID>11</ID>
          <Description>"Base stats+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>12</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>13</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>14</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>15</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>16</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>17</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>18</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>19</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>7210</ID>
          <Description>"Abilities"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>7205</ID>
              <Description>"Ability"</Description>
              <DropDownListLink>Ability.ID</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>12</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>7206</ID>
              <Description>"Action"</Description>
              <DropDownListLink>Ability.ID</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>13</Offset>
              </Offsets>
            </CheatEntry>
            <CheatEntry>
              <ID>7207</ID>
              <Description>"Reaction"</Description>
              <DropDownListLink>Ability.ID</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>14</Offset>
              </Offsets>
              <CheatEntries>
                <CheatEntry>
                  <ID>7213</ID>
                  <Description>"Enabled?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>FF8080</Color>
                  <VariableType>Byte</VariableType>
                  <Address>i_batt_base_sel_char_addr</Address>
                  <Offsets>
                    <Offset>15</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>7208</ID>
              <Description>"Support"</Description>
              <DropDownListLink>Ability.ID</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>16</Offset>
              </Offsets>
              <CheatEntries>
                <CheatEntry>
                  <ID>7212</ID>
                  <Description>"Enabled?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>FF8080</Color>
                  <VariableType>Byte</VariableType>
                  <Address>i_batt_base_sel_char_addr</Address>
                  <Offsets>
                    <Offset>17</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>7209</ID>
              <Description>"Move"</Description>
              <DropDownListLink>Ability.ID</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>FF8080</Color>
              <VariableType>Byte</VariableType>
              <Address>i_batt_base_sel_char_addr</Address>
              <Offsets>
                <Offset>18</Offset>
              </Offsets>
              <CheatEntries>
                <CheatEntry>
                  <ID>7211</ID>
                  <Description>"Enabled?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>FF8080</Color>
                  <VariableType>Byte</VariableType>
                  <Address>i_batt_base_sel_char_addr</Address>
                  <Offsets>
                    <Offset>19</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>20</ID>
          <Description>"Attributes+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>21</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>22</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>23</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>24</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>25</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>26</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>27</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>28</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>29</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>30</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>31</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>32</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>33</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>34</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>35</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>36</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>37</ID>
          <Description>"Loc+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>7214</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>39</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>40</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>41</ID>
          <Description>"JP+"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>42</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>43</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>44</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>45</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>46</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>47</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>48</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>49</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>50</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>51</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>52</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>53</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>54</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>55</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>56</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>57</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>58</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>59</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>60</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>61</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>62</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>63</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>64</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>65</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>66</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>67</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>68</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>69</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>70</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>71</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>72</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>73</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>74</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>75</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>76</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>77</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>78</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>79</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>80</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>81</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>82</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>83</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>84</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>85</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>86</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>87</ID>
      <Description>"Battle: 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,$process,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)
label(i_ignore_addr1 i_ignore_addr2 iw_min_max_hp iw_min_max_mp is_check_friend_bit is_enemy_always_sleep)
label(is_player_always_reflect is_player_always_wall is_enemy_always_blind is_player_always_reraise is_enemy_always_dontact)
label(is_enemy_always_confuse is_enemy_always_silence is_enemy_always_dontmove is_enemy_always_poison is_enemy_always_frog)
label(is_always_remove_sleep is_always_remove_blind is_always_remove_dontact is_always_remove_dontmove is_always_remove_confuse is_always_remove_silence)
label(is_player_always_float is_always_remove_frog is_player_always_fast)

newmem:
  cmp r15, [i_ignore_addr1]
  je to_enemy
  cmp r15, [i_ignore_addr2]
  je to_enemy

  push rax

  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov al, [r15+5]
  and al, 10
  cmp al, 0
  jne to_enemy

next1:
  mov al, [ib_player_group]
  cmp [r15+4], al
  jne to_enemy

chk_min_max_hpmp:
  mov ax, [iw_min_max_hp]
  cmp [r15+32], ax
  jae @F
  mov [r15+32], ax

@@:
  mov ax, [iw_min_max_mp]
  cmp [r15+36], ax
  jae @F
  mov [r15+36], ax

check_set_buff:
  // remove sleep
  cmp dword ptr [is_always_remove_sleep], 1
  jne @F
  and byte ptr [r15+65], EF

@@:
  // remove blind
  cmp dword ptr [is_always_remove_blind], 1
  jne @F
  and byte ptr [r15+62], DF

@@:
  // remove don't act
  cmp dword ptr [is_always_remove_dontact], 1
  jne @F
  and byte ptr [r15+65], FB

@@:
  // remove don't move
  cmp dword ptr [is_always_remove_dontmove], 1
  jne @F
  and byte ptr [r15+65], F7

@@:
  // remove confuse
  cmp dword ptr [is_always_remove_confuse], 1
  jne @F
  and byte ptr [r15+62], EF

@@:
  // remove silence
  cmp dword ptr [is_always_remove_silence], 1
  jne @F
  and byte ptr [r15+62], F7

@@:
  // remove frog
  cmp dword ptr [is_always_remove_frog], 1
  jne @F
  and byte ptr [r15+63], FD

@@:
  // reflect
  cmp dword ptr [is_player_always_reflect], 1
  jne @F
  or byte ptr [r15+65], 2

@@:
  //wall
  cmp dword ptr [is_player_always_wall], 1
  jne @F
  or byte ptr [r15+64], 30

@@:
  //reraise
  cmp dword ptr [is_player_always_reraise], 1
  jne @F
  or byte ptr [r15+63], 20

@@:
  // float
  cmp dword ptr [is_player_always_float], 1
  jne @F
  or byte ptr [r15+63], 40

@@:
  // fast
  cmp dword ptr [is_player_always_fast], 1
  jne @F
  mov byte ptr [r15+6A], 20
  or byte ptr [r15+64], 8


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
  jmp endp

to_enemy:
  // sleep
  cmp word ptr [r15+30], 0
  je endp
  cmp dword ptr [is_enemy_always_sleep], 1
  jne @F
  or byte ptr [r15+65], 10

@@:
  // blind
  cmp dword ptr [is_enemy_always_blind], 1
  jne @F
  or byte ptr [r15+62], 20

@@:
  // don't act
  cmp dword ptr [is_enemy_always_dontact], 1
  jne @F
  or byte ptr [r15+65], 4

@@:
  // don't move
  cmp dword ptr [is_enemy_always_dontmove], 1
  jne @F
  or byte ptr [r15+65], 8


@@:
  // confuse
  cmp dword ptr [is_enemy_always_confuse], 1
  jne @F
  or byte ptr [r15+62], 10

@@:
  // silence
  cmp dword ptr [is_enemy_always_silence], 1
  jne @F
  or byte ptr [r15+62], 8

@@:
  // silence
  cmp dword ptr [is_enemy_always_frog], 1
  jne @F
  or byte ptr [r15+63], 2

check_unset_buff:
  // remove reflect
  cmp dword ptr [is_player_always_reflect], 1
  jne @F
  //or byte ptr [r15+65], 2
  and byte ptr [r15+65], FD

@@:
  // remove wall
  cmp dword ptr [is_player_always_wall], 1
  jne @F
  //or byte ptr [r15+64], 30
  and byte ptr [r15+64], CF

@@:
  // remove reraise
  cmp dword ptr [is_player_always_reraise], 1
  jne @F
  and byte ptr [r15+63], DF

@@:
  // remove reraise
  cmp dword ptr [is_player_always_reraise], 1
  jne @F
  and byte ptr [r15+63], DF


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
  vf_enemy_side_hp_min:
  dd (float)0.7
  iw_min_max_hp:
  dw 40
  iw_min_max_mp:
  dw 64
  is_enemy_always_sleep:
  dd 0
  is_enemy_always_blind:
  dd 0
  is_enemy_always_dontact:
  dd 0
  is_enemy_always_dontmove:
  dd 0
  is_enemy_always_confuse:
  dd 0
  is_enemy_always_silence:
  dd 0
  is_enemy_always_poison:
  dd 0
  is_enemy_always_frog:
  dd 0
  is_always_remove_sleep:
  dd 1
  is_always_remove_blind:
  dd 1
  is_always_remove_dontact:
  dd 1
  is_always_remove_dontmove:
  dd 1
  is_always_remove_confuse:
  dd 1
  is_always_remove_silence:
  dd 1
  is_always_remove_frog:
  dd 1
  is_player_always_reflect:
  dd 0
  is_player_always_wall:
  dd 1
  is_player_always_reraise:
  dd 1
  is_player_always_float:
  dd 1
  is_player_always_fast:
  dd 1
  ib_player_group:
  db 0
  align 10 cc
  i_ignore_addr1:
  dq 0
  i_ignore_addr2:
  dq 0
  is_check_friend_bit:
  dd 1
  align 10 0
  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)
registersymbol(i_ignore_addr1 i_ignore_addr2 iw_min_max_hp iw_min_max_mp is_check_friend_bit is_enemy_always_sleep)
registersymbol(is_player_always_reflect is_player_always_wall is_enemy_always_blind is_player_always_reraise is_enemy_always_dontact)
registersymbol(is_enemy_always_confuse is_enemy_always_silence is_enemy_always_dontmove is_enemy_always_poison is_enemy_always_frog)
registersymbol(is_always_remove_sleep is_always_remove_blind is_always_remove_dontact is_always_remove_dontmove is_always_remove_confuse is_always_remove_silence)
registersymbol(is_player_always_float is_always_remove_frog is_player_always_fast)

[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>88</ID>
          <Description>"Not god mode"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>89</ID>
          <Description>"Extra side check logic? (high priority)"</Description>
          <DropDownListLink>YesNo</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>2 Bytes</VariableType>
          <Address>is_check_friend_bit</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>90</ID>
          <Description>"Player side ID"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>ib_player_group</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>91</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>92</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>93</ID>
          <Description>"Min "Max HP""</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>2 Bytes</VariableType>
          <Address>iw_min_max_hp</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>94</ID>
          <Description>"Min "Max MP""</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>2 Bytes</VariableType>
          <Address>iw_min_max_mp</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>95</ID>
          <Description>"Some Buffs/Debuffs settings+"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>96</ID>
              <Description>"Add related buff to player"</Description>
              <Color>8000FF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
            <CheatEntry>
              <ID>97</ID>
              <Description>"Revoke related buff from enemy"</Description>
              <Color>8000FF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
            <CheatEntry>
              <ID>98</ID>
              <Description>"to player"</Description>
              <Options moHideChildren="1"/>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>99</ID>
                  <Description>"Reflect?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_player_always_reflect</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>100</ID>
                  <Description>"Wall?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_player_always_wall</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>101</ID>
                  <Description>"Reraise?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_player_always_reraise</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>102</ID>
                  <Description>"float?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_player_always_float</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>103</ID>
                  <Description>"fast?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_player_always_fast</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>104</ID>
                  <Description>"Remove sleep?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_sleep</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>105</ID>
                  <Description>"Remove blind?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_blind</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>106</ID>
                  <Description>"Remove don't act?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_dontact</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>107</ID>
                  <Description>"Remove don't move?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_dontmove</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>108</ID>
                  <Description>"Remove confuse?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_confuse</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>109</ID>
                  <Description>"Remove silence?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_silence</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>110</ID>
                  <Description>"Remove frog?"</Description>
                  <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_always_remove_frog</Address>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>111</ID>
              <Description>"to enemy"</Description>
              <Options moHideChildren="1"/>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>112</ID>
                  <Description>"Sleep to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_sleep</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>113</ID>
                  <Description>"Blind to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_blind</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>114</ID>
                  <Description>"Don't act to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_dontact</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>115</ID>
                  <Description>"Don't move to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_dontmove</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>116</ID>
                  <Description>"Confuse to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_confuse</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>117</ID>
                  <Description>"Silence to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_silence</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>118</ID>
                  <Description>"Frog to enemy?"</Description>
                  <DropDownListLink>YesNo</DropDownListLink>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>4 Bytes</VariableType>
                  <Address>is_enemy_always_frog</Address>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>119</ID>
          <Description>"Force set as enemy"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
          <GroupHeader>1</GroupHeader>
          <CheatEntries>
            <CheatEntry>
              <ID>120</ID>
              <Description>"Get from "Battle: selected char (LT or click)" -&gt; base address"</Description>
              <Color>8000FF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
            <CheatEntry>
              <ID>121</ID>
              <Description>"address #1"</Description>
              <ShowAsHex>1</ShowAsHex>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>8 Bytes</VariableType>
              <Address>i_ignore_addr1</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>122</ID>
              <Description>"address #2"</Description>
              <ShowAsHex>1</ShowAsHex>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>8 Bytes</VariableType>
              <Address>i_ignore_addr2</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>123</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,$process,44 03 C0 45 3B C5) // should be unique
alloc(newmem,$1000,INJECT_XP_MULTI2)

label(code)
label(return)
label(vf_xp_multi2)

newmem:
  cmp rbx, [i_ignore_addr1]
  je endp
  cmp rbx, [i_ignore_addr2]
  je endp


  push rdx

  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov dl, [rbx+5]
  and dl, 10
  cmp dl, 0
  jne endp

next1:
  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)3.333333

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>124</ID>
              <Description>"multiplier"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_xp_multi2</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>125</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,$process,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 i_is_add_xp_to_all iw_xp_extra)

newmem:
  cmp rbx, [i_ignore_addr1]
  je endp
  cmp rbx, [i_ignore_addr2]
  je endp


  push rax
  pushfq
  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov al, [rbx+5]
  and al, 10
  cmp al, 0
  jne endp

next1:
  mov al, [ib_player_group]
  cmp [rbx+4], al
  jne endp

to_add_extra:
  cmp dword ptr [i_is_add_xp_to_all], 1
  jne xp_multi

  push rcx
  push rdx

  xor rcx, rcx
  mov ecx, #19
  mov ax, [iw_xp_extra]

loop1:
  dec rcx
  cmp word ptr [rbx+rcx*2+0000011E], #32000
  jae @F
  add word ptr [rbx+rcx*2+0000011E], ax  // 0-18
@@:
  test rcx, rcx
  jnz loop1

  pop rdx
  pop rcx

xp_multi:
  // xp multiplier
  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:
  popfq
  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
  i_is_add_xp_to_all:
  dd 1
  iw_xp_extra:
  db 14
  db 0

INJECT_XP_MULTI:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_XP_MULTI)
registersymbol(vf_xp_multi i_is_add_xp_to_all iw_xp_extra)

[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>126</ID>
              <Description>"multiplier"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_xp_multi</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>127</ID>
              <Description>"Extra XP to all jobs?"</Description>
              <DropDownListLink>YesNo</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>4 Bytes</VariableType>
              <Address>i_is_add_xp_to_all</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>128</ID>
              <Description>"Extra XP"</Description>
              <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>iw_xp_extra</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>129</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,$process,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 ib_max_faith_value)

newmem:
  cmp r10, [i_ignore_addr1]
  je endp
  cmp r10, [i_ignore_addr2]
  je endp


  push rax
  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov al, [r10+5]
  and al, 10
  cmp al, 0
  jne endp

next1:
  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

  mov al, [ib_max_faith_value]
@@:
  cmp [r10+2C], al
  jbe @F
  mov [r10+2C], al

@@:
  cmp [r10+2D], al
  jbe @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
  ib_max_faith_value:
  db #89

INJECT_KEEP_MIN_BR_FA:
  jmp newmem
return:
registersymbol(INJECT_KEEP_MIN_BR_FA)
registersymbol(ib_min_brfa_value ib_max_faith_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>130</ID>
              <Description>"min value"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_brfa_value</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>131</ID>
              <Description>"Max faith value"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_max_faith_value</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>132</ID>
          <Description>"Battle: damage multiplier"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="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,$process,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:
  cmp rdi, [i_ignore_addr1]
  je calc_damage
  cmp rdi, [i_ignore_addr2]
  je calc_damage

  mov dword ptr [i_player_tag], 0

  push rcx
  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov cl, [rdi+5]
  and cl, 10
  cmp cl, 0
  pop rcx
  jne calc_damage

next1:
  push rcx
  mov cl, [ib_player_group]
  cmp [rdi+4], cl
  pop rcx
  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
  mov [rax+06], dx



code:
  movzx eax,word ptr [rdi+30]
  sub eax,edx
  jmp return
align 10 cc
  vf_damage_to_player:
  dd (float)1
  vf_damage_to_enemy:
  dd (float)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>133</ID>
              <Description>"Enable Check point #2"</Description>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-05
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_DAMAGE_MULTI2,$process,2B C8 8D 04 11) // should be unique
alloc(newmem,$1000,INJECT_DAMAGE_MULTI2)

label(code)
label(return)

newmem:
  cmp rdi, [i_ignore_addr1]
  je calc_damage
  cmp rdi, [i_ignore_addr2]
  je calc_damage

  mov dword ptr [i_player_tag], 0

  push rcx
  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov cl, [rdi+5]
  and cl, 10
  cmp cl, 0
  pop rcx
  jne calc_damage

next1:
  push rcx
  mov cl, [ib_player_group]
  cmp [rdi+4], cl
  pop rcx
  jne calc_damage

  mov dword ptr [i_player_tag], 1

  cmp dword ptr [is_limit_damage_to_player], 1
  jne calc_damage
  cmp eax, [i_max_damage_to_player]
  jbe calc_damage
  movzx eax, [i_max_damage_to_player]

calc_damage:
  movaps, xmm14, [vf_damage_to_player]
  vcvtsi2ss xmm15, xmm15, eax
  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 eax, xmm15
  mov dword ptr [i_player_tag], 0
  mov [rbp+06], ax

code:
  sub ecx,eax
  lea eax,[rcx+rdx]
  jmp return
align 10 cc
  i_player_tag:
  dd 0

INJECT_DAMAGE_MULTI2:
  jmp newmem
return:
registersymbol(INJECT_DAMAGE_MULTI2)

[DISABLE]

INJECT_DAMAGE_MULTI2:
  db 2B C8 8D 04 11

unregistersymbol(INJECT_DAMAGE_MULTI2)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+301271

FFT_enhanced.exe+30123D: 83 E1 03                 - and ecx,03
FFT_enhanced.exe+301240: 66 89 84 4F 50 41 86 01  - mov [rdi+rcx*2+01864150],ax
FFT_enhanced.exe+301248: E8 97 16 00 00           - call FFT_enhanced.exe+3028E4
FFT_enhanced.exe+30124D: 48 8B 2D 5C 2E 56 01     - mov rbp,[FFT_enhanced.exe+18640B0]
FFT_enhanced.exe+301254: 48 8B 3D 6D 2E 56 01     - mov rdi,[FFT_enhanced.exe+18640C8]
FFT_enhanced.exe+30125B: 0F BF 45 06              - movsx eax,word ptr [rbp+06]
FFT_enhanced.exe+30125F: 0F B7 57 30              - movzx edx,word ptr [rdi+30]
FFT_enhanced.exe+301263: 44 0F B7 7F 32           - movzx r15d,word ptr [rdi+32]
FFT_enhanced.exe+301268: 0F BF 4D 08              - movsx ecx,word ptr [rbp+08]
FFT_enhanced.exe+30126C: 44 0F B7 47 34           - movzx r8d,word ptr [rdi+34]
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+301271: 2B C8                    - sub ecx,eax
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+301273: 8D 04 11                 - lea eax,[rcx+rdx]
FFT_enhanced.exe+301276: 8B CB                    - mov ecx,ebx
FFT_enhanced.exe+301278: 85 C0                    - test eax,eax
FFT_enhanced.exe+30127A: 0F 49 C8                 - cmovns ecx,eax
FFT_enhanced.exe+30127D: 0F BF 45 0A              - movsx eax,word ptr [rbp+0A]
FFT_enhanced.exe+301281: 41 3B CF                 - cmp ecx,r15d
FFT_enhanced.exe+301284: 44 0F 4E F9              - cmovle r15d,ecx
FFT_enhanced.exe+301288: 0F BF 4D 0C              - movsx ecx,word ptr [rbp+0C]
FFT_enhanced.exe+30128C: 2B C8                    - sub ecx,eax
FFT_enhanced.exe+30128E: 42 8D 04 01              - lea eax,[rcx+r8]
}
</AssemblerScript>
            </CheatEntry>
            <CheatEntry>
              <ID>134</ID>
              <Description>"Limit damage to player?"</Description>
              <DropDownListLink>YesNo</DropDownListLink>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>4 Bytes</VariableType>
              <Address>is_limit_damage_to_player</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>135</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>136</ID>
              <Description>"Multiplier to player"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_damage_to_player</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>137</ID>
              <Description>"Multiplier to enemy"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Float</VariableType>
              <Address>vf_damage_to_enemy</Address>
              <CheatEntries>
                <CheatEntry>
                  <ID>138</ID>
                  <Description>"Poach *may not* work if not 1"</Description>
                  <Color>8000FF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>139</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,$process,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:
  cmp rdi, [i_ignore_addr1]
  je endp
  cmp rdi, [i_ignore_addr2]
  je endp

  cmp dword ptr [is_check_friend_bit], 1
  jne next1
  mov al, [rdi+5]
  and al, 10
  cmp al, 0
  jne endp

next1:
  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 5
  ib_min_mov:
  db 7
  ib_min_spd:
  db 8
  ib_min_atk:
  db 7
  ib_min_matk:
  db 7
  ib_min_dodge:
  db 32


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>140</ID>
              <Description>"min. jmp"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_jmp</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>141</ID>
              <Description>"min. mov"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_mov</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>142</ID>
              <Description>"min. spd"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_spd</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>143</ID>
              <Description>"min. atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_atk</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>144</ID>
              <Description>"min. m. atk"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>C08000</Color>
              <VariableType>Byte</VariableType>
              <Address>ib_min_matk</Address>
            </CheatEntry>
            <CheatEntry>
              <ID>145</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>146</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,$process,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>147</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>148</ID>
              <Description>"Caution: 0 = get all"</Description>
              <Color>8000FF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>149</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>150</ID>
      <Description>"Browse &amp; set poach materials amount"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-08
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_GET_POACH_ITEMS,FFT_enhanced.exe,41 38 37 0F 86 ?? ?? ?? 00 48 8B) // should be unique
alloc(newmem,$1000,INJECT_GET_POACH_ITEMS)

alloc(INJECT_GET_POACH_ITEMSo, 9)

label(code)
label(return)
label(ib_min_poach_threshold ib_set_poach_amt_to)

INJECT_GET_POACH_ITEMSo:
  readmem(INJECT_GET_POACH_ITEMS, 9)

newmem:
  push rcx
  pushfq
  mov cl, [ib_min_poach_threshold]
  cmp [r15], cl
  jb endp
  mov cl, [ib_set_poach_amt_to]
  cmp [r15], cl
  jae endp
  mov [r15], cl


endp:
  popfq
  pop rcx

code:
  cmp [r15],sil
  reassemble(INJECT_GET_POACH_ITEMS+3)
  //jbe FFT_enhanced.exe+1A917B
  jmp return
align 10 cc
  ib_min_poach_threshold:
  db 1
  ib_set_poach_amt_to:
  db 14

INJECT_GET_POACH_ITEMS:
  jmp newmem
  nop 4
return:
registersymbol(INJECT_GET_POACH_ITEMS)
registersymbol(INJECT_GET_POACH_ITEMSo)
registersymbol(ib_min_poach_threshold ib_set_poach_amt_to)

[DISABLE]

INJECT_GET_POACH_ITEMS:
  //db 41 38 37 0F 86 F8 01 00 00
  readmem(INJECT_GET_POACH_ITEMSo, 9)

unregistersymbol(INJECT_GET_POACH_ITEMS)
dealloc(newmem)
unregistersymbol(INJECT_GET_POACH_ITEMSo)
dealloc(INJECT_GET_POACH_ITEMSo)
unregistersymbol(*)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+1A8F7A

FFT_enhanced.exe+1A8F48: 89 74 24 38                    - mov [rsp+38],esi
FFT_enhanced.exe+1A8F4C: 48 8B D9                       - mov rbx,rcx
FFT_enhanced.exe+1A8F4F: 49 89 73 C8                    - mov [r11-38],rsi
FFT_enhanced.exe+1A8F53: 49 BD AB AA AA AA AA AA AA 2A  - mov r13,2AAAAAAAAAAAAAAB
FFT_enhanced.exe+1A8F5D: 48 89 81 A0 17 00 00           - mov [rcx+000017A0],rax
FFT_enhanced.exe+1A8F64: 41 BA FF FF FF FF              - mov r10d,FFFFFFFF
FFT_enhanced.exe+1A8F6A: 8D 6E 01                       - lea ebp,[rsi+01]
FFT_enhanced.exe+1A8F6D: 89 74 24 48                    - mov [rsp+48],esi
FFT_enhanced.exe+1A8F71: 83 FD 60                       - cmp ebp,60
FFT_enhanced.exe+1A8F74: 0F 87 01 02 00 00              - ja FFT_enhanced.exe+1A917B
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+1A8F7A: 41 38 37                       - cmp [r15],sil
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+1A8F7D: 0F 86 F8 01 00 00              - jbe FFT_enhanced.exe+1A917B
FFT_enhanced.exe+1A8F83: 48 8B 8B A0 17 00 00           - mov rcx,[rbx+000017A0]
FFT_enhanced.exe+1A8F8A: 49 8B C5                       - mov rax,r13
FFT_enhanced.exe+1A8F8D: 48 2B 8B 98 17 00 00           - sub rcx,[rbx+00001798]
FFT_enhanced.exe+1A8F94: 48 8B BB A0 17 00 00           - mov rdi,[rbx+000017A0]
FFT_enhanced.exe+1A8F9B: 4C 8B 83 A8 17 00 00           - mov r8,[rbx+000017A8]
FFT_enhanced.exe+1A8FA2: 48 F7 E9                       - imul rcx
FFT_enhanced.exe+1A8FA5: 89 6C 24 38                    - mov [rsp+38],ebp
FFT_enhanced.exe+1A8FA9: 48 C1 FA 02                    - sar rdx,02
FFT_enhanced.exe+1A8FAD: 48 8B C2                       - mov rax,rdx
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>151</ID>
          <Description>"current amount must &gt;="</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>ib_min_poach_threshold</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>152</ID>
          <Description>"Set amount to"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>Byte</VariableType>
          <Address>ib_set_poach_amt_to</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>4939</ID>
      <Description>"Fast tavern errands (儲け話) complete"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-09
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_FAST_ERRANDS,FFT_enhanced.exe,43 0F B6 44 2E 02) // should be unique
alloc(newmem,$1000,INJECT_FAST_ERRANDS)

label(code)
label(return)

newmem:
  //cmp byte ptr [r14+r13+02], 0
  //je code
  mov al, [r14+r13+03]
  cmp al, [r14+r13+02]
  je code
  dec al
  mov [r14+r13+02], al


code:
  movzx eax,byte ptr [r14+r13+02]
  jmp return

INJECT_FAST_ERRANDS:
  jmp newmem
  nop
return:
registersymbol(INJECT_FAST_ERRANDS)

[DISABLE]

INJECT_FAST_ERRANDS:
  db 43 0F B6 44 2E 02

unregistersymbol(INJECT_FAST_ERRANDS)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+2E8658

FFT_enhanced.exe+2E8625: 8B 94 C5 C0 00 00 00     - mov edx,[rbp+rax*8+000000C0]
FFT_enhanced.exe+2E862C: 41 3B D4                 - cmp edx,r12d
FFT_enhanced.exe+2E862F: 0F 84 5C 01 00 00        - je FFT_enhanced.exe+2E8791
FFT_enhanced.exe+2E8635: 48 63 84 C5 C4 00 00 00  - movsxd  rax,dword ptr [rbp+rax*8+000000C4]
FFT_enhanced.exe+2E863D: 89 95 9C 00 00 00        - mov [rbp+0000009C],edx
FFT_enhanced.exe+2E8643: 4C 8D 34 C0              - lea r14,[rax+rax*8]
FFT_enhanced.exe+2E8647: 43 0F B6 4C 2E 03        - movzx ecx,byte ptr [r14+r13+03]
FFT_enhanced.exe+2E864D: 89 8D A4 00 00 00        - mov [rbp+000000A4],ecx
FFT_enhanced.exe+2E8653: 83 FA 02                 - cmp edx,02
FFT_enhanced.exe+2E8656: 75 0E                    - jne FFT_enhanced.exe+2E8666
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+2E8658: 43 0F B6 44 2E 02        - movzx eax,byte ptr [r14+r13+02]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+2E865E: 2B C8                    - sub ecx,eax
FFT_enhanced.exe+2E8660: 89 8D B0 00 00 00        - mov [rbp+000000B0],ecx
FFT_enhanced.exe+2E8666: 83 FA 03                 - cmp edx,03
FFT_enhanced.exe+2E8669: 48 8D 4C 24 60           - lea rcx,[rsp+60]
FFT_enhanced.exe+2E866E: B8 06 00 00 00           - mov eax,00000006
FFT_enhanced.exe+2E8673: 48 89 4C 24 48           - mov [rsp+48],rcx
FFT_enhanced.exe+2E8678: 41 0F 44 C4              - cmove eax,r12d
FFT_enhanced.exe+2E867C: 48 8D 3D 7D 79 D1 FF     - lea rdi,[FFT_enhanced.exe]
FFT_enhanced.exe+2E8683: 49 83 C5 06              - add r13,06
FFT_enhanced.exe+2E8687: 4C 8D 65 C0              - lea r12,[rbp-40]
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>4940</ID>
          <Description>"Usage: 1. accept errand; 2. leave errands menu; 3. enter errands menu"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>153</ID>
      <Description>"Get money"</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_GET_MONEY,$process,0F 10 49 30 0F 11 48 30 0F 10 41 40 0F 11 40 40 0F 10 49 50 0F 11 48 50 0F 10 41 60 0F 11 40 60 49 03 C2) // should be unique
alloc(newmem,$1000,INJECT_GET_MONEY)

label(code)
label(return)
label(i_base_money_addr)

newmem:
  pushfq
  cmp edx, 7
  jne @F

  mov [i_base_money_addr], rcx

@@:
  popfq

code:
  movups xmm1,[rcx+30]
  movups [rax+30],xmm1
  jmp return
align 10 cc
  i_base_money_addr:
  dq 0

INJECT_GET_MONEY:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_GET_MONEY)
registersymbol(i_base_money_addr)

[DISABLE]

INJECT_GET_MONEY:
  db 0F 10 49 30 0F 11 48 30

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+2060F4

FFT_enhanced.exe+2060C2: 41 0F 11 88 22 86 00 00  - movups [r8+00008622],xmm1
FFT_enhanced.exe+2060CA: 8A 05 8E 69 57 00        - mov al,[FFT_enhanced.exe+77CA5E]
FFT_enhanced.exe+2060D0: 41 88 80 38 8A 00 00     - mov [r8+00008A38],al
FFT_enhanced.exe+2060D7: 49 8D 80 34 86 00 00     - lea rax,[r8+00008634]
FFT_enhanced.exe+2060DE: 0F 10 01                 - movups xmm0,[rcx]
FFT_enhanced.exe+2060E1: 0F 11 00                 - movups [rax],xmm0
FFT_enhanced.exe+2060E4: 0F 10 49 10              - movups xmm1,[rcx+10]
FFT_enhanced.exe+2060E8: 0F 11 48 10              - movups [rax+10],xmm1
FFT_enhanced.exe+2060EC: 0F 10 41 20              - movups xmm0,[rcx+20]
FFT_enhanced.exe+2060F0: 0F 11 40 20              - movups [rax+20],xmm0
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+2060F4: 0F 10 49 30              - movups xmm1,[rcx+30]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+2060F8: 0F 11 48 30              - movups [rax+30],xmm1
FFT_enhanced.exe+2060FC: 0F 10 41 40              - movups xmm0,[rcx+40]
FFT_enhanced.exe+206100: 0F 11 40 40              - movups [rax+40],xmm0
FFT_enhanced.exe+206104: 0F 10 49 50              - movups xmm1,[rcx+50]
FFT_enhanced.exe+206108: 0F 11 48 50              - movups [rax+50],xmm1
FFT_enhanced.exe+20610C: 0F 10 41 60              - movups xmm0,[rcx+60]
FFT_enhanced.exe+206110: 0F 11 40 60              - movups [rax+60],xmm0
FFT_enhanced.exe+206114: 49 03 C2                 - add rax,r10
FFT_enhanced.exe+206117: 0F 10 49 70              - movups xmm1,[rcx+70]
FFT_enhanced.exe+20611B: 49 03 CA                 - add rcx,r10
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>154</ID>
          <Description>"Usage: enter -&gt; leave main menu"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>155</ID>
          <Description>"value"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_base_money_addr</Address>
          <Offsets>
            <Offset>30</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>156</ID>
      <Description>"Map: Status menu: get characters data"</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,$process,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 i_current_member_count i_nodes_needed)

newmem:
  push r15
  push r13
  push rcx
  xor r13, r13
  mov qword ptr [i_current_member_count], 0

loop1:
  mov r15, i_equip_screen_jp_addr
  mov [i_current_member_count], r13
  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:
  add qword ptr [i_current_member_count], 1

  mov r15d, [i_current_member_count]
  vcvtsi2ss xmm15, xmm15, r15d
  vmovss xmm14, [vf_mul_num]
  vmulss xmm15, xmm14, xmm15
  vcvtss2si r15d, xmm15
  mov [i_nodes_needed], r15d

  pop rcx
  pop r13
  pop r15



code:
  movups xmm0,[rdi+00000080]
  jmp return
align 10 cc
  i_current_member_count:
  dq 0 0
  i_nodes_needed:
  dd 0
  vf_mul_num:
  dd (float)88
  align 10 0
  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 i_current_member_count i_nodes_needed)

[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>157</ID>
          <Description>"Usage: enter / leave main menu"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>158</ID>
          <Description>"Do not edit data when in Job / troops menu"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>159</ID>
          <Description>"Re-enable when member changed"</Description>
          <Color>8000FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>160</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>161</ID>
          <Description>"~count"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>808080</Color>
          <VariableType>8 Bytes</VariableType>
          <Address>i_current_member_count</Address>
          <CheatEntries>
            <CheatEntry>
              <ID>173</ID>
              <Description>"Approx. # of new nodes needed:"</Description>
              <ShowAsSigned>0</ShowAsSigned>
              <Color>808080</Color>
              <VariableType>4 Bytes</VariableType>
              <Address>i_nodes_needed</Address>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>162</ID>
          <Description>"Generate list (may take minutes...)"</Description>
          <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
          <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
-- 建立節點的通用函數（擴充支援 binary 和 dropdown）
local function createNode(desc, addr, vtype, parent, color, showHex, startBit, bitLength, dropdownMemrec)
  local node = addressList.createMemoryRecord()
  node.Description = desc
  if addr then
    node.Address = string.format("%X", addr)
    node.Type = vtype or vtByte
    node.ShowAsHex = showHex or false

    -- 如果是 binary 類型，設定 bit 相關參數
    if vtype == vtBinary then
      node.Binary.Startbit = startBit or 0
      node.Binary.Size = bitLength or 1
    end

    -- 如果有指定 dropdown，設定連結
    if dropdownMemrec then
      node.DropDownLinked = true
      node.DropDownLinkedMemrec = dropdownMemrec
    end
  else
    node.IsGroupHeader = true
    node.Options = "[moHideChildren]"
  end
  node.Parent = parent
  node.Color = color
  return node
end
-- 開始讀取地址清單
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
  -- 基本資料定義表（格式：名稱, 偏移, 型別, 顯示16進位, startBit, bitLength, dropdownMemrec）
  local statsData = {
    {"Type/Char ID", 0, vtByte, true, nil, nil, "Char.ID"},
    {"Seq", 0x1, vtByte},
    {"Job ID (ref. only)", 0x2, vtByte, false, nil, nil, "Job.ID"},  -- 設定 dropdown
    {"EXP", 0x1C, vtByte},
    {"Lv", 0x1D, vtByte},
    {"Brave", 0x1E, vtByte},
    {"Faith", 0x1F, vtByte},
    {"Display Seq#", 0x122, vtByte},
    {"Favorite", 0x124, vtBinary, false, 0, 1, "YesNo"}
  }
  -- 技能群組
  local skillsData = {
    {"Base job --&gt; act #1", 0x32, vtBinary, false, 7, 1},
    {"Base job --&gt; act #2", 0x32, vtBinary, false, 6, 1},
    {"Base job --&gt; act #3", 0x32, vtBinary, false, 5, 1},
    {"Base job --&gt; act #4", 0x32, vtBinary, false, 4, 1},
    {"Base job --&gt; act #5", 0x32, vtBinary, false, 3, 1},
    {"Base job --&gt; act #6", 0x32, vtBinary, false, 2, 1},
    {"Base job --&gt; act #7", 0x32, vtBinary, false, 1, 1},
    {"Base job --&gt; act #8 / Squire Ultima", 0x32, vtBinary, false, 0, 1},
    {"Base job --&gt; act #9 / Gallant knight Ultima", 0x33, vtBinary, false, 7, 1},
    {"Base job --&gt; act #10 / Holy knight Ultima?", 0x33, vtBinary, false, 6, 1},
    {"Base job --&gt; act #11", 0x33, vtBinary, false, 5, 1},
    {"Base job --&gt; act #12", 0x33, vtBinary, false, 4, 1},
    {"Base job --&gt; act #13", 0x33, vtBinary, false, 3, 1},
    {"Base job --&gt; act #14", 0x33, vtBinary, false, 2, 1},
    {"Base job --&gt; act #15", 0x33, vtBinary, false, 1, 1},
    {"Base job --&gt; act #16", 0x33, vtBinary, false, 0, 1},
    {"Summoner --&gt; Zodiac / ゾディアーク", 0x4B, vtBinary, false, 0, 1},  -- binary: startBit=0, length=1
  }
  -- 技能設定群組
  local EquAbilitiesData = {
    {"Action", 0x7, vtByte, false, nil, nil, "Ability.ID"},
    {"Reaction", 0x8, vtByte, false, nil, nil, "Ability.ID"},
    {"Reaction Enabled", 0x9, vtByte, false, nil, nil, "YesNo"},
    {"Support", 0xA, vtByte, false, nil, nil, "Ability.ID"},
    {"Support Enabled", 0xB, vtByte, false, nil, nil, "YesNo"},
    {"Move", 0xC, vtByte, false, nil, nil, "Ability.ID"},
    {"Move Enabled", 0xD, vtByte, false, nil, nil, "YesNo"},
  }
  -- 裝備資料定義表
  local equipData = {
    {"Right hand", 0x14, vtWord},
    {"Unknown", 0x16, vtWord},
    {"Left hand", 0x18, vtWord},
    {"Shield", 0x1A, vtWord},
    {"Head", 0x0E, vtWord},
    {"Body", 0x10, vtWord},
    {"Accessory", 0x12, vtWord}
  }
  -- 建立所有角色 nodes
  for n = 0, maxItems - 1 do
    local ptrAddr = listStartAddr + n * 8
    local itemAddr = readQword(ptrAddr)
    if itemAddr == 0 then break end
    local charColor = (charIndex % 2 == 1) and evenColor or oddColor
    -- 建立角色群組節點
    local charNode = createNode(string.format("Char[%02d]", charIndex), nil, nil, parentRecord, charColor)
    -- 建立子群組
    local statsNode = createNode("Stats+", nil, nil, charNode, charColor)
    local skillsNode = createNode("Abilities+", nil, nil, charNode, charColor)
    local EquAbilityNode = createNode("Current Abilities+", nil, nil, charNode, charColor)
    local equipNode = createNode("Equip IDs+", nil, nil, charNode, charColor)
    local jpNode = createNode("JP+", nil, nil, charNode, charColor)
    local jpExpNode = createNode("JP EXP+", nil, nil, charNode, charColor)
    -- 建立基本資料項目
    for i, data in ipairs(statsData) do
      local color = (i % 2 == 1) and jpEvenColor or jpOddColor
      createNode(data[1], itemAddr + data[2], data[3], statsNode, color, data[4], data[5], data[6], data[7])
    end
    -- 建立技能項目
    for i, data in ipairs(skillsData) do
      local color = (i % 2 == 1) and jpEvenColor or jpOddColor
      createNode(data[1], itemAddr + data[2], data[3], skillsNode, color, data[4], data[5], data[6], data[7])
    end
    -- 建立裝備中的技能項目
    for i, data in ipairs(EquAbilitiesData) do
      local color = (i % 2 == 1) and jpEvenColor or jpOddColor
      createNode(data[1], itemAddr + data[2], data[3], EquAbilityNode, color, data[4], data[5], data[6], data[7])
    end
    -- 建立裝備資料項目
    for i, data in ipairs(equipData) do
      local color = (i % 2 == 1) and jpEvenColor or jpOddColor
      createNode(data[1], itemAddr + data[2], data[3], equipNode, color)
    end
    -- 建立 JP[01] 到 JP[22]
    for i = 1, 22 do
      local color = (i % 2 == 1) and jpEvenColor or jpOddColor
      createNode(string.format("JP[%02d]", i), itemAddr + (i - 1) * 2 + 0x80, vtWord, jpNode, color)
    end
    -- 建立 JP EXP[01] 到 JP EXP[22]
    for i = 1, 22 do
      local color = (i % 2 == 1) and jpEvenColor or jpOddColor
      createNode(string.format("JP EXP[%02d]", i), itemAddr + (i - 1) * 2 + 0xAE, vtWord, jpExpNode, color)
    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()
--]]
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

  local totalCount = parent.Count
  print(string.format("Clearing %d nodes...", totalCount))

  -- 批次刪除並定期回收
  local batchSize = 5
  local deleted = 0

  while parent.Count &gt; 0 do
    for i = 1, math.min(batchSize, parent.Count) do
      if parent.Count &gt; 0 then
        local child = parent.Child[parent.Count - 1]
        child.destroy()
        deleted = deleted + 1
      end
    end

    -- 每批次後回收一次
    collectgarbage("collect")
  end

  parent.Active = false

  -- 最後再回收幾次
  collectgarbage("collect")
  collectgarbage("collect")

  print(string.format("Cleared %d records", deleted))
end)

collectgarbage("collect")
closeLuaEngine()
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>163</ID>
              <Description>"Get selected char address"</Description>
              <Options moHideChildren="1" moDeactivateChildrenAsWell="1"/>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript Async="1">{ Game   : FFT_enhanced.exe
  Version: 
  Date   : 2025-10-08
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscanmodule(INJECT_CUR_SEL_CHAR,FFT_enhanced.exe,8A 42 02 88 41 03) // should be unique
alloc(newmem,$1000,INJECT_CUR_SEL_CHAR)

label(code)
label(return)
label(i_cur_sel_char)

newmem:
  mov [i_cur_sel_char], rdx

code:
  mov al,[rdx+02]
  mov [rcx+03],al
  jmp return
align 10 cc
  i_cur_sel_char:
  dq 0

INJECT_CUR_SEL_CHAR:
  jmp newmem
  nop
return:
registersymbol(INJECT_CUR_SEL_CHAR)
registersymbol(i_cur_sel_char)

[DISABLE]

INJECT_CUR_SEL_CHAR:
  db 8A 42 02 88 41 03

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: FFT_enhanced.exe+DF39359

FFT_enhanced.exe+DF39339: 81 EE 9F 4C 89 AB  - sub esi,AB894C9F
FFT_enhanced.exe+DF3933F: 40 20 F0           - and al,sil
FFT_enhanced.exe+DF39342: 31 ED              - xor ebp,ebp
FFT_enhanced.exe+DF39344: 04 08              - add al,08
FFT_enhanced.exe+DF39346: 88 41 05           - mov [rcx+05],al
FFT_enhanced.exe+DF39349: 88 81 EE 01 00 00  - mov [rcx+000001EE],al
FFT_enhanced.exe+DF3934F: 8A 02              - mov al,[rdx]
FFT_enhanced.exe+DF39351: 88 01              - mov [rcx],al
FFT_enhanced.exe+DF39353: 8A 42 01           - mov al,[rdx+01]
FFT_enhanced.exe+DF39356: 88 41 02           - mov [rcx+02],al
// ---------- INJECTING HERE ----------
FFT_enhanced.exe+DF39359: 8A 42 02           - mov al,[rdx+02]
// ---------- DONE INJECTING  ----------
FFT_enhanced.exe+DF3935C: 88 41 03           - mov [rcx+03],al
FFT_enhanced.exe+DF3935F: 8A 82 21 01 00 00  - mov al,[rdx+00000121]
FFT_enhanced.exe+DF39365: 88 81 F4 01 00 00  - mov [rcx+000001F4],al
FFT_enhanced.exe+DF3936B: 89 E9              - mov ecx,ebp
FFT_enhanced.exe+DF3936D: 0F B6 42 03        - movzx eax,byte ptr [rdx+03]
FFT_enhanced.exe+DF39371: 80 7A 01 32        - cmp byte ptr [rdx+01],32
FFT_enhanced.exe+DF39375: 0F 43 C8           - cmovae ecx,eax
FFT_enhanced.exe+DF39378: 88 4B 04           - mov [rbx+04],cl
FFT_enhanced.exe+DF3937B: 8B 0D F7 A9 E6 06  - mov ecx,[FFT_enhanced.exe+14DA3D78]
FFT_enhanced.exe+DF39381: 81 E9 21 DF 00 57  - sub ecx,5700DF21
}
</AssemblerScript>
              <CheatEntries>
                <CheatEntry>
                  <ID>2486</ID>
                  <Description>"Note: do not edit char data when it's "selected""</Description>
                  <Color>8000FF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
                <CheatEntry>
                  <ID>164</ID>
                  <Description>"selected"</Description>
                  <ShowAsHex>1</ShowAsHex>
                  <ShowAsSigned>0</ShowAsSigned>
                  <Color>C08000</Color>
                  <VariableType>8 Bytes</VariableType>
                  <Address>i_cur_sel_char</Address>
                </CheatEntry>
                <CheatEntry>
                  <ID>166</ID>
                  <Description>"Expand selected char"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then return end
--NO_ACTIVATE
local curSelSymbol = "i_cur_sel_char"
local parentName = "+List (do not delete this)"
local addressList = getAddressList()

-- 讀取當前選中的角色地址
local curSelAddr = getAddressSafe(curSelSymbol)
if not curSelAddr then
  print("Symbol not found: " .. curSelSymbol)
  return
end

local targetAddr = readQword(curSelAddr)
if not targetAddr or targetAddr == 0 then
  print("No character selected (address is 0)")
  return
end

print(string.format("Target address: %X", targetAddr))

synchronize(function()
  -- 找到父節點
  local parent = addressList.getMemoryRecordByDescription(parentName)
  if not parent then
    print("Parent node not found: " .. parentName)
    return
  end

  local foundChar = nil

  -- 遍歷所有 Char[nn] 節點
  for i = 0, parent.Count - 1 do
    local charNode = parent.Child[i]

    -- 尋找 Stats+ 群組
    local statsNode = nil
    for j = 0, charNode.Count - 1 do
      if charNode.Child[j].Description == "Stats+" then
        statsNode = charNode.Child[j]
        break
      end
      print("Stats+ not found")
    end

    if statsNode then
      -- 尋找 Type 節點
      local typeNode = nil
      for k = 0, statsNode.Count - 1 do
        if statsNode.Child[k].Description == "Type/Char ID" then
          typeNode = statsNode.Child[k]
          break
        end
        print("Type/Char ID not found")
      end

      if typeNode and typeNode.Address then
        -- 取得 Type 節點的地址並轉換為數值
        local typeAddr = getAddressSafe(typeNode.Address)

        -- 比對地址
        if typeAddr == targetAddr then
          foundChar = charNode
          print(string.format("Found matching character: %s (Address: %X)", charNode.Description, typeAddr))
        else
          -- 收合其他 Char 節點
          charNode.Collapsed = true
          charNode.Active = false
        end
      end
    end
  end

  -- 如果找到匹配的角色，展開它
  if foundChar then
    foundChar.Collapsed = false  -- 展開找到的角色
    foundChar.Active = true  -- 展開找到的角色
    parent.Collapsed = false      -- 確保父節點也是展開的
    parent.Active = true      -- 確保父節點也是展開的
    print(string.format("Expanded: %s", foundChar.Description))
  else
    print("No matching character found")
  end
end)

closeLuaEngine()

[DISABLE]
{$lua}
if syntaxcheck then return end

local parentName = "+List (do not delete this)"
local addressList = getAddressList()

synchronize(function()
  local parent = addressList.getMemoryRecordByDescription(parentName)
  if not parent then
    print("Parent node not found: " .. parentName)
    return
  end

  -- 收合所有 Char 節點
  for i = 0, parent.Count - 1 do
    parent.Child[i].Collapsed = true
    parent.Child[i].Active = false
  end

  print("All character nodes collapsed")
end)

closeLuaEngine()
</AssemblerScript>
                </CheatEntry>
                <CheatEntry>
                  <ID>165</ID>
                  <Description>"(Auto mode) Expand selected char"</Description>
                  <VariableType>Auto Assembler Script</VariableType>
                  <AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then return end

local curSelSymbol = "i_cur_sel_char"
local parentName = "+List (do not delete this)"
local addressList = getAddressList()

local lastTargetAddr = nil

-- 更新展開狀態的函數
local function updateExpansion()
  local curSelAddr = getAddressSafe(curSelSymbol)
  if not curSelAddr then return end

  local targetAddr = readQword(curSelAddr)
  if not targetAddr or targetAddr == 0 then return end

  -- 如果地址沒變，不需要更新
  if targetAddr == lastTargetAddr then return end
  lastTargetAddr = targetAddr

  synchronize(function()
    local parent = addressList.getMemoryRecordByDescription(parentName)
    if not parent then return end

    -- 遍歷所有 Char[nn] 節點
    for i = 0, parent.Count - 1 do
      local charNode = parent.Child[i]

      -- 尋找 Stats+ -&gt; Type
      local statsNode = nil
      for j = 0, charNode.Count - 1 do
        if charNode.Child[j].Description == "Stats+" then
          statsNode = charNode.Child[j]
          break
        end
      end

      if statsNode then
        local typeNode = nil
        for k = 0, statsNode.Count - 1 do
          if statsNode.Child[k].Description == "Type/Char ID" then
            typeNode = statsNode.Child[k]
            break
          end
        end

        if typeNode and typeNode.Address then
          local typeAddr = getAddressSafe(typeNode.Address)

          if typeAddr == targetAddr then
            charNode.Collapsed = false  -- 展開匹配的角色
            parent.Collapsed = false    -- 展開父節點
            charNode.Active = true  -- 展開匹配的角色
            parent.Active = true    -- 展開父節點
          else
            charNode.Collapsed = true   -- 收合其他角色
            charNode.Active = false   -- 收合其他角色
          end
        end
      end
    end
  end)
end

-- 建立 timer 定期檢查
timerSel = createTimer(getMainForm())
timerSel.Interval = 800  -- 每 800ms 檢查一次
timerSel.OnTimer = updateExpansion

-- 立即執行一次
updateExpansion()

print("Auto-expand character tracking enabled")
closeLuaEngine()

[DISABLE]
{$lua}
if syntaxcheck then return end

if timerSel then
  timerSel.destroy()
  timerSel = nil
end

local parentName = "+List (do not delete this)"
local addressList = getAddressList()

--[[
synchronize(function()
  local parent = addressList.getMemoryRecordByDescription(parentName)
  if not parent then return end

  for i = 0, parent.Count - 1 do
    parent.Child[i].Collapsed = true
    parent.Child[i].Active = false
  end
end)
--]]

print("Auto-expand disabled, all nodes collapsed")
closeLuaEngine()

</AssemblerScript>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>167</ID>
              <Description>"Modify all JP value to 8000, if not zero"</Description>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript Async="1">[ENABLE]
{$lua}
if syntaxcheck then return end
--NO_ACTIVATE
local PARENT_NAME = "+List (do not delete this)"
local JP_GROUP_NAME = "JP+"
local TARGET_VALUE = 8000

local addressList = getAddressList()

synchronize(function()
  local parent = addressList.getMemoryRecordByDescription(PARENT_NAME)
  if not parent then
    print("Parent node not found: " .. PARENT_NAME)
    return
  end

  local modifiedCount = 0

  -- 遍歷所有 Char[nn] 節點
  for i = 0, parent.Count - 1 do
    local charNode = parent.Child[i]

    -- 遍歷 Char 下的所有群組，找到 JP+
    for j = 0, charNode.Count - 1 do
      local groupNode = charNode.Child[j]

      if groupNode.Description == JP_GROUP_NAME then
        -- 修改 JP+ 下所有非零子節點
        for k = 0, groupNode.Count - 1 do
          local jpNode = groupNode.Child[k]

          -- 讀取角前值
          local addr = getAddressSafe(jpNode.Address)
          if addr then
            local currentValue = readSmallInteger(addr)

            -- 如果不是 0，則改為 8000
            if currentValue and currentValue ~= 0 and currentValue &lt; TARGET_VALUE then
              writeSmallInteger(addr, TARGET_VALUE)
              modifiedCount = modifiedCount + 1
            end
          end
        end
        break  -- 找到 JP+ 後就跳出，不用繼續找
      end
    end
  end

  print(string.format("Modified %d JP values to %d", modifiedCount, TARGET_VALUE))
end)

closeLuaEngine()

[DISABLE]

</AssemblerScript>
            </CheatEntry>
            <CheatEntry>
              <ID>168</ID>
              <Description>"Modify all JP EXP value to 1200, if not zero &amp; &lt; 1200"</Description>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript Async="1">[ENABLE]
{$lua}
if syntaxcheck then return end
--NO_ACTIVATE
local PARENT_NAME = "+List (do not delete this)"
local JP_GROUP_NAME = "JP EXP+"
local TARGET_VALUE = 1200

local addressList = getAddressList()

synchronize(function()
  local parent = addressList.getMemoryRecordByDescription(PARENT_NAME)
  if not parent then
    print("Parent node not found: " .. PARENT_NAME)
    return
  end

  local modifiedCount = 0

  for i = 0, parent.Count - 1 do
    local charNode = parent.Child[i]

    for j = 0, charNode.Count - 1 do
      local groupNode = charNode.Child[j]

      if groupNode.Description == JP_GROUP_NAME then
        for k = 0, groupNode.Count - 1 do
          local jpNode = groupNode.Child[k]

          local addr = getAddressSafe(jpNode.Address)
          if addr then
            local currentValue = readSmallInteger(addr)

            if currentValue and currentValue ~= 0 and currentValue &lt; TARGET_VALUE then
              writeSmallInteger(addr, TARGET_VALUE)
              modifiedCount = modifiedCount + 1
            end
          end
        end
        break
      end
    end
  end

  print(string.format("Modified %d JP EXP values to %d", modifiedCount, TARGET_VALUE))
end)

closeLuaEngine()

[DISABLE]

</AssemblerScript>
            </CheatEntry>
            <CheatEntry>
              <ID>169</ID>
              <Description>"Modify all EXP value to 99"</Description>
              <VariableType>Auto Assembler Script</VariableType>
              <AssemblerScript Async="1">[ENABLE]
{$lua}
if syntaxcheck then return end
--NO_ACTIVATE
local PARENT_NAME = "+List (do not delete this)"
local JP_GROUP_NAME = "Stats+"
local XP_NAME = "EXP"
local TARGET_VALUE = 99

local addressList = getAddressList()

synchronize(function()
  local parent = addressList.getMemoryRecordByDescription(PARENT_NAME)
  if not parent then
    print("Parent node not found: " .. PARENT_NAME)
    return
  end

  local modifiedCount = 0

  for i = 0, parent.Count - 1 do
    local charNode = parent.Child[i]

    for j = 0, charNode.Count - 1 do
      local groupNode = charNode.Child[j]

      if groupNode.Description == JP_GROUP_NAME then
        for k = 0, groupNode.Count - 1 do
          local jpNode = groupNode.Child[k]
          if jpNode.Description == XP_NAME then
            local addr = getAddressSafe(jpNode.Address)
            --print(addr)
            if addr then
              local currentValue = readBytes(addr)
              if currentValue and currentValue &lt; TARGET_VALUE then
                writeBytes(addr, TARGET_VALUE)
                modifiedCount = modifiedCount + 1
              end
            end
          end
        end
        break
      end
    end
  end

  print(string.format("Modified %d EXP values to %d", modifiedCount, TARGET_VALUE))
end)

closeLuaEngine()

[DISABLE]

</AssemblerScript>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>170</ID>
          <Description>"+List (do not delete this)"</Description>
          <Options moHideChildren="1"/>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>171</ID>
      <Description>"FINAL FANTASY TACTICS - The Ivalice Chronicles  /  https://opencheattables.com"</Description>
      <Options moHideChildren="1"/>
      <Color>009500</Color>
      <GroupHeader>1</GroupHeader>
      <CheatEntries>
        <CheatEntry>
          <ID>172</ID>
          <Description>"Job.ID"</Description>
          <DropDownList DisplayValueAsItem="1">2:*Squire (hero)
3:*Gallant knight (hero)
13:Sword master?
22:Machinist
25:*Skyseer / 天道士
26:Netherseer / 天冥士
27:(e)Arknight
30:Holy Knight
31:*Temple Knight
38:(e)Knight blade
40:(e)White Knight
41:Skyseer / 天道士
42:Divine Knight
45:(e)Assassin
46:(e)Assassin
48:*Cleric
50:Soldier
74:Squire
75:Chemist
76:Knight
77:Archer
78:Monk
79:White Mage
80:Black Mage
81:Time Mage
82:Summoner
83:Thief
84:Orator
85:Mystic
86:Geomancer
87:Dragoon
88:Samurai
89:Ninja
90:Arithmetician
91:Bard
92:Dancer
93:Mime
</DropDownList>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>7204</ID>
          <Description>"YesNo"</Description>
          <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>10309</ID>
          <Description>"Char.ID"</Description>
          <DropDownList DisplayValueAsItem="1">03:Hero
32:Cloud
80:Generic/Male
81:Generic/Female
</DropDownList>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>7203</ID>
          <Description>"Ability.ID"</Description>
          <DropDownList DisplayValueAsItem="1">5:(act)Fundaments / 基本技
6:(act)Items / アイテム
7:(act)Arts of War / 戦技
8:(act)Aim / チャージ
9:(act)Martial Arts / 拳術
10:(act)White Magicks / 白魔法
11:(act)Black Magicks / 黒魔法
12:(act)Time Magicks / 時魔法
13:(act)Summon / 召喚魔法
14:(act)Steal / 盗む
15:(act)Speechcraft / 話術
16:(act)Mystic Magicks / 陰陽術
17:(act)Geomancy / 風水術
18:(act)Jump / ジャンプ
19:(act)Iaido / 引き出す
20:(act)Throw / 投げる
21:(act)Arithmeticks / 算術
22:(act)Bardsong
23:(act)Dance
27:(act)Mettle / ガッツ
29:(act/npc)Holy sword / 聖剣技
38:(act)Aimed Shot / 狙撃
40:(act)Holy sword / 聖剣技
41:(act)Limit / リミット
42:(act/npc)Sacred Healing Magic / 白養魔法
43:(act)Dragon / ドラゴン
46:(act)Nether Mantra / 裏真言
50:(act)Sky Mantra / 真言
54:(act/npc)Performer / 仕手
55:(act/npc)Performer / 仕手
56:(act/npc)Throw / 投げる
62:(act/npc)Blade Beam / 刀魂放気
63:(act/npc)Drain / 吸血
64:(act/npc)Unyielding Blade / 剛剣
66:(act/npc)Unyielding Blade / 剛剣
67:(act)Unyielding Blade / 剛剣
69:(act)Spellblade / 魔法剣
70:(act/npc)Swordskill / 剣技
71:(act/npc)All Magicks / 全魔法
74:(act)Swordplay / 全剣技
75:(act/npc)Destory Spellblade / 破壊魔剣
76:(act/npc)Holy Magicks / 聖魔法
107:(act/boss):?
108:(act/boss):?
111:(act/boss):?
112:(act/boss):?
119:(act/boss):?
120:(act/boss):?
123:(act/boss):?
124:(act/boss):?
125:(act/boss):?
126:(act/boss):?
166:(rct)Strength Surge
168:(rct)Speed Surge / 反動スピードアップ
169:(rct)Vanish
170:(rct)Vigilance / 警戒
171:(rct)Dragonheart / 竜の魂
172:(rct)Regenerate
173:(rct)Speed Surge
175:(rct)Critical: Recover HP / 瀕死HP回復
176:(rct)Critical: Recover MP / 瀕死MP回復
177:(rct)Critical: Quick
178:(rct)Bonecrusher / 肉斬骨断
179:(rct)Magick Counter / 魔法返し
180:(rct)Counter Tackle / 反撃タックル
181:(rct)Nature's Wrath / 風水返し
182:(rct)Absorb MP
183:(rct)Gil Snapper / ギルガメの心
185:(rct)Auto-Potion
186:(rct)Counter / カウンター
188:(rct)Cup of Life
189:(rct)Mana Shield
190:(rct)Soulbind
191:(rct)Parry / 装備武器ガード
192:(rct)Earplugs / 耳をふさぐ
193:(rct)Reflexes / 見切る
194:(rct)Sticky Fingers / キャッチ
195:(rct)Shirahadori / 白刃取り
196:(rct)Archer's bane / 矢かわし
197:(rct)First Strike
198:(sup)Equip Heavy Armor / 兜鎧装備
199:(sup)Equip Shields / 盾装備
200:(sup)Equip Swords / 剣装備
201:(sup)Equip Katana / 刀装備
202:(sup)Equip Crossbows / 自動弓装備
203:(sup)Equip Polearms
204:(sup)Equip Axes
205:(sup)Equip Guns
206:(sup)Halve MP / 消費MP半減
207:(sup)JP Boost / 獲得JPアップ
208:(sup)EXP Boost / 獲得EXPアップ
209:(sup)Attack Boost / 物理攻撃アップ
210:(sup)Defense Boost / 物理防御アップ
211:(sup)Magick Boost
212:(sup)Magick Defense Boost / 魔法防御アップ
213:(sup)Concentrate / 精神統一
214:(sup)Tame
215:(sup)Poach / 密猟
216:(sup)Brawler / 格闘
217:(sup)Beast Tongue
218:(sup)Throw Items
219:(sup)Safeguard
220:(sup)Doublehand
221:(sup)Dual Wired
222:(sup)Beastmonster / モンスター使い
223:(sup)Evasive Stance / 回避構え
224:(sup)Equip Change / 戦闘装備変更
226:(sup)Swiftspell
230:(mov)Move +1 / 移動+1
231:(mov)Move +2 / 移動+2
232:(mov)Move +3 / 移動+3
233:(mov)Jump +1 / 跳躍+1
234:(mov)Jump +2 / 跳躍+2
235:(mov)Jump +3 / 跳躍+3
236:(mov)Ignore Elevation / 高低差無視移動
237:(mov)Move-HP Up / ＨＰ回復移動
238:(mov)Manafont
239:(mov)Accure EXP
240:(mov)Accure JP
242:(mov)Teleport / テレポ
243:(mov/npc)Master Teleporation / ダテレポ
244:(mov)Ignore Weather
245:(mov)Ignore Terrain / 地形無視移動
246:(mov)Waterwalking / 水面移動
247:(mov)Swim
248:(mov)Lavawalking / 溶岩上移動
250:(mov)Levitate
251:(mov)Fly / 飛行移動
253:(mov)Treasure Hunter
</DropDownList>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
      </CheatEntries>
    </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
]]--

--memory record IDs now allowed to be 'locked'
-- IDs: list of ID found in .CT file:
-- &lt;CheatEntry&gt;
--      &lt;ID&gt;2218&lt;/ID&gt;  &lt;--- Here

-- 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
</LuaScript>
</CheatTable>
