I decided to investigate addresses again. Turns out battles also move around.
There are 2 IDs
First one can be values at 0, 1, 2, 255
Second one ranges from 0 to 68.
First ID means if it's the player, or npc.
0 = Harry
1 = Hermione
2 = Ron
255 = NPC
List of npcs and areas here
https://docs.google.com/spreadsheets/d/196AiBW0Mi_z_8V6ZsxTuXqWkpQGUyHCaEuziBEyWhmM/edit?usp=sharing
I updated the script, incomplete, to add battle. Will edit this post.
Download Harry3.luaLanguage: lua
client.SetGameExtraPadding(0, 0, 200, 100)
console.clear()
local text
local read8
local read16
local read32
if vba then
text = text
read8 = memory.readbyteunsigned
read16 = memory.readwordunsigned
read32 = memory.readlongunsigned
else
text = gui.pixelText
memory.usememorydomain("System Bus")
read8 = memory.read_u8
read16 = memory.read_u16_le
read24 = memory.read_u24_be
read32 = memory.read_u32_le
end
local Addresses =
{
Harry_pointer_x = 0x03002118,
Battle_pointer = 0x030024E8,
Harry_SP = 0x030024F6,
Harry_XP = 0x030024F8, --XP to next level
Harry_Level = 0x030024FA,
Harry_Flipendo = 0x03002506, --how many times cast
Harry_Vermdimillous = 0x03002508,
Harry_Incendio = 0x0300250A,
Harry_Petrificus = 0x0300250C,
Hermione_Flipendo = 0x0300254E,
Hermione_Vermdimillous = 0x03002550,
Hermione_Incendio = 0x03002552,
Hermione_Petrificus = 0x03002554,
Hermione_Glacius = 0x03002555,
Hermione_Fumos = 0x03002556,
Ron_SP = 0x03002584,
Ron_MP = 0x03002586,
Ron_Level = 0x0300258A,
--What tier of spell unlocked
Ron_Flipendo_Lv = 0x0300258C,
Ron_Vermdimillous_Lv = 0x0300258E,
Ron_Incendio_Lv = 0x03002590,
Ron_Petrificus_Lv = 0x03002592,
Ron_Flipendo_XP = 0x03002596, --How many times cast. Duo counts as 2
Ron_Vermdimillous_XP = 0x03002598,
Ron_Incendio_XP = 0x0300259A,
Ron_Petrificus_XP = 0x0300259C,
Damage_dealt = 0x0300274A,
Area = 0x03003B50,
Game_State1 = 0x03003EF4,
Game_State2 = 0x03003F18
}
local Harry = {ptr = 0x03002118, x = 0x000000, y = 0x000000}
local Battle =
{
Address = {0,0,0,0,0,0},
Is_NPC = {0,0,0,0,0,0},
ID = {0,0,0,0,0,0},
SP = {0,0,0,0,0,0},
MP = {0,0,0,0,0,0},
Level = {0,0,0,0,0,0},
Max_SP = {0,0,0,0,0,0},
Max_MP = {0,0,0,0,0,0},
Flipendo_Multiplier = {0,0,0,0,0,0},
Incendio_Multiplier = {0,0,0,0,0,0},
Verdimillious_Multiplier = {0,0,0,0,0,0},
Wingardium_Multiplier = {0,0,0,0,0,0},
Glacius_Multiplier = {0,0,0,0,0,0},
Diffindo_Multiplier = {0,0,0,0,0,0},
Status = {0,0,0,0,0,0},
Status_Meter = {0,0,0,0,0,0}
}
local NPC = {
[0] = 'Ruby Fire Crab',
[1] = 'Emerald Fire Crab',
[2] = 'Sapphire Fire Crab',
[3] = 'Cornish Pixie',
[4] = 'Rat',
[5] = 'Albino Rat',
[6] = 'Plague Rat',
[7] = 'Clabbert',
[8] = 'Suit of Armor (Footman)',
[9] = 'Suit of Armor (Cavalier)',
[10] = 'Suit of Armor (Paladin)',
[11] = 'Suit of Armor (Squire)',
[12] = 'Suit of Armor (Swordsman)',
[13] = 'Suit of Armor (Crusader)',
[14] = 'Suit of Armor (Knight)',
[15] = 'Funnelweb Spider',
[16] = 'Brown Recluse Spider',
[17] = 'Large Spider',
[18] = 'Redback Spider',
[19] = 'Giant Spider',
[20] = 'Cocoon Spider',
[21] = 'Whitetail Spider',
[22] = 'Flobberworm',
[23] = 'Snail',
[24] = 'Large Orange Snail',
[25] = 'Flailtail Snail',
[26] = 'Bat',
[27] = 'Fruitbat',
[28] = 'Mortis Bat',
[29] = 'Dragonfly',
[30] = 'Imperial Dragonfly',
[31] = 'Horklump',
[32] = 'Snake',
[33] = 'Spitting Snake',
[34] = 'Wasp',
[35] = 'Tarantula Hawk Wasp',
[36] = 'Bowtruckle',
[37] = 'Oaken Bowtruckle',
[38] = 'Doxy',
[39] = 'Doxy Queen',
[40] = 'Hinkypunk',
[41] = 'Gytrash',
[42] = 'Grindylow',
[43] = 'Red Cap',
[44] = 'Armored Red Cap',
[45] = 'Salamander',
[46] = 'Amazonian Salamander',
[47] = 'Peruvian Salamander',
[48] = 'Charmed Skeleton',
[49] = 'Jinxed Skeleton',
[50] = 'Tree Frog',
[51] = 'Wide-mouth Toad',
[52] = 'Bullfrog',
[53] = 'Flesh-eating Slug (not in game, needs to be in file for coders - no need to translate)',
[54] = 'Whomping Willow',
[55] = 'Forest Troll',
[56] = 'River Troll',
[57] = 'Venemous Tentacula',
[58] = "The Monster Book of Monsters'",
[59] = 'Giant Rat',
[60] = 'Crabbe',
[61] = 'Draco',
[62] = 'Goyle',
[63] = 'Lupin Werewolf',
[64] = 'Snake',
[65] = 'Brown Recluse Spider',
[66] = "The Monster Book of Monsters'",
[67] = "The Monster Book of Monsters'",
[68] = 'Native of Fiji. Has a heavily jeweled shell.'
}
local Is_NPC = {[0] = "Harry", "Hermione", "Ron", "Buckbeak", [255] = "Yes"}
function update()
local ptr_x = read32(Addresses.Harry_pointer_x)
Harry.x = ptr_x + 0x2C
Harry.y = ptr_x + 0x30
end
function update_battle()
local ptr_battle = read32(Addresses.Battle_pointer)
for i = 1, 6 do
Battle.Address[i] = ptr_battle + 0x14E0 + (0x48 * (i-1))
Battle.Is_NPC[i] = read8(Battle.Address[i])
Battle.ID[i] = read8(Battle.Address[i]+ 0x1)
Battle.SP[i] = read16(Battle.Address[i]+ 0x8)
Battle.MP[i] = read16(Battle.Address[i]+ 0xA)
Battle.Level[i] = read8(Battle.Address[i]+ 0xE)
Battle.Max_SP[i] = read16(Battle.Address[i]+ 0x24)
Battle.Max_MP[i] = read16(Battle.Address[i]+ 0x26)
Battle.Flipendo_Multiplier[i] = read8(Battle.Address[i]+ 0x34)
Battle.Incendio_Multiplier[i] = read8(Battle.Address[i]+ 0x35)
Battle.Verdimillious_Multiplier[i] = read8(Battle.Address[i]+ 0x36)
Battle.Wingardium_Multiplier[i] = read8(Battle.Address[i]+ 0x37)
Battle.Glacius_Multiplier[i] = read8(Battle.Address[i]+ 0x38)
Battle.Diffindo_Multiplier[i] = read8(Battle.Address[i]+ 0x39)
Battle.Status[i] = read8(Battle.Address[i]+ 0x42) --binary flags
Battle.Status_Meter[i] = read8(Battle.Address[i]+ 0x44) --was for petrified
end
end
--[[
Status
0 0 0 0 0 0 0 0
7 6 5 4 3 2 1 0
0 = ?
1 = ?
2 = ?
3 = Spongify
4 = Petrified
5 = ?
6 = ?
7 = immune to petrified
]]--
--2CE38
update_battle()
local i = 3
console.log(string.format("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t",Battle.Level[i],Battle.Max_SP[i],Battle.Flipendo_Multiplier[i], Battle.Verdimillious_Multiplier[i], Battle.Incendio_Multiplier[i], Battle.Wingardium_Multiplier[i], Battle.Diffindo_Multiplier[i], Battle.Glacius_Multiplier[i]))
while true do
local pointer = read32(Addresses.Harry_pointer_x)
local state = read8(Addresses.Game_State2)
if (pointer ~= Harry.x-0x2c and pointer ~= 0 and state ~= 9) then --this will happen if changed rooms or just started script
update() --placing this here as to not lag my computer :P
end
local text_x = 240
if (state == 8) then
text(text_x,0,string.format('%.6f,%.6f',read32(Harry.x)/65536.0, read32(Harry.y)/65536.0))
end
if (state == 9) then
update_battle()
local text_y = 0
for i = 1, 6 do
if Battle.Is_NPC[i] < 4 then
text(text_x,text_y, Is_NPC[Battle.Is_NPC[i]] .. " " .. bizstring.hex(Battle.Address[i]))
elseif Battle.Is_NPC[i] == 255 then
text(text_x,text_y, "(" .. Battle.ID[i] .. ") " .. NPC[Battle.ID[i]] .. " " .. bizstring.hex(Battle.Address[i]), "red")
end
text_y = text_y + 8
text(text_x,text_y, string.format('LV: %d SP: %d/%d MP: %d/%d', Battle.Level[i], Battle.SP[i], Battle.Max_SP[i], Battle.MP[i], Battle.Max_MP[i]))
text_y = text_y + 8
text(text_x,text_y, string.format('Flip: %d Verd: %d Ince: %d', Battle.Flipendo_Multiplier[i], Battle.Verdimillious_Multiplier[i], Battle.Incendio_Multiplier[i]))
text_y = text_y + 8
text(text_x,text_y, string.format('Wing: %d Diff: %d Glac: %d', Battle.Wingardium_Multiplier[i], Battle.Diffindo_Multiplier[i], Battle.Glacius_Multiplier[i]))
text_y = text_y + 8
end
end
emu.frameadvance()
end