Compare commits

...

3 Commits

Author SHA1 Message Date
c0ffee 315a57e53d fixed: invis sleeping
sex job length matches anim length
2024-04-22 14:46:00 -07:00
c0ffee c33072614b Better error handling for missing graphic variants, missing offsets 2024-04-22 12:55:46 -07:00
c0ffee 67ff59ed80 added hediff-based graphic variants 2024-04-22 10:56:34 -07:00
28 changed files with 423 additions and 80 deletions

View File

@ -98,9 +98,8 @@
</keyframes> </keyframes>
</value> </value>
</li> </li>
<li> <li>
<key>RenderNodeTag_Banana</key> <key>RenderNodeTag_Xray_Inside</key>
<value> <value>
<workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass> <workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
<keyframes> <keyframes>

View File

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnRenderNodeTagDef>
<defName>RenderNodeTag_Banana</defName>
</PawnRenderNodeTagDef>
<Rimworld_Animations.AnimationPropDef>
<defName>AnimationProp_Banana</defName>
<!-- Note: props always return graphic_multi; set cardinal textures to blank and only north in anim if only one tex-->
<!-- or draw east, south, and west directions, use them in animations? -->
<animPropProperties Class="Rimworld_Animations.PawnRenderNodeProperties_GraphicVariants">
<debugLabel>AnimProp_Banana</debugLabel>
<nodeClass>Rimworld_Animations.PawnRenderNode_GraphicVariants</nodeClass>
<workerClass>Rimworld_Animations.PawnRenderNodeWorker_GraphicVariants</workerClass>
<tagDef>RenderNodeTag_Banana</tagDef>
<parentTagDef>Body</parentTagDef>
<texPath>AnimationProps/Banana/Banana</texPath>
<!-- for height -->
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
<texPathVariants>
<li>AnimationProps/Cat/Cat1</li>
<li>AnimationProps/Cat/Cat2</li>
</texPathVariants>
<absolutePosition>True</absolutePosition>
</animPropProperties>
</Rimworld_Animations.AnimationPropDef>
<PawnRenderNodeTagDef>
<defName>RenderNodeTag_Genitals</defName>
</PawnRenderNodeTagDef>
<Rimworld_Animations.AnimationPropDef>
<defName>AnimationProp_Genitals</defName>
<animPropProperties>
<debugLabel>AnimProp_Genitals</debugLabel>
<useGraphic>false</useGraphic>
<tagDef>RenderNodeTag_Genitals</tagDef>
<parentTagDef>Body</parentTagDef>
<!-- for height -->
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
</animPropProperties>
</Rimworld_Animations.AnimationPropDef>
</Defs>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnRenderNodeTagDef>
<defName>RenderNodeTag_Banana</defName>
</PawnRenderNodeTagDef>
<Rimworld_Animations.AnimationPropDef>
<defName>AnimationProp_Banana</defName>
<animPropProperties>
<debugLabel>Banana</debugLabel>
<tagDef>RenderNodeTag_Banana</tagDef>
<parentTagDef>Body</parentTagDef>
<texPath>AnimationProps/Banana/Banana</texPath>
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
</animPropProperties>
</Rimworld_Animations.AnimationPropDef>
</Defs>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnRenderNodeTagDef>
<defName>RenderNodeTag_Xray_Inside</defName>
</PawnRenderNodeTagDef>
<Rimworld_Animations.AnimationPropDef>
<defName>AnimationProp_Xray_Inside</defName>
<animPropProperties Class="Rimworld_Animations.PawnRenderNodeProperties_GraphicVariants">
<debugLabel>Xray Inside</debugLabel>
<nodeClass>Rimworld_Animations.PawnRenderNode_GraphicVariants</nodeClass>
<workerClass>Rimworld_Animations.PawnRenderNodeWorker_GraphicVariants</workerClass>
<tagDef>RenderNodeTag_Xray_Inside</tagDef>
<absoluteTransform>True</absoluteTransform>
<parentTagDef>Body</parentTagDef>
<!-- for height -->
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
<texPathVariantsDef>TexPathVariants_Xray_Inside</texPathVariantsDef>
</animPropProperties>
</Rimworld_Animations.AnimationPropDef>
</Defs>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnRenderNodeTagDef>
<defName>RenderNodeTag_Xray_Penis</defName>
</PawnRenderNodeTagDef>
<Rimworld_Animations.AnimationPropDef>
<defName>AnimationProp_Penis</defName>
<animPropProperties Class="Rimworld_Animations.PawnRenderNodeProperties_GraphicHediffVariants">
<debugLabel>Xray Penis</debugLabel>
<nodeClass>Rimworld_Animations.PawnRenderNode_GraphicHediffVariants</nodeClass>
<workerClass>Rimworld_Animations.PawnRenderNodeWorker_GraphicHediffVariants</workerClass>
<tagDef>RenderNodeTag_Xray_Penis</tagDef>
<parentTagDef>Body</parentTagDef>
<texPath>AnimationProps/Banana/Banana</texPath>
<!-- for height -->
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
<absoluteTransform>True</absoluteTransform>
<!-- Default value if no hediff variant is found -->
<texPathVariantsDef>TexPathVariants_XrayPenis_Human</texPathVariantsDef>
<!-- select different hediff variants if applicable -->
<hediffVariants>
<li>
<hediffs>
<li>HorsePenis</li>
<li>RaccoonPenis</li>
</hediffs>
<texPathVariantsDef>TexPathVariants_XrayPenis_Horse</texPathVariantsDef>
</li>
</hediffVariants>
</animPropProperties>
</Rimworld_Animations.AnimationPropDef>
</Defs>

