static void Postfix(SimGameState __instance) { List <FactionValue> alliedFactions = new List <FactionValue>(); foreach (string factionName in __instance.GetAllCareerAllies()) { alliedFactions.Add(FactionEnumeration.GetFactionByName(factionName)); } foreach (Pilot pilot in __instance.PilotRoster) { CrewDetails details = ModState.GetCrewDetails(pilot.pilotDef); // Decay positive attitude if (details.Attitude > 0) { int decayAmount = (int)Math.Ceiling(details.Attitude * Mod.Config.Attitude.Monthly.Decay); Mod.Log.Debug?.Write($"Decaying positive attitude from {details.Attitude} by {decayAmount}"); details.Attitude -= decayAmount; } // Apply the morale modifier int econMod = Mod.Config.Attitude.Monthly.EconomyNormalMod; if (__instance.ExpenditureLevel == EconomyScale.Spartan) { econMod = Mod.Config.Attitude.Monthly.EconSpartanMod; } else if (__instance.ExpenditureLevel == EconomyScale.Restrictive) { econMod = Mod.Config.Attitude.Monthly.EconRestrictiveMod; } else if (__instance.ExpenditureLevel == EconomyScale.Generous) { econMod = Mod.Config.Attitude.Monthly.EconomyGenerousMod; } else if (__instance.ExpenditureLevel == EconomyScale.Extravagant) { econMod = Mod.Config.Attitude.Monthly.EconomyExtravagantMod; } details.Attitude += econMod; // Check pilots to see if they favor or hate an allied faction if (details.FavoredFactionId > 0 && !details.IsPlayer) { foreach (FactionValue faction in alliedFactions) { if (faction.FactionID == details.FavoredFactionId) { Mod.Log.Debug?.Write($"Pilot {pilot.Name} favors allied faction: {faction.FriendlyName}, " + $"applying attitude mod: {Mod.Config.Attitude.Monthly.FavoredEmployerAlliedMod}"); details.Attitude += Mod.Config.Attitude.Monthly.FavoredEmployerAlliedMod; ModState.UpdateOrCreateCrewDetails(pilot.pilotDef, details); } } } if (details.HatedFactionId > 0 && !details.IsPlayer) { foreach (FactionValue faction in alliedFactions) { if (faction.FactionID == details.HatedFactionId) { Mod.Log.Debug?.Write($"Pilot {pilot.Name} hates allied faction: {faction.FriendlyName}, " + $"applying attitude mod: {Mod.Config.Attitude.Monthly.HatedEmployerAlliedMod}"); details.Attitude += Mod.Config.Attitude.Monthly.HatedEmployerAlliedMod; ModState.UpdateOrCreateCrewDetails(pilot.pilotDef, details); } } } // Clamp values details.Attitude = Mathf.Clamp(details.Attitude, Mod.Config.Attitude.ThresholdMin, Mod.Config.Attitude.ThresholdMax); ModState.UpdateOrCreateCrewDetails(pilot.pilotDef, details); } }