From e8fd61fb4ae83cd91eaa580ded946efc059dddb1 Mon Sep 17 00:00:00 2001 From: c0ffee Date: Tue, 16 Apr 2024 15:10:46 -0700 Subject: [PATCH] Rewrote anim framework to use vanilla animation system - added extended functionality for head rotations, invisible - tentative design for groupanimationdefs --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 18944 -> 21504 bytes 1.5/Defs/AnimationDefs/TestAnimation1.xml | 114 ++++++++++++++++++ 1.5/Defs/AnimationDefs/TestAnimation2.xml | 60 +++++++++ .../TestGroupAnimation1.xml | 88 ++++++++++++++ 1.5/Patches/Patch_GenitaliaRenderNode.xml | 16 +++ .../AnimationWorker_KeyframesExtended.cs | 108 +++++++++++++++++ 1.5/Source/Defs/AnimationDefOf.cs | 22 ++++ .../GroupAnimationStages/AnimationStage.cs | 13 ++ 1.5/Source/Keyframes/ExtendedKeyframe.cs | 18 +++ .../JobDrivers/HarmonyPatch_JobDriver_Sex.cs | 24 ++++ ...HarmonyPatch_JobDriver_SexBaseInitiator.cs | 23 ++-- .../HarmonyPatch_PawnRenderNode.cs | 45 +++++++ .../HarmonyPatch_Pawn_DrawTracker.cs | 27 +++++ .../Assemblies/Patch_SexToysMasturbation.dll | Bin 5120 -> 5120 bytes Rimworld-Animations.csproj | 20 ++- 15 files changed, 561 insertions(+), 17 deletions(-) create mode 100644 1.5/Defs/AnimationDefs/TestAnimation1.xml create mode 100644 1.5/Defs/AnimationDefs/TestAnimation2.xml create mode 100644 1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml create mode 100644 1.5/Patches/Patch_GenitaliaRenderNode.xml create mode 100644 1.5/Source/AnimationWorkers/AnimationWorker_KeyframesExtended.cs create mode 100644 1.5/Source/Defs/AnimationDefOf.cs create mode 100644 1.5/Source/GroupAnimationStages/AnimationStage.cs create mode 100644 1.5/Source/Keyframes/ExtendedKeyframe.cs create mode 100644 1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_Sex.cs create mode 100644 1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs create mode 100644 1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index 93d79897042d422c7a856f0ae209e8659f0f2085..634cfa93563cced5a2c595f3f14c72e54f2b243d 100644 GIT binary patch literal 21504 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 delta 8201 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 + + + TestAnimation1 + 400 + False + +
  • + Pawn +
  • +
    + + +
  • + Root + + Rimworld_Animations.AnimationWorker_KeyframesExtended + +
  • + 30 + 0 + North + true +
  • +
  • + 100 + 0 + East + true +
  • +
  • + 200 + 0 + South + true +
  • +
  • + 300 + 0 + West + true +
  • + + + + +
  • + Head + + Rimworld_Animations.AnimationWorker_KeyframesExtended + +
  • + 0 + 0 + North + true +
  • +
  • + 2 + 0 + East + true +
  • +
  • + 4 + 0 + South + true +
  • +
  • + 6 + 0 + West + false +
  • +
  • + 8 + 0 + North + false +
  • + + + +
    +
    +
    diff --git a/1.5/Defs/AnimationDefs/TestAnimation2.xml b/1.5/Defs/AnimationDefs/TestAnimation2.xml new file mode 100644 index 0000000..712cb2c --- /dev/null +++ b/1.5/Defs/AnimationDefs/TestAnimation2.xml @@ -0,0 +1,60 @@ + + + + TestAnimation2 + 200 + False + False + + +
  • + Root + + AnimationWorker_Keyframes + +
  • + 0 + 23 +
  • +
  • + 6 + -5 +
  • +
  • + 12 + 4 +
  • +
  • + 188 + -1 +
  • + + + +
  • + Head + + AnimationWorker_Keyframes + +
  • + 0 + 5 +
  • +
  • + 6 + -5 +
  • +
  • + 12 + 4 +
  • +
  • + 128 + -1 +
  • + + + +
    +
    +
    diff --git a/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml b/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml new file mode 100644 index 0000000..297e28e --- /dev/null +++ b/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml @@ -0,0 +1,88 @@ + + + + TestGroupAnimation1 + 2 + + +
  • + 200 + +
  • Pawn1_Stage1_TestAnimation1
  • +
  • Pawn2_Stage1_TestAnimation2
  • + + +
  • + 10 + +
  • + 3 +
  • Pawn1_Stage2_Variant1
  • +
  • Pawn2_Stage2_Variant1
  • + + +
  • + 1 +
  • Pawn1_Stage2_Variant2
  • +
  • Pawn2_Stage2_Variant2
  • + + + + +
  • + +
  • + 10 + +
  • + 3 +
  • Pawn1_Stage2_Variant1
  • +
  • Pawn2_Stage2_Variant1
  • + + +
  • + 1 +
  • Pawn1_Stage2_Variant2
  • +
  • Pawn2_Stage2_Variant2
  • + + + + +
  • + 10 + +
  • + 3 +
  • Pawn1_Stage2_Variant1
  • +
  • Pawn2_Stage2_Variant1
  • + + +
  • + 1 +
  • Pawn1_Stage2_Variant2
  • +
  • Pawn2_Stage2_Variant2
  • + + + + + + +
    + + +
  • + +
  • Sex
  • + + 0 + +
  • + +
  • Sex_Reverse
  • + + 1 + +
    + +
    +
    diff --git a/1.5/Patches/Patch_GenitaliaRenderNode.xml b/1.5/Patches/Patch_GenitaliaRenderNode.xml new file mode 100644 index 0000000..553374a --- /dev/null +++ b/1.5/Patches/Patch_GenitaliaRenderNode.xml @@ -0,0 +1,16 @@ + + + + diff --git a/1.5/Source/AnimationWorkers/AnimationWorker_KeyframesExtended.cs b/1.5/Source/AnimationWorkers/AnimationWorker_KeyframesExtended.cs new file mode 100644 index 0000000..50af003 --- /dev/null +++ b/1.5/Source/AnimationWorkers/AnimationWorker_KeyframesExtended.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace Rimworld_Animations +{ + class AnimationWorker_KeyframesExtended : AnimationWorker_Keyframes + { + + public AnimationWorker_KeyframesExtended(AnimationDef def, Pawn pawn, AnimationPart part, PawnRenderNode node) : base(def, pawn, part, node) + { + } + + + + //use extendedkeyframes to determine addon facing + public Rot4 facingAtTick(int tick) + { + //if ticks are < first keyframe tick, just be stuck to first keyframe rot + if (tick <= this.part.keyframes[0].tick) { + + return (this.part.keyframes[0] as ExtendedKeyframe).rotation; + + } + + //if ticks are > last keyframe tick, just be stuck to last keyframe rot + if (tick >= this.part.keyframes[this.part.keyframes.Count - 1].tick) + { + + return (this.part.keyframes[this.part.keyframes.Count - 1] as ExtendedKeyframe).rotation; + + } + Verse.Keyframe keyframe = this.part.keyframes[0]; + Verse.Keyframe keyframe2 = this.part.keyframes[this.part.keyframes.Count - 1]; + int i = 0; + while (i < this.part.keyframes.Count) + { + if (tick <= this.part.keyframes[i].tick) + { + keyframe2 = this.part.keyframes[i]; + if (i > 0) + { + keyframe = this.part.keyframes[i - 1]; + break; + } + break; + } + else + { + i++; + } + } + + return (keyframe as ExtendedKeyframe).rotation; + + } + + + public bool visibleAtTick(int tick) + { + //if ticks are < first keyframe tick, just be stuck to first keyframe rot + if (tick <= this.part.keyframes[0].tick) + { + + return (this.part.keyframes[0] as ExtendedKeyframe).visible; + + } + + //if ticks are > last keyframe tick, just be stuck to last keyframe rot + if (tick >= this.part.keyframes[this.part.keyframes.Count - 1].tick) + { + + return (this.part.keyframes[this.part.keyframes.Count - 1] as ExtendedKeyframe).visible; + + } + + Verse.Keyframe keyframe = this.part.keyframes[0]; + Verse.Keyframe keyframe2 = this.part.keyframes[this.part.keyframes.Count - 1]; + + int i = 0; + while (i < this.part.keyframes.Count) + { + if (tick <= this.part.keyframes[i].tick) + { + keyframe2 = this.part.keyframes[i]; + if (i > 0) + { + keyframe = this.part.keyframes[i - 1]; + break; + } + break; + } + else + { + i++; + } + } + + return (keyframe as ExtendedKeyframe).visible; + + + } + } +} diff --git a/1.5/Source/Defs/AnimationDefOf.cs b/1.5/Source/Defs/AnimationDefOf.cs new file mode 100644 index 0000000..9c62e50 --- /dev/null +++ b/1.5/Source/Defs/AnimationDefOf.cs @@ -0,0 +1,22 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + [DefOf] + public static class AnimationDefOf + { + static AnimationDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(SoundDefOf)); + } + + public static AnimationDef TestAnimation1; + public static AnimationDef TestAnimation2; + } +} diff --git a/1.5/Source/GroupAnimationStages/AnimationStage.cs b/1.5/Source/GroupAnimationStages/AnimationStage.cs new file mode 100644 index 0000000..f8a22e0 --- /dev/null +++ b/1.5/Source/GroupAnimationStages/AnimationStage.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rimworld_Animations +{ + public abstract class AnimationStage + { + //single stage containing group of animations + } +} diff --git a/1.5/Source/Keyframes/ExtendedKeyframe.cs b/1.5/Source/Keyframes/ExtendedKeyframe.cs new file mode 100644 index 0000000..ff23cab --- /dev/null +++ b/1.5/Source/Keyframes/ExtendedKeyframe.cs @@ -0,0 +1,18 @@ +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 ExtendedKeyframe : Verse.Keyframe + { + + public Rot4 rotation; + public bool visible; + + } +} diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_Sex.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_Sex.cs new file mode 100644 index 0000000..f18dbcf --- /dev/null +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_Sex.cs @@ -0,0 +1,24 @@ +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), "SexTick")] + public class HarmonyPatch_JobDriver_Sex + { + public static void Prefix(JobDriver_Sex __instance) + { + Pawn partner = __instance.Partner; + + } + } + + */ +} diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs index 56d756c..9f11a1c 100644 --- a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs @@ -16,7 +16,9 @@ namespace Rimworld_Animations { don't play anim for now */ if(__instance is JobDriver_Masturbate || __instance is JobDriver_ViolateCorpse) { + return; + } if(!AnimationSettings.PlayAnimForNonsexualActs && NonSexualAct(__instance)) @@ -25,10 +27,10 @@ namespace Rimworld_Animations { } Pawn pawn = __instance.pawn; - + Pawn partner = __instance.Target as Pawn; Building_Bed bed = __instance.Bed; - if ((__instance.Target as Pawn)?.jobs?.curDriver is JobDriver_SexBaseReciever) { + if (partner?.jobs?.curDriver is JobDriver_SexBaseReciever partnerSexBaseReceiver) { Pawn Target = __instance.Target as Pawn; @@ -37,17 +39,12 @@ namespace Rimworld_Animations { int preAnimDuration = __instance.duration; int AnimationTimeTicks = 0; - - if (bed != null) { - RerollAnimations(bed as Thing); - } - else { - RerollAnimations(); - } + List participants = partnerSexBaseReceiver.parteners.Append(partner).ToList(); + RerollAnimations(participants); //Modify Orgasm ticks to only orgasm as many times as RJW stock orgasm allows - if(AnimationTimeTicks != 0) + if (AnimationTimeTicks != 0) { __instance.orgasmstick = preAnimDuration * __instance.orgasmstick / AnimationTimeTicks; } @@ -56,9 +53,11 @@ namespace Rimworld_Animations { } } - public static void RerollAnimations(Thing bed = null) { + public static void RerollAnimations(List participants) { + + participants[0].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation1); + participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2); - } diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs new file mode 100644 index 0000000..fe6c81a --- /dev/null +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs @@ -0,0 +1,45 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + //Head Rotation Code + [HarmonyPatch(typeof(PawnRenderNode), "AppendRequests")] + public static class HarmonyPatch_PawnRenderNode + { + //if rendernodetag is head, update PawnDrawParms so that head, and all children, are rotated for anim + public static bool Prefix(ref PawnRenderNode __instance, ref PawnDrawParms parms) + { + if (__instance.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker) + { + //INVIS IF ANIM CALLS FOR IT + if (!extendedAnimWorker.visibleAtTick(__instance.tree.AnimationTick)) + { + __instance.requestRecache = true; + return false; + } + + + // HEAD ROTATION ADJUST FACING + 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; + } + + } + + return true; + + } + } +} diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs new file mode 100644 index 0000000..b02b20a --- /dev/null +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs @@ -0,0 +1,27 @@ +using HarmonyLib; +using rjw; +using UnityEngine; +using Verse; + +namespace Rimworld_Animations { + + [HarmonyPatch(typeof(Pawn_DrawTracker), "DrawPos", MethodType.Getter)] + public static class HarmonyPatch_Pawn_DrawTracker { + public static bool Prefix(ref Pawn ___pawn, ref Vector3 __result) { + + if (___pawn?.Drawer?.renderer?.renderTree?.rootNode?.AnimationWorker is AnimationWorker_KeyframesExtended + && ___pawn.jobs?.curDriver is JobDriver_SexBaseInitiator sexdriver) + { + //align pos on top of partner + __result = sexdriver.Partner.Drawer.DrawPos; + + //change height so that they're all layered properly + if (sexdriver.Partner.jobs.curDriver is JobDriver_SexBaseReciever) + for (int i = 0; i < ) + return false; + } + + return true; + } + } +} diff --git a/Patch_SexToysMasturbation/1.5/Assemblies/Patch_SexToysMasturbation.dll b/Patch_SexToysMasturbation/1.5/Assemblies/Patch_SexToysMasturbation.dll index 858a7e1395ba576e1f1603f1f75284ce778a8913..e21340145df82a2c120b0fcd500136f6b5ff17d2 100644 GIT binary patch delta 47 zcmV+~0MP${D1a!Chy)RN_mi=V@C5{?B93CSfCdZ&5E1Sy1n{?=MTj|Uh@6uaBeR?f FWC+8y5@i4Y delta 47 zcmV+~0MP${D1a!Chy=eRJIAq%@C5{ + + + + + + + @@ -90,10 +97,16 @@ - + + + + + + + @@ -133,10 +146,7 @@ - - - - +