/// <summary>
            /// Applied after Initialize runs.
            /// </summary>
            internal static void Postfix(EntityModifierSet __instance)
            {
                TraitReworkUtils.FixTraits(__instance);
                PUtil.LogDebug("Updated traits");
                // Add "Disturbed" trait
                var disturbedEffect = new Effect(TraitTuning.DISTURBED_EFFECT, TraitStrings.
                                                 DISTURBED_NAME, TraitStrings.DISTURBED_DESC, 200.0f, true, true, true);

                disturbedEffect.Add(new AttributeModifier("StressDelta", 0.033333333f,
                                                          TraitStrings.DISTURBED_NAME));
                __instance.effects.Add(disturbedEffect);
            }
Example #2
0
        /// <summary>
        /// Alters the specified traits.
        /// </summary>
        /// <param name="modifiers">The modifiers containing the source traits.</param>
        internal static void FixTraits(EntityModifierSet modifiers)
        {
            var source    = modifiers.traits;
            var newTraits = TraitTuning.Instance.Traits;

            if (source != null)
            {
                var unusedTraits = HashSetPool <string, TraitTemplate> .Allocate();

                // Track which traits did not get used
                foreach (var trait in newTraits)
                {
                    unusedTraits.Add(trait.Key);
                }
                foreach (var trait in source.resources)
                {
                    // Do we have a replacement?
                    if (newTraits.TryGetValue(trait.Id, out TraitTemplate newTrait))
                    {
                        PUtil.LogDebug("Patched trait: " + trait.Id);
                        var disabled = newTrait.DisabledChores;
                        trait.PositiveTrait = newTrait.IsPositive;
                        if (disabled != null)
                        {
                            // Add disabled chores
                            int n      = disabled.Count;
                            var groups = new ChoreGroup[n];
                            for (int i = 0; i < n; i++)
                            {
                                groups[i] = modifiers.ChoreGroups.Get(disabled[i]);
                            }
                            trait.disabledChoreGroups = groups;
                        }
                        else
                        {
                            // Remove all disabled chores
                            trait.disabledChoreGroups = null;
                        }
                        trait.ValidStarterTrait = newTrait.ValidStartingTrait;
                        // Leave OnAddTrait, replace the modifiers
                        var mods = trait.SelfModifiers;
                        mods.Clear();
                        mods.AddRange(newTrait.Modifiers);
                        unusedTraits.Remove(newTrait.ID);
                        // Replace ignored effects if present
                        var effects = newTrait.IgnoredEffects;
                        if (effects != null)
                        {
                            var arr = new string[effects.Count];
                            effects.CopyTo(arr, 0);
                            trait.ignoredEffects = arr;
                        }
                        // Add extended trait tooltip
                        var extendedFn = newTrait.ExtendedTooltip;
                        if (extendedFn != null)
                        {
                            trait.ExtendedTooltip = (Func <string>)Delegate.Combine(trait.
                                                                                    ExtendedTooltip, extendedFn);
                        }
                    }
                }
                unusedTraits.Recycle();
            }
        }