示例#1
0
 public static T SetCaster <T>(this T entity, RulesetCharacter value)
     where T : RulesetEffectSpell
 {
     entity.SetField("caster", value);
     return(entity);
 }
        public static void Postfix(
            ref int __result,
            RulesetCharacter __instance,
            RuleDefinitions.MoveMode moveMode,
            int baseSpeed,
            bool baseOnly = false,
            List <FeatureDefinition> movementModifiers = null)
        {
            var mm = (movementModifiers ?? __instance.GetMovementModifiers() ?? Enumerable.Empty <FeatureDefinition>())
                     .Cast <IMovementAffinityProvider>()
                     //.OfType<IMovementAffinityProvider>()  // depends if we want assertion or not
                     .Where(affinityProvider => affinityProvider.AppliesToAllModes || moveMode == affinityProvider.MoveMode);

            if (mm.Any(ap => ap.HeavyArmorImmunity))
            {
                mm = mm.Where(ap => (BaseDefinition)ap != DatabaseHelper.FeatureDefinitionMovementAffinitys.MovementAffinityHeavyArmorOverload);
            }

            if (mm.Any(ap => ap.EncumbranceImmunity))
            {
                mm = mm
                     .Where(ap => (BaseDefinition)ap != DatabaseHelper.FeatureDefinitionMovementAffinitys.MovementAffinityConditionEncumbered)
                     .Where(ap => (BaseDefinition)ap != DatabaseHelper.FeatureDefinitionMovementAffinitys.MovementAffinityConditionHeavilyEncumbered);
            }

            Main.Log($"Name={__instance.Name}: Parameters: Mode={moveMode}, baseSpeed={baseSpeed}, baseOnly={baseOnly}, modifierCount={mm.Count()}, result={__result}");

            if (mm.Any())
            {
                // Not sure about this - only used in tutorial to limit speed of wolf - and this code doesn't do that
                var minMaxMoves = mm.Max(ap => ap.MinMaxMoves);

                var additive = mm
                               .Where(ap => !ap.SpeedAddBase)
                               .Sum(ap => ap.BaseSpeedAdditiveModifier);

                var multiplicative = mm
                                     .Where(ap => !ap.SpeedAddBase)
                                     .Select(ap => ap.BaseSpeedMultiplicativeModifier)
                                     .Aggregate(1f, (n1, n2) => n1 * n2);

                var newBaseSpeed = mm.Where(ap => ap.ForceMinimalBaseSpeed)
                                   .Select(ap => ap.MinimalBaseSpeed)
                                   .Concat(Enumerable.Repeat(baseSpeed, 1))
                                   .Max();

                // TODO: where ap.SpeedAddBase == true

                int calculated = Mathf.FloorToInt(multiplicative * (newBaseSpeed + additive));

                // Not sure about this - only used in tutorial to limit speed of wolf - and this code doesn't do that
                ///var retval = Mathf.Max(minMaxMoves, calculated);

                var retval = calculated;

                Main.Log($"baseOriginal={baseSpeed}, newBase={newBaseSpeed}, min-max={minMaxMoves}, additive={additive}, multiplicative={multiplicative}, calculated={calculated}, retval={retval}");

                __result = retval;
            }
            else
            {
                Main.Log($"No affinity providers. Result=baseSpeed={baseSpeed}");
            }
        }
示例#3
0
 public static T SetUser <T>(this T entity, RulesetCharacter value)
     where T : RulesetEffectPower
 {
     entity.SetField("user", value);
     return(entity);
 }
 public static T SetRulesetCharacter <T>(this T entity, RulesetCharacter value)
     where T : GuiCharacter
 {
     entity.SetField("rulesetCharacter", value);
     return(entity);
 }