diff --git a/AscensionExporter/AscensionExporter.toc b/AscensionExporter/AscensionExporter.toc index ae95a85..13300b2 100644 --- a/AscensionExporter/AscensionExporter.toc +++ b/AscensionExporter/AscensionExporter.toc @@ -5,11 +5,9 @@ ## Version: 0.1.0 ## SavedVariables: AscensionExporterSaved, AscensionExporterConfig -Core.lua Util\Json.lua -Util\TalentEncoder.lua -Util\AscensionTalentMapper.lua -UI\ExportFrame.lua Collectors\Talents.lua Collectors\Gear.lua Collectors\Enchants.lua +UI\ExportFrame.lua +Core.lua diff --git a/AscensionExporter/Core.lua b/AscensionExporter/Core.lua index f116457..feacb14 100644 --- a/AscensionExporter/Core.lua +++ b/AscensionExporter/Core.lua @@ -337,84 +337,8 @@ function AE:GenerateMarkdownEnchants() return table.concat(lines, "\n") end --- Markdown talents export generator -function AE:GenerateMarkdownTalents() - local talents = self.CollectTalents and self.CollectTalents() or {} - local _, class = UnitClass("player") - - local lines = {} - table.insert(lines, "## Talents\n") - - -- Check if we have Ascension talent data - if talents.talents and #talents.talents > 0 then - -- Extract Ascension talent IDs - local ascensionIds = {} - for _, tal in ipairs(talents.talents) do - table.insert(ascensionIds, tal.id or 0) - end - - -- Convert to calculator format using the mapper - local _, class = UnitClass("player") - - -- Debug output - table.insert(lines, string.format("*Debug: Class=%s, TalentIDs=%d*\n", tostring(class), #ascensionIds)) - table.insert(lines, string.format("*Debug: Mapper loaded=%s, Function type=%s*\n", - tostring(self._loadedAscensionTalentMapper or false), - tostring(type(self.ConvertAscensionTalentsToCalcFormat)))) - - if not self.ConvertAscensionTalentsToCalcFormat then - table.insert(lines, "*Error: ConvertAscensionTalentsToCalcFormat function not available.*\n") - return table.concat(lines, "\n") - end - - local buildString, err = self.ConvertAscensionTalentsToCalcFormat(ascensionIds, class) - - if err then - table.insert(lines, string.format("*Conversion error: %s*\n", tostring(err))) - end - - if buildString then - -- Generate URL for talent calculator - local url = string.format("https://exil.es/en/wow/talent-calc?build=%s", buildString) - table.insert(lines, string.format("[View in Talent Calculator](%s)\n", url)) - - -- Embed iframe for Wiki.js - table.insert(lines, string.format('\n', buildString)) - - return table.concat(lines, "\n") - else - table.insert(lines, "*Could not convert talents to calculator format (no build string returned).*\n") - return table.concat(lines, "\n") - end - end - - -- Fallback: show build string if talent list not available - if talents.buildString and talents.buildString ~= "" then - table.insert(lines, "*Talent data available but could not be parsed.*\n") - return table.concat(lines, "\n") - end - - -- Fallback: check for old-style selected talents - local count = #(talents.selected or {}) - if count == 0 then - table.insert(lines, "*No talents selected. Make sure you have spent talent points on your character.*\n") - return table.concat(lines, "\n") - end - - -- Generate the talent calc URL (old format) - local url = self.GenerateTalentCalcURL and self.GenerateTalentCalcURL(talents, class) - if url then - table.insert(lines, string.format("[View in Talent Calculator](%s)\n", url)) - end - - -- Optional: embed iframe for Wiki.js - local build = self.EncodeTalentsToURL and self.EncodeTalentsToURL(talents, class) - if build then - table.insert(lines, string.format('\n', build)) - end - - return table.concat(lines, "\n") -end +-- Markdown talents export generator - REMOVED +-- Talent export is not supported due to technical limitations -- Slash command handling SLASH_ASCX1 = "/ascx" @@ -427,7 +351,7 @@ SlashCmdList["ASCX"] = function(msg) -- avoid referencing buttons that won't be present in the fallback window. local hasButtons = type(_G.AscensionExporter_ShowExportFrame) == "function" local prefix = hasButtons and "Use the buttons above or type:" or "Type one of the commands:" - local help = prefix .. "\n/ascx export all|talents|gear|enchants|mdgear|mdtalents\n/ascx sv on|off (SavedVariables is currently " .. (AscensionExporterConfig.enableSavedVariables and "ON" or "OFF") .. ")\n/ascx debug (show collector status)\n" + local help = prefix .. "\n/ascx export all|talents|gear|enchants|mdgear|mdenchants\n/ascx sv on|off (SavedVariables is currently " .. (AscensionExporterConfig.enableSavedVariables and "ON" or "OFF") .. ")\n/ascx debug (show collector status)\n" AE:ShowExport(help, "Ascension Export - Tools & Help") return end @@ -438,9 +362,6 @@ SlashCmdList["ASCX"] = function(msg) if rest == "mdgear" or rest == "md" then local md = AE:GenerateMarkdownGear() AE:ShowExport(md, "Ascension Export - Markdown Gear - Copy All (Ctrl+C)") - elseif rest == "mdtalents" then - local md = AE:GenerateMarkdownTalents() - AE:ShowExport(md, "Ascension Export - Markdown Talents - Copy All (Ctrl+C)") elseif rest == "all" or rest == "talents" or rest == "gear" or rest == "enchants" then AE:Export(rest) else diff --git a/AscensionExporter/UI/ExportFrame.lua b/AscensionExporter/UI/ExportFrame.lua index bed3f3e..a8c3976 100644 --- a/AscensionExporter/UI/ExportFrame.lua +++ b/AscensionExporter/UI/ExportFrame.lua @@ -66,22 +66,10 @@ local function CreateOrGetFrame() end end) - -- Second row for additional buttons - local x2 = 0 - makeBtn("MD Talents", x2, function() - if AscensionExporter and AscensionExporter.GenerateMarkdownTalents then - local md = AscensionExporter:GenerateMarkdownTalents() or "" - if AscensionExporter.ShowExport then - AscensionExporter:ShowExport(md, "Ascension Export - Markdown Talents - Copy All (Ctrl+C)") - else - AscensionExporter_ShowExportFrame(md, "Ascension Export - Markdown Talents - Copy All (Ctrl+C)") - end - end - end):SetPoint("TOPLEFT", 16 + x2, -62) -- ScrollFrame + EditBox local scrollFrame = CreateFrame("ScrollFrame", "AscensionExporterScrollFrame", frame, "UIPanelScrollFrameTemplate") - scrollFrame:SetPoint("TOPLEFT", 16, -90) + scrollFrame:SetPoint("TOPLEFT", 16, -64) scrollFrame:SetPoint("BOTTOMRIGHT", -32, 16) local editBox = CreateFrame("EditBox", "AscensionExporterEditBox", scrollFrame) diff --git a/AscensionExporter/Util/AscensionTalentMapper.lua b/AscensionExporter/Util/AscensionTalentMapper.lua deleted file mode 100644 index aec6654..0000000 --- a/AscensionExporter/Util/AscensionTalentMapper.lua +++ /dev/null @@ -1,892 +0,0 @@ --- AscensionExporter - Ascension Talent ID to Calculator Position Mapper --- Auto-generated from talent calculator JSON files - -AscensionExporter = _G.AscensionExporter or {} -_G.AscensionExporter = AscensionExporter -local AE = AscensionExporter - --- Auto-generated mapping table -local CLASS_TALENT_MAPS = { - DRUID = { - [13121] = {tab=1, slot=0, maxRank=5}, -- Ferocity - [1360] = {tab=1, slot=3, maxRank=2}, -- Savage Defense - [13126] = {tab=1, slot=4, maxRank=5}, -- Feral Aggression - [13131] = {tab=1, slot=5, maxRank=3}, -- Feral Instinct - [13134] = {tab=1, slot=6, maxRank=2}, -- Savage Fury - [13136] = {tab=1, slot=7, maxRank=3}, -- Thick Hide - [13139] = {tab=1, slot=8, maxRank=2}, -- Feral Swiftness - [13141] = {tab=1, slot=9, maxRank=1}, -- Survival Instincts - [13142] = {tab=1, slot=10, maxRank=3}, -- Sharpened Claws - [13145] = {tab=1, slot=11, maxRank=2}, -- Shredding Attacks - [13147] = {tab=1, slot=12, maxRank=3}, -- Predatory Strikes - [13150] = {tab=1, slot=13, maxRank=2}, -- Primal Fury - [13152] = {tab=1, slot=14, maxRank=2}, -- Primal Precision - [13154] = {tab=1, slot=15, maxRank=2}, -- Brutal Impact - [13156] = {tab=1, slot=16, maxRank=1}, -- Feral Charge - [13157] = {tab=1, slot=17, maxRank=2}, -- Nurturing Instinct - [13159] = {tab=1, slot=18, maxRank=3}, -- Natural Reaction - [13162] = {tab=1, slot=19, maxRank=5}, -- Heart of the Wild - [13167] = {tab=1, slot=20, maxRank=3}, -- Survival of the Fittest - [13170] = {tab=1, slot=21, maxRank=1}, -- Leader of the Pack - [13171] = {tab=1, slot=22, maxRank=2}, -- Improved Leader of the Pack - [13173] = {tab=1, slot=23, maxRank=3}, -- Primal Tenacity - [13176] = {tab=1, slot=24, maxRank=3}, -- Protector of the Pack - [13179] = {tab=1, slot=25, maxRank=3}, -- Predatory Instincts - [13182] = {tab=1, slot=26, maxRank=3}, -- Infected Wounds - [13185] = {tab=1, slot=27, maxRank=3}, -- King of the Jungle - [13188] = {tab=1, slot=28, maxRank=1}, -- Mangle - [13189] = {tab=1, slot=29, maxRank=2}, -- Improved Mangle - [13192] = {tab=1, slot=30, maxRank=3}, -- Rend and Tear - [13197] = {tab=1, slot=31, maxRank=1}, -- Primal Gore - [13198] = {tab=1, slot=32, maxRank=1}, -- Berserk - [13199] = {tab=2, slot=0, maxRank=2}, -- Improved Mark of the Wild - [13201] = {tab=2, slot=1, maxRank=3}, -- Nature's Focus - [13204] = {tab=2, slot=2, maxRank=5}, -- Furor - [13209] = {tab=2, slot=3, maxRank=5}, -- Naturalist - [13214] = {tab=2, slot=4, maxRank=3}, -- Subtlety - [13217] = {tab=2, slot=5, maxRank=3}, -- Natural Shapeshifter - [13220] = {tab=2, slot=6, maxRank=3}, -- Intensity - [13223] = {tab=2, slot=7, maxRank=1}, -- Omen of Clarity - [13224] = {tab=2, slot=8, maxRank=2}, -- Master Shapeshifter - [13226] = {tab=2, slot=9, maxRank=5}, -- Tranquil Spirit - [13231] = {tab=2, slot=10, maxRank=3}, -- Improved Rejuvenation - [13234] = {tab=2, slot=11, maxRank=1}, -- Nature's Swiftness - [13235] = {tab=2, slot=12, maxRank=5}, -- Gift of Nature - [13240] = {tab=2, slot=13, maxRank=2}, -- Improved Tranquility - [13242] = {tab=2, slot=14, maxRank=2}, -- Empowered Touch - [13244] = {tab=2, slot=15, maxRank=5}, -- Nature's Bounty - [13249] = {tab=2, slot=16, maxRank=3}, -- Living Spirit - [13252] = {tab=2, slot=17, maxRank=1}, -- Swiftmend - [13253] = {tab=2, slot=18, maxRank=3}, -- Natural Perfection - [13256] = {tab=2, slot=19, maxRank=3}, -- Empowered Rejuvenation - [13261] = {tab=2, slot=20, maxRank=3}, -- Living Seed - [13264] = {tab=2, slot=21, maxRank=3}, -- Revitalize - [13267] = {tab=2, slot=22, maxRank=1}, -- Tree of Life - [13268] = {tab=2, slot=23, maxRank=3}, -- Improved Tree of Life - [13271] = {tab=2, slot=24, maxRank=2}, -- Improved Barkskin - [13273] = {tab=2, slot=25, maxRank=3}, -- Gift of the Earthmother - [13278] = {tab=2, slot=26, maxRank=1}, -- Wild Growth - [13279] = {tab=3, slot=0, maxRank=5}, -- Starlight Wrath - [13284] = {tab=3, slot=1, maxRank=5}, -- Genesis - [13289] = {tab=3, slot=3, maxRank=3}, -- Moonglow - [13292] = {tab=3, slot=4, maxRank=2}, -- Nature's Majesty - [13294] = {tab=3, slot=5, maxRank=2}, -- Improved Moonfire - [13296] = {tab=3, slot=6, maxRank=3}, -- Brambles - [13299] = {tab=3, slot=7, maxRank=3}, -- Nature's Grace - [13302] = {tab=3, slot=8, maxRank=1}, -- Nature's Splendor - [13303] = {tab=3, slot=9, maxRank=2}, -- Nature's Reach - [13305] = {tab=3, slot=10, maxRank=3}, -- Vengeance - [13310] = {tab=3, slot=11, maxRank=3}, -- Celestial Focus - [13313] = {tab=3, slot=12, maxRank=3}, -- Lunar Guidance - [13316] = {tab=3, slot=13, maxRank=1}, -- Insect Swarm - [13317] = {tab=3, slot=14, maxRank=3}, -- Improved Insect Swarm - [13320] = {tab=3, slot=15, maxRank=3}, -- Dreamstate - [13323] = {tab=3, slot=16, maxRank=3}, -- Moonfury - [13326] = {tab=3, slot=17, maxRank=2}, -- Balance of Power - [13328] = {tab=3, slot=18, maxRank=1}, -- Moonkin Form - [13329] = {tab=3, slot=19, maxRank=3}, -- Improved Moonkin Form - [13332] = {tab=3, slot=20, maxRank=3}, -- Improved Faerie Fire - [13335] = {tab=3, slot=21, maxRank=3}, -- Owlkin Frenzy - [13338] = {tab=3, slot=22, maxRank=3}, -- Wrath of Cenarius - [13343] = {tab=3, slot=23, maxRank=3}, -- Eclipse - [13346] = {tab=3, slot=24, maxRank=1}, -- Typhoon - [13347] = {tab=3, slot=25, maxRank=1}, -- Force of Nature - [13348] = {tab=3, slot=26, maxRank=2}, -- Gale Winds - [13350] = {tab=3, slot=27, maxRank=3}, -- Earth and Moon - [13353] = {tab=3, slot=28, maxRank=1}, -- Starfall - }, - - HUNTER = { - [13570] = {tab=1, slot=0, maxRank=5}, -- Improved Aspect of the Hawk - [13575] = {tab=1, slot=1, maxRank=5}, -- Endurance Training - [13580] = {tab=1, slot=2, maxRank=2}, -- Focused Fire - [13582] = {tab=1, slot=3, maxRank=3}, -- Improved Aspect of the Monkey - [13585] = {tab=1, slot=4, maxRank=3}, -- Thick Hide - [13588] = {tab=1, slot=5, maxRank=2}, -- Improved Revive Pet - [13590] = {tab=1, slot=6, maxRank=2}, -- Pathfinding - [13592] = {tab=1, slot=7, maxRank=1}, -- Aspect Mastery - [13593] = {tab=1, slot=8, maxRank=5}, -- Unleashed Fury - [13598] = {tab=1, slot=9, maxRank=2}, -- Improved Mend Pet - [13600] = {tab=1, slot=10, maxRank=5}, -- Ferocity - [13605] = {tab=1, slot=11, maxRank=2}, -- Spirit Bond - [13607] = {tab=1, slot=12, maxRank=1}, -- Intimidation - [13608] = {tab=1, slot=13, maxRank=2}, -- Bestial Discipline - [13610] = {tab=1, slot=14, maxRank=2}, -- Animal Handler - [13612] = {tab=1, slot=15, maxRank=5}, -- Frenzy - [13617] = {tab=1, slot=16, maxRank=3}, -- Ferocious Inspiration - [13620] = {tab=1, slot=17, maxRank=1}, -- Bestial Wrath - [13621] = {tab=1, slot=18, maxRank=3}, -- Catlike Reflexes - [13624] = {tab=1, slot=19, maxRank=2}, -- Invigoration - [13626] = {tab=1, slot=20, maxRank=3}, -- Serpent's Swiftness - [13631] = {tab=1, slot=21, maxRank=3}, -- Longevity - [13634] = {tab=1, slot=22, maxRank=1}, -- The Beast Within - [13635] = {tab=1, slot=23, maxRank=3}, -- Cobra Strikes - [13638] = {tab=1, slot=24, maxRank=3}, -- Kindred Spirits - [13643] = {tab=1, slot=25, maxRank=1}, -- Beast Mastery - [769] = {tab=2, slot=0, maxRank=2}, -- Lone Wolf - [13644] = {tab=2, slot=1, maxRank=5}, -- Improved Tracking - [13649] = {tab=2, slot=2, maxRank=3}, -- Hawk Eye - [13652] = {tab=2, slot=3, maxRank=3}, -- Savage Strikes - [13654] = {tab=2, slot=4, maxRank=3}, -- Surefooted - [13657] = {tab=2, slot=5, maxRank=3}, -- Entrapment - [13660] = {tab=2, slot=6, maxRank=3}, -- Trap Mastery - [13663] = {tab=2, slot=7, maxRank=2}, -- Survival Instincts - [13665] = {tab=2, slot=8, maxRank=5}, -- Survivalist - [13668] = {tab=2, slot=9, maxRank=1}, -- Scatter Shot - [13669] = {tab=2, slot=10, maxRank=3}, -- Deflection - [13672] = {tab=2, slot=11, maxRank=2}, -- Survival Tactics - [13674] = {tab=2, slot=12, maxRank=3}, -- T.N.T. - [13677] = {tab=2, slot=13, maxRank=3}, -- Lock and Load - [13680] = {tab=2, slot=14, maxRank=3}, -- Hunter vs. Wild - [13683] = {tab=2, slot=15, maxRank=3}, -- Killer Instinct - [13686] = {tab=2, slot=16, maxRank=1}, -- Counterattack - [13687] = {tab=2, slot=17, maxRank=5}, -- Lightning Reflexes - [13692] = {tab=2, slot=18, maxRank=3}, -- Resourcefulness - [13695] = {tab=2, slot=19, maxRank=3}, -- Expose Weakness - [13698] = {tab=2, slot=20, maxRank=1}, -- Wyvern Sting - [13699] = {tab=2, slot=21, maxRank=2}, -- Thrill of the Hunt - [13702] = {tab=2, slot=22, maxRank=3}, -- Master Tactician - [13707] = {tab=2, slot=23, maxRank=3}, -- Noxious Stings - [13710] = {tab=2, slot=24, maxRank=2}, -- Point of No Escape - [13712] = {tab=2, slot=25, maxRank=1}, -- Black Arrow - [13713] = {tab=2, slot=26, maxRank=3}, -- Sniper Training - [13716] = {tab=2, slot=27, maxRank=3}, -- Hunting Party - [13719] = {tab=2, slot=28, maxRank=1}, -- Explosive Shot - [13720] = {tab=3, slot=0, maxRank=2}, -- Improved Concussive Shot - [13722] = {tab=3, slot=1, maxRank=3}, -- Focused Aim - [13725] = {tab=3, slot=2, maxRank=5}, -- Lethal Shots - [13730] = {tab=3, slot=3, maxRank=3}, -- Careful Aim - [13733] = {tab=3, slot=4, maxRank=3}, -- Improved Hunter's Mark - [13736] = {tab=3, slot=5, maxRank=5}, -- Mortal Shots - [13741] = {tab=3, slot=6, maxRank=2}, -- Go for the Throat - [13743] = {tab=3, slot=7, maxRank=3}, -- Improved Arcane Shot - [13746] = {tab=3, slot=8, maxRank=1}, -- Aimed Shot - [13747] = {tab=3, slot=9, maxRank=2}, -- Rapid Killing - [13749] = {tab=3, slot=10, maxRank=3}, -- Improved Stings - [13752] = {tab=3, slot=11, maxRank=5}, -- Efficiency - [13757] = {tab=3, slot=12, maxRank=2}, -- Concussive Barrage - [13759] = {tab=3, slot=13, maxRank=1}, -- Readiness - [13760] = {tab=3, slot=14, maxRank=3}, -- Barrage - [13763] = {tab=3, slot=15, maxRank=2}, -- Combat Experience - [13765] = {tab=3, slot=16, maxRank=3}, -- Ranged Weapon Specialization - [13768] = {tab=3, slot=17, maxRank=3}, -- Piercing Shots - [13771] = {tab=3, slot=18, maxRank=1}, -- Trueshot Aura - [13772] = {tab=3, slot=19, maxRank=3}, -- Improved Barrage - [13775] = {tab=3, slot=20, maxRank=3}, -- Master Marksman - [13780] = {tab=3, slot=21, maxRank=2}, -- Rapid Recuperation - [13782] = {tab=3, slot=22, maxRank=3}, -- Wild Quiver - [13785] = {tab=3, slot=23, maxRank=1}, -- Silencing Shot - [13786] = {tab=3, slot=24, maxRank=3}, -- Improved Steady Shot - [13789] = {tab=3, slot=25, maxRank=3}, -- Marked for Death - [13794] = {tab=3, slot=26, maxRank=1}, -- Chimera Shot - }, - - MAGE = { - [12001] = {tab=1, slot=0, maxRank=2}, -- Improved Fire Blast - [12003] = {tab=1, slot=1, maxRank=3}, -- Incineration - [12006] = {tab=1, slot=2, maxRank=5}, -- Improved Fireball - [12011] = {tab=1, slot=3, maxRank=5}, -- Ignite - [12016] = {tab=1, slot=4, maxRank=2}, -- Burning Determination - [12018] = {tab=1, slot=5, maxRank=3}, -- World in Flames - [12021] = {tab=1, slot=6, maxRank=2}, -- Flame Throwing - [12023] = {tab=1, slot=7, maxRank=3}, -- Impact - [12026] = {tab=1, slot=8, maxRank=1}, -- Pyroblast - [12027] = {tab=1, slot=9, maxRank=2}, -- Burning Soul - [12029] = {tab=1, slot=10, maxRank=3}, -- Improved Scorch - [12032] = {tab=1, slot=11, maxRank=2}, -- Molten Shields - [12034] = {tab=1, slot=12, maxRank=3}, -- Master of Elements - [12037] = {tab=1, slot=13, maxRank=3}, -- Playing with Fire - [12039] = {tab=1, slot=14, maxRank=3}, -- Critical Mass - [12042] = {tab=1, slot=15, maxRank=1}, -- Blast Wave - [12043] = {tab=1, slot=16, maxRank=2}, -- Blazing Speed - [12045] = {tab=1, slot=17, maxRank=3}, -- Fire Power - [12050] = {tab=1, slot=18, maxRank=3}, -- Pyromaniac - [12053] = {tab=1, slot=19, maxRank=1}, -- Combustion - [12054] = {tab=1, slot=20, maxRank=2}, -- Molten Fury - [12056] = {tab=1, slot=21, maxRank=2}, -- Fiery Payback - [12058] = {tab=1, slot=22, maxRank=3}, -- Empowered Fire - [12061] = {tab=1, slot=23, maxRank=2}, -- Firestarter - [12063] = {tab=1, slot=24, maxRank=1}, -- Dragon's Breath - [12064] = {tab=1, slot=25, maxRank=3}, -- Hot Streak - [12067] = {tab=1, slot=26, maxRank=3}, -- Burnout - [12072] = {tab=1, slot=27, maxRank=1}, -- Living Bomb - [12073] = {tab=2, slot=0, maxRank=3}, -- Frostbite - [12076] = {tab=2, slot=1, maxRank=5}, -- Improved Frostbolt - [12081] = {tab=2, slot=2, maxRank=3}, -- Ice Floes - [12084] = {tab=2, slot=3, maxRank=3}, -- Ice Shards - [12087] = {tab=2, slot=4, maxRank=2}, -- Frost Warding - [12089] = {tab=2, slot=5, maxRank=3}, -- Precision - [12092] = {tab=2, slot=6, maxRank=3}, -- Permafrost - [12095] = {tab=2, slot=7, maxRank=3}, -- Piercing Ice - [12098] = {tab=2, slot=8, maxRank=1}, -- Icy Veins - [12099] = {tab=2, slot=9, maxRank=3}, -- Improved Blizzard - [12102] = {tab=2, slot=10, maxRank=2}, -- Arctic Reach - [12104] = {tab=2, slot=11, maxRank=3}, -- Frost Channeling - [12107] = {tab=2, slot=12, maxRank=3}, -- Shatter - [12110] = {tab=2, slot=13, maxRank=1}, -- Cold Snap - [12111] = {tab=2, slot=14, maxRank=3}, -- Improved Cone of Cold - [12114] = {tab=2, slot=15, maxRank=3}, -- Frozen Core - [12117] = {tab=2, slot=16, maxRank=2}, -- Cold as Ice - [12119] = {tab=2, slot=17, maxRank=3}, -- Winter's Chill - [12122] = {tab=2, slot=18, maxRank=2}, -- Shattered Barrier - [12124] = {tab=2, slot=19, maxRank=1}, -- Ice Barrier - [12125] = {tab=2, slot=20, maxRank=3}, -- Arctic Winds - [12130] = {tab=2, slot=21, maxRank=2}, -- Empowered Frostbolt - [12132] = {tab=2, slot=22, maxRank=2}, -- Fingers of Frost - [12134] = {tab=2, slot=23, maxRank=3}, -- Brain Freeze - [12137] = {tab=2, slot=24, maxRank=1}, -- Summon Water Elemental - [12138] = {tab=2, slot=25, maxRank=3}, -- Enduring Winter - [12141] = {tab=2, slot=26, maxRank=3}, -- Chilled to the Bone - [12146] = {tab=2, slot=27, maxRank=1}, -- Deep Freeze - [12147] = {tab=3, slot=0, maxRank=2}, -- Arcane Subtlety - [426] = {tab=3, slot=1, maxRank=3}, -- Alacrity - [12149] = {tab=3, slot=2, maxRank=3}, -- Arcane Focus - [12152] = {tab=3, slot=3, maxRank=5}, -- Arcane Stability - [12157] = {tab=3, slot=4, maxRank=3}, -- Arcane Fortitude - [12160] = {tab=3, slot=5, maxRank=2}, -- Magic Absorption - [12162] = {tab=3, slot=6, maxRank=5}, -- Arcane Concentration - [12167] = {tab=3, slot=7, maxRank=2}, -- Magic Attunement - [12169] = {tab=3, slot=8, maxRank=3}, -- Spell Impact - [12172] = {tab=3, slot=9, maxRank=3}, -- Student of the Mind - [12175] = {tab=3, slot=10, maxRank=1}, -- Focus Magic - [12176] = {tab=3, slot=11, maxRank=2}, -- Arcane Shielding - [12178] = {tab=3, slot=12, maxRank=2}, -- Improved Counterspell - [12180] = {tab=3, slot=13, maxRank=3}, -- Arcane Meditation - [12183] = {tab=3, slot=14, maxRank=3}, -- Torment the Weak - [12186] = {tab=3, slot=15, maxRank=2}, -- Improved Blink - [12188] = {tab=3, slot=16, maxRank=1}, -- Presence of Mind - [12189] = {tab=3, slot=17, maxRank=5}, -- Arcane Mind - [12194] = {tab=3, slot=18, maxRank=3}, -- Prismatic Cloak - [12197] = {tab=3, slot=19, maxRank=3}, -- Arcane Instability - [12200] = {tab=3, slot=20, maxRank=2}, -- Arcane Potency - [12202] = {tab=3, slot=21, maxRank=3}, -- Arcane Empowerment - [12205] = {tab=3, slot=22, maxRank=1}, -- Arcane Power - [12206] = {tab=3, slot=23, maxRank=3}, -- Incanter's Absorption - [12209] = {tab=3, slot=24, maxRank=2}, -- Arcane Flows - [12211] = {tab=3, slot=25, maxRank=3}, -- Mind Mastery - [12216] = {tab=3, slot=26, maxRank=1}, -- Slow - [12217] = {tab=3, slot=27, maxRank=3}, -- Missile Barrage - [12222] = {tab=3, slot=28, maxRank=3}, -- Netherwind Presence - [12225] = {tab=3, slot=29, maxRank=2}, -- Spell Power - [12227] = {tab=3, slot=31, maxRank=1}, -- Arcane Barrage - }, - - PALADIN = { - [731] = {tab=1, slot=0, maxRank=3}, -- Light's Vengeance - [13795] = {tab=1, slot=1, maxRank=5}, -- Deflection - [13800] = {tab=1, slot=2, maxRank=5}, -- Benediction - [13805] = {tab=1, slot=3, maxRank=2}, -- Improved Judgements - [13807] = {tab=1, slot=4, maxRank=3}, -- Heart of the Crusader - [13810] = {tab=1, slot=5, maxRank=2}, -- Improved Blessing of Might - [13812] = {tab=1, slot=6, maxRank=2}, -- Vindication - [13814] = {tab=1, slot=7, maxRank=3}, -- Conviction - [13819] = {tab=1, slot=8, maxRank=1}, -- Seal of Command - [13820] = {tab=1, slot=9, maxRank=2}, -- Pursuit of Justice - [13822] = {tab=1, slot=10, maxRank=2}, -- Eye for an Eye - [13824] = {tab=1, slot=11, maxRank=3}, -- Sanctity of Battle - [13827] = {tab=1, slot=12, maxRank=3}, -- Crusade - [13830] = {tab=1, slot=13, maxRank=3}, -- Two-Handed Weapon Specialization - [13833] = {tab=1, slot=14, maxRank=1}, -- Sanctified Retribution - [13834] = {tab=1, slot=15, maxRank=3}, -- Vengeance - [13837] = {tab=1, slot=16, maxRank=2}, -- Divine Purpose - [13839] = {tab=1, slot=17, maxRank=2}, -- The Art of War - [13841] = {tab=1, slot=18, maxRank=1}, -- Repentance - [13842] = {tab=1, slot=19, maxRank=2}, -- Judgements of the Wise - [13845] = {tab=1, slot=20, maxRank=3}, -- Fanaticism - [13848] = {tab=1, slot=21, maxRank=2}, -- Sanctified Wrath - [13850] = {tab=1, slot=22, maxRank=3}, -- Swift Retribution - [18455] = {tab=1, slot=23, maxRank=1}, -- Crusader Strike - [13854] = {tab=1, slot=24, maxRank=3}, -- Sheath of Light - [13857] = {tab=1, slot=25, maxRank=3}, -- Righteous Vengeance - [13860] = {tab=1, slot=26, maxRank=1}, -- Divine Storm - [13861] = {tab=2, slot=0, maxRank=5}, -- Spiritual Focus - [13866] = {tab=2, slot=1, maxRank=5}, -- Seals of the Pure - [13871] = {tab=2, slot=2, maxRank=3}, -- Healing Light - [13874] = {tab=2, slot=3, maxRank=5}, -- Divine Intellect - [13879] = {tab=2, slot=4, maxRank=2}, -- Unyielding Faith - [13881] = {tab=2, slot=5, maxRank=1}, -- Aura Mastery - [13882] = {tab=2, slot=6, maxRank=5}, -- Illumination - [13887] = {tab=2, slot=7, maxRank=2}, -- Improved Lay on Hands - [13889] = {tab=2, slot=8, maxRank=3}, -- Improved Concentration Aura - [13892] = {tab=2, slot=9, maxRank=2}, -- Improved Blessing of Wisdom - [13894] = {tab=2, slot=10, maxRank=2}, -- Blessed Hands - [13896] = {tab=2, slot=11, maxRank=2}, -- Pure of Heart - [13898] = {tab=2, slot=12, maxRank=1}, -- Divine Favor - [13899] = {tab=2, slot=13, maxRank=3}, -- Sanctified Light - [13902] = {tab=2, slot=14, maxRank=2}, -- Purifying Power - [13904] = {tab=2, slot=15, maxRank=5}, -- Holy Power - [13909] = {tab=2, slot=16, maxRank=3}, -- Light's Grace - [13912] = {tab=2, slot=17, maxRank=1}, -- Holy Shock - [13913] = {tab=2, slot=18, maxRank=3}, -- Blessed Life - [13916] = {tab=2, slot=19, maxRank=3}, -- Sacred Cleansing - [13919] = {tab=2, slot=20, maxRank=3}, -- Holy Guidance - [13924] = {tab=2, slot=21, maxRank=1}, -- Divine Illumination - [13925] = {tab=2, slot=22, maxRank=3}, -- Judgements of the Pure - [13930] = {tab=2, slot=23, maxRank=2}, -- Infusion of Light - [13932] = {tab=2, slot=24, maxRank=2}, -- Enlightened Judgements - [13934] = {tab=2, slot=25, maxRank=1}, -- Beacon of Light - [5960] = {tab=3, slot=0, maxRank=3}, -- Inner Light - [5950] = {tab=3, slot=1, maxRank=3}, -- Improved Consecration - [13935] = {tab=3, slot=2, maxRank=5}, -- Divinity - [13940] = {tab=3, slot=3, maxRank=5}, -- Divine Strength - [13945] = {tab=3, slot=4, maxRank=3}, -- Stoicism - [13948] = {tab=3, slot=5, maxRank=2}, -- Guardian's Favor - [13950] = {tab=3, slot=6, maxRank=5}, -- Anticipation - [13955] = {tab=3, slot=7, maxRank=1}, -- Divine Sacrifice - [13956] = {tab=3, slot=8, maxRank=3}, -- Improved Righteous Fury - [13959] = {tab=3, slot=9, maxRank=5}, -- Toughness - [13964] = {tab=3, slot=10, maxRank=2}, -- Divine Guardian - [13966] = {tab=3, slot=11, maxRank=2}, -- Improved Hammer of Justice - [13968] = {tab=3, slot=12, maxRank=3}, -- Improved Devotion Aura - [13971] = {tab=3, slot=13, maxRank=1}, -- Blessing of Sanctuary - [13972] = {tab=3, slot=14, maxRank=5}, -- Reckoning - [13977] = {tab=3, slot=15, maxRank=2}, -- Sacred Duty - [13979] = {tab=3, slot=16, maxRank=3}, -- One-Handed Weapon Specialization - [13982] = {tab=3, slot=17, maxRank=2}, -- Spiritual Attunement - [13984] = {tab=3, slot=18, maxRank=1}, -- Holy Shield - [13985] = {tab=3, slot=19, maxRank=3}, -- Ardent Defender - [13988] = {tab=3, slot=20, maxRank=2}, -- Redoubt - [13991] = {tab=3, slot=21, maxRank=3}, -- Combat Expertise - [13994] = {tab=3, slot=22, maxRank=2}, -- Touched by the Light - [13997] = {tab=3, slot=23, maxRank=1}, -- Avenger's Shield - [13998] = {tab=3, slot=24, maxRank=2}, -- Guarded by the Light - [14000] = {tab=3, slot=25, maxRank=3}, -- Shield of the Templar - [14003] = {tab=3, slot=26, maxRank=2}, -- Judgements of the Just - [14005] = {tab=3, slot=27, maxRank=1}, -- Hammer of the Righteous - }, - - PRIEST = { - [12678] = {tab=1, slot=0, maxRank=5}, -- Unbreakable Will - [12683] = {tab=1, slot=1, maxRank=5}, -- Twin Disciplines - [12688] = {tab=1, slot=2, maxRank=3}, -- Silent Resolve - [12691] = {tab=1, slot=3, maxRank=3}, -- Improved Inner Fire - [12694] = {tab=1, slot=4, maxRank=2}, -- Improved Power Word: Fortitude - [12696] = {tab=1, slot=5, maxRank=2}, -- Martyrdom - [12698] = {tab=1, slot=6, maxRank=3}, -- Meditation - [12701] = {tab=1, slot=7, maxRank=1}, -- Inner Focus - [12702] = {tab=1, slot=8, maxRank=3}, -- Improved Power Word: Shield - [12705] = {tab=1, slot=9, maxRank=3}, -- Absolution - [12708] = {tab=1, slot=10, maxRank=3}, -- Mental Agility - [12711] = {tab=1, slot=11, maxRank=2}, -- Improved Mana Burn - [12713] = {tab=1, slot=12, maxRank=2}, -- Reflective Shield - [12715] = {tab=1, slot=13, maxRank=5}, -- Mental Strength - [12720] = {tab=1, slot=14, maxRank=1}, -- Soul Warding - [12721] = {tab=1, slot=15, maxRank=2}, -- Focused Power - [12723] = {tab=1, slot=16, maxRank=3}, -- Enlightenment - [12726] = {tab=1, slot=17, maxRank=3}, -- Focused Will - [12729] = {tab=1, slot=18, maxRank=1}, -- Power Infusion - [12730] = {tab=1, slot=19, maxRank=3}, -- Improved Flash Heal - [12733] = {tab=1, slot=20, maxRank=2}, -- Renewed Hope - [12735] = {tab=1, slot=21, maxRank=3}, -- Rapture - [12738] = {tab=1, slot=22, maxRank=2}, -- Aspiration - [12740] = {tab=1, slot=23, maxRank=2}, -- Divine Aegis - [12743] = {tab=1, slot=24, maxRank=1}, -- Pain Suppression - [12744] = {tab=1, slot=25, maxRank=2}, -- Grace - [12746] = {tab=1, slot=26, maxRank=3}, -- Borrowed Time - [12751] = {tab=1, slot=27, maxRank=1}, -- Penance - [12752] = {tab=2, slot=0, maxRank=2}, -- Healing Focus - [12754] = {tab=2, slot=1, maxRank=3}, -- Improved Renew - [12757] = {tab=2, slot=2, maxRank=5}, -- Holy Specialization - [527] = {tab=2, slot=3, maxRank=3}, -- Inspiration - [12762] = {tab=2, slot=4, maxRank=5}, -- Spell Warding - [12767] = {tab=2, slot=5, maxRank=5}, -- Divine Fury - [12772] = {tab=2, slot=6, maxRank=1}, -- Desperate Prayer - [12773] = {tab=2, slot=7, maxRank=3}, -- Blessed Recovery - [12779] = {tab=2, slot=8, maxRank=2}, -- Holy Reach - [12781] = {tab=2, slot=9, maxRank=3}, -- Improved Healing - [12784] = {tab=2, slot=10, maxRank=2}, -- Searing Light - [12786] = {tab=2, slot=11, maxRank=2}, -- Healing Prayers - [12788] = {tab=2, slot=12, maxRank=1}, -- Spirit of Redemption - [12789] = {tab=2, slot=13, maxRank=5}, -- Spiritual Guidance - [12794] = {tab=2, slot=14, maxRank=2}, -- Surge of Light - [12796] = {tab=2, slot=15, maxRank=3}, -- Spiritual Healing - [12797] = {tab=2, slot=16, maxRank=5}, -- Blessed Vengeance - [12801] = {tab=2, slot=17, maxRank=3}, -- Holy Concentration - [12804] = {tab=2, slot=18, maxRank=1}, -- Lightwell - [12805] = {tab=2, slot=19, maxRank=3}, -- Blessed Resilience - [12798] = {tab=2, slot=20, maxRank=5}, -- Radiant Fury - [12808] = {tab=2, slot=21, maxRank=2}, -- Body and Soul - [12810] = {tab=2, slot=22, maxRank=5}, -- Empowered Healing - [12815] = {tab=2, slot=23, maxRank=3}, -- Serendipity - [12818] = {tab=2, slot=24, maxRank=3}, -- Empowered Renew - [12821] = {tab=2, slot=25, maxRank=1}, -- Circle of Healing - [12822] = {tab=2, slot=26, maxRank=3}, -- Test of Faith - [12825] = {tab=2, slot=27, maxRank=3}, -- Divine Providence - [13825] = {tab=2, slot=28, maxRank=3}, -- Epiphany of Light - [12830] = {tab=2, slot=29, maxRank=1}, -- Guardian Spirit - [12831] = {tab=3, slot=0, maxRank=3}, -- Spirit Tap - [12834] = {tab=3, slot=1, maxRank=2}, -- Improved Spirit Tap - [12836] = {tab=3, slot=2, maxRank=5}, -- Darkness - [12841] = {tab=3, slot=3, maxRank=3}, -- Shadow Affinity - [12844] = {tab=3, slot=4, maxRank=2}, -- Improved Shadow Word: Pain - [12846] = {tab=3, slot=5, maxRank=3}, -- Shadow Focus - [12849] = {tab=3, slot=6, maxRank=2}, -- Improved Psychic Scream - [12851] = {tab=3, slot=7, maxRank=5}, -- Improved Mind Blast - [12856] = {tab=3, slot=8, maxRank=1}, -- Mind Flay - [12857] = {tab=3, slot=9, maxRank=2}, -- Veiled Shadows - [12859] = {tab=3, slot=10, maxRank=2}, -- Shadow Reach - [12861] = {tab=3, slot=11, maxRank=3}, -- Shadow Weaving - [12864] = {tab=3, slot=12, maxRank=1}, -- Silence - [12865] = {tab=3, slot=13, maxRank=1}, -- Vampiric Embrace - [12866] = {tab=3, slot=14, maxRank=2}, -- Improved Vampiric Embrace - [12868] = {tab=3, slot=15, maxRank=3}, -- Focused Mind - [12871] = {tab=3, slot=16, maxRank=2}, -- Mind Melt - [12873] = {tab=3, slot=17, maxRank=3}, -- Improved Devouring Plague - [12876] = {tab=3, slot=18, maxRank=1}, -- Shadowform - [12877] = {tab=3, slot=19, maxRank=3}, -- Shadow Power - [12882] = {tab=3, slot=20, maxRank=2}, -- Improved Shadowform - [12884] = {tab=3, slot=21, maxRank=3}, -- Misery - [12887] = {tab=3, slot=22, maxRank=1}, -- Psychic Horror - [12888] = {tab=3, slot=23, maxRank=1}, -- Vampiric Touch - [12889] = {tab=3, slot=24, maxRank=3}, -- Pain and Suffering - [12892] = {tab=3, slot=25, maxRank=3}, -- Twisted Faith - [12897] = {tab=3, slot=26, maxRank=1}, -- Dispersion - }, - - ROGUE = { - [12456] = {tab=1, slot=0, maxRank=3}, -- Improved Gouge - [12459] = {tab=1, slot=1, maxRank=2}, -- Improved Sinister Strike - [12461] = {tab=1, slot=3, maxRank=5}, -- Dual Wield Specialization - [12466] = {tab=1, slot=5, maxRank=2}, -- Improved Slice and Dice - [12468] = {tab=1, slot=6, maxRank=3}, -- Deflection - [12471] = {tab=1, slot=7, maxRank=5}, -- Precision - [12476] = {tab=1, slot=8, maxRank=2}, -- Endurance - [12478] = {tab=1, slot=9, maxRank=1}, -- Riposte - [12479] = {tab=1, slot=10, maxRank=5}, -- Close Quarters Combat - [12484] = {tab=1, slot=11, maxRank=2}, -- Improved Kick - [12486] = {tab=1, slot=12, maxRank=2}, -- Improved Sprint - [12488] = {tab=1, slot=13, maxRank=3}, -- Lightning Reflexes - [12491] = {tab=1, slot=14, maxRank=5}, -- Aggression - [12496] = {tab=1, slot=15, maxRank=5}, -- Mace Specialization - [12501] = {tab=1, slot=16, maxRank=1}, -- Blade Flurry - [12502] = {tab=1, slot=17, maxRank=5}, -- Hack and Slash - [12507] = {tab=1, slot=18, maxRank=2}, -- Weapon Expertise - [12509] = {tab=1, slot=19, maxRank=2}, -- Blade Twisting - [12511] = {tab=1, slot=20, maxRank=3}, -- Vitality - [12514] = {tab=1, slot=21, maxRank=1}, -- Adrenaline Rush - [12515] = {tab=1, slot=22, maxRank=2}, -- Nerves of Steel - [12517] = {tab=1, slot=23, maxRank=2}, -- Throwing Specialization - [12519] = {tab=1, slot=24, maxRank=3}, -- Combat Potency - [12524] = {tab=1, slot=25, maxRank=2}, -- Unfair Advantage - [12526] = {tab=1, slot=26, maxRank=1}, -- Surprise Attacks - [12527] = {tab=1, slot=27, maxRank=2}, -- Savage Combat - [12529] = {tab=1, slot=28, maxRank=3}, -- Prey on the Weak - [12534] = {tab=1, slot=29, maxRank=1}, -- Killing Spree - [12535] = {tab=2, slot=0, maxRank=3}, -- Improved Eviscerate - [12538] = {tab=2, slot=1, maxRank=2}, -- Remorseless Attacks - [12540] = {tab=2, slot=2, maxRank=5}, -- Malice - [12545] = {tab=2, slot=3, maxRank=3}, -- Ruthlessness - [12548] = {tab=2, slot=4, maxRank=2}, -- Blood Spatter - [12550] = {tab=2, slot=5, maxRank=3}, -- Puncturing Wounds - [12553] = {tab=2, slot=6, maxRank=1}, -- Vigor - [12554] = {tab=2, slot=7, maxRank=2}, -- Improved Expose Armor - [12556] = {tab=2, slot=8, maxRank=5}, -- Lethality - [12561] = {tab=2, slot=9, maxRank=3}, -- Vile Poisons - [12564] = {tab=2, slot=10, maxRank=5}, -- Improved Poisons - [12569] = {tab=2, slot=11, maxRank=2}, -- Fleet Footed - [12571] = {tab=2, slot=12, maxRank=1}, -- Cold Blood - [12572] = {tab=2, slot=13, maxRank=3}, -- Improved Kidney Shot - [12575] = {tab=2, slot=14, maxRank=2}, -- Quick Recovery - [12577] = {tab=2, slot=15, maxRank=3}, -- Seal Fate - [12582] = {tab=2, slot=16, maxRank=2}, -- Murder - [12584] = {tab=2, slot=17, maxRank=2}, -- Deadly Brew - [12586] = {tab=2, slot=18, maxRank=1}, -- Overkill - [12587] = {tab=2, slot=19, maxRank=3}, -- Deadened Nerves - [12590] = {tab=2, slot=20, maxRank=3}, -- Focused Attacks - [12593] = {tab=2, slot=21, maxRank=3}, -- Find Weakness - [12596] = {tab=2, slot=22, maxRank=3}, -- Master Poisoner - [12599] = {tab=2, slot=23, maxRank=1}, -- Mutilate - [12600] = {tab=2, slot=24, maxRank=3}, -- Turn the Tables - [12603] = {tab=2, slot=25, maxRank=3}, -- Cut to the Chase - [12608] = {tab=2, slot=26, maxRank=1}, -- Hunger For Blood - [12609] = {tab=3, slot=0, maxRank=5}, -- Relentless Strikes - [12612] = {tab=3, slot=1, maxRank=3}, -- Master of Deception - [12615] = {tab=3, slot=2, maxRank=2}, -- Opportunity - [12617] = {tab=3, slot=3, maxRank=2}, -- Sleight of Hand - [12619] = {tab=3, slot=4, maxRank=2}, -- Dirty Tricks - [12621] = {tab=3, slot=5, maxRank=3}, -- Camouflage - [12624] = {tab=3, slot=6, maxRank=2}, -- Elusiveness - [12626] = {tab=3, slot=7, maxRank=1}, -- Ghostly Strike - [12627] = {tab=3, slot=8, maxRank=3}, -- Serrated Blades - [12630] = {tab=3, slot=9, maxRank=3}, -- Setup - [12633] = {tab=3, slot=10, maxRank=3}, -- Initiative - [12636] = {tab=3, slot=11, maxRank=2}, -- Improved Ambush - [12638] = {tab=3, slot=12, maxRank=2}, -- Heightened Senses - [12640] = {tab=3, slot=13, maxRank=1}, -- Preparation - [12641] = {tab=3, slot=14, maxRank=2}, -- Dirty Deeds - [12643] = {tab=3, slot=15, maxRank=1}, -- Hemorrhage - [12644] = {tab=3, slot=16, maxRank=3}, -- Master of Subtlety - [12647] = {tab=3, slot=17, maxRank=5}, -- Deadliness - [12652] = {tab=3, slot=18, maxRank=3}, -- Enveloping Shadows - [12655] = {tab=3, slot=19, maxRank=1}, -- Premeditation - [12656] = {tab=3, slot=20, maxRank=3}, -- Cheat Death - [12659] = {tab=3, slot=21, maxRank=3}, -- Sinister Calling - [12664] = {tab=3, slot=22, maxRank=2}, -- Waylay - [12666] = {tab=3, slot=23, maxRank=3}, -- Honor Among Thieves - [12670] = {tab=3, slot=24, maxRank=2}, -- Filthy Tricks - [12672] = {tab=3, slot=25, maxRank=3}, -- Slaughter from the Shadows - [12677] = {tab=3, slot=26, maxRank=1}, -- Shadow Dance - }, - - SHAMAN = { - [1148] = {tab=1, slot=0, maxRank=3}, -- Raze - [557] = {tab=1, slot=1, maxRank=5}, -- Convection - [12898] = {tab=1, slot=2, maxRank=5}, -- Convection - [556] = {tab=1, slot=3, maxRank=5}, -- Concussion - [12903] = {tab=1, slot=5, maxRank=5}, -- Concussion - [12908] = {tab=1, slot=6, maxRank=3}, -- Call of Flame - [12911] = {tab=1, slot=7, maxRank=3}, -- Elemental Warding - [12914] = {tab=1, slot=8, maxRank=3}, -- Elemental Devastation - [12917] = {tab=1, slot=9, maxRank=5}, -- Reverberation - [12922] = {tab=1, slot=10, maxRank=1}, -- Elemental Focus - [12923] = {tab=1, slot=11, maxRank=3}, -- Elemental Fury - [12928] = {tab=1, slot=12, maxRank=2}, -- Improved Fire Nova - [12930] = {tab=1, slot=13, maxRank=3}, -- Eye of the Storm - [12933] = {tab=1, slot=14, maxRank=2}, -- Elemental Reach - [12935] = {tab=1, slot=15, maxRank=1}, -- Call of Thunder - [12936] = {tab=1, slot=16, maxRank=3}, -- Unrelenting Storm - [12939] = {tab=1, slot=17, maxRank=3}, -- Elemental Precision - [12942] = {tab=1, slot=18, maxRank=5}, -- Lightning Mastery - [12947] = {tab=1, slot=19, maxRank=1}, -- Elemental Mastery - [12948] = {tab=1, slot=20, maxRank=3}, -- Storm, Earth and Fire - [12951] = {tab=1, slot=21, maxRank=2}, -- Booming Echoes - [12953] = {tab=1, slot=22, maxRank=2}, -- Elemental Oath - [12955] = {tab=1, slot=23, maxRank=3}, -- Lightning Overload - [12958] = {tab=1, slot=24, maxRank=3}, -- Astral Shift - [12961] = {tab=1, slot=25, maxRank=1}, -- Totem of Wrath - [12962] = {tab=1, slot=26, maxRank=3}, -- Lava Flows - [12965] = {tab=1, slot=27, maxRank=3}, -- Shamanism - [12968] = {tab=1, slot=28, maxRank=1}, -- Thunderstorm - [566] = {tab=2, slot=0, maxRank=3}, -- Improved Healing Wave - [12969] = {tab=2, slot=1, maxRank=5}, -- Improved Healing Wave - [575] = {tab=2, slot=2, maxRank=5}, -- Totemic Focus - [12974] = {tab=2, slot=3, maxRank=5}, -- Totemic Focus - [12979] = {tab=2, slot=4, maxRank=2}, -- Improved Reincarnation - [12981] = {tab=2, slot=5, maxRank=3}, -- Healing Grace - [12984] = {tab=2, slot=6, maxRank=5}, -- Tidal Focus - [12989] = {tab=2, slot=7, maxRank=3}, -- Improved Water Shield - [12992] = {tab=2, slot=8, maxRank=3}, -- Healing Focus - [12995] = {tab=2, slot=9, maxRank=1}, -- Tidal Force - [12996] = {tab=2, slot=10, maxRank=3}, -- Ancestral Healing - [12999] = {tab=2, slot=11, maxRank=3}, -- Restorative Totems - [13002] = {tab=2, slot=12, maxRank=5}, -- Tidal Mastery - [13007] = {tab=2, slot=13, maxRank=3}, -- Healing Way - [13010] = {tab=2, slot=14, maxRank=1}, -- Nature's Swiftness - [13011] = {tab=2, slot=15, maxRank=3}, -- Focused Mind - [13014] = {tab=2, slot=16, maxRank=3}, -- Purification - [13019] = {tab=2, slot=17, maxRank=5}, -- Nature's Guardian - [13024] = {tab=2, slot=18, maxRank=1}, -- Mana Tide Totem - [13025] = {tab=2, slot=19, maxRank=1}, -- Cleanse Spirit - [13026] = {tab=2, slot=20, maxRank=2}, -- Blessing of the Eternals - [13028] = {tab=2, slot=21, maxRank=2}, -- Improved Chain Heal - [13030] = {tab=2, slot=22, maxRank=2}, -- Nature's Blessing - [13033] = {tab=2, slot=23, maxRank=3}, -- Ancestral Awakening - [13036] = {tab=2, slot=24, maxRank=1}, -- Earth Shield - [13037] = {tab=2, slot=25, maxRank=2}, -- Improved Earth Shield - [13039] = {tab=2, slot=26, maxRank=3}, -- Tidal Waves - [13044] = {tab=2, slot=27, maxRank=1}, -- Riptide - [581] = {tab=3, slot=0, maxRank=3}, -- Enhancing Totems - [13045] = {tab=3, slot=1, maxRank=3}, -- Enhancing Totems - [1062] = {tab=3, slot=2, maxRank=2}, -- Earth's Grasp - [13048] = {tab=3, slot=3, maxRank=2}, -- Earth's Grasp - [584] = {tab=3, slot=4, maxRank=3}, -- Ancestral Knowledge - [13050] = {tab=3, slot=5, maxRank=5}, -- Ancestral Knowledge - [13400] = {tab=3, slot=6, maxRank=3}, -- Totemic Bond - [13055] = {tab=3, slot=7, maxRank=2}, -- Guardian Totems - [13057] = {tab=3, slot=8, maxRank=5}, -- Thundering Strikes - [13062] = {tab=3, slot=9, maxRank=2}, -- Improved Ghost Wolf - [13064] = {tab=3, slot=10, maxRank=3}, -- Improved Shields - [13067] = {tab=3, slot=11, maxRank=3}, -- Elemental Weapons - [13070] = {tab=3, slot=13, maxRank=1}, -- Shamanistic Focus - [13071] = {tab=3, slot=14, maxRank=3}, -- Anticipation - [13074] = {tab=3, slot=15, maxRank=3}, -- Flurry - [13079] = {tab=3, slot=16, maxRank=5}, -- Toughness - [13084] = {tab=3, slot=17, maxRank=2}, -- Improved Windfury Totem - [13086] = {tab=3, slot=18, maxRank=1}, -- Spirit Weapons - [13087] = {tab=3, slot=19, maxRank=3}, -- Mental Dexterity - [13401] = {tab=3, slot=20, maxRank=3}, -- Earthen Attunement - [13090] = {tab=3, slot=21, maxRank=3}, -- Unleashed Rage - [13093] = {tab=3, slot=22, maxRank=3}, -- Weapon Mastery - [13096] = {tab=3, slot=23, maxRank=2}, -- Frozen Power - [13098] = {tab=3, slot=24, maxRank=3}, -- Dual Wield Specialization - [13102] = {tab=3, slot=26, maxRank=1}, -- Stormstrike - [13399] = {tab=3, slot=27, maxRank=3}, -- Shield Specialization - [13103] = {tab=3, slot=28, maxRank=3}, -- Static Shock - [13701] = {tab=3, slot=29, maxRank=3}, -- Spirit Guard - [13107] = {tab=3, slot=30, maxRank=2}, -- Improved Stormstrike - [13109] = {tab=3, slot=31, maxRank=3}, -- Mental Quickness - [13112] = {tab=3, slot=32, maxRank=1}, -- Shamanistic Rage - [13113] = {tab=3, slot=33, maxRank=2}, -- Earthen Power - [13115] = {tab=3, slot=34, maxRank=3}, -- Maelstrom Weapon - [13120] = {tab=3, slot=35, maxRank=1}, -- Feral Spirit - }, - - WARLOCK = { - [640] = {tab=1, slot=0, maxRank=5}, -- Improved Shadow Bolt - [13354] = {tab=1, slot=1, maxRank=5}, -- Improved Shadow Bolt - [639] = {tab=1, slot=2, maxRank=3}, -- Bane - [13359] = {tab=1, slot=3, maxRank=5}, -- Bane - [13364] = {tab=1, slot=4, maxRank=2}, -- Aftermath - [13366] = {tab=1, slot=5, maxRank=3}, -- Molten Skin - [13369] = {tab=1, slot=6, maxRank=3}, -- Cataclysm - [13372] = {tab=1, slot=7, maxRank=2}, -- Demonic Power - [13374] = {tab=1, slot=8, maxRank=1}, -- Shadowburn - [13375] = {tab=1, slot=9, maxRank=5}, -- Ruin - [13380] = {tab=1, slot=10, maxRank=2}, -- Intensity - [13382] = {tab=1, slot=11, maxRank=2}, -- Destructive Reach - [13384] = {tab=1, slot=12, maxRank=3}, -- Improved Searing Pain - [13387] = {tab=1, slot=13, maxRank=3}, -- Backlash - [13390] = {tab=1, slot=14, maxRank=3}, -- Improved Immolate - [13393] = {tab=1, slot=15, maxRank=1}, -- Devastation - [13394] = {tab=1, slot=16, maxRank=3}, -- Nether Protection - [13397] = {tab=1, slot=17, maxRank=5}, -- Emberstorm - [13402] = {tab=1, slot=18, maxRank=1}, -- Conflagrate - [13403] = {tab=1, slot=19, maxRank=3}, -- Soul Leech - [13406] = {tab=1, slot=20, maxRank=3}, -- Pyroclasm - [13409] = {tab=1, slot=21, maxRank=3}, -- Shadow and Flame - [13414] = {tab=1, slot=22, maxRank=2}, -- Improved Soul Leech - [13416] = {tab=1, slot=23, maxRank=3}, -- Backdraft - [13419] = {tab=1, slot=24, maxRank=1}, -- Shadowfury - [13420] = {tab=1, slot=25, maxRank=3}, -- Empowered Imp - [13423] = {tab=1, slot=26, maxRank=3}, -- Fire and Brimstone - [13428] = {tab=1, slot=27, maxRank=1}, -- Chaos Bolt - [691] = {tab=2, slot=0, maxRank=3}, -- Improved Curse of Agony - [13429] = {tab=2, slot=1, maxRank=2}, -- Improved Curse of Agony - [657] = {tab=2, slot=2, maxRank=3}, -- Death's Grasp - [13431] = {tab=2, slot=3, maxRank=3}, -- Suppression - [655] = {tab=2, slot=4, maxRank=3}, -- Improved Corruption - [13434] = {tab=2, slot=5, maxRank=5}, -- Improved Corruption - [13439] = {tab=2, slot=6, maxRank=2}, -- Improved Curse of Weakness - [13441] = {tab=2, slot=7, maxRank=2}, -- Improved Drain Soul - [13443] = {tab=2, slot=8, maxRank=2}, -- Improved Life Tap - [13445] = {tab=2, slot=9, maxRank=2}, -- Soul Siphon - [13447] = {tab=2, slot=10, maxRank=2}, -- Improved Fear - [13449] = {tab=2, slot=11, maxRank=3}, -- Fel Concentration - [13452] = {tab=2, slot=12, maxRank=1}, -- Amplify Curse - [13453] = {tab=2, slot=13, maxRank=2}, -- Grim Reach - [13455] = {tab=2, slot=14, maxRank=2}, -- Nightfall - [13457] = {tab=2, slot=15, maxRank=3}, -- Empowered Corruption - [13460] = {tab=2, slot=16, maxRank=5}, -- Shadow Embrace - [13465] = {tab=2, slot=17, maxRank=1}, -- Siphon Life - [13466] = {tab=2, slot=18, maxRank=1}, -- Curse of Exhaustion - [13467] = {tab=2, slot=19, maxRank=2}, -- Improved Felhunter - [13469] = {tab=2, slot=20, maxRank=5}, -- Shadow Mastery - [13474] = {tab=2, slot=21, maxRank=3}, -- Eradication - [13477] = {tab=2, slot=22, maxRank=3}, -- Contagion - [13482] = {tab=2, slot=23, maxRank=1}, -- Dark Pact - [13483] = {tab=2, slot=24, maxRank=2}, -- Improved Howl of Terror - [13485] = {tab=2, slot=25, maxRank=3}, -- Malediction - [13488] = {tab=2, slot=26, maxRank=3}, -- Death's Embrace - [13491] = {tab=2, slot=27, maxRank=1}, -- Unstable Affliction - [13492] = {tab=2, slot=28, maxRank=1}, -- Pandemic - [13493] = {tab=2, slot=29, maxRank=3}, -- Everlasting Affliction - [13498] = {tab=2, slot=30, maxRank=1}, -- Haunt - [675] = {tab=3, slot=0, maxRank=2}, -- Improved Healthstone - [13499] = {tab=3, slot=1, maxRank=2}, -- Improved Healthstone - [676] = {tab=3, slot=2, maxRank=3}, -- Improved Imp - [13501] = {tab=3, slot=3, maxRank=3}, -- Improved Imp - [677] = {tab=3, slot=4, maxRank=3}, -- Demonic Embrace - [13504] = {tab=3, slot=5, maxRank=3}, -- Demonic Embrace - [981] = {tab=3, slot=6, maxRank=2}, -- Fel Synergy - [13507] = {tab=3, slot=8, maxRank=2}, -- Fel Synergy - [13509] = {tab=3, slot=10, maxRank=2}, -- Improved Health Funnel - [13511] = {tab=3, slot=11, maxRank=3}, -- Demonic Brutality - [13514] = {tab=3, slot=12, maxRank=3}, -- Fel Vitality - [13517] = {tab=3, slot=13, maxRank=3}, -- Improved Succubus - [13520] = {tab=3, slot=14, maxRank=1}, -- Soul Link - [13521] = {tab=3, slot=15, maxRank=1}, -- Fel Domination - [13522] = {tab=3, slot=16, maxRank=3}, -- Demonic Aegis - [13525] = {tab=3, slot=17, maxRank=5}, -- Unholy Power - [13530] = {tab=3, slot=18, maxRank=2}, -- Master Summoner - [13532] = {tab=3, slot=19, maxRank=1}, -- Mana Feed - [13533] = {tab=3, slot=20, maxRank=2}, -- Master Conjuror - [13535] = {tab=3, slot=21, maxRank=5}, -- Master Demonologist - [13540] = {tab=3, slot=22, maxRank=3}, -- Molten Core - [13543] = {tab=3, slot=23, maxRank=3}, -- Demonic Resilience - [13546] = {tab=3, slot=24, maxRank=1}, -- Demonic Empowerment - [13547] = {tab=3, slot=25, maxRank=3}, -- Demonic Knowledge - [13550] = {tab=3, slot=26, maxRank=3}, -- Demonic Tactics - [13555] = {tab=3, slot=27, maxRank=2}, -- Decimation - [13557] = {tab=3, slot=28, maxRank=3}, -- Improved Demonic Tactics - [13560] = {tab=3, slot=29, maxRank=1}, -- Summon Felguard - [13561] = {tab=3, slot=30, maxRank=3}, -- Nemesis - [13564] = {tab=3, slot=31, maxRank=3}, -- Demonic Pact - [13569] = {tab=3, slot=32, maxRank=1}, -- Metamorphosis - }, - - WARRIOR = { - [438] = {tab=1, slot=0, maxRank=3}, -- Improved Heroic Strike - [12228] = {tab=1, slot=1, maxRank=3}, -- Improved Heroic Strike - [444] = {tab=1, slot=2, maxRank=3}, -- Deflection - [12231] = {tab=1, slot=3, maxRank=5}, -- Deflection - [441] = {tab=1, slot=4, maxRank=2}, -- Improved Rend - [12236] = {tab=1, slot=5, maxRank=2}, -- Improved Rend - [12238] = {tab=1, slot=6, maxRank=2}, -- Improved Charge - [12240] = {tab=1, slot=7, maxRank=3}, -- Iron Will - [12243] = {tab=1, slot=8, maxRank=3}, -- Tactical Mastery - [12246] = {tab=1, slot=9, maxRank=2}, -- Improved Overpower - [12248] = {tab=1, slot=10, maxRank=1}, -- Anger Management - [12249] = {tab=1, slot=11, maxRank=2}, -- Impale - [12251] = {tab=1, slot=12, maxRank=3}, -- Deep Wounds - [12254] = {tab=1, slot=13, maxRank=3}, -- Two-Handed Weapon Specialization - [12257] = {tab=1, slot=14, maxRank=3}, -- Taste for Blood - [12260] = {tab=1, slot=15, maxRank=5}, -- Poleaxe Specialization - [12265] = {tab=1, slot=16, maxRank=1}, -- Sweeping Strikes - [12266] = {tab=1, slot=17, maxRank=5}, -- Mace Specialization - [12271] = {tab=1, slot=18, maxRank=5}, -- Sword Specialization - [12276] = {tab=1, slot=19, maxRank=2}, -- Weapon Mastery - [12278] = {tab=1, slot=20, maxRank=3}, -- Improved Hamstring - [12281] = {tab=1, slot=21, maxRank=2}, -- Trauma - [12283] = {tab=1, slot=22, maxRank=2}, -- Second Wind - [12285] = {tab=1, slot=23, maxRank=1}, -- Mortal Strike - [12286] = {tab=1, slot=24, maxRank=2}, -- Strength of Arms - [12288] = {tab=1, slot=25, maxRank=2}, -- Improved Slam - [12290] = {tab=1, slot=26, maxRank=1}, -- Juggernaut - [12291] = {tab=1, slot=27, maxRank=2}, -- Improved Mortal Strike - [12294] = {tab=1, slot=28, maxRank=2}, -- Unrelenting Assault - [12296] = {tab=1, slot=29, maxRank=3}, -- Sudden Death - [12299] = {tab=1, slot=30, maxRank=1}, -- Endless Rage - [12300] = {tab=1, slot=31, maxRank=2}, -- Blood Frenzy - [12302] = {tab=1, slot=32, maxRank=3}, -- Wrecking Crew - [12307] = {tab=1, slot=33, maxRank=1}, -- Bladestorm - [455] = {tab=2, slot=0, maxRank=2}, -- Improved Bloodrage - [12308] = {tab=2, slot=1, maxRank=2}, -- Improved Bloodrage - [766] = {tab=2, slot=2, maxRank=3}, -- Shield Specialization - [12310] = {tab=2, slot=3, maxRank=5}, -- Shield Specialization - [454] = {tab=2, slot=4, maxRank=3}, -- Improved Thunder Clap - [12315] = {tab=2, slot=5, maxRank=3}, -- Improved Thunder Clap - [12318] = {tab=2, slot=6, maxRank=3}, -- Incite - [12321] = {tab=2, slot=7, maxRank=5}, -- Anticipation - [12326] = {tab=2, slot=8, maxRank=1}, -- Last Stand - [12327] = {tab=2, slot=9, maxRank=2}, -- Improved Revenge - [12329] = {tab=2, slot=10, maxRank=2}, -- Shield Mastery - [12331] = {tab=2, slot=11, maxRank=3}, -- Toughness - [12336] = {tab=2, slot=12, maxRank=2}, -- Improved Spell Reflection - [12338] = {tab=2, slot=13, maxRank=2}, -- Improved Disarm - [12340] = {tab=2, slot=14, maxRank=3}, -- Puncture - [12343] = {tab=2, slot=15, maxRank=2}, -- Improved Disciplines - [12345] = {tab=2, slot=16, maxRank=1}, -- Concussion Blow - [12346] = {tab=2, slot=17, maxRank=2}, -- Gag Order - [12348] = {tab=2, slot=18, maxRank=5}, -- One-Handed Weapon Specialization - [12353] = {tab=2, slot=19, maxRank=2}, -- Improved Defensive Stance - [12355] = {tab=2, slot=20, maxRank=1}, -- Vigilance - [12356] = {tab=2, slot=21, maxRank=3}, -- Focused Rage - [12359] = {tab=2, slot=22, maxRank=3}, -- Vitality - [12362] = {tab=2, slot=23, maxRank=2}, -- Safeguard - [12364] = {tab=2, slot=24, maxRank=1}, -- Warbringer - [12366] = {tab=2, slot=25, maxRank=3}, -- Critical Block - [12369] = {tab=2, slot=26, maxRank=3}, -- Sword and Board - [12372] = {tab=2, slot=27, maxRank=2}, -- Damage Shield - [12374] = {tab=2, slot=28, maxRank=1}, -- Shockwave - [12375] = {tab=3, slot=0, maxRank=3}, -- Armored to the Teeth - [1123] = {tab=3, slot=1, maxRank=3}, -- Armored to the Teeth - [469] = {tab=3, slot=2, maxRank=2}, -- Booming Voice - [12378] = {tab=3, slot=3, maxRank=2}, -- Booming Voice - [468] = {tab=3, slot=4, maxRank=5}, -- Cruelty - [28968] = {tab=3, slot=5, maxRank=5}, -- Dual Wield Mastery - [12380] = {tab=3, slot=6, maxRank=5}, -- Cruelty - [12385] = {tab=3, slot=7, maxRank=5}, -- Improved Demoralizing Shout - [12390] = {tab=3, slot=8, maxRank=5}, -- Unbridled Wrath - [12395] = {tab=3, slot=9, maxRank=3}, -- Improved Cleave - [12398] = {tab=3, slot=10, maxRank=1}, -- Piercing Howl - [12399] = {tab=3, slot=11, maxRank=3}, -- Blood Craze - [12402] = {tab=3, slot=12, maxRank=5}, -- Commanding Presence - [12407] = {tab=3, slot=13, maxRank=5}, -- Dual Wield Specialization - [12412] = {tab=3, slot=14, maxRank=2}, -- Improved Execute - [12414] = {tab=3, slot=15, maxRank=5}, -- Enrage - [12419] = {tab=3, slot=16, maxRank=3}, -- Precision - [12422] = {tab=3, slot=17, maxRank=1}, -- Death Wish - [12423] = {tab=3, slot=18, maxRank=2}, -- Improved Intercept - [12425] = {tab=3, slot=19, maxRank=2}, -- Improved Berserker Rage - [12427] = {tab=3, slot=20, maxRank=3}, -- Flurry - [12432] = {tab=3, slot=21, maxRank=3}, -- Intensify Rage - [12435] = {tab=3, slot=22, maxRank=1}, -- Bloodthirst - [12436] = {tab=3, slot=23, maxRank=2}, -- Improved Whirlwind - [12438] = {tab=3, slot=24, maxRank=2}, -- Furious Attacks - [12440] = {tab=3, slot=25, maxRank=5}, -- Improved Berserker Stance - [12445] = {tab=3, slot=26, maxRank=1}, -- Heroic Fury - [12446] = {tab=3, slot=27, maxRank=1}, -- Rampage - [12447] = {tab=3, slot=28, maxRank=3}, -- Bloodsurge - [12450] = {tab=3, slot=29, maxRank=3}, -- Unending Fury - [12455] = {tab=3, slot=30, maxRank=1}, -- Titan's Grip - }, - -} - - - -local BASE36_CHARS = "0123456789abcdefghijklmnopqrstuvwxyz" - -local function encodeRank(rank) - if rank < 10 then - return tostring(rank) - end - if rank <= 35 then - return BASE36_CHARS:sub(rank + 1, rank + 1) - end - return "0" -end - -local function toBase36(num) - if num == 0 then return "0" end - local result = "" - while num > 0 do - local remainder = num % 36 - result = BASE36_CHARS:sub(remainder + 1, remainder + 1) .. result - num = math.floor(num / 36) - end - return result -end - --- Convert list of Ascension talent IDs to calculator format --- Returns: "class.tree1.tree2.tree3" format -function AE.ConvertAscensionTalentsToCalcFormat(ascensionTalentIds, class) - class = (class or ""):upper() - - -- Get the talent map for this class - local talentMap = CLASS_TALENT_MAPS[class] - if not talentMap then - return nil, "Class " .. class .. " not supported" - end - - -- Build talent data by tree - local trees = {{}, {}, {}} -- 3 trees - - for _, ascId in ipairs(ascensionTalentIds) do - local mapping = talentMap[ascId] - if mapping then - local tab = mapping.tab - local slot = mapping.slot - local maxRank = mapping.maxRank - - -- Store talent in the appropriate tree - table.insert(trees[tab], { - slot = slot, - rank = maxRank -- Assume max rank (we don't have rank info from GetKnownTalentEntries) - }) - end - end - - -- Sort each tree by slot - for _, tree in ipairs(trees) do - table.sort(tree, function(a, b) return a.slot < b.slot end) - end - - -- Encode each tree to base36 format - local treeParts = {} - for _, tree in ipairs(trees) do - local pairs = {} - for _, talent in ipairs(tree) do - local idxStr = toBase36(talent.slot) - local rankStr = encodeRank(talent.rank) - table.insert(pairs, idxStr .. rankStr) - end - table.insert(treeParts, table.concat(pairs, "_")) - end - - -- Build final format: class.tree0.tree1.tree2 - return class:lower() .. "." .. table.concat(treeParts, ".") -end - --- Mark module as loaded -AE._loadedAscensionTalentMapper = true diff --git a/AscensionExporter/Util/TalentEncoder.lua b/AscensionExporter/Util/TalentEncoder.lua deleted file mode 100644 index 3883636..0000000 --- a/AscensionExporter/Util/TalentEncoder.lua +++ /dev/null @@ -1,93 +0,0 @@ --- AscensionExporter - Talent URL Encoder --- Encodes talents into URL format for https://exil.es/en/wow/talent-calc?build=... - -AscensionExporter = _G.AscensionExporter or {} -_G.AscensionExporter = AscensionExporter -local AE = AscensionExporter - -local BASE36_CHARS = "0123456789abcdefghijklmnopqrstuvwxyz" - -local function encodeRank(rank) - if rank < 10 then - return tostring(rank) - end - -- For ranks >= 10, use base36 (a=10, b=11, etc) - if rank <= 35 then - return BASE36_CHARS:sub(rank + 1, rank + 1) - end - return "0" -end - -local function toBase36(num) - if num == 0 then return "0" end - local result = "" - while num > 0 do - local remainder = num % 36 - result = BASE36_CHARS:sub(remainder + 1, remainder + 1) .. result - num = math.floor(num / 36) - end - return result -end - --- Encode talents to URL format --- Format: `${class}.${tree0}.${tree1}.${tree2}` --- Each tree is encoded as "index_rank" pairs separated by underscores --- Example: "0_3_b_5" means slot 0 has rank 3, slot 11 (b in base36) has rank 5 -function AE.EncodeTalentsToURL(talentsData, className) - if not talentsData or not className then - return nil - end - - -- Normalize class name to lowercase - className = className:lower() - - -- Build a structure: 3 talent trees with slots - -- Each WoW class has 3 talent trees - local trees = {{}, {}, {}} - - -- Group talents by their tabIndex (1-based in Lua, but we want 0-based for array) - for _, t in ipairs(talentsData.selected or {}) do - local tabIndex = t.tabIndex or 1 - local talentIndex = (t.talentIndex or 1) - 1 -- Convert to 0-based index - local rank = t.rank or 0 - - if rank > 0 and tabIndex >= 1 and tabIndex <= 3 then - table.insert(trees[tabIndex], { - index = talentIndex, - rank = rank - }) - end - end - - -- Sort each tree by index for consistent encoding - for _, tree in ipairs(trees) do - table.sort(tree, function(a, b) return a.index < b.index end) - end - - -- Encode each tree - local treeParts = {} - for _, tree in ipairs(trees) do - local pairs = {} - for _, talent in ipairs(tree) do - local idxStr = toBase36(talent.index) - local rankStr = encodeRank(talent.rank) - table.insert(pairs, idxStr .. rankStr) - end - table.insert(treeParts, table.concat(pairs, "_")) - end - - -- Build final URL format: class.tree0.tree1.tree2 - return className .. "." .. table.concat(treeParts, ".") -end - --- Generate full talent calc URL -function AE.GenerateTalentCalcURL(talentsData, className) - local build = AE.EncodeTalentsToURL(talentsData, className) - if not build then - return nil - end - return "https://exil.es/en/wow/talent-calc?build=" .. build -end - --- Mark module as loaded -AE._loadedTalentEncoder = true