Exemplo n.º 1
0
        public IEnumerable <string> Add(StatId id, string?expression = null)
        {
            IEnumerable <string> errors = new List <string>();

            if (Exists(id))
            {
                errors = errors.Append($"Stat already exists: {id}");
            }

            var context = new ParsingContext(this, _functionService)
            {
                StatId = id,
            };

            errors = errors.Concat(_parser.Parse(out var stat, context, id.ToString(), expression));
            if (stat == null)
            {
                return(errors);
            }

            errors = errors.Concat(IsRecursive(stat));

            if (errors.Any())
            {
                return(errors);
            }

            Stats.Add(stat.Id, stat);

            return(errors);
        }
Exemplo n.º 2
0
        //TODO move to an extension method in tests
        public IEnumerable <string> Update(StatId id, string?expression = null)
        {
            IEnumerable <string> errors = new List <string>();

            if (!Exists(id))
            {
                errors = errors.Append($"{id} does not exists");
            }

            var context = new ParsingContext(this, _functionService)
            {
                StatId = id,
            };

            errors = errors.Concat(_parser.Parse(out var stat, context, id.ToString(), expression));
            if (stat == null)
            {
                return(errors);
            }

            errors = errors.Concat(IsRecursive(stat));

            if (!errors.Any())
            {
                Stats[id] = stat;
                _cache.Clear();
            }

            return(errors);
        }
        public bool Equals(DestinyHistoricalStatsValue input)
        {
            if (input == null)
            {
                return(false);
            }

            return
                ((
                     StatId == input.StatId ||
                     (StatId != null && StatId.Equals(input.StatId))
                     ) &&
                 (
                     Basic == input.Basic ||
                     (Basic != null && Basic.Equals(input.Basic))
                 ) &&
                 (
                     Pga == input.Pga ||
                     (Pga != null && Pga.Equals(input.Pga))
                 ) &&
                 (
                     Weighted == input.Weighted ||
                     (Weighted != null && Weighted.Equals(input.Weighted))
                 ) &&
                 (
                     ActivityId == input.ActivityId ||
                     (ActivityId.Equals(input.ActivityId))
                 ));
        }
Exemplo n.º 4
0
        private Task StartRegen(StatId statId, StatId regenStatId, StatId timeStatId)
        {
            // TODO: merge regen updates with larger packets
            return(Task.Run(async() =>
            {
                while (true)
                {
                    await Task.Delay(Stats[timeStatId].Total);

                    lock (Stats)
                    {
                        if (Stats[statId].Total >= Stats[statId].Bonus)
                        {
                            return;
                        }

                        // TODO: Check if regen-enabled
                        AddStatRegen(statId, regenStatId);
                        Value.Session?.FieldManager.BroadcastPacket(StatPacket.UpdateStats(this, statId));
                        if (Value.Party != null)
                        {
                            Value.Party.BroadcastPacketParty(PartyPacket.UpdateHitpoints(Value));
                        }
                    }
                }
            }));
        }
Exemplo n.º 5
0
    private static void HandleStatIncrement(GameSession session, PacketReader packet)
    {
        StatId statTypeIndex = (StatId)packet.ReadByte();

        session.Player.StatPointDistribution.AddPoint(statTypeIndex);
        session.Player.Stats.Allocate(statTypeIndex);
        session.Send(StatPointPacket.WriteStatPointDistribution(session.Player));
        session.Send(StatPacket.SetStats(session.Player.FieldPlayer));
    }
Exemplo n.º 6
0
    public void AddPoint(StatId statType)
    {
        if (AllocatedStats.ContainsKey(statType))
        {
            AllocatedStats[statType] += 1;
            return;
        }

        AllocatedStats[statType] = 1;
    }
Exemplo n.º 7
0
    private static List <ParserStat> ParseFloatValues(StatId attribute, XmlNode node)
    {
        List <ParserStat> values = new();

        for (int i = 2; i <= 17; i++)
        {
            values.Add(new(attribute, float.Parse(node.Attributes[$"idx{i}"].Value)));
        }

        return(values);
    }
Exemplo n.º 8
0
        public double GetValue(StatId id)
        {
            if (_cache.ContainsKey(id))
            {
                return(_cache[id]);
            }

            var value = Stats[id].Resolve();

            //_cache.Add(id, value);
            return(value);
        }
Exemplo n.º 9
0
    public static void WriteStat(this PacketWriter pWriter, Stats stats, StatId statId)
    {
        if (statId == StatId.Hp)
        {
            pWriter.WriteLong(stats[statId].BonusLong);
            pWriter.WriteLong(stats[statId].BaseLong);
            pWriter.WriteLong(stats[statId].TotalLong);
            return;
        }

        for (int i = 0; i < 3; i++)
        {
            pWriter.WriteInt(stats[statId][i]);
        }
    }
