diff --git a/Classes/ImportTab.lua b/Classes/ImportTab.lua index 4542ffe5..339612b5 100644 --- a/Classes/ImportTab.lua +++ b/Classes/ImportTab.lua @@ -133,6 +133,9 @@ You can get this from your web browser's cookies while logged into the Path of E end self.importCodeState = "VALID" self.importCodeXML = xmlText + if not self.build.dbFileName then + self.controls.importCodeMode.sel = 2 + end end) self.controls.importCodeState = common.New("LabelControl", {"LEFT",self.controls.importCodeIn,"RIGHT"}, 4, 0, 0, 16) self.controls.importCodeState.label = function() @@ -140,7 +143,7 @@ You can get this from your web browser's cookies while logged into the Path of E end self.controls.importCodeMode = common.New("DropDownControl", {"TOPLEFT",self.controls.importCodeIn,"BOTTOMLEFT"}, 0, 4, 160, 20, { "Import to this build", "Import to a new build:" }) self.controls.importCodeMode.enabled = function() - return self.importCodeState == "VALID" + return self.importCodeState == "VALID" and self.build.dbFileName end self.controls.importCodeBuildName = common.New("EditControl", {"LEFT",self.controls.importCodeMode,"RIGHT"}, 4, 0, 400, 20, "", "New build name", "\\/:%*%?\"<>|", 50) self.controls.importCodeBuildName.enabled = function() @@ -188,7 +191,7 @@ function ImportTabClass:DownloadCharacterList() local sessionID = #self.controls.sessionInput.buf == 32 and self.controls.sessionInput.buf or main.accountSessionIDs[accountName] launch:DownloadPage("https://www.pathofexile.com/character-window/get-characters?accountName="..accountName, function(page, errMsg) if errMsg then - self.charImportStatus = data.colorCodes.NEGATIVE.."Unknown error retrieving character list, try again ("..errMsg:gsub("\n"," ")..")" + self.charImportStatus = data.colorCodes.NEGATIVE.."Error retrieving character list, try again ("..errMsg:gsub("\n"," ")..")" self.charImportMode = "GETACCOUNTNAME" return elseif page == "false" then @@ -231,7 +234,7 @@ function ImportTabClass:DownloadPassiveTree() launch:DownloadPage("https://www.pathofexile.com/character-window/get-passive-skills?accountName="..accountName.."&character="..charData.name, function(page, errMsg) self.charImportMode = "SELECTCHAR" if errMsg then - self.charImportStatus = data.colorCodes.NEGATIVE.."Unknown error importing character data, try again ("..errMsg:gsub("\n"," ")..")" + self.charImportStatus = data.colorCodes.NEGATIVE.."Error importing character data, try again ("..errMsg:gsub("\n"," ")..")" return elseif page == "false" then self.charImportStatus = data.colorCodes.NEGATIVE.."Failed to retrieve character data, try again." @@ -271,7 +274,7 @@ function ImportTabClass:DownloadItems() launch:DownloadPage("https://www.pathofexile.com/character-window/get-items?accountName="..accountName.."&character="..charData.name, function(page, errMsg) self.charImportMode = "SELECTCHAR" if errMsg then - self.charImportStatus = data.colorCodes.NEGATIVE.."Unknown error importing character data, try again ("..errMsg:gsub("\n"," ")..")" + self.charImportStatus = data.colorCodes.NEGATIVE.."Error importing character data, try again ("..errMsg:gsub("\n"," ")..")" return elseif page == "false" then self.charImportStatus = data.colorCodes.NEGATIVE.."Failed to retrieve character data, try again." diff --git a/Classes/ModDB.lua b/Classes/ModDB.lua index 29d66e64..0a9a656a 100644 --- a/Classes/ModDB.lua +++ b/Classes/ModDB.lua @@ -170,22 +170,27 @@ function ModDBClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, end if not match then value = nullValue + break end elseif tag.type == "SocketedIn" then if tag.slotName ~= slotName or (tag.keyword and (not skillGem or not gemIsType(skillGem, tag.keyword))) then value = nullValue + break end elseif tag.type == "SkillName" then if tag.skillName ~= skillName then value = nullValue + break end elseif tag.type == "SkillPart" then if tag.skillPart ~= skillPart then value = nullValue + break end elseif tag.type == "SlotName" then if tag.slotName ~= slotName then value = nullValue + break end end end diff --git a/Classes/ModList.lua b/Classes/ModList.lua index 85d7ec18..9e3b926e 100644 --- a/Classes/ModList.lua +++ b/Classes/ModList.lua @@ -140,22 +140,27 @@ function ModListClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7 end if not match then value = nullValue + break end elseif tag.type == "SocketedIn" then if tag.slotName ~= slotName or (tag.keyword and (not skillGem or not gemIsType(skillGem, tag.keyword))) then value = nullValue + break end elseif tag.type == "SkillName" then if tag.skillName ~= skillName then value = nullValue + break end elseif tag.type == "SkillPart" then if tag.skillPart ~= skillPart then value = nullValue + break end elseif tag.type == "SlotName" then if tag.slotName ~= slotName then value = nullValue + break end end end diff --git a/Data/Gems/act_dex.lua b/Data/Gems/act_dex.lua index 1f13d967..c4282659 100644 --- a/Data/Gems/act_dex.lua +++ b/Data/Gems/act_dex.lua @@ -201,6 +201,7 @@ gems["Blade Flurry"] = { active_skill = true, attack = true, area = true, + channelling = true, melee = true, parts = { { @@ -220,7 +221,7 @@ gems["Blade Flurry"] = { baseMods = { skill("castTime", 1), skill("manaCost", 4), - mod("Speed", "MORE", 65, ModFlag.Attack), --"active_skill_attack_speed_+%_final" = 65 + mod("Speed", "MORE", 60, ModFlag.Attack), --"active_skill_attack_speed_+%_final" = 60 --"charged_attack_damage_per_stack_+%_final" = 20 --"is_area_damage" = ? nil, --"base_skill_show_average_damage_instead_of_dps" = ? @@ -287,11 +288,14 @@ gems["Blade Vortex"] = { skill("critChance", 6), skill("duration", 5), --"base_skill_effect_duration" = 5000 --"maximum_number_of_spinning_blades" = 20 - mod("AreaRadius", "INC", 0), --"base_skill_area_of_effect_+%" = 0 + --"base_blade_vortex_hit_rate_ms" = 600 --"extra_gore_chance_override_%" = 15 + --"blade_vortex_hit_rate_+%_per_blade" = 10 + --"blade_vortex_damage_+%_per_blade" = 30 --"is_area_damage" = ? --"skill_can_add_multiple_charges_per_action" = ? --"action_ignores_crit_tracking" = ? + skill("showAverage", true), --"base_skill_show_average_damage_instead_of_dps" = ? skill("deliciouslyOverpowered", true), }, qualityMods = { @@ -303,36 +307,36 @@ gems["Blade Vortex"] = { [3] = skill("PhysicalMax", nil), --"spell_maximum_base_physical_damage" }, levels = { - [1] = { 6, 9, 14, }, - [2] = { 7, 12, 17, }, - [3] = { 8, 15, 23, }, - [4] = { 9, 19, 29, }, - [5] = { 10, 24, 36, }, - [6] = { 11, 30, 45, }, - [7] = { 12, 37, 55, }, - [8] = { 13, 43, 64, }, - [9] = { 13, 50, 74, }, - [10] = { 14, 57, 86, }, - [11] = { 14, 66, 98, }, - [12] = { 15, 75, 113, }, - [13] = { 16, 86, 129, }, - [14] = { 16, 98, 147, }, - [15] = { 17, 111, 167, }, - [16] = { 18, 126, 190, }, - [17] = { 18, 137, 206, }, - [18] = { 19, 149, 224, }, - [19] = { 19, 162, 243, }, - [20] = { 19, 176, 264, }, - [21] = { 20, 191, 286, }, - [22] = { 21, 207, 310, }, - [23] = { 21, 224, 336, }, - [24] = { 21, 242, 363, }, - [25] = { 22, 262, 393, }, - [26] = { 23, 283, 425, }, - [27] = { 23, 306, 459, }, - [28] = { 23, 331, 496, }, - [29] = { 24, 357, 536, }, - [30] = { 24, 386, 579, }, + [1] = { 6, 7, 10, }, + [2] = { 7, 8, 12, }, + [3] = { 8, 11, 16, }, + [4] = { 9, 14, 20, }, + [5] = { 10, 17, 25, }, + [6] = { 11, 21, 32, }, + [7] = { 12, 26, 39, }, + [8] = { 13, 30, 45, }, + [9] = { 13, 35, 52, }, + [10] = { 14, 40, 60, }, + [11] = { 14, 46, 69, }, + [12] = { 15, 53, 79, }, + [13] = { 16, 60, 90, }, + [14] = { 16, 68, 103, }, + [15] = { 17, 78, 117, }, + [16] = { 18, 88, 133, }, + [17] = { 18, 96, 144, }, + [18] = { 19, 104, 157, }, + [19] = { 19, 113, 170, }, + [20] = { 19, 123, 185, }, + [21] = { 20, 133, 200, }, + [22] = { 21, 145, 217, }, + [23] = { 21, 157, 235, }, + [24] = { 21, 170, 254, }, + [25] = { 22, 183, 275, }, + [26] = { 23, 198, 298, }, + [27] = { 23, 214, 322, }, + [28] = { 23, 232, 347, }, + [29] = { 24, 250, 375, }, + [30] = { 24, 270, 405, }, }, } gems["Bladefall"] = { @@ -1922,7 +1926,7 @@ gems["Herald of Ice"] = { area = true, cold = true, }, - skillTypes = { [39] = true, [5] = true, [15] = true, [16] = true, [10] = true, [11] = true, [34] = true, }, + skillTypes = { [39] = true, [5] = true, [15] = true, [16] = true, [10] = true, [11] = true, [34] = true, [27] = true, }, baseMods = { skill("castTime", 1), skill("manaCost", 25), diff --git a/Data/Gems/act_int.lua b/Data/Gems/act_int.lua index 622ac640..97654259 100644 --- a/Data/Gems/act_int.lua +++ b/Data/Gems/act_int.lua @@ -325,6 +325,7 @@ gems["Blight"] = { spell = true, chaos = true, area = true, + channelling = true, duration = true, color = 3, baseFlags = { @@ -351,36 +352,36 @@ gems["Blight"] = { [2] = skill("ChaosDot", nil), --"base_chaos_damage_to_deal_per_minute" }, levels = { - [1] = { 2, 1.65, }, - [2] = { 2, 1.8666666666667, }, - [3] = { 2, 2.3333333333333, }, - [4] = { 2, 3.15, }, - [5] = { 2, 4.45, }, - [6] = { 2, 6.5333333333333, }, - [7] = { 2, 8.6333333333333, }, - [8] = { 2, 11.183333333333, }, - [9] = { 2, 14.3, }, - [10] = { 2, 18.083333333333, }, - [11] = { 2, 22.633333333333, }, - [12] = { 3, 28.133333333333, }, - [13] = { 3, 34.75, }, - [14] = { 3, 42.683333333333, }, - [15] = { 3, 52.166666666667, }, - [16] = { 3, 63.483333333333, }, - [17] = { 3, 76.983333333333, }, - [18] = { 4, 93.05, }, - [19] = { 4, 107.05, }, - [20] = { 4, 122.96666666667, }, - [21] = { 4, 134.76666666667, }, - [22] = { 4, 147.6, }, - [23] = { 4, 161.58333333333, }, - [24] = { 5, 176.78333333333, }, - [25] = { 5, 193.31666666667, }, - [26] = { 5, 211.28333333333, }, - [27] = { 5, 230.81666666667, }, - [28] = { 5, 252.05, }, - [29] = { 5, 275.1, }, - [30] = { 5, 300.15, }, + [1] = { 2, 1.7333333333333, }, + [2] = { 2, 1.9666666666667, }, + [3] = { 2, 2.4666666666667, }, + [4] = { 2, 3.3666666666667, }, + [5] = { 2, 4.8333333333333, }, + [6] = { 2, 7.2166666666667, }, + [7] = { 2, 9.6833333333333, }, + [8] = { 2, 12.75, }, + [9] = { 2, 16.566666666667, }, + [10] = { 2, 21.266666666667, }, + [11] = { 2, 27.05, }, + [12] = { 3, 34.133333333333, }, + [13] = { 3, 42.816666666667, }, + [14] = { 3, 53.4, }, + [15] = { 3, 66.283333333333, }, + [16] = { 3, 81.916666666667, }, + [17] = { 3, 100.88333333333, }, + [18] = { 4, 123.83333333333, }, + [19] = { 4, 144.11666666667, }, + [20] = { 4, 167.48333333333, }, + [21] = { 4, 184.96666666667, }, + [22] = { 4, 204.16666666667, }, + [23] = { 4, 225.23333333333, }, + [24] = { 5, 248.33333333333, }, + [25] = { 5, 273.66666666667, }, + [26] = { 5, 301.41666666667, }, + [27] = { 5, 331.83333333333, }, + [28] = { 5, 365.16666666667, }, + [29] = { 5, 401.66666666667, }, + [30] = { 5, 441.61666666667, }, }, } gems["Bone Offering"] = { @@ -1575,6 +1576,7 @@ gems["Flameblast"] = { spell = true, area = true, fire = true, + channelling = true, parts = { { name = "1 Stage", @@ -2171,7 +2173,7 @@ gems["Herald of Thunder"] = { duration = true, lightning = true, }, - skillTypes = { [39] = true, [5] = true, [15] = true, [16] = true, [10] = true, [11] = true, [12] = true, [35] = true, }, + skillTypes = { [39] = true, [5] = true, [15] = true, [16] = true, [10] = true, [11] = true, [12] = true, [35] = true, [27] = true, }, baseMods = { skill("castTime", 1), skill("manaCost", 25), @@ -2427,6 +2429,7 @@ gems["Incinerate"] = { active_skill = true, spell = true, fire = true, + channelling = true, parts = { { name = "Base damage", @@ -3423,6 +3426,7 @@ gems["Scorching Ray"] = { spell = true, fire = true, duration = true, + channelling = true, parts = { { name = "1 Stage", @@ -3462,36 +3466,36 @@ gems["Scorching Ray"] = { [2] = skill("FireDot", nil), --"base_fire_damage_to_deal_per_minute" }, levels = { - [1] = { 4, 9.5333333333333, }, - [2] = { 4, 12.416666666667, }, - [3] = { 4, 17.266666666667, }, - [4] = { 5, 23.533333333333, }, - [5] = { 5, 31.6, }, - [6] = { 5, 41.95, }, - [7] = { 6, 55.133333333333, }, - [8] = { 6, 67.333333333333, }, - [9] = { 6, 81.9, }, - [10] = { 7, 99.266666666667, }, - [11] = { 7, 119.93333333333, }, - [12] = { 7, 144.51666666667, }, - [13] = { 8, 173.68333333333, }, - [14] = { 8, 208.26666666667, }, - [15] = { 8, 249.23333333333, }, - [16] = { 9, 297.66666666667, }, - [17] = { 9, 334.75, }, - [18] = { 9, 376.18333333333, }, - [19] = { 10, 422.46666666667, }, - [20] = { 10, 474.1, }, - [21] = { 10, 531.73333333333, }, - [22] = { 11, 596, }, - [23] = { 11, 667.65, }, - [24] = { 11, 747.51666666667, }, - [25] = { 12, 836.51666666667, }, - [26] = { 12, 935.63333333333, }, - [27] = { 12, 1046, }, - [28] = { 13, 1168.85, }, - [29] = { 13, 1305.55, }, - [30] = { 13, 1457.6333333333, }, + [1] = { 4, 9.6833333333333, }, + [2] = { 4, 12.65, }, + [3] = { 4, 17.683333333333, }, + [4] = { 5, 24.233333333333, }, + [5] = { 5, 32.716666666667, }, + [6] = { 5, 43.666666666667, }, + [7] = { 6, 57.7, }, + [8] = { 6, 70.75, }, + [9] = { 6, 86.4, }, + [10] = { 7, 105.13333333333, }, + [11] = { 7, 127.55, }, + [12] = { 7, 154.3, }, + [13] = { 8, 186.2, }, + [14] = { 8, 224.16666666667, }, + [15] = { 8, 269.33333333333, }, + [16] = { 9, 322.96666666667, }, + [17] = { 9, 364.18333333333, }, + [18] = { 9, 410.36666666667, }, + [19] = { 10, 462.06666666667, }, + [20] = { 10, 519.93333333333, }, + [21] = { 10, 584.7, }, + [22] = { 11, 657.13333333333, }, + [23] = { 11, 738.1, }, + [24] = { 11, 828.61666666667, }, + [25] = { 12, 929.73333333333, }, + [26] = { 12, 1042.6833333333, }, + [27] = { 12, 1168.8, }, + [28] = { 13, 1309.5833333333, }, + [29] = { 13, 1466.6666666667, }, + [30] = { 13, 1641.9166666667, }, }, } gems["Shock Nova"] = { @@ -4189,6 +4193,7 @@ gems["Wither"] = { area = true, duration = true, chaos = true, + channelling = true, parts = { { name = "1 Stack", diff --git a/Data/Gems/act_str.lua b/Data/Gems/act_str.lua index 6d38c343..3226e46c 100644 --- a/Data/Gems/act_str.lua +++ b/Data/Gems/act_str.lua @@ -156,7 +156,7 @@ gems["Ancestral Warchief"] = { duration = true, }, skillTypes = { [1] = true, [30] = true, [12] = true, [6] = true, [24] = true, [17] = true, [19] = true, [11] = true, }, - skillTotemId = 13, + skillTotemId = 15, baseMods = { skill("castTime", 1), skill("manaCost", 10), @@ -164,8 +164,8 @@ gems["Ancestral Warchief"] = { --"base_totem_range" = 50 --"ancestor_totem_parent_activiation_range" = 70 mod("TotemPlacementSpeed", "INC", 50), --"summon_totem_cast_speed_+%" = 50 - --"totem_art_variation" = 2 mod("Speed", "MORE", -10, ModFlag.Attack), --"active_skill_attack_speed_+%_final" = -10 + --"melee_range_+" = 10 --"is_area_damage" = ? --"base_skill_is_totemified" = ? --"is_totem" = ? @@ -175,41 +175,41 @@ gems["Ancestral Warchief"] = { mod("Damage", "INC", 1, 0, KeywordFlag.Totem), --"totem_damage_+%" = 1 }, levelMods = { - [1] = mod("Damage", "MORE", nil, ModFlag.Attack), - [2] = skill("totemLevel", nil), --"base_active_skill_totem_level" - [3] = mod("Damage", "MORE", nil, ModFlag.Melee, 0, { type = "GlobalEffect", effectType = "Buff" }), --"slam_ancestor_totem_grant_owner_melee_damage_+%_final" + [1] = skill("totemLevel", nil), --"base_active_skill_totem_level" + [2] = mod("Damage", "MORE", nil, ModFlag.Melee, 0, { type = "GlobalEffect", effectType = "Buff" }), --"slam_ancestor_totem_grant_owner_melee_damage_+%_final" + [3] = mod("Damage", "MORE", nil, ModFlag.Attack), }, levels = { - [1] = { 10, 28, 8, }, - [2] = { 11.2, 31, 8, }, - [3] = { 12.4, 34, 9, }, - [4] = { 13.6, 37, 10, }, - [5] = { 14.8, 40, 10, }, - [6] = { 16, 42, 10, }, - [7] = { 17.2, 44, 11, }, - [8] = { 18.4, 46, 12, }, - [9] = { 19.6, 48, 12, }, - [10] = { 20.8, 50, 12, }, - [11] = { 22, 52, 13, }, - [12] = { 23.2, 54, 14, }, - [13] = { 24.4, 56, 14, }, - [14] = { 25.6, 58, 14, }, - [15] = { 26.8, 60, 15, }, - [16] = { 28, 62, 16, }, - [17] = { 29.2, 64, 16, }, - [18] = { 30.4, 66, 16, }, - [19] = { 31.6, 68, 17, }, - [20] = { 32.8, 70, 18, }, - [21] = { 34, 72, 18, }, - [22] = { 35.2, 74, 18, }, - [23] = { 36.4, 76, 19, }, - [24] = { 37.6, 78, 20, }, - [25] = { 38.8, 80, 20, }, - [26] = { 40, 82, 20, }, - [27] = { 41.2, 84, 21, }, - [28] = { 42.4, 86, 22, }, - [29] = { 43.6, 88, 22, }, - [30] = { 44.8, 90, 22, }, + [1] = { 28, 8, nil, }, + [2] = { 31, 8, 1.2, }, + [3] = { 34, 9, 2.4, }, + [4] = { 37, 10, 3.6, }, + [5] = { 40, 10, 4.8, }, + [6] = { 42, 10, 6, }, + [7] = { 44, 11, 7.2, }, + [8] = { 46, 12, 8.4, }, + [9] = { 48, 12, 9.6, }, + [10] = { 50, 12, 10.8, }, + [11] = { 52, 13, 12, }, + [12] = { 54, 14, 13.2, }, + [13] = { 56, 14, 14.4, }, + [14] = { 58, 14, 15.6, }, + [15] = { 60, 15, 16.8, }, + [16] = { 62, 16, 18, }, + [17] = { 64, 16, 19.2, }, + [18] = { 66, 16, 20.4, }, + [19] = { 68, 17, 21.6, }, + [20] = { 70, 18, 22.8, }, + [21] = { 72, 18, 24, }, + [22] = { 74, 18, 25.2, }, + [23] = { 76, 19, 26.4, }, + [24] = { 78, 20, 27.6, }, + [25] = { 80, 20, 28.8, }, + [26] = { 82, 20, 30, }, + [27] = { 84, 21, 31.2, }, + [28] = { 86, 22, 32.4, }, + [29] = { 88, 22, 33.6, }, + [30] = { 90, 22, 44.8, }, }, } gems["Anger"] = { @@ -365,6 +365,8 @@ gems["Decoy Totem"] = { --"base_totem_range" = 60 --"base_skill_is_totemified" = ? --"base_deal_no_damage" = ? + --"totems_cannot_evade" = ? + --"totem_ignores_cooldown" = ? }, qualityMods = { mod("TotemLife", "INC", 1), --"totem_life_+%" = 1 @@ -1052,7 +1054,7 @@ gems["Herald of Ash"] = { area = true, fire = true, }, - skillTypes = { [2] = true, [5] = true, [15] = true, [16] = true, [29] = true, [11] = true, [40] = true, [20] = true, [33] = true, }, + skillTypes = { [2] = true, [5] = true, [15] = true, [16] = true, [29] = true, [11] = true, [40] = true, [20] = true, [33] = true, [27] = true, }, baseMods = { skill("castTime", 1), skill("manaCost", 25), diff --git a/Data/Gems/sup_int.lua b/Data/Gems/sup_int.lua index 24b4abc2..746d4de7 100644 --- a/Data/Gems/sup_int.lua +++ b/Data/Gems/sup_int.lua @@ -211,6 +211,13 @@ gems["Cast when Stunned"] = { [30] = { 79, }, }, } +gems["Cast while Channelling"] = { + intelligence = true, + support = true, + channelling = true, + spell = true, + unsupported = true, +} gems["Chance to Ignite"] = { fire = true, intelligence = true, @@ -995,7 +1002,7 @@ gems["Minion and Totem Elemental Resistance"] = { --[1] = "summon_fire_resistance_+" --[2] = "summon_cold_resistance_+" --[3] = "summon_lightning_resistance_+" - [4] = mod("ElementalDamage", "MORE", nil, 0, bit.bor(KeywordFlag.Minion, KeywordFlag.Totem)), + [4] = mod("ElementalDamage", "MORE", nil, 0, bit.bor(KeywordFlag.Minion, KeywordFlag.Totem)), --"support_minion_totem_resistance_elemental_damage_+%_final" }, levels = { [1] = { 25, 25, 25, 10, }, diff --git a/Data/Gems/sup_str.lua b/Data/Gems/sup_str.lua index 542ba7d6..123dd7ae 100644 --- a/Data/Gems/sup_str.lua +++ b/Data/Gems/sup_str.lua @@ -1154,35 +1154,35 @@ gems["Ranged Attack Totem"] = { [2] = mod("Damage", "MORE", nil), --"support_totem_damage_+%_final" }, levels = { - [1] = { 8, -50, }, - [2] = { 10, -49, }, - [3] = { 13, -48, }, - [4] = { 17, -47, }, - [5] = { 21, -46, }, - [6] = { 25, -45, }, - [7] = { 29, -44, }, - [8] = { 33, -43, }, - [9] = { 37, -42, }, - [10] = { 40, -41, }, - [11] = { 43, -40, }, - [12] = { 46, -39, }, - [13] = { 49, -38, }, - [14] = { 52, -37, }, - [15] = { 55, -36, }, - [16] = { 58, -35, }, - [17] = { 61, -34, }, - [18] = { 64, -33, }, - [19] = { 67, -32, }, - [20] = { 70, -31, }, - [21] = { 72, -30, }, - [22] = { 74, -29, }, - [23] = { 76, -28, }, - [24] = { 78, -27, }, - [25] = { 80, -26, }, - [26] = { 82, -25, }, - [27] = { 84, -24, }, - [28] = { 86, -23, }, - [29] = { 88, -22, }, + [1] = { 8, -35, }, + [2] = { 10, -35, }, + [3] = { 13, -34, }, + [4] = { 17, -34, }, + [5] = { 21, -33, }, + [6] = { 25, -33, }, + [7] = { 29, -32, }, + [8] = { 33, -32, }, + [9] = { 37, -31, }, + [10] = { 40, -31, }, + [11] = { 43, -30, }, + [12] = { 46, -30, }, + [13] = { 49, -29, }, + [14] = { 52, -29, }, + [15] = { 55, -28, }, + [16] = { 58, -28, }, + [17] = { 61, -27, }, + [18] = { 64, -27, }, + [19] = { 67, -26, }, + [20] = { 70, -26, }, + [21] = { 72, -25, }, + [22] = { 74, -25, }, + [23] = { 76, -24, }, + [24] = { 78, -24, }, + [25] = { 80, -23, }, + [26] = { 82, -23, }, + [27] = { 84, -22, }, + [28] = { 86, -22, }, + [29] = { 88, -21, }, [30] = { 90, -21, }, }, } diff --git a/Data/Rares.lua b/Data/Rares.lua index 369c9f13..06ea885c 100644 --- a/Data/Rares.lua +++ b/Data/Rares.lua @@ -55,6 +55,7 @@ Prefixes: {range:0}(0 to 22)% increased Energy Shield {range:0}(0 to 26)% increased Spell Damage {range:0}(0 to 42)% increased Elemental Damage with Weapons +{crafted}{range:0}Adds (0-11 to 0-23) Chaos Damage to Attacks Suffixes: {str} {dex} @@ -81,10 +82,11 @@ Prefixes: {range:0}Adds (0-22 to 0-40) Cold Damage to Attacks {range:0}Adds (0-7 to 0-72) Lightning Damage to Attacks {range:0}(0 to 42)% increased Elemental Damage with Weapons -{range:0}(0 to 20)% increased Armour -{range:0}(0 to 20)% increased Evasion Rating -{range:0}(0 to 20)% increased Energy Shield -{range:0}(0 to 20)% faster start of Energy Shield Recharge +{crafted}{range:0}(0 to 20)% increased Armour +{crafted}{range:0}(0 to 20)% increased Evasion Rating +{crafted}{range:0}(0 to 20)% increased Energy Shield +{crafted}{range:0}(0 to 20)% faster start of Energy Shield Recharge +{crafted}{range:0}Adds (0-11 to 0-23) Chaos Damage to Attacks Suffixes: {str} {dex} @@ -98,7 +100,8 @@ Suffixes: {range:0}+(0 to 400) to Accuracy Rating {range:0}(0 to 12)% increased Fire Damage {range:0}(0 to 12)% increased Cold Damage -{range:0}(0 to 12)% increased Lightning Damage]], +{range:0}(0 to 12)% increased Lightning Damage +{crafted}{range:0}(0 to 16)% increased Global Critical Strike Chance]], ["belt"] = [[ Prefixes: {range:0}+(0 to 99) to maximum Life diff --git a/Launch.lua b/Launch.lua index f1df8e1b..f20786cd 100644 --- a/Launch.lua +++ b/Launch.lua @@ -225,7 +225,7 @@ function launch:DownloadPage(url, callback, cookies) LaunchSubScript([[ local url, cookies = ... ConPrintf("Downloading page at: %s", url) - local curl = require("lcurl") + local curl = require("lcurl.safe") local page = "" local easy = curl.easy() easy:setopt_url(url) @@ -236,11 +236,13 @@ function launch:DownloadPage(url, callback, cookies) page = page..data return true end) - easy:perform() + local _, error = easy:perform() local code = easy:getinfo(curl.INFO_RESPONSE_CODE) easy:close() local errMsg - if code ~= 200 then + if error then + errMsg = error:msg() + elseif code ~= 200 then errMsg = "Response code: "..code elseif #page == 0 then errMsg = "No data returned" diff --git a/LaunchInstall.lua b/LaunchInstall.lua index 771489a7..0ca3acac 100644 --- a/LaunchInstall.lua +++ b/LaunchInstall.lua @@ -5,10 +5,10 @@ -- Installation bootstrap -- -local basicFiles = { "Launch.lua", "UpdateCheck.lua", "UpdateApply.lua" } +local basicFiles = { "UpdateCheck.lua", "UpdateApply.lua", "Launch.lua" } local xml = require("xml") -local curl = require("lcurl") +local curl = require("lcurl.safe") ConClear() ConPrintf("Preparing to complete installation...\n") @@ -33,18 +33,23 @@ if not localBranch or not localSource then return end localSource = localSource:gsub("{branch}", localBranch) -for _, name in pairs(basicFiles) do - local outFile = io.open(name, "wb") +for _, name in ipairs(basicFiles) do + local text = "" local easy = curl.easy() easy:setopt_url(localSource..name) - easy:setopt_writefunction(outFile) + easy:setopt_writefunction(function(data) + text = text..data + return true + end) easy:perform() local size = easy:getinfo(curl.INFO_SIZE_DOWNLOAD) easy:close() - outFile:close() if size == 0 then Exit("Install failed. (Couldn't download program files)") return end + local outFile = io.open(name, "wb") + outFile:write(text) + outFile:close() end Restart() \ No newline at end of file diff --git a/Modules/Build.lua b/Modules/Build.lua index e96fad31..d5a066e8 100644 --- a/Modules/Build.lua +++ b/Modules/Build.lua @@ -237,7 +237,7 @@ function buildMode:Init(dbFileName, buildName) { mod = "IgniteDPS", label = "Ignite DPS", fmt = ".1f", compPercent = true }, { mod = "PoisonDPS", label = "Poison DPS", fmt = ".1f", compPercent = true }, { mod = "PoisonDamage", label = "Total Damage per Poison", fmt = ".1f", compPercent = true }, - { mod = "ManaCost", label = "Mana Cost", fmt = "d", compPercent = true, condFunc = function() return true end }, + { mod = "ManaCost", label = "Mana Cost", fmt = "d", compPercent = true, lowerIsBetter = true, condFunc = function() return true end }, { }, { mod = "Str", label = "Strength", fmt = "d" }, { mod = "Dex", label = "Dexterity", fmt = "d" }, @@ -305,7 +305,6 @@ function buildMode:Init(dbFileName, buildName) ["Spec"] = self.treeTab, } - ConPrintf("Loading '%s'...", dbFileName) if self:LoadDBFile() then main:SetMode("LIST", buildName) return @@ -603,7 +602,8 @@ function buildMode:AddStatComparesToTooltip(baseOutput, compareOutput, header) if count == 0 then main:AddTooltipLine(14, header) end - local line = string.format("%s%+"..statData.fmt.." %s", diff > 0 and data.colorCodes.POSITIVE or data.colorCodes.NEGATIVE, diff * (statData.pc and 100 or 1), statData.label) + local color = ((statData.lowerIsBetter and diff < 0) or (not statData.lowerIsBetter and diff > 0)) and data.colorCodes.POSITIVE or data.colorCodes.NEGATIVE + local line = string.format("%s%+"..statData.fmt.." %s", color, diff * (statData.pc and 100 or 1), statData.label) if statData.compPercent and (baseOutput[statData.mod] or 0) ~= 0 and (compareOutput[statData.mod] or 0) ~= 0 then line = line .. string.format(" (%+.1f%%)", (compareOutput[statData.mod] or 0) / (baseOutput[statData.mod] or 0) * 100 - 100) end @@ -644,6 +644,7 @@ function buildMode:LoadDBFile() if not self.dbFileName then return end + ConPrintf("Loading '%s'...", self.dbFileName) local file = io.open(self.dbFileName, "r") if not file then return true diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index c7f283ae..37556512 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -1073,6 +1073,8 @@ local function performCalcs(env) local inc = modDB:Sum("INC", skillCfg, "AuraEffect") + skillModList:Sum("INC", skillCfg, "AuraEffect") local more = modDB:Sum("MORE", skillCfg, "AuraEffect") * skillModList:Sum("MORE", skillCfg, "AuraEffect") modDB:ScaleAddList(activeSkill.auraModList, (1 + inc / 100) * more) + condList["HaveAuraActive"] = true + modDB.multipliers["ActiveAura"] = (modDB.multipliers["ActiveAura"] or 0) + 1 end end if env.mode_effective then @@ -1766,7 +1768,7 @@ local function performCalcs(env) if breakdown then simpleBreakdown(nil, skillCfg, "Accuracy") end - if not isAttack or modDB:Sum("FLAG", skillCfg, "CannotBeEvaded") or env.weaponData1.CannotBeEvaded then + if not isAttack or modDB:Sum("FLAG", skillCfg, "CannotBeEvaded") or env.weaponData1.CannotBeEvaded or skillData.cannotBeEvaded then output.HitChance = 100 else local enemyEvasion = round(calcVal(enemyDB, "Evasion")) @@ -2405,10 +2407,12 @@ local function getCalculator(build, fullInit, modFunc) end local initModDB = common.New("ModDB") initModDB:AddDB(env.modDB) - initModDB.multipliers = copyTable(env.modDB.multipliers) initModDB.conditions = copyTable(env.modDB.conditions) + initModDB.multipliers = copyTable(env.modDB.multipliers) local initEnemyDB = common.New("ModDB") initEnemyDB:AddDB(env.enemyDB) + initEnemyDB.conditions = copyTable(env.enemyDB.conditions) + initEnemyDB.multipliers = copyTable(env.enemyDB.multipliers) if not fullInit then mergeMainMods(env) end @@ -2425,6 +2429,8 @@ local function getCalculator(build, fullInit, modFunc) env.modDB.multipliers = copyTable(initModDB.multipliers) env.enemyDB.mods = wipeTable(env.enemyDB.mods) env.enemyDB:AddDB(initEnemyDB) + env.enemyDB.conditions = copyTable(initEnemyDB.conditions) + env.enemyDB.multipliers = copyTable(initEnemyDB.multipliers) -- Call function to make modifications to the enviroment modFunc(env, ...) @@ -2529,7 +2535,7 @@ function calcs.buildOutput(build, mode) output.CombatList = table.concat(combatList, ", ") output.CurseList = table.concat(curseList, ", ") - --infoDump(env) + infoDump(env) end return env diff --git a/Modules/Data.lua b/Modules/Data.lua index 8d6420fa..21384242 100644 --- a/Modules/Data.lua +++ b/Modules/Data.lua @@ -199,7 +199,7 @@ data.monsterEvasionTable = { 36, 42, 49, 56, 64, 72, 80, 89, 98, 108, 118, 128, data.monsterAccuracyTable = { 18, 19, 20, 21, 23, 24, 25, 27, 28, 30, 31, 33, 35, 36, 38, 40, 42, 44, 46, 49, 51, 54, 56, 59, 62, 65, 68, 71, 74, 78, 81, 85, 89, 93, 97, 101, 106, 111, 116, 121, 126, 132, 137, 143, 149, 156, 162, 169, 177, 184, 192, 200, 208, 217, 226, 236, 245, 255, 266, 277, 288, 300, 312, 325, 338, 352, 366, 381, 396, 412, 428, 445, 463, 481, 500, 520, 540, 562, 584, 607, 630, 655, 680, 707, 734, 762, 792, 822, 854, 887, 921, 956, 992, 1030, 1069, 1110, 1152, 1196, 1241, 1288, } data.monsterLifeTable = { 15, 17, 20, 23, 26, 30, 33, 37, 41, 46, 50, 55, 60, 66, 71, 77, 84, 91, 98, 105, 113, 122, 131, 140, 150, 161, 171, 183, 195, 208, 222, 236, 251, 266, 283, 300, 318, 337, 357, 379, 401, 424, 448, 474, 501, 529, 559, 590, 622, 656, 692, 730, 769, 810, 853, 899, 946, 996, 1048, 1102, 1159, 1219, 1281, 1346, 1415, 1486, 1561, 1640, 1722, 1807, 1897, 1991, 2089, 2192, 2299, 2411, 2528, 2651, 2779, 2913, 3053, 3199, 3352, 3511, 3678, 3853, 4035, 4225, 4424, 4631, 4848, 5074, 5310, 5557, 5815, 6084, 6364, 6658, 6964, 7283, } -- From MonsterVarieties.dat combined with SkillTotemVariations.dat -data.totemLifeMult = { [1] = 2.94, [2] = 2.94, [3] = 2.94, [4] = 2.94, [5] = 2.94, [6] = 4.2, [7] = 2.94, [8] = 2.94, [9] = 2.94, [10] = 2.94, [11] = 2.94, [12] = 2.94, [13] = 4.5, } +data.totemLifeMult = { [1] = 2.94, [2] = 2.94, [3] = 2.94, [4] = 2.94, [5] = 2.94, [6] = 4.2, [7] = 2.94, [8] = 2.94, [9] = 2.94, [10] = 2.94, [11] = 2.94, [12] = 2.94, [13] = 4.5, [15] = 4.5, } data.monsterExperienceLevelMap = { [71] = 70.94, [72] = 71.82, [73] = 72.64, [74] = 73.40, [75] = 74.10, [76] = 74.74, [77] = 75.32, [78] = 75.84, [79] = 76.30, [80] = 76.70, [81] = 77.04, [82] = 77.32, [83] = 77.54, [84] = 77.70, } for i = 1, 70 do diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 9633c39d..9ce7302c 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -299,6 +299,8 @@ local preFlagList = { ["^socketed curse gems have "] = { tag = { type = "SocketedIn", keyword = "curse" } }, ["^socketed melee gems have "] = { tag = { type = "SocketedIn", keyword = "melee" } }, ["^your flasks grant "] = { }, + ["^auras you cast grant "] = { tag = { type = "Multiplier", var = "ActiveAura" } }, + ["^you and allies affected by your auras have "] = { tag = { type = "Condition", var = "HaveAuraActive" } }, } -- List of modifier tags @@ -312,6 +314,7 @@ local modTagList = { ["for each magic item you have equipped"] = { tag = { type = "Multiplier", var = "MagicItem" } }, ["for each rare item you have equipped"] = { tag = { type = "Multiplier", var = "RareItem" } }, ["for each unique item you have equipped"] = { tag = { type = "Multiplier", var = "UniqueItem" } }, + ["to you and allies"] = { }, -- Per stat ["per (%d+) strength"] = function(num) return { tag = { type = "PerStat", stat = "Str", div = num } } end, ["per (%d+) dexterity"] = function(num) return { tag = { type = "PerStat", stat = "Dex", div = num } } end, @@ -484,6 +487,7 @@ local specialModList = { ["spells have an additional projectile"] = { mod("ProjectileCount", "BASE", 1, nil, ModFlag.Spell) }, ["skills chain %+(%d) times"] = function(num) return { mod("ChainCount", "BASE", num) } end, ["reflects (%d+) physical damage to melee attackers"] = { }, + ["critical strikes with daggers have a (%d+)%% chance to poison the enemy"] = function(num) return { mod("PoisonChance", "BASE", 0.3, nil, ModFlag.Dagger, { type = "PerStat", stat = "CritChance", div = 1 }) } end, -- Special item local modifiers ["no physical damage"] = { mod("Misc", "LIST", { type = "WeaponData", key = "PhysicalMin" }), mod("Misc", "LIST", { type = "WeaponData", key = "PhysicalMax" }), mod("Misc", "LIST", { type = "WeaponData", key = "PhysicalDPS" }) }, ["all attacks with this weapon are critical strikes"] = { mod("Misc", "LIST", { type = "WeaponData", key = "critChance", value = 100 }) }, diff --git a/README.md b/README.md index 90383eb1..83f509a1 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,18 @@ Head over to the [Releases](https://github.com/Openarl/PathOfBuilding/releases) ![ss3](https://cloud.githubusercontent.com/assets/19189971/18089780/f0ff234a-6f04-11e6-8c88-6193fe59a5c4.png) ## Changelog +### 1.2.21 - 2016/12/03 + * Updated the skill data to 2.5.0 + * Added the Elreon flat chaos mod to the ring and amulet templates + * Added support for the "Auras you Cast" modifiers in Guardian and Necromancer + * Passives/items that affect mana cost will now display the mana cost change in green if the cost is reduced, + and red if the cost is increased (i.e the reverse of the behaviour for other stats) + * Skills that cannot miss will now correctly have a 100% chance to hit + * Fixed issue that could cause the stat comparisons in item and passive node tooltips to show incorrect values if + Elemental Equilibrium is used + * The error messages displayed when a character import fails due to connection issues are now more readable + * Fixed the program's saved window position becoming invalid if the program was closed while minimised + ### 1.2.20 - 2016/12/02 * Added 'The Pandemonius', 'Light of Lunaris', 'The Surrender' and 'Malachai's Vision' * Added support for the Minion and Totem Elemental Resistances gem diff --git a/UpdateCheck.lua b/UpdateCheck.lua index 53110bef..9909f7d2 100644 --- a/UpdateCheck.lua +++ b/UpdateCheck.lua @@ -7,41 +7,43 @@ local xml = require("xml") local sha1 = require("sha1") -local curl = require("lcurl") +local curl = require("lcurl.safe") local lzip = require("lzip") -local function downloadFile(url, outName) - local outFile = io.open(outName, "wb") - local easy = curl.easy() - easy:setopt_url(url) - easy:setopt_writefunction(outFile) - easy:perform() - local size = easy:getinfo(curl.INFO_SIZE_DOWNLOAD) - easy:close() - outFile:close() - if size == 0 then - ConPrintf("Download failed") - os.remove(outName) - return true +local globalRetryLimit = 10 +local function downloadFileText(url) + for i = 1, 5 do + if i > 1 then + ConPrintf("Retrying... (%d of 5)", i) + end + local text = "" + local easy = curl.easy() + easy:setopt_url(url) + easy:setopt_writefunction(function(data) + text = text..data + return true + end) + local _, error = easy:perform() + easy:close() + if not error then + return text + end + ConPrintf("Download failed (%s)", error:msg()) + if globalRetryLimit == 0 then + break + end + globalRetryLimit = globalRetryLimit - 1 end end - -local function downloadFileText(url) - local text = "" - local easy = curl.easy() - easy:setopt_url(url) - easy:setopt_writefunction(function(data) - text = text..data - return true - end) - easy:perform() - local size = easy:getinfo(curl.INFO_SIZE_DOWNLOAD) - easy:close() - if size == 0 then - ConPrintf("Download failed") - return nil +local function downloadFile(url, outName) + local text = downloadFileText(url) + if text then + local outFile = io.open(outName, "wb") + outFile:write(text) + outFile:close() + else + return true end - return text end ConPrintf("Checking for update...") diff --git a/changelog.txt b/changelog.txt index 57997953..bcd350a3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,14 @@ +VERSION[1.2.21][2016/12/03] + * Updated the skill data to 2.5.0 + * Added the Elreon flat chaos mod to the ring and amulet templates + * Added support for the "Auras you Cast" modifiers in Guardian and Necromancer + * Passives/items that affect mana cost will now display the mana cost change in green if the cost is reduced, + and red if the cost is increased (i.e the reverse of the behaviour for other stats) + * Skills that cannot miss will now correctly have a 100% chance to hit + * Fixed issue that could cause the stat comparisons in item and passive node tooltips to show incorrect values if + Elemental Equilibrium is used + * The error messages displayed when a character import fails due to connection issues are now more readable + * Fixed the program's saved window position becoming invalid if the program was closed while minimised VERSION[1.2.20][2016/12/02] * Added 'The Pandemonius', 'Light of Lunaris', 'The Surrender' and 'Malachai's Vision' * Added support for the Minion and Totem Elemental Resistances gem diff --git a/manifest.xml b/manifest.xml index 1c600c32..c4adf728 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,13 +1,13 @@ - + - - + + - + @@ -20,14 +20,14 @@ - + - - + + @@ -42,27 +42,27 @@ - + - + - + - + - - - - + + + + - - + + @@ -101,9 +101,9 @@ - - - + + + diff --git a/runtime-win32.zip b/runtime-win32.zip index 9ed98166..3a68c12b 100644 Binary files a/runtime-win32.zip and b/runtime-win32.zip differ