View File

@ -3,6 +3,7 @@
<Rimworld_Animations.GroupAnimationDef> <Rimworld_Animations.GroupAnimationDef>
<defName>TestGroupAnimation1</defName> <defName>TestGroupAnimation1</defName>
<numActors>2</numActors> <numActors>2</numActors>
<canMirror>True</canMirror>
<animationStages> <animationStages>
<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance"> <li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
<loops>10</loops> <loops>10</loops>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<Rimworld_Animations.TexPathVariantsDef>
<defName>TexPathVariants_Cat</defName>
<variants>
<li>AnimationProps/Cat/Cat1</li><!-- variant 1 in animation -->
<li>AnimationProps/Cat/Cat2</li><!-- variant 2 in animation -->
</variants>
</Rimworld_Animations.TexPathVariantsDef>
</Defs>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<Rimworld_Animations.TexPathVariantsDef>
<defName>TexPathVariants_XrayPenis_Horse</defName>
<variants>
<li>AnimationProps/Cat/Cat1</li>
<!-- variant 1 in animation -->
<li>AnimationProps/Cat/Cat2</li>
<!-- variant 2 in animation -->
</variants>
</Rimworld_Animations.TexPathVariantsDef>
</Defs>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<Rimworld_Animations.TexPathVariantsDef>
<defName>TexPathVariants_XrayPenis_Human</defName>
<variants>
<li>AnimationProps/Cat/Cat1</li>
<!-- variant 1 in animation -->
<li>AnimationProps/Cat/Cat2</li>
<!-- variant 2 in animation -->
</variants>
</Rimworld_Animations.TexPathVariantsDef>
</Defs>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<Rimworld_Animations.TexPathVariantsDef>
<defName>TexPathVariants_Xray_Inside</defName>
<variants>
<li>AnimationProps/Cat/Cat1</li>
<!-- variant 1 in animation -->
<li>AnimationProps/Cat/Cat2</li>
<!-- variant 2 in animation -->
</variants>
</Rimworld_Animations.TexPathVariantsDef>
</Defs>

View File

@ -55,6 +55,7 @@ namespace Rimworld_Animations
{ {
//element at or default to stop errors //element at or default to stop errors
if (offsetDefs == null) return null; if (offsetDefs == null) return null;
if ((actor + reorder) % numActors >= offsetDefs.Count) return null;
return offsetDefs[(actor + reorder) % numActors].FindOffset(pawn); return offsetDefs[(actor + reorder) % numActors].FindOffset(pawn);
} }
} }

View File

