fceux/output/luaScripts/taseditor/RecordBackwards.lua

100 lines
4.1 KiB
Lua

---------------------------------------------------------------------------
-- Recording Input while Rewinding Playback frame-by-frame
-- by AnS, 2012
---------------------------------------------------------------------------
-- Showcases following functions:
-- * joypad.getimmediate()
-- * taseditor.getrecordermode()
-- * taseditor.getsuperimpose()
-- * taseditor.getinput()
-- * taseditor.setinput()
-- * taseditor.clearinputchanges()
-- * taseditor.applyinputchanges()
---------------------------------------------------------------------------
-- Usage:
-- Run the script, unpause emulation (or simply Frame Advance once).
-- Now you can hold some joypad buttons and press "Rewind Frame" hotkey
-- to Record those buttons into PREVIOUS frame.
-- Try using this crazy method alongside with Frame Advance Recording.
-- This script supports multitracking and superimpose. Doesn't support Patterns.
---------------------------------------------------------------------------
-- This function reads joypad input table and converts it to single byte
function GetCurrentInputByte(player)
input_byte = 0;
input_table = joypad.getimmediate(player);
if (input_table ~= nil) then
-- A B select start up down left right
if (input_table.A) then input_byte = OR(input_byte, 1) end;
if (input_table.B) then input_byte = OR(input_byte, 2) end;
if (input_table.select) then input_byte = OR(input_byte, 4) end;
if (input_table.start) then input_byte = OR(input_byte, 8) end;
if (input_table.up) then input_byte = OR(input_byte, 16) end;
if (input_table.down) then input_byte = OR(input_byte, 32) end;
if (input_table.left) then input_byte = OR(input_byte, 64) end;
if (input_table.right) then input_byte = OR(input_byte, 128) end;
end
return input_byte;
end
function reversed_recorder()
if taseditor.engaged() then
playback_position = movie.framecount();
if (playback_position == (playback_last_position - 1)) then
-- Playback cursor moved up 1 frame, probably Rewind was used this frame
if (not movie.readonly()) then
-- Recording on
recording_mode = taseditor.getrecordermode();
superimpose = taseditor.getsuperimpose();
taseditor.clearinputchanges();
name = "Record";
if (recording_mode == "All") then
-- Recording all 4 joypads
for target_player = 1, 4 do
new_joypad_input = GetCurrentInputByte(target_player);
old_joypad_input = taseditor.getinput(playback_position, target_player);
-- Superimpose with old input if needed
if (superimpose == 1 or (superimpose == 2 and new_joypad_input == 0)) then
new_joypad_input = OR(new_joypad_input, old_joypad_input);
end
-- Add joypad info to name
if (new_joypad_input ~= old_joypad_input) then
name = name .. "(" .. target_player .. "P)";
end
taseditor.submitinputchange(playback_position, target_player, new_joypad_input);
end
-- Write to movie data
taseditor.applyinputchanges(name);
else
-- Recording target_player using 1P keys
new_joypad_input = GetCurrentInputByte(1);
target_player = 1;
if (recording_mode == "2P") then target_player = 2 end;
if (recording_mode == "3P") then target_player = 3 end;
if (recording_mode == "4P") then target_player = 4 end;
old_joypad_input = taseditor.getinput(playback_position, target_player);
-- Superimpose with old input if needed
if (superimpose == 1 or (superimpose == 2 and new_joypad_input == 0)) then
new_joypad_input = OR(new_joypad_input, old_joypad_input);
end
-- Add joypad info to name
if (new_joypad_input ~= old_joypad_input) then
name = name .. "(" .. recording_mode .. ")";
end
-- Write to movie data
taseditor.submitinputchange(playback_position, target_player, new_joypad_input);
taseditor.applyinputchanges(name);
end
end
end
playback_last_position = playback_position;
else
gui.text(1, 9, "TAS Editor is not engaged.");
end
end
playback_last_position = movie.framecount();
taseditor.registerauto(reversed_recorder);