fceux/output/luaScripts/PunchOutTraining.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