@ -51,6 +51,23 @@ namespace Rimworld_Animations {
} }
} }
public int AnimationLength
{
get
{
if (!IsAnimating) return 0;
int groupAnimLength = 0;
foreach(AnimationDef anim in animationQueue)
{
groupAnimLength += anim.durationTicks;
}
return groupAnimLength;
}
}
public Vector3 getAnchor() public Vector3 getAnchor()
{ {
return anchor.getDrawPos(); return anchor.getDrawPos();
@ -153,6 +170,10 @@ namespace Rimworld_Animations {
{ {
PawnRenderNodeProperties props = animationProp.animPropProperties; PawnRenderNodeProperties props = animationProp.animPropProperties;
if (props.texPath.NullOrEmpty())
{
props.texPath = "AnimationProps/Banana/Banana";
}
//create new render node //create new render node
PawnRenderNode animRenderNode = (PawnRenderNode)Activator.CreateInstance(props.nodeClass, new object[] { PawnRenderNode animRenderNode = (PawnRenderNode)Activator.CreateInstance(props.nodeClass, new object[] {

View File

@ -37,7 +37,7 @@ namespace Rimworld_Animations {
bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie; bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie;
int preAnimDuration = __instance.duration; int preAnimDuration = __instance.duration;
int AnimationTimeTicks = 0;
List<Pawn> participants = partnerSexBaseReceiver.parteners.Append(partner).ToList(); List<Pawn> participants = partnerSexBaseReceiver.parteners.Append(partner).ToList();
@ -45,16 +45,16 @@ namespace Rimworld_Animations {
if (groupAnimation != null) if (groupAnimation != null)
{ {
AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder, partner); AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder, partner);
} int animTicks = AnimationUtility.GetAnimationLength(pawn);
//Modify Orgasm ticks to only orgasm as many times as RJW stock orgasm allows foreach(Pawn participant in participants)
if (AnimationTimeTicks != 0) {
{ (participant.jobs.curDriver as JobDriver_Sex).ticks_left = animTicks;
__instance.orgasmstick = preAnimDuration * __instance.orgasmstick / AnimationTimeTicks; (participant.jobs.curDriver as JobDriver_Sex).sex_ticks = animTicks;
(participant.jobs.curDriver as JobDriver_Sex).orgasmStartTick = animTicks;
(participant.jobs.curDriver as JobDriver_Sex).duration = animTicks;
}
} }
} }
} }

View File

@ -0,0 +1,39 @@
using HarmonyLib;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
[HarmonyPatch(typeof(JobDriver_Sex), "Animate")]
public class HarmonyPatch_Animate
{
public static bool Prefix(ref JobDriver_Sex __instance, ref Pawn pawn, ref Thing target)
{
//remove all bumping stuff in animations; keep draw nude code
if (target != null)
{
Pawn pawn2 = target as Pawn;
if (!__instance.isEndytophile)
{
SexUtility.DrawNude(pawn, false);
if (pawn2 != null)
{
SexUtility.DrawNude(pawn2, false);
return false;
}
}
}
else if (!__instance.isEndytophile)
{
SexUtility.DrawNude(pawn, false);
}
return false;
}
}
}

View File

@ -1,8 +1,10 @@
using HarmonyLib; using HarmonyLib;
using RimWorld;
using rjw; using rjw;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection.Emit;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Verse.AI; using Verse.AI;
@ -19,5 +21,32 @@ namespace Rimworld_Animations
AnimationUtility.StopGroupAnimation(__instance.pawn); AnimationUtility.StopGroupAnimation(__instance.pawn);
}); });
} }
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> codeInstructions)
{
var ins = codeInstructions.ToList();
for (int i = 0; i < ins.Count; i++)
{
if (i < ins.Count && ins[i].opcode == OpCodes.Call && ins[i].OperandIs(AccessTools.DeclaredMethod(typeof(Toils_LayDown), "LayDown")))
{
ins[i].operand = AccessTools.DeclaredMethod(typeof(HarmonyPatch_JobDriver_SexBaseReceiverLoved), "DoNotLayDown");
yield return ins[i];
}
else
{
yield return ins[i];
}
}
}
public static Toil DoNotLayDown(TargetIndex bedOrRestSpotIndex, bool hasBed, bool lookForOtherJobs, bool canSleep = true, bool gainRestAndHealth = true, PawnPosture noBedLayingPosture = PawnPosture.LayingMask, bool deathrest = false)
{
return new Toil();
}
} }
} }

View File

