Skyrim Special Edition

File information

Last updated

Original upload

Created by

SARDONYX

Uploaded by

SARDONYX7

Virus scan

Safe to use

Tags for this mod

About this mod

Cross-platform application to convert DynamicAnimationReplacer to OpenAnimationReplacer (GUI & CLI)

Made with Rust and TypeScript.

Permissions and credits
Mirrors
Changelogs
Why did we make this?
  • There was already a converter(DAR to OAR Converter(C#)), but it didn't automatically change the priority directory name, so I made my own.
  • I wanted to analyze the syntax of DAR in detail before changing to OAR.(Source code for the defined DAR syntax)
  • Rust is easy to write unit tests for, and as fast as C, C++ (Disk I/O and serialization are handled in concurrent processing using tokio's M:N model(model image), which uses the CPU efficiently.).
  • I wanted to change the background with CSS.(To me this is important.)


I didn't mention it before, but dar2oar actually fixes the following bugs that occurred in the C# version.

  • PluginValue(In CompareValues) is not enclosed in "Form" (this is an error but a potential error that is not displayed in the OAR GUI v2.1.0)
    This error occurred up to `DAR to OAR converter v1.0.8` (original C# ver.) and earlier versions. dar2oar used to have this bug, but thanks to a bug reporter, it has been fixed in v0.1.6 (See the second from the earliest page of the post).Unless the original converter is fixed, it is better to use this application.This bug is easily seen when converting `EVG Conditional Idles` and others.
  • Parsing error for countries with commas in decimal places (This error does not occur in Rust. Always use `. `)
  • Nested directory error (support for directories after numbers like male, female, etc.)
NOTE
  • I am not fluent in English so this is a machine translation.
  • I didn't sign the binaries(This is a rather common story. Same as rustup rustup-init.exe needs to be code-signed),
  • I didn't create the icons yet.
  • Only the `custom conditions` pattern is supported now, not the DAR for the `ActorBase` pattern. (It may be possible to change the behavior of "dar2oar_core::path_chagner.rs", but I haven't seen it except for `LokiPose`, so I haven't started it yet)  => Supported since v0.7.0
  • Rejection of ambiguous constructions
    This converter will error if you omit AND or OR. This is because dar2oar don't know whether the mod author is intended to be an `OR` or an `AND`.
- actual

    IsFemale()
    IsCombat()
- expected pattern1(If the mod author intended to AND)

    IsFemale() AND
    IsCombat()
- expected pattern2(If the mod author intended to OR)

    IsFemale() OR
    IsCombat()

  • The following syntax is not present in the DAR documentation, but is supported by dar2oar for flexibility.

They are used without ().
- actual

    IsCombat
- expected(automatically parsed by dar2oar)

    IsCombat()

Tailing AND or OR
- actual

    IsFemale() OR
    IsCombat() OR

Line comment(`;`)
- actual

    IsCombat() AND
    ; This is DAR line comment
    IsFemale()
Getting Started for User
GUI
  • Download the latest binary from Nexus  or  GitHub
  • Click g_dar2oar.exe

CLI (For example, if you want to list multiple mods using PowerShell commands and convert them automatically in the CLI)
  • Download the latest binary from GitHub
  • Use Command
  • Example
        ./dar2oar convert --src "./data/Smooth Moveset" --mapping-file "./settings/mapping_table.txt"
       
See Examples

There are a certain number of people who want to do batch processing with GUI, but there are mods that are impossible to revert when converted to OAR (mods that mix OAR and DAR), and it must have the flexibility to exclude such mods, hence the CLI, which can be accomplished by invoking the CLI with PowrShell or Python.

The CLI is also more convenient for automatic application of mapping tables. For example, the directory name and the file name of the mapping table can be the same, and variables in the for loop during directory search can be passed directly as command arguments during conversion.

Yes, but this is a slow conversion, since calling a sys_fork equivalent system call in a loop to create a process is to create a new memory space.
If speed is not acceptable, there is a way to statically link the dar2oar_core library itself.
This application is completely separate from the core, CLI, and GUI, and is designed with the intention that it can be imported into your own exe at any time.
See this document

What is the mapping file?

DAR priority folder name => A specific name

1. If a mapping file is passed

  • mapping_table.txt(Sample)

8000000  Combat
8000001
8000002
// This is a line comment. It is ignored until a line break comes, so you can freely write notes.
8000005
8000005  Female
8001000
8001000  Unarmed
8001010
8001010  Sword
// More to follow below...

2. It is interpreted as follows
(As you can see, if there is no corresponding priority folder name, a sequential number will be added at the end.)

8000000  Combat
8000001  Combat_1
8000002  Combat_2
8000005  Female
8001000  Unarmed
8001010  Sword
// More to follow below...


3.1 Convert Result(Mapping table specified)

Smooth Moveset
    ├─1hm
    ├─2hm
    ├─Axe
    │  └─XPMSE
    ├─Axe+Shield
    │  └─XPMSE
    ├─Axe,
    ├─Base
    ├─Claw
    │  └─XPMSE
    ├─Claw+shield
    │  └─XPMSE
    ├─Dagger
    │  └─XPMSE
    ├─Dagger+Shield
    │  └─XPMSE
    ├─Dual
    │  └─XPMSE
    ├─Dual_1
    │  └─XPMSE
    ├─Dual_2
    ├─Female
    ├─Giant
    ├─Giant_1
    ├─Halberd
    ├─Hammer,
    ├─Javelin
    ├─Javelin+Shield
    ├─Katana
    │  └─XPMSE
    ├─LargeShield
    ├─Mace
    │  └─XPMSE
    ├─Mace+Shield
    │  └─XPMSE
    ├─Non_1
    ├─Non_2
    ├─Pike
    ├─Pike,
    ├─Pike,_1
    ├─Pike_1
    ├─QuarterStaff
    ├─QuarterStaff_1
    ├─Rapier
    │  └─XPMSE
    ├─Rapier+shield
    │  └─XPMSE
    ├─Scythe
    ├─Spear
    ├─Spear+Shield
    │  └─XPMSE
    ├─Spear+Shield_1
    ├─Sword
    │  └─XPMSE
    ├─Sword+Shield
    │  └─XPMSE
    ├─Sword+Shield_1
    │  └─XPMSE
    ├─Sword+Shield_2
    ├─Sword_1
    │  └─XPMSE
    ├─Sword_2
    ├─Unarmed
    ├─Unarmed_1
    │  └─XPMSE
    └─Unarmed_2



3.2 Convert Result(Mapping table isn't specified) => The name of the priority folder is used.
    
  Smooth Moveset
    ├─8000001
    ├─8000005
    ├─8001000
    ├─8001010
    │  └─XPMSE
    ├─8001020
    │  └─XPMSE
    ├─8001040
    │  └─XPMSE
    ├─8001041
    ├─8001050
    │  └─XPMSE
    ├─8001055
    │  └─XPMSE
    ├─8001060
    ..........
    ├─8003010
    │  └─XPMSE
    └─8213000

For Developer
Requirements

Build commands
GUI 
npm run dev              # Development mode
npm run build            # Release (See target directory)

CLI
cargo run                   # Development mode
cargo build --release # Release (See target directory)

Future Plans
GUI
  • Clear all field inputs at once button -> Implemented in v0.1.3
  • For user custom JavaScript -> Implemented in v0.1.5
  • Parallel directory walk with native threads(I honestly don't know how to write this. It would be nice if I could.) -> Implemented in v0.1.3
  • progress bar(I have written periodic execution code using async and mpsc channel in Rust, but I have never written code to do periodic IPC on the frontend, so this is only ideal) -> Implemented in v0.2.0

Core
  • Bulk Move Backup of DAR Folders -> Implement in v0.1.5
    (Zip compression is too costly, so instead I used MO2's functionality to hide it by adding mohidden with rename)
Acknowledgements & Credits

    I could not have made this Rust converter without the source of the C# application and the bug report from POST.

    Thank you.

  • MIT OR Apache-2.0 Copyright (c) 2023 SARDONYX License
  • Original Application: MIT License Copyright (c) 2023 Allison Payne MIT License