public GemBaseViewModel(ItemImageService itemImageService, ItemDB.Gem gem)
 {
     Gem  = gem;
     Name = Gem.Name;
     Icon = new ItemImage(itemImageService, Name, ItemClass.ActiveSkillGem);
 }
示例#2
0
        protected override async Task LoadAsync()
        {
            await LoadRePoEAsync();

            foreach (var gemId in _gemsJson.Properties().Select(p => p.Name))
            {
                var gemObj = _gemsJson.Value <JObject>(gemId);
                if (gemObj["base_item"].Type == JTokenType.Null)
                {
                    Log.Info($"Skipping gem without base item with id {gemId}");
                    continue;
                }
                var baseItem = gemObj.Value <JObject>("base_item");
                if (baseItem.Value <string>("release_state") == "unreleased")
                {
                    Log.Info($"Skipping unreleased gem with id {gemId}");
                    continue;
                }

                var tooltipObj    = _gemTooltipsJson.Value <JObject>(gemId);
                var tooltipStatic = tooltipObj.Value <JObject>("static");
                if (tooltipStatic.Count == 0)
                {
                    Log.Warn($"Skipping gem with id {gemId} because 'static' is empty");
                    continue;
                }

                // Gem.Name
                var name = tooltipStatic.Value <string>("name");
                // Gem.Tags
                var tags = tooltipStatic.Value <JArray>("properties").Value <string>(0);
                // Gem.Attributes
                var attributes   = new List <ItemDB.Attribute>();
                var levelProps   = tooltipObj.Value <JObject>("per_level").Properties().ToList();
                var levelInts    = levelProps.Select(p => p.Name.ParseInt()).ToList();
                var levelObjects = levelProps.Select(p => p.Value).Cast <JObject>().ToList();
                // properties
                // skip line with gem tags and line with gem level
                attributes.AddRange(ParseAttributes(levelInts, levelObjects, "properties", 2));
                // quality stats
                attributes.AddRange(ParseAttributes(levelInts, levelObjects, "quality_stats", atQuality: 1));
                // stats
                attributes.AddRange(ParseAttributes(levelInts, levelObjects, "stats"));
                var gem = new ItemDB.Gem
                {
                    Name       = name,
                    Tags       = tags,
                    Attributes = attributes
                };

                var activeSkill = gemObj["active_skill"];
                if (activeSkill != null)
                {
                    // Gem.RequiresEquippedShield, RequiredHand, StrikesWithBothWeapons
                    var types = activeSkill.Value <JArray>("types").Values <string>().ToHashSet();
                    if (types.Contains("shield_only"))
                    {
                        gem.RequiresEquippedShield = true;
                    }
                    if (types.Contains("dual_wield_only"))
                    {
                        gem.RequiredHand = Compute.WeaponHand.DualWielded;
                    }
                    else if (types.Contains("uses_main_hand_when_dual_wielding"))
                    {
                        gem.RequiredHand = Compute.WeaponHand.Main;
                    }
                    // Reposte doesn't have the the active skill type
                    else if (types.Contains("uses_both_at_once_when_dual_wielding") || gem.Name == "Riposte")
                    {
                        gem.StrikesWithBothWeapons = true;
                    }
                    // Gem.RequiredWeapon
                    if (types.Contains("attack"))
                    {
                        var weaponRestrictions = activeSkill.Value <JArray>("weapon_restrictions").Values <string>().ToList();
                        foreach (var restriction in weaponRestrictions)
                        {
                            // map game's ItemClass to our WeaponType
                            var w = restriction;
                            if (w == "Thrusting One Hand Sword")
                            {
                                w = "One Hand Sword";
                            }
                            else if (w == "Sceptre")
                            {
                                w = "One Hand Mace";
                            }
                            w = Regex.Replace(w, @"([a-z]) ([A-Z])", "$1$2");
                            Compute.WeaponType weaponType;
                            if (Enum.TryParse(w, out weaponType))
                            {
                                gem.RequiredWeapon |= weaponType;
                            }
                            else
                            {
                                Log.Error("Unknown weapon type: " + w);
                            }
                        }
                    }
                }

                ItemDB.Add(gem);
            }

            ItemDB.WriteToCompletePath(SavePath);
        }
 public GemBaseViewModel(ItemImageService itemImageService, ItemDB.Gem gem)
 {
     Gem  = gem;
     Name = Gem.Name;
     Icon = new ItemImage(itemImageService, Name, ItemGroup.Gem);
 }