Use when writing, fixing, interpreting, converting, or auditing Open Animation Replacer or DAR animation conditions and priority configs.
Scanned 9/3/2026
Install to Claude Code
npx -y skills add ShugokiFable/Ultimate-AI-Starter-Bundle --skill oar-authoring --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Oar Authoring?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/shugokifable-oar-authoring-138ca4c1)More formats (shields.io, HTML) on the badges page.
---
name: oar-authoring
description: Use when writing, fixing, interpreting, converting, or auditing Open Animation Replacer or DAR animation conditions and priority configs.
---
# OAR Authoring
## What this skill does
Open Animation Replacer (OAR) replaces Skyrim animations **at runtime based on conditions**. An
animation mod ships one or more *replacer mods*, each holding *submods*; every submod is one
`config.json` with a `priority` integer, a set of `conditions`, and the `.hkx` files it can swap in.
When a base animation plays on an actor, OAR finds the highest-priority submod whose conditions are
true for that actor and plays its animation instead. OAR is the successor to Dynamic Animation
Replacer (DAR) and **reads DAR's legacy folders directly**, so a load order mixes both.
Authoring here means: writing or editing `config.json`/`user.json`, building condition sets, setting
priorities, overriding an existing mod's conditions via `user.json`, and reading legacy DAR
`_conditions.txt`. Interpreting means answering "what does this do", "which submod wins", or "why
isn't this animation playing".
The exhaustive lookup tables — full config schema, the ~120 built-in conditions, the authoritative
`IsEquippedType` enum, value-component shapes, the DAR grammar — live in
`references/oar-config-reference.md`. Pull a value from there; do not reconstruct it from memory or a
web search — a web search usually surfaces the vanilla `GetEquippedItemType` enum, which OAR's
`IsEquippedType` deliberately differs from.
## First step — orient before you touch a config
OAR is file-based, not record-based, so houseCARL's record tools don't see it. Work the files
directly (Read / Glob / Grep / Write), and reach for houseCARL only to **resolve the forms** a
condition needs.
1. **Locate the submod.** OAR configs live at
`…/meshes/actors/<project>/animations/OpenAnimationReplacer/<ModName>/<SubModName>/config.json`.
Legacy DAR lives under `…/animations/DynamicAnimationReplacer/…`. Glob for both.
2. **Read what's already there.** Read the submod `config.json` (and any `user.json` beside it —
`user.json` wins). Read the parent `<ModName>/config.json` for `conditionPresets`.
3. **Note required addons.** If a condition name isn't a built-in (check the roster in the
reference), it comes from an addon DLL (Math/RaySense/IED/Detection/Dialogue). Confirm that DLL is
installed, or the condition is dead.
4. **Resolve forms with houseCARL.** A condition that references a perk, keyword, race, faction, or
magic effect needs `{ "pluginName": …, "formID": <local hex> }` or `{ "editorID": … }`. Use
`housecarl_read_record` / `housecarl_cross_plugin_query` to get the defining plugin + local
FormID (strip the load-order byte) or the EditorID.
## The mental model — how OAR picks a winner
Internalize this before authoring; most "it doesn't work" reports trace back to it:
- Winners are decided **per original animation**, by sorting every targeting submod by `priority`
**descending**. **Plugin/ESP load order is ignored entirely.**
- At runtime OAR walks that sorted list and takes the **first submod whose `conditions` are true**.
If none pass, the base-game animation plays.
- **Higher priority wins.** Equal priorities are ambiguous (no tiebreak) — keep them unique. Authors
spread large integers (`9007010`, `83030317`) to slot cleanly between other mods.
So to make animation X beat animation Y, X's submod needs a **higher priority** *and* conditions
that pass in the situation you care about. Load order is never the lever.
## Authoring workflow
1. **Pick the target + project.** The submod's `.hkx` files must mirror the original animation's
path; that path-match is what binds the submod to a base animation. `<project>` is `character`
for humanoids. A submod with no `.hkx` is using `overrideAnimationsFolder` or is conditions-only
— that's normal.
2. **Choose a unique priority.** Higher beats lower. To override an existing mod, read its submod
priority and go above it.
3. **Build the condition set.** Each entry is `{ "condition": "<Name>", "requiredVersion": "1.0.0.0",
…params }`. Add `"negated": true` to invert. Combine with `AND` / `OR` / `XOR` — and note the
nested child array is capital-C **`Conditions`**, while the submod's top-level array is lowercase
**`conditions`**. Get param shapes (Form, Keyword, Numeric, Bool, Comparison, Multi) from the
reference. For weapon gating, use `IsEquippedType` with the authoritative enum (battleaxe = 6,
warhammer = 10 — they differ).
4. **Pick the file: `config.json` vs `user.json`.** If you're shipping/owning the mod, write
`config.json`. If you're **overriding someone else's mod without editing it**, write a
`user.json` beside their `config.json` — OAR uses `user.json` instead of `config.json` for that
submod (a full-document shadow, not a field merge, so include the *complete* config you want). In
a modlist, keep all `user.json` overrides in one dedicated MO2 mod that loads after the originals;
USVFS overlays them and they win, leaving originals untouched. (A modlist typically keeps these
in one dedicated overrides mod that loads after the originals.)
5. **Add variants / blend / loop behavior only if needed.** `replacementAnimDatas` drives random
variants (`weight`, `playOnce`, `variantMode`); `interruptible`, `replaceOnLoop` (default true),
and the `blendTime*` fields tune transitions. Prefer `replaceOnLoop` over the deprecated
`keepRandomResultsOnLoop`.
6. **If you used an addon condition, state the dependency.** `MathStatement` needs the Math plugin;
`IED_*` needs IED Conditions; raycast conditions need RaySense; etc. Without the DLL the line
becomes an INVALID no-op.
## Reading / interpreting an existing config
The inverse job — answer precisely, and say "I can't tell without X" rather than guess:
- **"What does this submod do?"** Translate each condition using the reference (resolve enum values
and `editorID`/FormID forms), then state the priority and what it competes against.
- **"Which submod wins?"** Compare priorities of every submod targeting that animation; the highest
with passing conditions wins. If you can't see all competing mods, say so.
- **"Why isn't it playing?"** Walk the checklist: is a higher-priority submod winning? Do the
conditions actually pass in that situation (weapon hand, enum value, missing perk)? Is a required
addon missing (condition shows INVALID)? Does the `.hkx` path mirror the original? Is `user.json`
shadowing the `config.json` you're reading? Is `disabled` set?
## Common mistakes
- **Lowercase `conditions` vs capital `Conditions`.** Submod top level is `conditions`; the child
array inside `AND`/`OR`/`XOR`/`PRESET`/`PLAYER`/`TARGET`/`MOUNT` is `Conditions`. Swapping them
yields an empty child set that silently passes/fails wrong.
- **Confusing OAR's `IsEquippedType` with the vanilla equipped-type enum.** Skyrim's vanilla
`GetEquippedItemType` (what most web searches surface) says 9=spell / 10=shield / 11=torch; OAR
deliberately differs — 9=crossbow, 10=warhammer, 11=shield, spells=12–16, torch=18. Use the
reference table, not the vanilla enum.
- **Battleaxe vs warhammer.** Both are engine `kTwoHandAxe`; OAR splits by keyword (6 vs 10). A
moveset meant for both must test `6` OR `10`.
- **Editing load order to fix a winner.** Pointless — OAR only reads `priority`. Change the integer.
- **Partial `user.json`.** It fully shadows `config.json`; a half-written `user.json` drops whatever
it omits. Write the complete config (or let the in-game editor generate it).
- **Using an addon condition without its DLL.** The line degrades to INVALID and never fires.
- **Assuming a no-`.hkx` submod is broken.** It's usually `overrideAnimationsFolder` or
conditions-only.
## Verification
- Re-scan: OAR parses configs on game load (and the in-game editor can reload a mod live).
- The editor's **Detected Problems** panel flags INVALID conditions (missing addon, bad form) and
duplicate priorities — the fastest correctness check.
- Confirm the winner by listing priorities of all submods that target the same original animation.
- Confirm any addon condition's DLL is present under `…/SKSE/Plugins/`.
## Real example — overriding a mod's conditions via `user.json`
You want a mod's archery moveset to apply only after the player earns a specific perk, without
editing the mod. The original `…/Bow Rapid Combo V3/Base/config.json` is `[IsActorBase player,
IsEquippedType 7 (bow)]` at priority `9901000`. Put a `user.json` at the matching submod path — in a
separate, dedicated overrides mod that loads after the original — copying that and **adds one
condition**:
```json
{ "priority": 9901000,
"conditions": [
{ "condition": "IsActorBase", "requiredVersion": "1.0.0.0",
"Actor base": { "pluginName": "Skyrim.esm", "formID": "7" } },
{ "condition": "IsEquippedType", "requiredVersion": "1.0.0.0",
"Type": { "value": 7.0 }, "Left hand": false },
{ "condition": "HasPerk", "requiredVersion": "1.0.0.0",
"Perk": { "pluginName": "<the perk-adding mod>.esp", "formID": "<local hex>" } } ] }
```
USVFS overlays the `user.json` beside the original `config.json`; OAR uses the `user.json` and the
moveset now only applies once the player has that perk. Resolve the `HasPerk` form (defining plugin +
local FormID) with houseCARL.
## Notes
- **DAR back-compat:** OAR converts legacy `_CustomConditions/<priority>/` (with `_conditions.txt`)
and `<Plugin.esp>/<FormID>/` actor folders into in-memory submods that compete in the same
priority space. The DAR grammar and the auto-synthesized `IsActorBase` form are in the reference.
- **The in-game editor is the live source of truth** for which conditions exist in a given install
(core + whatever addons are present) and writes valid `config.json`/`user.json` for you.
- **houseCARL can't introspect OAR configs** (it reads ESP records, not animation files) — read the
files directly; use houseCARL only to resolve the forms/keywords/perks a condition references.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!