Jump to content

About This File

AAF Informer is the F4SE plugin to simplify obtaining of AAF scenes information in Papyrus scripts.

 

 

AAF Informer consist of 3 parts:

 - AAFInformer.dll - F4SE plugin

 - AAFCollector.exe - service executable to parse AAF XML files

 - Info.pex/Info.psc - Papyrus script to access AAFInformer.dll API

 

How it works:

 

At the game start up AAFCollector.exe is started to parse AAF XML files. When it finishes all collected information memorised in F4SE plugin and later this information can be accessed via API calls from Papyrus script.

 

Following information is available:

 - For scenes (actually, positions in AAF terminology) that you can see in AAF UI - see SceneInfo structure in Info.psc

 - For scene participant(s) - see ActorInfo in Info.psc

 

Most information is obtained from tags defined by animation authors or by themes. Themes are essential to get information from AAF scenes. Without themes installed, most likely your script will not receive usefull information.

Tags that defines types of actors (like F_F or F_M) are ignored. Actor types retrieved from animation definitions.

Tags that defines furniture are ignored. Furniture information retrived from positionData XMLs

 

 

Note: animation author's XML files and themes XML files contains a lot of mistakes. Fixing them is out of scope of this tool, but I hope all mistakes will be elimenated sooner or later.

To simplify mistakes detection usefull logs could be found in %userprofile%\documents\My Games\Fallout4\F4SE\AAFInformer.log

Also this log contains error messages generated by AAFCollector.exe

 

 

Implementation details:

 

What tags are supported? All tags falls into several categories:

 

 

How values are applied to actors?

 

Spoiler

 

The tags systems to define actor's values like stimulation level or held level seems novice. So some assumptions are made to calculate final values for actors

Also tag system to define contact between actors is very scarce and much more assumptions are used.

Calculation details could be found in processor

 

 

Example of script

 

Spoiler

 

function PrintActorInfo(AAF:Info:ActorInfo ai)
    if !ai
        Debug.Notification("No actor info")
        return
    endif
    string report = "" + ai.Index + ". " + ai.Participant.GetDisplayName() + " (" + ai.Type +"): "
    if ai.IsAggressor
        report += "/Aggr"
    endif
    if ai.IsVictim
        report += "/Vict"
    endif

    if ai.IsHandGiver
        report += "/HG:" + ai.IsHandGiver
    endif
    if ai.IsHandTaker
        report += "/HT:" + ai.IsHandTaker
    endif
    if ai.IsLegGiver
        report += "/LG:" + ai.IsLegGiver
    endif
    if ai.IsLegTaker
        report += "/LT:" + ai.IsLegTaker
    endif
    if ai.IsOralGiver
        report += "/OG:" + ai.IsOralGiver
    endif
    if ai.IsOralTaker
        report += "/OT:" + ai.IsOralTaker
    endif
    if ai.IsGenitalTaker
        report += "/GT:" + ai.IsGenitalTaker
    endif
    if ai.IsGenitalGiver
        report += "/GG:" + ai.IsGenitalGiver
    endif

    if ai.IsAnalTaker
        report += "/AT:" + ai.IsAnalTaker
    endif
    if ai.IsButtTaker
        report += "/BT:" + ai.IsButtTaker
    endif
    if ai.IsNippleTaker
        report += "/NT:" + ai.IsNippleTaker
    endif
    if ai.IsOtherGiver
        report += "/OtG:" + ai.IsOtherGiver
    endif

    report += ", Held=" + ai.HeldLevel + ", Stim=" + ai.StimLevel + ", Love=" + ai.LoveLevel + ", Dom=" + ai.DomLevel
    Debug.Notification(report)
endfunction

function PrintActorsInfo(AAF:Info:ActorInfo[] ais)
    if !ais
        Debug.Notification("No data")
        return
    endif
    int i = 0
    while i < ais.Length
        PrintActorInfo(ais[i])
        i += 1
    endwhile
endfunction

