RaceConfig Override System

Configure per-race and conditional physics behavior through TOML. The current system supports load-time inheritance, named base configs, and runtime overlays with Inherits = "any".

Overview

accurate-penetration.toml supplies the default RaceConfig. Files in ppa-override-configs can then replace or layer fields for actors that match race and predicate rules.

Every override is evaluated as a predicate set. A race restriction is just a race predicate, and an override with no predicates matches every actor. Use that intentionally for fallback configs or broad overlays.

Changed Behavior

The old model was effectively "one race override wins." The current model first resolves each override's Inherits base, then at runtime applies matching any overlays above the selected base. Multiple configs can contribute to the final snapshot.

Main Config

The main file is loaded from:

Data/SKSE/Plugins/accurate-penetration.toml

It can contain global behavior sections plus the same RaceConfig tables documented below. Those root-level RaceConfig fields become Settings::Defaults, which is the base for normal overrides.

General

PropertyTypeDescription
HookPositionintSelects the update hook position used by the plugin.
HandleOpeningPhysicsboolEnables or disables visual opening physics.
FutasUseAnusboolRoutes futa penetrated actors to anal handling when applicable.
IgnoredSceneActorCountintScene actor count limit used when deciding whether to ignore a scene.
IgnoreMaleActorsboolSkips male penetrated actors for orifice handling.
EnableExpressionSystemboolEnables the facial preset system.
FreecamAudioFixboolApplies the free camera audio behavior fix.
UseSkyrimUIboolUses Skyrim UI integration where supported by the menu code.

Hotkeys and Debug

PropertySectionDescription
ConsoleOnly[Hotkeys]Only accept hotkeys while the console is open.
HotkeyWhileHoldingShiftOnly[Hotkeys]Require Shift while using configured hotkeys.
Pause[Hotkeys]Toggle physics on or off.
Reload[Hotkeys]Reload config files.
SelectActor[Hotkeys]Select an actor for editor actions.
SpeedUpAnimKey[Hotkeys]Speed up the current animation.
SlowDownAnimKey[Hotkeys]Slow down the current animation.
Logging[Debug]Verbose loader and resolver logging.
Bones[Debug]Visual bone debug output.
Collision[Debug]Visual collision/orifice debug output.
Penis[Debug]Visual penis chain debug output.

Override Files

Race override files are loaded from:

Data/SKSE/Plugins/ppa-override-configs/

Files are sorted by filename in reverse alphabetical order. The first loaded file receives the lowest priority, and priority increases as loading continues. In practice, a file such as 00_high_priority.toml loads after 99_fallback.toml and wins over it.

A file can be a single root-level override or can contain multiple [[Override]] tables.

# Single override file
Races = ["Skyrim.esm|013745"]
Inherits = "default"

[Vagina]
Scale = 2.5
# Multiple overrides in one file
[[Override]]
Races = ["Skyrim.esm|0131E8"]

[Override.Penis]
Bones = ["BearD 4", "BearD 5", "BearD 6"]
LocalForwardAxis = [1, 0, 0]

[[Override]]
Races = ["Skyrim.esm|0131E7"]

[Override.Penis]
Bones = ["WolfPenis01", "WolfPenis02", "WolfPenis03"]
LocalForwardAxis = [1, 0, 0]

Inheritance

Inherits controls how an override is initialized before its own fields are applied.

ValueModeBehavior
missingDefaultStarts from Settings::Defaults, meaning the root accurate-penetration.toml RaceConfig.
"default"DefaultSame as missing. This is the legacy and safest behavior.
""NoneStarts from a blank RaceConfig{}. Only fields provided by the override are populated.
"any"Any overlayDoes not become the base config. At runtime, matching fields are layered onto the next matching non-any base or onto defaults.
"some_file"NamedStarts from the resolved override in some_file.toml. The name is the lowercase file stem.
Named Bases

Named inheritance references a file stem, not a display name. If a file contains multiple [[Override]] entries, only the first one is addressable by that stem. Put reusable base configs in their own file.

Fallbacks

