From 20a58bb4378ef2acd825eef9460c9be220639318 Mon Sep 17 00:00:00 2001 From: Rosen Rusinov Date: Thu, 18 Apr 2024 21:42:10 +0200 Subject: [PATCH 1/3] parse talents data in characters and add talent is known apl value --- proto/apl.proto | 9 +- proto/ui.proto | 8 + sim/core/apl_value.go | 4 + sim/core/apl_values_talent.go | 42 + sim/core/character.go | 2 + sim/core/talent_trees/death_knight.json | 827 ++++++++ sim/core/talent_trees/druid.json | 881 +++++++++ sim/core/talent_trees/hunter.json | 815 ++++++++ sim/core/talent_trees/hunter_cunning.json | 287 +++ sim/core/talent_trees/hunter_ferocity.json | 269 +++ sim/core/talent_trees/hunter_tenacity.json | 285 +++ sim/core/talent_trees/mage.json | 867 +++++++++ sim/core/talent_trees/paladin.json | 827 ++++++++ sim/core/talent_trees/priest.json | 881 +++++++++ sim/core/talent_trees/rogue.json | 791 ++++++++ sim/core/talent_trees/shaman.json | 806 ++++++++ sim/core/talent_trees/talent_trees_embes.go | 33 + sim/core/talent_trees/warlock.json | 787 ++++++++ sim/core/talent_trees/warrior.json | 845 +++++++++ sim/core/talents.go | 93 + sim/druid/druid.go | 2 + sim/hunter/hunter.go | 2 + sim/mage/mage.go | 2 + sim/paladin/paladin.go | 2 + sim/priest/priest.go | 3 + sim/rogue/rogue.go | 2 + sim/shaman/shaman.go | 2 + sim/warlock/warlock.go | 3 + sim/warrior/warrior.go | 2 + .../individual_sim_ui/apl_helpers.ts | 74 + .../individual_sim_ui/apl_values.ts | 10 + ui/core/proto_utils/database.ts | 27 +- ui/core/talents/talents_picker.tsx | 2 + ui/core/talents/trees/death_knight.json | 1655 ++++++++--------- 34 files changed, 10317 insertions(+), 830 deletions(-) create mode 100644 sim/core/apl_values_talent.go create mode 100644 sim/core/talent_trees/death_knight.json create mode 100644 sim/core/talent_trees/druid.json create mode 100644 sim/core/talent_trees/hunter.json create mode 100644 sim/core/talent_trees/hunter_cunning.json create mode 100644 sim/core/talent_trees/hunter_ferocity.json create mode 100644 sim/core/talent_trees/hunter_tenacity.json create mode 100644 sim/core/talent_trees/mage.json create mode 100644 sim/core/talent_trees/paladin.json create mode 100644 sim/core/talent_trees/priest.json create mode 100644 sim/core/talent_trees/rogue.json create mode 100644 sim/core/talent_trees/shaman.json create mode 100644 sim/core/talent_trees/talent_trees_embes.go create mode 100644 sim/core/talent_trees/warlock.json create mode 100644 sim/core/talent_trees/warrior.json create mode 100644 sim/core/talents.go diff --git a/proto/apl.proto b/proto/apl.proto index 94c5575992..88fad794db 100644 --- a/proto/apl.proto +++ b/proto/apl.proto @@ -78,7 +78,7 @@ message APLAction { } } -// NextIndex: 68 +// NextIndex: 69 message APLValue { oneof value { // Operators @@ -141,6 +141,9 @@ message APLValue { APLValueSpellChanneledTicks spell_channeled_ticks = 57; APLValueSpellCurrentCost spell_current_cost = 62; + // Talent Values + APLValueTalentIsKnown talent_is_known = 68; + // Aura values APLValueAuraIsActive aura_is_active = 22; APLValueAuraIsActiveWithReactionTime aura_is_active_with_reaction_time = 50; @@ -457,6 +460,10 @@ message APLValueSpellCurrentCost { ActionID spell_id = 1; } +message APLValueTalentIsKnown { + ActionID talent_id = 1; +} + message APLValueAuraIsActive { UnitReference source_unit = 2; ActionID aura_id = 1; diff --git a/proto/ui.proto b/proto/ui.proto index e29e4c986d..6ffaa05e25 100644 --- a/proto/ui.proto +++ b/proto/ui.proto @@ -201,6 +201,14 @@ message UIGem { Profession required_profession = 9; } +message UITalent { + int32 id = 1; + string baseName = 2; + string name = 3; + string spec = 4; + int32 maxPoints = 5; +} + message IconData { int32 id = 1; string name = 2; diff --git a/sim/core/apl_value.go b/sim/core/apl_value.go index 393902166b..bca14a4a7f 100644 --- a/sim/core/apl_value.go +++ b/sim/core/apl_value.go @@ -164,6 +164,10 @@ func (rot *APLRotation) newAPLValue(config *proto.APLValue) APLValue { case *proto.APLValue_SpellChanneledTicks: return rot.newValueSpellChanneledTicks(config.GetSpellChanneledTicks()) + // Talents + case *proto.APLValue_TalentIsKnown: + return rot.newValueTalentIsKnown(config.GetTalentIsKnown()) + // Auras case *proto.APLValue_AuraIsActive: return rot.newValueAuraIsActive(config.GetAuraIsActive()) diff --git a/sim/core/apl_values_talent.go b/sim/core/apl_values_talent.go new file mode 100644 index 0000000000..7b39d6643a --- /dev/null +++ b/sim/core/apl_values_talent.go @@ -0,0 +1,42 @@ +package core + +import ( + "fmt" + + "github.com/wowsims/cata/sim/core/proto" +) + +type APLTalent struct { + id int32 + known bool +} + +type APLValueTalentKnown struct { + DefaultAPLValueImpl + talent APLTalent +} + +func (rot *APLRotation) newValueTalentIsKnown(config *proto.APLValueTalentIsKnown) APLValue { + character := rot.unit.Env.Raid.GetPlayerFromUnit(rot.unit).GetCharacter() + talents := character.talents + if talents == nil { + rot.ValidationWarning("%s does not have talent data created", rot.unit.Label) + return nil + } + spellId := config.GetTalentId().GetSpellId() + return &APLValueTalentKnown{ + talent: APLTalent{ + id: spellId, + known: talents.IsKnown(spellId), + }, + } +} +func (value *APLValueTalentKnown) Type() proto.APLValueType { + return proto.APLValueType_ValueTypeBool +} +func (value *APLValueTalentKnown) GetBool(sim *Simulation) bool { + return value.talent.known +} +func (value *APLValueTalentKnown) String() string { + return fmt.Sprintf("Talent Known(%d)", value.talent.id) +} diff --git a/sim/core/character.go b/sim/core/character.go index 8f6901ea9f..cf1e081f0d 100644 --- a/sim/core/character.go +++ b/sim/core/character.go @@ -84,6 +84,8 @@ type Character struct { conjuredCD *Timer Pets []*Pet // cached in AddPet, for advance() + + talents *Talents } func NewCharacter(party *Party, partyIndex int, player *proto.Player) Character { diff --git a/sim/core/talent_trees/death_knight.json b/sim/core/talent_trees/death_knight.json new file mode 100644 index 0000000000..ab98af0631 --- /dev/null +++ b/sim/core/talent_trees/death_knight.json @@ -0,0 +1,827 @@ +[ + { + "name": "Blood", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/398.jpg", + "talents": [ + { + "fieldName": "butchery", + "fancyName": "Butchery", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 48979, + 49483 + ], + "maxPoints": 2 + }, + { + "fieldName": "bladeBarrier", + "fancyName": "Blade Barrier", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 49182, + 49500, + 49501 + ], + "maxPoints": 3 + }, + { + "fieldName": "bladedArmor", + "fancyName": "Bladed Armor", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 48978, + 49390, + 49391 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedBloodTap", + "fancyName": "Improved Blood Tap", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 94553, + 94555 + ], + "maxPoints": 2 + }, + { + "fieldName": "scentOfBlood", + "fancyName": "Scent Of Blood", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 49004, + 49508, + 49509 + ], + "maxPoints": 3 + }, + { + "fieldName": "scarletFever", + "fancyName": "Scarlet Fever", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 81131, + 81132 + ], + "maxPoints": 2 + }, + { + "fieldName": "handOfDoom", + "fancyName": "Hand Of Doom", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 85793, + 85794 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodCakedBlade", + "fancyName": "Blood Caked Blade", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 49219, + 49627, + 49628 + ], + "maxPoints": 3 + }, + { + "fieldName": "boneShield", + "fancyName": "Bone Shield", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49222 + ], + "maxPoints": 1 + }, + { + "fieldName": "toughness", + "fancyName": "Toughness", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 49042, + 49786, + 49787 + ], + "maxPoints": 3 + }, + { + "fieldName": "abominationsMight", + "fancyName": "Abominations Might", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 53137, + 53138 + ], + "maxPoints": 2 + }, + { + "fieldName": "sanguineFortitude", + "fancyName": "Sanguine Fortitude", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 81125, + 81127 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodParasite", + "fancyName": "Blood Parasite", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 49027, + 49542 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedBloodPresence", + "fancyName": "Improved Blood Presence", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 50365, + 50371 + ], + "maxPoints": 2 + }, + { + "fieldName": "willOfTheNecropolis", + "fancyName": "Will Of The Necropolis", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 52284, + 81163, + 81164 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "runeTap", + "fancyName": "Rune Tap", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 48982 + ], + "maxPoints": 1 + }, + { + "fieldName": "vampiricBlood", + "fancyName": "Vampiric Blood", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 55233 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedDeathStrike", + "fancyName": "Improved Death Strike", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 62905, + 62908, + 81138 + ], + "maxPoints": 3 + }, + { + "fieldName": "crimsonScourge", + "fancyName": "Crimson Scourge", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 81135, + 81136 + ], + "maxPoints": 2 + }, + { + "fieldName": "dancingRuneWeapon", + "fancyName": "Dancing Rune Weapon", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 49028 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Frost", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/399.jpg", + "talents": [ + { + "fieldName": "runicPowerMastery", + "fancyName": "Runic Power Mastery", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 49455, + 50147, + 91145 + ], + "maxPoints": 3 + }, + { + "fieldName": "icyReach", + "fancyName": "Icy Reach", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 55061, + 55062 + ], + "maxPoints": 2 + }, + { + "fieldName": "nervesOfColdSteel", + "fancyName": "Nerves Of Cold Steel", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 49226, + 50137, + 50138 + ], + "maxPoints": 3 + }, + { + "fieldName": "annihilation", + "fancyName": "Annihilation", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 51468, + 51472, + 51473 + ], + "maxPoints": 3 + }, + { + "fieldName": "lichborne", + "fancyName": "Lichborne", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 49039 + ], + "maxPoints": 1 + }, + { + "fieldName": "onAPaleHorse", + "fancyName": "On A Pale Horse", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 51983, + 51986 + ], + "maxPoints": 2 + }, + { + "fieldName": "endlessWinter", + "fancyName": "Endless Winter", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 49137, + 49657 + ], + "maxPoints": 2 + }, + { + "fieldName": "mercilessCombat", + "fancyName": "Merciless Combat", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 49024, + 49538 + ], + "maxPoints": 2 + }, + { + "fieldName": "chillOfTheGrave", + "fancyName": "Chill Of The Grave", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49149, + 50115 + ], + "maxPoints": 2 + }, + { + "fieldName": "killingMachine", + "fancyName": "Killing Machine", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 51123, + 51127, + 51128 + ], + "maxPoints": 3 + }, + { + "fieldName": "rime", + "fancyName": "Rime", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 49188, + 56822, + 59057 + ], + "maxPoints": 3 + }, + { + "fieldName": "pillarOfFrost", + "fancyName": "Pillar Of Frost", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 51271 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedIcyTalons", + "fancyName": "Improved Icy Talons", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 55610 + ], + "maxPoints": 1 + }, + { + "fieldName": "brittleBones", + "fancyName": "Brittle Bones", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 81327, + 81328 + ], + "maxPoints": 2 + }, + { + "fieldName": "chilblains", + "fancyName": "Chilblains", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 50040, + 50041 + ], + "maxPoints": 2 + }, + { + "fieldName": "hungeringCold", + "fancyName": "Hungering Cold", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 49203 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedFrostPresence", + "fancyName": "Improved Frost Presence", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 50384, + 50385 + ], + "maxPoints": 2 + }, + { + "fieldName": "threatOfThassarian", + "fancyName": "Threat Of Thassarian", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 65661, + 66191, + 66192 + ], + "maxPoints": 3 + }, + { + "fieldName": "mightOfTheFrozenWastes", + "fancyName": "Might Of The Frozen Wastes", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 81330, + 81332, + 81333 + ], + "maxPoints": 3 + }, + { + "fieldName": "howlingBlast", + "fancyName": "Howling Blast", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 49184 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Unholy", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/400.jpg", + "talents": [ + { + "fieldName": "unholyCommand", + "fancyName": "Unholy Command", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 49588, + 49589 + ], + "maxPoints": 2 + }, + { + "fieldName": "virulence", + "fancyName": "Virulence", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 48962, + 49567, + 49568 + ], + "maxPoints": 3 + }, + { + "fieldName": "epidemic", + "fancyName": "Epidemic", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 49036, + 49562, + 81334 + ], + "maxPoints": 3 + }, + { + "fieldName": "desecration", + "fancyName": "Desecration", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 55666, + 55667 + ], + "maxPoints": 2 + }, + { + "fieldName": "resilientInfection", + "fancyName": "Resilient Infection", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 81338, + 81339 + ], + "maxPoints": 2 + }, + { + "fieldName": "morbidity", + "fancyName": "Morbidity", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 48963, + 49564, + 49565 + ], + "maxPoints": 3 + }, + { + "fieldName": "runicCorruption", + "fancyName": "Runic Corruption", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 51459, + 51462 + ], + "maxPoints": 2 + }, + { + "fieldName": "unholyFrenzy", + "fancyName": "Unholy Frenzy", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49016 + ], + "maxPoints": 1 + }, + { + "fieldName": "contagion", + "fancyName": "Contagion", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 91316, + 91319 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 2 + } + }, + { + "fieldName": "shadowInfusion", + "fancyName": "Shadow Infusion", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 48965, + 49571, + 49572 + ], + "maxPoints": 3 + }, + { + "fieldName": "deathsAdvance", + "fancyName": "Deaths Advance", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 96269, + 96270 + ], + "maxPoints": 2 + }, + { + "fieldName": "magicSuppression", + "fancyName": "Magic Suppression", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 49224, + 49610, + 49611 + ], + "maxPoints": 3 + }, + { + "fieldName": "rageOfRivendare", + "fancyName": "Rage Of Rivendare", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 51745, + 51746, + 91323 + ], + "maxPoints": 3 + }, + { + "fieldName": "unholyBlight", + "fancyName": "Unholy Blight", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 49194 + ], + "maxPoints": 1 + }, + { + "fieldName": "antiMagicZone", + "fancyName": "Anti Magic Zone", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 51052 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "improvedUnholyPresence", + "fancyName": "Improved Unholy Presence", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 50391, + 50392 + ], + "maxPoints": 2 + }, + { + "fieldName": "darkTransformation", + "fancyName": "Dark Transformation", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 63560 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 3 + } + }, + { + "fieldName": "ebonPlaguebringer", + "fancyName": "Ebon Plaguebringer", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 51099, + 51160 + ], + "maxPoints": 2 + }, + { + "fieldName": "suddenDoom", + "fancyName": "Sudden Doom", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 49018, + 49529, + 49530 + ], + "maxPoints": 3 + }, + { + "fieldName": "summonGargoyle", + "fancyName": "Summon Gargoyle", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 49206 + ], + "maxPoints": 1 + } + ] + } + ] diff --git a/sim/core/talent_trees/druid.json b/sim/core/talent_trees/druid.json new file mode 100644 index 0000000000..06bf712a5f --- /dev/null +++ b/sim/core/talent_trees/druid.json @@ -0,0 +1,881 @@ +[ + { + "name": "Balance", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/752.jpg", + "talents": [ + { + "fieldName": "naturesGrace", + "fancyName": "Natures Grace", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 16880, + 61345, + 61346 + ], + "maxPoints": 3 + }, + { + "fieldName": "starlightWrath", + "fancyName": "Starlight Wrath", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 16814, + 16815, + 16816 + ], + "maxPoints": 3 + }, + { + "fieldName": "naturesMajesty", + "fancyName": "Natures Majesty", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 35363, + 35364 + ], + "maxPoints": 2 + }, + { + "fieldName": "genesis", + "fancyName": "Genesis", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 57810, + 57811, + 57812 + ], + "maxPoints": 3 + }, + { + "fieldName": "moonglow", + "fancyName": "Moonglow", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 16845, + 16846, + 16847 + ], + "maxPoints": 3 + }, + { + "fieldName": "balanceOfPower", + "fancyName": "Balance Of Power", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 33592, + 33596 + ], + "maxPoints": 2 + }, + { + "fieldName": "euphoria", + "fancyName": "Euphoria", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 81061, + 81062 + ], + "maxPoints": 2 + }, + { + "fieldName": "moonkinForm", + "fancyName": "Moonkin Form", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 24858 + ], + "maxPoints": 1 + }, + { + "fieldName": "typhoon", + "fancyName": "Typhoon", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 50516 + ], + "maxPoints": 1 + }, + { + "fieldName": "shootingStars", + "fancyName": "Shooting Stars", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 93398, + 93399 + ], + "maxPoints": 2 + }, + { + "fieldName": "owlkinFrenzy", + "fancyName": "Owlkin Frenzy", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 48389, + 48392, + 48393 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "galeWinds", + "fancyName": "Gale Winds", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 48488, + 48514 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "solarBeam", + "fancyName": "Solar Beam", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 78675 + ], + "maxPoints": 1 + }, + { + "fieldName": "dreamstate", + "fancyName": "Dreamstate", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 33597, + 33599 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 0 + } + }, + { + "fieldName": "forceOfNature", + "fancyName": "Force Of Nature", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 33831 + ], + "maxPoints": 1 + }, + { + "fieldName": "sunfire", + "fancyName": "Sunfire", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 93401 + ], + "maxPoints": 1 + }, + { + "fieldName": "earthAndMoon", + "fancyName": "Earth And Moon", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 48506 + ], + "maxPoints": 1 + }, + { + "fieldName": "fungalGrowth", + "fancyName": "Fungal Growth", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 78788, + 78789 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "lunarShower", + "fancyName": "Lunar Shower", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 33603, + 33605, + 33604 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 2 + } + }, + { + "fieldName": "starfall", + "fancyName": "Starfall", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 48505 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Feral Combat", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/750.jpg", + "talents": [ + { + "fieldName": "feralSwiftness", + "fancyName": "Feral Swiftness", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 17002, + 24866 + ], + "maxPoints": 2 + }, + { + "fieldName": "furor", + "fancyName": "Furor", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 17056, + 17058, + 17059 + ], + "maxPoints": 3 + }, + { + "fieldName": "predatoryStrikes", + "fancyName": "Predatory Strikes", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 16972, + 16974 + ], + "maxPoints": 2 + }, + { + "fieldName": "infectedWounds", + "fancyName": "Infected Wounds", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 48483, + 48484 + ], + "maxPoints": 2 + }, + { + "fieldName": "furySwipes", + "fancyName": "Fury Swipes", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 48532, + 80552, + 80553 + ], + "maxPoints": 3 + }, + { + "fieldName": "primalFury", + "fancyName": "Primal Fury", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 37116, + 37117 + ], + "maxPoints": 2 + }, + { + "fieldName": "feralAggression", + "fancyName": "Feral Aggression", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 16858, + 16859 + ], + "maxPoints": 2 + }, + { + "fieldName": "kingOfTheJungle", + "fancyName": "King Of The Jungle", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 48492, + 48494, + 48495 + ], + "maxPoints": 3 + }, + { + "fieldName": "feralCharge", + "fancyName": "Feral Charge", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49377 + ], + "maxPoints": 1 + }, + { + "fieldName": "stampede", + "fancyName": "Stampede", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 78892, + 78893 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "thickHide", + "fancyName": "Thick Hide", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 16929, + 16930, + 16931 + ], + "maxPoints": 3 + }, + { + "fieldName": "leaderOfThePack", + "fancyName": "Leader Of The Pack", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 17007 + ], + "maxPoints": 1 + }, + { + "fieldName": "brutalImpact", + "fancyName": "Brutal Impact", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 16940, + 16941 + ], + "maxPoints": 2 + }, + { + "fieldName": "nurturingInstinct", + "fancyName": "Nurturing Instinct", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 33872, + 33873 + ], + "maxPoints": 2 + }, + { + "fieldName": "primalMadness", + "fancyName": "Primal Madness", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 80316, + 80317 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 0 + } + }, + { + "fieldName": "survivalInstincts", + "fancyName": "Survival Instincts", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 61336 + ], + "maxPoints": 1 + }, + { + "fieldName": "endlessCarnage", + "fancyName": "Endless Carnage", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 80314, + 80315 + ], + "maxPoints": 2 + }, + { + "fieldName": "naturalReaction", + "fancyName": "Natural Reaction", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 57878, + 57880 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodInTheWater", + "fancyName": "Blood In The Water", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 80318, + 80319 + ], + "maxPoints": 2 + }, + { + "fieldName": "rendAndTear", + "fancyName": "Rend And Tear", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 48432, + 48433, + 48434 + ], + "maxPoints": 3 + }, + { + "fieldName": "pulverize", + "fancyName": "Pulverize", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 80313 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 5, + "colIdx": 1 + } + }, + { + "fieldName": "berserk", + "fancyName": "Berserk", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 50334 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Restoration", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/748.jpg", + "talents": [ + { + "fieldName": "blessingOfTheGrove", + "fancyName": "Blessing Of The Grove", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 78784, + 78785 + ], + "maxPoints": 2 + }, + { + "fieldName": "naturalShapeshifter", + "fancyName": "Natural Shapeshifter", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 16833, + 16834 + ], + "maxPoints": 2 + }, + { + "fieldName": "naturalist", + "fancyName": "Naturalist", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 17069, + 17070 + ], + "maxPoints": 2 + }, + { + "fieldName": "heartOfTheWild", + "fancyName": "Heart Of The Wild", + "location": { + "rowIdx": 0, + "colIdx": 3 + }, + "spellIds": [ + 17003, + 17004, + 17005 + ], + "maxPoints": 3 + }, + { + "fieldName": "perseverance", + "fancyName": "Perseverance", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 78734, + 78736, + 78735, + 78737, + 78738 + ], + "maxPoints": 3 + }, + { + "fieldName": "masterShapeshifter", + "fancyName": "Master Shapeshifter", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 48411 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 1 + } + }, + { + "fieldName": "improvedRejuvenation", + "fancyName": "Improved Rejuvenation", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 17111, + 17112, + 17113 + ], + "maxPoints": 3 + }, + { + "fieldName": "livingSeed", + "fancyName": "Living Seed", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 48496, + 48499, + 48500 + ], + "maxPoints": 3 + }, + { + "fieldName": "revitalize", + "fancyName": "Revitalize", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 48539, + 48544 + ], + "maxPoints": 2 + }, + { + "fieldName": "naturesSwiftness", + "fancyName": "Natures Swiftness", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 17116 + ], + "maxPoints": 1 + }, + { + "fieldName": "furyOfStormrage", + "fancyName": "Fury Of Stormrage", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 17104, + 24943 + ], + "maxPoints": 2 + }, + { + "fieldName": "naturesBounty", + "fancyName": "Natures Bounty", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 17074, + 17075, + 17076 + ], + "maxPoints": 3 + }, + { + "fieldName": "empoweredTouch", + "fancyName": "Empowered Touch", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 33879, + 33880 + ], + "maxPoints": 2 + }, + { + "fieldName": "malfurionsGift", + "fancyName": "Malfurions Gift", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 92363, + 92364 + ], + "maxPoints": 2 + }, + { + "fieldName": "efflorescence", + "fancyName": "Efflorescence", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 34151, + 81274, + 81275 + ], + "maxPoints": 3 + }, + { + "fieldName": "wildGrowth", + "fancyName": "Wild Growth", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 48438 + ], + "maxPoints": 1 + }, + { + "fieldName": "naturesCure", + "fancyName": "Natures Cure", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 88423 + ], + "maxPoints": 1 + }, + { + "fieldName": "naturesWard", + "fancyName": "Natures Ward", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 33881, + 33882 + ], + "maxPoints": 2 + }, + { + "fieldName": "giftOfTheEarthmother", + "fancyName": "Gift Of The Earthmother", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 51179, + 51180, + 51181 + ], + "maxPoints": 3 + }, + { + "fieldName": "swiftRejuvenation", + "fancyName": "Swift Rejuvenation", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 33886 + ], + "maxPoints": 1 + }, + { + "fieldName": "treeOfLife", + "fancyName": "Tree Of Life", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 33891 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/hunter.json b/sim/core/talent_trees/hunter.json new file mode 100644 index 0000000000..117ecc6d11 --- /dev/null +++ b/sim/core/talent_trees/hunter.json @@ -0,0 +1,815 @@ +[ + { + "name": "Beast Mastery", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/811.jpg", + "talents": [ + { + "fieldName": "improvedKillCommand", + "fancyName": "Improved Kill Command", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 35029, + 35030 + ], + "maxPoints": 2 + }, + { + "fieldName": "oneWithNature", + "fancyName": "One With Nature", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 82682, + 82683, + 82684 + ], + "maxPoints": 3 + }, + { + "fieldName": "bestialDiscipline", + "fancyName": "Bestial Discipline", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 19590, + 19592, + 82687 + ], + "maxPoints": 3 + }, + { + "fieldName": "pathfinding", + "fancyName": "Pathfinding", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 19559, + 19560 + ], + "maxPoints": 2 + }, + { + "fieldName": "spiritBond", + "fancyName": "Spirit Bond", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 19578, + 20895 + ], + "maxPoints": 2 + }, + { + "fieldName": "frenzy", + "fancyName": "Frenzy", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 19621, + 19622, + 19623 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedMendPet", + "fancyName": "Improved Mend Pet", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 19572, + 19573 + ], + "maxPoints": 2 + }, + { + "fieldName": "cobraStrikes", + "fancyName": "Cobra Strikes", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 53256, + 53259, + 53260 + ], + "maxPoints": 3 + }, + { + "fieldName": "fervor", + "fancyName": "Fervor", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 82726 + ], + "maxPoints": 1 + }, + { + "fieldName": "focusFire", + "fancyName": "Focus Fire", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 82692 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 2 + } + }, + { + "fieldName": "longevity", + "fancyName": "Longevity", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 53262, + 53263, + 53264 + ], + "maxPoints": 3 + }, + { + "fieldName": "killingStreak", + "fancyName": "Killing Streak", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 82748, + 82749 + ], + "maxPoints": 2 + }, + { + "fieldName": "crouchingTigerHiddenChimera", + "fancyName": "Crouching Tiger Hidden Chimera", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 82898, + 82899 + ], + "maxPoints": 2 + }, + { + "fieldName": "bestialWrath", + "fancyName": "Bestial Wrath", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 19574 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "ferociousInspiration", + "fancyName": "Ferocious Inspiration", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 34460 + ], + "maxPoints": 1 + }, + { + "fieldName": "kindredSpirits", + "fancyName": "Kindred Spirits", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 56314, + 56315 + ], + "maxPoints": 2 + }, + { + "fieldName": "theBeastWithin", + "fancyName": "The Beast Within", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 34692 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "invigoration", + "fancyName": "Invigoration", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 53252, + 53253 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 2 + } + }, + { + "fieldName": "beastMastery", + "fancyName": "Beast Mastery", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 53270 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Marksmanship", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/807.jpg", + "talents": [ + { + "fieldName": "goForTheThroat", + "fancyName": "Go For The Throat", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 34950, + 34954 + ], + "maxPoints": 2 + }, + { + "fieldName": "efficiency", + "fancyName": "Efficiency", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 19416, + 19417, + 19418 + ], + "maxPoints": 3 + }, + { + "fieldName": "rapidKilling", + "fancyName": "Rapid Killing", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 34948, + 34949 + ], + "maxPoints": 2 + }, + { + "fieldName": "sicEm", + "fancyName": "Sic Em", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 83340, + 83356 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 0 + } + }, + { + "fieldName": "improvedSteadyShot", + "fancyName": "Improved Steady Shot", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 53221, + 53222, + 53224 + ], + "maxPoints": 3 + }, + { + "fieldName": "carefulAim", + "fancyName": "Careful Aim", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 34482, + 34483 + ], + "maxPoints": 2 + }, + { + "fieldName": "silencingShot", + "fancyName": "Silencing Shot", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 34490 + ], + "maxPoints": 1 + }, + { + "fieldName": "concussiveBarrage", + "fancyName": "Concussive Barrage", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 35100, + 35102 + ], + "maxPoints": 2 + }, + { + "fieldName": "piercingShots", + "fancyName": "Piercing Shots", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 53234, + 53237, + 53238 + ], + "maxPoints": 3 + }, + { + "fieldName": "bombardment", + "fancyName": "Bombardment", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 35104, + 35110 + ], + "maxPoints": 2 + }, + { + "fieldName": "trueshotAura", + "fancyName": "Trueshot Aura", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 19506 + ], + "maxPoints": 1 + }, + { + "fieldName": "termination", + "fancyName": "Termination", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 83489, + 83490 + ], + "maxPoints": 2 + }, + { + "fieldName": "resistanceIsFutile", + "fancyName": "Resistance Is Futile", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 82893, + 82894 + ], + "maxPoints": 2 + }, + { + "fieldName": "rapidRecuperation", + "fancyName": "Rapid Recuperation", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 53228, + 53232 + ], + "maxPoints": 2 + }, + { + "fieldName": "masterMarksman", + "fancyName": "Master Marksman", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 34485, + 34486, + 34487 + ], + "maxPoints": 3 + }, + { + "fieldName": "readiness", + "fancyName": "Readiness", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 23989 + ], + "maxPoints": 1 + }, + { + "fieldName": "posthaste", + "fancyName": "Posthaste", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 83558, + 83560 + ], + "maxPoints": 2 + }, + { + "fieldName": "markedForDeath", + "fancyName": "Marked For Death", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 53241, + 53243 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "chimeraShot", + "fancyName": "Chimera Shot", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 53209 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Survival", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/809.jpg", + "talents": [ + { + "fieldName": "hunterVsWild", + "fancyName": "Hunter Vs Wild", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 56339, + 56340, + 56341 + ], + "maxPoints": 3 + }, + { + "fieldName": "pathing", + "fancyName": "Pathing", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 52783, + 52785, + 52786 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedSerpentSting", + "fancyName": "Improved Serpent Sting", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 19464, + 82834 + ], + "maxPoints": 2 + }, + { + "fieldName": "survivalTactics", + "fancyName": "Survival Tactics", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 19286, + 19287 + ], + "maxPoints": 2 + }, + { + "fieldName": "trapMastery", + "fancyName": "Trap Mastery", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 19376, + 63457, + 63458 + ], + "maxPoints": 3 + }, + { + "fieldName": "entrapment", + "fancyName": "Entrapment", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 19184, + 19387 + ], + "maxPoints": 2 + }, + { + "fieldName": "pointOfNoEscape", + "fancyName": "Point Of No Escape", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 53298, + 53299 + ], + "maxPoints": 2 + }, + { + "fieldName": "thrillOfTheHunt", + "fancyName": "Thrill Of The Hunt", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 34497, + 34498, + 34499 + ], + "maxPoints": 3 + }, + { + "fieldName": "counterattack", + "fancyName": "Counterattack", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 19306 + ], + "maxPoints": 1 + }, + { + "fieldName": "lockAndLoad", + "fancyName": "Lock And Load", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 56342, + 56343 + ], + "maxPoints": 2 + }, + { + "fieldName": "resourcefulness", + "fancyName": "Resourcefulness", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 34491, + 34492, + 34493 + ], + "maxPoints": 3 + }, + { + "fieldName": "mirroredBlades", + "fancyName": "Mirrored Blades", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 83494, + 83495 + ], + "maxPoints": 2 + }, + { + "fieldName": "tNT", + "fancyName": "T N T", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 56333, + 56336 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "toxicology", + "fancyName": "Toxicology", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 82832, + 82833 + ], + "maxPoints": 2 + }, + { + "fieldName": "wyvernSting", + "fancyName": "Wyvern Sting", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 19386 + ], + "maxPoints": 1 + }, + { + "fieldName": "noxiousStings", + "fancyName": "Noxious Stings", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 53295, + 53296 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "huntingParty", + "fancyName": "Hunting Party", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 53290 + ], + "maxPoints": 1 + }, + { + "fieldName": "sniperTraining", + "fancyName": "Sniper Training", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 53302, + 53303, + 53304 + ], + "maxPoints": 3 + }, + { + "fieldName": "serpentSpread", + "fancyName": "Serpent Spread", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 87934, + 87935 + ], + "maxPoints": 2 + }, + { + "fieldName": "blackArrow", + "fancyName": "Black Arrow", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 3674 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/hunter_cunning.json b/sim/core/talent_trees/hunter_cunning.json new file mode 100644 index 0000000000..eb48623a93 --- /dev/null +++ b/sim/core/talent_trees/hunter_cunning.json @@ -0,0 +1,287 @@ +[ + { + "name": "Cunning", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/411.jpg", + "talents": [ + { + "fieldName": "serpentSwiftness", + "fancyName": "Serpent Swiftness", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 61682, + 61683 + ], + "maxPoints": 2 + }, + { + "fieldName": "dive", + "fancyName": "Dive", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 23145 + ], + "maxPoints": 1 + }, + { + "fieldName": "greatStamina", + "fancyName": "Great Stamina", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 61686, + 61687, + 61688 + ], + "maxPoints": 3 + }, + { + "fieldName": "naturalArmor", + "fancyName": "Natural Armor", + "location": { + "rowIdx": 0, + "colIdx": 3 + }, + "spellIds": [ + 61689, + 61690 + ], + "maxPoints": 2 + }, + { + "fieldName": "boarsSpeed", + "fancyName": "Boars Speed", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 19596 + ], + "maxPoints": 1 + }, + { + "fieldName": "mobility", + "fancyName": "Mobility", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 53554, + 53483, + 53485, + 53555 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 1 + } + }, + { + "fieldName": "owlsFocus", + "fancyName": "Owls Focus", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 53514, + 53516 + ], + "maxPoints": 2 + }, + { + "fieldName": "spikedCollar", + "fancyName": "Spiked Collar", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 53182, + 53183, + 53184 + ], + "maxPoints": 3 + }, + { + "fieldName": "cullingTheHerd", + "fancyName": "Culling The Herd", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 61680, + 52858, + 61681 + ], + "maxPoints": 3 + }, + { + "fieldName": "lionhearted", + "fancyName": "Lionhearted", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 53409, + 53411 + ], + "maxPoints": 2 + }, + { + "fieldName": "carrionFeeder", + "fancyName": "Carrion Feeder", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 54044 + ], + "maxPoints": 1 + }, + { + "fieldName": "greatResistance", + "fancyName": "Great Resistance", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 53427, + 53429, + 53430 + ], + "maxPoints": 3 + }, + { + "fieldName": "cornered", + "fancyName": "Cornered", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 52234, + 53497 + ], + "maxPoints": 2 + }, + { + "fieldName": "feedingFrenzy", + "fancyName": "Feeding Frenzy", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 53511, + 53512 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 3 + } + }, + { + "fieldName": "wolverineBite", + "fancyName": "Wolverine Bite", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 53508 + ], + "maxPoints": 1 + }, + { + "fieldName": "roarOfRecovery", + "fancyName": "Roar Of Recovery", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 53517 + ], + "maxPoints": 1 + }, + { + "fieldName": "bullheaded", + "fancyName": "Bullheaded", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 53490 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "graceOfTheMantis", + "fancyName": "Grace Of The Mantis", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 53450, + 53451 + ], + "maxPoints": 2 + }, + { + "fieldName": "wildHunt", + "fancyName": "Wild Hunt", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 62758, + 62762 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 0 + } + }, + { + "fieldName": "roarOfSacrifice", + "fancyName": "Roar Of Sacrifice", + "location": { + "rowIdx": 5, + "colIdx": 3 + }, + "spellIds": [ + 53480 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 3 + } + } + ] + } +] \ No newline at end of file diff --git a/sim/core/talent_trees/hunter_ferocity.json b/sim/core/talent_trees/hunter_ferocity.json new file mode 100644 index 0000000000..18b1a8e47f --- /dev/null +++ b/sim/core/talent_trees/hunter_ferocity.json @@ -0,0 +1,269 @@ +[ + { + "name": "Ferocity", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/410.jpg", + "talents": [ + { + "fieldName": "serpentSwiftness", + "fancyName": "Serpent Swiftness", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 61682, + 61683 + ], + "maxPoints": 2 + }, + { + "fieldName": "dash", + "fancyName": "Dash", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 61684 + ], + "maxPoints": 1 + }, + { + "fieldName": "greatStamina", + "fancyName": "Great Stamina", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 61686, + 61687, + 61688 + ], + "maxPoints": 3 + }, + { + "fieldName": "naturalArmor", + "fancyName": "Natural Armor", + "location": { + "rowIdx": 0, + "colIdx": 3 + }, + "spellIds": [ + 61689, + 61690 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedCower", + "fancyName": "Improved Cower", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 53180, + 53181 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodthirsty", + "fancyName": "Bloodthirsty", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 53186, + 53187 + ], + "maxPoints": 2 + }, + { + "fieldName": "spikedCollar", + "fancyName": "Spiked Collar", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 53182, + 53183, + 53184 + ], + "maxPoints": 3 + }, + { + "fieldName": "boarsSpeed", + "fancyName": "Boars Speed", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 19596 + ], + "maxPoints": 1 + }, + { + "fieldName": "cullingTheHerd", + "fancyName": "Culling The Herd", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 61680, + 52858, + 61681 + ], + "maxPoints": 3 + }, + { + "fieldName": "lionhearted", + "fancyName": "Lionhearted", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 53409, + 53411 + ], + "maxPoints": 2 + }, + { + "fieldName": "charge", + "fancyName": "Charge", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 61685 + ], + "maxPoints": 1 + }, + { + "fieldName": "heartOfThePhoenix", + "fancyName": "Heart Of The Phoenix", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 55709 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 1 + } + }, + { + "fieldName": "spidersBite", + "fancyName": "Spiders Bite", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 53203, + 53204, + 53205 + ], + "maxPoints": 3 + }, + { + "fieldName": "greatResistance", + "fancyName": "Great Resistance", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 53427, + 53429, + 53430 + ], + "maxPoints": 3 + }, + { + "fieldName": "rabid", + "fancyName": "Rabid", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 53401 + ], + "maxPoints": 1 + }, + { + "fieldName": "lickYourWounds", + "fancyName": "Lick Your Wounds", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 53426 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "callOfTheWild", + "fancyName": "Call Of The Wild", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 53434 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "sharkAttack", + "fancyName": "Shark Attack", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 62759, + 62760 + ], + "maxPoints": 2 + }, + { + "fieldName": "wildHunt", + "fancyName": "Wild Hunt", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 62758, + 62762 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 2 + } + } + ] + } +] \ No newline at end of file diff --git a/sim/core/talent_trees/hunter_tenacity.json b/sim/core/talent_trees/hunter_tenacity.json new file mode 100644 index 0000000000..ed474b8693 --- /dev/null +++ b/sim/core/talent_trees/hunter_tenacity.json @@ -0,0 +1,285 @@ +[ + { + "name": "Tenacity", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/409.jpg", + "talents": [ + { + "fieldName": "serpentSwiftness", + "fancyName": "Serpent Swiftness", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 61682, + 61683 + ], + "maxPoints": 2 + }, + { + "fieldName": "charge", + "fancyName": "Charge", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 61685 + ], + "maxPoints": 1 + }, + { + "fieldName": "greatStamina", + "fancyName": "Great Stamina", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 61686, + 61687, + 61688 + ], + "maxPoints": 3 + }, + { + "fieldName": "naturalArmor", + "fancyName": "Natural Armor", + "location": { + "rowIdx": 0, + "colIdx": 3 + }, + "spellIds": [ + 61689, + 61690 + ], + "maxPoints": 2 + }, + { + "fieldName": "spikedCollar", + "fancyName": "Spiked Collar", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 53182, + 53183, + 53184 + ], + "maxPoints": 3 + }, + { + "fieldName": "boarsSpeed", + "fancyName": "Boars Speed", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 19596 + ], + "maxPoints": 1 + }, + { + "fieldName": "bloodOfTheRhino", + "fancyName": "Blood Of The Rhino", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 53481, + 53482 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 2 + } + }, + { + "fieldName": "petBarding", + "fancyName": "Pet Barding", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 53175, + 53176 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 3 + } + }, + { + "fieldName": "cullingTheHerd", + "fancyName": "Culling The Herd", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 61680, + 52858, + 61681 + ], + "maxPoints": 3 + }, + { + "fieldName": "guardDog", + "fancyName": "Guard Dog", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 53178, + 53179 + ], + "maxPoints": 2 + }, + { + "fieldName": "lionhearted", + "fancyName": "Lionhearted", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 53409, + 53411 + ], + "maxPoints": 2 + }, + { + "fieldName": "thunderstomp", + "fancyName": "Thunderstomp", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 63900 + ], + "maxPoints": 1 + }, + { + "fieldName": "graceOfTheMantis", + "fancyName": "Grace Of The Mantis", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 53450, + 53451 + ], + "maxPoints": 2 + }, + { + "fieldName": "greatResistance", + "fancyName": "Great Resistance", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 53427, + 53429, + 53430 + ], + "maxPoints": 3 + }, + { + "fieldName": "lastStand", + "fancyName": "Last Stand", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 53478 + ], + "maxPoints": 1 + }, + { + "fieldName": "taunt", + "fancyName": "Taunt", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 53477 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "roarOfSacrifice", + "fancyName": "Roar Of Sacrifice", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 53480 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "intervene", + "fancyName": "Intervene", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 53476 + ], + "maxPoints": 1 + }, + { + "fieldName": "silverback", + "fancyName": "Silverback", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 62764, + 62765 + ], + "maxPoints": 2 + }, + { + "fieldName": "wildHunt", + "fancyName": "Wild Hunt", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 62758, + 62762 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 2 + } + } + ] + } +] \ No newline at end of file diff --git a/sim/core/talent_trees/mage.json b/sim/core/talent_trees/mage.json new file mode 100644 index 0000000000..bfb25e7def --- /dev/null +++ b/sim/core/talent_trees/mage.json @@ -0,0 +1,867 @@ +[ + { + "name": "Arcane", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/799.jpg", + "talents": [ + { + "fieldName": "arcaneConcentration", + "fancyName": "Arcane Concentration", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 11213, + 12574, + 12575 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedCounterspell", + "fancyName": "Improved Counterspell", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 11255, + 12598 + ], + "maxPoints": 2 + }, + { + "fieldName": "netherwindPresence", + "fancyName": "Netherwind Presence", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 44400, + 44402, + 44403 + ], + "maxPoints": 3 + }, + { + "fieldName": "tormentTheWeak", + "fancyName": "Torment The Weak", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 29447, + 55339, + 55340 + ], + "maxPoints": 3 + }, + { + "fieldName": "invocation", + "fancyName": "Invocation", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 84722, + 84723 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedArcaneMissiles", + "fancyName": "Improved Arcane Missiles", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 83513, + 83515 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedBlink", + "fancyName": "Improved Blink", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 31569, + 31570 + ], + "maxPoints": 2 + }, + { + "fieldName": "arcaneFlows", + "fancyName": "Arcane Flows", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 44378, + 44379 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "presenceOfMind", + "fancyName": "Presence Of Mind", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 12043 + ], + "maxPoints": 1 + }, + { + "fieldName": "missileBarrage", + "fancyName": "Missile Barrage", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 44404, + 54486 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 2 + } + }, + { + "fieldName": "prismaticCloak", + "fancyName": "Prismatic Cloak", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 31574, + 31575, + 54354 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedPolymorph", + "fancyName": "Improved Polymorph", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 11210, + 12592 + ], + "maxPoints": 2 + }, + { + "fieldName": "arcaneTactics", + "fancyName": "Arcane Tactics", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 82930 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "incantersAbsorption", + "fancyName": "Incanters Absorption", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 44394, + 44395 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedArcaneExplosion", + "fancyName": "Improved Arcane Explosion", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 90787, + 90788 + ], + "maxPoints": 2 + }, + { + "fieldName": "arcanePotency", + "fancyName": "Arcane Potency", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 31571, + 31572 + ], + "maxPoints": 2 + }, + { + "fieldName": "slow", + "fancyName": "Slow", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 31589 + ], + "maxPoints": 1 + }, + { + "fieldName": "netherVortex", + "fancyName": "Nether Vortex", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 86181, + 86209 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "focusMagic", + "fancyName": "Focus Magic", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 54646 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedManaGem", + "fancyName": "Improved Mana Gem", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 31584, + 31585, + 31586 + ], + "maxPoints": 2 + }, + { + "fieldName": "arcanePower?Spellmodifier=99064", + "fancyName": "Arcane Power?Spellmodifier=99064", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 12042 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Fire", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/851.jpg", + "talents": [ + { + "fieldName": "masterOfElements", + "fancyName": "Master Of Elements", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 29074, + 29075, + 29076 + ], + "maxPoints": 2 + }, + { + "fieldName": "burningSoul", + "fancyName": "Burning Soul", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 11083, + 84254, + 84253 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedFireBlast", + "fancyName": "Improved Fire Blast", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 11078, + 11080 + ], + "maxPoints": 2 + }, + { + "fieldName": "ignite", + "fancyName": "Ignite", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 11119, + 11120, + 12846 + ], + "maxPoints": 3 + }, + { + "fieldName": "firePower", + "fancyName": "Fire Power", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 18459, + 54734, + 18460 + ], + "maxPoints": 3 + }, + { + "fieldName": "blazingSpeed", + "fancyName": "Blazing Speed", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 31641, + 31642 + ], + "maxPoints": 2 + }, + { + "fieldName": "impact", + "fancyName": "Impact", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 11103, + 12357, + 11242, + 12358, + 12467, + 12469 + ], + "maxPoints": 2 + }, + { + "fieldName": "cauterize", + "fancyName": "Cauterize", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 86948, + 86949 + ], + "maxPoints": 2 + }, + { + "fieldName": "blastWave", + "fancyName": "Blast Wave", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 11113 + ], + "maxPoints": 1 + }, + { + "fieldName": "hotStreak", + "fancyName": "Hot Streak", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 44445 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedScorch", + "fancyName": "Improved Scorch", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 11115, + 11367 + ], + "maxPoints": 2 + }, + { + "fieldName": "moltenShields", + "fancyName": "Molten Shields", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 11094 + ], + "maxPoints": 1 + }, + { + "fieldName": "combustion", + "fancyName": "Combustion", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 11129 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedHotStreak", + "fancyName": "Improved Hot Streak", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 44446, + 44448 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "firestarter", + "fancyName": "Firestarter", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 86914 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedFlamestrike", + "fancyName": "Improved Flamestrike", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 84673, + 84674 + ], + "maxPoints": 2 + }, + { + "fieldName": "dragonsBreath", + "fancyName": "Dragons Breath", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 31661 + ], + "maxPoints": 1 + }, + { + "fieldName": "moltenFury", + "fancyName": "Molten Fury", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 31679, + 31680, + 86880 + ], + "maxPoints": 3 + }, + { + "fieldName": "pyromaniac", + "fancyName": "Pyromaniac", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 34293, + 34295, + 34296 + ], + "maxPoints": 2 + }, + { + "fieldName": "criticalMass", + "fancyName": "Critical Mass", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 11095, + 12873, + 12872 + ], + "maxPoints": 3 + }, + { + "fieldName": "livingBomb", + "fancyName": "Living Bomb", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 44457 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Frost", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/823.jpg", + "talents": [ + { + "fieldName": "earlyFrost", + "fancyName": "Early Frost", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 83049, + 83050 + ], + "maxPoints": 2 + }, + { + "fieldName": "piercingIce", + "fancyName": "Piercing Ice", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 11151, + 12952, + 12953 + ], + "maxPoints": 3 + }, + { + "fieldName": "shatter", + "fancyName": "Shatter", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 11170, + 12982, + 12983, + 44745, + 54787 + ], + "maxPoints": 2 + }, + { + "fieldName": "iceFloes", + "fancyName": "Ice Floes", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 31670, + 31672, + 55094 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedConeOfCold", + "fancyName": "Improved Cone Of Cold", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 11190, + 12489 + ], + "maxPoints": 2 + }, + { + "fieldName": "piercingChill", + "fancyName": "Piercing Chill", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 83156, + 83157 + ], + "maxPoints": 2 + }, + { + "fieldName": "permafrost", + "fancyName": "Permafrost", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 11175, + 12569, + 12571 + ], + "maxPoints": 3 + }, + { + "fieldName": "iceShards", + "fancyName": "Ice Shards", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 11185, + 12487 + ], + "maxPoints": 2 + }, + { + "fieldName": "icyVeins", + "fancyName": "Icy Veins", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 12472 + ], + "maxPoints": 1 + }, + { + "fieldName": "fingersOfFrost", + "fancyName": "Fingers Of Frost", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 44543, + 44545, + 83074 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedFreeze", + "fancyName": "Improved Freeze", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 86259, + 86260, + 86314 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "enduringWinter", + "fancyName": "Enduring Winter", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 44561, + 86500, + 86508 + ], + "maxPoints": 3 + }, + { + "fieldName": "coldSnap", + "fancyName": "Cold Snap", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 11958 + ], + "maxPoints": 1 + }, + { + "fieldName": "brainFreeze", + "fancyName": "Brain Freeze", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 44546, + 44548, + 44549 + ], + "maxPoints": 3 + }, + { + "fieldName": "shatteredBarrier", + "fancyName": "Shattered Barrier", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 44745, + 54787 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "iceBarrier?Spellmodifier=63095", + "fancyName": "Ice Barrier?Spellmodifier=63095", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 11426 + ], + "maxPoints": 1 + }, + { + "fieldName": "reactiveBarrier", + "fancyName": "Reactive Barrier", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 86303, + 86304 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "frostfireOrb", + "fancyName": "Frostfire Orb", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 84726, + 84727 + ], + "maxPoints": 2 + }, + { + "fieldName": "deepFreeze?Spellmodifier=11151%2C12952%2C12953%2C31674%2C31675%2C31676%2C31677%2C31678", + "fancyName": "Deep Freeze?Spellmodifier=11151%2C12952%2C12953%2C31674%2C31675%2C31676%2C31677%2C31678", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 44572 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/paladin.json b/sim/core/talent_trees/paladin.json new file mode 100644 index 0000000000..fba5c82d58 --- /dev/null +++ b/sim/core/talent_trees/paladin.json @@ -0,0 +1,827 @@ +[ + { + "name": "Holy", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/831.jpg", + "talents": [ + { + "fieldName": "arbiterOfTheLight", + "fancyName": "Arbiter Of The Light", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 20359, + 20360 + ], + "maxPoints": 2 + }, + { + "fieldName": "protectorOfTheInnocent", + "fancyName": "Protector Of The Innocent", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 20138, + 20139, + 20140 + ], + "maxPoints": 3 + }, + { + "fieldName": "judgementsOfThePure", + "fancyName": "Judgements Of The Pure", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 53671, + 53673, + 54151 + ], + "maxPoints": 3 + }, + { + "fieldName": "clarityOfPurpose", + "fancyName": "Clarity Of Purpose", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 85462, + 85463, + 85464 + ], + "maxPoints": 3 + }, + { + "fieldName": "lastWord", + "fancyName": "Last Word", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 20234, + 20235 + ], + "maxPoints": 2 + }, + { + "fieldName": "blazingLight", + "fancyName": "Blazing Light", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 20237, + 20238 + ], + "maxPoints": 2 + }, + { + "fieldName": "denounce", + "fancyName": "Denounce", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 31825, + 85510 + ], + "maxPoints": 2 + }, + { + "fieldName": "divineFavor", + "fancyName": "Divine Favor", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 31842 + ], + "maxPoints": 1 + }, + { + "fieldName": "infusionOfLight", + "fancyName": "Infusion Of Light", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 53569, + 53576 + ], + "maxPoints": 2 + }, + { + "fieldName": "daybreak", + "fancyName": "Daybreak", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 88820, + 88821 + ], + "maxPoints": 2 + }, + { + "fieldName": "enlightenedJudgements", + "fancyName": "Enlightened Judgements", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 53556, + 53557 + ], + "maxPoints": 2 + }, + { + "fieldName": "beaconOfLight", + "fancyName": "Beacon Of Light", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 53563 + ], + "maxPoints": 1 + }, + { + "fieldName": "speedOfLight", + "fancyName": "Speed Of Light", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 85495, + 85498, + 85499 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "sacredCleansing", + "fancyName": "Sacred Cleansing", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 53551 + ], + "maxPoints": 1 + }, + { + "fieldName": "conviction", + "fancyName": "Conviction", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 20049, + 20056, + 20057 + ], + "maxPoints": 3 + }, + { + "fieldName": "auraMastery", + "fancyName": "Aura Mastery", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 31821 + ], + "maxPoints": 1 + }, + { + "fieldName": "paragonOfVirtue", + "fancyName": "Paragon Of Virtue", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 93418, + 93417 + ], + "maxPoints": 2 + }, + { + "fieldName": "towerOfRadiance", + "fancyName": "Tower Of Radiance", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 84800, + 85511, + 85512 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "blessedLife", + "fancyName": "Blessed Life", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 31828, + 31829 + ], + "maxPoints": 2 + }, + { + "fieldName": "lightOfDawn", + "fancyName": "Light Of Dawn", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 85222 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Protection", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/839.jpg", + "talents": [ + { + "fieldName": "divinity", + "fancyName": "Divinity", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 63646, + 63647, + 63648 + ], + "maxPoints": 3 + }, + { + "fieldName": "sealsOfThePure", + "fancyName": "Seals Of The Pure", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 20224, + 20225 + ], + "maxPoints": 2 + }, + { + "fieldName": "eternalGlory", + "fancyName": "Eternal Glory", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 87163, + 87164 + ], + "maxPoints": 2 + }, + { + "fieldName": "judgementsOfTheJust", + "fancyName": "Judgements Of The Just", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 53695, + 53696 + ], + "maxPoints": 2 + }, + { + "fieldName": "toughness", + "fancyName": "Toughness", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 20143, + 20145, + 20144 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedHammerOfJustice", + "fancyName": "Improved Hammer Of Justice", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 20487, + 20488 + ], + "maxPoints": 2 + }, + { + "fieldName": "hallowedGround", + "fancyName": "Hallowed Ground", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 84631, + 84633 + ], + "maxPoints": 2 + }, + { + "fieldName": "sanctuary", + "fancyName": "Sanctuary", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 20911, + 84628, + 84629 + ], + "maxPoints": 3 + }, + { + "fieldName": "hammerOfTheRighteous", + "fancyName": "Hammer Of The Righteous", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 53595 + ], + "maxPoints": 1 + }, + { + "fieldName": "wrathOfTheLightbringer", + "fancyName": "Wrath Of The Lightbringer", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 84635, + 84636 + ], + "maxPoints": 2 + }, + { + "fieldName": "reckoning", + "fancyName": "Reckoning", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 20177, + 20179 + ], + "maxPoints": 2 + }, + { + "fieldName": "shieldOfTheRighteous", + "fancyName": "Shield Of The Righteous", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 53600 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "grandCrusader", + "fancyName": "Grand Crusader", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 75806, + 85043 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "vindication", + "fancyName": "Vindication", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 26016 + ], + "maxPoints": 1 + }, + { + "fieldName": "holyShield", + "fancyName": "Holy Shield", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 20925 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "guardedByTheLight", + "fancyName": "Guarded By The Light", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 85639, + 85646 + ], + "maxPoints": 2 + }, + { + "fieldName": "divineGuardian", + "fancyName": "Divine Guardian", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 70940 + ], + "maxPoints": 1 + }, + { + "fieldName": "sacredDuty", + "fancyName": "Sacred Duty", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 53709, + 53710 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "shieldOfTheTemplar", + "fancyName": "Shield Of The Templar", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 31848, + 31849, + 84854 + ], + "maxPoints": 3 + }, + { + "fieldName": "ardentDefender", + "fancyName": "Ardent Defender", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 31850 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Retribution", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/855.jpg", + "talents": [ + { + "fieldName": "eyeForAnEye", + "fancyName": "Eye For An Eye", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 9799, + 25988 + ], + "maxPoints": 2 + }, + { + "fieldName": "crusade", + "fancyName": "Crusade", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 31866, + 75806, + 31867, + 31868, + 85043 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedJudgement", + "fancyName": "Improved Judgement", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 87174, + 87175 + ], + "maxPoints": 2 + }, + { + "fieldName": "guardiansFavor", + "fancyName": "Guardians Favor", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 20174, + 20175 + ], + "maxPoints": 2 + }, + { + "fieldName": "ruleOfLaw", + "fancyName": "Rule Of Law", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 85457, + 85458, + 87461 + ], + "maxPoints": 3 + }, + { + "fieldName": "pursuitOfJustice", + "fancyName": "Pursuit Of Justice", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 26022, + 26023 + ], + "maxPoints": 2 + }, + { + "fieldName": "communion", + "fancyName": "Communion", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 31876 + ], + "maxPoints": 1 + }, + { + "fieldName": "theArtOfWar", + "fancyName": "The Art Of War", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 53486, + 53488, + 87138 + ], + "maxPoints": 3 + }, + { + "fieldName": "longArmOfTheLaw", + "fancyName": "Long Arm Of The Law", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 87168, + 87172 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 2 + } + }, + { + "fieldName": "divineStorm", + "fancyName": "Divine Storm", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 53385 + ], + "maxPoints": 1 + }, + { + "fieldName": "sacredShield", + "fancyName": "Sacred Shield", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 85285 + ], + "maxPoints": 1 + }, + { + "fieldName": "sanctityOfBattle", + "fancyName": "Sanctity Of Battle", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 25956 + ], + "maxPoints": 1 + }, + { + "fieldName": "sealsOfCommand", + "fancyName": "Seals Of Command", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 85126 + ], + "maxPoints": 1 + }, + { + "fieldName": "sanctifiedWrath", + "fancyName": "Sanctified Wrath", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 53375, + 53376, + 90286 + ], + "maxPoints": 3 + }, + { + "fieldName": "selflessHealer", + "fancyName": "Selfless Healer", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 85803, + 85804 + ], + "maxPoints": 2 + }, + { + "fieldName": "repentance", + "fancyName": "Repentance", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 20066 + ], + "maxPoints": 1 + }, + { + "fieldName": "divinePurpose", + "fancyName": "Divine Purpose", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 85117, + 86172 + ], + "maxPoints": 2 + }, + { + "fieldName": "inquiryOfFaith", + "fancyName": "Inquiry Of Faith", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 53380, + 53381, + 53382 + ], + "maxPoints": 3 + }, + { + "fieldName": "actsOfSacrifice", + "fancyName": "Acts Of Sacrifice", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 85446, + 85795 + ], + "maxPoints": 2 + }, + { + "fieldName": "zealotry", + "fancyName": "Zealotry", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 85696 + ], + "maxPoints": 1 + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/priest.json b/sim/core/talent_trees/priest.json new file mode 100644 index 0000000000..c008b40b79 --- /dev/null +++ b/sim/core/talent_trees/priest.json @@ -0,0 +1,881 @@ +[ + { + "name": "Discipline", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/760.jpg", + "talents": [ + { + "fieldName": "improvedPowerWordShield", + "fancyName": "Improved Power Word Shield", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 14748, + 14768 + ], + "maxPoints": 2 + }, + { + "fieldName": "twinDisciplines", + "fancyName": "Twin Disciplines", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 47586, + 47587, + 47588 + ], + "maxPoints": 3 + }, + { + "fieldName": "mentalAgility", + "fancyName": "Mental Agility", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 14520, + 14781, + 14780 + ], + "maxPoints": 3 + }, + { + "fieldName": "evangelism", + "fancyName": "Evangelism", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 81659, + 81662 + ], + "maxPoints": 2 + }, + { + "fieldName": "archangel", + "fancyName": "Archangel", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 87151 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 0 + } + }, + { + "fieldName": "innerSanctum", + "fancyName": "Inner Sanctum", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 14747, + 14770, + 14771 + ], + "maxPoints": 3 + }, + { + "fieldName": "soulWarding", + "fancyName": "Soul Warding", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 63574, + 78500, + 78501 + ], + "maxPoints": 2 + }, + { + "fieldName": "renewedHope", + "fancyName": "Renewed Hope", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 57470, + 57472 + ], + "maxPoints": 2 + }, + { + "fieldName": "powerInfusion", + "fancyName": "Power Infusion", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 10060 + ], + "maxPoints": 1 + }, + { + "fieldName": "atonement", + "fancyName": "Atonement", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 14523, + 81749 + ], + "maxPoints": 2 + }, + { + "fieldName": "innerFocus", + "fancyName": "Inner Focus", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 89485 + ], + "maxPoints": 1 + }, + { + "fieldName": "rapture", + "fancyName": "Rapture", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 47535, + 47536, + 47537 + ], + "maxPoints": 3 + }, + { + "fieldName": "borrowedTime", + "fancyName": "Borrowed Time", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 52795, + 52797, + 52798 + ], + "maxPoints": 2 + }, + { + "fieldName": "reflectiveShield", + "fancyName": "Reflective Shield", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 33201, + 33202 + ], + "maxPoints": 2 + }, + { + "fieldName": "strengthOfSoul", + "fancyName": "Strength Of Soul", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 89488, + 89489 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 0 + } + }, + { + "fieldName": "divineAegis", + "fancyName": "Divine Aegis", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 47509, + 47511, + 47515 + ], + "maxPoints": 3 + }, + { + "fieldName": "painSuppression", + "fancyName": "Pain Suppression", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 33206 + ], + "maxPoints": 1 + }, + { + "fieldName": "trainOfThought", + "fancyName": "Train Of Thought", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 92295, + 92297 + ], + "maxPoints": 2 + }, + { + "fieldName": "focusedWill", + "fancyName": "Focused Will", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 45234, + 45243 + ], + "maxPoints": 2 + }, + { + "fieldName": "grace", + "fancyName": "Grace", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 47516, + 47517 + ], + "maxPoints": 2 + }, + { + "fieldName": "powerWordBarrier", + "fancyName": "Power Word Barrier", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 62618 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Holy", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/813.jpg", + "talents": [ + { + "fieldName": "improvedRenew", + "fancyName": "Improved Renew", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 14908, + 15020 + ], + "maxPoints": 2 + }, + { + "fieldName": "empoweredHealing", + "fancyName": "Empowered Healing", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 33158, + 33159, + 33160 + ], + "maxPoints": 3 + }, + { + "fieldName": "divineFury", + "fancyName": "Divine Fury", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 18530, + 18531, + 18533 + ], + "maxPoints": 3 + }, + { + "fieldName": "desperatePrayer", + "fancyName": "Desperate Prayer", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 19236 + ], + "maxPoints": 1 + }, + { + "fieldName": "surgeOfLight", + "fancyName": "Surge Of Light", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 88687, + 88690 + ], + "maxPoints": 2 + }, + { + "fieldName": "inspiration", + "fancyName": "Inspiration", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 14892, + 15362 + ], + "maxPoints": 2 + }, + { + "fieldName": "divineTouch", + "fancyName": "Divine Touch", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 63534, + 63542 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 0 + } + }, + { + "fieldName": "holyConcentration", + "fancyName": "Holy Concentration", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 34753, + 34859 + ], + "maxPoints": 2 + }, + { + "fieldName": "lightwell?spellModifier=47586%2C47587%2C47588", + "fancyName": "Lightwell?Spellmodifier=47586%2C47587%2C47588", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 724 + ], + "maxPoints": 1 + }, + { + "fieldName": "tomeOfLight", + "fancyName": "Tome Of Light", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 14898, + 81625 + ], + "maxPoints": 2 + }, + { + "fieldName": "rapidRenewal", + "fancyName": "Rapid Renewal", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 95649 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 0 + } + }, + { + "fieldName": "spiritOfRedemption", + "fancyName": "Spirit Of Redemption", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 20711 + ], + "maxPoints": 1 + }, + { + "fieldName": "serendipity", + "fancyName": "Serendipity", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 63730, + 63733 + ], + "maxPoints": 2 + }, + { + "fieldName": "bodyAndSoul", + "fancyName": "Body And Soul", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 64127, + 64129 + ], + "maxPoints": 2 + }, + { + "fieldName": "chakra", + "fancyName": "Chakra", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 14751 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "revelations", + "fancyName": "Revelations", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 88627 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "blessedResilience", + "fancyName": "Blessed Resilience", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 33142, + 33145 + ], + "maxPoints": 2 + }, + { + "fieldName": "testOfFaith", + "fancyName": "Test Of Faith", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 47558, + 47559, + 47560 + ], + "maxPoints": 3 + }, + { + "fieldName": "heavenlyVoice", + "fancyName": "Heavenly Voice", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 87430, + 87431 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "circleOfHealing", + "fancyName": "Circle Of Healing", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 34861 + ], + "maxPoints": 1 + }, + { + "fieldName": "guardianSpirit", + "fancyName": "Guardian Spirit", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 47788 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Shadow", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/795.jpg", + "talents": [ + { + "fieldName": "darkness", + "fancyName": "Darkness", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 15259, + 15307, + 15308 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedShadowWordPain", + "fancyName": "Improved Shadow Word Pain", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 15275, + 15317 + ], + "maxPoints": 2 + }, + { + "fieldName": "veiledShadows", + "fancyName": "Veiled Shadows", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 15274, + 15311 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedPsychicScream", + "fancyName": "Improved Psychic Scream", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 15392, + 15448 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedMindBlast", + "fancyName": "Improved Mind Blast", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 15273, + 15312, + 15313 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedDevouringPlague", + "fancyName": "Improved Devouring Plague", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 63625, + 63626 + ], + "maxPoints": 2 + }, + { + "fieldName": "twistedFaith", + "fancyName": "Twisted Faith", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 47573, + 47577 + ], + "maxPoints": 2 + }, + { + "fieldName": "shadowform", + "fancyName": "Shadowform", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 15473 + ], + "maxPoints": 1 + }, + { + "fieldName": "phantasm", + "fancyName": "Phantasm", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 47569, + 47570 + ], + "maxPoints": 2 + }, + { + "fieldName": "harnessedShadows", + "fancyName": "Harnessed Shadows", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 33191, + 78228 + ], + "maxPoints": 2 + }, + { + "fieldName": "silence", + "fancyName": "Silence", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 15487 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 0 + } + }, + { + "fieldName": "vampiricEmbrace", + "fancyName": "Vampiric Embrace", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 15286 + ], + "maxPoints": 1 + }, + { + "fieldName": "masochism", + "fancyName": "Masochism", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 88994, + 88995 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "mindMelt", + "fancyName": "Mind Melt", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 14910, + 33371 + ], + "maxPoints": 2 + }, + { + "fieldName": "painAndSuffering", + "fancyName": "Pain And Suffering", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 47580, + 47581 + ], + "maxPoints": 2 + }, + { + "fieldName": "vampiricTouch", + "fancyName": "Vampiric Touch", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 34914 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "paralysis", + "fancyName": "Paralysis", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 87192, + 87195 + ], + "maxPoints": 2 + }, + { + "fieldName": "psychicHorror", + "fancyName": "Psychic Horror", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 64044 + ], + "maxPoints": 1 + }, + { + "fieldName": "sinAndPunishment", + "fancyName": "Sin And Punishment", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 87099, + 87100 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "shadowyApparition", + "fancyName": "Shadowy Apparition", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 78202, + 78203, + 78204 + ], + "maxPoints": 3 + }, + { + "fieldName": "dispersion", + "fancyName": "Dispersion", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 47585 + ], + "maxPoints": 1 + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/rogue.json b/sim/core/talent_trees/rogue.json new file mode 100644 index 0000000000..da1e679869 --- /dev/null +++ b/sim/core/talent_trees/rogue.json @@ -0,0 +1,791 @@ +[ + { + "name": "Assassination", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/182.jpg", + "talents": [ + { + "fieldName": "deadlyMomentum", + "fancyName": "Deadly Momentum", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 79121, + 79122 + ], + "maxPoints": 2 + }, + { + "fieldName": "coupDeGrace", + "fancyName": "Coup De Grace", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 14162, + 14163, + 14164 + ], + "maxPoints": 3 + }, + { + "fieldName": "lethality", + "fancyName": "Lethality", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 14128, + 14132, + 14135 + ], + "maxPoints": 3 + }, + { + "fieldName": "ruthlessness", + "fancyName": "Ruthlessness", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 14156, + 14160, + 14161 + ], + "maxPoints": 3 + }, + { + "fieldName": "quickening", + "fancyName": "Quickening", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 31208, + 31209 + ], + "maxPoints": 2 + }, + { + "fieldName": "puncturingWounds", + "fancyName": "Puncturing Wounds", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 13733, + 13865, + 13866 + ], + "maxPoints": 3 + }, + { + "fieldName": "blackjack", + "fancyName": "Blackjack", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 79123, + 79125 + ], + "maxPoints": 2 + }, + { + "fieldName": "deadlyBrew", + "fancyName": "Deadly Brew", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 51625, + 51626 + ], + "maxPoints": 2 + }, + { + "fieldName": "coldBlood", + "fancyName": "Cold Blood", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 14177 + ], + "maxPoints": 1 + }, + { + "fieldName": "vilePoisons", + "fancyName": "Vile Poisons", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 16513, + 16514, + 16515 + ], + "maxPoints": 3 + }, + { + "fieldName": "deadenedNerves", + "fancyName": "Deadened Nerves", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 31380, + 31382, + 31383 + ], + "maxPoints": 3 + }, + { + "fieldName": "sealFate", + "fancyName": "Seal Fate", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 14186, + 14190 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "murderousIntent", + "fancyName": "Murderous Intent", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 14158, + 14159 + ], + "maxPoints": 2 + }, + { + "fieldName": "overkill", + "fancyName": "Overkill", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 58426 + ], + "maxPoints": 1 + }, + { + "fieldName": "masterPoisoner", + "fancyName": "Master Poisoner", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 58410 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "improvedExposeArmor", + "fancyName": "Improved Expose Armor", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 14168, + 14169 + ], + "maxPoints": 2 + }, + { + "fieldName": "cutToTheChase", + "fancyName": "Cut To The Chase", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 51664, + 51665, + 51667 + ], + "maxPoints": 3 + }, + { + "fieldName": "venomousWounds", + "fancyName": "Venomous Wounds", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 79133, + 79134 + ], + "maxPoints": 2 + }, + { + "fieldName": "vendetta", + "fancyName": "Vendetta", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 79140 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Combat", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/181.jpg", + "talents": [ + { + "fieldName": "improvedRecuperate", + "fancyName": "Improved Recuperate", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 79007, + 79008 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedSinisterStrike", + "fancyName": "Improved Sinister Strike", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 13732, + 13863, + 79004 + ], + "maxPoints": 3 + }, + { + "fieldName": "precision", + "fancyName": "Precision", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 13705, + 13832, + 13843 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedSliceAndDice", + "fancyName": "Improved Slice And Dice", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 14165, + 14166 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedSprint", + "fancyName": "Improved Sprint", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 13743, + 13875 + ], + "maxPoints": 2 + }, + { + "fieldName": "aggression", + "fancyName": "Aggression", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 18427, + 18428, + 18429 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedKick", + "fancyName": "Improved Kick", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 13754, + 13867 + ], + "maxPoints": 2 + }, + { + "fieldName": "lightningReflexes", + "fancyName": "Lightning Reflexes", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 13712, + 13788, + 13789 + ], + "maxPoints": 3 + }, + { + "fieldName": "revealingStrike", + "fancyName": "Revealing Strike", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 84617 + ], + "maxPoints": 1 + }, + { + "fieldName": "reinforcedLeather", + "fancyName": "Reinforced Leather", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 79077, + 79079 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedGouge", + "fancyName": "Improved Gouge", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 13741, + 13793 + ], + "maxPoints": 2 + }, + { + "fieldName": "combatPotency", + "fancyName": "Combat Potency", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 35541, + 35550, + 35551 + ], + "maxPoints": 3 + }, + { + "fieldName": "bladeTwisting", + "fancyName": "Blade Twisting", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 31124, + 31126 + ], + "maxPoints": 2 + }, + { + "fieldName": "throwingSpecialization", + "fancyName": "Throwing Specialization", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 5952, + 51679 + ], + "maxPoints": 2 + }, + { + "fieldName": "adrenalineRush", + "fancyName": "Adrenaline Rush", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 13750 + ], + "maxPoints": 1 + }, + { + "fieldName": "savageCombat", + "fancyName": "Savage Combat", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 51682, + 58413 + ], + "maxPoints": 2 + }, + { + "fieldName": "banditsGuile", + "fancyName": "Bandits Guile", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 84652, + 84653, + 84654 + ], + "maxPoints": 3 + }, + { + "fieldName": "restlessBlades", + "fancyName": "Restless Blades", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 79095, + 79096 + ], + "maxPoints": 2 + }, + { + "fieldName": "killingSpree", + "fancyName": "Killing Spree", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 51690 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Subtlety", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/183.jpg", + "talents": [ + { + "fieldName": "nightstalker", + "fancyName": "Nightstalker", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 13975, + 14062 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedAmbush", + "fancyName": "Improved Ambush", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 14079, + 14080, + 84661 + ], + "maxPoints": 3 + }, + { + "fieldName": "relentlessStrikes", + "fancyName": "Relentless Strikes", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 14179, + 58422, + 58423 + ], + "maxPoints": 3 + }, + { + "fieldName": "elusiveness", + "fancyName": "Elusiveness", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 13981, + 14066 + ], + "maxPoints": 2 + }, + { + "fieldName": "waylay", + "fancyName": "Waylay", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 51692, + 51696 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 1 + } + }, + { + "fieldName": "opportunity", + "fancyName": "Opportunity", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 14057, + 14072, + 79141 + ], + "maxPoints": 3 + }, + { + "fieldName": "initiative", + "fancyName": "Initiative", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 13976, + 13979 + ], + "maxPoints": 2 + }, + { + "fieldName": "energeticRecovery", + "fancyName": "Energetic Recovery", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 79150, + 79151, + 79152 + ], + "maxPoints": 3 + }, + { + "fieldName": "findWeakness", + "fancyName": "Find Weakness", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 51632, + 91023 + ], + "maxPoints": 2 + }, + { + "fieldName": "hemorrhage", + "fancyName": "Hemorrhage", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 16511 + ], + "maxPoints": 1 + }, + { + "fieldName": "honorAmongThieves", + "fancyName": "Honor Among Thieves", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 51698, + 51700, + 51701 + ], + "maxPoints": 3 + }, + { + "fieldName": "premeditation", + "fancyName": "Premeditation", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 14183 + ], + "maxPoints": 1 + }, + { + "fieldName": "envelopingShadows", + "fancyName": "Enveloping Shadows", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 31211, + 31212, + 31213 + ], + "maxPoints": 3 + }, + { + "fieldName": "cheatDeath", + "fancyName": "Cheat Death", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 31228, + 31229, + 31230 + ], + "maxPoints": 3 + }, + { + "fieldName": "preparation", + "fancyName": "Preparation", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 14185 + ], + "maxPoints": 1 + }, + { + "fieldName": "sanguinaryVein", + "fancyName": "Sanguinary Vein", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 79146, + 79147 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 2 + } + }, + { + "fieldName": "slaughterFromTheShadows", + "fancyName": "Slaughter From The Shadows", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 51708, + 51709, + 51710 + ], + "maxPoints": 3 + }, + { + "fieldName": "serratedBlades", + "fancyName": "Serrated Blades", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 14171, + 14172 + ], + "maxPoints": 2 + }, + { + "fieldName": "shadowDance", + "fancyName": "Shadow Dance", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 51713 + ], + "maxPoints": 1 + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/shaman.json b/sim/core/talent_trees/shaman.json new file mode 100644 index 0000000000..b93bce9d7b --- /dev/null +++ b/sim/core/talent_trees/shaman.json @@ -0,0 +1,806 @@ +[ + { + "name": "Elemental", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/261.jpg", + "talents": [ + { + "fieldName": "acuity", + "fancyName": "Acuity", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 17485, + 17486, + 17487 + ], + "maxPoints": 3 + }, + { + "fieldName": "convection", + "fancyName": "Convection", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 16039, + 16109 + ], + "maxPoints": 2 + }, + { + "fieldName": "concussion", + "fancyName": "Concussion", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 16035, + 16105, + 16106 + ], + "maxPoints": 3 + }, + { + "fieldName": "callOfFlame", + "fancyName": "Call Of Flame", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 16038, + 16160 + ], + "maxPoints": 2 + }, + { + "fieldName": "elementalWarding", + "fancyName": "Elemental Warding", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 28996, + 28997, + 28998 + ], + "maxPoints": 3 + }, + { + "fieldName": "reverberation", + "fancyName": "Reverberation", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 16040, + 16113 + ], + "maxPoints": 2 + }, + { + "fieldName": "elementalPrecision", + "fancyName": "Elemental Precision", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 30672, + 30673, + 30674 + ], + "maxPoints": 3 + }, + { + "fieldName": "rollingThunder", + "fancyName": "Rolling Thunder", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 88756, + 88764 + ], + "maxPoints": 2 + }, + { + "fieldName": "elementalFocus", + "fancyName": "Elemental Focus", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 16164 + ], + "maxPoints": 1 + }, + { + "fieldName": "elementalReach", + "fancyName": "Elemental Reach", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 28999, + 29000 + ], + "maxPoints": 2 + }, + { + "fieldName": "elementalOath", + "fancyName": "Elemental Oath", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 51466, + 51470 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "lavaFlows", + "fancyName": "Lava Flows", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 51480, + 51481, + 51482 + ], + "maxPoints": 3 + }, + { + "fieldName": "fulmination", + "fancyName": "Fulmination", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 88766 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 0 + } + }, + { + "fieldName": "elementalMastery", + "fancyName": "Elemental Mastery", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 16166 + ], + "maxPoints": 1 + }, + { + "fieldName": "earthsGrasp", + "fancyName": "Earths Grasp", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 51483, + 51485 + ], + "maxPoints": 2 + }, + { + "fieldName": "totemicWrath", + "fancyName": "Totemic Wrath", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 77746 + ], + "maxPoints": 1 + }, + { + "fieldName": "feedback", + "fancyName": "Feedback", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 86183, + 86184, + 86185 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "lavaSurge", + "fancyName": "Lava Surge", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 77755, + 77756 + ], + "maxPoints": 2 + }, + { + "fieldName": "earthquake", + "fancyName": "Earthquake", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 61882 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Enhancement", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/263.jpg", + "talents": [ + { + "fieldName": "elementalWeapons", + "fancyName": "Elemental Weapons", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 16266, + 29079 + ], + "maxPoints": 2 + }, + { + "fieldName": "focusedStrikes", + "fancyName": "Focused Strikes", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 77536, + 77537, + 77538 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedShields", + "fancyName": "Improved Shields", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 16261, + 16290, + 51881 + ], + "maxPoints": 3 + }, + { + "fieldName": "elementalDevastation", + "fancyName": "Elemental Devastation", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 30160, + 29179, + 29180 + ], + "maxPoints": 3 + }, + { + "fieldName": "flurry", + "fancyName": "Flurry", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 16256, + 16281, + 16282 + ], + "maxPoints": 3 + }, + { + "fieldName": "ancestralSwiftness", + "fancyName": "Ancestral Swiftness", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 16262, + 16287 + ], + "maxPoints": 2 + }, + { + "fieldName": "totemicReach", + "fancyName": "Totemic Reach", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 86935, + 86936 + ], + "maxPoints": 2 + }, + { + "fieldName": "toughness", + "fancyName": "Toughness", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 16252, + 16306, + 16307 + ], + "maxPoints": 3 + }, + { + "fieldName": "stormstrike", + "fancyName": "Stormstrike", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 17364 + ], + "maxPoints": 1 + }, + { + "fieldName": "staticShock", + "fancyName": "Static Shock", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 51525, + 51526, + 51527 + ], + "maxPoints": 3 + }, + { + "fieldName": "frozenPower", + "fancyName": "Frozen Power", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 63373, + 63374 + ], + "maxPoints": 2 + }, + { + "fieldName": "seasonedWinds", + "fancyName": "Seasoned Winds", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 16086, + 16544 + ], + "maxPoints": 2 + }, + { + "fieldName": "searingFlames", + "fancyName": "Searing Flames", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 77655, + 77656, + 77657 + ], + "maxPoints": 3 + }, + { + "fieldName": "earthenPower", + "fancyName": "Earthen Power", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 51523, + 51524 + ], + "maxPoints": 2 + }, + { + "fieldName": "shamanisticRage", + "fancyName": "Shamanistic Rage", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 30823 + ], + "maxPoints": 1 + }, + { + "fieldName": "unleashedRage", + "fancyName": "Unleashed Rage", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 30802, + 30808 + ], + "maxPoints": 2 + }, + { + "fieldName": "maelstromWeapon", + "fancyName": "Maelstrom Weapon", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 51528, + 51529, + 51530 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedLavaLash", + "fancyName": "Improved Lava Lash", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 77700, + 77701 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "feralSpirit", + "fancyName": "Feral Spirit", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 51533 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Restoration", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/262.jpg", + "talents": [ + { + "fieldName": "ancestralResolve", + "fancyName": "Ancestral Resolve", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 77829, + 77830 + ], + "maxPoints": 2 + }, + { + "fieldName": "tidalFocus", + "fancyName": "Tidal Focus", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 16179, + 16214, + 16215 + ], + "maxPoints": 3 + }, + { + "fieldName": "sparkOfLife", + "fancyName": "Spark Of Life", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 84846, + 84847, + 84848 + ], + "maxPoints": 3 + }, + { + "fieldName": "resurgence", + "fancyName": "Resurgence", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 16180, + 16196 + ], + "maxPoints": 2 + }, + { + "fieldName": "totemicFocus", + "fancyName": "Totemic Focus", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 16173, + 16222 + ], + "maxPoints": 2 + }, + { + "fieldName": "focusedInsight", + "fancyName": "Focused Insight", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 77794, + 77795, + 77796 + ], + "maxPoints": 3 + }, + { + "fieldName": "naturesGuardian", + "fancyName": "Natures Guardian", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 30881, + 30883, + 30884 + ], + "maxPoints": 3 + }, + { + "fieldName": "ancestralHealing", + "fancyName": "Ancestral Healing", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 16176, + 16235 + ], + "maxPoints": 2 + }, + { + "fieldName": "naturesSwiftness", + "fancyName": "Natures Swiftness", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 16188 + ], + "maxPoints": 1 + }, + { + "fieldName": "naturesBlessing", + "fancyName": "Natures Blessing", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 30867, + 30868, + 30869 + ], + "maxPoints": 3 + }, + { + "fieldName": "soothingRains", + "fancyName": "Soothing Rains", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 16187, + 16205 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedCleanseSpirit", + "fancyName": "Improved Cleanse Spirit", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 77130 + ], + "maxPoints": 1 + }, + { + "fieldName": "cleansingWaters", + "fancyName": "Cleansing Waters", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 86959, + 86962 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "ancestralAwakening", + "fancyName": "Ancestral Awakening", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 51556, + 51558, + 51557 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 0 + } + }, + { + "fieldName": "manaTideTotem", + "fancyName": "Mana Tide Totem", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 16190 + ], + "maxPoints": 1 + }, + { + "fieldName": "telluricCurrents", + "fancyName": "Telluric Currents", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 82984, + 82988 + ], + "maxPoints": 2 + }, + { + "fieldName": "spiritLinkTotem", + "fancyName": "Spirit Link Totem", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 98008 + ], + "maxPoints": 1 + }, + { + "fieldName": "tidalWaves", + "fancyName": "Tidal Waves", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 51562, + 51563, + 51564 + ], + "maxPoints": 3 + }, + { + "fieldName": "blessingOfTheEternals", + "fancyName": "Blessing Of The Eternals", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 51554, + 51555 + ], + "maxPoints": 2 + }, + { + "fieldName": "riptide", + "fancyName": "Riptide", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 61295 + ], + "maxPoints": 1 + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/talent_trees_embes.go b/sim/core/talent_trees/talent_trees_embes.go new file mode 100644 index 0000000000..2010fbd672 --- /dev/null +++ b/sim/core/talent_trees/talent_trees_embes.go @@ -0,0 +1,33 @@ +package talent_trees + +import _ "embed" + +//go:embed death_knight.json +var DeathKnightTalentsConfig string + +//go:embed druid.json +var DruidTalentsConfig string + +//go:embed hunter.json +var HunterTalentsConfig string + +//go:embed mage.json +var MageTalentsConfig string + +//go:embed paladin.json +var PaladinTalentsConfig string + +//go:embed priest.json +var PriestTalentsConfig string + +//go:embed rogue.json +var RogueTalentsConfig string + +//go:embed shaman.json +var ShamanTalentsConfig string + +//go:embed warlock.json +var WarlockTalentsConfig string + +//go:embed warrior.json +var WarriorTalentsConfig string diff --git a/sim/core/talent_trees/warlock.json b/sim/core/talent_trees/warlock.json new file mode 100644 index 0000000000..4d84925069 --- /dev/null +++ b/sim/core/talent_trees/warlock.json @@ -0,0 +1,787 @@ +[ + { + "name": "Affliction", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/871.jpg", + "talents": [ + { + "fieldName": "doomAndGloom", + "fancyName": "Doom And Gloom", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 18827, + 18829 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedLifeTap", + "fancyName": "Improved Life Tap", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 18182, + 18183 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedCorruption", + "fancyName": "Improved Corruption", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 17810, + 17811, + 17812, + 17813, + 17814 + ], + "maxPoints": 3 + }, + { + "fieldName": "jinx", + "fancyName": "Jinx", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 18179, + 85479 + ], + "maxPoints": 2 + }, + { + "fieldName": "soulSiphon", + "fancyName": "Soul Siphon", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 17804, + 17805 + ], + "maxPoints": 2 + }, + { + "fieldName": "siphonLife", + "fancyName": "Siphon Life", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 63108, + 86667 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 1 + } + }, + { + "fieldName": "curseOfExhaustion", + "fancyName": "Curse Of Exhaustion", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 18223 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedFear", + "fancyName": "Improved Fear", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 53754, + 53759 + ], + "maxPoints": 2 + }, + { + "fieldName": "eradication", + "fancyName": "Eradication", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 47195, + 47196, + 47197 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedHowlOfTerror", + "fancyName": "Improved Howl Of Terror", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 30054, + 30057 + ], + "maxPoints": 2 + }, + { + "fieldName": "soulSwap", + "fancyName": "Soul Swap", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 86121 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 1 + } + }, + { + "fieldName": "shadowEmbrace", + "fancyName": "Shadow Embrace", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 32385, + 32387, + 32392 + ], + "maxPoints": 3 + }, + { + "fieldName": "deathsEmbrace", + "fancyName": "Deaths Embrace", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 47198, + 47199, + 47200 + ], + "maxPoints": 3 + }, + { + "fieldName": "nightfall", + "fancyName": "Nightfall", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 18094, + 18095 + ], + "maxPoints": 2 + }, + { + "fieldName": "soulburnSeedOfCorruption", + "fancyName": "Soulburn Seed Of Corruption", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 86664 + ], + "maxPoints": 1 + }, + { + "fieldName": "everlastingAffliction", + "fancyName": "Everlasting Affliction", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 47201, + 47202, + 47203 + ], + "maxPoints": 3 + }, + { + "fieldName": "pandemic", + "fancyName": "Pandemic", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 85099, + 85100 + ], + "maxPoints": 2 + }, + { + "fieldName": "haunt", + "fancyName": "Haunt", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 48181 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Demonology", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/867.jpg", + "talents": [ + { + "fieldName": "demonicEmbrace", + "fancyName": "Demonic Embrace", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 18697, + 18698, + 18699 + ], + "maxPoints": 3 + }, + { + "fieldName": "darkArts", + "fancyName": "Dark Arts", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 18694, + 85283, + 85284 + ], + "maxPoints": 3 + }, + { + "fieldName": "felSynergy", + "fancyName": "Fel Synergy", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 47230, + 47231 + ], + "maxPoints": 2 + }, + { + "fieldName": "demonicRebirth", + "fancyName": "Demonic Rebirth", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 88446, + 88447 + ], + "maxPoints": 2 + }, + { + "fieldName": "manaFeed", + "fancyName": "Mana Feed", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 30326, + 85175 + ], + "maxPoints": 2 + }, + { + "fieldName": "demonicAegis", + "fancyName": "Demonic Aegis", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 30143, + 30144 + ], + "maxPoints": 2 + }, + { + "fieldName": "masterSummoner", + "fancyName": "Master Summoner", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 18709, + 18710 + ], + "maxPoints": 2 + }, + { + "fieldName": "impendingDoom", + "fancyName": "Impending Doom", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 85106, + 85107, + 85108 + ], + "maxPoints": 3 + }, + { + "fieldName": "demonicEmpowerment", + "fancyName": "Demonic Empowerment", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 47193 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedHealthFunnel", + "fancyName": "Improved Health Funnel", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 18703, + 18704 + ], + "maxPoints": 2 + }, + { + "fieldName": "moltenCore", + "fancyName": "Molten Core", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 47245, + 47246, + 47247 + ], + "maxPoints": 3 + }, + { + "fieldName": "handOfGuldan", + "fancyName": "Hand Of Guldan", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 71521 + ], + "maxPoints": 1 + }, + { + "fieldName": "auraOfForeboding", + "fancyName": "Aura Of Foreboding", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 89604, + 89605 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "ancientGrimoire", + "fancyName": "Ancient Grimoire", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 85109, + 85110 + ], + "maxPoints": 2 + }, + { + "fieldName": "inferno", + "fancyName": "Inferno", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 85105 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "decimation", + "fancyName": "Decimation", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 63156, + 63158 + ], + "maxPoints": 2 + }, + { + "fieldName": "cremation", + "fancyName": "Cremation", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 85103, + 85104 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "demonicPact", + "fancyName": "Demonic Pact", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 47236 + ], + "maxPoints": 1 + }, + { + "fieldName": "metamorphosis", + "fancyName": "Metamorphosis", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 59672 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Destruction", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/865.jpg", + "talents": [ + { + "fieldName": "bane", + "fancyName": "Bane", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 17788, + 80240, + 17789, + 17790 + ], + "maxPoints": 3 + }, + { + "fieldName": "shadowAndFlame", + "fancyName": "Shadow And Flame", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 17793, + 17796, + 17801 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedImmolate", + "fancyName": "Improved Immolate", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 17815, + 17833, + 17834 + ], + "maxPoints": 2 + }, + { + "fieldName": "aftermath", + "fancyName": "Aftermath", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 85113, + 85114 + ], + "maxPoints": 2 + }, + { + "fieldName": "emberstorm", + "fancyName": "Emberstorm", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 17954, + 17955 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedSearingPain", + "fancyName": "Improved Searing Pain", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 17927, + 17929 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedSoulFire", + "fancyName": "Improved Soul Fire", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 18119, + 18120 + ], + "maxPoints": 2 + }, + { + "fieldName": "backdraft", + "fancyName": "Backdraft", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 47258, + 47259, + 47260 + ], + "maxPoints": 3 + }, + { + "fieldName": "shadowburn", + "fancyName": "Shadowburn", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 17877 + ], + "maxPoints": 1 + }, + { + "fieldName": "burningEmbers", + "fancyName": "Burning Embers", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 91986, + 85112 + ], + "maxPoints": 2 + }, + { + "fieldName": "soulLeech", + "fancyName": "Soul Leech", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 30293, + 30295, + 54118 + ], + "maxPoints": 2 + }, + { + "fieldName": "backlash", + "fancyName": "Backlash", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 34935, + 34939, + 34938 + ], + "maxPoints": 3 + }, + { + "fieldName": "netherWard", + "fancyName": "Nether Ward", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 91713 + ], + "maxPoints": 1 + }, + { + "fieldName": "fireAndBrimstone", + "fancyName": "Fire And Brimstone", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 47266, + 47267, + 47268, + 47269, + 47270 + ], + "maxPoints": 3 + }, + { + "fieldName": "shadowfury", + "fancyName": "Shadowfury", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 30283 + ], + "maxPoints": 1 + }, + { + "fieldName": "netherProtection", + "fancyName": "Nether Protection", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 30299, + 30301 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 3 + } + }, + { + "fieldName": "empoweredImp", + "fancyName": "Empowered Imp", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 47220, + 47221 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 0 + } + }, + { + "fieldName": "baneOfHavoc", + "fancyName": "Bane Of Havoc", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 80240 + ], + "maxPoints": 1 + }, + { + "fieldName": "chaosBolt", + "fancyName": "Chaos Bolt", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 50796 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talent_trees/warrior.json b/sim/core/talent_trees/warrior.json new file mode 100644 index 0000000000..f5cf277c0f --- /dev/null +++ b/sim/core/talent_trees/warrior.json @@ -0,0 +1,845 @@ +[ + { + "name": "Arms", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/746.jpg", + "talents": [ + { + "fieldName": "warAcademy", + "fancyName": "War Academy", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 84570, + 84571, + 84572 + ], + "maxPoints": 3 + }, + { + "fieldName": "fieldDressing", + "fancyName": "Field Dressing", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 84579, + 84580 + ], + "maxPoints": 2 + }, + { + "fieldName": "blitz", + "fancyName": "Blitz", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 80976, + 80977 + ], + "maxPoints": 2 + }, + { + "fieldName": "tacticalMastery", + "fancyName": "Tactical Mastery", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 12295, + 12676 + ], + "maxPoints": 2 + }, + { + "fieldName": "secondWind", + "fancyName": "Second Wind", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 29834, + 29838 + ], + "maxPoints": 2 + }, + { + "fieldName": "deepWounds", + "fancyName": "Deep Wounds", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 12834, + 12849, + 12867 + ], + "maxPoints": 3 + }, + { + "fieldName": "drumsOfWar", + "fancyName": "Drums Of War", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 12290, + 12963 + ], + "maxPoints": 2 + }, + { + "fieldName": "tasteForBlood", + "fancyName": "Taste For Blood", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 56636, + 56637, + 56638 + ], + "maxPoints": 3 + }, + { + "fieldName": "sweepingStrikes", + "fancyName": "Sweeping Strikes", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 12328 + ], + "maxPoints": 1 + }, + { + "fieldName": "impale", + "fancyName": "Impale", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 16493, + 16494 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 1, + "colIdx": 2 + } + }, + { + "fieldName": "improvedHamstring", + "fancyName": "Improved Hamstring", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 12289, + 12668 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedSlam", + "fancyName": "Improved Slam", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 86655, + 12330 + ], + "maxPoints": 2 + }, + { + "fieldName": "deadlyCalm", + "fancyName": "Deadly Calm", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 85730 + ], + "maxPoints": 1 + }, + { + "fieldName": "bloodFrenzy", + "fancyName": "Blood Frenzy", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 29836, + 29859 + ], + "maxPoints": 2 + }, + { + "fieldName": "lambsToTheSlaughter", + "fancyName": "Lambs To The Slaughter", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 84583, + 84588, + 84587 + ], + "maxPoints": 3 + }, + { + "fieldName": "juggernaut", + "fancyName": "Juggernaut", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 64976 + ], + "maxPoints": 1 + }, + { + "fieldName": "suddenDeath", + "fancyName": "Sudden Death", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 29723, + 29725 + ], + "maxPoints": 2 + }, + { + "fieldName": "wreckingCrew", + "fancyName": "Wrecking Crew", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 46867, + 56611, + 56612 + ], + "maxPoints": 2 + }, + { + "fieldName": "throwdown", + "fancyName": "Throwdown", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 85388 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "bladestorm", + "fancyName": "Bladestorm", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 46924 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Fury", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/815.jpg", + "talents": [ + { + "fieldName": "bloodCraze", + "fancyName": "Blood Craze", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 16487, + 16489, + 16492 + ], + "maxPoints": 3 + }, + { + "fieldName": "battleTrance", + "fancyName": "Battle Trance", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 12322, + 85741, + 85742 + ], + "maxPoints": 3 + }, + { + "fieldName": "cruelty", + "fancyName": "Cruelty", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 12320, + 12852 + ], + "maxPoints": 2 + }, + { + "fieldName": "executioner", + "fancyName": "Executioner", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 20502, + 20503 + ], + "maxPoints": 2 + }, + { + "fieldName": "boomingVoice", + "fancyName": "Booming Voice", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 12321, + 12835 + ], + "maxPoints": 2 + }, + { + "fieldName": "rudeInterruption", + "fancyName": "Rude Interruption", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 61216, + 61221 + ], + "maxPoints": 2 + }, + { + "fieldName": "piercingHowl", + "fancyName": "Piercing Howl", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 12323 + ], + "maxPoints": 1 + }, + { + "fieldName": "flurry", + "fancyName": "Flurry", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 12319, + 12971, + 12972 + ], + "maxPoints": 3 + }, + { + "fieldName": "deathWish", + "fancyName": "Death Wish", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 12292 + ], + "maxPoints": 1 + }, + { + "fieldName": "enrage", + "fancyName": "Enrage", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 12317, + 13045, + 13046 + ], + "maxPoints": 3 + }, + { + "fieldName": "dieByTheSword", + "fancyName": "Die By The Sword", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 81913, + 81914 + ], + "maxPoints": 2 + }, + { + "fieldName": "ragingBlow", + "fancyName": "Raging Blow", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 85288 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "rampage", + "fancyName": "Rampage", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 29801 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "heroicFury", + "fancyName": "Heroic Fury", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 60970 + ], + "maxPoints": 1 + }, + { + "fieldName": "furiousAttacks", + "fancyName": "Furious Attacks", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 46910 + ], + "maxPoints": 1 + }, + { + "fieldName": "meatCleaver", + "fancyName": "Meat Cleaver", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 12329, + 12950 + ], + "maxPoints": 2 + }, + { + "fieldName": "intensifyRage", + "fancyName": "Intensify Rage", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 46908, + 46909 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodsurge", + "fancyName": "Bloodsurge", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 46913, + 46914, + 46915 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "skirmisher", + "fancyName": "Skirmisher", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 29888, + 29889 + ], + "maxPoints": 2 + }, + { + "fieldName": "titansGrip", + "fancyName": "Titans Grip", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 46917 + ], + "maxPoints": 1 + }, + { + "fieldName": "singleMindedFury", + "fancyName": "Single Minded Fury", + "location": { + "rowIdx": 6, + "colIdx": 2 + }, + "spellIds": [ + 81099 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Protection", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/845.jpg", + "talents": [ + { + "fieldName": "incite", + "fancyName": "Incite", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 50685, + 50686, + 50687 + ], + "maxPoints": 3 + }, + { + "fieldName": "toughness", + "fancyName": "Toughness", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 12299, + 12761, + 12762 + ], + "maxPoints": 3 + }, + { + "fieldName": "bloodAndThunder", + "fancyName": "Blood And Thunder", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 84614, + 84615 + ], + "maxPoints": 2 + }, + { + "fieldName": "shieldSpecialization", + "fancyName": "Shield Specialization", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 12298, + 12724, + 12725 + ], + "maxPoints": 3 + }, + { + "fieldName": "shieldMastery", + "fancyName": "Shield Mastery", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 29598, + 84607, + 84608 + ], + "maxPoints": 3 + }, + { + "fieldName": "holdTheLine", + "fancyName": "Hold The Line", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 84604, + 84621 + ], + "maxPoints": 2 + }, + { + "fieldName": "gagOrder", + "fancyName": "Gag Order", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 12311, + 12958 + ], + "maxPoints": 2 + }, + { + "fieldName": "lastStand", + "fancyName": "Last Stand", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 12975 + ], + "maxPoints": 1 + }, + { + "fieldName": "concussionBlow", + "fancyName": "Concussion Blow", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 12809 + ], + "maxPoints": 1 + }, + { + "fieldName": "bastionOfDefense", + "fancyName": "Bastion Of Defense", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 29593, + 29594 + ], + "maxPoints": 2 + }, + { + "fieldName": "warbringer", + "fancyName": "Warbringer", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 57499 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedRevenge", + "fancyName": "Improved Revenge", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 12797, + 12799 + ], + "maxPoints": 2 + }, + { + "fieldName": "devastate", + "fancyName": "Devastate", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 20243 + ], + "maxPoints": 1 + }, + { + "fieldName": "impendingVictory", + "fancyName": "Impending Victory", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 80128, + 80129 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "thunderstruck", + "fancyName": "Thunderstruck", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 80979, + 80980 + ], + "maxPoints": 2 + }, + { + "fieldName": "vigilance", + "fancyName": "Vigilance", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 50720 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 1 + } + }, + { + "fieldName": "heavyRepercussions", + "fancyName": "Heavy Repercussions", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 86894, + 86896 + ], + "maxPoints": 2 + }, + { + "fieldName": "safeguard", + "fancyName": "Safeguard", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 46945, + 46949 + ], + "maxPoints": 2 + }, + { + "fieldName": "swordAndBoard", + "fancyName": "Sword And Board", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 46951, + 46952, + 46953 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 2 + } + }, + { + "fieldName": "shockwave", + "fancyName": "Shockwave", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 46968 + ], + "maxPoints": 1 + } + ] + } + ] \ No newline at end of file diff --git a/sim/core/talents.go b/sim/core/talents.go new file mode 100644 index 0000000000..89ed03f62a --- /dev/null +++ b/sim/core/talents.go @@ -0,0 +1,93 @@ +package core + +import ( + "encoding/json" + "log" + "slices" + "strconv" + "strings" +) + +type TalentTree struct { + name string + spellIds []int32 + isKnown []bool +} + +type Talents struct { + trees []TalentTree +} + +type TalentConfig struct { + FieldName string `json:"fieldName"` + // Spell ID for each rank of this talent. + // Omitted ranks will be inferred by incrementing from the last provided rank. + SpellIds []int32 `json:"spellIds"` + MaxPoints int32 `json:"maxPoints"` +} + +type TalentTreeConfig struct { + Name string `json:"name"` + BackgroundUrl string `json:"backgroundUrl"` + Talents []TalentConfig `json:"talents"` +} + +func (talents Talents) IsKnown(spellId int32) bool { + for _, tree := range talents.trees { + index := slices.Index(tree.spellIds, spellId) + if index > -1 { + return tree.isKnown[index] + } + } + return false +} + +func (character *Character) FillTalentsData(talentsJson string, talentsString string) { + talentsData := Talents{ + trees: make([]TalentTree, 0), + } + + var talents []TalentTreeConfig + + err := json.Unmarshal([]byte(talentsJson), &talents) + if err != nil { + log.Fatalf("failed to parse talent to json %s", err) + } + + knownTalentTrees := strings.Split(talentsString, "-") + + for treeIdx, tree := range talents { + talentsData.trees = append(talentsData.trees, TalentTree{ + name: tree.Name, + spellIds: make([]int32, 0), + isKnown: make([]bool, 0), + }) + + knownLenght := len(knownTalentTrees[treeIdx]) + knownValues := strings.Split(knownTalentTrees[treeIdx], "") + + for talentIdx, talent := range tree.Talents { + talentsData.trees[treeIdx].spellIds = append(talentsData.trees[treeIdx].spellIds, talent.SpellIds...) + + knownValue := 0 + if knownLenght > talentIdx { + var _ error + knownValue, _ = strconv.Atoi(knownValues[talentIdx]) + } + for knownIdx := 0; knownIdx < int(talent.MaxPoints); knownIdx++ { + talentsData.trees[treeIdx].isKnown = append(talentsData.trees[treeIdx].isKnown, knownValue > knownIdx) + } + + // Infer omitted spell IDs. + if len(talent.SpellIds) < int(talent.MaxPoints) { + curSpellId := talent.SpellIds[len(talent.SpellIds)-1] + for i := len(talent.SpellIds); i < int(talent.MaxPoints); i++ { + curSpellId++ + talentsData.trees[treeIdx].spellIds = append(talentsData.trees[treeIdx].spellIds, curSpellId) + } + } + } + } + + character.talents = &talentsData +} diff --git a/sim/druid/druid.go b/sim/druid/druid.go index 175b3e20e2..ba4281d943 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -6,6 +6,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) const ( @@ -268,6 +269,7 @@ func New(char *core.Character, form DruidForm, selfBuffs SelfBuffs, talents stri form: form, } core.FillTalentsProto(druid.Talents.ProtoReflect(), talents, TalentTreeSizes) + druid.FillTalentsData(talent_trees.DruidTalentsConfig, talents) druid.EnableManaBar() druid.AddStatDependency(stats.Strength, stats.AttackPower, 1) diff --git a/sim/hunter/hunter.go b/sim/hunter/hunter.go index 3412bd64a6..47365a28ac 100644 --- a/sim/hunter/hunter.go +++ b/sim/hunter/hunter.go @@ -6,6 +6,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) var TalentTreeSizes = [3]int{19, 19, 20} @@ -151,6 +152,7 @@ func NewHunter(character *core.Character, options *proto.Player, hunterOptions * Options: hunterOptions, } core.FillTalentsProto(hunter.Talents.ProtoReflect(), options.TalentsString, TalentTreeSizes) + hunter.FillTalentsData(talent_trees.HunterTalentsConfig, options.TalentsString) // Todo: Verify that is is actually 4 focus per second hunter.EnableFocusBar(100+(float64(hunter.Talents.KindredSpirits)*5), 4.0, true) diff --git a/sim/mage/mage.go b/sim/mage/mage.go index 54a19e6c62..ba0649886a 100644 --- a/sim/mage/mage.go +++ b/sim/mage/mage.go @@ -3,6 +3,7 @@ package mage import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" + "github.com/wowsims/cata/sim/core/talent_trees" ) const ( @@ -127,6 +128,7 @@ func NewMage(character *core.Character, options *proto.Player, mageOptions *prot Options: mageOptions, } // core.FillTalentsProto(mage.Talents.ProtoReflect(), options.TalentsString, TalentTreeSizes) + mage.FillTalentsData(talent_trees.MageTalentsConfig, options.TalentsString) // mage.bonusCritDamage = .25*float64(mage.Talents.SpellPower) + .1*float64(mage.Talents.Burnout) // mage.EnableManaBar() diff --git a/sim/paladin/paladin.go b/sim/paladin/paladin.go index 48392a0d91..090253864d 100644 --- a/sim/paladin/paladin.go +++ b/sim/paladin/paladin.go @@ -3,6 +3,7 @@ package paladin import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" + "github.com/wowsims/cata/sim/core/talent_trees" ) const ( @@ -170,6 +171,7 @@ func NewPaladin(character *core.Character, talentsStr string) *Paladin { Talents: &proto.PaladinTalents{}, } // core.FillTalentsProto(paladin.Talents.ProtoReflect(), talentsStr, TalentTreeSizes) + paladin.FillTalentsData(talent_trees.PaladinTalentsConfig, talentsStr) // // This is used to cache its effect in talents.go // paladin.HasTuralyonsOrLiadrinsBattlegear2Pc = paladin.HasSetBonus(ItemSetTuralyonsBattlegear, 2) diff --git a/sim/priest/priest.go b/sim/priest/priest.go index e52622fd85..8aed531e32 100644 --- a/sim/priest/priest.go +++ b/sim/priest/priest.go @@ -4,6 +4,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) var TalentTreeSizes = [3]int{21, 21, 21} @@ -200,6 +201,8 @@ func New(char *core.Character, selfBuffs SelfBuffs, talents string) *Priest { } core.FillTalentsProto(priest.Talents.ProtoReflect(), talents, TalentTreeSizes) + priest.FillTalentsData(talent_trees.PriestTalentsConfig, talents) + priest.EnableManaBar() priest.ShadowfiendPet = priest.NewShadowfiend() return priest diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index 76cfffc015..549800e324 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -6,6 +6,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) const ( @@ -201,6 +202,7 @@ func NewRogue(character *core.Character, options *proto.RogueOptions, talents st Options: options, } core.FillTalentsProto(rogue.Talents.ProtoReflect(), talents, TalentTreeSizes) + rogue.FillTalentsData(talent_trees.RogueTalentsConfig, talents) // Passive rogue threat reduction: https://wotlk.wowhead.com/spell=21184/rogue-passive-dnd rogue.PseudoStats.ThreatMultiplier *= 0.71 diff --git a/sim/shaman/shaman.go b/sim/shaman/shaman.go index b7fa93d76f..094c2bba91 100644 --- a/sim/shaman/shaman.go +++ b/sim/shaman/shaman.go @@ -6,6 +6,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) var TalentTreeSizes = [3]int{19, 19, 20} @@ -31,6 +32,7 @@ func NewShaman(character *core.Character, talents string, totems *proto.ShamanTo // shaman.waterShieldManaMetrics = shaman.NewManaMetrics(core.ActionID{SpellID: 57960}) core.FillTalentsProto(shaman.Talents.ProtoReflect(), talents, TalentTreeSizes) + shaman.FillTalentsData(talent_trees.ShamanTalentsConfig, talents) // Add Shaman stat dependencies shaman.AddStatDependency(stats.BonusArmor, stats.Armor, 1) diff --git a/sim/warlock/warlock.go b/sim/warlock/warlock.go index c20a4cd05d..e956d58dad 100644 --- a/sim/warlock/warlock.go +++ b/sim/warlock/warlock.go @@ -5,6 +5,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" + "github.com/wowsims/cata/sim/core/talent_trees" ) var TalentTreeSizes = [3]int{18, 19, 19} @@ -165,6 +166,8 @@ func NewWarlock(character *core.Character, options *proto.Player, warlockOptions Options: warlockOptions, } // core.FillTalentsProto(warlock.Talents.ProtoReflect(), options.TalentsString, TalentTreeSizes) + warlock.FillTalentsData(talent_trees.WarlockTalentsConfig, options.TalentsString) + // warlock.EnableManaBar() // warlock.AddStatDependency(stats.Strength, stats.AttackPower, 1) diff --git a/sim/warrior/warrior.go b/sim/warrior/warrior.go index 29457ee83c..ad27a06f8f 100644 --- a/sim/warrior/warrior.go +++ b/sim/warrior/warrior.go @@ -6,6 +6,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) var TalentTreeSizes = [3]int{20, 21, 20} @@ -164,6 +165,7 @@ func NewWarrior(character *core.Character, talents string, inputs WarriorInputs) WarriorInputs: inputs, } core.FillTalentsProto(warrior.Talents.ProtoReflect(), talents, TalentTreeSizes) + warrior.FillTalentsData(talent_trees.WarriorTalentsConfig, talents) warrior.PseudoStats.CanParry = true diff --git a/ui/core/components/individual_sim_ui/apl_helpers.ts b/ui/core/components/individual_sim_ui/apl_helpers.ts index ad3e738ada..9ef9210721 100644 --- a/ui/core/components/individual_sim_ui/apl_helpers.ts +++ b/ui/core/components/individual_sim_ui/apl_helpers.ts @@ -2,7 +2,10 @@ import { Player, UnitMetadata } from '../../player.js'; import { APLValueRuneSlot, APLValueRuneType } from '../../proto/apl.js'; import { ActionID, OtherAction, UnitReference, UnitReference_Type as UnitType } from '../../proto/common.js'; import { FeralDruid_Rotation_AplType } from '../../proto/druid.js'; +import { IconData, UITalent as Talent } from '../../proto/ui'; import { ActionId, defaultTargetIcon, getPetIconFromName } from '../../proto_utils/action_id.js'; +import { Database } from '../../proto_utils/database'; +import { classTalentsConfig } from '../../talents/factory'; import { EventID, TypedEvent } from '../../typed_event.js'; import { bucket } from '../../utils.js'; import { BooleanPicker } from '../boolean_picker.js'; @@ -278,6 +281,65 @@ export class APLActionIDPicker extends DropdownPicker, ActionID, Act } } +export interface APLTalentPickerConfig + extends Omit, 'defaultLabel' | 'equals' | 'setOptionContent' | 'values' | 'getValue' | 'setValue'> { + getValue: (obj: ModObject) => ActionID; + setValue: (eventID: EventID, obj: ModObject, newValue: ActionID) => void; +} + +export class APLTalentPicker extends DropdownPicker, ActionID, Talent> { + constructor(parent: HTMLElement, player: Player, config: APLTalentPickerConfig>) { + super(parent, player, { + ...config, + sourceToValue: (src: ActionID) => { + return src?.rawId.oneofKind == 'spellId' ? player.sim.db.getTalentById(src.rawId.spellId) : Talent.create(); + }, + valueToSource: (val: Talent) => { + return ActionID.create({ + rawId: { + oneofKind: 'spellId', + spellId: val.id, + }, + }); + }, + defaultLabel: 'Talents', + equals: (a, b) => a == b, + setOptionContent: (button, valueConfig) => { + const actionId = ActionId.fromSpellId(valueConfig.value.id); + const iconElem = document.createElement('a'); + iconElem.classList.add('apl-actionid-item-icon'); + iconElem.dataset.whtticon = 'false'; + iconElem.classList.add('apl-actionid-item-icon'); + actionId.fillAndSet(iconElem, true, true); + button.appendChild(iconElem); + + const textElem = document.createTextNode(valueConfig.value.name); + button.appendChild(textElem); + }, + values: [], + }); + + const updateValues = async () => { + const values = Object.values(classTalentsConfig[player.getClass()]) + .filter(v => typeof v != 'string') + .map(tree => tree.talents) + .flat() + .map(talent => talent.spellIds) + .flat() + .map(spellId => { + const value = player.sim.db.getTalentById(spellId) + return { + value: value, + submenu: value.maxPoints > 1 ? [value.spec, value.baseName] : [value.spec], + }; + }); + this.setOptions(values); + }; + updateValues(); + player.rotationChangeEmitter.on(() => this.update); + } +} + export type UNIT_SET = 'aura_sources' | 'aura_sources_targets_first' | 'targets'; const unitSets: Record< @@ -611,6 +673,18 @@ export function stringFieldConfig(field: string, options?: Partial { + return { + field: field, + newValue: () => ActionID.create(), + factory: (parent, player, config, _getParentValue) => { + return new APLTalentPicker(parent, player, { + ...config, + }); + }, + }; +} + export function runeTypeFieldConfig(field: string, includeDeath: boolean): APLPickerBuilderFieldConfig { const values = [ { value: APLValueRuneType.RuneBlood, label: 'Blood' }, diff --git a/ui/core/components/individual_sim_ui/apl_values.ts b/ui/core/components/individual_sim_ui/apl_values.ts index 155ff59eff..6198254cf1 100644 --- a/ui/core/components/individual_sim_ui/apl_values.ts +++ b/ui/core/components/individual_sim_ui/apl_values.ts @@ -65,6 +65,7 @@ import { APLValueSpellIsReady, APLValueSpellTimeToReady, APLValueSpellTravelTime, + APLValueTalentIsKnown, APLValueTotemRemainingTime, APLValueWarlockShouldRecastDrainSoul, APLValueWarlockShouldRefreshCorruption, @@ -794,6 +795,15 @@ const valueKindFactories: { [f in NonNullable]: ValueKindConfigTrue if the talent is currently known, otherwise False.', + newValue: APLValueTalentIsKnown.create, + fields: [AplHelpers.talentFieldConfig('talentId')], + }), + // Auras auraIsActive: inputBuilder({ label: 'Aura Active', diff --git a/ui/core/proto_utils/database.ts b/ui/core/proto_utils/database.ts index 1d2c429973..9be68bc7f9 100644 --- a/ui/core/proto_utils/database.ts +++ b/ui/core/proto_utils/database.ts @@ -11,7 +11,8 @@ import { ReforgeStat, SimDatabase, } from '../proto/common.js'; -import { GlyphID, IconData, UIDatabase, UIEnchant as Enchant, UIGem as Gem, UIItem as Item, UINPC as Npc, UIZone as Zone } from '../proto/ui.js'; +import { GlyphID, IconData, UIDatabase, UIEnchant as Enchant, UIGem as Gem, UIItem as Item, UINPC as Npc, UITalent as Talent, UIZone as Zone } from '../proto/ui.js'; +import { classTalentsConfig } from '../talents/factory'; import { distinct } from '../utils.js'; import { EquippedItem } from './equipped_item.js'; import { Gear, ItemSwapGear } from './gear.js'; @@ -82,10 +83,30 @@ export class Database { private readonly itemIcons: Record> = {}; private readonly spellIcons: Record> = {}; private readonly glyphIds: Array = []; + private readonly talents: Record = {}; + private loadedLeftovers = false; private constructor(db: UIDatabase) { this.loadProto(db); + + // Is this the correct place to do this? + Object.values(classTalentsConfig) + .flat() + .forEach(tree => { + tree.talents.forEach(talent => { + let rank = 1 + talent.spellIds.forEach(spellId => { + this.talents[spellId] = Talent.create({ + id: spellId, + baseName: talent.fancyName, + name: talent.fancyName + (talent.maxPoints > 1 ? " (Rank " + rank++ + ")" : ""), + spec: tree.name, + maxPoints: talent.maxPoints, + }) + }); + }); + }) } // Add all data from the db proto into this database. @@ -149,6 +170,10 @@ export class Database { return this.items.get(id); } + getTalentById(id: number): Talent { + return this.talents[id] + } + getRandomSuffixById(id: number): ItemRandomSuffix | undefined { return this.randomSuffixes.get(id); } diff --git a/ui/core/talents/talents_picker.tsx b/ui/core/talents/talents_picker.tsx index 8b7ceeafba..d0a4e7152e 100644 --- a/ui/core/talents/talents_picker.tsx +++ b/ui/core/talents/talents_picker.tsx @@ -640,6 +640,8 @@ export type TalentLocation = { export type TalentConfig = { fieldName?: keyof TalentsProto | string; + fancyName?: string; + location: TalentLocation; // Location of a prerequisite talent, if any diff --git a/ui/core/talents/trees/death_knight.json b/ui/core/talents/trees/death_knight.json index bd120592fb..ab98af0631 100644 --- a/ui/core/talents/trees/death_knight.json +++ b/ui/core/talents/trees/death_knight.json @@ -1,828 +1,827 @@ -[ - { - "name": "Blood", - "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/398.jpg", - "talents": [ - { - "fieldName": "butchery", - "fancyName": "Butchery", - "location": { - "rowIdx": 0, - "colIdx": 0 - }, - "spellIds": [ - 48979, - 49483 - ], - "maxPoints": 2 - }, - { - "fieldName": "bladeBarrier", - "fancyName": "Blade Barrier", - "location": { - "rowIdx": 0, - "colIdx": 1 - }, - "spellIds": [ - 49182, - 49500, - 49501 - ], - "maxPoints": 3 - }, - { - "fieldName": "bladedArmor", - "fancyName": "Bladed Armor", - "location": { - "rowIdx": 0, - "colIdx": 2 - }, - "spellIds": [ - 48978, - 49390, - 49391, - 49393 - ], - "maxPoints": 3 - }, - { - "fieldName": "improvedBloodTap", - "fancyName": "Improved Blood Tap", - "location": { - "rowIdx": 1, - "colIdx": 0 - }, - "spellIds": [ - 94553, - 94555 - ], - "maxPoints": 2 - }, - { - "fieldName": "scentOfBlood", - "fancyName": "Scent Of Blood", - "location": { - "rowIdx": 1, - "colIdx": 1 - }, - "spellIds": [ - 49004, - 49508, - 49509 - ], - "maxPoints": 3 - }, - { - "fieldName": "scarletFever", - "fancyName": "Scarlet Fever", - "location": { - "rowIdx": 1, - "colIdx": 2 - }, - "spellIds": [ - 81131, - 81132 - ], - "maxPoints": 2 - }, - { - "fieldName": "handOfDoom", - "fancyName": "Hand Of Doom", - "location": { - "rowIdx": 1, - "colIdx": 3 - }, - "spellIds": [ - 85793, - 85794 - ], - "maxPoints": 2 - }, - { - "fieldName": "bloodCakedBlade", - "fancyName": "Blood Caked Blade", - "location": { - "rowIdx": 2, - "colIdx": 0 - }, - "spellIds": [ - 49219, - 49627, - 49628 - ], - "maxPoints": 3 - }, - { - "fieldName": "boneShield", - "fancyName": "Bone Shield", - "location": { - "rowIdx": 2, - "colIdx": 1 - }, - "spellIds": [ - 49222 - ], - "maxPoints": 1 - }, - { - "fieldName": "toughness", - "fancyName": "Toughness", - "location": { - "rowIdx": 2, - "colIdx": 2 - }, - "spellIds": [ - 49042, - 49786, - 49787 - ], - "maxPoints": 3 - }, - { - "fieldName": "abominationsMight", - "fancyName": "Abominations Might", - "location": { - "rowIdx": 2, - "colIdx": 3 - }, - "spellIds": [ - 53137, - 53138 - ], - "maxPoints": 2 - }, - { - "fieldName": "sanguineFortitude", - "fancyName": "Sanguine Fortitude", - "location": { - "rowIdx": 3, - "colIdx": 0 - }, - "spellIds": [ - 81125, - 81127 - ], - "maxPoints": 2 - }, - { - "fieldName": "bloodParasite", - "fancyName": "Blood Parasite", - "location": { - "rowIdx": 3, - "colIdx": 1 - }, - "spellIds": [ - 49027, - 49542 - ], - "maxPoints": 2 - }, - { - "fieldName": "improvedBloodPresence", - "fancyName": "Improved Blood Presence", - "location": { - "rowIdx": 3, - "colIdx": 2 - }, - "spellIds": [ - 50365, - 50371 - ], - "maxPoints": 2 - }, - { - "fieldName": "willOfTheNecropolis", - "fancyName": "Will Of The Necropolis", - "location": { - "rowIdx": 4, - "colIdx": 0 - }, - "spellIds": [ - 52284, - 81163, - 81164 - ], - "maxPoints": 3, - "prereqLocation": { - "rowIdx": 4, - "colIdx": 1 - } - }, - { - "fieldName": "runeTap", - "fancyName": "Rune Tap", - "location": { - "rowIdx": 4, - "colIdx": 1 - }, - "spellIds": [ - 48982 - ], - "maxPoints": 1 - }, - { - "fieldName": "vampiricBlood", - "fancyName": "Vampiric Blood", - "location": { - "rowIdx": 4, - "colIdx": 2 - }, - "spellIds": [ - 55233 - ], - "maxPoints": 1 - }, - { - "fieldName": "improvedDeathStrike", - "fancyName": "Improved Death Strike", - "location": { - "rowIdx": 5, - "colIdx": 1 - }, - "spellIds": [ - 62905, - 62908, - 81138 - ], - "maxPoints": 3 - }, - { - "fieldName": "crimsonScourge", - "fancyName": "Crimson Scourge", - "location": { - "rowIdx": 5, - "colIdx": 2 - }, - "spellIds": [ - 81135, - 81136 - ], - "maxPoints": 2 - }, - { - "fieldName": "dancingRuneWeapon", - "fancyName": "Dancing Rune Weapon", - "location": { - "rowIdx": 6, - "colIdx": 1 - }, - "spellIds": [ - 49028 - ], - "maxPoints": 1 - } - ] - }, - { - "name": "Frost", - "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/399.jpg", - "talents": [ - { - "fieldName": "runicPowerMastery", - "fancyName": "Runic Power Mastery", - "location": { - "rowIdx": 0, - "colIdx": 0 - }, - "spellIds": [ - 49455, - 50147, - 91145 - ], - "maxPoints": 3 - }, - { - "fieldName": "icyReach", - "fancyName": "Icy Reach", - "location": { - "rowIdx": 0, - "colIdx": 1 - }, - "spellIds": [ - 55061, - 55062 - ], - "maxPoints": 2 - }, - { - "fieldName": "nervesOfColdSteel", - "fancyName": "Nerves Of Cold Steel", - "location": { - "rowIdx": 0, - "colIdx": 2 - }, - "spellIds": [ - 49226, - 50137, - 50138 - ], - "maxPoints": 3 - }, - { - "fieldName": "annihilation", - "fancyName": "Annihilation", - "location": { - "rowIdx": 1, - "colIdx": 0 - }, - "spellIds": [ - 51468, - 51472, - 51473 - ], - "maxPoints": 3 - }, - { - "fieldName": "lichborne", - "fancyName": "Lichborne", - "location": { - "rowIdx": 1, - "colIdx": 1 - }, - "spellIds": [ - 49039 - ], - "maxPoints": 1 - }, - { - "fieldName": "onAPaleHorse", - "fancyName": "On A Pale Horse", - "location": { - "rowIdx": 1, - "colIdx": 2 - }, - "spellIds": [ - 51983, - 51986 - ], - "maxPoints": 2 - }, - { - "fieldName": "endlessWinter", - "fancyName": "Endless Winter", - "location": { - "rowIdx": 1, - "colIdx": 3 - }, - "spellIds": [ - 49137, - 49657 - ], - "maxPoints": 2 - }, - { - "fieldName": "mercilessCombat", - "fancyName": "Merciless Combat", - "location": { - "rowIdx": 2, - "colIdx": 0 - }, - "spellIds": [ - 49024, - 49538 - ], - "maxPoints": 2 - }, - { - "fieldName": "chillOfTheGrave", - "fancyName": "Chill Of The Grave", - "location": { - "rowIdx": 2, - "colIdx": 1 - }, - "spellIds": [ - 49149, - 50115 - ], - "maxPoints": 2 - }, - { - "fieldName": "killingMachine", - "fancyName": "Killing Machine", - "location": { - "rowIdx": 2, - "colIdx": 2 - }, - "spellIds": [ - 51123, - 51127, - 51128 - ], - "maxPoints": 3 - }, - { - "fieldName": "rime", - "fancyName": "Rime", - "location": { - "rowIdx": 3, - "colIdx": 0 - }, - "spellIds": [ - 49188, - 56822, - 59057 - ], - "maxPoints": 3 - }, - { - "fieldName": "pillarOfFrost", - "fancyName": "Pillar Of Frost", - "location": { - "rowIdx": 3, - "colIdx": 1 - }, - "spellIds": [ - 51271 - ], - "maxPoints": 1 - }, - { - "fieldName": "improvedIcyTalons", - "fancyName": "Improved Icy Talons", - "location": { - "rowIdx": 3, - "colIdx": 2 - }, - "spellIds": [ - 55610 - ], - "maxPoints": 1 - }, - { - "fieldName": "brittleBones", - "fancyName": "Brittle Bones", - "location": { - "rowIdx": 3, - "colIdx": 3 - }, - "spellIds": [ - 81327, - 81328 - ], - "maxPoints": 2 - }, - { - "fieldName": "chilblains", - "fancyName": "Chilblains", - "location": { - "rowIdx": 4, - "colIdx": 0 - }, - "spellIds": [ - 50040, - 50041 - ], - "maxPoints": 2 - }, - { - "fieldName": "hungeringCold", - "fancyName": "Hungering Cold", - "location": { - "rowIdx": 4, - "colIdx": 1 - }, - "spellIds": [ - 49203 - ], - "maxPoints": 1 - }, - { - "fieldName": "improvedFrostPresence", - "fancyName": "Improved Frost Presence", - "location": { - "rowIdx": 4, - "colIdx": 2 - }, - "spellIds": [ - 50384, - 50385 - ], - "maxPoints": 2 - }, - { - "fieldName": "threatOfThassarian", - "fancyName": "Threat Of Thassarian", - "location": { - "rowIdx": 5, - "colIdx": 0 - }, - "spellIds": [ - 65661, - 66191, - 66192 - ], - "maxPoints": 3 - }, - { - "fieldName": "mightOfTheFrozenWastes", - "fancyName": "Might Of The Frozen Wastes", - "location": { - "rowIdx": 5, - "colIdx": 2 - }, - "spellIds": [ - 81330, - 81332, - 81333 - ], - "maxPoints": 3 - }, - { - "fieldName": "howlingBlast", - "fancyName": "Howling Blast", - "location": { - "rowIdx": 6, - "colIdx": 1 - }, - "spellIds": [ - 49184 - ], - "maxPoints": 1, - "prereqLocation": { - "rowIdx": 4, - "colIdx": 1 - } - } - ] - }, - { - "name": "Unholy", - "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/400.jpg", - "talents": [ - { - "fieldName": "unholyCommand", - "fancyName": "Unholy Command", - "location": { - "rowIdx": 0, - "colIdx": 0 - }, - "spellIds": [ - 49588, - 49589 - ], - "maxPoints": 2 - }, - { - "fieldName": "virulence", - "fancyName": "Virulence", - "location": { - "rowIdx": 0, - "colIdx": 1 - }, - "spellIds": [ - 48962, - 49567, - 49568 - ], - "maxPoints": 3 - }, - { - "fieldName": "epidemic", - "fancyName": "Epidemic", - "location": { - "rowIdx": 0, - "colIdx": 2 - }, - "spellIds": [ - 49036, - 49562, - 81334 - ], - "maxPoints": 3 - }, - { - "fieldName": "desecration", - "fancyName": "Desecration", - "location": { - "rowIdx": 1, - "colIdx": 0 - }, - "spellIds": [ - 55666, - 55667 - ], - "maxPoints": 2 - }, - { - "fieldName": "resilientInfection", - "fancyName": "Resilient Infection", - "location": { - "rowIdx": 1, - "colIdx": 1 - }, - "spellIds": [ - 81338, - 81339 - ], - "maxPoints": 2 - }, - { - "fieldName": "morbidity", - "fancyName": "Morbidity", - "location": { - "rowIdx": 1, - "colIdx": 3 - }, - "spellIds": [ - 48963, - 49564, - 49565 - ], - "maxPoints": 3 - }, - { - "fieldName": "runicCorruption", - "fancyName": "Runic Corruption", - "location": { - "rowIdx": 2, - "colIdx": 0 - }, - "spellIds": [ - 51459, - 51462 - ], - "maxPoints": 2 - }, - { - "fieldName": "unholyFrenzy", - "fancyName": "Unholy Frenzy", - "location": { - "rowIdx": 2, - "colIdx": 1 - }, - "spellIds": [ - 49016 - ], - "maxPoints": 1 - }, - { - "fieldName": "contagion", - "fancyName": "Contagion", - "location": { - "rowIdx": 2, - "colIdx": 2 - }, - "spellIds": [ - 91316, - 91319 - ], - "maxPoints": 2, - "prereqLocation": { - "rowIdx": 0, - "colIdx": 2 - } - }, - { - "fieldName": "shadowInfusion", - "fancyName": "Shadow Infusion", - "location": { - "rowIdx": 2, - "colIdx": 3 - }, - "spellIds": [ - 48965, - 49571, - 49572 - ], - "maxPoints": 3 - }, - { - "fieldName": "deathsAdvance", - "fancyName": "Deaths Advance", - "location": { - "rowIdx": 3, - "colIdx": 0 - }, - "spellIds": [ - 96269, - 96270 - ], - "maxPoints": 2 - }, - { - "fieldName": "magicSuppression", - "fancyName": "Magic Suppression", - "location": { - "rowIdx": 3, - "colIdx": 1 - }, - "spellIds": [ - 49224, - 49610, - 49611 - ], - "maxPoints": 3 - }, - { - "fieldName": "rageOfRivendare", - "fancyName": "Rage Of Rivendare", - "location": { - "rowIdx": 3, - "colIdx": 2 - }, - "spellIds": [ - 51745, - 51746, - 91323 - ], - "maxPoints": 3 - }, - { - "fieldName": "unholyBlight", - "fancyName": "Unholy Blight", - "location": { - "rowIdx": 4, - "colIdx": 0 - }, - "spellIds": [ - 49194 - ], - "maxPoints": 1 - }, - { - "fieldName": "antiMagicZone", - "fancyName": "Anti Magic Zone", - "location": { - "rowIdx": 4, - "colIdx": 1 - }, - "spellIds": [ - 51052 - ], - "maxPoints": 1, - "prereqLocation": { - "rowIdx": 3, - "colIdx": 1 - } - }, - { - "fieldName": "improvedUnholyPresence", - "fancyName": "Improved Unholy Presence", - "location": { - "rowIdx": 4, - "colIdx": 2 - }, - "spellIds": [ - 50391, - 50392 - ], - "maxPoints": 2 - }, - { - "fieldName": "darkTransformation", - "fancyName": "Dark Transformation", - "location": { - "rowIdx": 4, - "colIdx": 3 - }, - "spellIds": [ - 63560 - ], - "maxPoints": 1, - "prereqLocation": { - "rowIdx": 2, - "colIdx": 3 - } - }, - { - "fieldName": "ebonPlaguebringer", - "fancyName": "Ebon Plaguebringer", - "location": { - "rowIdx": 5, - "colIdx": 1 - }, - "spellIds": [ - 51099, - 51160 - ], - "maxPoints": 2 - }, - { - "fieldName": "suddenDoom", - "fancyName": "Sudden Doom", - "location": { - "rowIdx": 5, - "colIdx": 2 - }, - "spellIds": [ - 49018, - 49529, - 49530 - ], - "maxPoints": 3 - }, - { - "fieldName": "summonGargoyle", - "fancyName": "Summon Gargoyle", - "location": { - "rowIdx": 6, - "colIdx": 1 - }, - "spellIds": [ - 49206 - ], - "maxPoints": 1 - } - ] - } - ] \ No newline at end of file +[ + { + "name": "Blood", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/398.jpg", + "talents": [ + { + "fieldName": "butchery", + "fancyName": "Butchery", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 48979, + 49483 + ], + "maxPoints": 2 + }, + { + "fieldName": "bladeBarrier", + "fancyName": "Blade Barrier", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 49182, + 49500, + 49501 + ], + "maxPoints": 3 + }, + { + "fieldName": "bladedArmor", + "fancyName": "Bladed Armor", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 48978, + 49390, + 49391 + ], + "maxPoints": 3 + }, + { + "fieldName": "improvedBloodTap", + "fancyName": "Improved Blood Tap", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 94553, + 94555 + ], + "maxPoints": 2 + }, + { + "fieldName": "scentOfBlood", + "fancyName": "Scent Of Blood", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 49004, + 49508, + 49509 + ], + "maxPoints": 3 + }, + { + "fieldName": "scarletFever", + "fancyName": "Scarlet Fever", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 81131, + 81132 + ], + "maxPoints": 2 + }, + { + "fieldName": "handOfDoom", + "fancyName": "Hand Of Doom", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 85793, + 85794 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodCakedBlade", + "fancyName": "Blood Caked Blade", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 49219, + 49627, + 49628 + ], + "maxPoints": 3 + }, + { + "fieldName": "boneShield", + "fancyName": "Bone Shield", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49222 + ], + "maxPoints": 1 + }, + { + "fieldName": "toughness", + "fancyName": "Toughness", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 49042, + 49786, + 49787 + ], + "maxPoints": 3 + }, + { + "fieldName": "abominationsMight", + "fancyName": "Abominations Might", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 53137, + 53138 + ], + "maxPoints": 2 + }, + { + "fieldName": "sanguineFortitude", + "fancyName": "Sanguine Fortitude", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 81125, + 81127 + ], + "maxPoints": 2 + }, + { + "fieldName": "bloodParasite", + "fancyName": "Blood Parasite", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 49027, + 49542 + ], + "maxPoints": 2 + }, + { + "fieldName": "improvedBloodPresence", + "fancyName": "Improved Blood Presence", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 50365, + 50371 + ], + "maxPoints": 2 + }, + { + "fieldName": "willOfTheNecropolis", + "fancyName": "Will Of The Necropolis", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 52284, + 81163, + 81164 + ], + "maxPoints": 3, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + }, + { + "fieldName": "runeTap", + "fancyName": "Rune Tap", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 48982 + ], + "maxPoints": 1 + }, + { + "fieldName": "vampiricBlood", + "fancyName": "Vampiric Blood", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 55233 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedDeathStrike", + "fancyName": "Improved Death Strike", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 62905, + 62908, + 81138 + ], + "maxPoints": 3 + }, + { + "fieldName": "crimsonScourge", + "fancyName": "Crimson Scourge", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 81135, + 81136 + ], + "maxPoints": 2 + }, + { + "fieldName": "dancingRuneWeapon", + "fancyName": "Dancing Rune Weapon", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 49028 + ], + "maxPoints": 1 + } + ] + }, + { + "name": "Frost", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/399.jpg", + "talents": [ + { + "fieldName": "runicPowerMastery", + "fancyName": "Runic Power Mastery", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 49455, + 50147, + 91145 + ], + "maxPoints": 3 + }, + { + "fieldName": "icyReach", + "fancyName": "Icy Reach", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 55061, + 55062 + ], + "maxPoints": 2 + }, + { + "fieldName": "nervesOfColdSteel", + "fancyName": "Nerves Of Cold Steel", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 49226, + 50137, + 50138 + ], + "maxPoints": 3 + }, + { + "fieldName": "annihilation", + "fancyName": "Annihilation", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 51468, + 51472, + 51473 + ], + "maxPoints": 3 + }, + { + "fieldName": "lichborne", + "fancyName": "Lichborne", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 49039 + ], + "maxPoints": 1 + }, + { + "fieldName": "onAPaleHorse", + "fancyName": "On A Pale Horse", + "location": { + "rowIdx": 1, + "colIdx": 2 + }, + "spellIds": [ + 51983, + 51986 + ], + "maxPoints": 2 + }, + { + "fieldName": "endlessWinter", + "fancyName": "Endless Winter", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 49137, + 49657 + ], + "maxPoints": 2 + }, + { + "fieldName": "mercilessCombat", + "fancyName": "Merciless Combat", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 49024, + 49538 + ], + "maxPoints": 2 + }, + { + "fieldName": "chillOfTheGrave", + "fancyName": "Chill Of The Grave", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49149, + 50115 + ], + "maxPoints": 2 + }, + { + "fieldName": "killingMachine", + "fancyName": "Killing Machine", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 51123, + 51127, + 51128 + ], + "maxPoints": 3 + }, + { + "fieldName": "rime", + "fancyName": "Rime", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 49188, + 56822, + 59057 + ], + "maxPoints": 3 + }, + { + "fieldName": "pillarOfFrost", + "fancyName": "Pillar Of Frost", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 51271 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedIcyTalons", + "fancyName": "Improved Icy Talons", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 55610 + ], + "maxPoints": 1 + }, + { + "fieldName": "brittleBones", + "fancyName": "Brittle Bones", + "location": { + "rowIdx": 3, + "colIdx": 3 + }, + "spellIds": [ + 81327, + 81328 + ], + "maxPoints": 2 + }, + { + "fieldName": "chilblains", + "fancyName": "Chilblains", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 50040, + 50041 + ], + "maxPoints": 2 + }, + { + "fieldName": "hungeringCold", + "fancyName": "Hungering Cold", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 49203 + ], + "maxPoints": 1 + }, + { + "fieldName": "improvedFrostPresence", + "fancyName": "Improved Frost Presence", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 50384, + 50385 + ], + "maxPoints": 2 + }, + { + "fieldName": "threatOfThassarian", + "fancyName": "Threat Of Thassarian", + "location": { + "rowIdx": 5, + "colIdx": 0 + }, + "spellIds": [ + 65661, + 66191, + 66192 + ], + "maxPoints": 3 + }, + { + "fieldName": "mightOfTheFrozenWastes", + "fancyName": "Might Of The Frozen Wastes", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 81330, + 81332, + 81333 + ], + "maxPoints": 3 + }, + { + "fieldName": "howlingBlast", + "fancyName": "Howling Blast", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 49184 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 4, + "colIdx": 1 + } + } + ] + }, + { + "name": "Unholy", + "backgroundUrl": "https://wow.zamimg.com/images/wow/talents/backgrounds/cata/400.jpg", + "talents": [ + { + "fieldName": "unholyCommand", + "fancyName": "Unholy Command", + "location": { + "rowIdx": 0, + "colIdx": 0 + }, + "spellIds": [ + 49588, + 49589 + ], + "maxPoints": 2 + }, + { + "fieldName": "virulence", + "fancyName": "Virulence", + "location": { + "rowIdx": 0, + "colIdx": 1 + }, + "spellIds": [ + 48962, + 49567, + 49568 + ], + "maxPoints": 3 + }, + { + "fieldName": "epidemic", + "fancyName": "Epidemic", + "location": { + "rowIdx": 0, + "colIdx": 2 + }, + "spellIds": [ + 49036, + 49562, + 81334 + ], + "maxPoints": 3 + }, + { + "fieldName": "desecration", + "fancyName": "Desecration", + "location": { + "rowIdx": 1, + "colIdx": 0 + }, + "spellIds": [ + 55666, + 55667 + ], + "maxPoints": 2 + }, + { + "fieldName": "resilientInfection", + "fancyName": "Resilient Infection", + "location": { + "rowIdx": 1, + "colIdx": 1 + }, + "spellIds": [ + 81338, + 81339 + ], + "maxPoints": 2 + }, + { + "fieldName": "morbidity", + "fancyName": "Morbidity", + "location": { + "rowIdx": 1, + "colIdx": 3 + }, + "spellIds": [ + 48963, + 49564, + 49565 + ], + "maxPoints": 3 + }, + { + "fieldName": "runicCorruption", + "fancyName": "Runic Corruption", + "location": { + "rowIdx": 2, + "colIdx": 0 + }, + "spellIds": [ + 51459, + 51462 + ], + "maxPoints": 2 + }, + { + "fieldName": "unholyFrenzy", + "fancyName": "Unholy Frenzy", + "location": { + "rowIdx": 2, + "colIdx": 1 + }, + "spellIds": [ + 49016 + ], + "maxPoints": 1 + }, + { + "fieldName": "contagion", + "fancyName": "Contagion", + "location": { + "rowIdx": 2, + "colIdx": 2 + }, + "spellIds": [ + 91316, + 91319 + ], + "maxPoints": 2, + "prereqLocation": { + "rowIdx": 0, + "colIdx": 2 + } + }, + { + "fieldName": "shadowInfusion", + "fancyName": "Shadow Infusion", + "location": { + "rowIdx": 2, + "colIdx": 3 + }, + "spellIds": [ + 48965, + 49571, + 49572 + ], + "maxPoints": 3 + }, + { + "fieldName": "deathsAdvance", + "fancyName": "Deaths Advance", + "location": { + "rowIdx": 3, + "colIdx": 0 + }, + "spellIds": [ + 96269, + 96270 + ], + "maxPoints": 2 + }, + { + "fieldName": "magicSuppression", + "fancyName": "Magic Suppression", + "location": { + "rowIdx": 3, + "colIdx": 1 + }, + "spellIds": [ + 49224, + 49610, + 49611 + ], + "maxPoints": 3 + }, + { + "fieldName": "rageOfRivendare", + "fancyName": "Rage Of Rivendare", + "location": { + "rowIdx": 3, + "colIdx": 2 + }, + "spellIds": [ + 51745, + 51746, + 91323 + ], + "maxPoints": 3 + }, + { + "fieldName": "unholyBlight", + "fancyName": "Unholy Blight", + "location": { + "rowIdx": 4, + "colIdx": 0 + }, + "spellIds": [ + 49194 + ], + "maxPoints": 1 + }, + { + "fieldName": "antiMagicZone", + "fancyName": "Anti Magic Zone", + "location": { + "rowIdx": 4, + "colIdx": 1 + }, + "spellIds": [ + 51052 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 3, + "colIdx": 1 + } + }, + { + "fieldName": "improvedUnholyPresence", + "fancyName": "Improved Unholy Presence", + "location": { + "rowIdx": 4, + "colIdx": 2 + }, + "spellIds": [ + 50391, + 50392 + ], + "maxPoints": 2 + }, + { + "fieldName": "darkTransformation", + "fancyName": "Dark Transformation", + "location": { + "rowIdx": 4, + "colIdx": 3 + }, + "spellIds": [ + 63560 + ], + "maxPoints": 1, + "prereqLocation": { + "rowIdx": 2, + "colIdx": 3 + } + }, + { + "fieldName": "ebonPlaguebringer", + "fancyName": "Ebon Plaguebringer", + "location": { + "rowIdx": 5, + "colIdx": 1 + }, + "spellIds": [ + 51099, + 51160 + ], + "maxPoints": 2 + }, + { + "fieldName": "suddenDoom", + "fancyName": "Sudden Doom", + "location": { + "rowIdx": 5, + "colIdx": 2 + }, + "spellIds": [ + 49018, + 49529, + 49530 + ], + "maxPoints": 3 + }, + { + "fieldName": "summonGargoyle", + "fancyName": "Summon Gargoyle", + "location": { + "rowIdx": 6, + "colIdx": 1 + }, + "spellIds": [ + 49206 + ], + "maxPoints": 1 + } + ] + } + ] From 5826ca435f7328061563f5252a48ca60b6d7261d Mon Sep 17 00:00:00 2001 From: Rosen Rusinov Date: Thu, 18 Apr 2024 21:47:23 +0200 Subject: [PATCH 2/3] add dk import --- sim/death_knight/death_knight.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sim/death_knight/death_knight.go b/sim/death_knight/death_knight.go index d3075472c7..fcc0972cd1 100644 --- a/sim/death_knight/death_knight.go +++ b/sim/death_knight/death_knight.go @@ -7,6 +7,7 @@ import ( "github.com/wowsims/cata/sim/core" "github.com/wowsims/cata/sim/core/proto" "github.com/wowsims/cata/sim/core/stats" + "github.com/wowsims/cata/sim/core/talent_trees" ) const ( From ef490f107df4189dd48f55e746fdf1de136d902c Mon Sep 17 00:00:00 2001 From: Rosen Rusinov Date: Thu, 18 Apr 2024 21:49:07 +0200 Subject: [PATCH 3/3] add dk talents data --- sim/death_knight/death_knight.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sim/death_knight/death_knight.go b/sim/death_knight/death_knight.go index 87f3cb4a09..fcc0972cd1 100644 --- a/sim/death_knight/death_knight.go +++ b/sim/death_knight/death_knight.go @@ -141,6 +141,7 @@ func NewDeathKnight(character *core.Character, inputs DeathKnightInputs, talents ClassBaseScaling: 1125.227400, } core.FillTalentsProto(dk.Talents.ProtoReflect(), talents, TalentTreeSizes) + dk.FillTalentsData(talent_trees.DeathKnightTalentsConfig, talents) maxRunicPower := 100.0 + 15.0*float64(dk.Talents.RunicPowerMastery) currentRunicPower := math.Min(maxRunicPower, dk.Inputs.StartingRunicPower)