mirror of
				https://gitgud.io/c0ffeeeeeeee/rimworld-animations.git
				synced 2024-08-15 00:43:45 +00:00 
			
		
		
		
	Rewrote anim framework to use vanilla animation system
- added extended functionality for head rotations, invisible - tentative design for groupanimationdefs
This commit is contained in:
		
							parent
							
								
									011ab50958
								
							
						
					
					
						commit
						e8fd61fb4a
					
				
					 15 changed files with 561 additions and 17 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										114
									
								
								1.5/Defs/AnimationDefs/TestAnimation1.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								1.5/Defs/AnimationDefs/TestAnimation1.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8" ?>
 | 
			
		||||
<Defs>
 | 
			
		||||
	<AnimationDef>
 | 
			
		||||
		<defName>TestAnimation1</defName>
 | 
			
		||||
		<durationTicks>400</durationTicks>
 | 
			
		||||
		<playWhenDowned>False</playWhenDowned>
 | 
			
		||||
		<modExtensions>
 | 
			
		||||
			<li Class="Rimworld_Animations.AltitudeLayer">
 | 
			
		||||
				<PawnAltitudeLayer>Pawn</PawnAltitudeLayer>
 | 
			
		||||
			</li>
 | 
			
		||||
		</modExtensions>
 | 
			
		||||
		<animationParts>
 | 
			
		||||
	
 | 
			
		||||
			<li>
 | 
			
		||||
				<key>Root</key>
 | 
			
		||||
				<value>
 | 
			
		||||
					<workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
 | 
			
		||||
					<keyframes>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>30</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>North</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>100</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>East</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>200</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>South</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>300</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>West</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
					</keyframes>
 | 
			
		||||
				</value>
 | 
			
		||||
			</li>
 | 
			
		||||
					<!--
 | 
			
		||||
			<li>
 | 
			
		||||
				<key>Body</key>
 | 
			
		||||
				<value>
 | 
			
		||||
					<workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
 | 
			
		||||
					<keyframes>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>30</tick>
 | 
			
		||||
							<angle>30</angle>
 | 
			
		||||
							<rotation>North</rotation>
 | 
			
		||||
							<visible>false</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>300</tick>
 | 
			
		||||
							<angle>150</angle>
 | 
			
		||||
							<rotation>South</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>600</tick>
 | 
			
		||||
							<angle>30</angle>
 | 
			
		||||
							<rotation>North</rotation>
 | 
			
		||||
							<visible>false</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
					</keyframes>
 | 
			
		||||
				</value>
 | 
			
		||||
			</li>
 | 
			
		||||
			-->
 | 
			
		||||
			<li>
 | 
			
		||||
				<key>Head</key>
 | 
			
		||||
				<value>
 | 
			
		||||
					<workerClass>Rimworld_Animations.AnimationWorker_KeyframesExtended</workerClass>
 | 
			
		||||
					<keyframes>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>0</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>North</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>2</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>East</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>4</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>South</rotation>
 | 
			
		||||
							<visible>true</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>6</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>West</rotation>
 | 
			
		||||
							<visible>false</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li Class="Rimworld_Animations.ExtendedKeyframe">
 | 
			
		||||
							<tick>8</tick>
 | 
			
		||||
							<angle>0</angle>
 | 
			
		||||
							<rotation>North</rotation>
 | 
			
		||||
							<visible>false</visible>
 | 
			
		||||
						</li>
 | 
			
		||||
					</keyframes>
 | 
			
		||||
				</value>
 | 
			
		||||
			</li>
 | 
			
		||||
		</animationParts>
 | 
			
		||||
	</AnimationDef>
 | 
			
		||||
</Defs>
 | 
			
		||||
							
								
								
									
										60
									
								
								1.5/Defs/AnimationDefs/TestAnimation2.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								1.5/Defs/AnimationDefs/TestAnimation2.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8" ?>
 | 
			
		||||