If a named base is missing, the override falls back to defaults. If a named base points at an any overlay, the loader uses a blank base and logs a warning. Cycles are detected and broken with a blank base.

Resolution

When the plugin needs a config for an actor, it walks matching overrides in priority order.

1

All overrides are sorted highest priority first.

2

Matching Inherits = "any" overrides are collected as overlays while scanning.

3

The first matching non-any override becomes the base. If no base matches, defaults are used.

4

Collected overlays are applied lowest priority first, so the highest priority overlay wins field conflicts.

Only overlays above the selected base are applied. A lower-priority overlay below the chosen base is not considered for that actor.

FormIDs

Race restrictions can be written as Races, Race, PenetratedRaces, or PenetratedRace. Each accepts either a string or an array of strings.

Races = [
    "Skyrim.esm|013745",       # plugin-local ID, recommended
    "Dawnguard.esm|00283A",
    "0x0200C5F0",              # full runtime FormID
]

With PluginName|LocalID, the loader resolves normal and light plugins through Skyrim's data handler. Without a plugin name, strings with seven or more hex characters are treated as full runtime FormIDs; shorter strings default to Skyrim.esm.

Predicates

Predicates can live directly on the override through race keys, or under a [Predicates] table. All predicates must pass.

PredicateTypeDescription
Races / Racestring or string[]Matches the actor's race FormID.
PenetratedRaces / PenetratedRacestring or string[]Alias for race matching, shared with sound effect config syntax.
IsSexint[]Matches actor sex. Skyrim values are 0 male and 1 female.
HasAllBonesstring[]Requires every listed skeleton node to exist on the actor's loaded 3D.
HasOneBonestring[]Requires at least one listed skeleton node to exist.
Races = ["Skyrim.esm|013745"]

[Predicates]
IsSex = [1]
HasAllBones = ["VaginaB1", "Clitoral1"]

[Vagina]
Scale = 2.0
Global Match

An override with no race keys and no [Predicates] entries matches every actor. That is useful for low-priority fallbacks and high-priority overlays, but it can hide more specific configs if the priority is wrong.

Scope

Use race keys for stable per-race configs, bone predicates for skeleton-family fallbacks, and any overlays for small cross-cutting changes.

# Skeleton-family fallback for actors with a known creature schlong chain
Inherits = "default"

[Predicates]
HasOneBone = ["CreaturePenis01", "MonsterSchlong01"]

[Penis]
Bones = ["CreaturePenis01", "CreaturePenis02", "CreaturePenis03"]

Orifice Positions

[Vagina.Position], [Anus.Position], and [Mouth.Position] share the same shape.

PropertyTypeDescription
AnchorstringSkeleton node used as the entry anchor.
Offsetfloat[3] or tableEntry offset from the anchor. Arrays use [x, y, z]; tables can use x, y, and z.
CollisionCylinderRadiusfloatWidth of the detection cylinder.
CollisionCylinderHeightModifierfloatHeight multiplier for the detection cylinder.
DepthOffsetfloat[3] or tableLegacy single internal waypoint used when DepthWaypoints is omitted.
DepthWaypointsarrayOrdered internal path points. Each point can be an array offset or a table with Anchor, Offset, and CornerSmoothing.
[Vagina.Position]
Anchor = "NPC Pelvis [Pelv]"
Offset = [0.0, -1.0, -4.32]
CollisionCylinderRadius = 1.2
CollisionCylinderHeightModifier = 1.0

[[Vagina.Position.DepthWaypoints]]
Offset = [0.0, 0.7, 6.0]
CornerSmoothing = 1.0

[[Vagina.Position.DepthWaypoints]]
Anchor = "NPC Spine1 [Spn1]"
Offset = [0.0, 6.0, 0.0]
CornerSmoothing = 0.5

Opening Physics

[Vagina] and [Anus] define opening bones and response strengths.

