MultiAx Tools (WIP)

General

This is an extension for OFS 3 (work in progress) to provide some tools to help with the creation or editing of multi-axis scripts. It’s still very early in the process and hasn’t been cleaned up or been documented properly, but until I find more time, it is what it is.

Some of these functions will probably only be temporary until the issues are handled by the player software or firmware. Until then, this can help achieve better experiences and help the discussion around the issue and the implementation of a solution.

What it does

Stroke Stunting

When Roll, Pitch, Surge or Sway are engaged, the stroke becomes longer than the original L0 script. This can be especially dangerous when the stroke is at 100% (top), since there can be slip-out.

Multi-Fun-Player has a solution called Smart Limits. With it, angles and deviations can be limited, depending on the stroke axis. While this is a welcome tool, actually having angles and deviations possible at the tip while maintaining a small safety margin makes for an even better experience.

Therefore this tool does the correction the other way round. Depending on roll, pitch, sway and surge it stunts the stroke axis, such that the actual contact point on the dick stays approximately the same. This way an existing single-axis script can be taken, axes added to it and the actual stroke distances stay approximately the same. The geometry of the device can be individually set to account for different builds in the DIY space and other individual factors.

Angle → Linear Compensation

When roll or pitch are engaged, then the sleeve entry rotates around the receiver’s rotation axis meaning that the positions around surge or sway change. The tool makes it possible to compensate for that fully or partially, over-compensate or increase the deviation depending on what is needed. It uses geometric parameters, that can be set by the user.

How to use

Description of pages

General

At the top of each page are the page navigations. It is possible to use the dropdown list, select the previous/next page or directly jump to a page. There are also keybinds to jump to/toggle pages.

Page 1 - Axis Definitions

Pretty self-explanatory: Check the axes of your device.

Page 2 - Axis Allocations

Which script means which axis? Choose the right ones from the drop-downs.

Page 3 - Geometry Parameters

  • r: The distance in millimeters between the rotational axis of the receiver to the sleeve entry. Use larger values to be more conservative. Standard for many Fleshlight Sleeves is around 60 mm.
  • Max. Roll/Pitch Angle: In degrees, the maximum angle to each side from the center (half the full range). Standard for both SR6 and OSR2+ nominally 30°
  • Max. Stroke Distance: The devices (or your setup’s) maximum stroke distance in millimeters. Nominally 136mm for OSR2 and 120mm for SR6.
  • Max. Surge/Sway deviations: In millimeters, the maximum surge/sway distance from the center (half the full range). Nominally 30 mm.
  • Time: The tool uses the first-order derivative of the position, i.e. velocity. The higher the value, the more correction is used for stunting the stroke axis, when the axes move with high speeds. This is especially helpful with setups that aren’t very stiff to compensate delays and possible movements that come from high accelerations that would lengthen the stroke. Standard: 60 ms.
  • LDot influence: An extension to the Time parameter. This also accounts for movements along the main stroke axis. Standard: 0%
  • Lower Derate Limit: The compensation is done fully at the top of the stroke (100%). This parameter denotes the part of the stroke, under which no stunting is made. The stunting is linearly interpolated in between. Standard: 25
Page 4 - Angle to Linear Compensation

For SR6: compensate the deviations from roll/pitch with sway/surge.

  • Scale: The degree of compensation: 100% means that the sleeve entry stays where it is. You can over-compensate with values large than that, under-compensate, or even increase the deviation with negative numbers, making the angle more pronounced.

WARNINGS:

  • If you don’t select any actions in the pitch or roll script, it will do the compensation for the whole script.
  • It will add the compensation to the sway/surge axis value at that time. So if you want a neutral compensation, add one action of 50% to the surge/sway script at the same time of the first selected roll/pitch action.

Before:

After with over-compensation:

Example for full compensation, the vortex:
vortex

Page 5 - Stunt Stroke Axis

  • Tolerance: The script will add additional, interpolated actions to the stroke script, at the timestamps of actions on other axes. This parameter sets a time difference in milliseconds to an existing action, for which no new actions are added. Standard: 50 ms
  • Stunt Stroke Peaks: Runs the script to stunt the stroke axis. Either select actions or don’t select anything to run the function over the whole script.
  • CleanUp: Removes actions, for which the slope doesn’t change enough and are therefore redundant.
  • Min. Relative Slope Change: The threshold under which the slope change is considered too small and the actions are removed. Standard: 20%

WARNINGS:

  • If you don’t select any actions in the pitch or roll script, it will do the compensation for the whole script.
  • I have not payed attention to make it too performant. So for longer scripts, it might take a few seconds.

Before:


Installation

In OFS3’s extension directory, create a Folder named “MultiAx Tools” and copy the file “main.lua” into it. The simplest way to reach it is to open OFS and go to “Extensions → Extension Directory”. After that you can enable it in OFS by going to “Extensions → MultiAx Tools → Enabled” and after that you can select “Extensions → MultiAx Tools → Show Window”.

File and Change Logs

The newest version can be found here.

Revisions
0.5.0 - 26.01.2026 - First ES release.

Pipeline / Ideas

  • Make global variables and functions local
  • Clean up and delete old code
  • Add tooltips and explanations
  • Add Pattern Injector (Define pattern in function of stroke axis, extend pattern in function of stroke axis)
  • Automate Script allocation
  • Twist → Pitch/Roll contact patch rotation
  • Track Addition
  • Movement Pattern Library

Call for Feedback

I release this as a work in progress so maybe some people might find this useful.

Have you encountered an error or unexpected behaviour? Please add a comment with a detailed error description (what were you doing, screenshot of error message). I’ll do my best to rectify the issue as early as possible.

Are you missing or have an idea for a function? Please don’t hesitate to make suggestions.

6 Likes