I played this way back when it first came out.
Did quick scan and found ptr to all the character stats so added it here for those who wish to poke around.
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>4274</ID>
<Description>"UpdateCharList"</Description>
<LastState/>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then return end
local mr_CharBase = AddressList.getMemoryRecordByDescription('Character_Base')
for i=mr_CharBase.Count-1,0,-1 do
mr_CharBase.Child[i].delete()
end
local function ParseTableChildrenToMR(mrParent, srcTable)
local tmr,k,v
if srcTable.Children ~= nil then
for _,tmr in pairs(srcTable.Children) do
-- check if description matches evolve
local mr = AddressList.createMemoryRecord()
for k,v in pairs(tmr) do
if string.sub(k,1,1) ~= '_' and k ~= 'Children' and k ~= 'Offset' then
-- _*, Children & Offset are handled separately. Could not just do type in this case
mr[k] = v
end
end
mr.appendToEntry(mrParent)
-- now add offset if it exists
if tmr.OffsetCount ~= nil then
mr.OffsetCount = tmr.OffsetCount
for k,v in pairs(tmr.Offset) do
mr.Offset[k] = v
end
end
-- add String.Size & String.Unicode if they exist
if tmr._StringSize ~= nil then
mr.String.Size = tmr._StringSize
end
if tmr._StringUnicode ~= nil then
mr.String.Unicode = tmr._StringUnicode == true -- should be boolean but this ensures that it is
end
-- add children
ParseTableChildrenToMR(mr, tmr)
-- try to close if have children
if mr.count > 0 then
mr.Collapsed = true
end
end
end
end
local function GetSubItemInfo(mrTemplate)
local Result = {}
local k,v
if mrTemplate.description ~= nil then
Result.description = mrTemplate.description
if mrTemplate.IsAddressGroupHeader ~= nil then
Result.IsAddressGroupHeader = mrTemplate.IsAddressGroupHeader == true
end
if mrTemplate.address ~= nil then
Result.Address = mrTemplate.address
end
if mrTemplate.valueType ~= nil then
Result.Type = mrTemplate.valueType
if mrTemplate.valueType == vtString then
Result._StringSize = mrTemplate._StringSize
Result._StringUnicode = mrTemplate._StringUnicode
end
end
if mrTemplate.offsetTable ~= nil and #mrTemplate.offsetTable > 0 then
Result.OffsetCount = #mrTemplate.offsetTable
Result.Offset = {}
for k,v in pairs(mrTemplate.offsetTable) do
Result.Offset[k - 1] = v
end
end
end
return Result
end
local iCharInfo = {
[1] ={
['description'] = 'HP - Current',
['address'] = '+0',
['valueType'] = vtWord
},
[2] ={
['description'] = 'HP - Max',
['address'] = '+2',
['valueType'] = vtWord
},
[3] ={
['description'] = 'MP - Current',
['address'] = '+4',
['valueType'] = vtWord
},
[4] ={
['description'] = 'MP - Max',
['address'] = '+6',
['valueType'] = vtWord
},
[5] ={
['description'] = 'Attack (Base)',
['address'] = '+14',
['valueType'] = vtByte
},
[6] ={
['description'] = 'Attack (Current)',
['address'] = '+8',
['valueType'] = vtWord
},
[7] ={
['description'] = 'Defense (Base)',
['address'] = '+15',
['valueType'] = vtByte
},
[8] ={
['description'] = 'Defense (Current)',
['address'] = '+A',
['valueType'] = vtWord
},
[9] ={
['description'] = 'Agility (Base)',
['address'] = '+16',
['valueType'] = vtByte
},
[10] ={
['description'] = 'Agility (Current)',
['address'] = '+C',
['valueType'] = vtWord
},
[11] ={
['description'] = 'Wisdom (Base)',
['address'] = '+17',
['valueType'] = vtByte
},
[12] ={
['description'] = 'Wisdom (Current)',
['address'] = '+E',
['valueType'] = vtWord
},
[13] ={
['description'] = 'Magic En (Base)',
['address'] = '+18',
['valueType'] = vtByte
},
[14] ={
['description'] = 'Magic En (Current)',
['address'] = '+10',
['valueType'] = vtWord
},
[15] ={
['description'] = '# of attacks (Base)',
['address'] = '+19',
['valueType'] = vtByte
},
[16] ={
['description'] = '# of attacks (Current)',
['address'] = '+12',
['valueType'] = vtByte
},
[17] ={
['description'] = 'Range (Base)',
['address'] = '+1A',
['valueType'] = vtByte
},
[18] ={
['description'] = 'Range (Current)',
['address'] = '+13',
['valueType'] = vtByte
},
[19] ={
['description'] = 'Luck (Base)',
['address'] = '+1B',
['valueType'] = vtByte
},
[20] ={
['description'] = 'Luck (Current)',
['address'] = '+1D',
['valueType'] = vtByte
},
[21] ={
['description'] = 'XP to next level',
['address'] = '+3C',
['valueType'] = vtDWord
}
}
local iCharNames = {
[1] = 'Alex',
[2] = 'Nash',
[3] = 'Jessica',
[4] = 'Mia',
[5] = 'Kyle',
[6] = 'Luna',
[7] = 'Ramus',
[8] = 'Ghaleon',
[9] = 'Laike/Dyne',
[11] = 'DragonMaster Alex'
}
local ceTable = {}
local cnum
local tmr
for cnum = 1,11 do
tmr = {}
tmr.description = (iCharNames[cnum] or '???')..' (Char '..cnum..')'
tmr.IsAddressGroupHeader = true
tmr.Address = '+40*'..string.format('%x',cnum)
tmr.Type = vtQword
tmr.Color = 0xFF80FF
tmr.options = 'moHideChildren moDeactivateChildrenAsWell'
tmr.Children = {}
local k,v
for k,v in pairs(iCharInfo) do
local tmrL1 = GetSubItemInfo(v)
table.insert(tmr.Children, tmrL1)
end
table.insert(ceTable, tmr)
end
for _,tmr in pairs(ceTable) do
local mr = AddressList.createMemoryRecord()
for k,v in pairs(tmr) do
if string.sub(k,1,1) ~= '_' and k ~= 'Children' and k ~= 'Offset' then
-- _*, Children & Offset are handled separately. Could not just do type in this case
mr[k] = v
end
end
mr.appendToEntry(mr_CharBase)
-- now add offset if it exists
if tmr.OffsetCount ~= nil then
mr.OffsetCount = tmr.OffsetCount
for k1,v1 in pairs(tmr.Offset) do
mr.Offset[k1] = v1
end
end
-- Add child items here
ParseTableChildrenToMR(mr, tmr)
end
{$asm}
[DISABLE]
</AssemblerScript>
<Hotkeys>
<Hotkey>
<Action>Toggle Activation</Action>
<Keys>
<Key>102</Key>
</Keys>
<ID>0</ID>
</Hotkey>
</Hotkeys>
<CheatEntries>
<CheatEntry>
<ID>4030</ID>
<Description>"Character_Base"</Description>
<LastState Value="" RealAddress="2B46281BE28"/>
<ShowAsSigned>0</ShowAsSigned>
<Color>C0C0C0</Color>
<GroupHeader>1</GroupHeader>
<Address>[lunar1.exe+30D3090]</Address>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatTable>