diff --git a/spec/System/TestAilments_spec.lua b/spec/System/TestAilments_spec.lua index 33fc61adaa..0940ac095b 100644 --- a/spec/System/TestAilments_spec.lua +++ b/spec/System/TestAilments_spec.lua @@ -9,7 +9,7 @@ describe("TestAilments", function() it("maximum shock value", function() -- Shock Nova - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 1\n") runCallback("OnFrame") assert.are.equals(round(50 + 10), build.calcsTab.mainOutput.MaximumShock) @@ -23,7 +23,7 @@ describe("TestAilments", function() it("bleed is buffed by bleed chance", function() build.itemsTab:CreateDisplayItemFromRaw("New Item\nKarui Chopper") build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 1\n") build.configTab.input.customMods = "\z attacks have 10% chance to cause bleeding\n\z " diff --git a/spec/System/TestDefence_spec.lua b/spec/System/TestDefence_spec.lua index 8a0d4daa3f..4cbca313db 100644 --- a/spec/System/TestDefence_spec.lua +++ b/spec/System/TestDefence_spec.lua @@ -132,8 +132,8 @@ describe("TestDefence", function() build.configTab.input.enemyIsBoss = "None" -- Petrified blood build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z - Arrogance 21/0 Default 1\n\z + Petrified Blood 20/0 1\n\z + Arrogance 21/0 1\n\z ") -- 50% petrified effect, when exactly half of the life is reserved, should make the life pool be equivalent to no petrified effect and full life. build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -155,8 +155,8 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z - Arrogance 21/0 Default 1\n\z + Petrified Blood 20/0 1\n\z + Arrogance 21/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -180,7 +180,7 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") -- 80% petrified effect, starting from full life, should make the life pool be equivalent to 0.5 * life (unprotected upper half) and then 5 * 0.5 * life (protected lower half), making it 3* bigger in total build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -238,8 +238,8 @@ describe("TestDefence", function() -- Progenesis + petrified blood build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z - Arrogance 21/0 Default 1\n\z + Petrified Blood 20/0 1\n\z + Arrogance 21/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -263,7 +263,7 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -286,7 +286,7 @@ describe("TestDefence", function() build.skillsTab.socketGroupList = {} build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z @@ -315,7 +315,7 @@ describe("TestDefence", function() assert.are.equals(20, poolsRemaining.LifeBelowHalfLossLostOverTime) build.skillsTab:PasteSocketGroup("\z - Petrified Blood 20/0 Default 1\n\z + Petrified Blood 20/0 1\n\z ") build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) build.configTab.input.customMods = "\z diff --git a/spec/System/TestImpale_spec.lua b/spec/System/TestImpale_spec.lua index 95c4a4f33d..84b2db0018 100644 --- a/spec/System/TestImpale_spec.lua +++ b/spec/System/TestImpale_spec.lua @@ -286,7 +286,7 @@ describe("TestAttacks", function() it("impale dual wield simultaneous attack", function() newBuild() - build.skillsTab:PasteSocketGroup("Cleave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cleave 20/0 1\n") -- exactly 100 build.itemsTab:CreateDisplayItemFromRaw("New Item\nVaal Blade\nQuality: 0\nAdds 54 to 14 physical damage\n50% chance to Impale Enemies on Hit with Attacks") build.itemsTab:AddDisplayItem() diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua new file mode 100644 index 0000000000..24663900d5 --- /dev/null +++ b/spec/System/TestImportReimport_spec.lua @@ -0,0 +1,226 @@ +describe("TestImportReimport", function() + local dkjson = require "dkjson" + local DEFAULT_CHARACTER_LEVEL = 12 + local DEFAULT_ITEM_LEVEL = 10 + local TEST_IMPORT_ITEM_ID = "test-import-item-1" + local DEFAULT_SOCKET_COLOR = "R" + + before_each(function() + newBuild() + end) + + local function makeGemProperties(level) + return { + { name = "Level", values = { { tostring(level), 0 } } }, + { name = "Quality", values = { { "+0%", 0 } } }, + } + end + + local function makeSocketedGemEntry(socket, support, typeLine, level) + return { + socket = socket, + support = support, + typeLine = typeLine, + properties = makeGemProperties(level), + } + end + + -- Build a minimal import item so the tests stay focused on state, not fixture noise. + local function makeImportItem(itemTypeLine, inventoryId, socketedItems, itemId) + local maxSocketIndex = 0 + for _, socketedItem in ipairs(socketedItems) do + maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) + end + local sockets = {} + for index = 1, maxSocketIndex do + sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } + end + return { + id = itemId or TEST_IMPORT_ITEM_ID, + frameType = 0, + name = "", + typeLine = itemTypeLine, + inventoryId = inventoryId, + ilvl = DEFAULT_ITEM_LEVEL, + properties = {}, + sockets = sockets, + socketedItems = socketedItems, + } + end + + -- Build a minimal import payload so the tests stay focused on state, not fixture noise. + local function buildImportPayload(items) + return dkjson.encode({ + character = { level = DEFAULT_CHARACTER_LEVEL }, + items = items, + }) + end + + local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = clearItems + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem(itemTypeLine, inventoryId, socketedItems), + })) + runCallback("OnFrame") + end + + local function reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) + reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, { + makeSocketedGemEntry(0, false, gemName, 20), + }, clearItems) + end + + local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, false) + end + + local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) + build.skillsTab:PasteSocketGroup(string.format([[ +Slot: %s +%s 20/0 1 +]], slotName, gemName)) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + local srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + srcInstance[fieldName] = fieldValue + srcInstance[fieldName.."Calcs"] = fieldValue + build.modFlag = true + build.buildFlag = true + runCallback("OnFrame") + + reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + + socketGroup = build.skillsTab.socketGroupList[1] + srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + assert.are.equal(fieldValue, srcInstance[fieldName]) + assert.are.equal(fieldValue, srcInstance[fieldName.."Calcs"]) + end + + it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }), + })) + runCallback("OnFrame") + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + + it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + reimportSocketedItemsWithOptions("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, true) + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + + it("preserves two socket groups when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + build.skillsTab:PasteSocketGroup([[ +Slot: Gloves +Blight 20/0 1 +]]) + runCallback("OnFrame") + + local helmetGroup = build.skillsTab.socketGroupList[1] + helmetGroup.includeInFullDPS = true + helmetGroup.mainActiveSkill = 2 + local glovesGroup = build.skillsTab.socketGroupList[2] + glovesGroup.enabled = false + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, "test-import-item-helmet"), + makeImportItem("Rawhide Gloves", "Gloves", { + makeSocketedGemEntry(0, false, "Blight", 20), + }, "test-import-item-gloves"), + })) + runCallback("OnFrame") + + local groupsBySlot = {} + for _, socketGroup in ipairs(build.skillsTab.socketGroupList) do + groupsBySlot[socketGroup.slot] = socketGroup + end + + assert.are.equal(2, #build.skillsTab.socketGroupList) + assert.is_not_nil(groupsBySlot.Helmet) + assert.is_not_nil(groupsBySlot.Gloves) + assert.is_true(groupsBySlot.Helmet.includeInFullDPS) + assert.are.equal(2, groupsBySlot.Helmet.mainActiveSkill) + assert.is_false(groupsBySlot.Gloves.enabled) + end) + + it("preserves skill part selection when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) + end) + + it("preserves stage count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Weapon 1", "Driftwood Wand", "Weapon", "Scorching Ray", "skillStageCount", 8) + end) + + it("preserves mine count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) + end) + + it("preserves minion skill when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Summon Chaos Golem", "skillMinionSkill", 3) + end) +end) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index b7a24e7b49..3c185d98ac 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -8,7 +8,7 @@ describe("TetsItemMods", function() end) it("Dialla's socket mods", function() - build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 Default 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 1\nArc 20/0 1\n") runCallback("OnFrame") build.itemsTab:CreateDisplayItemFromRaw([[Dialla's Malefaction @@ -61,7 +61,7 @@ describe("TetsItemMods", function() local lightningResBefore = build.calcsTab.mainOutput.LightningResist - build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 1\n") runCallback("OnFrame") assert.are_not.equals(lightningResBefore, build.calcsTab.mainOutput.LightningResist) @@ -96,7 +96,7 @@ describe("TetsItemMods", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") runCallback("OnFrame") assert.is_true(build.calcsTab.mainEnv.keystonesAdded["Vaal Pact"]) @@ -124,7 +124,7 @@ describe("TetsItemMods", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nNightblade 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\nNightblade 20/0 1\n") runCallback("OnFrame") local nonElusiveCritMult = build.calcsTab.mainOutput.CritMultiplier @@ -160,7 +160,7 @@ describe("TetsItemMods", function() build.configTab:BuildModList() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cyclone 20/0 Default 1\nClose Combat 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cyclone 20/0 1\nClose Combat 20/0 1\n") runCallback("OnFrame") local farDPS = build.calcsTab.mainOutput.TotalDPS @@ -200,7 +200,7 @@ describe("TetsItemMods", function() it("Kalandra's Touch influence copy", function() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") runCallback("OnFrame") local dmg = build.calcsTab.mainOutput.AverageDamage @@ -527,7 +527,7 @@ describe("TetsItemMods", function() {range:1}(15-20)% increased Cold Damage per 1% Missing Cold Resistance, up to a maximum of 300% {range:1}(15-20)% increased Fire Damage per 1% Missing Fire Resistance, up to a maximum of 300%]]) build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") runCallback("OnFrame") assert.are_not.equals(340, build.calcsTab.mainEnv.modDB:Sum("INC", "FireDamage")) @@ -547,7 +547,7 @@ describe("TetsItemMods", function() Armour: 32 ]]) build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1") + build.skillsTab:PasteSocketGroup("Arc 20/0 1") assert.are_not.equals(40, build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Cast }, "Speed")) assert.are_not.equals(64, build.calcsTab.mainOutput.Armour) @@ -555,7 +555,7 @@ describe("TetsItemMods", function() end) it("Heralds apply exposure with Heraldry", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nHerald of Thunder 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nHerald of Thunder 20/0 1\n") runCallback("OnFrame") assert.are.equals(0.5, build.calcsTab.calcsOutput.LightningEffMult) @@ -572,7 +572,7 @@ describe("TetsItemMods", function() end) it("Enemy self curse effect", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nConductivity 14/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nConductivity 14/0 1\n") runCallback("OnFrame") assert.are.equals(0.8, build.calcsTab.calcsOutput.LightningEffMult) @@ -587,7 +587,7 @@ describe("TetsItemMods", function() end) it("Max charges with conditional mod", function() -- see #9442 - build.skillsTab:PasteSocketGroup("Grace 20/20 Default 1\n") + build.skillsTab:PasteSocketGroup("Grace 20/20 1\n") runCallback("OnFrame") local baseFrenzyChargesMax = build.calcsTab.calcsOutput.FrenzyChargesMax diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index 0e67ddc80d..9c846685df 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -13,11 +13,11 @@ describe("TestAttacks", function() runCallback("OnFrame") assert.are.equals(205, build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 1\n") runCallback("OnFrame") assert.are.equals(round(205 * 1.43), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 1\n") runCallback("OnFrame") -- No Envy level increase, so base should still be 205 assert.are.equals(round(205 * 1.44), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) @@ -43,10 +43,10 @@ describe("TestAttacks", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 Default 1\nRain of Arrows 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 1\nRain of Arrows 20/0 1\nManaforged Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) @@ -71,14 +71,14 @@ describe("TestAttacks", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Power Siphon 20/0 Default 1\nSacred Wisps 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Power Siphon 20/0 1\nSacred Wisps 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) end) it("Test Scorching ray applying exposure at max stages", function() - build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -101,7 +101,7 @@ describe("TestAttacks", function() end) it("Test Adrenaline affecting blight max stage count", function() - build.skillsTab:PasteSocketGroup("Blight 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Blight 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] diff --git a/spec/System/TestTriggers_spec.lua b/spec/System/TestTriggers_spec.lua index 3006513dad..3f21d2e94d 100644 --- a/spec/System/TestTriggers_spec.lua +++ b/spec/System/TestTriggers_spec.lua @@ -28,7 +28,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -56,7 +56,7 @@ describe("TestTriggers", function() build.mainSocketGroup = 2 build.modFlag = true build.buildFlag = true - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -84,7 +84,7 @@ describe("TestTriggers", function() build.mainSocketGroup = 2 build.modFlag = true build.buildFlag = true - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -197,7 +197,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -248,7 +248,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -294,7 +294,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -322,7 +322,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -348,7 +348,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -371,7 +371,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -398,7 +398,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -421,7 +421,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -449,7 +449,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -485,7 +485,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -507,7 +507,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -535,7 +535,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -557,7 +557,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -579,7 +579,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -600,10 +600,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -643,10 +643,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -687,10 +687,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -740,10 +740,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -766,10 +766,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Despair 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -820,10 +820,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -872,10 +872,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Ice Nova 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Ice Nova 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -909,10 +909,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -940,10 +940,10 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -971,7 +971,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -999,7 +999,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") runCallback("OnFrame") build.configTab.input["conditionKilledRecently"] = true @@ -1010,24 +1010,24 @@ describe("TestTriggers", function() end) it("Trigger Holy Relic", function() - build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.Minion.SkillTriggerRate ~= nil) end) it("Trigger Cast when Damage Taken", function() - build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 Default 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 1\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Cast when Stunned", function() - build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 Default 1\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 1\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1055,27 +1055,27 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nSpellslinger 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nSpellslinger 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Mark On Hit", function() - build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 Default 1\nAlchemist's Mark 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 1\nAlchemist's Mark 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Hextouch", function() - build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\nHextouch 20/0 Default 1\nSmite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Despair 20/0 1\nHextouch 20/0 1\nSmite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1103,7 +1103,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1132,7 +1132,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1161,7 +1161,7 @@ describe("TestTriggers", function() end) it("Trigger Combust", function() - build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1170,14 +1170,14 @@ describe("TestTriggers", function() build.buildFlag = true runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Prismatic Burst", function() - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nPrismatic Burst 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\nPrismatic Burst 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1211,7 +1211,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nShockwave 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\nShockwave 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1243,24 +1243,24 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\nManaforged Arrows 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Doom Blast", function() - build.skillsTab:PasteSocketGroup("Impending Doom 20/0 Default 1\nDespair 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Impending Doom 20/0 1\nDespair 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Cast while Channelling", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1285,14 +1285,14 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Trigger Flamewood", function() - build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 Default 1\nFlamewood 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 1\nFlamewood 20/0 1\n") runCallback("OnFrame") local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] @@ -1305,7 +1305,7 @@ describe("TestTriggers", function() end) it("Trigger Automation", function() - build.skillsTab:PasteSocketGroup("Steelskin 20/0 Default 1\nAutomation 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Steelskin 20/0 1\nAutomation 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1334,7 +1334,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1351,17 +1351,17 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") runCallback("OnFrame") assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) end) it("Triggerbots CWCHandler", function() - build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") runCallback("OnFrame") local baseRate = build.calcsTab.mainOutput.SkillTriggerRate assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) @@ -1396,7 +1396,7 @@ describe("TestTriggers", function() build.itemsTab:AddDisplayItem() runCallback("OnFrame") - build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") runCallback("OnFrame") local baseRate = build.calcsTab.mainOutput.SkillTriggerRate diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 9975a98ebc..fc02019fd5 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -729,6 +729,81 @@ function ImportTabClass:ImportPassiveTreeAndJewels(json, charData) main:SetWindowTitleSubtext(string.format("%s (%s, %s, %s)", self.build.buildName, charData.name, charData.class, charData.league)) end +local SOCKET_GROUP_REIMPORT_KEY_SEPARATOR = "\31" + +local function getSocketGroupReimportKey(socketGroup) + -- Use a rarely-used separator to avoid accidental collisions when concatenating fields. + local gemNameParts = { } + for _, gem in ipairs(socketGroup.gemList) do + t_insert(gemNameParts, (gem.nameSpec or ""):lower()) + end + return table.concat({ + socketGroup.slot or "", + socketGroup.source or "", + tostring(#socketGroup.gemList), + table.concat(gemNameParts, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR), + }, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR) +end + +local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) + local gemStates = { } + for gemIndex, gem in ipairs(socketGroup.gemList) do + gemStates[gemIndex] = { + enabled = gem.enabled, + skillPart = gem.skillPart, + skillPartCalcs = gem.skillPartCalcs, + skillStageCount = gem.skillStageCount, + skillStageCountCalcs = gem.skillStageCountCalcs, + skillMineCount = gem.skillMineCount, + skillMineCountCalcs = gem.skillMineCountCalcs, + skillMinionSkill = gem.skillMinionSkill, + skillMinionSkillCalcs = gem.skillMinionSkillCalcs, + enableGlobal1 = gem.enableGlobal1, + enableGlobal2 = gem.enableGlobal2, + } + end + return { + enabled = socketGroup.enabled, + includeInFullDPS = socketGroup.includeInFullDPS, + groupCount = socketGroup.groupCount, + label = socketGroup.label, + mainActiveSkill = socketGroup.mainActiveSkill, + mainActiveSkillCalcs = socketGroup.mainActiveSkillCalcs, + gemStates = gemStates, + isMainGroup = isMainGroup, + } +end + +local function applyGemReimportState(gem, state) + gem.enabled = state.enabled + gem.skillPart = state.skillPart + gem.skillPartCalcs = state.skillPartCalcs + gem.skillStageCount = state.skillStageCount + gem.skillStageCountCalcs = state.skillStageCountCalcs + gem.skillMineCount = state.skillMineCount + gem.skillMineCountCalcs = state.skillMineCountCalcs + gem.skillMinionSkill = state.skillMinionSkill + gem.skillMinionSkillCalcs = state.skillMinionSkillCalcs + gem.enableGlobal1 = state.enableGlobal1 + gem.enableGlobal2 = state.enableGlobal2 +end + +local function applySocketGroupReimportState(socketGroup, state) + socketGroup.enabled = state.enabled + socketGroup.includeInFullDPS = state.includeInFullDPS + socketGroup.groupCount = state.groupCount + socketGroup.label = state.label + socketGroup.mainActiveSkill = state.mainActiveSkill + socketGroup.mainActiveSkillCalcs = state.mainActiveSkillCalcs + if state.gemStates then + for gemIndex, gemState in ipairs(state.gemStates) do + if socketGroup.gemList[gemIndex] then + applyGemReimportState(socketGroup.gemList[gemIndex], gemState) + end + end + end +end + function ImportTabClass:ImportItemsAndSkills(json) --local out = io.open("get-items.json", "w") --out:write(json) @@ -748,8 +823,10 @@ function ImportTabClass:ImportItemsAndSkills(json) local mainSkillEmpty = #self.build.skillsTab.socketGroupList == 0 local skillOrder + local preservedSocketGroupStateByKey if self.controls.charImportItemsClearSkills.state then skillOrder = { } + preservedSocketGroupStateByKey = { } for _, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do for _, gem in ipairs(socketGroup.gemList) do if gem.grantedEffect and not gem.grantedEffect.support then @@ -757,6 +834,11 @@ function ImportTabClass:ImportItemsAndSkills(json) end end end + for index, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + local key = getSocketGroupReimportKey(socketGroup) + preservedSocketGroupStateByKey[key] = preservedSocketGroupStateByKey[key] or { } + t_insert(preservedSocketGroupStateByKey[key], snapshotSocketGroupReimportState(socketGroup, index == self.build.mainSocketGroup)) + end wipeTable(self.build.skillsTab.socketGroupList) self.build.skillsTab:RebuildImbuedSupportBySlot() end @@ -802,6 +884,22 @@ function ImportTabClass:ImportItemsAndSkills(json) end end) end + if preservedSocketGroupStateByKey then + local restoredMainSocketGroup + for index, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + local stateList = preservedSocketGroupStateByKey[getSocketGroupReimportKey(socketGroup)] + if stateList and stateList[1] then + local state = t_remove(stateList, 1) + applySocketGroupReimportState(socketGroup, state) + if state.isMainGroup then + restoredMainSocketGroup = index + end + end + end + if restoredMainSocketGroup then + self.build.mainSocketGroup = restoredMainSocketGroup + end + end if mainSkillEmpty then self.build.mainSocketGroup = self:GuessMainSocketGroup() end @@ -1235,4 +1333,4 @@ function ImportTabClass:SetPredefinedBuildName() local charData = charSelect.list[charSelect.selIndex].char local charName = charData.name main.predefinedBuildName = accountName.." - "..charName -end \ No newline at end of file +end diff --git a/src/Classes/SkillsTab.lua b/src/Classes/SkillsTab.lua index ea65069bc5..1a1dcbbd61 100644 --- a/src/Classes/SkillsTab.lua +++ b/src/Classes/SkillsTab.lua @@ -591,7 +591,7 @@ function SkillsTabClass:CopySocketGroup(socketGroup) skillText = skillText .. "Slot: " .. socketGroup.slot .. "\r\n" end for _, gemInstance in ipairs(socketGroup.gemList) do - skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "ENABLED" or "DISABLED", gemInstance.count or 1) + skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "" or "DISABLED", gemInstance.count or 1) end Copy(skillText) end @@ -608,7 +608,7 @@ function SkillsTabClass:PasteSocketGroup(testInput) if slot then newGroup.slot = slot end - for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) (%a+%d?) ?(%a*) (%d+)") do + for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) ?(%a*) (%d+)") do t_insert(newGroup.gemList, { nameSpec = nameSpec, level = tonumber(level) or 20,