// Either

        internal static bool Prefix(FeatureDefinitionDamageAffinity __instance, string damageType, int damage, List <string> sourceTags, ref int __result)
        {
            var fda = __instance as FeatureDefinitionDamageAffinityEx;

            if (fda != null)
            {
                // custom logic here, modify __result
                // stop original code from running
                return(false);
            }

            // else do nothing and let original code run
            return(true);
        }
        internal static FeatureDefinitionDamageAffinityEx Create(FeatureDefinitionDamageAffinity original,
                                                                 string name, DamageAffinityTypeEx damageAffinity, int flatBonusAmount, double ratio)
        {
            var retval = new FeatureDefinitionDamageAffinityEx
            {
                DamageAffinityTypeEx = damageAffinity,
                FlatBonusAmount      = flatBonusAmount,
                Ratio = ratio
            };

            // TODO - copy original to retval
            // AccessTools etc, class builder?

            AccessTools.Field(retval.GetType(), "guid").SetValue(retval, Guid.NewGuid().ToString("N"));
            retval.name = name;

            return(retval);
        }
        // Or

        internal static void Postfix(FeatureDefinitionDamageAffinity __instance, string damageType, int damage, List <string> sourceTags, ref int __result)
        {
            Main.Log("FeatureDefinitionDamageAffinity_ModulateSustainedDamage(Ex): Enter");

            // original logic has run and damage calculated will be in __result

            // is this an instance of our custom affinity?
            var fda = __instance as FeatureDefinitionDamageAffinityEx;

            if (fda != null)
            {
                // custom logic here, modify __result
                // custom logic here, modify __result
                switch (fda.DamageAffinityTypeEx)
                {
                case DamageAffinityTypeEx.FlatBonus:
                    __result = damage + fda.FlatBonusAmount;
                    break;

                case DamageAffinityTypeEx.AttributeAndProficiency:
                    __result = (int)(damage * fda.Ratio);
                    break;

                case DamageAffinityTypeEx.Ratio:
                    __result = (int)(damage * fda.Ratio);
                    break;

                default:
                    Main.Error($"Unknown damage affinity: {fda.DamageAffinityTypeEx}");
                    break;
                }
            }

            // or is it something we want to change anyway
            //if (__instance.Name == "")  // or __instance.Guid ==
            //{

            //}

            // else do nothing (or something if required)
        }
Пример #4
0
        internal static void Postfix(FeatureDefinitionDamageAffinity __instance, string damageType, int damage, List <string> sourceTags, ref int __result)
        {
            Main.Log("FeatureDefinitionDamageAffinity_ModulateSustainedDamage_ExtraProperties: Enter");

            // original logic has run and damage calculated so far will be in __result

            // can also use __instance.Name/__instance.Guid

            if (damageType != "PsionicBlast")
            {
                return;
            }

            // look in dictionary, is there extra data for this __instance?
            if (ExtraProperties.TryGetValue(__instance, out var extraProperties))
            {
                // custom logic here, modify __result
                switch (extraProperties.DamageAffinityTypeEx)
                {
                case DamageAffinityTypeEx.FlatBonus:
                    __result = damage + extraProperties.FlatBonusAmount;
                    break;

                case DamageAffinityTypeEx.AttributeAndProficiency:
                    __result = (int)(damage * extraProperties.Ratio);
                    break;

                case DamageAffinityTypeEx.Ratio:
                    __result = (int)(damage * extraProperties.Ratio);
                    break;

                default:
                    Main.Error($"Unknown damage affinity: {extraProperties.DamageAffinityTypeEx}");
                    break;
                }
            }
        }