Exemplo n.º 1
0
        //public event EventHandler<StatModifyEventArgs> StatModify;
        //protected virtual int OnStatModify(Character character, StatIdentifier statToModify, int newValue, int oldValue)
        //{
        //    int returnValue = newValue;
        //    foreach (CharacterModifier modifier in this.Modifiers)
        //    {
        //        returnValue = modifier.Modify(character, statToModify, returnValue, oldValue);
        //    }

        //    return returnValue;
        //}

        private void Add(StatIdentifier statId, int modifyAmount)
        {
            int baseValue = baseStats[statId].Value;
            int modValue  = baseValue + modifyAmount;

            this.Set(statId, modValue);
        }
Exemplo n.º 2
0
        public void UpdateFromModifierChanges()
        {
            StatIdentifier genericStat = "generic_stat";

            var template = new StatTemplate()
            {
                Name     = "Generic Stat",
                MaxValue = 1000
            };
            var instance = template.CreateInstance(genericStat);

            var static5         = new EventField <float>(5);
            var changeFrom5to10 = new EventField <float>(5);

            Assert.AreEqual(0.0f, instance.Value);

            var modifier = new StatModifier(StatModificationPhase.Typical, StatModificationType.Additive, static5);

            instance.AddModifier(modifier);

            Assert.AreEqual(5.0f, instance.Value);

            var anotherModifier = new StatModifier(StatModificationPhase.Typical, StatModificationType.Additive, changeFrom5to10);

            instance.AddModifier(anotherModifier);

            Assert.AreEqual(10.0f, instance.Value);

            changeFrom5to10.Value = 10.0f;

            Assert.AreEqual(15.0f, instance.Value);
        }
Exemplo n.º 3
0
        public void UnsubscribeModifierWhenRemoved()
        {
            StatIdentifier genericStat = "generic_stat";

            var template = new StatTemplate()
            {
                Name     = "Generic Stat",
                MaxValue = 1000
            };
            var instance = template.CreateInstance(genericStat);

            var changingModifierValue = new EventField <float>(5);

            Assert.AreEqual(0.0f, instance.Value);

            var modifier = new StatModifier(StatModificationPhase.Typical, StatModificationType.Additive, changingModifierValue);

            instance.AddModifier(modifier);

            Assert.AreEqual(5.0f, instance.Value);

            changingModifierValue.Value = 10.0f;

            Assert.AreEqual(10.0f, instance.Value);

            instance.RemoveModifier(modifier);

            Assert.AreEqual(0.0f, instance.Value);

            changingModifierValue.Value = 15.0f;

            Assert.AreEqual(0.0f, instance.Value);
        }
Exemplo n.º 4
0
        //private void SetFactor(StatIdentifier statId, float factor, int restPoint)
        //{
        //    if (factor <= 0f)
        //    {
        //        this.Set(statId, 0);
        //        return;
        //    }

        //    int factorValue = MathHelper.Clamp((int)Math.Round(restPoint * factor), Stats.MinValue, Stats.MaxValue);
        //    this.Set(statId, factorValue);
        //}

        internal int GetStat(StatIdentifier statId)
        {
            var currentValue = baseStats[statId];
            var eventArgs    = currentValue.OnStatRead(statId, new StatReadEventArgs(currentValue.Value), character);

            return(eventArgs.Value);
            //return modStats[statId];
        }
Exemplo n.º 5
0
        private void Set(StatIdentifier statID, int newValue)
        {
            int prevValue = this.GetStat(statID);
            var eventArgs = this.baseStats[statID].OnStatChanged(statID, new StatChangedEventArgs(newValue, prevValue), character);

            baseStats[statID].Value = Stats.Clamp(eventArgs.Value);
            //modStats[statId] = this.OnStatModify(character, statId, modifyAmountTo, modStats[statId]);
        }
Exemplo n.º 6
0
 public StatInstance CreateInstance(StatIdentifier identifier)
 {
     return(new StatInstance()
     {
         Identifier = identifier,
         Template = this
     });
 }
