Rewind added. Keyboard support for control options added. Awesomeness added. It feels somewhat polished now. Any testers?

This commit is contained in:
fatratknight 2010-01-08 03:00:30 +00:00
parent 70f353fbc6
commit b9ce61c38c
1 changed files with 120 additions and 23 deletions

View File

@ -1,15 +1,35 @@
-- Multitrack v2 for FCEUX by FatRatKnight
--***************
local players= 2 -- You may tweak the number of players here.
--***************
local PlayerSwitch= "S" -- For selecting other players
local opt= "space" -- For changing control options
-- Rewind options
local saveMax= 50 -- How many save states to keep?
local SaveBuf= 12 -- How many frames between saves? Don't use 0, ever.
local rewind= "R" -- What key do you wish to hit for rewind?
local Insert= "insert"
local Delete= "delete"
--Control
local PlayerSwitch= "home" -- For selecting other players
local opt= "end" -- For changing control options
local key = {"right", "left", "down", "up", "L", "O", "J", "K"}
local btn = {"right", "left", "down", "up", "start", "select", "B", "A"}
--Try to avoid changing btn. You may reorder btn's stuff if you don't
--like the default order, however. Line up with key for good reasons.
--key is the actual script control over the buttons. Change that!
--Insertions and deletions
local Insert= "insert" -- Inserts a frame at the frame you're at
local Delete= "delete" -- Eliminates current frame
--Display
local solid= "pageup" -- Make the display less
local clear= "pagedown" -- or more transparant.
@ -24,8 +44,7 @@ local MorePast= "numpad7" -- how many frames you
local LessPast= "numpad9" -- want to display.
local ResetFP= "numpad5"
local key = {"right", "left", "down", "up", "L", "O", "J", "K"}
local btn = {"right", "left", "down", "up", "start", "select", "B", "A"}
local shade= 0x00000080
@ -34,13 +53,16 @@ local red= "#FF2000FF"
local green= 0x00FF00FF
local blue= 0x0040FFFF
local orange="#FFC000FF"
--*****************************************************************************
--Please do not change the following, unless you plan to change the code:
local plmin , plmax= 1 , 1
local fc= 0
local LastLoad= movie.framecount()
local saveCount= 0
local saveArray= {}
local rewinding= false
local BufInput, BufLen= {},{}
local InputList= {}
local ThisInput= {}
local TrueSwitch, FalseSwitch= {}, {}
@ -49,8 +71,6 @@ local ScriptEdit= {}
for pl= 1, players do
InputList[pl]= {}
ThisInput[pl]= {}
BufInput[pl]= {}
BufLen[pl]= 0
TrueSwitch[pl]= {}
FalseSwitch[pl]= {}
@ -65,6 +85,8 @@ for pl= 1, players do
end
--*****************************************************************************
local Draw= {} --Draw[button]( Left , Top , color )
--*****************************************************************************
@ -301,6 +323,21 @@ function ReadJoynum(input, button) -- Expects... Certain numbers!
end
--*****************************************************************************
function RewindThis()
--*****************************************************************************
--DarkKobold & FatRatKnight; Original concept by Antony Lavelle
if saveCount <= 0 then
return false -- Failed to rewind
else
savestate.load(saveArray[saveCount]);
saveCount = saveCount-1;
end;
return true -- Yay, rewind!
end
--*****************************************************************************
function ShowOnePlayer(x,y,color,button,pl)
--*****************************************************************************
@ -380,6 +417,7 @@ function DisplayOptions(width) -- Expects width calculated by DisplayInput
return nil -- Signal to display the input
end
--*****************************************************************************
function DisplayInput()
--*****************************************************************************
@ -452,13 +490,10 @@ end
--*****************************************************************************
function SetInput()
--*****************************************************************************
-- Prepares ThisInput for joypad use.
for pl= 1, players do
local temp
if BufLen[pl] > 0 then
temp= BufInput[pl][BufLen[pl]]
else
temp= InputList[pl][fc-BufLen[pl]]
end
local temp= InputList[pl][fc]
for i= 1, 8 do
if temp and ReadJoynum(temp,i) and ReadList[pl][i] then
@ -473,6 +508,8 @@ end
--*****************************************************************************
function ApplyInput()
--*****************************************************************************
-- Shoves ThisInput into the actual emulator joypads.
if movie.mode() ~= "playback" then
for pl= 1, players do
joypad.set(pl, ThisInput[pl])
@ -480,12 +517,16 @@ function ApplyInput()
end
end
local XStart, XDiff= 30, 25
local YStart, YDiff= 12, 15
local Status= { {},{},{},{} }
local TargA= {FalseSwitch,TrueSwitch,ReadList,ScriptEdit}
local TrueA= { nil , "inv" , true , true }
local FalsA= { false , true , false , false }
local BtnX, BtnY= 0, 0
local BasicText= {"Activate: Lets the joypad activate input.",
"Remove: Allows the joypad to remove input.",
@ -496,7 +537,7 @@ local BasicText= {"Activate: Lets the joypad activate input.",
function HandleOptions()
--*****************************************************************************
-- Lets the user make adjustments on the various controls of this script.
-- The interface here still needs some work. Bleh.
-- The interface, apparently, is most of the work!
Draw.B( XStart + XDiff ,YStart,red)
Draw.right(XStart + XDiff + 5,YStart,white)
@ -513,8 +554,27 @@ function HandleOptions()
Draw.down( XStart + XDiff*3+ 8,YStart ,red)
Draw.down( XStart + XDiff*3+ 8,YStart+4,green)
local BtnX= math.floor((keys.xmouse- XStart+4)/XDiff)
local BtnY= math.floor((keys.ymouse- YStart-6)/YDiff)
if (keys.xmouse ~= lastkeys.xmouse) or (keys.ymouse ~= lastkeys.ymouse) then
BtnX= math.floor((keys.xmouse- XStart+4)/XDiff)
BtnY= math.floor((keys.ymouse- YStart-6)/YDiff)
else
if press(DispN) then
BtnX= limits(BtnX ,1,4)
BtnY= limits(BtnY-1,1,9)
end
if press(DispS) then
BtnX= limits(BtnX ,1,4)
BtnY= limits(BtnY+1,1,9)
end
if press(DispE) then
BtnX= limits(BtnX+1,1,4)
BtnY= limits(BtnY ,1,9)
end
if press(DispW) then
BtnX= limits(BtnX-1,1,4)
BtnY= limits(BtnY ,1,9)
end
end
for i= 1, 4 do
for j= 1, 8 do
@ -561,7 +621,7 @@ function HandleOptions()
gui.text(XStart + XDiff*i, YStart + YDiff*9, "All")
end
if press("leftclick") then
if press("leftclick") or press(ResetFP) then
if within( BtnY , 1 , 9 ) then
if within( BtnX , 1 , 4 ) then
local LoopS, LoopF= 1, 8
@ -607,8 +667,11 @@ function OnLoad()
--*****************************************************************************
-- For use with registerload. It updates ThisInput so we're not stuck with
-- junk being carried over when we load something.
-- Also clears whatever rewind stuff is stored.
fc= movie.framecount()
LastLoad= fc
saveCount= 0
SetInput()
ApplyInput() -- Sanity versus unpaused stateload
end
@ -628,6 +691,16 @@ function ItIsYourTurn()
OnLoad()
end
if pressrepeater(rewind) or rewinding then
rewinding= false
if RewindThis() then
movie.rerecordcounting(true)
fc= movie.framecount()
SetInput()
if saveCount == 0 then emu.pause() end
end
end
if press(PlayerSwitch) then
if plmin ~= plmax then
plmax= 1
@ -681,6 +754,8 @@ function ItIsYourTurn()
ApplyInput()
lastkeys= keys
collectgarbage("collect")
end
gui.register(ItIsYourTurn)
@ -690,8 +765,30 @@ emu.pause()
--*****************************************************************************
while true do -- Main loop
--*****************************************************************************
-- Currently does nothing. Everything that needs to be done are in registers.
-- I could just remove this, if I can't make reason to keep it.
-- Contains the saving part of the Rewind engine.
-- Original by Antony Lavelle, added by DarkKobold, messed by FatRatKnight
if saveMax > 0 then -- Don't process if Rewind is disabled
if keys[rewind] and saveCount > 0 then
rewinding= true
elseif (fc - LastLoad)%SaveBuf == 0 then
if saveCount >= saveMax then
table.remove(saveArray,1)
else
saveCount= saveCount+1
end
if saveArray[saveCount] == nil then
saveArray[saveCount]= savestate.create();
end
savestate.save(saveArray[saveCount]);
movie.rerecordcounting(false)
end
end
emu.frameadvance()
end