示例#1
0
        public static int CalculateItemPotencyBonus(NWCreature caster, ForceAbilityType abilityType)
        {
            if (!caster.IsPlayer)
            {
                return(0);
            }
            EffectiveItemStats itemStats = PlayerStatService.GetPlayerItemEffectiveStats(caster.Object);

            int itemBonus = itemStats.ForcePotency;

            switch (abilityType)
            {
            case ForceAbilityType.Electrical:
                itemBonus += itemStats.ElectricalPotency;
                break;

            case ForceAbilityType.Mind:
                itemBonus += itemStats.MindPotency;
                break;

            case ForceAbilityType.Light:
                itemBonus += itemStats.LightPotency;
                break;

            case ForceAbilityType.Dark:
                itemBonus += itemStats.DarkPotency;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(abilityType), abilityType, null);
            }

            return(itemBonus);
        }
示例#2
0
        public static void AddTemporaryForceDefense(NWCreature target, ForceAbilityType forceAbility, int amount = 5, int length = 5)
        {
            if (amount <= 0)
            {
                amount = 1;
            }
            string   variable        = "TEMP_FORCE_DEFENSE_" + (int)forceAbility;
            int      tempDefense     = target.GetLocalInt(variable) + amount;
            string   tempDateExpires = target.GetLocalString(variable);
            DateTime expirationDate  = DateTime.UtcNow;

            if (!string.IsNullOrWhiteSpace(tempDateExpires))
            {
                expirationDate = DateTime.Parse(tempDateExpires);
            }

            expirationDate = expirationDate.AddSeconds(length);
            target.SetLocalString(variable, expirationDate.ToString(CultureInfo.InvariantCulture));
            target.SetLocalInt(variable, tempDefense);
        }
示例#3
0
        public static ForceDamageResult CalculateForceDamage(
            NWCreature caster,
            NWCreature target,
            ForceAbilityType abilityType,
            int basePotency,
            float tier1Modifier,
            float tier2Modifier,
            float tier3Modifier,
            float tier4Modifier)
        {
            ForceResistanceResult resistance = CalculateResistanceRating(caster, target, abilityType);
            int itemBonus = CalculateItemPotencyBonus(caster, abilityType);

            int casterPrimary   = 0;
            int casterSecondary = 0;
            int targetPrimary   = 0;
            int targetSecondary = 0;

            switch (abilityType)
            {
            case ForceAbilityType.Electrical:
                casterPrimary   = caster.Intelligence;
                casterSecondary = caster.Wisdom;
                targetPrimary   = target.Intelligence;
                targetSecondary = target.Wisdom;
                break;

            case ForceAbilityType.Mind:
                casterPrimary   = caster.Wisdom;
                casterSecondary = caster.Intelligence;
                targetPrimary   = target.Wisdom;
                targetSecondary = target.Intelligence;
                break;

            case ForceAbilityType.Light:
                casterPrimary   = caster.Wisdom;
                casterSecondary = caster.Intelligence;
                targetPrimary   = target.Intelligence;
                targetSecondary = target.Wisdom;
                break;

            case ForceAbilityType.Dark:
                casterPrimary   = caster.Intelligence;
                casterSecondary = caster.Wisdom;
                targetPrimary   = target.Wisdom;
                targetSecondary = target.Intelligence;
                break;
            }

            // Calculate delta between caster's primary/secondary stats and target's primary and secondary stats
            int delta = (int)((casterPrimary + casterSecondary * 0.5f) - (targetPrimary + targetSecondary * 0.5f));

            float multiplier;

            // Not every ability will have tiers 2-4. Default to the next lowest one if it's missing.
            if (delta <= 49 || tier2Modifier <= 0.0f)
            {
                multiplier = tier1Modifier;
            }
            else if (delta <= 99 || tier3Modifier <= 0.0f)
            {
                multiplier = tier2Modifier;
            }
            else if (delta <= 199 || tier4Modifier <= 0.0f)
            {
                multiplier = tier3Modifier;
            }
            else
            {
                multiplier = tier4Modifier;
            }

            //caster.SendMessage("casterPrimary = " + casterPrimary + ", casterSecondary = " + casterSecondary + ", targetPrimary = " + targetPrimary + ", targetSecondary = " + targetSecondary);
            //caster.SendMessage("itemBonus = " + itemBonus + ", basePotency = " + basePotency + ", delta = " + delta + ", multiplier = " + multiplier + ", resistanceMultiplier = " + resistanceMultiplier);

            // Combine everything together to get the damage result.
            int damage = (int)((itemBonus + basePotency + (delta * multiplier)) * resistance.Amount);

            if (damage > 0)
            {
                damage += RandomService.D8(1);
            }

            if (damage <= 1)
            {
                damage = 1;
            }

            ForceDamageResult result = new ForceDamageResult
            {
                Damage     = damage,
                Resistance = resistance,
                ItemBonus  = itemBonus
            };

            // If this ability was resisted in any way, notify the caster.
            if (resistance.Type != ResistanceType.Zero)
            {
                string name = GetForceResistanceName(resistance.Type);
                caster.SendMessage("Your force ability was resisted. " + name);
            }

            return(result);
        }
