public GemBaseViewModel(ItemImageService itemImageService, ItemDB.Gem gem) { Gem = gem; Name = Gem.Name; Icon = new ItemImage(itemImageService, Name, ItemClass.ActiveSkillGem); }
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); }