Skip to content
Back to skills

Oar Authoring

ASecurity

Use when writing, fixing, interpreting, converting, or auditing Open Animation Replacer or DAR animation conditions and priority configs.

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 3, 2026
ai-agentsgoapi

Works with

  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 3, 2026

npx -y skills add ShugokiFable/Ultimate-AI-Starter-Bundle --skill oar-authoring --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Oar Authoring?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Oar Authoring
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/shugokifable-oar-authoring/badge)](https://www.skillsdirectory.com/skills/shugokifable-oar-authoring)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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.

Files in this skill

  • SKILL.md10 KB
  • references/index.jsonl4.2 KB
  • references/oar-config-reference.md22.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…