Exemplo n.º 7
0
 internal StatReadEventArgs OnStatRead(StatIdentifier statID, StatReadEventArgs e, Character character)
 {
     //if (onStatRead[(int)statID] != null)
     //{
     //    onStatRead[(int)statID](character, e);
     //}
     if (this.Read != null)
     {
         this.Read(character, e);
     }
     return(e);
 }
Exemplo n.º 8
0
        private float GetStatFactor(StatIdentifier statId, int restPoint)
        {
            int statValue = this.GetStat(statId);

            if (statValue <= 0)
            {
                return(0f);
            }
            if (restPoint <= 0)
            {
                return(0f);
            }

            return((float)statValue / (float)restPoint);
        }
Exemplo n.º 9
0
    // this function allows access to a stat given an enum
    // mainly this is useful for Designer editing/inspector
    public void AdjustStat(StatIdentifier stat, int amount)
    {
        Stat statToAdjust;

        int statIndex = (int)stat;

        switch (statIndex)
        {
        case 0:
            statToAdjust = null;
            break;

        case 1:
            statToAdjust = MaxHealth;
            break;

        case 2:
            statToAdjust = MaxSanity;
            break;

        case 3:
            statToAdjust = Calm;
            break;

        case 4:
            statToAdjust = Survival;
            break;

        case 5:
            statToAdjust = Tenacity;
            break;

        default:
            Debug.LogWarning("Invald choice of stat identifier");
            statToAdjust = null;
            break;
        }

        // if we have a valid stat to adjust, adjust it
        if (statToAdjust != null)
        {
            statToAdjust.Adjust(amount);
        }
    }
Exemplo n.º 10
0
 public CharacterStat(StatIdentifier id)
 {
     this.StatID = id;
 }
Exemplo n.º 11
0
 public int?GetStatValue(D2Unit unit, StatIdentifier statId)
 {
     return(GetStatValue(unit, (ushort)statId));
 }
Exemplo n.º 12
0
 public bool IsOfType(StatIdentifier id)
 {
     return(LoStatID == (ushort)id);
 }
Exemplo n.º 13
0
 private float GetStatFactor(StatIdentifier statId)
 {
     return(GetStatFactor(statId, 100));
 }
Exemplo n.º 14
0
 public ITraitContextBuilder UseTrait(StatIdentifier statIdentifier, StatTemplate statTemplate)
 {
     statIdentifiers.Add(statIdentifier);
     statMapping.Add(statIdentifier, statTemplate);
     return(this);
 }
