Refactored for the register functions. This seems to work fairly well, but when loading a state, joypad.get() contains the button states for the frame you were on BEFORE loading instead of the frame you are now on. This results in small errors. The issue might be deeper than my script or even the Lua implementation, so I can't do anything about this.

This commit is contained in:
brandman211 2012-03-28 03:41:46 +00:00
parent 9c40367fa8
commit 40e2d5f543
1 changed files with 32 additions and 49 deletions

View File

@ -18,83 +18,68 @@ function table.copy(t)
end
function counts()
--Display the counts of the holds and the presses.
gui.text(x, y, 'Holds: ' .. holds)
gui.text(x, y + 14, 'Presses: ' .. presses)
end
function load(slot)
--As Lua starts counting from 1, and there may be a slot 0, increment.
slot = slot + 1
if not states[slot] or not states[slot].holds then
gui.text(x, y + 28, 'No data loaded from slot ' .. tostring(slot - 1))
counts()
function frames()
if not movie.isloaded() then
console.output('No data loaded from frames')
return
end
--Load the data if there is any available for this slot.
holds = states[slot].holds
pressed = table.copy(states[slot].pressed)
presses = states[slot].presses
console.output('Data loaded from slot ' .. tostring(slot - 1))
reset()
--Get data from every frame but this one. This frame's data will be decided
--in real-time.
for frame = 0, emu.framecount() - 1 do
record(movie.getinput(frame))
end
console.output('Data loaded from frames')
counts()
end
function load(name)
if not states[name] then
frames()
save(name)
return
end
holds = states[name].holds
pressed = table.copy(states[name].pressed)
presses = states[name].presses
console.output('Data loaded from ' .. name)
counts()
end
function record(buttons)
--Run through all of the pressed buttons.
for button, value in pairs(buttons) do
if value then
holds = holds + 1
--If in the previous frame the button was not pressed, increment.
if not pressed[button] then
presses = presses + 1
end
end
--Mark this button as pressed or not pressed.
pressed[button] = value
end
end
function frames()
--If there is an open, read-only TAS file, parse it for the initial data.
if not movie.isloaded() then
return false
end
local frame = -1
reset()
--Parse up until two frames before the current one.
while frame ~= emu.framecount() - 2 do
record(movie.getinput(frame))
frame = frame + 1
end
return true
end
function reset()
holds = 0
pressed = {}
presses = 0
end
function save(slot)
--As Lua starts counting from 1, and there may be a slot 0, increment.
slot = slot + 1
while table.maxn(states) < slot do
table.insert(states, {})
end
--Mark the current data as the data for this slot.
states[slot].holds = holds
states[slot].buttons = table.copy(buttons)
states[slot].presses = presses
console.output('Data saved to slot ' .. tostring(slot - 1))
function save(name)
states[name] = {}
states[name].holds = holds
states[name].pressed = table.copy(pressed)
states[name].presses = presses
console.output('Data saved to ' .. name)
counts()
end
reset()
if frames() then
console.output('Data loaded from frames')
else
console.output('No data loaded from frames')
end
frames()
if savestate.registerload then
savestate.registerload(load)
savestate.registersave(save)
@ -103,9 +88,7 @@ end
while true do
--If this is the first frame, reset the data.
if emu.framecount() == 0 then
holds = 0
pressed = {}
presses = 0
reset()
end
record(joypad.get())
counts()