1
0
Fork 0
mirror of https://github.com/notwa/mm synced 2024-06-26 03:57:13 -07:00

various updates

This commit is contained in:
Connor Olding 2015-03-01 07:56:21 -08:00
parent 25a0df5ded
commit ce05421797
4 changed files with 126 additions and 60 deletions

View File

@ -69,7 +69,7 @@ local US_10 = {
magic_modifier = AL(0x3F28, 4), -- TODO: RE magic_modifier = AL(0x3F28, 4), -- TODO: RE
magic_max = AL(0x3F2E, 2), magic_max = AL(0x3F2E, 2),
weird_a_graphic = AL(0x3F42, 1), weird_a_graphic = AL(0x3F42, 1),
target_style = AL(0x3F45, 1), -- 0 for switch, 1 for target target_style = AL(0x3F45, 1), -- 0 for switch, 1 for hold
music_mod = AL(0x3F46, 2), music_mod = AL(0x3F46, 2),
entrance_mod_setter = AL(0x3F4A, 2), -- sets entrance mod. -10 = 0 entrance_mod_setter = AL(0x3F4A, 2), -- sets entrance mod. -10 = 0
insta_crash = AL(0x3F4C, 1), -- TODO: RE insta_crash = AL(0x3F4C, 1), -- TODO: RE
@ -159,23 +159,38 @@ local US_10 = {
text_open = A(0x3FD33B, 1), text_open = A(0x3FD33B, 1),
text_status = A(0x3FD34A, 1), text_status = A(0x3FD34A, 1),
room_number = A(0x3FF200, 1), room_number = A(0x3FF200, 1),
room_ptr = A(0x3FF20C, 4),
actor_disable = A(0x3FF366, 2), -- set to -10 and load actor_disable = A(0x3FF366, 2), -- set to -10 and load
warp_begin = A(0x3FF395, 1), -- set to nonzero to begin warping warp_begin = A(0x3FF395, 1), -- set to nonzero to begin warping
screen_dim = A(0x3FF397, 1), -- B) screen_dim = A(0x3FF397, 1), -- B)
warp_destination = A(0x3FF39A, 2), warp_destination = A(0x3FF39A, 2),
link_scale_x = A(0x3FFE08, 2), -- need to confirm this is x link_scale_x = A(0x3FFE08, 2),
link_scale_y = A(0x3FFE0C, 2), -- need to confirm this is y link_scale_y = A(0x3FFE0C, 2),
link_scale_z = A(0x3FFE10, 2), -- need to confirm this is z link_scale_z = A(0x3FFE10, 2),
z_vel = A(0x3FFE18, 'f'), z_vel = A(0x3FFE18, 'f'),
quick_draw = A(0x3FFEF8, 1), -- item in link's hand quick_draw = A(0x3FFEF8, 1), -- item in link's hand
animation_id = A(0x3FFFFA, 2),
linear_vel = A(0x400880, 'f'), linear_vel = A(0x400880, 'f'),
infinite_sword = A(0x40088B, 1), infinite_sword = A(0x40088B, 1),
} }
local hash = gameinfo.getromhash() local EU_DBG = {
room_ptr = A(0x460DEC, 4),
animation_id = A(0x461C1A, 2),
}
local JP_10 = {
room_ptr = A(0x3FF3BC, 4),
animation_id = A(0x4001EA, 2),
}
local versions = { local versions = {
['D6133ACE5AFAA0882CF214CF88DABA39E266C078'] = US_10, ['D6133ACE5AFAA0882CF214CF88DABA39E266C078'] = US_10,
['B38B71D2961DFFB523020A67F4807A4B704E347A'] = EU_DBG,
['5FB2301AACBF85278AF30DCA3E4194AD48599E36'] = JP_10,
} }
local hash = gameinfo.getromhash()
local addrs = versions[hash] local addrs = versions[hash]
return addrs return addrs

View File