Exemplo n.º 15
0
        public bool TryHandleStat(D2Stat stat, out string description)
        {
            description = null;
            StatIdentifier statId = 0;

            if (Enum.IsDefined(typeof(StatIdentifier), stat.LoStatID))
            {
                statId = (StatIdentifier)stat.LoStatID;
            }
            else
            {
                return(false);
            }

            switch (statId)
            {
            //Handle one and two handed damage.
            case StatIdentifier.DamageMin:
            case StatIdentifier.DamageMax:
            case StatIdentifier.SecondaryDamageMin:
            case StatIdentifier.SecondaryDamageMax:
                // Only print once if it's a range.
                if (HasHandledDamageRange)
                {
                    return(true);
                }

                // Skip two-handed damage if there is a one-handed damage source or if no damage is defined.
                if (stat.IsOfType(StatIdentifier.SecondaryDamageMin) && !IsDamageMinSecondary)
                {
                    return(true);
                }
                if (stat.IsOfType(StatIdentifier.SecondaryDamageMax) && !IsDamageMaxSecondary)
                {
                    return(true);
                }

                // If not a range, print normally.
                if (!HasDamageRange)
                {
                    return(false);
                }
                // We also print twice if they are the same.
                if (DamageMin == DamageMax)
                {
                    return(false);
                }

                HasHandledDamageRange = true;
                description           = FormatSimpleDamage(DamageMin, DamageMax,
                                                           StringConstants.DamageRange,
                                                           StringConstants.DamageRange);
                return(true);

            // Handle enhanced damage.
            case StatIdentifier.ItemDamageMinPercent:
            {
                if (!HasDamagePercentRange)
                {
                    return(false);
                }
                string enhanced = stringReader.GetString(StringConstants.EnhancedDamage);
                description = string.Format("+{0}% {1}", stat.Value, enhanced.TrimEnd());
                return(true);
            }

            case StatIdentifier.ItemDamageMaxPercent:
                return(HasDamagePercentRange);

            // Handle fire damage ranges.
            case StatIdentifier.FireDamageMin:
                if (!HasFireRange)
                {
                    return(false);
                }
                description = FormatSimpleDamage(
                    FireMinDamage,
                    FireMaxDamage,
                    StringConstants.FireDamageRange,
                    StringConstants.FireDamage);
                return(true);

            case StatIdentifier.FireDamageMax:
                return(HasFireRange);

            // Handle lightning damage ranges.
            case StatIdentifier.LightningDamageMin:
                if (!HasLightningRange)
                {
                    return(false);
                }
                description = FormatSimpleDamage(
                    LightningMinDamage,
                    LightningMaxDamage,
                    StringConstants.LightningDamageRange,
                    StringConstants.LightningDamage);
                return(true);

            case StatIdentifier.LightningDamageMax:
                return(HasLightningRange);

            // Handle magic damage ranges.
            case StatIdentifier.MagicDamageMin:
                if (!HasMagicRange)
                {
                    return(false);
                }
                description = FormatSimpleDamage(
                    MagicMinDamage,
                    MagicMaxDamage,
                    StringConstants.MagicDamageRange,
                    StringConstants.MagicDamage);
                return(true);

            case StatIdentifier.MagicDamageMax:
                return(HasMagicRange);

            // Handle cold damage ranges.
            case StatIdentifier.ColdDamageMin:
                if (!HasColdRange)
                {
                    return(false);
                }
                description = FormatSimpleDamage(
                    ColdMinDamage,
                    ColdMaxDamage,
                    StringConstants.ColdDamageRange,
                    StringConstants.ColdDamage);
                return(true);

            case StatIdentifier.ColdDamageMax:
                return(HasColdRange);

            // Handle poison damage ranges.
            case StatIdentifier.PoisonDamageMax:
            case StatIdentifier.PoisonDamageDuration:
                return(HasPoisonRange);

            case StatIdentifier.PoisonDamageMin:
            {
                if (!HasPoisonRange)
                {
                    return(false);
                }
                int divisor  = PoisonDivisor == 0 ? 1 : PoisonDivisor;
                int duration = PoisonDuration / divisor;
                int min      = (PoisonMinDamage * duration + 128) / 256;
                int max      = (PoisonMaxDamage * duration + 128) / 256;
                duration /= 25;

                if (min == max)
                {
                    // Example: "6 Poison damage over 2 seconds"
                    int    arguments;
                    string format = stringReader.GetString(StringConstants.PoisonOverTimeSame);
                    format = stringReader.ConvertCFormatString(format, out arguments);
                    if (arguments != 2)
                    {
                        return(true);
                    }
                    description = string.Format(format, min, duration).TrimEnd();
                }
                else
                {
                    // Example: "2-10 Poison damage over 2 seconds"
                    int    arguments;
                    string format = stringReader.GetString(StringConstants.PoisonOverTime);
                    format = stringReader.ConvertCFormatString(format, out arguments);
                    if (arguments != 3)
                    {
                        return(true);
                    }
                    description = string.Format(format, min, max, duration).TrimEnd();
                }

                return(true);
            }

            // By default, the stat is not handled.
            default: return(false);
            }
        }
Exemplo n.º 16
0
 public void OnStatReadUnRegister(StatIdentifier statID, StatReadEventHandler function)
 {
     baseStats[statID].Read -= function;
     //onStatRead[(int)statID] -= function;
 }
Exemplo n.º 17
0
 public void OnStatChangedUnRegister(StatIdentifier statID, StatChangedEventHandler function)
 {
     baseStats[statID].Changed -= function;
     //onStatModified[(int)statID] -= function;
 }