Introduction
This page is intended to provide some general guidelines for animators who want to create animations for Sexout, as well as how to create a plugin to add those animations to the Sexout "random picker". It is not a tutorial on how to use 3DSMAX, Blender, Nifskope, or any other animation utilities.
General guidelines
For the most part, you can create the animations however you wish. You can use any tools or utilities you like, and as long as the FONV game engine can play the animation, you're good to go. There are a few things to be aware of however, especially if you desire your animations be included directly in Sexout rather than creating your own plugin using the registry API.
- Do not overwrite any Sexout files, including any animations.
- Do not modify any records in the Sexout ESM.
- Test your animations in the game before sending them to me or releasing them.
Positioning and orientation
Sexout expects all animation files to run "in place". When an animation is played on an actor, that actor should play the animation exactly where they are. Their X/Y position should not change. Before an animation is played, sexout moves the actors to the same X/Y/Z coordinates and then turns actorB to face actorA. If actorC is present, they are turned to face the same direction as actorB. A simple diagram may help explain this. The actors are oriented as follows, the arrow indicating the direction they are facing.
A> <B <C
Your animation should only rotate an actor if the orientation is different from the above. For example, an A+B doggystyle animation should rotate either A or B 180 degrees.
Sexout also expects that the animations are correctly aligned when they are run together, with the above positioning, on flat terrain. If they are not properly aligned this must be fixed in the export, or in the registration plugin -- I am done testing and adjusting offsets for animations included within Sexout.
Looping
Make sure that the required loop TXT records are present in the KF. Sexout attempts to restart animations that stop because they are not set to loop, but this is jerky and results in them getting out of sync. There are two TXT keys that must be present and two that are optional.
Required:
- Name (string) Must start with "Specialidle" but can be suffixed, e.g. "Specialidle_myidle01".
- Start (float) the time index the animation starts at, in seconds. Usually 0.
- End (float) the time index the animation ends at, in seconds.
Optional:
- Startloop (float) the time index that the looping section starts at, in seconds.
- Endloop (float) The time index that the looping section ends at, in seconds.
If startloop/endloop are not present, the animation will loop from start to end. If they are present, then the engine will play from Start to Endloop, looping until the animation is stopped, and then play all the way to Endloop once. In this way the sequence between Start and Startloop can be considered an Intro, while the sequence between Endloop and End can be considered an Outro.
Ensure that the controller sequence cycle type is CYCLE_LOOP.
The sexout registry API
Adding these animations can be done one of two ways. The first method is the historical one -- once you have created and tested your animation and are satisfied that it works, simply send me the KF file or files. I will test them myself and if everything checks out, I will assign them a new number and include them in sexout. Note that I am very picky about the technical details. If your animation isn't aligned properly, doesn't loop properly, messes up bone scales, or anything along those lines I'll tell you to fix it and try again. I will not criticize the appearance as long as the actors are not severely contorted, but I will not include new animations that require alignment fixes or anything of that nature.
The second method is not subject to those restrictions, and is also easier on us both and the end users if you are going to create many animations. In this method, you must also use the GECK to create a plugin file that has Sexout.esm as a master. Within this plugin at a bare minimum you need to create:
- A top level idle animation group to hold your animations.
- A quest that is enabled in new games.
- A quest script to register your animations with Sexout every time a game is started or loaded, and provides a string variable that your Idle group will check.
Script
Create a new "quest" script that runs its main block once every time a game is started OR loaded. Inside that main block, register your animations via the fnSexoutAddAnim UDF. This UDF takes a single stringmap argument and does not return anything. The argument it takes is formatted as in this example:
array_var animDef
array_var actors
array_var flags
Begin Function{}
let actors := ar_List "male" "both"
let flags := ar_List "doggy" "vaginal" "anal" "stand"
let adj := ar_Map "ZRotB"::180
let animDef := ar_Map "idx"::715 "idle"::"SNG715" "desc"::"Standing rear entry 2" "actors"::actors "flags"::flags "adj"::adj
call fnSexoutAddAnim animDef
; Cleanup
let actors := ar_Null
let flags := ar_Null
let animDef := ar_Null
End
actors is a simple list of actor type for each actor in the animation, in the order A, B, C. The actor type can be male for male humans (or females with a strapon) in that position, female for females only, or both for both. In most cases you will want to use both instead of female since animations are shared for both vaginal and anal sex. Only use female if the actor is rubbing herself, fondling breasts, etc.
flags is a list of strings of all the flags that apply to the animation. Sexout uses these in the random picker, and other plugins use them to filter or search. Look in the various fnSexoutAddInternalAnimsX scripts for examples.
adj is an optional stringmap holding required offsets for animations that aren't aligned correctly by default. The valid keys follow the pattern (H,V)Offset(A,B,C) for Horizontal or Vertical offsets for A, B, or C, and ZRot(A,B,C) for rotation on the Z (vertical) axis.
animDef is the actual array being passed in to the sexout UDF. It has references to the previous two arrays, as well as some simple keys of its own.
-
idxis the animation number. You can use any numbers you like in your plugin. -
idleis the actual name of the IDLE within the GECK. Sexout will eventually use this when it moves to Playidle from Pickidle. -
descis a human friendly description that will be presented in the Sexout MCM menu for enabling/disabling animations.
This quest must also provide a string variable that contains the sexout animation prefix along with the name of your mod. It should be set to this:
Sexout:Conditions:Animate:YOURMOD.ESP
Replace "YOURMOD.ESP" with your actual plugin filename of course.
This string var is the one you must check in the condition check described in the Idle group section below.
Quest
Create a new quest, check off "start game enabled", and select the script you created in the script dropdown.
Idle group
- Create a new idle group directly under Characters_Male\IdleAnims and name it something similar to your mod/plugin name.
- Save immediately, quit the geck, and open your plugin in FNVEdit, and follow the instructions here: http://www.loverslab.com/topic/16277-sexoutng-framework-installation-guide-for-beginners/#entry365615
- Save and reopen your plugin in the GECK. In the idle group set the following conditions on the subject
- NX_GetQVEVFl Quest:YOURQUEST, (YOURSTRINGVAR) == 1
- NX_GetQVEVFl Quest: SexoutNGNXCQ, 2 >= 1
From here you simply need to add all of your idle animations to the GECK, inside the group that you've created. Look at the Sexout IDLEs for examples. There are two more conditions you will want to check at various points, similar to the two above.
- NX_GetQVEVFl Quest: "SexoutNGNXCQ, 2" -- This is the animation number, such as 603.
- NX_GetQVEVFl Quest: "SexoutNGNXCQ, 3" -- This is the animation position for the actor. 1 == A, 2 == B, 3 == C.