diff --git a/1.2/Assemblies/Rimworld-Animations.dll b/1.2/Assemblies/Rimworld-Animations.dll index 77ee47d..57a3061 100644 Binary files a/1.2/Assemblies/Rimworld-Animations.dll and b/1.2/Assemblies/Rimworld-Animations.dll differ diff --git a/Source/Comps/CompBodyAnimator.cs b/Source/Comps/CompBodyAnimator.cs index 33bd110..0a9dc90 100644 --- a/Source/Comps/CompBodyAnimator.cs +++ b/Source/Comps/CompBodyAnimator.cs @@ -29,6 +29,7 @@ namespace Rimworld_Animations { SexUtility.DrawNude(pawn); } else { pawn.Drawer.renderer.graphics.ResolveAllGraphics(); + actorsInCurrentAnimation = null; } PortraitsCache.SetDirty(pawn); @@ -48,6 +49,8 @@ namespace Rimworld_Animations { public float bodyAngle = 0, headAngle = 0, genitalAngle = 0; public Rot4 headFacing = Rot4.North, bodyFacing = Rot4.North; + public List actorsInCurrentAnimation; + public bool controlGenitalAngle = false; private AnimationDef anim; @@ -102,8 +105,9 @@ namespace Rimworld_Animations { anchor = thing.Position.ToVector3Shifted(); } } - public void StartAnimation(AnimationDef anim, 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) { + actorsInCurrentAnimation = actors; AlienRaceOffset raceOffset = anim?.actors[actor]?.raceOffsets?.Find(x => x.defName == pawn.def.defName); if (raceOffset != null) { @@ -198,7 +202,7 @@ namespace Rimworld_Animations { if (animTicks < anim.animationTimeTicks) { tickStage(); } else { - + isAnimating = false; } } @@ -326,7 +330,6 @@ namespace Rimworld_Animations { } - public AnimationDef CurrentAnimation { get { return anim; @@ -370,5 +373,18 @@ namespace Rimworld_Animations { Scribe_Values.Look(ref quiver, "orgasmQuiver"); } + public void shiftActorPositionAndRestartAnimation() { + actor = (actor == anim.actors.Count - 1 ? 0 : actor + 1); + + curStage = 0; + animTicks = 0; + stageTicks = 0; + clipTicks = 0; + + controlGenitalAngle = anim.actors[actor].controlGenitalAngle; + + tickAnim(); + } + } } diff --git a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs index 4b76b17..420e53b 100644 --- a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs +++ b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs @@ -11,7 +11,7 @@ namespace Rimworld_Animations { class MainTabWindow_OffsetConfigure : MainTabWindow { - public override Vector2 RequestedTabSize => new Vector2(505, 340); + public override Vector2 RequestedTabSize => new Vector2(505, 380); public override void DoWindowContents(Rect inRect) { Rect position = new Rect(inRect.x, inRect.y, inRect.width, inRect.height); @@ -20,7 +20,7 @@ namespace Rimworld_Animations { Listing_Standard listingStandard = new Listing_Standard(); listingStandard.Begin(position); - listingStandard.Label("Offset Manager"); + listingStandard.Label("Animation Manager"); listingStandard.GapLine(); @@ -72,6 +72,20 @@ namespace Rimworld_Animations { rotation = 0; } + listingStandard.GapLine(); + + if(listingStandard.ButtonText("Shift Actors")) { + + if(AnimationSettings.debugMode) { + Log.Message("Shifting actors in animation..."); + } + + for(int i = 0; i < curPawn.TryGetComp().actorsInCurrentAnimation.Count; i++) { + curPawn.TryGetComp().actorsInCurrentAnimation[i].TryGetComp()?.shiftActorPositionAndRestartAnimation(); + } + + } + if (offsetX != AnimationSettings.offsets[def.defName + curPawn.def.defName + ActorIndex].x || offsetZ != AnimationSettings.offsets[def.defName + curPawn.def.defName + ActorIndex].y) { AnimationSettings.offsets[def.defName + curPawn.def.defName + ActorIndex] = new Vector2(offsetX, offsetZ); diff --git a/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs index b3a6e88..c4813f0 100644 --- a/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs +++ b/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs @@ -102,7 +102,7 @@ namespace Rimworld_Animations { } bool shiver = pawnsToAnimate[i].jobs.curDriver is JobDriver_SexBaseRecieverRaped; - pawnsToAnimate[i].TryGetComp().StartAnimation(anim, i, mirror, shiver, fastAnimForQuickie); + pawnsToAnimate[i].TryGetComp().StartAnimation(anim, pawnsToAnimate, i, mirror, shiver, fastAnimForQuickie); (pawnsToAnimate[i].jobs.curDriver as JobDriver_Sex).ticks_left = anim.animationTimeTicks; (pawnsToAnimate[i].jobs.curDriver as JobDriver_Sex).ticksLeftThisToil = anim.animationTimeTicks; (pawnsToAnimate[i].jobs.curDriver as JobDriver_Sex).duration = anim.animationTimeTicks;