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;
            }
        }
示例#2
0
            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);
                }
            }
示例#3
0
 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);
                 }
             }
         }
     }
 }
示例#4
0
 protected virtual void UpdateTotalThreatSignificance()
 {
     totalThreatSignificance = AdrenalineUtility.GetPerceivedThreatsFor(pawn).Sum(t => t.PerceivedThreatSignificanceFor(pawn));
 }