function Report(var[] args)
    Actor[] actors = Utility.VarToVarArray(args[1]) as Actor[]
    AAF:Info:ActorInfo[] ais = new AAF:Info:ActorInfo[actors.Length]
    int i =0
    while i < ais.Length
        ais[i] = new AAF:Info:ActorInfo
        i += 1
    endwhile
    AAF:Info:SceneInfo s = AAF:Info.GetSceneAndActors(args[2] as string, actors, ais)
    Debug.Notification("[" + s.Name + "] by [" + s.Author + "] started! " + " Furn="+s.FurnGroup)
    PrintActorsInfo(ais)
endfunction

Event AAF:AAF_API.OnAnimationStart(AAF:AAF_API sender, var[] args)
    if args[0] as int == 0
        Report(args)
    else
        Debug.Notification("Failed to start AAF scene")
    endif
Endevent

Event AAF:AAF_API.OnAnimationChange(AAF:AAF_API sender, var[] args)
    if args[0] as int == 0
        Report(args)
    endif
Endevent

 

 

 

Known issues:

1. Some positions contains location attribute that has multiple furniture groups separated by comma. Such locations are handled, but I can't test it as such position does not appear AAF UI. Probably defining multiple furniture groups is invalid location definition, but without original AAF source code it hard to say definitely.

2. I had no chances to test AAF sex overriding with keywords. So not sure is it even working.

3. With current system of tags it is not possible to recognize how actors are contacted with each other, so all contacts for actors with index greater than 0 are applied to actor with index 0. So scenes like "BP70 Lesbian Threesome..." might have irrelevant contact information. See below.

 

 

Next steps:

- try to introduce new tags system to allow definition of actors contacts exacly. This plugin will be updated on succees.

- try to introduce new tags system to allow definition of Held/Love/Dom/Stim values for each actor. This plugin will be updated on succees.

- try to introduce new tags system to allow definition of actor position for actors with index greater than 0. This plugin will be updated on succees.

 

 

New system to define contacts beween actors in scenes.

Spoiler

It is a problem to understand how actors are contacted in scene when tag for it is defined like HandToMouth or PenisToEither in case where more than 2 actors participate in scene.

 

To solve this problem new format of contacts definitions is introduced. The base is same, as introduced in AAF Themes, but extra data is necessary to difine actors that related to the contact definition.

 

An example of tag: PenisToEither:1-0

1-0 is the definition of contact direction. From actor with index 1 to actor with index 0. So actor 1 uses Penis to contact with actor 0, and actor 0 is contacted by Either (Genital+Anal)

This tag works exactly as PenisToEither when 2 actors are defined for scene where actor 0 is receiver, and actor 1 is giver. But it can be used for scenes with more than 2 actors.

 

More complex example: 

<tag position="BP70 Lesbian Threesome 6" animation="rxl_bp70_lesbianthreesome06" tags="BP70,F_F_F,NoFurn,Cunnilingus,FromFront,Neutral,Climax,Held1,Love5,Stim3,Dom3,MouthToVagina:1-0,MouthToVagina:2-1,MouthToVagina:0-2"/>


3 tags defines 3 contacts between 3 actors - MouthToVagina:1-0,MouthToVagina:2-1,MouthToVagina:0-2

In this case it is not a problem to understand how actors contacted with other.

 

Additional benefit- tags like TongueToAnus can be correctly supported.

Usually, actor 0 is the victim in agressive scenes. And tags like PenisToAnus should means that agreessor (actor 1) uses Penis, and victim (actor 0) - Anus. I.e. direction is defined from agressor to victim. And this is ok for most of contacts definitions. But for TongueToAnus direction should be defined from victim to agressor. It can be solved by changing order of actors in scene definition, but this will mean that actor 0 should not be treated as victim.

New system allows to define correct direction by TongueToAnus:0-1. I.e, from actor 0 (victim, Tongue) to actor 1 (agressor, Anus) but keep actor 0 as a victim without scenes alteration.

 

Also, it is not a problem to define contact from actor to the same actor. Like HandToStick:0-0 or HandToFeet:5-5

 

 

 

Sample file with contacts that handles tentacles made by Snapdragon_

 

Feel free to request new features.

 

 

 

Edited by Dlinny_Lag


What's New in Version 0.8.0

Released

Added Anniversary Update patch (1.11.159)

Added Anniversary Update patch (1.11.169)

Added Anniversary Update patch (1.11.191)

 

Fixed XML syntax errors handling. Prevent 0xC00000FD error



×
×
  • Create New...