122 lines
4.5 KiB
C#
122 lines
4.5 KiB
C#
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<int, Graphic> 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<Hediff> 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();
|
|
}
|
|
}
|
|
}
|