A PICO-8 TAS framework based on picolove
Requires LÖVE 11.4 (LÖVE 11.x experimentally supported)
What is PICO-8:
What is LÖVE:
Celia has 3 uses:
- A general TAS tool for tasing any PICO-8 cart
- A framework for developing designated TAS tools PICO-8 games
- A fully fledged TAS tool for celeste and mods.
- Celia is based on this fork of picolove. Carts not supported by it will not work. in particular, some more advanced/newer PICO-8 features might not be avaliable (though it does have many features not present in other picolove forks, such as support for _ENV and bitwise ops).
- Due to the last point, by default Celia uses floats instead of 16.16 Fixed point numbers, which may cause some differences from PICO-8. There is experimental fixed point emulation using the command line argument
--fixp
- No support for seeding reproducing randomness deterministically (yet)
- No support for coroutines, as they cannot be serialized in standard lua, as far as I know
- The spritesheet and music/sfx data are not serialized as part of the state, and will not rewind correctly.
- Right now Celia is a bit of a memory hog, consuming ~0.5MB per frame (depending on the cart). A more "traditional" savestate-based TAS tool could be created to address this issue (using the
savestate_every
console command can also help alleviate this issue)
this is the usage for the general PICO-8 TAS tool. For usage specific to the cctas (celeste) Tas tool, see here (but make sure to read this file as well)
clone the repository, and place the cart that you want to run in the carts
folder, then run
<path to your love executable> . cartname.p8
from a terminal/command line in the project root directory
In the center of the screen, you'll see the PICO-8 screen, displaying the current frame On the left, you'll see the HUD, displaying the current frame number, and an input display, with the currently pressed inputs On the right, you'll see the pianoroll, which shows the inputs in the frames around the current one
- L - advance 1 frame forward
- K - rewind 1 frame back
- Left, Right, Up, Down, Z/C, X (controller buttons)- toggle the respective button for the current frame
- Shift + controller button - toggle hold of the respective button. held buttons will be pressed when advancing/rewinding to a frame
- D - preform a full-rewind, return to frame 0
- P - start realtime playback. The TAS will play back in real time, and inputs can't be modified. any keypress during realtime playback will stop it.
- Shift + P - fast forward until the last input frame
- Shift + R - reset, clear the inputs, and rewind to frame 0
- M - save the current inputs to a file .lua, in the games data folder (By default, on windows this is %appdata%/love/Celia, and on linux ~/.local/share/love/Celia). The filepath will be outputted to the terminal.
- Shift + W - Load the input file from the data folder
- Insert - Insert a blank input frame before the current frame (This respects held keys)
- Ctrl + Insert - Duplicate the current input frame
- Delete - Delete the current input frame
- Ctrl + V - paste inputs from the clipboard before the current frame
- Ctrl + Z - perform undo. pretty much any operation that changes the inputs can be undone. max undo depth is 30
- Ctrl + Shift + Z perform redo.
- Shift + L - enable visual selection mode
- Ctrl + T - toggle console
- F3 - begin gif recording
- F4 - stop gif recording
- F6 - take screenshot
- Ctrl + R - reload cart and tas tool (Warning: this cannot be undone!)
Visual selection mode allows you to perform operations on a contiguous range of inputs. The selected range will always start with the current frame (highlighted blue on the piano roll), and contain all subsequent frames (highlighted gray). You can always exit visual selection mode, by making the selection empty, or pressing ESC.
- L - advance selection 1 frame forward
- K - move selection 1 frame back. if the selection now only includes the current frame, exit visual selection mode.
- ESC - exit visual selection mode
- End - extend selection until last frame
- Home - reduce selection to the current frame, and the next one.
- controller button - set/unset the button for all selected frames
- Alt + basic button - toggle the button for all selected frames
- Ctrl + C - copy selected frames to clipboard
- Ctrl + V - replace selection with frames pasted from clipboard
- Ctrl + X - cut frames to clipboard
Celia allows creating multiple tabs - allowing tasing multiple concurrent instances of the same game. This is useful in order to compare different versions of your tas side by side.
- Ctrl + N - create a new tab
- Ctrl + W - close a tab
- Ctrl + Tab - Switch to the next tab (cyclically)
- Ctrl + Shift + Tab - Switch to the previous tab (cyclically)
- Ctrl + <number> - switch to the n'th tab
Using the console, you can access and modify the variables of the PICO-8 instance. it supports standard terminal keybindings, and allows you to input and run lua code on the pico8 instance.
Warning: making changes to variables in the PICO-8 instance, then rewinding before the changes will lose the changes. It's very easy to make TASes that desync by modifying the variables of the cart, so use it carefully.
goto_frame(i)
- fast forwards/rewinds the TAS to the i'th frame.- there is also a console command version of this which also supports relative offsets
goto_frame i
goes to the i'th framegoto_frame +i
steps i frames forwardsgoto_frame -i
rewinds i steps backwards- this version also allows giving a parameter greater than 2^16 in fixed point mode
savetate_every(n)
- create savestates everyn
frames, instead of every frame. ifn=0
the tas tool will not savestate at all. (n=1 is the normal mode). when rewinding, it will rewind to the last saved frame