An Etterna addon that estimates the amount of manip based on replay data, introducing a new metric for play accuracy. Offers both a browser-based version for EtternaOnline and an In-Game version. Hover the cursor to see left and right hands separately.
Follow the instructions below for installation:
- Install the Tampermonkey browser extension.
- Copy the script from this repository: manipfactor.etternaonline.js.
- Paste the script to Tampermonkey:
- Click on the Tampermonkey icon in your browser's toolbar.
- Click the + icon or select "Create a new script" to open a new script editor.
- Paste the copied script into the editor and save it.
- Move
manipfactor.lua
to the following directory inside your Etterna game folder:
Themes\Til Death\BGAnimations\ScreenEvaluation decorations
or
Themes\reimuboobs-theme-main\BGAnimations\ScreenEvaluation decorations
depending on your theme.
- Open
default.lua
from the same folder and before the last line:
return t
add the following line:
t[#t + 1] = LoadActor("manipfactor")
- Open
scoreboard.lua
from the same folder and after the second occurrence of the line:
self:GetParent():GetParent():GetParent():GetChild("OffsetPlot"):playcommand("SetFromScore", {score = hsTable[index]})
add the following line:
MESSAGEMAN:Broadcast("GetScore", {score = hsTable[index]})
- Move
manipfactor.lua
to the following directory inside your Etterna game folder:
Themes\Rebirth\BGAnimations\ScreenEvaluation decorations
- open
mainDisplay.lua
from the same folder and before the last line:
return t
add the following line:
t[#t + 1] = LoadActor("manipfactor")
- In the same file, find the block of code that starts with:
JudgeWindowChangedMessageCommand = function(self)
and above the end,
line, add the following line:
MESSAGEMAN:Broadcast("GetScore", {score = params.score})
This step allows you to display the MF in the offset plot tooltip when you hover over the accuracy graph. It's applicable to all themes.
- Locate the
offsetplot.lua
file in the following directory inside your Etterna game folder:
Themes\[Your Theme]\BGAnimations
where [Your Theme]
is your theme's name (e.g., Til Death, Rebirth, etc.).
-
Open
offsetplot.lua
in a text editor and find the tooltip text block searching for themarvCount
variable. -
Add the following line AFTER the declaration of the
row
variable (in the screenshot, it's marked with a red!
):
local mf = GetManipFactorForRow(td:GetElapsedTimeFromNoteRow(row) / getCurRateValue() * 1000) * 100
- Add the following text in the
settextf
function (in Rebirth its calledstring.format
) after the last\n
:
%s: %2.1f%%\n
- Add the following line right before the
time
variable is passed to thesettextf
function:
"MF", mf,
The number Manip Factor (or MF) gets bigger the more a player hits one-hand misaligned notes (like trills or streams), as if they were a single aligned pattern (like jumps). The assumption is that when a player abuses this kind of playstyle, the hit errors (offsets) for consecutive different columns notes will be negatively correlated—meaning if one note is hit late, the next one tends to be hit early, making the difference between the errors larger than if the notes were hit as expected.
To measure the degree of such abuse from the replay data, we collect pairs of all misaligned one-hand notes and calculate the difference between their error values: |error_B - error_A|. Then we normalize this by using half the average time interval between notes on a single column and average the number across all pairs. The bigger the final number gets the more the player's technique leans toward manip play.
I understand that this metric is not perfect and that there is significant room for improving its accuracy. If you'd like to contribute, feel free to contact me on Discord at u1wkn. Although the primary purpose of the metric is to guide your skill development in a direction orthogonal to manip, I can also see potential for implementing a score nerf system based on this factor, converting it into an MSD scaler, for example, using this kind of function: example.