<Defs>
 | 
			
		||||
	<AnimationDef>
 | 
			
		||||
		<defName>TestAnimation2</defName>
 | 
			
		||||
		<durationTicks>200</durationTicks>
 | 
			
		||||
		<startOnRandomTick>False</startOnRandomTick>
 | 
			
		||||
		<playWhenDowned>False</playWhenDowned>
 | 
			
		||||
 | 
			
		||||
		<animationParts>
 | 
			
		||||
			<li>
 | 
			
		||||
				<key>Root</key>
 | 
			
		||||
				<value>
 | 
			
		||||
					<workerClass>AnimationWorker_Keyframes</workerClass>
 | 
			
		||||
					<keyframes>
 | 
			
		||||
						<li>
 | 
			
		||||
							<tick>0</tick>
 | 
			
		||||
							<angle>23</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li>
 | 
			
		||||
						  <tick>6</tick>
 | 
			
		||||
						  <angle>-5</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li>
 | 
			
		||||
						  <tick>12</tick>
 | 
			
		||||
						  <angle>4</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li>
 | 
			
		||||
						  <tick>188</tick>
 | 
			
		||||
						  <angle>-1</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
					</keyframes>
 | 
			
		||||
				</value>
 | 
			
		||||
			</li>
 | 
			
		||||
			<li>
 | 
			
		||||
				<key>Head</key>
 | 
			
		||||
				<value>
 | 
			
		||||
					<workerClass>AnimationWorker_Keyframes</workerClass>
 | 
			
		||||
					<keyframes>
 | 
			
		||||
						<li>
 | 
			
		||||
							<tick>0</tick>
 | 
			
		||||
							<angle>5</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li>
 | 
			
		||||
							<tick>6</tick>
 | 
			
		||||
							<angle>-5</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li>
 | 
			
		||||
							<tick>12</tick>
 | 
			
		||||
							<angle>4</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
						<li>
 | 
			
		||||
							<tick>128</tick>
 | 
			
		||||
							<angle>-1</angle>
 | 
			
		||||
						</li>
 | 
			
		||||
					</keyframes>
 | 
			
		||||
				</value>
 | 
			
		||||
			</li>
 | 
			
		||||
		</animationParts>
 | 
			
		||||
	</AnimationDef>
 | 
			
		||||
</Defs>
 | 
			
		||||
							
								
								
									
										88
									
								
								1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8" ?>
 | 
			
		||||
<Defs>
 | 
			
		||||
	<GroupAnimationDef>
 | 
			
		||||
		<defName>TestGroupAnimation1</defName>
 | 
			
		||||
		<numActors>2</numActors>
 | 
			
		||||
		
 | 
			
		||||
		<AnimationStages>
 | 
			
		||||
			<li Class="Rimworld_Animations.AnimationStage_LoopForDuration">
 | 
			
		||||
				<ticks>200</ticks>
 | 
			
		||||
				<AnimationDefs>
 | 
			
		||||
					<li>Pawn1_Stage1_TestAnimation1</li>
 | 
			
		||||
					<li>Pawn2_Stage1_TestAnimation2</li>
 | 
			
		||||
				</AnimationDefs>
 | 
			
		||||
			</li>
 | 
			
		||||
			<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
 | 
			
		||||
				<numberOfLoops>10</numberOfLoops>
 | 
			
		||||
				<AnimationOptions>
 | 
			
		||||
					<li>
 | 
			
		||||
						<probability>3</probability>
 | 
			
		||||
						<li>Pawn1_Stage2_Variant1</li>
 | 
			
		||||
						<li>Pawn2_Stage2_Variant1</li>
 | 
			
		||||
					</li>
 | 
			
		||||
 | 
			
		||||
					<li>
 | 
			
		||||
						<probability>1</probability>
 | 
			
		||||
						<li>Pawn1_Stage2_Variant2</li>
 | 
			
		||||
						<li>Pawn2_Stage2_Variant2</li>
 | 
			
		||||
					</li>
 | 
			
		||||
				</AnimationOptions>
 | 
			
		||||
			</li>
 | 
			
		||||
 | 
			
		||||
			<li Class="Rimworld_Animations.AnimationStage_BranchPaths">
 | 
			
		||||
				<Paths>
 | 
			
		||||
					<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
 | 
			
		||||
						<numberOfLoops>10</numberOfLoops>
 | 
			
		||||
						<AnimationOptions>
 | 
			
		||||
							<li>
 | 
			
		||||
								<probability>3</probability>
 | 
			
		||||
								<li>Pawn1_Stage2_Variant1</li>
 | 
			
		||||
								<li>Pawn2_Stage2_Variant1</li>
 | 
			
		||||
							</li>
 | 
			
		||||
 | 
			
		||||
							<li>
 | 
			
		||||
								<probability>1</probability>
 | 
			
		||||
								<li>Pawn1_Stage2_Variant2</li>
 | 
			
		||||
								<li>Pawn2_Stage2_Variant2</li>
 | 
			
		||||
							</li>
 | 
			
		||||
						</AnimationOptions>
 | 
			
		||||
						
 | 
			
		||||
					</li>
 | 
			
		||||
					<li Class="Rimworld_Animations.AnimationStage_LoopRandomSelectChance">
 | 
			
		||||
						<numberOfLoops>10</numberOfLoops>
 | 
			
		||||
						<AnimationOptions>
 | 
			
		||||
							<li>
 | 
			
		||||
								<probability>3</probability>
 | 
			
		||||
								<li>Pawn1_Stage2_Variant1</li>
 | 
			
		||||
								<li>Pawn2_Stage2_Variant1</li>
 | 
			
		||||
							</li>
 | 
			
		||||
 | 
			
		||||
							<li>
 | 
			
		||||
								<probability>1</probability>
 | 
			
		||||
								<li>Pawn1_Stage2_Variant2</li>
 | 
			
		||||
								<li>Pawn2_Stage2_Variant2</li>
 | 
			
		||||
							</li>
 | 
			
		||||
						</AnimationOptions>
 | 
			
		||||
 | 
			
		||||
					</li>
 | 
			
		||||
				</Paths>
 | 
			
		||||
			</li>
 | 
			
		||||
		</AnimationStages>
 | 
			
		||||
 | 
			
		||||
		<contexts>
 | 
			
		||||
			<li Class="Rimworld_Animations.Actor_Sextype">
 | 
			
		||||
				<sexTypes>
 | 
			
		||||
					<li>Sex</li>
 | 
			
		||||
				</sexTypes>
 | 
			
		||||
				<actorShift>0</actorShift>
 | 
			
		||||
			</li>
 | 
			
		||||
			<li Class="Rimworld_Animations.Actor_Sextype">
 | 
			
		||||
				<sexTypes>
 | 
			
		||||
					<li>Sex_Reverse</li>
 | 
			
		||||
				</sexTypes>
 | 
			
		||||
				<actorShift>1</actorShift>
 | 
			
		||||
			</li>
 | 
			
		||||
		</contexts>
 | 
			
		||||
		
 | 
			
		||||
	</GroupAnimationDef>
 | 
			
		||||
