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.
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
| Property | Type | Description |
|---|---|---|
| HookPosition | int | Selects the update hook position used by the plugin. |
| HandleOpeningPhysics | bool | Enables or disables visual opening physics. |
| FutasUseAnus | bool | Routes futa penetrated actors to anal handling when applicable. |
| IgnoredSceneActorCount | int | Scene actor count limit used when deciding whether to ignore a scene. |
| IgnoreMaleActors | bool | Skips male penetrated actors for orifice handling. |
| EnableExpressionSystem | bool | Enables the facial preset system. |
| FreecamAudioFix | bool | Applies the free camera audio behavior fix. |
| UseSkyrimUI | bool | Uses Skyrim UI integration where supported by the menu code. |
Hotkeys and Debug
| Property | Section | Description |
|---|---|---|
| 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.
| Value | Mode | Behavior |
|---|---|---|
| missing | Default | Starts from Settings::Defaults, meaning the root accurate-penetration.toml RaceConfig. |
| "default" | Default | Same as missing. This is the legacy and safest behavior. |
| "" | None | Starts from a blank RaceConfig{}. Only fields provided by the override are populated. |
| "any" | Any overlay | Does not become the base config. At runtime, matching fields are layered onto the next matching non-any base or onto defaults. |
| "some_file" | Named | Starts from the resolved override in some_file.toml. The name is the lowercase file stem. |
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.
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.
All overrides are sorted highest priority first.
Matching Inherits = "any" overrides are collected as overlays while scanning.
The first matching non-any override becomes the base. If no base matches, defaults are used.
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.
| Predicate | Type | Description |
|---|---|---|
| Races / Race | string or string[] | Matches the actor's race FormID. |
| PenetratedRaces / PenetratedRace | string or string[] | Alias for race matching, shared with sound effect config syntax. |
| IsSex | int[] | Matches actor sex. Skyrim values are 0 male and 1 female. |
| HasAllBones | string[] | Requires every listed skeleton node to exist on the actor's loaded 3D. |
| HasOneBone | string[] | Requires at least one listed skeleton node to exist. |
Races = ["Skyrim.esm|013745"] [Predicates] IsSex = [1] HasAllBones = ["VaginaB1", "Clitoral1"] [Vagina] Scale = 2.0
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.
| Property | Type | Description |
|---|---|---|
| Anchor | string | Skeleton node used as the entry anchor. |
| Offset | float[3] or table | Entry offset from the anchor. Arrays use [x, y, z]; tables can use x, y, and z. |
| CollisionCylinderRadius | float | Width of the detection cylinder. |
| CollisionCylinderHeightModifier | float | Height multiplier for the detection cylinder. |
| DepthOffset | float[3] or table | Legacy single internal waypoint used when DepthWaypoints is omitted. |
| DepthWaypoints | array | Ordered 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.
| Property | Applies To | Description |
|---|---|---|
| NodeL, NodeR, NodeBack, NodeTop | Vagina | Directional opening nodes. |
| NodeLB, NodeRB, NodeRT, NodeLT | Anus | Corner opening nodes. |
| Scale | Both | Base opening distance. |
| ScaleMax | Both | Maximum opening distance. |
| GripStrength | Both | How strongly the orifice follows penetrator movement. |
| RubIntensity | Both | Strength of rub/friction response. |
| GripClampForward | Both | Forward clamp for grip movement. |
| GripClampBackward | Both | Backward clamp for grip movement. |
Penis
[Penis] defines the penetrator chain, orientation, and solver-facing behavior.
| Property | Type | Description |
|---|---|---|
| Bones | string[] | Ordered bone chain from base to tip. |
| LocalForwardAxis | float[3] | Forward axis for the penis bones. Also initializes BaseForwardAxis if that field is omitted. |
| BaseForwardAxis | float[3] | Separate forward axis for base projection and rotation. |
| BaseOffset | float[3] | Offset used for base projection. |
| RotateBase | bool | Rotates the base bone with the rest of the chain. |
| PreserveHavokState | bool | Preserves animated Havok bone spacing. |
| ClipFix | bool | Applies depth-based hiding/shrinking to reduce clipping. |
| HideDepthOffset | float | Depth past the tunnel end before clip hiding starts. |
| ActivationRange | float | Distance from an orifice before tracking starts. |
| Girth | float | Penetrator girth used by physics, facial conditions, and sound predicates. |
| TipExtension | float | Virtual extension beyond the last bone. |
| MinProjectionDistance | float | Minimum distance from base projection to the orifice path. |
| TogglePenisSMPPhysics | bool | Enables the SMP schlong physics handling path for this config. |
Animation
| Property | Type | Description |
|---|---|---|
| SpeedSensitivity | float | Multiplier for animation-speed-driven response. |
| SmoothStrength | float | Smoothing strength for speed calculations. |
| HipPhysics | bool | Enables hip physics response. |
| HeadPhysics | bool | Enables head physics response. |
| HipPhysicsSmoothTime | float | Smoothing time for hip response. |
| HeadPhysicsSmoothTime | float | Smoothing time for head response. |
Hands
[Hands.Left] and [Hands.Right] use the same fields.
| Property | Type | Description |
|---|---|---|
| Enabled | bool | Enables hand tracking for that side. |
| DetectionRadius | float | Distance from the penetrator required to activate hand tracking. Code default is 10.0. |
| GripLength | float | Effective grip length. Code default is 2.0. |
| GripOffsetAdjustment | float[3] | Manual offset for grip positioning. Code default is [0, 0, 0]. |
Solver
[Solver] controls the bend cone used by the penis spline solver.
| Property | Type | Description |
|---|---|---|
| BendConeBase | float | Base bend cone angle. Code default is 30.0. |
| BendConeRange | float | Additional 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
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
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.