Skip to content

Instantly share code, notes, and snippets.

@taotao54321
Created February 23, 2017 05:22
Show Gist options
  • Save taotao54321/3ffb7014d19ea81edf63c86cd0fbd8eb to your computer and use it in GitHub Desktop.
Save taotao54321/3ffb7014d19ea81edf63c86cd0fbd8eb to your computer and use it in GitHub Desktop.
NES The Quest of Ki (J) HUD script for FCEUX
----------------------------------------------------------------------
-- NES The Quest of Ki (J) HUD script for FCEUX
--
-- displays position and velocity
----------------------------------------------------------------------
----------------------------------------------------------------------
-- util
----------------------------------------------------------------------
local function num_stou(n, size)
if n < 0 then
n = n + 2^(8*size)
end
return n
end
local function num_utos(n, size)
if n >= 2^(8*size-1) then
n = n - 2^(8*size)
end
return n
end
local function numdec_u_le(buf, size)
local n = 0
for i = 1, size do
n = n + 2^(8*(i-1)) * buf[i]
end
return n
end
local function numdec_s_le(buf, size)
local n = numdec_u_le(buf, size)
return num_utos(n, size)
end
local function numdec_u_be(buf, size)
local n = 0
for i = 1, size do
n = n + 2^(8*(size-i)) * buf[i]
end
return n
end
local function numdec_s_be(buf, size)
local n = numdec_u_be(buf, size)
return num_utos(n, size)
end
local function numdec_s32_le(buf)
return numdec_s_le(buf, 4)
end
local function numdec_u32_le(buf)
return numdec_u_le(buf, 4)
end
local function numdec_s24_le(buf)
return numdec_s_le(buf, 3)
end
local function numdec_u24_le(buf)
return numdec_u_le(buf, 3)
end
local function numdec_s16_le(buf)
return numdec_s_le(buf, 2)
end
local function numdec_u16_le(buf)
return numdec_u_le(buf, 2)
end
local function numdec_s32_be(buf)
return numdec_s_be(buf, 4)
end
local function numdec_u32_be(buf)
return numdec_u_be(buf, 4)
end
local function numdec_s24_be(buf)
return numdec_s_be(buf, 3)
end
local function numdec_u24_be(buf)
return numdec_u_be(buf, 3)
end
local function numdec_s16_be(buf)
return numdec_s_be(buf, 2)
end
local function numdec_u16_be(buf)
return numdec_u_be(buf, 2)
end
local function mem_read_bytes(addr, len)
local buf = {}
for i = 1, len do
buf[i] = memory.readbyte(addr+(i-1))
end
return buf
end
local function mem_read_s_le(addr, size)
local buf = mem_read_bytes(addr, size)
return numdec_s_le(buf, size)
end
local function mem_read_u_le(addr, size)
local buf = mem_read_bytes(addr, size)
return numdec_u_le(buf, size)
end
local function mem_read_s_be(addr, size)
local buf = mem_read_bytes(addr, size)
return numdec_s_be(buf, size)
end
local function mem_read_u_be(addr, size)
local buf = mem_read_bytes(addr, size)
return numdec_u_be(buf, size)
end
local function mem_read_s32_le(addr)
return mem_read_s_le(addr, 4)
end
local function mem_read_u32_le(addr)
return mem_read_u_le(addr, 4)
end
local function mem_read_s24_le(addr)
return mem_read_s_le(addr, 3)
end
local function mem_read_u24_le(addr)
return mem_read_u_le(addr, 3)
end
local function mem_read_s16_le(addr)
return mem_read_s_le(addr, 2)
end
local function mem_read_u16_le(addr)
return mem_read_u_le(addr, 2)
end
local function mem_read_s32_be(addr)
return mem_read_s_be(addr, 4)
end
local function mem_read_u32_be(addr)
return mem_read_u_be(addr, 4)
end
local function mem_read_s24_be(addr)
return mem_read_s_be(addr, 3)
end
local function mem_read_u24_be(addr)
return mem_read_u_be(addr, 3)
end
local function mem_read_s16_be(addr)
return mem_read_s_be(addr, 2)
end
local function mem_read_u16_be(addr)
return mem_read_u_be(addr, 2)
end
local function mem_read_s8(addr)
return num_utos(mem_read_u8(addr), 1)
end
local function mem_read_u8(addr)
return memory.readbyte(addr)
end
----------------------------------------------------------------------
-- main
----------------------------------------------------------------------
local fmt = string.format
local function get_info()
local info = {}
info.x = mem_read_u24_be(0x3A)
info.y = mem_read_u24_be(0x3D)
info.vx = mem_read_s16_be(0x34)
info.vy = mem_read_s16_be(0x36)
return info
end
local function text(x, y, str)
gui.text(x, y, str)
end
local function draw_seg()
local seg_frame = -1
if taseditor.engaged() then
local f_current = emu.framecount()
for f = f_current, 0, -1 do
if taseditor.markedframe(f) or f == 0 then
seg_frame = f_current - f
break
end
end
text(232, 200, fmt("%4d", seg_frame))
end
end
local function draw()
local info = get_info()
local x = info.x / 256.0
local y = info.y / 256.0
local vx = info.vx / 256.0
local vy = info.vy / 256.0
text(0, 8, fmt(
"P:(%.2f,%.2f) V:(%.2f,%.2f)",
x, y, vx, vy
))
draw_seg()
end
local function main()
gui.opacity(0.7)
emu.registerafter(draw)
end
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment