various tweaks; portrait fix, pawntest whitelist/blacklist, more fixes for headfacing, granularity for render tree menu

This commit is contained in:
c0ffee 2024-05-04 16:14:52 -07:00
parent bc283ec08e
commit f30a02bcc8
22 changed files with 247 additions and 13 deletions

View File

@ -19,8 +19,8 @@
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
<texPathVariantsDef>TexPathVariants_Cowgirl_Xray</texPathVariantsDef>
<!-- <propOffsetDef>PropOffsetDef_Cowgirl_Xray</propOffsetDef> -->
<!-- <propOffsetDef>Offset_Cowgirl_Top</propOffsetDef> -->
</animPropProperties>

View File

@ -98,6 +98,8 @@
</li>
-->
</contexts>
<offsetDefs>
<li>Offset_Placeholder</li> <!-- first pawn in animation -->
<li>Offset_Cowgirl_Top</li> <!-- second pawn in animation -->

View File

@ -71,6 +71,11 @@
<contexts>
<li Class="Rimworld_Animations.GroupAnimationContext_RJWSex">
<priority>1</priority>
<whitelist>
<li Class="Rimworld_Animations.PawnTest_RJWCanFuck" /> <!-- Corresponds to first pawn in list -->
<li Class="Rimworld_Animations.PawnTest_RJWCanFuck" /> <!-- Corresponds to second pawn in list -->
<li Class="Rimworld_Animations.PawnTest_RJWCanBeFucked" /> <!-- Corresponds to third pawn in list -->
</whitelist>
<actorShift>2</actorShift>
<interactionDefs>
<li>Sex_DoublePenetration</li>
@ -85,6 +90,11 @@
</li>
<li Class="Rimworld_Animations.GroupAnimationContext_RJWSex">
<priority>1</priority>
<whitelist>
<li Class="Rimworld_Animations.PawnTest_RJWCanFuck" />
<li Class="Rimworld_Animations.PawnTest_RJWCanBeFucked" />
<li Class="Rimworld_Animations.PawnTest_RJWCanFuck" />
</whitelist>
<interactionDefs>
<li>Sex_Reverse_DoublePenetration</li>
<li>Sex_Reverse_DoublePenetrationM</li>
@ -115,6 +125,8 @@
</Rimworld_Animations.GroupAnimationDef>
<!-- Branch stages below -->
<Rimworld_Animations.GroupAnimationDef>
<defName>GroupAnimation_DP_Stage2_Branch1</defName>
<numActors>3</numActors>
@ -143,7 +155,6 @@
</Rimworld_Animations.GroupAnimationDef>
<Rimworld_Animations.GroupAnimationDef>
<defName>GroupAnimation_DP_Stage2_Branch2</defName>
<numActors>3</numActors>

View File

@ -11,13 +11,46 @@ namespace Rimworld_Animations
{
public int actorShift = 0;
public int priority = 0;
public List<BasePawnTest> whitelist;
public List<BasePawnTest> blacklist;
public virtual bool CanAnimationBeUsed(List<Pawn> actors, int numActors)
{
if (numActors != actors.Count)
{
return false;
}
if (!whitelist.NullOrEmpty())
{
for (int i = 0; i < whitelist.Count; i++)
{
// check whitelist to make sure pawn can be in this act
//for each whitelist item, pawntest must hold true for that pawn
if (!whitelist[i].PawnTest(actors[i]))
{
return false;
}
}
}
if (!blacklist.NullOrEmpty())
{
for (int i = 0; i < blacklist.Count; i++)
{
// check blacklist to make sure pawn can be in this act
// for each blacklist item, pawntest must hold false for that pawn
if (blacklist[i].PawnTest(actors[i]))
{
return false;
}
}
}
return true;
}
public virtual int AnimationReorder()

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public abstract class BasePawnTest
{
public abstract bool PawnTest(Pawn pawn);
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class PawnTest_Always : BasePawnTest
{
public override bool PawnTest(Pawn pawn)
{
return true;
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class PawnTest_Multi : BasePawnTest
{
public List<BasePawnTest> tests = new List<BasePawnTest>();
public override bool PawnTest(Pawn pawn)
{
//check all different pawn tests in list for pawn
foreach (BasePawnTest test in tests)
{
if (!test.PawnTest(pawn))
{
return false;
}
}
return true;
}
}
}

View File

@ -0,0 +1,18 @@
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class PawnTest_RJWCanBeFucked : BasePawnTest
{
public override bool PawnTest(Pawn pawn)
{
return xxx.can_be_fucked(pawn);
}
}
}

View File

@ -0,0 +1,18 @@
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class PawnTest_RJWCanFuck : BasePawnTest
{
public override bool PawnTest(Pawn pawn)
{
return xxx.can_fuck(pawn);
}
}
}

View File

@ -22,8 +22,8 @@ namespace Rimworld_Animations
public override Vector3 getDrawPos()
{
//vector3.up means stand above the thing
return thing.DrawPos;
//x and z position, regular altitude for pawns
return new Vector3(thing.DrawPos.x, AltitudeLayer.Pawn.AltitudeFor(), thing.DrawPos.z);
}
public override void ExposeData()

View File

@ -16,7 +16,8 @@ namespace Rimworld_Animations
private Vector3 position;
public ExtendedAnimatorAnchor_Vector3(Vector3 position) : base()
{
this.position = position;
//default to altitude for layer for y
this.position = new Vector3(position.x, AltitudeLayer.Pawn.AltitudeFor(), position.z);
}
public override Vector3 getDrawPos()

View File

@ -15,9 +15,23 @@ namespace Rimworld_Animations
public static bool Prefix(ref JobDriver_Sex __instance, ref Pawn pawn, ref Thing target)
{
//remove all bumping stuff in animations; keep draw nude code
__instance.RotatePawns(pawn, __instance.Partner);
if (target != null)
{
Pawn pawn2 = target as Pawn;
if (pawn2 != null && !__instance.Sexprops.isRapist)
{
// if not (pawn has root node and rootnode is animating)
if (!(pawn2?.Drawer?.renderer?.renderTree?.rootNode is PawnRenderNode rootNode
&& (rootNode.AnimationWorker is AnimationWorker_KeyframesExtended || rootNode.children.Any(x => x.AnimationWorker is AnimationWorker_KeyframesExtended))))
{
//play bumpin anim
pawn.Drawer.Notify_MeleeAttackOn(target);
}
}
if (!__instance.isEndytophile)
{
SexUtility.DrawNude(pawn, false);

View File

@ -16,6 +16,7 @@ namespace Rimworld_Animations {
//probably move this setting to a different mod menu if moving rjw parts of code
public static bool playHumanlikeVoicesAsDefault = true;
public static float floatRangeInRenderTreeMenu = 1f;
public static bool offsetTab = false, debugMode = false;
public static float shiverIntensity = 2f;
@ -34,6 +35,7 @@ namespace Rimworld_Animations {
Scribe_Values.Look(ref PlayAnimForNonsexualActs, "RJWAnims-PlayAnimForNonsexualActs");
Scribe_Values.Look(ref soundOverride, "RJWAnimations-rjwAnimSoundOverride", true);
Scribe_Values.Look(ref shiverIntensity, "RJWAnimations-shiverIntensity", 2f);
Scribe_Values.Look(ref floatRangeInRenderTreeMenu, "RJWAnimations-FloatRangeRenderMenu", 1f);
//todo: save offsetsByDefName
}
@ -63,6 +65,9 @@ namespace Rimworld_Animations {
listingStandard.Label("RimAnim_ShiverIntensity".Translate() + RJWAnimationSettings.shiverIntensity);
RJWAnimationSettings.shiverIntensity = listingStandard.Slider(RJWAnimationSettings.shiverIntensity, 0.0f, 12f);
listingStandard.Label("RimAnim_FloatRangeRenderTree".Translate() + RJWAnimationSettings.floatRangeInRenderTreeMenu);
RJWAnimationSettings.floatRangeInRenderTreeMenu = listingStandard.Slider(RJWAnimationSettings.floatRangeInRenderTreeMenu, 0.1f, 12f);
listingStandard.CheckboxLabeled("RimAnim_DebugMode".Translate(), ref RJWAnimationSettings.debugMode);

View File

@ -0,0 +1,47 @@
using HarmonyLib;
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
[HarmonyPatch(typeof(Dialog_DebugRenderTree), "RightRect")]
public static class HarmonyPatch_Dialog_DebugRenderTree
{
static MethodInfo replaceFloatRangeMethod = SymbolExtensions.GetMethodInfo(() => HarmonyPatch_Dialog_DebugRenderTree.ReplaceFloatValueRange());
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
var codes = new List<CodeInstruction>(instructions);
for (int i = 0; i < codes.Count; i++)
{
//increase granularity of x and z sliders to be 0.01 instead
if (codes[i].opcode == OpCodes.Ldc_R4 && (float)codes[i].operand == 0.05f)
{
codes[i].operand = 0.001f;
codes[i - 8].opcode = OpCodes.Call;
codes[i - 8].operand = replaceFloatRangeMethod;
}
}
return codes.AsEnumerable();
}
public static FloatRange ReplaceFloatValueRange()
{
return new FloatRange(-RJWAnimationSettings.floatRangeInRenderTreeMenu, RJWAnimationSettings.floatRangeInRenderTreeMenu);
}
}
}

View File

@ -21,6 +21,8 @@ namespace Rimworld_Animations
if (__instance.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker)
{
if (parms.Portrait) return true;
// 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);

View File

@ -20,6 +20,10 @@ namespace Rimworld_Animations
* Facing offsets fix
*/
//find lowest parent that is animating, or nothing if not animating
//don't do anything if portrait
if (parms.Portrait) return true;
PawnRenderNode animatingNode = node;
while (animatingNode != null
&& !(animatingNode.AnimationWorker is AnimationWorker_KeyframesExtended))

View File

@ -15,7 +15,7 @@ namespace Rimworld_Animations
{
public static bool Prefix(ref Pawn ___pawn, ref float __result)
{
//stop using cache when animating, for when downed (downed disables cache)
//set body angle to zero, for when downed
if (___pawn?.Drawer?.renderer?.renderTree?.rootNode?.AnimationWorker is AnimationWorker_KeyframesExtended)
{
__result = 0;

View File

@ -12,13 +12,21 @@ namespace Rimworld_Animations {
public static void Postfix(ref Pawn ___pawn, ref Vector3 __result) {
//align pos on top of partner, position, etc., based on animatoranchor
if (___pawn.TryGetComp<CompExtendedAnimator>() is CompExtendedAnimator animator
&& animator.IsAnchored)
if (___pawn.TryGetComp<CompExtendedAnimator>() is CompExtendedAnimator animator)
{
Vector3 anchor = animator.getAnchor();
//ignore y so that pawns don't clip through stuff
__result.x = anchor.x;
__result.z = anchor.z;
if (animator.IsAnchored)
{
Vector3 anchor = animator.getAnchor();
__result.x = anchor.x;
__result.y = anchor.y;
__result.z = anchor.z;
}
else
{
__result.y = AltitudeLayer.Pawn.AltitudeFor();
}
}
}

View File

@ -14,6 +14,8 @@ namespace Rimworld_Animations
public override void EditMaterial(PawnRenderNode node, PawnDrawParms parms, ref Material material)
{
if (node.tree.pawn.def != ThingDefOf.Human) return;
if (node.tree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended
|| node.tree.rootNode.children.Any(x => x.AnimationWorker is AnimationWorker_KeyframesExtended))
{
@ -24,7 +26,10 @@ namespace Rimworld_Animations
public override void TransformLayer(PawnRenderNode node, PawnDrawParms parms, ref float layer)
{
base.TransformLayer(node, parms, ref layer);
if (node.tree.pawn.def != ThingDefOf.Human) return;
layer -= 1000;
}

View File

@ -19,6 +19,7 @@
<RimAnims_Warning>Warning--You generally don't want to change human offsets, only alien offsets or animals</RimAnims_Warning>
<RimAnims_CopyToClipboard>Copy Offset to Clipboard</RimAnims_CopyToClipboard>
<RimAnims_ShareSettings>Paste offset values in OffsetDef, or share in Discord</RimAnims_ShareSettings>
<RimAnim_FloatRangeRenderTree>Float range for Debug Render Tree offset menu</RimAnim_FloatRangeRenderTree>
</LanguageData>

View File

@ -84,6 +84,11 @@
<Compile Include="1.5\Source\Animations\AnimationOffsets\Offsets\BodyTypeOffset.cs" />
<Compile Include="1.5\Source\Animations\AnimationProps\AnimationPropDef.cs" />
<Compile Include="1.5\Source\Animations\AnimationWorkers\AnimationWorker_KeyframesExtended.cs" />
<Compile Include="1.5\Source\Animations\PawnTests\BasePawnTest.cs" />
<Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Always.cs" />
<Compile Include="1.5\Source\Animations\PawnTests\PawnTest_Multi.cs" />
<Compile Include="1.5\Source\Animations\PawnTests\PawnTest_RJWCanBeFucked.cs" />
<Compile Include="1.5\Source\Animations\PawnTests\PawnTest_RJWCanFuck.cs" />
<Compile Include="1.5\Source\Comps\CompExtendedAnimator.cs" />
<Compile Include="1.5\Source\Comps\CompProperties_ExtendedAnimator.cs" />
<Compile Include="1.5\Source\Comps\CompProperties_ThingAnimator.cs" />
@ -104,6 +109,7 @@
<Compile Include="1.5\Source\MainTabWindows\OffsetMainButtonDefOf.cs" />
<Compile Include="1.5\Source\MainTabWindows\WorldComponent_UpdateMainTab.cs" />
<Compile Include="1.5\Source\Patches\Harmony_PatchAll.cs" />
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_Dialog_DebugRenderTree.cs" />
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderer.cs" />
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderNode.cs" />
<Compile Include="1.5\Source\Patches\RimworldPatches\HarmonyPatch_PawnRenderNodeWorker.cs" />