155 lines
4.2 KiB
Lua
155 lines
4.2 KiB
Lua
-- Just something quick for Mike Tyson's Punch Out!!
|
|
-- Intended to help time hits in real time.
|
|
--FatRatKnight
|
|
|
|
|
|
local EHP= 0x0398 -- Enemy HP address
|
|
local TMR= 23 -- Frames in advance for your punches.
|
|
local BND= -8 -- KEEP NEGATIVE!! Frames after the golden zone.
|
|
local threshold= 15-- How many frames before the target timing does it allow?
|
|
|
|
local DISPx= 180
|
|
local DISPy= 180
|
|
local DISPx2= DISPx+11 -- Right side of box. Adjust that plus to your need
|
|
local DisplayBar= true
|
|
|
|
local timer= 0
|
|
local held= 0
|
|
local accuracy= 0
|
|
local earlies= 0
|
|
local lates= 0
|
|
|
|
local perfect= 0
|
|
|
|
local EnemyHP
|
|
local lastEHP
|
|
local LastHit=-50
|
|
local HitTiming= BND-1
|
|
|
|
--*****************************************************************************
|
|
function Is_Hit()
|
|
--*****************************************************************************
|
|
if lastEHP then
|
|
if EnemyHP < lastEHP then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
|
|
local LastButtons= {}
|
|
local Buttons= {}
|
|
--*****************************************************************************
|
|
function IsPress()
|
|
--*****************************************************************************
|
|
LastButtons["A"]= Buttons["A"]
|
|
LastButtons["B"]= Buttons["B"]
|
|
LastButtons["select"]= Buttons["select"]
|
|
|
|
Buttons= joypad.get(1)
|
|
if (Buttons["A"] and not LastButtons["A"]) or (Buttons["B"] and not LastButtons["B"]) then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
|
|
--*****************************************************************************
|
|
while true do
|
|
--*****************************************************************************
|
|
EnemyHP= memory.readbyte(EHP)
|
|
gui.text(144,22,EnemyHP)
|
|
|
|
if IsPress() then
|
|
if LastHit <= threshold and LastHit >= BND then
|
|
HitTiming= LastHit
|
|
LastHit= BND-1
|
|
timer= -18
|
|
if HitTiming > 0 then
|
|
accuracy= accuracy + HitTiming
|
|
earlies= earlies + 1
|
|
elseif HitTiming < 0 then
|
|
accuracy= accuracy - HitTiming
|
|
lates= lates + 1
|
|
else
|
|
perfect= perfect + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
if Buttons["A"] or Buttons["B"] then
|
|
held= held + 1
|
|
else
|
|
if held == 1 then
|
|
timer= 0
|
|
LastHit= HitTiming-1
|
|
end
|
|
held= 0
|
|
end
|
|
|
|
if Is_Hit() then
|
|
LastHit= TMR
|
|
end
|
|
|
|
|
|
if DisplayBar then
|
|
for i= 1, TMR do
|
|
local color= "black"
|
|
if i == LastHit then
|
|
color= "green"
|
|
elseif i == HitTiming and timer < 0 then
|
|
color= "red"
|
|
gui.text(100,80,"early " .. i)
|
|
end
|
|
gui.drawbox(DISPx, DISPy-3 - 4*i,DISPx2, DISPy-1 - 4*i,color)
|
|
end
|
|
|
|
if HitTiming == 0 and timer < 0 then
|
|
gui.text(128,80,"OK")
|
|
gui.drawbox(128,80,144,90,"green")
|
|
local color= "white"
|
|
if (timer % 3) == 0 then
|
|
color= "green"
|
|
elseif (timer % 3) == 1 then
|
|
color= "blue"
|
|
end
|
|
gui.drawbox(DISPx , DISPy , DISPx2, DISPy+2, color)
|
|
gui.drawbox(DISPx-2, DISPy-2, DISPx2+2, DISPy+4, color)
|
|
else
|
|
local color= "black"
|
|
if i == LastHit then
|
|
color= "green"
|
|
end
|
|
gui.drawbox(DISPx , DISPy ,DISPx2, DISPy+2,color)
|
|
gui.drawbox(DISPx-2, DISPy-2,DISPx2+2, DISPy+4,"white")
|
|
end
|
|
|
|
for i= BND, -1 do
|
|
local color= "black"
|
|
if i == LastHit then
|
|
color= "green"
|
|
elseif i == HitTiming and timer < 0 then
|
|
color= "red"
|
|
gui.text(146,80,"late " .. -i)
|
|
end
|
|
gui.drawbox(DISPx, DISPy+3 - 4*i,DISPx2, DISPy+5 - 4*i,color)
|
|
end
|
|
end
|
|
|
|
if Buttons["select"] and not LastButtons["select"] then
|
|
if DisplayBar then
|
|
DisplayBar= false
|
|
else
|
|
DisplayBar= true
|
|
end
|
|
end
|
|
gui.text(5,120,"Timing error: " .. accuracy)
|
|
gui.text(5,140,"Perfect hits: " .. perfect)
|
|
gui.text(5,160,"Early: " .. earlies)
|
|
gui.text(5,170,"Late: " .. lates)
|
|
LastHit= LastHit-1
|
|
FCEU.frameadvance()
|
|
lastEHP= EnemyHP
|
|
timer= timer+1
|
|
end |