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.

Important

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

ValueTargetBehavior
VVaginaPush this actor's genitals toward a vagina target.
AAnusPush this actor's genitals toward an anus target.
MMouthPush this actor's genitals toward a mouth target.
HHandUse hand tracking and choose the closest detected hand.
LHLeft HandUse hand tracking with the left hand.
RHRight HandUse hand tracking with the right hand.
!NoneDisable tracking for this actor position in this stage.
omittedAutoLeave 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.
Auto Values

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.

FilePriorityNotes
z_something.jsonLowestLoaded first.
a_something.jsonHigherLoaded after z_ files.
0_your_custom_tags.jsonHighestLoaded 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

Stage array 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"
    }
  ]
}
FieldTypeMeaning
AnimationNamestringThe exact animation ID reported by the framework.
sintegerThe stage number.
1 through 5stringThe actor position target for that stage.

Extended Format With Manual Flag

Manual animation format

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.

1

Start the animation scene.

2

Open the target menu with your configured select-actor key. The default key is 0.

3

Look at the actor position you want to modify.

4

Select Vagina, Anus, Mouth, LHand, RHand, None, or Auto.

5

Repeat for other actors and stages as needed.

6

Select Save to write changes to 0_your_custom_tags.json.

Testing

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 manual to false or 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.