@ -38,9 +38,19 @@ namespace Rimworld_Animations
* Set Render Node to absolute position * Set Render Node to absolute position
*/ */
if (node.Props is PawnRenderNodeProperties_GraphicVariants graphicVariantProp if (node.Props is PawnRenderNodeProperties_GraphicVariants graphicVariantProp
&& graphicVariantProp.absolutePosition) && graphicVariantProp.absoluteTransform)
{ {
matrix = parms.matrix; matrix = parms.matrix;
//absolute transform -- just use the node's transform, not its ancestors
node.GetTransform(parms, out Vector3 offset, out Vector3 pivot, out Quaternion quaternion, out Vector3 scale);
if (offset != Vector3.zero) matrix *= Matrix4x4.Translate(offset);
if (pivot != Vector3.zero) matrix *= Matrix4x4.Translate(pivot);
if (quaternion != Quaternion.identity) matrix *= Matrix4x4.Rotate(quaternion);
if (scale != Vector3.one) matrix *= Matrix4x4.Scale(scale);
if (pivot != Vector3.zero) matrix *= Matrix4x4.Translate(scale).inverse;
float num = node.Worker.AltitudeFor(node, parms); float num = node.Worker.AltitudeFor(node, parms);
if (num != 0f) if (num != 0f)
{ {

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class PawnRenderNodeProperties_GraphicHediffVariants : PawnRenderNodeProperties_GraphicVariants
{
public List<TexPathVariants_Hediff> hediffVariants;
}
public class TexPathVariants_Hediff
{
public List<HediffDef> hediffs;
public TexPathVariantsDef texPathVariantsDef;
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Rimworld_Animations
{
public class PawnRenderNodeWorker_GraphicHediffVariants : PawnRenderNodeWorker_GraphicVariants
{
//same functionality as graphicvariants worker
//just here for readability
}
}

View File

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class PawnRenderNode_GraphicHediffVariants : PawnRenderNode_GraphicVariants
{
protected new PawnRenderNodeProperties_GraphicHediffVariants props;
private HediffDef curHediff;
public PawnRenderNode_GraphicHediffVariants(Pawn pawn, PawnRenderNodeProperties props, PawnRenderTree tree) : base(pawn, props, tree)
{
this.props = (PawnRenderNodeProperties_GraphicHediffVariants)props;
}
protected override Dictionary<int, Graphic> GraphicVariantsFor(Pawn pawn)
{
//for each different hediff-based texpathvariants,
foreach (TexPathVariants_Hediff texPathVariant_Hediff in props.hediffVariants)
{
//for all the hediffs corresponding to that texpathvariant,
foreach (HediffDef hediffDef in texPathVariant_Hediff.hediffs)
{
//if the pawn has that hediff,
if (pawn.health.hediffSet.hediffs.Any((Hediff hediff) => hediff.def == hediffDef))
{
//return that specific variant
curHediff = hediff.def;
return GenerateVariants(pawn, texPathVariant_Hediff.texPathVariantsDef);
}
}
}
//otherwise just use default
curHediff = null;
return base.GraphicVariantsFor(pawn);
}
protected override void EnsureMaterialsInitialized()
{
//if pawn no longer has the hediff,
if (curHediff == null ||
(this.tree.pawn.health?.hediffSet?.hediffs is List<Hediff> hediffs
&& hediffs.Any((Hediff hediff) => hediff.def == curHediff)))
{
//redo graphicvariantsfor
variants = GraphicVariantsFor(this.tree.pawn);
}
base.EnsureMaterialsInitialized();
}
}
}

View File

@ -10,8 +10,8 @@ namespace Rimworld_Animations
public class PawnRenderNodeProperties_GraphicVariants : PawnRenderNodeProperties public class PawnRenderNodeProperties_GraphicVariants : PawnRenderNodeProperties
{ {
public List<string> texPathVariants; public TexPathVariantsDef texPathVariantsDef;
public bool absolutePosition = false; public bool absoluteTransform = false;
} }
} }

View File

@ -13,6 +13,8 @@ namespace Rimworld_Animations
public override bool CanDrawNow(PawnRenderNode node, PawnDrawParms parms) public override bool CanDrawNow(PawnRenderNode node, PawnDrawParms parms)
{ {
if (!base.CanDrawNow(node, parms)) return false;
if (parms.Portrait) return false; if (parms.Portrait) return false;
//don't draw if not visible at tick //don't draw if not visible at tick
@ -23,21 +25,25 @@ namespace Rimworld_Animations
} }
return base.CanDrawNow(node, parms); return true;
} }
protected override Material GetMaterial(PawnRenderNode node, PawnDrawParms parms) protected override Material GetMaterial(PawnRenderNode node, PawnDrawParms parms)
{ {
//if node is animating, and is a graphic variant type of node //if node is animating, and is a graphic variant type of node
if ((node.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker) if ((node.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker)
//and node is one with graphic variants
&& (node is PawnRenderNode_GraphicVariants nodeWithGraphicVariants) && (node is PawnRenderNode_GraphicVariants nodeWithGraphicVariants)
//and texpathvariant is set
&& extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick) != null) && extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick) != null)
{ {
//if node has a graphic variant, Material materialVariant = GetMaterialVariant(nodeWithGraphicVariants, parms, (int)extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick));
int variant = (int)extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick); if (materialVariant != null) {
return materialVariant;
//return the variant }
return GetMaterialVariant(nodeWithGraphicVariants, parms, variant);
} }
//otherwise return original texture //otherwise return original texture
@ -47,6 +53,9 @@ namespace Rimworld_Animations
public virtual Material GetMaterialVariant(PawnRenderNode_GraphicVariants node, PawnDrawParms parms, int variant) public virtual Material GetMaterialVariant(PawnRenderNode_GraphicVariants node, PawnDrawParms parms, int variant)
{ {
Material material = node.getGraphicVariant(variant).NodeGetMat(parms); Material material = node.getGraphicVariant(variant).NodeGetMat(parms);
if (material == null) return null;
if (material != null && !parms.Portrait && parms.flags.FlagSet(PawnRenderFlags.Invisible)) if (material != null && !parms.Portrait && parms.flags.FlagSet(PawnRenderFlags.Invisible))
{ {
material = InvisibilityMatPool.GetInvisibleMat(material); material = InvisibilityMatPool.GetInvisibleMat(material);

View File

@ -11,11 +11,17 @@ namespace Rimworld_Animations
public class PawnRenderNode_GraphicVariants : PawnRenderNode public class PawnRenderNode_GraphicVariants : PawnRenderNode
{ {
private new PawnRenderNodeProperties_GraphicVariants props; protected new PawnRenderNodeProperties_GraphicVariants props;
private Dictionary<int, Graphic> variants; protected Dictionary<int, Graphic> variants;
public Graphic getGraphicVariant(int variant) public Graphic getGraphicVariant(int variant)
{ {
if (!variants.ContainsKey(variant))
{
Log.ErrorOnce("[Anims] Error: tried to get key from variants that doesn't exist; key = " + variant, 2043428111);
return null;
}
return variants[variant]; return variants[variant];
} }
@ -38,14 +44,24 @@ namespace Rimworld_Animations
protected virtual Dictionary<int, Graphic> GraphicVariantsFor(Pawn pawn) protected virtual Dictionary<int, Graphic> GraphicVariantsFor(Pawn pawn)
{ {
return GenerateVariants(pawn, props.texPathVariantsDef);
}
protected Dictionary<int, Graphic> GenerateVariants(Pawn pawn, TexPathVariantsDef texPathVariants)
{
Dictionary<int, Graphic> variantGraphics = new Dictionary<int, Graphic>(); Dictionary<int, Graphic> variantGraphics = new Dictionary<int, Graphic>();
Shader shader = this.ShaderFor(pawn);
if (texPathVariants == null) return variantGraphics;
//for each graphic variant //for each graphic variant
for (int i = 0; i < props.texPathVariants.Count; i++) for (int i = 0; i < texPathVariants.variants.Count; i++)
{ {
//get new graphic //get new graphic
Graphic variant = GraphicDatabase.Get<Graphic_Multi>(props.texPathVariants[i], shader, Vector2.one, this.ColorFor(pawn)); Graphic variant = GraphicDatabase.Get<Graphic_Multi>(texPathVariants.variants[i], this.ShaderFor(pawn), Vector2.one, this.ColorFor(pawn));
//add it to the variants dictionary; i + 1 for easier readability in logs //add it to the variants dictionary; i + 1 for easier readability in logs
variantGraphics.Add(i + 1, variant); variantGraphics.Add(i + 1, variant);
@ -53,6 +69,7 @@ namespace Rimworld_Animations
} }
return variantGraphics; return variantGraphics;
} }

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class TexPathVariantsDef : Def
{
public List<string> variants;
}
}

View File

@ -95,5 +95,11 @@ namespace Rimworld_Animations {
} }
public static int GetAnimationLength(Pawn pawn)
{
return pawn.TryGetComp<CompExtendedAnimator>().AnimationLength;
}
} }
} }