</Defs>
 | 
			
		||||
							
								
								
									
										16
									
								
								1.5/Patches/Patch_GenitaliaRenderNode.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								1.5/Patches/Patch_GenitaliaRenderNode.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8" ?>
 | 
			
		||||
<Patch>
 | 
			
		||||
	<!-- Add genitalia rendernode to pawns, body is parent 
 | 
			
		||||
	<Operation Class="PatchOperationAdd">
 | 
			
		||||
		<xpath>Defs/PawnRenderTreeDef[defName="Humanlike"]/root/children/li[debugLabel="Body"]/children</xpath>
 | 
			
		||||
		<value>
 | 
			
		||||
			<li Class="PawnRenderNodeProperties_Overlay">
 | 
			
		||||
				<debugLabel>Genitalia</debugLabel>
 | 
			
		||||
				<workerClass>PawnRenderNodeWorker_OverlayWounds</workerClass>
 | 
			
		||||
				<overlayLayer>Body</overlayLayer>
 | 
			
		||||
				<baseLayer>3</baseLayer>
 | 
			
		||||
			</li>
 | 
			
		||||
		</value>
 | 
			
		||||
	</Operation>
 | 
			
		||||
	-->
 | 
			
		||||
</Patch>
 | 
			
		||||
							
								
								
									
										108
									
								
								1.5/Source/AnimationWorkers/AnimationWorker_KeyframesExtended.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								1.5/Source/AnimationWorkers/AnimationWorker_KeyframesExtended.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								1.5/Source/Defs/AnimationDefOf.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								1.5/Source/Defs/AnimationDefOf.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								1.5/Source/GroupAnimationStages/AnimationStage.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								1.5/Source/GroupAnimationStages/AnimationStage.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								1.5/Source/Keyframes/ExtendedKeyframe.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								1.5/Source/Keyframes/ExtendedKeyframe.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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,13 +39,8 @@ namespace Rimworld_Animations {
 | 
			
		|||
				int preAnimDuration = __instance.duration;
 | 
			
		||||
				int AnimationTimeTicks = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
				if (bed != null) {
 | 
			
		||||
                    RerollAnimations(bed as Thing);
 | 
			
		||||
                }
 | 
			
		||||
				else {
 | 
			
		||||
					RerollAnimations();
 | 
			
		||||
				}
 | 
			
		||||
				List<Pawn> participants = partnerSexBaseReceiver.parteners.Append(partner).ToList();
 | 
			
		||||
				RerollAnimations(participants);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
				//Modify Orgasm ticks to only orgasm as many times as RJW stock orgasm allows
 | 
			
		||||
| 
						 | 
				
			
			@ -56,8 +53,10 @@ namespace Rimworld_Animations {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static void RerollAnimations(Thing bed = null) {
 | 
			
		||||
		public static void RerollAnimations(List<Pawn> participants) {
 | 
			
		||||
 | 
			
		||||
			participants[0].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation1);
 | 
			
		||||
			participants[1].Drawer.renderer.SetAnimation(AnimationDefOf.TestAnimation2);
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -72,17 +72,24 @@
 | 
			
		|||
    <Compile Include="1.5\Source\Actors\Actor.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Actors\AlienRaceOffset.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Actors\BodyTypeOffset.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\AnimationWorkers\AnimationWorker_KeyframesExtended.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Comps\CompProperties_ThingAnimator.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Comps\CompThingAnimator.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Defs\AnimationDefOf.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\GroupAnimationStages\AnimationStage.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Keyframes\ExtendedKeyframe.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\MainTabWindows\MainTabWindow_OffsetConfigure.cs" />
 | 
			
		||||
    <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_PawnRenderNode.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\RJWPatches\HarmonyPatch_PlaySexSounds.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Patches\RJWPatches\HarmonyPatch_SexTick.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_Sex.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseInitiator.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Patches\RJWPatches\JobDrivers\HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs" />
 | 
			
		||||
    <Compile Include="1.5\Source\Settings\AnimationSettings.cs" />
 | 
			
		||||
| 
						 | 
				
			
			@ -90,10 +97,16 @@
 | 
			
		|||
    <Compile Include="Properties\AssemblyInfo.cs" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Content Include="1.1\Assemblies\Rimworld-Animations.dll" />
 | 
			
		||||
    <Content Include="1.5\Assemblies\0MultiplayerAPI.dll" />
 | 
			
		||||
    <Content Include="1.5\Assemblies\Rimworld-Animations.dll" />
 | 
			
		||||
    <Content Include="1.5\Assemblies\RJW.dll" />
 | 
			
		||||
    <Content Include="1.5\Defs\AnimationDefs\TestAnimation1.xml" />
 | 
			
		||||
    <Content Include="1.5\Defs\AnimationDefs\TestAnimation2.xml" />
 | 
			
		||||
    <Content Include="1.5\Defs\GroupAnimationDefs\TestGroupAnimation1.xml" />
 | 
			
		||||
    <Content Include="1.5\Defs\MainTabDefs\MainButtonDef.xml" />
 | 
			
		||||
    <Content Include="1.5\Defs\SoundDefs\Sounds_Sex.xml" />
 | 
			
		||||
    <Content Include="1.5\Patches\CompatibilityPatch_FacialAnimation.xml" />
 | 
			
		||||
    <Content Include="1.5\Patches\Patch_GenitaliaRenderNode.xml" />
 | 
			
		||||
    <Content Include="1.5\Sounds\Sex\Clap_1.wav" />
 | 
			
		||||
    <Content Include="1.5\Sounds\Sex\Clap_2.wav" />
 | 
			
		||||
    <Content Include="1.5\Sounds\Sex\Clap_3.wav" />
 | 
			
		||||
| 
						 | 
				
			
			@ -133,10 +146,7 @@
 | 
			
		|||
    <Content Include="LoadFolders.xml" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Folder Include="1.2\" />
 | 
			
		||||
    <Folder Include="1.5\Assemblies\" />
 | 
			
		||||
    <Folder Include="1.5\Defs\AnimationDefs\" />
 | 
			
		||||
    <Folder Include="1.5\Source\Defs\" />
 | 
			
		||||
    <Folder Include="1.5\Defs\SexAnimationDefs\" />
 | 
			
		||||
    <Folder Include="1.5\Source\Extensions\" />
 | 
			
		||||
    <Folder Include="1.5\Source\Patches\OtherModPatches\" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue