Animation General Information - IHateMyKite/UnforgivingDevices GitHub Wiki

Made by iiw2012. Copied from https://github.com/iiw2012/UDAnimationsSE/wiki

General Information

  1. Animation files:
    1. Can be made specifically to use in UD situations (struggle or horny/orgasm animations).
    2. Or it could be animations from existing animation packs (eg SLAL Animation Packs). In that case they do not need to be included in the project as long as SLAL Pack is active.
  2. FNIS benaviour file(s), which is created from existing animation files using FNIS Tools For Modders (SE and LE versions). If animation are from SLAL pack then behavior file was already generated.
  3. JSON file(s) with animation definitions to use with UD.

JSON File Format

JSON files define the conditions by which the appropriate animation is selected for a particular situation for actors with certain restrictions. These files must be saved in UTF-8 w/o BOM and placed in <DATA>\SKSE\Plugins\StorageUtilData\UD\Animations\ folder.

Example

{
     "conditions": {                                                     Conditions that determine whether the file should be used
         "mod": "<mod name>",                                            To check if game has loaded mod
         "json": "<path to json file>"                                   To check if game folder has specified json file. Path should be relative to "SKSE\Plugins\StorageUtilData" folder
     },
     "paired": {                                                         Animation type
         "zad_DeviousArmCuffs" : [                                       Animation keyword (device keyword or any other string like "horny" to define animation)
             {
                 "A1" : {
                     "anim" : "<animation event>",                       Animation event
                     "req" : 0,                                          Required constraints for the first actor (animation shouldn't be picked if actor doesn't have all required constraints)
                     "opt" : 0                                           Optional constraints for the first actor (animation shouldn't be picked if actor has constraints not defined by this bit-mask)
                 },
                 "A2" : [                                                Array with variants
                     {
                         "anim" : "<animation event variant 1>",        Variant for specified actor's constraints
                         "req" : 256,                                   Required constraints for the second actor (animation shouldn't be picked if actor doesn't have all required constraints)
                         "opt" : 0                                      Optional constraints for the second actor (animation shouldn't be picked if actor has constraints not defined by this bit-mask)
                    },
                     {
                         "anim" : "<animation event variant 2>",        Variant for specified actor's constraints
                         "req" : 512,                                   Required constraints for the second actor (animation shouldn't be picked if actor doesn't have all required constraints)
                         "opt" : 0                                      Optional constraints for the second actor (animation shouldn't be picked if actor has constraints not defined by this bit-mask)
                     }
                 ],
                 "lewd" : 0,                                             Rate of lewdiness
                 "aggr" : 1                                             Rate of aggressiveness (from akHelper towards akActor). Could be negative
             },
             ...
         ], 
         ...
     }
 }

Descriptions of Objects

Object path Type Description
conditions Object Conditions that determine whether the file should be used
conditions.mod String To check if game has loaded mod
conditions.json String To check if game folder has specified json file. Path should be relative to SKSE\Plugins\StorageUtilData folder. For example ..\..\..\SLAnims\json\Babo Human.json
solo Object Object name defines the type of the containing animations: solo or paired or something else
solo.<zad_DD> Object[] Array with definitions of struggle animations for specified device. Its name should be the same as for the in-game keyword: zad_DeviousBoots, zad_DeviousArmbinder, etc.
solo.<zad_DD>[].A1 Object Section with the animation for the actor. See paired.<zad_DD>[].A1[] for reference
solo.horny Object[] Array with definitions of horny animations used by UD and DD in suitable situations
solo.horny.<...>   See paired.<zad_DD> for reference.
solo.edged Object[] Array with definitions of edged animations used by UD and DD in suitable situations
solo.edged.<...>   See paired.<zad_DD> for reference.
solo.orgasm Object[] Array with definitions of orgasm animations used by UD and DD in suitable situations
solo.orgasm.<...>   See paired.<zad_DD> for reference.
solo.spectator Object[] Array with definitions of spectator animations used by UD for helper when there no suitable pair animation was found
solo.spectator.<...>   See paired.<zad_DD> for reference.
paired Object Object name defines the type of the containing animations: solo or paired or something else
paired.<zad_DD> Object[] Array with struggle animations for specified device. Its name should be the same as for the in-game keyword: zad_DeviousBoots, zad_DeviousArmbinder, etc.
paired.<zad_DD>[].A1 Object or Object[] Section with the animation variant(s) for the first actor (the actor trying to struggle out the specified device). There can be either a single variant or an array of options that differ by actor's constraints.
paired.<zad_DD>[].A1[].anim String or String[] Animation event which is registered for the actor in this slot with specified constaints. If there is an array then it is interpreted as animation sequence. Animation sequence is played almost instantly down to the last element which stays in the loop
paired.<zad_DD>[].A1[].req Integer Required constraints for the actor in this slot (animation shouldn't be picked if actor doesn't have all required constraints). Constraints are encoded with a bitmask.
paired.<zad_DD>[].A1[].opt Integer Optional constraints for the actor in this slot (animation shouldn't be picked if actor has constraints that is not defined by specified bitmask)
paired.<zad_DD>[].A2 Object or Object[] Section with the animation variant(s) for the second actor (the actor helping the first actor to struggle the specified device). See paired.<zad_DeviousDevice>[].A1 for reference. If it is in the solo object then anything beyond A1 is ignored.
paired.<zad_DD>[].<...>   See paired.<zad_DD>[].A1 for reference.
paired.<zad_DD>[].lewd Integer Rate of lewdiness. Currently not in use.
paired.<zad_DD>[].aggr Integer Rate of aggressiveness (from the second actor towards the first). Could be negative. Currently not in use.

Using VBA to generate JSON

Due to the cumbersome file syntax, it is difficult to format them manually. To facilitate this task, an Excel file has been created with VBA functions that export a table content to JSON (see https://github.com/iiw2012/UDAnimationsSE/blob/main/docs/UD_Anim_Custom.xls or https://github.com/IHateMyKite/UnforgivingDevices/blob/main/docs/UD%20Paired%20Struggle.xls).

Brief examples how to use it see there: https://github.com/IHateMyKite/UnforgivingDevices/wiki/Using-Excel-VBA-to-generate-animation-files

Animation Naming Convention

<mod>_<global_type>_<animation_type>_<animation_name>_[[V<variant_num>]_A<actor_num>[<actor_pose>]][_<actor_constraints>]

global_type

  • Solo
  • Pair

animation_type

  • Struggle
  • Horny
  • Orgasm
  • Edge

animation_name

Any string to describe/define animation

variant_num

Any number

Animation with the same variant number with given name and different actor should be pairwise compatible.

actor_pose

Modification of the actor's pose. For example, actor could place hands on hips or chest of its partner while the whole motion are the same.

actor_constraints

Should contain letters:

  • A - Armbinder (Straitjacket)
  • B - BB Yoke
  • E - Elbowbinder
  • F - Front Cuffs
  • P - Petsuit
  • T - Elbow Tie
  • Y - Yoke
  • H - Hobble Skirt

Since straitjackets replace arms on model it's ok to use armbinder animation variant with them.

Examples

UD_Solo_Struggle_Hobble01_AH

UD_Pair_Struggle_Armb02_V2_A1_T

⚠️ **GitHub.com Fallback** ⚠️