Compare commits
3 Commits
db4c2d3833
...
fd77f303c7
Author | SHA1 | Date |
---|---|---|
c0ffee | fd77f303c7 | |
c0ffee | fbf8b3444d | |
c0ffee | 43843a398f |
Binary file not shown.
Binary file not shown.
|
@ -2,7 +2,7 @@
|
||||||
<Defs>
|
<Defs>
|
||||||
<AnimationDef>
|
<AnimationDef>
|
||||||
<defName>TestAnimation2</defName>
|
<defName>TestAnimation2</defName>
|
||||||
<durationTicks>200</durationTicks>
|
<durationTicks>50</durationTicks>
|
||||||
<startOnRandomTick>False</startOnRandomTick>
|
<startOnRandomTick>False</startOnRandomTick>
|
||||||
<playWhenDowned>False</playWhenDowned>
|
<playWhenDowned>False</playWhenDowned>
|
||||||
|
|
||||||
|
@ -13,27 +13,27 @@
|
||||||
<workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
|
<workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
|
||||||
<keyframes>
|
<keyframes>
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
<offset>(0, -1, 0)</offset>
|
<offset>(1, -1, 0)</offset>
|
||||||
<tick>0</tick>
|
<tick>0</tick>
|
||||||
<angle>23</angle>
|
<angle>0</angle>
|
||||||
<rotation>North</rotation>
|
<rotation>North</rotation>
|
||||||
</li>
|
</li>
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
<offset>(0, -1, 0)</offset>
|
<offset>(0, -1, 0)</offset>
|
||||||
<tick>6</tick>
|
<tick>20</tick>
|
||||||
<angle>-5</angle>
|
<angle>0</angle>
|
||||||
|
<rotation>North</rotation>
|
||||||
|
</li>
|
||||||
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
|
<offset>(-1, -1, 0)</offset>
|
||||||
|
<tick>30</tick>
|
||||||
|
<angle>0</angle>
|
||||||
<rotation>North</rotation>
|
<rotation>North</rotation>
|
||||||
</li>
|
</li>
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
<offset>(0, -1, 0)</offset>
|
<offset>(0, -1, 0)</offset>
|
||||||
<tick>12</tick>
|
<tick>40</tick>
|
||||||
<angle>4</angle>
|
<angle>0</angle>
|
||||||
<rotation>North</rotation>
|
|
||||||
</li>
|
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
|
||||||
<offset>(0, -1, 0)</offset>
|
|
||||||
<tick>188</tick>
|
|
||||||
<angle>-1</angle>
|
|
||||||
<rotation>North</rotation>
|
<rotation>North</rotation>
|
||||||
</li>
|
</li>
|
||||||
</keyframes>
|
</keyframes>
|
||||||
|
@ -51,16 +51,16 @@
|
||||||
</li>
|
</li>
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
<tick>6</tick>
|
<tick>6</tick>
|
||||||
<angle>-5</angle>
|
<angle>0</angle>
|
||||||
<rotation>North</rotation>
|
<rotation>North</rotation>
|
||||||
</li>
|
</li>
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
<tick>12</tick>
|
<tick>12</tick>
|
||||||
<angle>4</angle>
|
<angle>0</angle>
|
||||||
<rotation>North</rotation>
|
<rotation>North</rotation>
|
||||||
</li>
|
</li>
|
||||||
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
<li Class="Rimworld_Animations.ExtendedKeyframe">
|
||||||
<tick>128</tick>
|
<tick>18</tick>
|
||||||
<angle>0</angle>
|
<angle>0</angle>
|
||||||
<rotation>North</rotation>
|
<rotation>North</rotation>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -4,13 +4,6 @@
|
||||||
<defName>TestGroupAnimation1</defName>
|
<defName>TestGroupAnimation1</defName>
|
||||||
<numActors>2</numActors>
|
<numActors>2</numActors>
|
||||||
<animationStages>
|
<animationStages>
|
||||||
<li Class="Rimworld_Animations.AnimationStage_TicksDuration">
|
|
||||||
<ticks>200</ticks>
|
|
||||||
<animationDefs>
|
|
||||||
<li>TestAnimation1</li>
|
|
||||||
<li>TestAnimation2</li>
|
|
||||||
</animationDefs>
|
|
||||||
</li>
|
|
||||||
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
|
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
|
||||||
<loops>10</loops>
|
<loops>10</loops>
|
||||||
<loopOptions>
|
<loopOptions>
|
||||||
|
@ -31,48 +24,53 @@
|
||||||
</li>
|
</li>
|
||||||
</loopOptions>
|
</loopOptions>
|
||||||
</li>
|
</li>
|
||||||
<!--
|
|
||||||
<li Class="Rimworld_Animations.AnimationStage_Branch">
|
<li Class="Rimworld_Animations.AnimationStage_Branch">
|
||||||
<paths>
|
<paths>
|
||||||
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
|
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
|
||||||
<loops>10</loops>
|
<loops>10</loops>
|
||||||
<animationOptions>
|
<loopOptions>
|
||||||
<li>
|
<li>
|
||||||
<probability>3</probability>
|
<probability>3</probability>
|
||||||
<li>Pawn1_Stage2_Variant1</li>
|
<animationDefs>
|
||||||
<li>Pawn2_Stage2_Variant1</li>
|
<li>TestAnimation1</li>
|
||||||
|
<li>TestAnimation1</li>
|
||||||
|
</animationDefs>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<probability>1</probability>
|
<probability>1</probability>
|
||||||
<li>Pawn1_Stage2_Variant2</li>
|
<animationDefs>
|
||||||
<li>Pawn2_Stage2_Variant2</li>
|
<li>TestAnimation1</li>
|
||||||
|
<li>TestAnimation1</li>
|
||||||
|
</animationDefs>
|
||||||
</li>
|
</li>
|
||||||
</animationOptions>
|
</loopOptions>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
|
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
|
||||||
<loops>10</loops>
|
<loops>10</loops>
|
||||||
<animationOptions>
|
<loopOptions>
|
||||||
<li>
|
<li>
|
||||||
<probability>3</probability>
|
<probability>3</probability>
|
||||||
<li>Pawn1_Stage2_Variant1</li>
|
<animationDefs>
|
||||||
<li>Pawn2_Stage2_Variant1</li>
|
<li>TestAnimation2</li>
|
||||||
|
<li>TestAnimation2</li>
|
||||||
|
</animationDefs>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<probability>1</probability>
|
<probability>1</probability>
|
||||||
<li>Pawn1_Stage2_Variant2</li>
|
<animationDefs>
|
||||||
<li>Pawn2_Stage2_Variant2</li>
|
<li>TestAnimation2</li>
|
||||||
|
<li>TestAnimation2</li>
|
||||||
|
</animationDefs>
|
||||||
</li>
|
</li>
|
||||||
</animationOptions>
|
</loopOptions>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</paths>
|
</paths>
|
||||||
</li>
|
</li>
|
||||||
-->
|
|
||||||
</animationStages>
|
</animationStages>
|
||||||
|
|
||||||
<contexts>
|
<contexts>
|
||||||
<li Class="Rimworld_Animations.GroupAnimationContext_RJWSex">
|
<li Class="Rimworld_Animations.GroupAnimationContext_RJWSex">
|
||||||
<interactionDefs>
|
<interactionDefs>
|
||||||
|
@ -89,6 +87,12 @@
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</contexts>
|
</contexts>
|
||||||
|
<!--
|
||||||
|
<OffsetDefs>
|
||||||
|
<li>GroinToAppropriateHeight</li>
|
||||||
|
<li>GroinToAppropriateHeight</li>
|
||||||
|
</OffsetDefs>
|
||||||
|
|
||||||
|
-->
|
||||||
</Rimworld_Animations.GroupAnimationDef>
|
</Rimworld_Animations.GroupAnimationDef>
|
||||||
</Defs>
|
</Defs>
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<Defs>
|
||||||
|
<Rimworld_Animations.OffsetDef>
|
||||||
|
<defName>GroinToAppropriateHeight</defName>
|
||||||
|
<bodyTypeOffsets>
|
||||||
|
<li>
|
||||||
|
<bodyType>Male</bodyType>
|
||||||
|
<offset>(0, 0, 0.5)</offset>
|
||||||
|
</li>
|
||||||
|
</bodyTypeOffsets>
|
||||||
|
<raceOffsets>
|
||||||
|
<li Class="Rimworld_Animations.RaceOffsets_BodyTypes" MayRequire="erdelf.HumanoidAlienRaces,Minecraft.Mod">
|
||||||
|
<def>MinecraftCreeper</def>
|
||||||
|
<genderGraphics>
|
||||||
|
<Female>
|
||||||
|
<Hulk>(0, 0, 0.5)</Hulk>
|
||||||
|
<Thin>(0, 0, 0.3)</Thin>
|
||||||
|
</Female>
|
||||||
|
<Male>
|
||||||
|
<Hulk>(0, 0, 0.5)</Hulk>
|
||||||
|
<Thin>(0, 0, 0.3)</Thin>
|
||||||
|
</Male>
|
||||||
|
</genderGraphics>
|
||||||
|
</li>
|
||||||
|
<li Class="Rimworld_Animations.RaceOffsets_DifferentBodyTypes" MayRequire="Specific.Mod,Other.Cool.Mod">
|
||||||
|
<def>MinecraftPig</def>
|
||||||
|
<bodyType>Male</bodyType>
|
||||||
|
<offset>(0, 0, -0.5)</offset>
|
||||||
|
</li>
|
||||||
|
<li Class="Rimworld_Animations.RaceOffsets_DifferentBodyTypes" MayRequire="Specific.Minecraft.Mod">
|
||||||
|
<def>MinecraftPig</def>
|
||||||
|
<bodyType>Female</bodyType>
|
||||||
|
<offset>(0, 0, -0.5)</offset>
|
||||||
|
</li>
|
||||||
|
</raceOffsets>
|
||||||
|
</Rimworld_Animations.OffsetDef>
|
||||||
|
</Defs>
|
||||||
|
|
|
@ -15,11 +15,18 @@ namespace Rimworld_Animations
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Vector3 OffsetAtTick(int tick, PawnDrawParms parms)
|
||||||
|
{
|
||||||
|
//Todo: Use this for bodyoffsets
|
||||||
|
return base.OffsetAtTick(tick, parms);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//use extendedkeyframes to determine addon facing
|
//use extendedkeyframes to determine addon facing
|
||||||
public Rot4 facingAtTick(int tick)
|
public Rot4 facingAtTick(int tick)
|
||||||
{
|
{
|
||||||
|
|
||||||
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
||||||
if (tick <= this.part.keyframes[0].tick) {
|
if (tick <= this.part.keyframes[0].tick) {
|
||||||
|
|
||||||
|
@ -58,8 +65,6 @@ namespace Rimworld_Animations
|
||||||
return (keyframe as ExtendedKeyframe).rotation;
|
return (keyframe as ExtendedKeyframe).rotation;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public bool visibleAtTick(int tick)
|
public bool visibleAtTick(int tick)
|
||||||
{
|
{
|
||||||
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
||||||
|
@ -104,5 +109,15 @@ namespace Rimworld_Animations
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool shouldRecache(int tick)
|
||||||
|
{
|
||||||
|
if (facingAtTick(tick) != facingAtTick(tick - 1) || visibleAtTick(tick) != visibleAtTick(tick - 1))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,125 @@ using Verse.Sound;
|
||||||
namespace Rimworld_Animations {
|
namespace Rimworld_Animations {
|
||||||
public class CompExtendedAnimator : ThingComp
|
public class CompExtendedAnimator : ThingComp
|
||||||
{
|
{
|
||||||
List<Tuple<int, AnimationDef>> animationQueue;
|
|
||||||
|
// CompExtendedAnimator
|
||||||
|
// Helps manage AnimationQueue, AbsolutePosition
|
||||||
|
//ticks of current animation
|
||||||
|
private int animationTicks;
|
||||||
|
|
||||||
|
private List<AnimationDef> animationQueue;
|
||||||
|
private BaseExtendedAnimatorAnchor anchor;
|
||||||
|
private bool isAnimating = false;
|
||||||
|
|
||||||
|
|
||||||
|
public bool IsAnimating
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return isAnimating;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsAnchored
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return anchor != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3 getAnchor()
|
||||||
|
{
|
||||||
|
return anchor.getDrawPos();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override void CompTick()
|
||||||
|
{
|
||||||
|
if (isAnimating)
|
||||||
|
{
|
||||||
|
animationTicks++;
|
||||||
|
|
||||||
|
//if animationticks is equal to cur. anim duration,
|
||||||
|
if (animationTicks >= animationQueue[0].durationTicks)
|
||||||
|
{
|
||||||
|
//dequeue; returns false if more animations
|
||||||
|
if (!PopAnimationQueue())
|
||||||
|
{
|
||||||
|
//play next if more anims still
|
||||||
|
PlayNextAnimation();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StopAnimating();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
base.CompTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
//returns false if still more animations
|
||||||
|
public bool PopAnimationQueue()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!animationQueue.Empty())
|
||||||
|
{
|
||||||
|
//pop queue
|
||||||
|
animationQueue.RemoveAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return animationQueue.Empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlayNextAnimation()
|
||||||
|
{
|
||||||
|
if (!animationQueue.Empty())
|
||||||
|
{
|
||||||
|
isAnimating = true;
|
||||||
|
animationTicks = 0;
|
||||||
|
pawn.Drawer.renderer.SetAnimation(animationQueue[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopAnimating()
|
||||||
|
{
|
||||||
|
isAnimating = false;
|
||||||
|
animationQueue = null;
|
||||||
|
anchor = null;
|
||||||
|
pawn.Drawer.renderer.SetAnimation(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlayGroupAnimation(List<AnimationDef> groupAnimation)
|
||||||
|
{
|
||||||
|
animationQueue = groupAnimation;
|
||||||
|
PlayNextAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlayGroupAnimation(List<AnimationDef> groupAnimation, BaseExtendedAnimatorAnchor anchor)
|
||||||
|
{
|
||||||
|
this.anchor = anchor;
|
||||||
|
PlayGroupAnimation(groupAnimation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void PostExposeData()
|
||||||
|
{
|
||||||
|
base.PostExposeData();
|
||||||
|
Scribe_Values.Look<bool>(ref this.isAnimating, "animations_isAnimating", false);
|
||||||
|
Scribe_Values.Look<int>(ref this.animationTicks, "animations_ticks", 0);
|
||||||
|
Scribe_Collections.Look<AnimationDef>(ref animationQueue, "animations_queue");
|
||||||
|
Scribe_Deep.Look<BaseExtendedAnimatorAnchor>(ref this.anchor, "animations_anchor");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckRecacheNecessary(int anim)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pawn pawn => base.parent as Pawn;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ namespace Rimworld_Animations {
|
||||||
public CompProperties_ExtendedAnimator()
|
public CompProperties_ExtendedAnimator()
|
||||||
{
|
{
|
||||||
base.compClass = typeof(CompExtendedAnimator);
|
base.compClass = typeof(CompExtendedAnimator);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace Rimworld_Animations
|
||||||
|
{
|
||||||
|
public abstract class BaseExtendedAnimatorAnchor : IExposable
|
||||||
|
{
|
||||||
|
public BaseExtendedAnimatorAnchor() { }
|
||||||
|
|
||||||
|
public virtual void ExposeData() { }
|
||||||
|
public abstract Vector3 getDrawPos();
|
||||||
|
|
||||||
|
public string GetUniqueLoadID()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace Rimworld_Animations
|
||||||
|
{
|
||||||
|
public class ExtendedAnimatorAnchor_Thing : BaseExtendedAnimatorAnchor
|
||||||
|
{
|
||||||
|
|
||||||
|
private Thing thing;
|
||||||
|
|
||||||
|
public ExtendedAnimatorAnchor_Thing() : base() { }
|
||||||
|
|
||||||
|
public ExtendedAnimatorAnchor_Thing(Thing thing) : base()
|
||||||
|
{
|
||||||
|
this.thing = thing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Vector3 getDrawPos()
|
||||||
|
{
|
||||||
|
return thing.DrawPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ExposeData()
|
||||||
|
{
|
||||||
|
base.ExposeData();
|
||||||
|
Scribe_References.Look<Thing>(ref this.thing, "animations_anchor_thing", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace Rimworld_Animations
|
||||||
|
{
|
||||||
|
public class ExtendedAnimatorAnchor_Vector3 : BaseExtendedAnimatorAnchor
|
||||||
|
{
|
||||||
|
|
||||||
|
public ExtendedAnimatorAnchor_Vector3() : base() { }
|
||||||
|
|
||||||
|
private Vector3 position;
|
||||||
|
public ExtendedAnimatorAnchor_Vector3(Vector3 position) : base()
|
||||||
|
{
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Vector3 getDrawPos()
|
||||||
|
{
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ExposeData()
|
||||||
|
{
|
||||||
|
base.ExposeData();
|
||||||
|
Scribe_Values.Look<Vector3>(ref position, "animations_anchor_position", Vector3.zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ namespace Rimworld_Animations
|
||||||
{
|
{
|
||||||
public int actorShift = 0;
|
public int actorShift = 0;
|
||||||
public abstract bool CanAnimationBeUsed(List<Pawn> actors, out int reorder);
|
public abstract bool CanAnimationBeUsed(List<Pawn> actors, out int reorder);
|
||||||
|
public abstract string DebugMessage();
|
||||||
|
|
||||||
//cool class for designating contexts for animations
|
//cool class for designating contexts for animations
|
||||||
// configure CanAnimationBeUsed to test whether it can be used
|
// configure CanAnimationBeUsed to test whether it can be used
|
||||||
|
|
|
@ -17,7 +17,6 @@ namespace Rimworld_Animations
|
||||||
|
|
||||||
public override bool CanAnimationBeUsed(List<Pawn> actors, out int reorder)
|
public override bool CanAnimationBeUsed(List<Pawn> actors, out int reorder)
|
||||||
{
|
{
|
||||||
Log.Message("Testing this animation");
|
|
||||||
|
|
||||||
JobDriver_SexBaseInitiator latestSexBaseInitiator = (actors.FindLast(x => x.jobs?.curDriver is JobDriver_SexBaseInitiator).jobs.curDriver as JobDriver_SexBaseInitiator);
|
JobDriver_SexBaseInitiator latestSexBaseInitiator = (actors.FindLast(x => x.jobs?.curDriver is JobDriver_SexBaseInitiator).jobs.curDriver as JobDriver_SexBaseInitiator);
|
||||||
reorder = base.actorShift;
|
reorder = base.actorShift;
|
||||||
|
@ -25,5 +24,11 @@ namespace Rimworld_Animations
|
||||||
|
|
||||||
return interactionDefs.Contains(latestSexBaseInitiator.Sexprops.dictionaryKey);
|
return interactionDefs.Contains(latestSexBaseInitiator.Sexprops.dictionaryKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string DebugMessage()
|
||||||
|
{
|
||||||
|
return "Checking for RJWSex AnimationContext\n"
|
||||||
|
+ "InteractionDefs: " + interactionDefs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,11 @@ namespace Rimworld_Animations
|
||||||
|
|
||||||
public bool canAnimationBeUsed(List<Pawn> actors, out int reorder)
|
public bool canAnimationBeUsed(List<Pawn> actors, out int reorder)
|
||||||
{
|
{
|
||||||
|
if (AnimationSettings.debugMode)
|
||||||
|
{
|
||||||
|
Log.Message("[anims] Checking if " + defName + " is valid animation");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach (BaseGroupAnimationContext context in contexts)
|
foreach (BaseGroupAnimationContext context in contexts)
|
||||||
{
|
{
|
||||||
|
@ -28,5 +33,20 @@ namespace Rimworld_Animations
|
||||||
reorder = 0;
|
reorder = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<AnimationDef> GetAllAnimationsForActor(int actor, int seed, int reorder = 0)
|
||||||
|
{
|
||||||
|
List<AnimationDef> animations = new List<AnimationDef>();
|
||||||
|
int actorNumber = (actor + reorder) % numActors;
|
||||||
|
|
||||||
|
|
||||||
|
foreach (AnimationStage stage in animationStages)
|
||||||
|
{
|
||||||
|
//add all new animations to list of animations
|
||||||
|
animations.AddRange(stage.GetAnimations(actorNumber, seed));
|
||||||
|
}
|
||||||
|
|
||||||
|
return animations;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace Rimworld_Animations
|
||||||
{
|
{
|
||||||
|
|
||||||
//Return a list containing a tuple; int for how long the animation should play for
|
//Return a list containing a tuple; int for how long the animation should play for
|
||||||
public abstract List<Tuple<int, AnimationDef>> GetAnimations(int actor, int seed);
|
public abstract List<AnimationDef> GetAnimations(int actorNumber, int seed);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,9 @@ namespace Rimworld_Animations
|
||||||
public class AnimationStage_Branch : AnimationStage
|
public class AnimationStage_Branch : AnimationStage
|
||||||
{
|
{
|
||||||
public List<AnimationStage> paths;
|
public List<AnimationStage> paths;
|
||||||
public override List<Tuple<int, AnimationDef>> GetAnimations(int actor, int seed)
|
public override List<AnimationDef> GetAnimations(int actorNumber, int seed)
|
||||||
{
|
{
|
||||||
return paths[(seed * 59) % paths.Count].GetAnimations(actor, seed);
|
return paths[(seed * 59) % paths.Count].GetAnimations(actorNumber, seed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,48 +12,50 @@ namespace Rimworld_Animations
|
||||||
public int loops;
|
public int loops;
|
||||||
public List<AnimationLoopOption> loopOptions;
|
public List<AnimationLoopOption> loopOptions;
|
||||||
|
|
||||||
public override List<Tuple<int, AnimationDef>> GetAnimations(int actor, int seed)
|
public override List<AnimationDef> GetAnimations(int actorNumber, int seed)
|
||||||
{
|
{
|
||||||
int numberOfActors = loopOptions[0].animationDefs.Count;
|
int numberOfActors = loopOptions[0].animationDefs.Count;
|
||||||
List<Tuple<int, AnimationDef>> animations = new List<Tuple<int, AnimationDef>>();
|
List<AnimationDef> animations = new List<AnimationDef>();
|
||||||
|
|
||||||
for (int i = 0; i < loops; i++)
|
for (int i = 0; i < loops; i++)
|
||||||
{
|
{
|
||||||
|
AnimationLoopOption option = getAnimationLoopOptionByWeight(seed + i);
|
||||||
AnimationLoopOption option = getAnimationLoopOptionByWeight(seed + i, out int longestAnimLength);
|
animations.Add(option.animationDefs[actorNumber]);
|
||||||
Tuple<int, AnimationDef> animation = Tuple.Create(longestAnimLength, option.animationDefs[actor]);
|
|
||||||
animations.Append(animation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return animations;
|
return animations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AnimationLoopOption
|
|
||||||
{
|
|
||||||
public int probability;
|
|
||||||
public List<AnimationDef> animationDefs;
|
|
||||||
}
|
|
||||||
|
|
||||||
//select random element from loop options by weight; also calculate the longest anim length
|
//select random element from loop options by weight; also calculate the longest anim length
|
||||||
public AnimationLoopOption getAnimationLoopOptionByWeight(int seed, out int longestAnimLength)
|
private AnimationLoopOption getAnimationLoopOptionByWeight(int seed)
|
||||||
{
|
{
|
||||||
int totalWeight = loopOptions.Sum(x => x.probability);
|
int totalWeight = loopOptions.Sum(x => x.probability);
|
||||||
int randomNumber = (seed * 56) % totalWeight;
|
int randomNumber = ((seed * 59) % totalWeight) + 1;
|
||||||
|
|
||||||
int cumulativeWeight = 0;
|
int cumulativeWeight = 0;
|
||||||
foreach(AnimationLoopOption option in loopOptions) {
|
for (int i = 0; i < loopOptions.Count; i++) {
|
||||||
cumulativeWeight += option.probability;
|
|
||||||
|
|
||||||
|
cumulativeWeight += loopOptions[i].probability;
|
||||||
|
|
||||||
|
//random number is same for all pawns because they all have the same seed
|
||||||
|
|
||||||
if (randomNumber <= cumulativeWeight)
|
if (randomNumber <= cumulativeWeight)
|
||||||
{
|
{
|
||||||
longestAnimLength = option.animationDefs.Max(x => x.durationTicks);
|
return loopOptions[i];
|
||||||
return option;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
longestAnimLength = loopOptions[0].animationDefs.Max(x => x.durationTicks);
|
//default
|
||||||
return loopOptions[0];
|
return loopOptions.Last();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AnimationLoopOption
|
||||||
|
{
|
||||||
|
public int probability;
|
||||||
|
public List<AnimationDef> animationDefs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,14 +7,17 @@ using Verse;
|
||||||
|
|
||||||
namespace Rimworld_Animations
|
namespace Rimworld_Animations
|
||||||
{
|
{
|
||||||
|
/* don't use? just use looprandomselect once
|
||||||
public class AnimationStage_TicksDuration : AnimationStage
|
public class AnimationStage_TicksDuration : AnimationStage
|
||||||
{
|
{
|
||||||
int ticks;
|
public int ticks;
|
||||||
List<AnimationDef> animationDefs;
|
public List<AnimationDef> animationDefs;
|
||||||
|
|
||||||
public override List<Tuple<int, AnimationDef>> GetAnimations(int actor, int seed)
|
public override List<Tuple<int, AnimationDef>> GetAnimations(int actor, int seed)
|
||||||
{
|
{
|
||||||
return new List<Tuple<int, AnimationDef>>() { Tuple.Create(ticks, animationDefs[actor]) };
|
return new List<Tuple<int, AnimationDef>>() { Tuple.Create(ticks, animationDefs[actor]) };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,10 +42,9 @@ namespace Rimworld_Animations {
|
||||||
List<Pawn> participants = partnerSexBaseReceiver.parteners.Append(partner).ToList();
|
List<Pawn> participants = partnerSexBaseReceiver.parteners.Append(partner).ToList();
|
||||||
|
|
||||||
GroupAnimationDef groupAnimation = AnimationUtility.FindGroupAnimation(participants, out int reorder);
|
GroupAnimationDef groupAnimation = AnimationUtility.FindGroupAnimation(participants, out int reorder);
|
||||||
|
|
||||||
if (groupAnimation != null)
|
if (groupAnimation != null)
|
||||||
{
|
{
|
||||||
AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder);
|
AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder, partner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,25 +18,17 @@ namespace Rimworld_Animations
|
||||||
{
|
{
|
||||||
if (__instance.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker)
|
if (__instance.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// ADJUST FACING get rotated textures
|
||||||
|
// compare the previous tick to the current tick; if the current tick rotation is different, recache
|
||||||
|
parms.facing = extendedAnimWorker.facingAtTick(__instance.tree.AnimationTick);
|
||||||
|
|
||||||
|
|
||||||
//INVIS IF ANIM CALLS FOR IT
|
//INVIS IF ANIM CALLS FOR IT
|
||||||
//replace maybe?
|
//replace maybe?
|
||||||
if (!extendedAnimWorker.visibleAtTick(__instance.tree.AnimationTick))
|
|
||||||
{
|
|
||||||
__instance.requestRecache = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//cheaper call now comparing prev tick to cur tick
|
||||||
// HEAD ROTATION ADJUST FACING get rotated textures
|
return extendedAnimWorker.visibleAtTick(__instance.tree.AnimationTick);
|
||||||
|
|
||||||
Rot4 animFacing = extendedAnimWorker.facingAtTick(__instance.tree.AnimationTick);
|
|
||||||
|
|
||||||
if (parms.facing != animFacing)
|
|
||||||
{
|
|
||||||
//requestRecache or else it won't update properly
|
|
||||||
__instance.requestRecache = true;
|
|
||||||
parms.facing = animFacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,43 @@ namespace Rimworld_Animations
|
||||||
&& node.tree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended rootNodeAnimationWorker)
|
&& node.tree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended rootNodeAnimationWorker)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// this is only for the Vector3 position to work right
|
||||||
parms.facing = rootNodeAnimationWorker.facingAtTick(node.tree.AnimationTick);
|
parms.facing = rootNodeAnimationWorker.facingAtTick(node.tree.AnimationTick);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(PawnRenderTree), "AdjustParms")]
|
||||||
|
public class HarmonyPatch_PawnRenderTree2
|
||||||
|
{
|
||||||
|
public static void Prefix(PawnRenderTree __instance, ref PawnDrawParms parms)
|
||||||
|
{
|
||||||
|
|
||||||
|
int animationTick = __instance.AnimationTick;
|
||||||
|
|
||||||
|
if (__instance.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended rootAnimWorkerExtended)
|
||||||
|
{
|
||||||
|
//recache during facing turn
|
||||||
|
if (rootAnimWorkerExtended.shouldRecache(animationTick))
|
||||||
|
{
|
||||||
|
__instance.rootNode.requestRecache = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (PawnRenderNode node in __instance.rootNode.children)
|
||||||
|
{
|
||||||
|
if (node.AnimationWorker is AnimationWorker_KeyframesExtended animWorkerExtended)
|
||||||
|
{
|
||||||
|
//recache during facing turn
|
||||||
|
if (animWorkerExtended.shouldRecache(animationTick))
|
||||||
|
{
|
||||||
|
node.requestRecache = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,23 +9,18 @@ namespace Rimworld_Animations {
|
||||||
public static class HarmonyPatch_Pawn_DrawTracker {
|
public static class HarmonyPatch_Pawn_DrawTracker {
|
||||||
public static bool Prefix(ref Pawn ___pawn, ref Vector3 __result) {
|
public static bool Prefix(ref Pawn ___pawn, ref Vector3 __result) {
|
||||||
|
|
||||||
// If animating and is sexbaseinitiator jobdriver,
|
|
||||||
if (___pawn?.Drawer?.renderer?.renderTree?.rootNode?.AnimationWorker is AnimationWorker_KeyframesExtended
|
CompExtendedAnimator animator = ___pawn.TryGetComp<CompExtendedAnimator>();
|
||||||
&& ___pawn.jobs?.curDriver is JobDriver_SexBaseInitiator sexdriver)
|
|
||||||
|
//align pos on top of partner, position, etc., based on animatoranchor
|
||||||
|
if (animator != null && animator.IsAnchored)
|
||||||
{
|
{
|
||||||
|
__result = animator.getAnchor();
|
||||||
//align pos on top of partner
|
|
||||||
if (sexdriver?.Partner?.Drawer?.DrawPos != null)
|
|
||||||
__result = sexdriver.Partner.Drawer.DrawPos;
|
|
||||||
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace Rimworld_Animations {
|
||||||
Scribe_Values.Look(ref orgasmQuiver, "RJWAnimations-orgasmQuiver");
|
Scribe_Values.Look(ref orgasmQuiver, "RJWAnimations-orgasmQuiver");
|
||||||
Scribe_Values.Look(ref fastAnimForQuickie, "RJWAnimations-fastAnimForQuickie");
|
Scribe_Values.Look(ref fastAnimForQuickie, "RJWAnimations-fastAnimForQuickie");
|
||||||
Scribe_Values.Look(ref rapeShiver, "RJWAnimations-rapeShiver");
|
Scribe_Values.Look(ref rapeShiver, "RJWAnimations-rapeShiver");
|
||||||
Scribe_Values.Look(ref hearts, "RJWAnimation-sheartsOnLovin");
|
Scribe_Values.Look(ref hearts, "RJWAnimation-heartsOnLovin");
|
||||||
Scribe_Values.Look(ref PlayAnimForNonsexualActs, "RJWAnims-PlayAnimForNonsexualActs");
|
Scribe_Values.Look(ref PlayAnimForNonsexualActs, "RJWAnims-PlayAnimForNonsexualActs");
|
||||||
Scribe_Values.Look(ref applySemenOnAnimationOrgasm, "RJWAnimations-applySemenOnOrgasm", false);
|
Scribe_Values.Look(ref applySemenOnAnimationOrgasm, "RJWAnimations-applySemenOnOrgasm", false);
|
||||||
Scribe_Values.Look(ref soundOverride, "RJWAnimations-rjwAnimSoundOverride", true);
|
Scribe_Values.Look(ref soundOverride, "RJWAnimations-rjwAnimSoundOverride", true);
|
||||||
|
|
|
@ -21,15 +21,42 @@ namespace Rimworld_Animations {
|
||||||
participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2);
|
participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//startgroupanimator with anchor
|
||||||
|
//don't anchor to self if anchor is self
|
||||||
|
public static void StartGroupAnimation(List<Pawn> participants, GroupAnimationDef groupAnimationDef, int reorder, Thing anchor)
|
||||||
|
{
|
||||||
|
|
||||||
|
int seed = GenTicks.TicksGame;
|
||||||
|
|
||||||
|
for (int i = 0; i < participants.Count; i++)
|
||||||
|
{
|
||||||
|
if (anchor is Pawn pawn && pawn == participants[i])
|
||||||
|
{
|
||||||
|
|
||||||
|
List<AnimationDef> allAnimationsForPawn = groupAnimationDef.GetAllAnimationsForActor(i, seed, reorder);
|
||||||
|
participants[i].TryGetComp<CompExtendedAnimator>().PlayGroupAnimation(allAnimationsForPawn);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//each participant gets their own unique extendedanimatoranchor, important for scribe_deep saving
|
||||||
|
|
||||||
|
List<AnimationDef> allAnimationsForPawn = groupAnimationDef.GetAllAnimationsForActor(i, seed, reorder);
|
||||||
|
BaseExtendedAnimatorAnchor animatorAnchor = new ExtendedAnimatorAnchor_Thing(anchor);
|
||||||
|
|
||||||
|
participants[i].TryGetComp<CompExtendedAnimator>().PlayGroupAnimation(allAnimationsForPawn, animatorAnchor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//startgroupanimation without anchor; just play where standing
|
||||||
public static void StartGroupAnimation(List<Pawn> participants, GroupAnimationDef groupAnimationDef, int reorder)
|
public static void StartGroupAnimation(List<Pawn> participants, GroupAnimationDef groupAnimationDef, int reorder)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < participants.Count; i++)
|
int seed = GenTicks.TicksGame;
|
||||||
|
|
||||||
|
for (int i = 0; i < participants.Count; i++)
|
||||||
{
|
{
|
||||||
//todo: pass all animationstages to ExtendedAnimator, and queue animations
|
List<AnimationDef> allAnimationsForPawn = groupAnimationDef.GetAllAnimationsForActor(i, seed, reorder);
|
||||||
participants[i].Drawer.renderer.SetAnimation(
|
participants[i].TryGetComp<CompExtendedAnimator>().PlayGroupAnimation(allAnimationsForPawn);
|
||||||
groupAnimationDef.animationStages[0]
|
|
||||||
.GetAnimations((i + reorder) % participants.Count, GenTicks.TicksGame)[0].Item2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,13 +65,13 @@ namespace Rimworld_Animations {
|
||||||
{
|
{
|
||||||
foreach(Pawn pawn in participants)
|
foreach(Pawn pawn in participants)
|
||||||
{
|
{
|
||||||
pawn.Drawer.renderer.SetAnimation(null);
|
pawn.TryGetComp<CompExtendedAnimator>()?.StopAnimating();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StopGroupAnimation(Pawn participant)
|
public static void StopGroupAnimation(Pawn participant)
|
||||||
{
|
{
|
||||||
participant?.Drawer?.renderer?.SetAnimation(null);
|
participant.TryGetComp<CompExtendedAnimator>()?.StopAnimating();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GroupAnimationDef FindGroupAnimation(List<Pawn> participants, out int reorder)
|
public static GroupAnimationDef FindGroupAnimation(List<Pawn> participants, out int reorder)
|
||||||
|
@ -55,8 +82,6 @@ namespace Rimworld_Animations {
|
||||||
|
|
||||||
int reorder2 = 0;
|
int reorder2 = 0;
|
||||||
|
|
||||||
Log.Message(DefDatabase<GroupAnimationDef>.AllDefsListForReading[0].defName);
|
|
||||||
|
|
||||||
DefDatabase<GroupAnimationDef>.AllDefsListForReading.TryRandomElement((GroupAnimationDef x) =>
|
DefDatabase<GroupAnimationDef>.AllDefsListForReading.TryRandomElement((GroupAnimationDef x) =>
|
||||||
x.canAnimationBeUsed(participants, out reorder2), out GroupAnimationDef result);
|
x.canAnimationBeUsed(participants, out reorder2), out GroupAnimationDef result);
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -77,6 +77,9 @@
|
||||||
<Compile Include="1.5\Source\Comps\CompProperties_ExtendedAnimator.cs" />
|
<Compile Include="1.5\Source\Comps\CompProperties_ExtendedAnimator.cs" />
|
||||||
<Compile Include="1.5\Source\Comps\CompProperties_ThingAnimator.cs" />
|
<Compile Include="1.5\Source\Comps\CompProperties_ThingAnimator.cs" />
|
||||||
<Compile Include="1.5\Source\Comps\CompThingAnimator.cs" />
|
<Compile Include="1.5\Source\Comps\CompThingAnimator.cs" />
|
||||||
|
<Compile Include="1.5\Source\Comps\ExtendedAnimatorAnchor\BaseExtendedAnimatorAnchor.cs" />
|
||||||
|
<Compile Include="1.5\Source\Comps\ExtendedAnimatorAnchor\ExtendedAnimatorAnchor_Thing.cs" />
|
||||||
|
<Compile Include="1.5\Source\Comps\ExtendedAnimatorAnchor\ExtendedAnimatorAnchor_Vector3.cs" />
|
||||||
<Compile Include="1.5\Source\Defs\AnimationDefOf.cs" />
|
<Compile Include="1.5\Source\Defs\AnimationDefOf.cs" />
|
||||||
<Compile Include="1.5\Source\GroupAnimations\GroupAnimationContexts\BaseGroupAnimationContext.cs" />
|
<Compile Include="1.5\Source\GroupAnimations\GroupAnimationContexts\BaseGroupAnimationContext.cs" />
|
||||||
<Compile Include="1.5\Source\GroupAnimations\GroupAnimationContexts\GroupAnimationContext_RJWSex.cs" />
|
<Compile Include="1.5\Source\GroupAnimations\GroupAnimationContexts\GroupAnimationContext_RJWSex.cs" />
|
||||||
|
@ -114,6 +117,7 @@
|
||||||
<Content Include="1.5\Defs\AnimationDefs\TestAnimation2.xml" />
|
<Content Include="1.5\Defs\AnimationDefs\TestAnimation2.xml" />
|
||||||
<Content Include="1.5\Defs\GroupAnimationDefs\TestGroupAnimation1.xml" />
|
<Content Include="1.5\Defs\GroupAnimationDefs\TestGroupAnimation1.xml" />
|
||||||
<Content Include="1.5\Defs\MainTabDefs\MainButtonDef.xml" />
|
<Content Include="1.5\Defs\MainTabDefs\MainButtonDef.xml" />
|
||||||
|
<Content Include="1.5\Defs\OffsetDefs\OffsetDef_GroinToAppropriateHeight.xml" />
|
||||||
<Content Include="1.5\Defs\SoundDefs\Sounds_Sex.xml" />
|
<Content Include="1.5\Defs\SoundDefs\Sounds_Sex.xml" />
|
||||||
<Content Include="1.5\Patches\AnimationPatchHSK.xml" />
|
<Content Include="1.5\Patches\AnimationPatchHSK.xml" />
|
||||||
<Content Include="1.5\Patches\AnimationPatch_CompExtendedAnimator.xml" />
|
<Content Include="1.5\Patches\AnimationPatch_CompExtendedAnimator.xml" />
|
||||||
|
|
Loading…
Reference in New Issue