From: Ben Sherratt Date: Tue, 14 Feb 2023 14:35:26 +0000 (+0000) Subject: Initial commit X-Git-Url: https://git.bts.cx/p8-playback.git/commitdiff_plain/192a0efcd4d89bd800e43591b1485b7b2701bf18 Initial commit * Recording and playback to file seems to work --- 192a0efcd4d89bd800e43591b1485b7b2701bf18 diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f3ef11 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Playback (+ recording) for PICO-8 + +This is a super simple way to get button recording and playback into your PICO-8 carts. + +1. `#include playback.lua`. +2. Use the new menu options. diff --git a/playback.lua b/playback.lua new file mode 100644 index 0000000..571d699 --- /dev/null +++ b/playback.lua @@ -0,0 +1,96 @@ +function playback_record() + _flip=flip + __recording_frame=0 + __recording_buttons=btn() + __recording_buttons_pressed=btnp() + __recording_first=true + flip=function() + _flip() + __recording_frame+=1 + local b,bp=btn(),btnp() + if b!=__recording_buttons or bp!=__recording_buttons_pressed then + __recording_buttons=b + __recording_buttons_pressed=bp + printh(__recording_frame..","..__recording_buttons..","..__recording_buttons_pressed,playback_filename,__recording_first) + __recording_first=false + end + end + + menuitem(playback_menu_idx, "end recording",function() + flip=_flip + playback_default_menu() + end) +end + +function playback_play() + function playback_read_line() + local data="" + while stat(120) do + serial(0x800,0x4300,1) + local c=chr(peek(0x4300)) + if(c=="\n")break + data..=c + end + if(#data==0)return nil + return data + end + + local cx,cy=peek2(0x5f28),peek2(0x5f2a) + while stat(120)==false do + camera() + rectfill(10,50,117,78,0) + rect(10,50,117,74,7) + print("drop playback file",20,60,7) + flip() + camera(cx,cy) + end + + _flip=flip + _btn=btn + _btnp=btnp + + __playback_frame=0 + _btn_data=0 + _btn_p_data=0 + + btn=function(b,pl) + if(b==nil and pl==nil)return _btn_data + if(pl==nil)pl=0 + return (_btn_data&(1<<(b+pl*6)))>0 + end + + btnp=function(b,pl) + if(b==nil and pl==nil)return _btn_p_data + if(pl==nil)pl=0 + return (_btn_p_data&(1<<(b+pl*6)))>0 + end + + _playback_next_frame,_playback_next_btn,_playback_next_btnp=unpack(split(playback_read_line())) + + flip=function() + _flip() + __playback_frame+=1 + + if __playback_frame>=_playback_next_frame then + _btn_data,_btn_p_data=_playback_next_btn,_playback_next_btnp + local line=playback_read_line() + if(line!=nil)_playback_next_frame,_playback_next_btn,_playback_next_btnp=unpack(split(line)) + end + end + + menuitem(playback_menu_idx+1, "end playback",function() + flip=_flip + btn=_btn + btnp=_btnp + playback_default_menu() + end) +end + +function playback_default_menu() + menuitem(playback_menu_idx, "record playback",function() playback_record() end) + menuitem(playback_menu_idx+1, "play playback",function() playback_play() end) +end + +if(playback_filename==nil)playback_filename="recording" +if(playback_menu_idx==nil)playback_menu_idx=4 +playback_default_menu()