Animation Action Tags
Tell Accurate Penetration exactly where each actor position should target during each animation stage. Action tags override the default scene-context heuristics when an animation needs explicit per-stage behavior.
Overview
By default, the mod guesses the active target from framework scene context and animation tags. That works for many scenes, but some animations need a direct target because the framework data is ambiguous or wrong.
Animation action tags are JSON entries keyed by animation ID. Each stage can set a target for actor positions 1 through 5.
The target assigned to an actor position defines where that actor's genitals go. It does not describe what happens to that actor. If actor position 2 has target V, actor 2's penis targets a vagina.
When To Use Action Tags
- The mod targets the wrong hole, such as vaginal when the stage should be anal.
- An actor's genitals clip through air or the wrong body part.
- You want to disable genital tracking for a specific actor in a scene.
- Automatic detection is unreliable for a specific animation or stage.
Target Values
| Value | Target | Behavior |
|---|---|---|
| V | Vagina | Push this actor's genitals toward a vagina target. |
| A | Anus | Push this actor's genitals toward an anus target. |
| M | Mouth | Push this actor's genitals toward a mouth target. |
| H | Hand | Use hand tracking and choose the closest detected hand. |
| LH | Left Hand | Use hand tracking with the left hand. |
| RH | Right Hand | Use hand tracking with the right hand. |
| ! | None | Disable tracking for this actor position in this stage. |
| omitted | Auto | Leave the actor key out of the stage object and the mod will fall back to its default heuristics. In manual mode, omitted positions become None. |
Do not write "b" for Auto. The current loader treats unknown strings as None. To use Auto in manually edited JSON, omit that actor position key.
Actor Positions
Actor positions 1 through 5 correspond to the order reported by the animation framework, such as SexLab or OStim. Position 1 is usually the main actor, position 2 is usually the first partner, and higher positions are additional participants.
The in-game target menu shows the current actor, stage, and target, so it is usually the safest way to identify positions before writing JSON by hand.
JSON Files
Animation tags are loaded from:
Data/SKSE/Plugins/ppa-animation-tagging/
The loader reads every .json file in that folder and merges matching animation entries together.
File Priority
Files are sorted in reverse alphabetical order. Later-loaded files have higher priority, so names that sort earlier alphabetically win over names that sort later.
| File | Priority | Notes |
|---|---|---|
| z_something.json | Lowest | Loaded first. |
| a_something.json | Higher | Loaded after z_ files. |
| 0_your_custom_tags.json | Highest | Loaded last and used by the in-game save menu. |
Put personal overrides in 0_your_custom_tags.json when you want them to beat bundled defaults. If you want your hand-edited file separate from the in-game editor's output, use a filename that still sorts before the bundled defaults.
Basic Format
Use this compact format when you only need stage targets and do not need the manual flag.
{
"AnimationName": [
{
"s": 1,
"1": "V",
"2": "!"
},
{
"s": 2,
"1": "V",
"2": "!"
},
{
"s": 3,
"1": "A",
"2": "!"
}
],
"AnotherAnimation": [
{
"s": 1,
"2": "M"
}
]
}
| Field | Type | Meaning |
|---|---|---|
| AnimationName | string | The exact animation ID reported by the framework. |
| s | integer | The stage number. |
| 1 through 5 | string | The actor position target for that stage. |
Extended Format With Manual Flag
Use this object format when you want omitted actor positions to be disabled instead of falling back to heuristics.
{
"AnimationName": {
"manual": true,
"stg": [
{
"s": 1,
"1": "V",
"2": "!"
},
{
"s": 2,
"1": "A",
"2": "!"
}
]
}
}
When manual is true, any actor position that is not explicitly defined resolves to None instead of Auto. Use this for animations where you want complete control and do not want the mod guessing.
Method 1: In-Game Editing
The easiest way to tag animations is through the target menu during an active scene.
Start the animation scene.
Open the target menu with your configured select-actor key. The default key is 0.
Look at the actor position you want to modify.
Select Vagina, Anus, Mouth, LHand, RHand, None, or Auto.
Repeat for other actors and stages as needed.
Select Save to write changes to 0_your_custom_tags.json.
Menu changes are applied immediately for the active session. They do not persist across game sessions until you save them.
Method 2: Manual JSON Editing
Manual editing is useful for bulk changes or for animations you cannot test in-game.
Step 1: Find The Animation Name
Enable debug logging in the mod settings. The log can show entries that include the actor, context, and stage:
Status for ActorName: Context:[Anal] Stage:2 ...
You can also use your animation framework's tools or documentation to find the exact animation ID.
Step 2: Create Or Edit Your Custom File
Open or create:
Data/SKSE/Plugins/ppa-animation-tagging/0_your_custom_tags.json
Step 3: Add Animation Entries
{
"SexLabAnimation_Missionary_A1": [
{
"s": 1,
"1": "!",
"2": "V"
},
{
"s": 2,
"1": "!",
"2": "V"
},
{
"s": 3,
"1": "!",
"2": "V"
},
{
"s": 4,
"1": "!",
"2": "V"
},
{
"s": 5,
"1": "!",
"2": "V"
}
]
}
This example disables actor position 1 and makes actor position 2 target a vagina in stages 1 through 5.
Troubleshooting
- Nothing changes: confirm the animation ID exactly matches the framework ID and that the JSON file is inside
ppa-animation-tagging. - Your file loses priority: rename it so it sorts before the files you want to override, or use
0_your_custom_tags.json. - Auto behaves like disabled after manual edits: remove the actor key from that stage instead of writing an unknown value.
- Manual mode disables too much: set
manualtofalseor remove the flag so omitted positions can use heuristics. - Invalid JSON: one syntax error can prevent the whole file from loading. Check commas, quotes, and matching braces.