We now have single-file multi-axis option builtin directly in the site
For scripters
- Just upload the .sway .twist etc files same as before, no need to merge them
- Avoid having two scripts with exactly same name (e.g.
example.funscriptin one section andexample.funscript+example.twist.funscriptin other section) - the merger will get confused- I may implement a fix to allow multiple files with same name, it’s up for discussion
- If you have two exactly same scripts for different axes, add a space to the file so they are uploaded separately
- Please don’t upload heatmap images, as they are now auto-generated
- Handy scripts (550 max speed, 30ms min between actions) will show ☞ axis
- If your script is above 800 you definitely scripted something wrong. The displayed max speed is speed device needs to hit all the peak points, intermediate speed may be higher then that
Player support
- MultiFunPlayer:
- supports single-file multi-axis scripts (in both free and Patreon versions)
- supports .max extension prefix via configurable extra default script axes
- XTPlayer - not supported
- OpenFunScripter - not supported
File format:
{
"actions": [ { "at": 0, "pos": 50 } ],
"axes": [
{ "id": "R0", "actions": [ { "at": 0, "pos": 50 } ] }
]
}
where “id” is one of TCode axes excluding L0
Implementation details:
- Not having
"actions"in root object is undefined behavior (it may e.g. crash the player)- Root
"actions"may be empty[]it’s fine
- Root
"L0"axis is safe undefined behavior- it may be ignored, used instead of root, or whatever
- Unknown axes, e.g.
"F7"should be safely ignored (it they are not valid axis objects it’s UB) - Extra properties in axes SHOULD be ignored
- This means
{ ...L0Script, "axes": [ { ...R0Script, "id": "R0" } ] }is a valid multi-axis script rangeandinvertedare not supported by anyone afaik so please ignore them
- This means
- The root object may have
"id": "L0"or whatever feel free to ignore it.- If it doesn’t match extension prefix (e.g.
.twistfile having"id": "R0") it’s UB
- If it doesn’t match extension prefix (e.g.
- Decimal
metadata.durationMUST NOT crash the player (it may be rounded) - Decimal
at/posbetter not crash the player (they may be rounded)- Negative
atbetter not crash the player (they may be ignored) - Duplicate
atbetter not crash the player (they may be ignored) - Out-of-0-100-bounds
posbetter not crash the player (they may be ignored or trimmed)
- Negative
- If there is a video
example.max.mp4it SHIULD be matched withexample.max.funscript- So
.maxextension prefix should be safely ignored .maxprefix may be threated as a primary script, but that’s up for discussion
- So
This format was discovered by me in MFP code (which, it turn, was added for SLR compat) so I mostly describe how it already works
Unroll plan
- Multi-axis merging
- Multi-axis script shows download count
- Downloading multi-axis script bumps all download counts
- Optional
.maxextension when downloading - Dropdown with single-axis scripts
- Set option to merge multi-axis ON by default
- Set
.maxextension OFF by default?
- Set
Future development
- allow axis names for axes as TCode axes are less humanly readable
- extend device support for vibes etc
- maybe allow “variants” of the same axis (classic “with empty” vs “with filler”)
- Inspire by Buttplug.io