Exemplo n.º 10
0
    private static void AddHiddenNormalStat(List <NormalStat> normalStats, StatId attribute, int value, float calibrationFactor)
    {
        NormalStat normalStat = normalStats.FirstOrDefault(x => x.ItemAttribute == attribute);

        if (normalStat == null)
        {
            return;
        }
        int calibratedValue = (int)(value * calibrationFactor);

        int index        = normalStats.FindIndex(x => x.ItemAttribute == attribute);
        int biggerValue  = Math.Max(value, calibratedValue);
        int smallerValue = Math.Min(value, calibratedValue);
        int summedFlat   = normalStat.Flat + RandomProvider.Get().Next(smallerValue, biggerValue);

        normalStats[index] = new(normalStat.ItemAttribute, summedFlat, normalStat.Percent);
    }
Exemplo n.º 11
0
        public bool Equals(DestinyLeaderboard input)
        {
            if (input == null)
            {
                return(false);
            }

            return
                ((
                     StatId == input.StatId ||
                     (StatId != null && StatId.Equals(input.StatId))
                     ) &&
                 (
                     Entries == input.Entries ||
                     (Entries != null && Entries.SequenceEqual(input.Entries))
                 ));
        }
Exemplo n.º 12
0
    public static PacketWriter UpdateStats(IFieldActor player, StatId statId, params StatId[] otherIds)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.STAT);

        pWriter.WriteInt(player.ObjectId);
        pWriter.Write(StatsMode.UpdateStats);
        pWriter.WriteByte((byte)(1 + otherIds.Length));
        pWriter.Write(statId);
        pWriter.WriteStat(player.Stats, statId);
        foreach (StatId otherId in otherIds)
        {
            pWriter.Write(otherId);
            pWriter.WriteStat(player.Stats, statId);
        }

        return(pWriter);
    }
Exemplo n.º 13
0
        public IEnumerable <string> Remove(StatId id, bool cascade = false)
        {
            IEnumerable <string> errors = new List <string>();

            if (!Exists(id))
            {
                errors = errors.Append($"{id} does not exists");                 //throw??
            }
            var deps = Stats.Where(s => s.Value.Id != id)
                       .Where(s => s.Value.Expressions.SelectMany(e => e.Nodes)
                              .Any(node =>
            {
                if (node is StatNode sn && sn.Id == id)
                {
                    return(true);
                }
                if (node is VariableNode vn && vn.Id.StatId == id)
                {
                    return(true);
                }
                return(false);
            }))
                       .Select(s => s.Value.Id)
                       .ToArray();

            if (!deps.Any())
            {
                Stats.Remove(id);
                return(errors);
            }

            if (!cascade)
            {
                return(errors.Concat(deps.Select(depId => $"Cannot remove {depId} because {depId} depends on it")));
            }

            errors = errors.Concat(deps.SelectMany(stat => Remove(stat, true)));
            Stats.Remove(id);
            _cache.Remove(id);

            return(errors);
        }
Exemplo n.º 14
0
        private void AddStatRegen(StatId statIndex, StatId regenStatIndex)
        {
            int regenAmount = Stats[regenStatIndex].Total;

            if (regenAmount <= 0)
            {
                return;
            }

            Stat stat = Stats[statIndex];

            lock (stat)
            {
                if (stat.Total < stat.Bonus)
                {
                    int missingAmount = stat.Bonus - stat.Total;
                    stat.Increase(Math.Clamp(regenAmount, 0, missingAmount));
                }
            }
        }
        public bool Equals(DestinyClanAggregateStat input)
        {
            if (input == null)
            {
                return(false);
            }

            return
                ((
                     Mode == input.Mode ||
                     (Mode != null && Mode.Equals(input.Mode))
                     ) &&
                 (
                     StatId == input.StatId ||
                     (StatId != null && StatId.Equals(input.StatId))
                 ) &&
                 (
                     Value == input.Value ||
                     (Value != null && Value.Equals(input.Value))
                 ));
        }
Exemplo n.º 16
0
    private static ItemStat ReadStat(int statId, int value)
    {
        // Normal Stat with percent value
        if (statId >= 1000 && statId < 11000)
        {
            float  percent   = (float)(value + 5) / 10000;
            StatId attribute = (StatId)(statId - 1000);
            return(new NormalStat(attribute, 0, percent));
        }

        // Special Stat with percent value
        if (statId >= 11000)
        {
            float         percent   = (float)(value + 5) / 10000;
            SpecialStatId attribute = (SpecialStatId)(statId - 11000);
            return(new SpecialStat(attribute, 0, percent));
        }

        // Normal Stat with flat value
        return(new NormalStat((StatId)statId, value, 0));
    }
