diff --git a/1.3/Assemblies/Rimworld-Animations.dll b/1.3/Assemblies/Rimworld-Animations.dll index cf307d7..d7b82d5 100644 Binary files a/1.3/Assemblies/Rimworld-Animations.dll and b/1.3/Assemblies/Rimworld-Animations.dll differ diff --git a/1.3/Source/Comps/CompBodyAnimator.cs b/1.3/Source/Comps/CompBodyAnimator.cs index e0ac52a..3b539b5 100644 --- a/1.3/Source/Comps/CompBodyAnimator.cs +++ b/1.3/Source/Comps/CompBodyAnimator.cs @@ -49,6 +49,8 @@ namespace Rimworld_Animations { public float bodyAngle = 0, headAngle = 0, genitalAngle = 0; public Rot4 headFacing = Rot4.North, bodyFacing = Rot4.North; + public xxx.rjwSextype curSexType; + public List actorsInCurrentAnimation; public bool controlGenitalAngle = false; @@ -111,9 +113,10 @@ namespace Rimworld_Animations { anchor = thing.Position.ToVector3Shifted(); } } - public void StartAnimation(AnimationDef anim, List actors, int actor, bool mirror = false, bool shiver = false, bool fastAnimForQuickie = false) { + public void StartAnimation(AnimationDef anim, List actors, int actor, bool mirror = false, bool shiver = false, bool fastAnimForQuickie = false, xxx.rjwSextype sexType = xxx.rjwSextype.Masturbation) { actorsInCurrentAnimation = actors; + curSexType = sexType; if (anim.actors.Count <= actor) { @@ -497,6 +500,15 @@ namespace Rimworld_Animations { controlGenitalAngle = anim.actors[actor].controlGenitalAngle; tickAnim(); + + //reset the clock time of every pawn in animation + if (pawn.jobs.curDriver is rjw.JobDriver_Sex) + { + (pawn.jobs.curDriver as rjw.JobDriver_Sex).ticks_left = anim.animationTimeTicks; + (pawn.jobs.curDriver as rjw.JobDriver_Sex).ticksLeftThisToil = anim.animationTimeTicks; + (pawn.jobs.curDriver as rjw.JobDriver_Sex).duration = anim.animationTimeTicks; + } + } public bool LoopNeverending() diff --git a/1.3/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs b/1.3/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs index b7fef1d..26df5e1 100644 --- a/1.3/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs +++ b/1.3/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs @@ -51,6 +51,26 @@ namespace Rimworld_Animations { AnimationSettings.rotation.Add(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex, 0); } + List pawnsToAnimateOrdered = curPawn.TryGetComp().actorsInCurrentAnimation.OrderBy(x => Int32.Parse(x.Name.ToStringSafe())).ToList(); + + string pawnNamesAndSexType = ""; + foreach (Pawn p in pawnsToAnimateOrdered) + { + pawnNamesAndSexType += p.Name.ToStringSafe(); + } + pawnNamesAndSexType += curPawn.TryGetComp().curSexType.ToStringSafe(); + + int shiftCount = 0; + + if (AnimationSettings.shiftCount.TryGetValue(pawnNamesAndSexType, out int value)) + { + shiftCount = value; + } + else + { + AnimationSettings.shiftCount.Add(pawnNamesAndSexType, 0); + } + listingStandard.Label("Name: " + curPawn.Name + " Race: " + curPawn.def.defName + " Actor Index: " + curPawn.TryGetComp().ActorIndex + " Body Type (if any): " + bodyTypeDef + " Animation: " + def.label + (curPawn.TryGetComp().Mirror ? " mirrored" : "")); if(curPawn.def.defName == "Human") { @@ -76,32 +96,31 @@ namespace Rimworld_Animations { listingStandard.GapLine(); - if(listingStandard.ButtonText("Shift Actors")) { + if (listingStandard.ButtonText("Shift Actors")) { if(AnimationSettings.debugMode) { Log.Message("Shifting actors in animation..."); } - for(int i = 0; i < curPawn.TryGetComp().actorsInCurrentAnimation.Count; i++) { + AnimationSettings.shiftCount[pawnNamesAndSexType] = shiftCount + 1 % curPawn.TryGetComp().actorsInCurrentAnimation.Count; + + + for (int i = 0; i < curPawn.TryGetComp().actorsInCurrentAnimation.Count; i++) { Pawn actor = curPawn.TryGetComp().actorsInCurrentAnimation[i]; actor.TryGetComp()?.shiftActorPositionAndRestartAnimation(); - //reset the clock time of every pawn in animation - if(actor.jobs.curDriver is rjw.JobDriver_Sex) { - (actor.jobs.curDriver as rjw.JobDriver_Sex).ticks_left = def.animationTimeTicks; - (actor.jobs.curDriver as rjw.JobDriver_Sex).ticksLeftThisToil = def.animationTimeTicks; - (actor.jobs.curDriver as rjw.JobDriver_Sex).duration = def.animationTimeTicks; - } } } + + + if (offsetX != AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].x || offsetZ != AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].y) { AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex] = new Vector2(offsetX, offsetZ); - } if(rotation != AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex]) { diff --git a/1.3/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/1.3/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs index 260d924..bdb1741 100644 --- a/1.3/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs +++ b/1.3/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs @@ -94,6 +94,30 @@ namespace Rimworld_Animations { pawnsToAnimate[i].TryGetComp().isAnimating = false; } + List pawnsToAnimateOrdered = pawnsToAnimate.OrderBy(x => Int32.Parse(x.Name.ToStringSafe())).ToList(); + + string pawnNamesAndSexType = ""; + foreach (Pawn p in pawnsToAnimateOrdered) + { + pawnNamesAndSexType += p.Name.ToStringSafe(); + } + pawnNamesAndSexType += sexType.ToStringSafe(); + + if (AnimationSettings.shiftCount.TryGetValue(pawnNamesAndSexType, out int value)) + { + + Log.Message("Shifting " + pawnNamesAndSexType + " " + value + "times"); + + for(int i = 0; i < value; i++) + { + for(int j = 0; j < pawnsToAnimate.Count; j++) + { + pawnsToAnimate[j].TryGetComp().shiftActorPositionAndRestartAnimation(); + } + + } + } + for (int i = 0; i < pawnsToAnimate.Count; i++) { if (bed != null) @@ -104,7 +128,7 @@ namespace Rimworld_Animations { } bool shiver = pawnsToAnimate[i].jobs.curDriver is JobDriver_SexBaseRecieverRaped; - pawnsToAnimate[i].TryGetComp().StartAnimation(anim, pawnsToAnimate, i, mirror, shiver, fastAnimForQuickie); + pawnsToAnimate[i].TryGetComp().StartAnimation(anim, pawnsToAnimate, i, mirror, shiver, fastAnimForQuickie, sexType); int animTicks = anim.animationTimeTicks - (fastAnimForQuickie ? anim.animationStages[0].playTimeTicks : 0); (pawnsToAnimate[i].jobs.curDriver as JobDriver_Sex).ticks_left = animTicks; diff --git a/1.3/Source/Settings/AnimationSettings.cs b/1.3/Source/Settings/AnimationSettings.cs index 0a96621..6392468 100644 --- a/1.3/Source/Settings/AnimationSettings.cs +++ b/1.3/Source/Settings/AnimationSettings.cs @@ -18,6 +18,7 @@ namespace Rimworld_Animations { public static Dictionary offsets = new Dictionary(); public static Dictionary rotation = new Dictionary(); + public static Dictionary shiftCount = new Dictionary(); public override void ExposeData() { @@ -38,6 +39,7 @@ namespace Rimworld_Animations { Scribe_Collections.Look(ref offsets, "RJWAnimations-animationOffsets"); Scribe_Collections.Look(ref rotation, "RJWAnimations-rotationOffsets"); + Scribe_Collections.Look(ref shiftCount, "RJWAnimations-shiftCount");