View File

@ -46,6 +46,7 @@
</Reference> </Reference>
<Reference Include="RJW"> <Reference Include="RJW">
<HintPath>..\rjw\1.5\Assemblies\RJW.dll</HintPath> <HintPath>..\rjw\1.5\Assemblies\RJW.dll</HintPath>
<Private>False</Private>
</Reference> </Reference>
<Reference Include="RJW-ToysAndMasturbation"> <Reference Include="RJW-ToysAndMasturbation">
<HintPath>..\rjw-toys-and-masturbation\Assemblies\RJW-ToysAndMasturbation.dll</HintPath> <HintPath>..\rjw-toys-and-masturbation\Assemblies\RJW-ToysAndMasturbation.dll</HintPath>
@ -104,17 +105,22 @@
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderTree.cs" /> <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderTree.cs" />
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Pawn_DrawTracker.cs" /> <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Pawn_DrawTracker.cs" />
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Thing.cs" /> <Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Thing.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\HarmonyPatch_PlaySexSounds.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\JobDriver_Sex\HarmonyPatch_Animate.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\HarmonyPatch_SexTick.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\JobDriver_Sex\HarmonyPatch_PlaySexSounds.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\JobDriver_Sex\HarmonyPatch_SexTick.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\HarmonyPatch_WorkGiverSex.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\HarmonyPatch_WorkGiverSex.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_JoinInBed.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_JoinInBed.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_Sex.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_Sex.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseInitiator.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseInitiator.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\SexBaseReceivers\HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\SexBaseReceivers\HarmonyPatch_JobDriver_SexBaseReceiverRaped.cs" />
<Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\SexBaseReceivers\HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs" /> <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\SexBaseReceivers\HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs" />
<Compile Include="1.5\Source\PawnRenderNode\GraphicHediffVariants\PawnRenderNodeProperties_GraphicHediffVariants.cs" />
<Compile Include="1.5\Source\PawnRenderNode\GraphicHediffVariants\PawnRenderNodeWorker_GraphicHediffVariants.cs" />
<Compile Include="1.5\Source\PawnRenderNode\GraphicHediffVariants\PawnRenderNode_GraphicHediffVariants.cs" />
<Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNodeProperties_GraphicVariants.cs" /> <Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNodeProperties_GraphicVariants.cs" />
<Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNodeWorker_GraphicVariants.cs" /> <Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNodeWorker_GraphicVariants.cs" />
<Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNode_GraphicVariants.cs" /> <Compile Include="1.5\Source\PawnRenderNode\GraphicVariants\PawnRenderNode_GraphicVariants.cs" />
<Compile Include="1.5\Source\PawnRenderNode\TexPathVariants.cs" />
<Compile Include="1.5\Source\RenderSubWorkers\PawnRenderSubWorker_ChangeOffset.cs" /> <Compile Include="1.5\Source\RenderSubWorkers\PawnRenderSubWorker_ChangeOffset.cs" />
<Compile Include="1.5\Source\Settings\AnimationSettings.cs" /> <Compile Include="1.5\Source\Settings\AnimationSettings.cs" />
<Compile Include="1.5\Source\Utilities\AnimationUtility.cs" /> <Compile Include="1.5\Source\Utilities\AnimationUtility.cs" />
@ -126,11 +132,17 @@
<Content Include="1.5\Assemblies\RJW.dll" /> <Content Include="1.5\Assemblies\RJW.dll" />
<Content Include="1.5\Defs\AnimationDefs\TestAnimation1.xml" /> <Content Include="1.5\Defs\AnimationDefs\TestAnimation1.xml" />
<Content Include="1.5\Defs\AnimationDefs\TestAnimation2.xml" /> <Content Include="1.5\Defs\AnimationDefs\TestAnimation2.xml" />
<Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef.xml" /> <Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Xray_Inside.xml" />
<Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Banana.xml" />
<Content Include="1.5\Defs\AnimationPropDefs\AnimationPropDef_Xray_Penis.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\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\Defs\TexPathVariantsDefs\TexPathVariants_Cat.xml" />
<Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_Xray_Inside.xml" />
<Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_XrayPenis_Horse.xml" />
<Content Include="1.5\Defs\TexPathVariantsDefs\TexPathVariants_XrayPenis_Human.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" />
<Content Include="1.5\Patches\AnimationPatch_PawnRenderTree_OffsetSubWorker.xml" /> <Content Include="1.5\Patches\AnimationPatch_PawnRenderTree_OffsetSubWorker.xml" />