Exemplo n.º 17
0
        public float?GetStatValue(StatId statId)
        {
            var stat = Stats.SingleOrDefault(st => st.StatId == statId);

            return(stat != null ? stat.Value : (float?)null);
        }
Exemplo n.º 18
0
 public Stat(StatId id, Expression expression)
     : this(id, new List <NamedExpression> {
Exemplo n.º 19
0
        public bool Equals(DestinyHistoricalStatsDefinition input)
        {
            if (input == null)
            {
                return(false);
            }

            return
                ((
                     StatId == input.StatId ||
                     (StatId != null && StatId.Equals(input.StatId))
                     ) &&
                 (
                     Group == input.Group ||
                     (Group != null && Group.Equals(input.Group))
                 ) &&
                 (
                     PeriodTypes == input.PeriodTypes ||
                     (PeriodTypes != null && PeriodTypes.SequenceEqual(input.PeriodTypes))
                 ) &&
                 (
                     Modes == input.Modes ||
                     (Modes != null && Modes.SequenceEqual(input.Modes))
                 ) &&
                 (
                     Category == input.Category ||
                     (Category != null && Category.Equals(input.Category))
                 ) &&
                 (
                     StatName == input.StatName ||
                     (StatName != null && StatName.Equals(input.StatName))
                 ) &&
                 (
                     StatNameAbbr == input.StatNameAbbr ||
                     (StatNameAbbr != null && StatNameAbbr.Equals(input.StatNameAbbr))
                 ) &&
                 (
                     StatDescription == input.StatDescription ||
                     (StatDescription != null && StatDescription.Equals(input.StatDescription))
                 ) &&
                 (
                     UnitType == input.UnitType ||
                     (UnitType != null && UnitType.Equals(input.UnitType))
                 ) &&
                 (
                     IconImage == input.IconImage ||
                     (IconImage != null && IconImage.Equals(input.IconImage))
                 ) &&
                 (
                     MergeMethod == input.MergeMethod ||
                     (MergeMethod.Equals(input.MergeMethod))
                 ) &&
                 (
                     UnitLabel == input.UnitLabel ||
                     (UnitLabel != null && UnitLabel.Equals(input.UnitLabel))
                 ) &&
                 (
                     Weight == input.Weight ||
                     (Weight.Equals(input.Weight))
                 ) &&
                 (
                     MedalTierHash == input.MedalTierHash ||
                     (MedalTierHash.Equals(input.MedalTierHash))
                 ));
        }
Exemplo n.º 20
0
 public StatVariable GetStat(StatId id)
 {
     return(variables_stats[(int)id]);
 }
Exemplo n.º 21
0
 public Stat Get(StatId id) => Stats[id];
Exemplo n.º 22
0
 public NormalStat(ParserStat stat)
 {
     ItemAttribute = stat.Id;
     Flat          = stat.Flat;
     Percent       = stat.Percent;
 }
Exemplo n.º 23
0
 public NormalStat(StatId attribute, int flat, float percent)
 {
     ItemAttribute = attribute;
     Flat          = flat;
     Percent       = percent;
 }
Exemplo n.º 24
0
 public bool Exists(StatId id) => Stats.ContainsKey(id);
 public ParserStat(StatId type, float percent)
 {
     Id      = type;
     Flat    = 0;
     Percent = percent;
 }
    string StatToString(StatId id)
    {
        string ret;

        switch (id)
        {
        case StatId.WeaponDmg:
            ret = "Weapon Damage";
            break;

        case StatId.MaxHealth:
            ret = "Max Health";
            break;

        case StatId.HealthRegen:
            ret = "Health Regen";
            break;

        case StatId.MaxResource:
            ret = "Max Resource";
            break;

        case StatId.ResourceRegen:
            ret = "Resource Regen";
            break;

        case StatId.MoveSpeed:
            ret = "Move Speed";
            break;

        case StatId.AttackSpeed:
            ret = "Attack Speed";
            break;

        case StatId.Armor:
            ret = "Armor";
            break;

        case StatId.PhysicRes:
            ret = "Physical Resist";
            break;

        case StatId.FireRes:
            ret = "Fire Resist";
            break;

        case StatId.WaterRes:
            ret = "Water Resist";
            break;

        case StatId.ShockRes:
            ret = "Shock Resist";
            break;

        case StatId.EarthRes:
            ret = "Earth Resistance";
            break;

        default:
            ret = "Unknown";
            break;
        }

        return(ret);
    }
 public ParserStat(StatId type, int flat)
 {
     Id      = type;
     Flat    = flat;
     Percent = 0;
 }
Exemplo n.º 28
0
 public StatNode(StatService statService, string id)
     : base(id, NodeType.Variable, 1)
 {
     _statService = statService;
     Id           = new StatId(id);
 }