PropertyApplies ToDescription
NodeL, NodeR, NodeBack, NodeTopVaginaDirectional opening nodes.
NodeLB, NodeRB, NodeRT, NodeLTAnusCorner opening nodes.
ScaleBothBase opening distance.
ScaleMaxBothMaximum opening distance.
GripStrengthBothHow strongly the orifice follows penetrator movement.
RubIntensityBothStrength of rub/friction response.
GripClampForwardBothForward clamp for grip movement.
GripClampBackwardBothBackward clamp for grip movement.

Penis

[Penis] defines the penetrator chain, orientation, and solver-facing behavior.

PropertyTypeDescription
Bonesstring[]Ordered bone chain from base to tip.
LocalForwardAxisfloat[3]Forward axis for the penis bones. Also initializes BaseForwardAxis if that field is omitted.
BaseForwardAxisfloat[3]Separate forward axis for base projection and rotation.
BaseOffsetfloat[3]Offset used for base projection.
RotateBaseboolRotates the base bone with the rest of the chain.
PreserveHavokStateboolPreserves animated Havok bone spacing.
ClipFixboolApplies depth-based hiding/shrinking to reduce clipping.
HideDepthOffsetfloatDepth past the tunnel end before clip hiding starts.
ActivationRangefloatDistance from an orifice before tracking starts.
GirthfloatPenetrator girth used by physics, facial conditions, and sound predicates.
TipExtensionfloatVirtual extension beyond the last bone.
MinProjectionDistancefloatMinimum distance from base projection to the orifice path.
TogglePenisSMPPhysicsboolEnables the SMP schlong physics handling path for this config.

Animation

PropertyTypeDescription
SpeedSensitivityfloatMultiplier for animation-speed-driven response.
SmoothStrengthfloatSmoothing strength for speed calculations.
HipPhysicsboolEnables hip physics response.
HeadPhysicsboolEnables head physics response.
HipPhysicsSmoothTimefloatSmoothing time for hip response.
HeadPhysicsSmoothTimefloatSmoothing time for head response.

Hands

[Hands.Left] and [Hands.Right] use the same fields.

PropertyTypeDescription
EnabledboolEnables hand tracking for that side.
DetectionRadiusfloatDistance from the penetrator required to activate hand tracking. Code default is 10.0.
GripLengthfloatEffective grip length. Code default is 2.0.
GripOffsetAdjustmentfloat[3]Manual offset for grip positioning. Code default is [0, 0, 0].

Solver

[Solver] controls the bend cone used by the penis spline solver.

PropertyTypeDescription
BendConeBasefloatBase bend cone angle. Code default is 30.0.
BendConeRangefloatAdditional bend cone range. Code default is 40.0.

Facial Presets

RaceConfig includes the facial preset list. Because the list is part of the inherited config, a default-inheriting override keeps inherited presets and appends any [[FacialPreset]] entries it defines. Use Inherits = "" when you need a completely blank facial preset list.

In an array-style override, use [[Override.FacialPreset]] and [[Override.FacialPreset.Effects]]. See Facial Expressions for the full preset format.

Example: Named Base

80_canine_base.toml

This file defines a reusable canine chain. More specific race files can inherit it by file stem.

Inherits = "default"

[Penis]
Bones = ["CDPenis 1", "CDPenis 2", "CDPenis 3", "CDPenis 4"]
LocalForwardAxis = [1, 0, 0]
BaseOffset = [0, 0.5, 0]
PreserveHavokState = true
20_wolf_races.toml

This race-specific file inherits the base chain and only overrides matching plus a few size values.

Inherits = "80_canine_base"
Races = ["Skyrim.esm|0131E7", "Skyrim.esm|0131E9"]

[Penis]
Girth = 0.55
TipExtension = 0.25

Example: Any Overlay

This high-priority overlay applies a small adjustment to any matching female actor after the base config is selected.

Inherits = "any"

[Predicates]
IsSex = [1]

[Animation]
HeadPhysics = true
HeadPhysicsSmoothTime = 0.10

[Vagina]
GripStrength = 4.0

Debugging

Enable config logging while setting up inheritance chains and overlays.

[Debug]
Logging = true
Bones = true
Collision = true
Penis = true

The log reports override loading, inheritance warnings, cycles, missing named bases, and loaded override counts.