@ -3,7 +3,7 @@
-- --
-- go to the fairy's fountain in clock town as human link and run this script. -- go to the fairy's fountain in clock town as human link and run this script.
local length = 60 -- in frames local length = 70 -- in frames
local print_each = true local print_each = true
local tests = { local tests = {
@ -143,7 +143,7 @@ function test_inputs(name, inputs, length)
end end
end end
if action ~= nil then if action ~= nil then
for i=1, 3 do for _=1, 3 do
joypad.setanalog(action, 1) joypad.setanalog(action, 1)
joypad.set(action, 1) joypad.set(action, 1)
emu.frameadvance() emu.frameadvance()

View File

@ -1,58 +1,94 @@
-- go to a grotto with a red rupee chest, stand in front of it and run this script -- go to a grotto with a red rupee chest, stand in front of it and run this script
-- US 1.0 of course
local start = 0x779884 -- the get item table local hash = gameinfo.getromhash()
local ours = 0x779896 -- the chest we're standing in front of local versions = {
local text = 0x3FCE10 -- ascii text buffer ['D6133ACE5AFAA0882CF214CF88DABA39E266C078'] = 'US10',
}
local version = versions[hash]
local JP = version ~= 'US10'
local index = 84
local start, ours, text
if not JP then
-- US 1.0
start = 0x779884 -- the get item table
ours = 0x779896 -- the chest we're standing in front of
text = 0x3FCE10 -- ascii text buffer
else
start = 0x7797E4 -- the get item table
ours = 0x7797F6 -- the chest we're standing in front of
text = 0x3FD660 -- ascii text buffer (not quite but close enough)
end
function draw_index()
gui.text(304, 8, ("%03i"):format(index), nil, nil, 'bottomleft')
end
function advance() function advance()
draw_index()
emu.frameadvance() emu.frameadvance()
draw_index()
emu.frameadvance() emu.frameadvance()
draw_index()
emu.frameadvance() emu.frameadvance()
end end
function read_ascii(addr, len)
local begin = addr
local bytes = mainmemory.readbyterange(begin, 0x100)
local str = ""
-- pairs() won't give us the bytes in order
-- so we'll set up a table we can use ipairs() on
local ordered_bytes = {}
for a, v in pairs(bytes) do
ordered_bytes[tonumber(a, 16) - begin + 1] = v
end
local seq = false
for i, v in ipairs(ordered_bytes) do
local c = tonumber(v, 16)
if c == 9 or c == 10 or c == 13 or (c >= 32 and c < 127) then
str = str..string.char(c)
seq = false
elseif seq == false then
str = str..' '
seq = true
end
end
return str
end
local fn = 'lua chest test' local fn = 'lua chest test'
savestate.save(fn)
client.unpause() client.unpause()
for off=0, 185*6, 6 do savestate.save(fn)
for off=index*6, 185*6, 6 do
index = index + 1
for i=0, 5 do for i=0, 5 do
local byte = mainmemory.readbyte(start + off + i) local byte = mainmemory.readbyte(start + off + i)
mainmemory.writebyte(ours + i, byte) mainmemory.writebyte(ours + i, byte)
end end
gui.addmessage(("%02X"):format(mainmemory.readbyte(start + off)))
joypad.set({A=true}, 1) joypad.set({A=true}, 1)
advance() advance()
joypad.set({A=false}, 1) joypad.set({A=false}, 1)
local good = false local good = false
for i=1, 9*20 do for i=1, 9*20 do
if JP and (
(index >= 85 and index <= 88)
) then break end -- crashes
advance() advance()
if mainmemory.readbyte(text + 0xA) == 0xFF then if mainmemory.readbyte(text + 0xA) == 0xFF then
local begin = text + 0xC if not JP then
local bytes = mainmemory.readbyterange(begin, 0x100) local begin = text + 0xC
local str = "" print(off/6 + 1, read_ascii(begin))
good = true
-- pairs() won't give us the bytes in order else
-- so we'll set up a table we can use ipairs() on for _=1, 40 do
local ordered_bytes = {} advance()
for a, v in pairs(bytes) do
ordered_bytes[tonumber(a, 16) - begin + 1] = v
end
local seq = false
for i, v in ipairs(ordered_bytes) do
local c = tonumber(v, 16)
if c == 9 or c == 10 or c == 13 or (c >= 32 and c < 127) then
str = str..string.char(c)
seq = false
elseif seq == false then
str = str..' '
seq = true
end end
end end
print(off/6 + 1, str)
good = true
break break
end end
end end

View File

@ -3,32 +3,47 @@
local mm = mainmemory local mm = mainmemory
function M1(self, value) R1 = mm.readbyte
return (value and mm.writebyte or mm.readbyte)(self.addr, value) R2 = mm.read_u16_be
end R3 = mm.read_u24_be
function M2(self, value) R4 = mm.read_u32_be
return (value and mm.write_u16_be or mm.read_u16_be)(self.addr, value) RF = function(addr) mm.readfloat(addr, true) end
end
function M3(self, value)
return (value and mm.write_u24_be or mm.read_u24_be)(self.addr, value)
end
function M4(self, value)
return (value and mm.write_u32_be or mm.read_u32_be)(self.addr, value)
end
function MF(self, value)
return (value and mm.writefloat or mm.readfloat)(self.addr, value or true, true)
end
local Ms = { W1 = mm.writebyte
[1] = {__call = M1}, W2 = mm.write_u16_be
[2] = {__call = M2}, W3 = mm.write_u24_be
[3] = {__call = M3}, W4 = mm.write_u32_be
[4] = {__call = M4}, WF = function(addr, value) mm.writefloat(addr, value, true) end
['f'] = {__call = MF},
local readers = {
[1] = R1,
[2] = R2,
[3] = R3,
[4] = R4,
['f'] = RF,
}
local writers = {
[1] = W1,
[2] = W2,
[3] = W3,
[4] = W4,
['f'] = WF,
}
local mt = {
__call = function(self, value)
return value and self.write(self.addr, value) or self.read(self.addr)
end
} }
function A(addr, atype) function A(addr, atype)
return setmetatable({addr=addr, type=atype}, Ms[atype]) return setmetatable({
addr=addr,
type=atype,
read=readers[atype],
write=writers[atype]
}, mt)
end end
--[[ --[[