diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index d182ca9..494f83d 100644 Binary files a/1.5/Assemblies/Rimworld-Animations.dll and b/1.5/Assemblies/Rimworld-Animations.dll differ diff --git a/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNodeProperties_GraphicHediffSeverityVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNodeProperties_GraphicHediffSeverityVariants.cs new file mode 100644 index 0000000..96e9779 --- /dev/null +++ b/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNodeProperties_GraphicHediffSeverityVariants.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnRenderNodeProperties_GraphicHediffSeverityVariants : PawnRenderNodeProperties_GraphicVariants + { + + public BodyPartDef bodyPart = null; + public List hediffSeverityVariants; + + } + + public class HediffWithSeverity + { + public HediffDef hediff; + public List severityVariants; + } + + public class TexPathVariants_Severity + { + public int severity; + public TexPathVariantsDef texPathVariantsDef; + + + } + + +} diff --git a/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNodeWorker_GraphicHediffSeverityVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNodeWorker_GraphicHediffSeverityVariants.cs new file mode 100644 index 0000000..b8877a5 --- /dev/null +++ b/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNodeWorker_GraphicHediffSeverityVariants.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rimworld_Animations +{ + public class PawnRenderNodeWorker_GraphicHediffSeverityVariants : PawnRenderNodeWorker_GraphicVariants + { + //same functionality as graphicvariants worker + //just here for readability + + } +} diff --git a/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNode_GraphicHediffSeverityVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNode_GraphicHediffSeverityVariants.cs new file mode 100644 index 0000000..44ce6fd --- /dev/null +++ b/1.5/Source/PawnRenderNode/GraphicHediffSeverityVariants/PawnRenderNode_GraphicHediffSeverityVariants.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnRenderNode_GraphicHediffSeverityVariants : PawnRenderNode_GraphicVariants + { + + protected HediffDef hediffWithSeverity; + protected float curSeverity; + + protected new PawnRenderNodeProperties_GraphicHediffSeverityVariants props; + private HediffDef curHediff; + + public PawnRenderNode_GraphicHediffSeverityVariants(Pawn pawn, PawnRenderNodeProperties props, PawnRenderTree tree) : base(pawn, props, tree) + { + + this.props = (PawnRenderNodeProperties_GraphicHediffSeverityVariants)props; + + } + + protected Dictionary GraphicHediffSeverityVariantsFor(Pawn pawn) + { + + + if (props.hediffSeverityVariants == null) + { + Log.Error("[Anims] Error: Tried to use GraphicBodyPartHediffSeverityVariants node, but hediffSeverityVariants weren't given"); + } + + + Hediff idealHediff = null; + HediffWithSeverity idealHediffSeverity = null; + + if (props.bodyPart == null) + { + //search the entire body for the hediff because no bodypart was set + for (int i = 0; i < props.hediffSeverityVariants.Count; i++) + { + idealHediff = pawn.health.hediffSet.hediffs.Find((Hediff hediffWithSeverity) => + hediffWithSeverity.def == props.hediffSeverityVariants[i].hediff); + + if (idealHediff != null) + { + //get the ideal hediff severity variants, to iterate through and find the right one for the severity + idealHediffSeverity = props.hediffSeverityVariants[i]; + break; + + } + + } + } + + else + { + //search for a hediff with a specific body part + + for (int i = 0; i < props.hediffSeverityVariants.Count; i++) + { + //right hediff with the right hediff and right body part + + idealHediff = pawn.health.hediffSet.hediffs.Find((Hediff hediffWithSeverity) => + hediffWithSeverity.def == props.hediffSeverityVariants[i].hediff + && hediffWithSeverity.Part.def == props.bodyPart); + + if (idealHediff != null) { + + //get the ideal hediff severity variants, to iterate through and find the right one for the severity + idealHediffSeverity = props.hediffSeverityVariants[i]; + break; + } + } + } + + if (idealHediff != null) + { + //set severity so that recache when this is different + curSeverity = idealHediff.Severity; + + //look for the right severity-based texpathvariants + TexPathVariants_Severity texPathVariants_Severity = idealHediffSeverity.severityVariants.Find((TexPathVariants_Severity texPathVariants) => + texPathVariants.severity < idealHediff.Severity); + + //if null, assume value is really too small + if (texPathVariants_Severity == null) + { + //return largest value + return GenerateVariants(pawn, idealHediffSeverity.severityVariants.First().texPathVariantsDef); + } + + //return right severity variants + return GenerateVariants(pawn, texPathVariants_Severity.texPathVariantsDef); + + } + + //there is no graphic hediff variants appropriate + curHediff = null; + return null; + + } + + protected override void EnsureMaterialsInitialized() + { + //if pawn no longer has the hediff, + if (variants == null || + !(this.tree.pawn.health?.hediffSet?.hediffs is List hediffs + && hediffs.Any((Hediff hediff) => hediff.def == curHediff && hediff.Severity == curSeverity))) + { + //do graphicvariantsfor + variants = GraphicHediffSeverityVariantsFor(this.tree.pawn); + } + + //call this in case variants wasn't set, and there is no graphic hediff variants appropriate; it'll set variants based on default + base.EnsureMaterialsInitialized(); + } + } +} diff --git a/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs index f297dfe..5382373 100644 --- a/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs +++ b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs @@ -57,7 +57,7 @@ namespace Rimworld_Animations { //if pawn no longer has the hediff, if (variants == null || - (this.tree.pawn.health?.hediffSet?.hediffs is List hediffs + !(this.tree.pawn.health?.hediffSet?.hediffs is List hediffs && hediffs.Any((Hediff hediff) => hediff.def == curHediff))) { //do graphicvariantsfor diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index 2780308..1fad458 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -121,6 +121,9 @@ + + +