]> git.bts.cx Git - p8-playback.git/commitdiff
Initial commit
authorBen Sherratt <redacted>
Tue, 14 Feb 2023 14:35:26 +0000 (14:35 +0000)
committerBen Sherratt <redacted>
Tue, 14 Feb 2023 14:35:26 +0000 (14:35 +0000)
* Recording and playback to file seems to work

README.md [new file with mode: 0644]
playback.lua [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
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 (file)
index 0000000..571d699
--- /dev/null
@@ -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()