diff --git a/Classes/CalcBreakdownControl.lua b/Classes/CalcBreakdownControl.lua index 2c2f1275..2a84f104 100644 --- a/Classes/CalcBreakdownControl.lua +++ b/Classes/CalcBreakdownControl.lua @@ -331,7 +331,7 @@ function CalcBreakdownClass:AddModSection(sectionData) for _, tag in ipairs(row.mod.tagList) do local desc if tag.type == "Condition" then - desc = "Condition: "..(tag.varList and table.concat(tag.varList, "/") or self:FormatModName(tag.var)) + desc = "Condition: "..(tag.neg and "Not " or "")..(tag.varList and table.concat(tag.varList, "/") or self:FormatModName(tag.var)) elseif tag.type == "Multiplier" then if tag.base then desc = (row.mod.type == "BASE" and string.format("%+g", tag.base) or tag.base.."%").." + "..math.abs(row.mod.value).." per "..self:FormatModName(tag.var) diff --git a/Classes/ConfigTab.lua b/Classes/ConfigTab.lua index 973e7aa6..3932b280 100644 --- a/Classes/ConfigTab.lua +++ b/Classes/ConfigTab.lua @@ -126,6 +126,15 @@ local varList = { { var = "enemyChaosResist", type = "number", label = "Enemy Chaos Resistance:", apply = function(val, modList, enemyModList) enemyModList:NewMod("ChaosResist", "BASE", val, "Config") end }, + { var = "enemyConditionHitByFireDamage", type = "check", label = "Enemy was Hit by Fire Damage?", ifNode = 39085, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "EnemyCondition", var = "HitByFireDamage" }, "Config") + end }, + { var = "enemyConditionHitByColdDamage", type = "check", label = "Enemy was Hit by Cold Damage?", ifNode = 39085, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "EnemyCondition", var = "HitByColdDamage" }, "Config") + end }, + { var = "enemyConditionHitByLightningDamage", type = "check", label = "Enemy was Hit by Light. Damage?", ifNode = 39085, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "EnemyCondition", var = "HitByLightningDamage" }, "Config") + end }, } local ConfigTabClass = common.NewClass("ConfigTab", "UndoHandler", "ControlHost", "Control", function(self, build) diff --git a/Classes/ModDB.lua b/Classes/ModDB.lua index 6ab8ee5b..29d66e64 100644 --- a/Classes/ModDB.lua +++ b/Classes/ModDB.lua @@ -165,6 +165,9 @@ function ModDBClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, else match = self.conditions[tag.var] end + if tag.neg then + match = not match + end if not match then value = nullValue end diff --git a/Classes/ModList.lua b/Classes/ModList.lua index 0b28ea24..85d7ec18 100644 --- a/Classes/ModList.lua +++ b/Classes/ModList.lua @@ -135,6 +135,9 @@ function ModListClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7 else match = self.conditions[tag.var] end + if tag.neg then + match = not match + end if not match then value = nullValue end diff --git a/Data/New.lua b/Data/New.lua index 63f29fc5..3cd2f928 100644 --- a/Data/New.lua +++ b/Data/New.lua @@ -178,5 +178,15 @@ League: Breach 50% chance to gain a Power Charge on Killing a Frozen Enemy Adds 10 to 20 Cold Damage to Spells per Power Charge +21 Mana gained on Killing a Frozen Enemy +]],[[ +Tulfall +Tornado Wand +(35-39)% increased Spell Damage +11% increased Cast Speed +50% chance to gain a Power Charge on Killing a Frozen Enemy +Adds 15 to 25 Cold Damage to Spells per Power Charge +Lose all Power Charges on reaching Maximum Power Charges +Gain a Frenzy Charge on reaching Maximum Power Charges +11% increased Cold Damage per Frenzy Charge ]], } \ No newline at end of file diff --git a/Data/Rares.lua b/Data/Rares.lua index c40eb663..9a41cedd 100644 --- a/Data/Rares.lua +++ b/Data/Rares.lua @@ -182,6 +182,23 @@ Prefixes: {range:0}Adds (0-60 to 0-104) Cold Damage to Spells {range:0}Adds (0-15 to 0-200) Lightning Damage to Spells {spell suf}]], + ["jewel pre"] = [[ +Prefixes: +{range:0}(0 to 16)% increased Physical Damage +{range:0}(0 to 16)% increased Fire Damage +{range:0}(0 to 16)% increased Cold Damage +{range:0}(0 to 16)% increased Lightning Damage +{range:0}(0 to 16)% increased Chaos Damage +{range:0}(0 to 16)% increased Totem Damage +{range:0}(0 to 7)% increased maximum Life]], + ["jewel suf"] = [[ +Suffixes: +{range:0}(0 to 10)% increased Damage +{range:0}(0 to 12)% increased Projectile Damage +{range:0}(0 to 12)% increased Damage over Time +{range:0}(0 to 12)% increased Area Damage +{range:0}(0 to 4)% increased Attack and Cast Speed +{range:0}(0 to 5)% increased Attack Speed]], } local rares = { @@ -1030,6 +1047,74 @@ Prophecy Wand (16 to 20)% increased Spell Damage {spell 1h} ]], +-- Jewels +[[ +Jewel +Crimson Jewel +{jewel pre} +{range:0}(0 to 18)% increased Armour +{range:0}(0 to 14)% increased Physical Damage with One Handed Melee Weapons +{range:0}(0 to 14)% increased Physical Damage with Two Handed Melee Weapons +{range:0}(0 to 6)% increased Attack Speed with One Handed Melee Weapons +{range:0}(0 to 6)% increased Attack Speed with Two Handed Melee Weapons +{range:0}(0 to 18)% increased Critical Strike Chance with One Handed Melee Weapons +{range:0}(0 to 18)% increased Critical Strike Chance with Two Handed Melee Weapons +{range:0}+(0 to 12)% to Critical Strike Multiplier with One Handed Melee Weapons +{range:0}+(0 to 12)% to Critical Strike Multiplier with Two Handed Melee Weapons +{jewel suf} +{range:0}(0 to 12)% increased Melee Damage +{range:0}(0 to 12)% increased Global Critical Strike Chance +{range:0}(0 to 14)% increased Melee Critical Strike Chance +{range:0}+(0 to 8)% to Global Critical Strike Multiplier +{range:0}+(0 to 10)% to Melee Critical Strike Multiplier +]], +[[ +Jewel +Viridian Jewel +{jewel pre} +{range:0}(0 to 18)% increased Evasion Rating +{range:0}(0 to 16)% increased Trap Damage +{range:0}(0 to 16)% increased Mine Damage +{range:0}(0 to 16)% increased Physical Damage with Bows +{range:0}(0 to 14)% increased Physical Damage with One Handed Melee Weapons +{range:0}(0 to 14)% increased Physical Damage with Two Handed Melee Weapons +{range:0}(0 to 8)% increased Attack Speed with Bows +{range:0}(0 to 6)% increased Attack Speed with One Handed Melee Weapons +{range:0}(0 to 6)% increased Attack Speed with Two Handed Melee Weapons +{range:0}(0 to 18)% increased Critical Strike Chance with One Handed Melee Weapons +{range:0}(0 to 18)% increased Critical Strike Chance with Two Handed Melee Weapons +{range:0}+(0 to 12)% to Critical Strike Multiplier with One Handed Melee Weapons +{range:0}+(0 to 12)% to Critical Strike Multiplier with Two Handed Melee Weapons +{jewel suf} +{range:0}(0 to 12)% increased Melee Damage +{range:0}(0 to 12)% increased Global Critical Strike Chance +{range:0}(0 to 14)% increased Melee Critical Strike Chance +{range:0}+(0 to 8)% to Global Critical Strike Multiplier +{range:0}+(0 to 10)% to Melee Critical Strike Multiplier +]], +[[ +Jewel +Cobalt Jewel +{jewel pre} +{range:0}(0 to 8)% increased maximum Energy Shield +{range:0}(0 to 6)% faster start of Energy Shield Recharge +{range:0}(0 to 16)% increased Trap Damage +{range:0}(0 to 16)% increased Mine Damage +{range:0}(0 to 16)% increased Minion Damage +{range:0}(0 to 16)% increased Physical Damage with Wands +{range:0}(0 to 8)% increased Attack Speed with Wands +{range:0}(0 to 16)% increased Spell Damage while wielding a Staff +{range:0}(0 to 16)% increased Spell Damage while holding a Shield +{range:0}(0 to 5)% increased Cast Speed while wielding a Staff +{range:0}(0 to 5)% increased Cast Speed while holding a Shield +{jewel suf} +{range:0}(0 to 4)% increased Cast Speed +{range:0}(0 to 12)% increased Spell Damage +{range:0}(0 to 12)% increased Global Critical Strike Chance +{range:0}(0 to 14)% increased Critical Strike Chance for Spells +{range:0}+(0 to 8)% to Global Critical Strike Multiplier +{range:0}+(0 to 10)% to Critical Strike Multiplier for Spells +]], } for i, rare in pairs(rares) do diff --git a/Modules/Build.lua b/Modules/Build.lua index 11f3f81a..eb28cab1 100644 --- a/Modules/Build.lua +++ b/Modules/Build.lua @@ -32,23 +32,9 @@ function buildMode:Init(dbFileName, buildName) self.anchorTopBarLeft = common.New("Control", nil, 4, 4, 0, 20) self.controls.back = common.New("ButtonControl", {"LEFT",self.anchorTopBarLeft,"RIGHT"}, 0, 0, 60, 20, "<< Back", function() if self.unsaved then - main:OpenPopup(280, 100, "Save Changes", { - common.New("LabelControl", nil, 0, 20, 0, 16, "^7This build has unsaved changes.\nDo you want to save them now?"), - common.New("ButtonControl", nil, -90, 70, 80, 20, "Save", function() - self:SaveDBFile() - main:ClosePopup() - main:SetMode("LIST", self.buildName) - end), - common.New("ButtonControl", nil, 0, 70, 80, 20, "Don't Save", function() - main:ClosePopup() - main:SetMode("LIST", self.buildName) - end), - common.New("ButtonControl", nil, 90, 70, 80, 20, "Cancel", function() - main:ClosePopup() - end), - }) + self:OpenSavePopup(false) else - main:SetMode("LIST", self.buildName) + main:SetMode("LIST", self.dbFileName and self.buildName) end end) self.controls.buildName = common.New("Control", {"LEFT",self.controls.back,"RIGHT"}, 8, 0, 0, 20) @@ -67,40 +53,14 @@ function buildMode:Init(dbFileName, buildName) self:SaveDBFile() end) self.controls.save.enabled = function() - return self.unsaved + return not self.dbFileName or self.unsaved end self.controls.saveAs = common.New("ButtonControl", {"LEFT",self.controls.save,"RIGHT"}, 8, 0, 70, 20, "Save As", function() - local newFileName, newBuildName - local popup - popup = main:OpenPopup(370, 100, "Save As", { - common.New("LabelControl", nil, 0, 20, 0, 16, "^7Enter new build name:"), - edit = common.New("EditControl", nil, 0, 40, 350, 20, self.buildName, nil, "\\/:%*%?\"<>|", 50, function(buf) - newFileName = main.buildPath..buf..".xml" - newBuildName = buf - popup.controls.save.enabled = false - if not buf:match("%S") then - return - end - local out = io.open(newFileName, "r") - if out then - out:close() - return - end - popup.controls.save.enabled = true - end), - save = common.New("ButtonControl", nil, -45, 70, 80, 20, "Save", function() - self.dbFileName = newFileName - self.buildName = newBuildName - main.modeArgs = { newFileName, newBuildName } - self:SaveDBFile() - main:ClosePopup() - end), - common.New("ButtonControl", nil, 45, 70, 80, 20, "Cancel", function() - main:ClosePopup() - end), - }, "save", "edit") - popup.controls.save.enabled = false + self:OpenSaveAsPopup() end) + self.controls.saveAs.enabled = function() + return self.dbFileName + end -- Controls: top bar, right side self.anchorTopBarRight = common.New("Control", nil, function() return main.screenW / 2 + 6 end, 4, 0, 20) @@ -325,6 +285,7 @@ function buildMode:Init(dbFileName, buildName) self.buildName = buildName self.characterLevel = 1 + self.controls.characterLevel:SetText(tostring(self.characterLevel)) self.banditNormal = "None" self.banditCruel = "None" self.banditMerciless = "None" @@ -344,7 +305,7 @@ function buildMode:Init(dbFileName, buildName) ConPrintf("Loading '%s'...", dbFileName) if self:LoadDBFile() then - main:SetMode("LIST", dbFileName) + main:SetMode("LIST", buildName) return end @@ -385,26 +346,12 @@ function buildMode:CanExit() if not self.unsaved then return true end - main:OpenPopup(280, 100, "Save Changes", { - common.New("LabelControl", nil, 0, 20, 0, 16, "^7This build has unsaved changes.\nDo you want to save them before exiting?"), - common.New("ButtonControl", nil, -90, 70, 80, 20, "Save", function() - self:SaveDBFile() - main:ClosePopup() - Exit() - end), - common.New("ButtonControl", nil, 0, 70, 80, 20, "Don't Save", function() - main:ClosePopup() - Exit() - end), - common.New("ButtonControl", nil, 90, 70, 80, 20, "Cancel", function() - main:ClosePopup() - end), - }) + self:OpenSavePopup(true) return false end function buildMode:Shutdown() - if launch.devMode and not self.abortSave then + if launch.devMode and not self.abortSave and self.dbFileName then self:SaveDBFile() end self.abortSave = nil @@ -445,6 +392,12 @@ function buildMode:OnFrame(inputEvents) if event.key == "s" then self:SaveDBFile() inputEvents[id] = nil + elseif event.key == "w" then + if self.unsaved then + self:OpenSavePopup(false) + else + main:SetMode("LIST", self.dbFileName and self.buildName) + end elseif event.key == "1" then self.viewMode = "TREE" elseif event.key == "2" then @@ -559,6 +512,61 @@ function buildMode:OnFrame(inputEvents) self:DrawControls(main.viewPort) end +function buildMode:OpenSavePopup(exit) + main:OpenPopup(280, 100, "Save Changes", { + common.New("LabelControl", nil, 0, 20, 0, 16, "^7This build has unsaved changes.\nDo you want to save them "..(exit and "before exiting?" or "now?")), + common.New("ButtonControl", nil, -90, 70, 80, 20, "Save", function() + main:ClosePopup() + self.actionOnSave = exit and "EXIT" or "LIST" + self:SaveDBFile() + end), + common.New("ButtonControl", nil, 0, 70, 80, 20, "Don't Save", function() + main:ClosePopup() + if exit then + Exit() + else + main:SetMode("LIST", self.dbFileName and self.buildName) + end + end), + common.New("ButtonControl", nil, 90, 70, 80, 20, "Cancel", function() + main:ClosePopup() + end), + }) +end + +function buildMode:OpenSaveAsPopup() + local newFileName, newBuildName + local popup + popup = main:OpenPopup(370, 100, self.dbFileName and "Save As" or "Save", { + common.New("LabelControl", nil, 0, 20, 0, 16, "^7Enter new build name:"), + edit = common.New("EditControl", nil, 0, 40, 350, 20, self.dbFileName and self.buildName, nil, "\\/:%*%?\"<>|", 50, function(buf) + newFileName = main.buildPath..buf..".xml" + newBuildName = buf + popup.controls.save.enabled = false + if not buf:match("%S") then + return + end + local out = io.open(newFileName, "r") + if out then + out:close() + return + end + popup.controls.save.enabled = true + end), + save = common.New("ButtonControl", nil, -45, 70, 80, 20, "Save", function() + self.dbFileName = newFileName + self.buildName = newBuildName + main.modeArgs = { newFileName, newBuildName } + self:SaveDBFile() + main:ClosePopup() + end), + common.New("ButtonControl", nil, 45, 70, 80, 20, "Cancel", function() + main:ClosePopup() + end), + }, "save", "edit") + popup.controls.save.enabled = false +end + function buildMode:RefreshStatList() -- Build list of side bar stats wipeTable(self.controls.statBox.list) @@ -626,6 +634,9 @@ function buildMode:LoadDB(xmlText, fileName) end function buildMode:LoadDBFile() + if not self.dbFileName then + return + end local file = io.open(self.dbFileName, "r") if not file then return true @@ -655,6 +666,10 @@ function buildMode:SaveDB(fileName) end function buildMode:SaveDBFile() + if not self.dbFileName then + self:OpenSaveAsPopup() + return + end local xmlText = self:SaveDB(self.dbFileName) if not xmlText then return true @@ -665,6 +680,11 @@ function buildMode:SaveDBFile() end file:write(xmlText) file:close() + if self.actionOnSave == "LIST" then + main:SetMode("LIST", self.buildName) + elseif self.actionOnSave == "EXIT" then + Exit() + end end return buildMode \ No newline at end of file diff --git a/Modules/BuildList.lua b/Modules/BuildList.lua index 0f490e45..886895a1 100644 --- a/Modules/BuildList.lua +++ b/Modules/BuildList.lua @@ -18,7 +18,8 @@ function listMode:Init(selBuildName) end self.controls.new = common.New("ButtonControl", {"TOP",self.anchor,"TOP"}, -210, 0, 60, 20, "New", function() - self:New() + main:SetMode("BUILD", false, "Unnamed build") + --self:New() end) self.controls.open = common.New("ButtonControl", {"LEFT",self.controls.new,"RIGHT"}, 8, 0, 60, 20, "Open", function() self:LoadSel() diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index dfc787bb..6ae1df35 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -1113,6 +1113,8 @@ local function performCalcs(env) for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do if value.type == "Condition" then condList[value.var] = true + elseif value.type == "EnemyCondition" then + enemyDB.conditions[value.var] = true elseif value.type == "Multiplier" then modDB.multipliers[value.var] = (modDB.multipliers[value.var] or 0) + value.value end @@ -1940,6 +1942,17 @@ local function performCalcs(env) output.TotalMin = totalMin output.TotalMax = totalMax + -- Update enemy hit-by-damage-type conditions + if output.FireAverage > 0 then + enemyDB.conditions.HitByFireDamage = true + end + if output.ColdAverage > 0 then + enemyDB.conditions.HitByColdDamage = true + end + if output.LightningAverage > 0 then + enemyDB.conditions.HitByLightningDamage = true + end + -- Calculate average damage and final DPS output.AverageHit = (totalMin + totalMax) / 2 * output.CritEffect output.AverageDamage = output.AverageHit * output.HitChance / 100 diff --git a/Modules/Main.lua b/Modules/Main.lua index 186e36e7..a373fd3c 100644 --- a/Modules/Main.lua +++ b/Modules/Main.lua @@ -198,7 +198,7 @@ function main:Init() self.buildSortMode = "NAME" - self:SetMode("LIST") + self:SetMode("BUILD", false, "Unnamed build") self:LoadSettings() end diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 459939b9..c90a7978 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -417,6 +417,17 @@ local specialModList = { ["life leech applies instantly%. life regeneration has no effect%."] = { flag("VaalPact"), flag("NoLifeRegen") }, ["deal no non%-fire damage"] = { flag("DealNoPhysical"), flag("DealNoLightning"), flag("DealNoCold"), flag("DealNoChaos") }, ["removes all mana%. spend life instead of mana for skills"] = { mod("Mana", "MORE", -100), flag("BloodMagic") }, + ["enemies you hit with elemental damage temporarily get (%+%d+)%% resistance to those elements and (%-%d+)%% resistance to other elements"] = function(plus, _, minus) + minus = tonumber(minus) + return { + mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("FireResist", "BASE", plus, { type = "Condition", var = "HitByFireDamage" }) }), + mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("FireResist", "BASE", minus, { type = "Condition", var = "HitByFireDamage", neg = true }, { type = "Condition", varList={"HitByColdDamage","HitByLightningDamage"} }) }), + mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("ColdResist", "BASE", plus, { type = "Condition", var = "HitByColdDamage" }) }), + mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("ColdResist", "BASE", minus, { type = "Condition", var = "HitByColdDamage", neg = true }, { type = "Condition", varList={"HitByFireDamage","HitByLightningDamage"} }) }), + mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("LightningResist", "BASE", plus, { type = "Condition", var = "HitByLightningDamage" }) }), + mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("LightningResist", "BASE", minus, { type = "Condition", var = "HitByLightningDamage", neg = true }, { type = "Condition", varList={"HitByFireDamage","HitByColdDamage"} }) }), + } + end, -- Ascendancy notables ["movement skills cost no mana"] = { mod("ManaCost", "MORE", -100, nil, 0, KeywordFlag.Movement) }, ["projectiles have 100%% additional chance to pierce targets at the start of their movement, losing this chance as the projectile travels farther"] = { mod("PierceChance", "BASE", 100) }, diff --git a/README.md b/README.md index 2aec7c39..6799c29d 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,21 @@ 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.18 - 2016/11/29 + * Added 3 new Jewel templates + * Added 'Tulfall' + * Creating a new build now opens an unnamed build rather than asking for a build name + * You will be prompted to name the build when saving + * The program now opens a new build when run for the first time + * Added support for Elemental Equilibrium; when this passive is allocated, new options will appear in the Configuration tab + to allow you to indicate which damage types the enemy has been hit by before being hit by your main skill + * The enemy's resistances will update after the skill's hit damage is calculated, so that any damage over time effects are + calculated correctly + ### 1.2.17 - 2016/11/28 * Added 'Tulborn' and 'Voice of the Storm' - * Added support for Mastermind of Discord; when this passive is allocated, new options will appear in the - Configuration tab to allow you to indicate which skill types you are using + * Added support for Mastermind of Discord; when this passive is allocated, new options will appear in the Configuration tab + to allow you to indicate which skill types you are using * Conversion modifiers are now listed in the breakdowns for hit damage in the Calcs tab * Added 2x multiplier to Cyclone's DPS to match the in-game tooltip * Fixed bug preventing the buff from Summon Lightning Golem from applying correctly diff --git a/changelog.txt b/changelog.txt index b1bc407c..5a89e85b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,7 +1,17 @@ +VERSION[1.2.18][2016/11/29] + * Added 3 new Jewel templates + * Added 'Tulfall' + * Creating a new build now opens an unnamed build rather than asking for a build name + * You will be prompted to name the build when saving + * The program now opens a new build when run for the first time + * Added support for Elemental Equilibrium; when this passive is allocated, new options will appear in the Configuration tab + to allow you to indicate which damage types the enemy has been hit by before being hit by your main skill + * The enemy's resistances will update after the skill's hit damage is calculated, so that any damage over time effects are + calculated correctly VERSION[1.2.17][2016/11/28] * Added 'Tulborn' and 'Voice of the Storm' - * Added support for Mastermind of Discord; when this passive is allocated, new options will appear in the - Configuration tab to allow you to indicate which skill types you are using + * Added support for Mastermind of Discord; when this passive is allocated, new options will appear in the Configuration tab + to allow you to indicate which skill types you are using * Conversion modifiers are now listed in the breakdowns for hit damage in the Calcs tab * Added 2x multiplier to Cyclone's DPS to match the in-game tooltip * Fixed bug preventing the buff from Summon Lightning Golem from applying correctly diff --git a/manifest.xml b/manifest.xml index 6ba6ed73..70f0b537 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,20 +1,20 @@ - + - + - + - + @@ -26,8 +26,8 @@ - - + + @@ -42,20 +42,20 @@ - - - + + + - - + + - - + +