示例#4
0
        public static ForceResistanceResult CalculateResistanceRating(
            NWCreature caster,
            NWCreature target,
            ForceAbilityType forceAbility)
        {
            int accuracy = CalculateForceAccuracy(caster, target, forceAbility);
            ForceResistanceResult result = new ForceResistanceResult();

            // Do four checks to see if the attacker overcomes the defender's
            // resistance.  The more checks you succeed, the lower the resistance.
            int successes = 0;

            if (RandomService.D100(1) <= accuracy)
            {
                successes++;

                if (RandomService.D100(1) <= accuracy)
                {
                    successes++;

                    if (RandomService.D100(1) <= accuracy)
                    {
                        successes++;

                        if (RandomService.D100(1) <= accuracy)
                        {
                            successes++;
                        }
                    }
                }
            }

            switch (successes)
            {
            case 0:
                result.Amount = 0f;
                result.Type   = ResistanceType.Full;
                break;

            case 1:
                result.Amount = 0.125f;
                result.Type   = ResistanceType.Eighth;
                break;

            case 2:
                result.Amount = 0.25f;
                result.Type   = ResistanceType.Fourth;
                break;

            case 3:
                result.Amount = 0.5f;
                result.Type   = ResistanceType.Half;
                break;

            case 4:
                result.Amount = 1.0f;
                result.Type   = ResistanceType.Zero;
                break;
            }

            return(result);
        }
示例#5
0
        private static int CalculateForceAccuracy(
            NWCreature caster,
            NWCreature target,
            ForceAbilityType abilityType)
        {
            EffectiveItemStats casterItemStats = caster.IsPlayer ?
                                                 PlayerStatService.GetPlayerItemEffectiveStats(caster.Object) :
                                                 null;
            float casterPrimary;
            float casterSecondary;
            float casterItemAccuracy = casterItemStats?.ForceAccuracy ?? 0;

            EffectiveItemStats targetItemStats = target.IsPlayer ?
                                                 PlayerStatService.GetPlayerItemEffectiveStats(target.Object) :
                                                 null;
            float targetPrimary;
            float targetSecondary;
            float targetItemDefense = targetItemStats?.ForceDefense ?? 0;

            switch (abilityType)
            {
            case ForceAbilityType.Electrical:
                casterPrimary     = caster.Intelligence;
                casterSecondary   = caster.Wisdom;
                targetPrimary     = target.Intelligence;
                targetSecondary   = target.Wisdom;
                targetItemDefense = targetItemDefense + targetItemStats?.ElectricalDefense ?? 0;
                break;

            case ForceAbilityType.Dark:
                casterPrimary     = caster.Intelligence;
                casterSecondary   = caster.Wisdom;
                targetPrimary     = target.Wisdom;
                targetSecondary   = target.Intelligence;
                targetItemDefense = targetItemDefense + targetItemStats?.DarkDefense ?? 0;
                break;

            case ForceAbilityType.Mind:
                casterPrimary     = caster.Wisdom;
                casterSecondary   = caster.Intelligence;
                targetPrimary     = target.Wisdom;
                targetSecondary   = target.Intelligence;
                targetItemDefense = targetItemDefense + targetItemStats?.MindDefense ?? 0;
                break;

            case ForceAbilityType.Light:
                casterPrimary     = caster.Wisdom;
                casterSecondary   = caster.Intelligence;
                targetPrimary     = target.Intelligence;
                targetSecondary   = target.Wisdom;
                targetItemDefense = targetItemDefense + targetItemStats?.ElectricalDefense ?? 0;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(abilityType), abilityType, null);
            }

            // Calculate accuracy based on the caster's primary and secondary stats. Add modifiers for overall item accuracy.
            float baseAccuracy = caster.Charisma * 0.25f + casterPrimary * 0.75f + casterSecondary * 0.5f + casterItemAccuracy * 0.15f;

            // Calculate defense based on target's primary and secondary stats. Add modifiers for specific defense types.
            float baseDefense = target.Charisma * 0.25f + targetPrimary * 0.75f + targetSecondary * 0.5f + targetItemDefense * 0.15f;

            // Temp defense increases whenever a hostile force ability is used. This is primarily a deterrant towards spamming the same ability over and over.
            string expiration = target.GetLocalString("TEMP_FORCE_DEFENSE_" + (int)abilityType);

            if (DateTime.TryParse(expiration, out var unused))
            {
                int tempDefense = target.GetLocalInt("TEMP_FORCE_DEFENSE_" + (int)abilityType);
                baseDefense += tempDefense;
            }


            float delta         = baseAccuracy - baseDefense;
            float finalAccuracy = delta < 0 ?
                                  75 + (float)Math.Floor(delta / 2.0f) :
                                  75 + delta;

            // Accuracy cannot go above 95% or below 0%
            if (finalAccuracy > 95)
            {
                finalAccuracy = 95;
            }
            else if (finalAccuracy < 0)
            {
                finalAccuracy = 0;
            }

            return((int)finalAccuracy);
        }