jum 2 lua script: added bg and hitboxes

This commit is contained in:
feos 2015-12-27 23:25:29 +03:00
parent dc3a133d0b
commit a0f7caf686
1 changed files with 238 additions and 109 deletions

View File

@ -1,29 +1,233 @@
-- feos, 2015
--== Globals ==--
lastcfg = 0
dcfg = 0
rngcount = 0
rngcolor = "white"
rngobject = 0
rngroutine = 0
MsgTime = 16
MsgStep = 256/MsgTime
MsgTable = {}
local lastcfg = 0
local dcfg = 0
local rngcount = 0
local rngobject = 0
local rngroutine = 0
local rngcolor = "white"
local MsgTime = 16
local MsgStep = 256/MsgTime
local MsgTable = {}
--== Slow stuff ==--
local drawwalls = 1
local drawfloor = 1
local drawbg = 1
local drawrng = 1
--== Shortcuts ==--
local rb = memory.read_u8
local rbs = memory.read_s8
local rw = memory.read_u16_be
local rws = memory.read_s16_be
local rl = memory.read_u32_be
local box = gui.drawBox
local text = gui.pixelText
local line = gui.drawLine
local AND = bit.band
local SHIFT= bit.lshift
local rb = memory.read_u8
local rbs = memory.read_s8
local rw = memory.read_u16_be
local rws = memory.read_s16_be
local rl = memory.read_u32_be
local box = gui.drawBox
local text = gui.pixelText
local line = gui.drawLine
local AND = bit.band
local SHIFTL = bit.lshift
local SHIFTR = bit.rshift
function Configs()
event.onframestart(function()
rngcount = 0
rngcolor = "white"
rngobject = 0
end)
event.onmemorywrite(function()
rngcount = rngcount+1
rngcolor = "red"
rngobject = emu.getregister("M68K A1")
rngroutine = emu.getregister("M68K A0")
for i = 1, 30 do
if MsgTable[i] == nil then
MsgTable[i] = {
timer_ = MsgTime + emu.framecount(),
object_ = rngobject-0xff0000,
routine_ = rngroutine
}
break
end
end
end, 0xffa1d4)
local function PostRngRoll(object,x,y)
if drawrng==0 then return end
for i = 1, #MsgTable do
if (MsgTable[i]) then
if object==MsgTable[i].object_ then
local color = 0x00ff0000+SHIFTL((MsgTable[i].timer_-emu.framecount())*MsgStep,24)
line(130,7*i+8,x,y,color)
text(120,7*i+8,string.format("%X",MsgTable[i].routine_),color)
end
if (MsgTable[i].timer_<emu.framecount()) then
MsgTable[i] = nil
end
end
end
end
local function Objects(base0, amount)
for i=0,amount do
local base = base0+i*0x6e
local id = rb(base)
local color = 0xff00ff00
local of = 128
if id~=0 then
-- attributes --
local hp = rbs(base+ 1)
local x = rw (base+ 2)-0x1000-camx
local y = rw (base+ 4)-0x1000-camy
local facing = rbs(base+ 9)
local hbbase = rl (base+0x14)
local d = rb (base+0x35)
PostRngRoll(base,x,y)
if (id>0 and id<130 and hbbase<0x300000) then
-- hitbox --
local x1 = rb(hbbase+2,"MD CART")
local x2 = rb(hbbase+4,"MD CART")
local y1 = rb(hbbase+3,"MD CART")
local y2 = rb(hbbase+5,"MD CART")
if x1>0 and x2>0 and y1>0 and y2>0 then
if facing==-1 then
x1 = 256-x1
x2 = 256-x2
end
if d==-1 then
y1 = 256-y1
y2 = 256-y2
end
x1 = x+x1-of
x2 = x+x2-of
y1 = y+y1-of
y2 = y+y2-of
if id>=120 and id<=124 then color = 0xffff0000 end
box(x1,y1,x2,y2,color,0)
if hp>0 and id~=120 then text(x,y-2,hp,color) end
--text(x,y,string.format("%X",id),"yellow")
end
-- whip
if base==0xa20e then
local wx = rb(hbbase+6,"MD CART")
local wy = rb(hbbase+7,"MD CART")
local ww = rb(0xff0c)
local wh = rb(0xff0d)
if facing==-1 then wx = 256-wx end
if d ~= 0 then wy = 256-wy end
wx = wx+x-of
wy = wy+y-of
box(wx-ww,wy-wh,wx+ww,wy+wh,0xffff0000,0)
if invcount>0 then text(x,y,invcount) end
end
end
end
end
end
local function GetFloor(x, y)
if drawfloor==0 then return {0,0} end
x = x*16+AND(camx,0xfff0)
y = y*16+AND(camy,0xfff0)
local d6 = SHIFTR(AND(y,0xfff0),3)
local a0 = rw(d6+0xb4e8)
local d0 = SHIFTR(x+0x10,4)
local d2 = AND(x,0xf)
local a1 = 0xb806+rw(0xfb9e)
local a2 = 0x273e1e
local d3 = SHIFTR(rw(a0+d0*2),1)
local d5 = SHIFTL(rb(a1+d3),4)+d2
local newd5 = SHIFTL(rb(a1+d3),4)+d2+15
local newd0 = AND(rb(a2+newd5,"MD CART"),0x1f)
return {AND(rb(a2+d5,"MD CART"),0x1f), newd0}
end
local function GetWall(x, y)
if drawwalls==0 then return 0 end
x = x*16+AND(camx,0xfff0)
y = y*16+AND(camy,0xfff0)
if y<0 then return 0 end
local d6 = SHIFTR(AND(y+6,0xfff0),3)
local a0 = rw(d6+0xb4e6)
local d0 = rw(a0+SHIFTR(x,4)*2)
return rb(0xb808+SHIFTR(d0,1))
end
local function DrawBG()
if drawbg==0 then return end
for j=1,15 do
for i=1,21 do
local a0 = GetWall(i,j)
if a0>0 then
x1 = i*16-AND(camx,0xf)-16
y1 = j*16-AND(camy,0xf)-16
x2 = i*16-AND(camx,0xf)-1
y2 = j*16-AND(camy,0xf)-1
if a0==255 then -- normal
box(x1,y1,x2,y2,0xff00ffff,0x4400ffff)
elseif a0==228 then -- snot
box(x1,y1,x2,y2,0xff00ff00,0x4400ff00)
elseif a0==117 then -- right
box(x1,y1,x2,y2,0x4400ffff,0x4400ffff)
line(x2,y1,x2,y2,0xff00ffff)
elseif a0==116 then -- left
box(x1,y1,x2,y2,0x4400ffff,0x4400ffff)
line(x1,y1,x1,y2,0xff00ffff)
elseif a0==113 or a0==114 then -- grab corner
box(x1,y1,x2,y2,0x66ffff00,0x66ffff00)
elseif a0==60 or a0==61
or a0>=74 and a0<=77
or a0==58 or a0==59 then -- stomack
box(x1,y1,x2,y2,0xffff0000,0x44ff0000)
elseif a0==73 then -- stomack
box(x1,y1,x2,y2,0x44ff0000,0x44ff0000)
elseif a0==54 or a0==40 then -- kitchen
box(x1,y1,x2,y2,0xffff0000,0x44ff0000)
elseif a0==41 then -- kitchen
box(x1,y1,x2,y2,0x44ff0000,0x44ff0000)
else -- other occasional crap
box(x1,y1,x2,y2,0x66ffffff,0x66ffffff)
--text(x1,y1,a0)
end
end
local d0 = GetFloor(i,j)[1]
if d0>0 then
local newd0 = GetFloor(i,j)[2]
if newd0>0 then
x1 = i*16-AND(camx,0xf)
y1 = j*16-AND(camy,0xf)+d0
x2 = i*16-AND(camx,0xf)+15
y2 = j*16-AND(camy,0xf)+newd0
else
for k=-2,2 do
newd0 = GetFloor(i+1,j+k)[1]
if newd0>0 then
local add = 1
if k==-2 then
k = 0
add = -1
elseif k==-1 then
add = 2
elseif k==2 then
add = 1
end
x1 = i*16-AND(camx,0xf)
y1 = j*16-AND(camy,0xf)+d0
x2 = i*16-AND(camx,0xf)+16
y2 = j*16-AND(camy,0xf)-newd0+k*16+add
--text(x1,y2,k,"red")
end
end
end
line(x1,y1,x2,y2,0xff00ff00)
end
end
end
end
local function Configs()
local rng = rl(0xa1d4)
text(120,0,string.format("rng: %08X:%d",rng,rngcount),rngcolor)
local cfg0 = rl(0xfc2a)
@ -59,7 +263,7 @@ function Configs()
Seek()
end
function Seek()
local function Seek()
bytes = 0
waves = 0
steps = 0
@ -93,21 +297,14 @@ function Seek()
text(120,7,ret)
end
function Clamp(v1,v2,v3)
if v1<v2 then v1=v2
elseif v1>v3 then v1=v3
end
return v1
end
function Bounce()
local function Bounce()
if rb(0xa515)==0x60
then offset = 8
else offset = 0
end
local counter = rb(0xfc87)
local a0 = 0xfc88
local d0 = SHIFT(rb(a0+counter),5)+offset
local d0 = SHIFTL(rb(a0+counter),5)+offset
local vel = rw(0x25d482+d0, "MD CART")
if vel == 0x200 then bounce = 3
elseif vel == 0x3e0 then bounce = 1
@ -116,87 +313,19 @@ function Bounce()
text(60,0,string.format("bounce: %X",bounce))
end
function Objects()
local base0 = 0xa2ea
for i=0,0x32 do
local base = base0+i*0x6e
local id = rb(base)
if id>0 and id~=0x82 then
local hp = rbs(base+1)
local x = rw(base+2)-4096-camx
local y = rw(base+4)-4096-camy
--x = Clamp(x,0,300)
--y = Clamp(y,8,210)
local dx = rws(base+0x18)
local dy = rws(base+0x1a)
local hitboxbase = rl(base+0x14)
if hitboxbase<0x300000 then
local x1 = rb(hitboxbase+2,"MD CART")
local x2 = rb(hitboxbase+4,"MD CART")
local y1 = rb(hitboxbase+3,"MD CART")
local y2 = rb(hitboxbase+5,"MD CART")
local of = 124
if x1>0 and x2>0 and y1>0 and y2>0 then
x1 = x1+x-of
x2 = x2+x-of
y1 = y1+y-of
y2 = y2+y-of
box(x1,y1,x2,y2,0xff00ff00,0)
end
end
--text(x,y,string.format("%X",id),"yellow")
if hp~=0 then
text(x,y+6,hp,0xff00ff00)
end
PostRngRoll(base,x,y)
end
end
end
function PostRngRoll(object,x,y)
for i = 1, #MsgTable do
if (MsgTable[i]) then
if object==MsgTable[i].object_ then
local color = 0x00ff0000+SHIFT((MsgTable[i].timer_-emu.framecount())*MsgStep,24)
line(130,7*i+8,x,y,color)
text(120,7*i+8,string.format("%X",MsgTable[i].routine_),color)
end
if (MsgTable[i].timer_<emu.framecount()) then
MsgTable[i] = nil
end
end
end
end
event.onframestart(function()
rngcount = 0
rngcolor = "white"
rngobject = 0
end)
event.onmemorywrite(function()
rngcount = rngcount+1
rngcolor = "red"
rngobject = emu.getregister("M68K A1")
rngroutine = emu.getregister("M68K A0")
for i = 1, 30 do
if MsgTable[i] == nil then
MsgTable[i] = {
timer_ = MsgTime + emu.framecount(),
object_ = rngobject-0xff0000,
routine_ = rngroutine
}
break
end
end
end, 0xffa1d4)
while true do
mult = client.getwindowsize()
camx = rw(0xa172)
camy = rw(0xa174)
Objects()
Configs()
scrx = rw(0xa176)-0x1000
scry = rw(0xa178)-0x1000
absx = rw(0xa17e)-0x1000
absy = rw(0xa180)-0x1000
invcount = rb(0xfbd6)
if rb(0xa313)==4 then
DrawBG()
Objects(0xa2ea, 0x23)
Objects(0xa20e, 0)
Configs()
end
emu.frameadvance()
end