public override void OnIntervalPassed(Pawn pawn, Hediff cause) { var extraRaceProps = pawn.def.GetModExtension <ExtendedRaceProperties>() ?? ExtendedRaceProperties.defaultValues; if (!extraRaceProps.HasAdrenaline) { return; } var adrenalineTracker = pawn.GetComp <CompAdrenalineTracker>(); var hasRush = pawn.health.hediffSet.HasHediff(extraRaceProps.adrenalineRushHediff); // If the pawn can produce adrenaline and doesn't already have an adrenaline rush, add adrenaline rush if (AdrenalineSettings.allowNaturalGain && (AdrenalineSettings.affectAnimals || !pawn.RaceProps.Animal) && adrenalineTracker.CanProduceAdrenaline && !hasRush && AdrenalineUtility.GetPerceivedThreatsFor(pawn).Any()) { TryTeachAdrenalineConcept(pawn); pawn.health.AddHediff(extraRaceProps.adrenalineRushHediff); } // Otherwise if they have an adrenaline rush and don't have an adrenaline crash hediff, add an adrenaline crash hediff else if (AdrenalineSettings.adrenalineCrashes && hasRush && extraRaceProps.adrenalineCrashHediff != null && !pawn.health.hediffSet.HasHediff(extraRaceProps.adrenalineCrashHediff)) { var crashHediff = (Hediff_AdrenalineCrash)pawn.health.AddHediff(extraRaceProps.adrenalineCrashHediff); crashHediff.ticksToSeverityGain = crashHediff.Props.severityGainDelay; } }
public static void Postfix(Pawn __instance, ref IEnumerable <Gizmo> __result) { var localResult = __result.ToList(); // If the pawn is downed, is a colonist and can take adrenaline, add a 'take adrenaline' gizmo if (!__instance.Downed || !__instance.IsColonistPlayerControlled || !__instance.CanGetAdrenaline()) { return; } var extraRaceProps = __instance.def.GetModExtension <ExtendedRaceProperties>() ?? ExtendedRaceProperties.defaultValues; foreach (var tDef in extraRaceProps.RelevantConsumablesDowned) { var thingDefExtension = tDef.GetModExtension <ThingDefExtension>() ?? ThingDefExtension.defaultValues; var anyNearbyAdrenaline = AdrenalineUtility.AnyNearbyAdrenaline(__instance, tDef, out var adrenalineThings); var adrenalineGizmo = new Command_Action { defaultLabel = thingDefExtension.downedIngestGizmoLabel, defaultDesc = thingDefExtension.downedIngestGizmoDescription }; if (AdrenalineUtility.adrenalineGizmoIcons.TryGetValue(tDef, out var icon)) { adrenalineGizmo.icon = icon; } // No adrenaline nearby if (!anyNearbyAdrenaline) { adrenalineGizmo.Disable(thingDefExtension.downedIngestGizmoNoneNearby); localResult.Add(adrenalineGizmo); continue; } // Can't do manipulation if (!__instance.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) { adrenalineGizmo.Disable( "Adrenaline.Command_TakeAdrenaline_FailNoManipulation" .Translate(__instance.LabelShort)); localResult.Add(adrenalineGizmo); continue; } adrenalineGizmo.action = () => adrenalineThings[0].Ingested(__instance, 0); localResult.Add(adrenalineGizmo); } }
public static void Postfix(Pawn_MindState __instance) { if (AdrenalineSettings.npcUse) { var pawn = __instance.pawn; // Try to inject nearby adrenaline items if the pawn is downed, not a player pawn, is at least a tooluser, is capable of manipulation and moving, and can gain an adrelaine hediff if (pawn.IsHashIntervalTick(60) && pawn.Downed && pawn.Faction != Faction.OfPlayer && pawn.RaceProps.intelligence >= Intelligence.ToolUser && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Moving)) { var extraRaceProps = pawn.def.GetModExtension <ExtendedRaceProperties>() ?? ExtendedRaceProperties.defaultValues; if (extraRaceProps.adrenalineRushHediff != null) { var adrenalineHediff = pawn.health.hediffSet.GetFirstHediffOfDef(extraRaceProps.adrenalineRushHediff); if ((adrenalineHediff == null || adrenalineHediff.CurStageIndex < adrenalineHediff.def.stages.Count - 1) && AdrenalineUtility.AnyNearbyAdrenaline(pawn, extraRaceProps.RelevantConsumablesDowned, out List <Thing> adrenalineThings)) { adrenalineThings.First().Ingested(pawn, 0); } } } } }
protected virtual void UpdateTotalThreatSignificance() { totalThreatSignificance = AdrenalineUtility.GetPerceivedThreatsFor(pawn).Sum(t => t.PerceivedThreatSignificanceFor(pawn)); }