From f0f6b333ecf11e7c23cc6271a927837bb8daf444 Mon Sep 17 00:00:00 2001 From: Ben Pope <b.pope1988@gmail.com> Date: Tue, 20 Dec 2016 19:31:45 +0000 Subject: [PATCH] - Removed the Dual Weapon Training, Acrobatics and Field Control trees from players. These are still present for backwards compatibility. Escorts no longer grant these trees or talents from them - Heightened Senses now grants see invis/stealth and damage reduction against unseen. Trap effects have been removed - Track is now present in Tier 2 Survival - Charm Mastery has been renamed Device Mastery, and grants the Trap effects of the old Heightened Senses - Danger Sense has been added to T4 Survival. Grants a large damage reduction effect on falling below a life threshold. Has a cooldown - Piercing Sight and Evasion have been removed from Survival - Mobility has been restructured with the following talents (in order): Disengage, Tumble, Trained Reacions, Evasion - Disengage now also grants a movespeed boost and reload effect, as well as 1 turn of evasion - Tumble now has a shorter cooldown and no cost, but causes the cost to rapidly increase if used repeatedly - Trained Reactions costs less and scales off Defense - Evasion has a small stamina cost and scales off Dexterity only - Parry has been renamed to Dual Weapon Mastery, and also grants offhand damage and slightly increase parry chance - Duelist's Focus and Feint have had their effects increased - Marauder now gains Duelist - Total Thuggery now drains 6 stamina each turn rather than 12-6 stamina each hit - Lethality grants critical strike damage bonus - Coup de Grace resets the cooldown on Stealth on kill - Increased the effect of Soothing Darkness - Fixed a few typos - Added Light Armour Training to Combat Training. This grants defense and armor hardiness when wearing light armor, and on moving into a tile adjacent to an enemy will grant a brief boost to % defense and stamina regeneration --- game/modules/tome/class/Actor.lua | 6 +- game/modules/tome/class/Trap.lua | 6 +- game/modules/tome/class/interface/Combat.lua | 16 +- .../modules/tome/data/birth/classes/rogue.lua | 15 +- .../tome/data/birth/classes/warrior.lua | 7 +- game/modules/tome/data/chats/escort-quest.lua | 14 +- .../tome/data/general/npcs/skeleton.lua | 2 +- .../modules/tome/data/general/npcs/thieve.lua | 6 +- .../tome/data/gfx/talents/danger_sense.png | Bin 0 -> 7091 bytes .../tome/data/gfx/talents/device_mastery.png | Bin 0 -> 4719 bytes .../tome/data/gfx/talents/disengage.png | Bin 2839 -> 2491 bytes .../{parry.png => dual_weapon_mastery.png} | Bin .../modules/tome/data/gfx/talents/evasion.png | Bin 5944 -> 3032 bytes .../gfx/talents/light_armour_training.png | Bin 0 -> 7884 bytes game/modules/tome/data/gfx/talents/track.png | Bin 3946 -> 5919 bytes .../data/gfx/talents/trained_reactions.png | Bin 0 -> 3413 bytes game/modules/tome/data/gfx/talents/tumble.png | Bin 0 -> 2175 bytes .../tome/data/talents/cunning/lethality.lua | 14 +- .../tome/data/talents/cunning/stealth.lua | 12 +- .../tome/data/talents/cunning/survival.lua | 170 ++++++++------- game/modules/tome/data/talents/misc/npcs.lua | 132 ++++++++++++ .../data/talents/techniques/assassination.lua | 7 +- .../talents/techniques/combat-training.lua | 40 +++- .../tome/data/talents/techniques/duelist.lua | 20 +- .../data/talents/techniques/field-control.lua | 112 +++++----- .../tome/data/talents/techniques/mobility.lua | 195 +++++++++++++----- .../tome/data/talents/techniques/pugilism.lua | 8 +- .../talents/techniques/throwing-knives.lua | 2 +- .../tome/data/talents/techniques/thuggery.lua | 6 +- .../talents/techniques/unarmed-training.lua | 26 +-- .../tome/data/timed_effects/physical.lua | 71 ++++++- 31 files changed, 621 insertions(+), 266 deletions(-) create mode 100644 game/modules/tome/data/gfx/talents/danger_sense.png create mode 100644 game/modules/tome/data/gfx/talents/device_mastery.png rename game/modules/tome/data/gfx/talents/{parry.png => dual_weapon_mastery.png} (100%) create mode 100644 game/modules/tome/data/gfx/talents/light_armour_training.png create mode 100644 game/modules/tome/data/gfx/talents/trained_reactions.png create mode 100644 game/modules/tome/data/gfx/talents/tumble.png diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index f6cd2e4cf5..e56ad76d10 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -1324,8 +1324,8 @@ function _M:move(x, y, force) self.did_energy = nil -- Try to detect traps - if not force and self:knowTalent(self.T_HEIGHTENED_SENSES) then - local power = self:callTalent(self.T_HEIGHTENED_SENSES,"trapPower") + if not force and self:knowTalent(self.T_DEVICE_MASTERY) then + local power = self:callTalent(self.T_DEVICE_MASTERY,"trapPower") local grids = core.fov.circle_grids(self.x, self.y, 1, true) for x, yy in pairs(grids) do for y, _ in pairs(yy) do local trap = game.level.map(x, y, Map.TRAP) @@ -1572,7 +1572,7 @@ end -- param power detection power (optional) -- @return the trap @ x, y if present and detected function _M:detectTrap(trap, x, y, power) - power = power or self:callTalent(self.T_HEIGHTENED_SENSES, "trapPower") + power = power or self:callTalent(self.T_DEVICE_MASTERY, "trapPower") if power <= 0 then return end trap = trap or game.level.map(x, y, Map.TRAP) if trap then diff --git a/game/modules/tome/class/Trap.lua b/game/modules/tome/class/Trap.lua index 0b73ba07b3..a16508dacb 100644 --- a/game/modules/tome/class/Trap.lua +++ b/game/modules/tome/class/Trap.lua @@ -164,8 +164,8 @@ function _M:canDisarm(x, y, who) if not engine.Trap.canDisarm(self, x, y, who) then return false end -- do we know how to disarm? - if (who:getTalentLevel(who.T_HEIGHTENED_SENSES) >= 3) or who:attr("can_disarm") then - local th = who:getTalentFromId(who.T_HEIGHTENED_SENSES) + if (who:getTalentLevel(who.T_DEVICE_MASTERY) >= 1) or who:attr("can_disarm") then + local th = who:getTalentFromId(who.T_DEVICE_MASTERY) local power = th.trapPower(who, th) + (who:attr("disarm_bonus") or 0) if who:checkHitOld(power, self.disarm_power) and (not self.faction or who:reactionToward(self) < 0) then return true @@ -193,7 +193,7 @@ function _M:onDisarm(x, y, who) --table.set(game, "debug", "last_trap_disarmed", self) -- debugging -- The player may unlock a trap talent when disarming a (similar) trap (uses Trap Mastery) if self.unlock_talent_on_disarm and who.player and who:knowTalent(who.T_TRAP_MASTERY) and core.fov.distance(x, y, who.x, who.y) <= 1 and not game.state:unlockTalentCheck(self.unlock_talent_on_disarm.tid, who) then - local hit, chance = who:checkHit(who:callTalent(who.T_TRAP_MASTERY, "getPower") + who:callTalent(who.T_HEIGHTENED_SENSES, "trapPower")*.25, self.disarm_power) + local hit, chance = who:checkHit(who:callTalent(who.T_TRAP_MASTERY, "getPower") + who:callTalent(who.T_DEVICE_MASTERY, "trapPower")*.25, self.disarm_power) local t = who:getTalentFromId(self.unlock_talent_on_disarm.tid) if t and hit and chance > 20 and (not self.unlock_talent_on_disarm.chance or rng.percent(self.unlock_talent_on_disarm.chance)) and next(who:spotHostiles()) == nil then local diff_level = (t.trap_mastery_level or 5) diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index bb6d952fe2..2d996679c5 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -1173,6 +1173,9 @@ function _M:combatDefenseBase(fake) if self:hasDualWeapon() and self:knowTalent(self.T_DUAL_WEAPON_DEFENSE) then add = add + self:callTalent(self.T_DUAL_WEAPON_DEFENSE,"getDefense") end + if self:hasLightArmor() and self:knowTalent(self.T_LIGHT_ARMOUR_TRAINING) then + add = add + self:callTalent(self.T_LIGHT_ARMOUR_TRAINING,"getDefense") + end if not fake then add = add + (self:checkOnDefenseCall("defense") or 0) end @@ -1198,6 +1201,11 @@ function _M:combatDefenseBase(fake) if self:hasLightArmor() and self:knowTalent(self.T_MOBILE_DEFENCE) then mult = mult + self:callTalent(self.T_MOBILE_DEFENCE,"getDef") end + + if self:hasLightArmor() and self:hasEffect(self.EFF_MOBILE_DEFENCE) then + local eff = self:hasEffect(self.EFF_MOBILE_DEFENCE) + mult = mult + (eff.power/100) + end return math.max(0, d * mult + add) -- Add bonuses last to avoid compounding defense multipliers from talents end @@ -1261,6 +1269,9 @@ function _M:combatArmorHardiness() if self:hasLightArmor() and self:knowTalent(self.T_MOBILE_DEFENCE) then add = add + self:callTalent(self.T_MOBILE_DEFENCE, "getHardiness") end + if self:hasLightArmor() and self:knowTalent(self.T_LIGHT_ARMOUR_TRAINING) then + add = add + self:callTalent(self.T_LIGHT_ARMOUR_TRAINING, "getArmorHardiness") + end if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then add = add + 50 end @@ -1719,10 +1730,13 @@ end function _M:getOffHandMult(combat, mult) if combat and combat.range and not combat.dam then return mult or 1 end --no penalty for ranged shooters local offmult = 1/2 - -- Take the bigger multiplier from Dual weapon training and Corrupted Strength + -- Take the bigger multiplier from Dual weapon training, Dual Weapon Mastery and Corrupted Strength if self:knowTalent(Talents.T_DUAL_WEAPON_TRAINING) then offmult = math.max(offmult,self:callTalent(Talents.T_DUAL_WEAPON_TRAINING,"getoffmult")) end + if self:knowTalent(Talents.T_DUAL_WEAPON_MASTERY) then + offmult = math.max(offmult,self:callTalent(Talents.T_DUAL_WEAPON_MASTERY,"getoffmult")) + end if self:knowTalent(Talents.T_CORRUPTED_STRENGTH) then offmult = math.max(offmult,self:callTalent(Talents.T_CORRUPTED_STRENGTH,"getoffmult")) end diff --git a/game/modules/tome/data/birth/classes/rogue.lua b/game/modules/tome/data/birth/classes/rogue.lua index 9937140199..62b9bc26b2 100644 --- a/game/modules/tome/data/birth/classes/rogue.lua +++ b/game/modules/tome/data/birth/classes/rogue.lua @@ -55,12 +55,10 @@ newBirthDescriptor{ stats = { dex=3, str=1, cun=5, }, talents_types = { ["technique/dualweapon-attack"]={true, 0.3}, - ["technique/dualweapon-training"]={true, 0.3}, ["technique/duelist"]={true, 0.3}, ["technique/combat-techniques-active"]={false, 0.3}, ["technique/combat-training"]={true, 0.3}, - ["technique/field-control"]={false, 0}, - ["technique/acrobatics"]={true, 0.3}, + ["technique/mobility"]={true, 0.3}, ["technique/throwing-knives"]={true, 0.3}, ["technique/assassination"]={false, 0.3}, ["cunning/stealth"]={true, 0.3}, @@ -77,7 +75,7 @@ newBirthDescriptor{ talents = { [ActorTalents.T_SHOOT] = 1, [ActorTalents.T_STEALTH] = 1, - [ActorTalents.T_PARRY] = 1, + [ActorTalents.T_DUAL_WEAPON_MASTERY] = 1, [ActorTalents.T_LETHALITY] = 1, [ActorTalents.T_DUAL_STRIKE] = 1, [ActorTalents.T_KNIFE_MASTERY] = 1, @@ -119,7 +117,7 @@ newBirthDescriptor{ ["spell/divination"]={false, 0}, ["spell/conveyance"]={true, 0}, ["technique/dualweapon-attack"]={true, 0.2}, - ["technique/dualweapon-training"]={true, 0.2}, + ["technique/duelist"]={true, 0.2}, ["technique/combat-techniques-active"]={true, 0.3}, ["technique/combat-techniques-passive"]={false, 0.3}, ["technique/combat-training"]={true, 0.2}, @@ -165,12 +163,10 @@ newBirthDescriptor{ stats = { dex=4, str=4, cun=1, }, talents_types = { ["technique/dualweapon-attack"]={true, 0.2}, - ["technique/dualweapon-training"]={true, 0.2}, - ["technique/duelist"]={false, 0.2}, + ["technique/duelist"]={true, 0.2}, ["technique/combat-techniques-active"]={true, 0.3}, ["technique/combat-techniques-passive"]={true, 0.0}, ["technique/combat-training"]={true, 0.3}, - ["technique/field-control"]={true, 0.3}, ["technique/battle-tactics"]={false, 0.2}, ["technique/mobility"]={true, 0.3}, ["technique/thuggery"]={true, 0.3}, @@ -225,10 +221,9 @@ newBirthDescriptor{ ["cunning/called-shots"]={true, 0.3}, ["technique/tireless-combatant"]={true, 0.3}, ["cunning/trapping"]={false, 0.1}, - ["technique/mobility"]={true, 0.3}, -- generic - ["technique/acrobatics"]={true, 0.3}, + ["technique/mobility"]={true, 0.3}, ["cunning/survival"]={true, 0.3}, ["technique/combat-training"]={true, 0.3}, ["technique/field-control"]={false, 0.1}, diff --git a/game/modules/tome/data/birth/classes/warrior.lua b/game/modules/tome/data/birth/classes/warrior.lua index ac9253f8b3..31239bc6ec 100644 --- a/game/modules/tome/data/birth/classes/warrior.lua +++ b/game/modules/tome/data/birth/classes/warrior.lua @@ -67,7 +67,6 @@ newBirthDescriptor{ ["technique/conditioning"]={true, 0.3}, ["technique/superiority"]={false, 0.3}, ["technique/warcries"]={false, 0.3}, - ["technique/field-control"]={false, 0}, ["technique/bloodthirst"]={false, 0.2}, ["cunning/survival"]={true, 0}, ["cunning/dirty"]={false, 0}, @@ -115,7 +114,6 @@ newBirthDescriptor{ ["technique/superiority"]={false, 0.3}, ["technique/warcries"]={false, 0.3}, ["technique/battle-tactics"]={false, 0.3}, - ["technique/field-control"]={false, 0}, ["cunning/survival"]={true, 0}, ["cunning/dirty"]={false, 0}, }, @@ -162,7 +160,7 @@ newBirthDescriptor{ ["technique/combat-techniques-active"]={false, -0.1}, ["technique/combat-techniques-passive"]={true, -0.1}, ["technique/combat-training"]={true, 0.3}, - ["technique/field-control"]={true, 0}, + ["technique/mobility"]={true, 0}, ["cunning/trapping"]={false, 0.2}, ["cunning/survival"]={true, 0}, ["cunning/dirty"]={false, 0}, @@ -288,9 +286,8 @@ newBirthDescriptor{ talents_types = { ["cunning/dirty"]={false, 0}, ["cunning/tactical"]={true, 0.3}, - ["cunning/survival"]={false, 0}, + ["cunning/survival"]={true, 0}, ["technique/combat-training"]={true, 0.1}, - ["technique/field-control"]={true, 0}, ["technique/combat-techniques-active"]={true, 0.1}, ["technique/combat-techniques-passive"]={true, 0.1}, ["technique/pugilism"]={true, 0.3}, diff --git a/game/modules/tome/data/chats/escort-quest.lua b/game/modules/tome/data/chats/escort-quest.lua index c53c87f661..58bb33975f 100644 --- a/game/modules/tome/data/chats/escort-quest.lua +++ b/game/modules/tome/data/chats/escort-quest.lua @@ -98,8 +98,8 @@ local reward_types = { }, talents = { [Talents.T_HEIGHTENED_SENSES] = 1, - [Talents.T_CHARM_MASTERY] = 1, - [Talents.T_PIERCING_SIGHT] = 1, + [Talents.T_DEVICE_MASTERY] = 1, + [Talents.T_TRACK] = 1, }, stats = { [Stats.STAT_DEX] = 2, @@ -123,8 +123,8 @@ local reward_types = { ["technique/mobility"] = 0.8, }, talents = { - [Talents.T_HACK_N_BACK] = 1, - [Talents.T_LIGHT_OF_FOOT] = 1, + [Talents.T_DISENGAGE] = 1, + [Talents.T_EVASION] = 1, }, saves = { spell = 4, phys = 4 }, stats = { @@ -147,11 +147,11 @@ local reward_types = { }, antimagic = { types = { - ["technique/field-control"] = 0.8, + ["technique/feedback"] = 0.8, }, talents = { - [Talents.T_TRACK] = 1, - [Talents.T_HEAVE] = 1, + [Talents.T_BIOFEEDBACK] = 1, + [Talents.T_CONVERSION] = 1, }, saves = { spell = 4, mental = 4 }, stats = { diff --git a/game/modules/tome/data/general/npcs/skeleton.lua b/game/modules/tome/data/general/npcs/skeleton.lua index 55c8b5b49d..707cd8f47a 100644 --- a/game/modules/tome/data/general/npcs/skeleton.lua +++ b/game/modules/tome/data/general/npcs/skeleton.lua @@ -205,7 +205,7 @@ newEntity{ base = "BASE_NPC_SKELETON", resolvers.inscriptions(1, "rune"), resolvers.talents{ - [Talents.T_PARRY]={base=1, every=10, max=7}, + [Talents.T_DUAL_WEAPON_MASTERY]={base=1, every=10, max=7}, [Talents.T_TEMPO]={base=1, every=10, max=7}, [Talents.T_FLURRY]={base=1, every=10, max=7}, [Talents.T_DIRTY_FIGHTING]={base=1, every=10, max=7}, diff --git a/game/modules/tome/data/general/npcs/thieve.lua b/game/modules/tome/data/general/npcs/thieve.lua index c2ae15b8e6..b734542b47 100644 --- a/game/modules/tome/data/general/npcs/thieve.lua +++ b/game/modules/tome/data/general/npcs/thieve.lua @@ -145,7 +145,7 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_ASSASSIN", resolvers.talents{ [Talents.T_STEALTH]={base=3, every=6, max=7}, [Talents.T_EXPOSE_WEAKNESS]={base=3, every=6, max=7}, - [Talents.T_PARRY]={base=2, every=6, max=6}, + [Talents.T_DUAL_WEAPON_MASTERY]={base=2, every=6, max=6}, [Talents.T_TEMPO]={base=2, every=6, max=6}, [Talents.T_DUAL_STRIKE]={base=1, every=6, max=6}, [Talents.T_COUP_DE_GRACE]={base=1, every=6, max=6}, @@ -167,7 +167,7 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_ASSASSIN", combat_armor = 3, combat_def = 10, resolvers.talents{ [Talents.T_STEALTH]={base=3, every=5, max=8}, - [Talents.T_PARRY]={base=2, every=6, max=6}, + [Talents.T_DUAL_WEAPON_MASTERY]={base=2, every=6, max=6}, [Talents.T_TEMPO]={base=2, every=6, max=6}, [Talents.T_DUAL_STRIKE]={base=1, every=6, max=6}, [Talents.T_SHADOWSTRIKE]={base=2, every=6, max=6}, @@ -204,7 +204,7 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_SAPPER", [Talents.T_TRAP_MASTERY]={base=3, every=6, max=7}, [Talents.T_TRAP_LAUNCHER]={base=1, every=8, max=5}, [Talents.T_TRAP_PRIMING]={base=-1, every=8, max=5}, - [Talents.T_PARRY]={base=1, every=8, max=5}, + [Talents.T_DUAL_WEAPON_MASTERY]={base=1, every=8, max=5}, [Talents.T_TEMPO]={base=1, every=8, max=5}, [Talents.T_DUAL_STRIKE]={base=1, every=6, max=6}, [Talents.T_DISARM]={base=1, every=6, max=6}, diff --git a/game/modules/tome/data/gfx/talents/danger_sense.png b/game/modules/tome/data/gfx/talents/danger_sense.png new file mode 100644 index 0000000000000000000000000000000000000000..a11e3ce5395355f6f1b7e1815e17129d386e5990 GIT binary patch literal 7091 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/device_mastery.png b/game/modules/tome/data/gfx/talents/device_mastery.png new file mode 100644 index 0000000000000000000000000000000000000000..11d580f17759704383d5c93d931afdd4873a5c20 GIT binary patch literal 4719 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/disengage.png b/game/modules/tome/data/gfx/talents/disengage.png index aad8af98ebd6fa65a42341e059cfa02d505cf076..e78d2f3cf111e62a1534148d83ca634a99371e57 100644 GIT binary patch delta 2465 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 literal 2839 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 diff --git a/game/modules/tome/data/gfx/talents/parry.png b/game/modules/tome/data/gfx/talents/dual_weapon_mastery.png similarity index 100% rename from game/modules/tome/data/gfx/talents/parry.png rename to game/modules/tome/data/gfx/talents/dual_weapon_mastery.png diff --git a/game/modules/tome/data/gfx/talents/evasion.png b/game/modules/tome/data/gfx/talents/evasion.png index 7eb5e78002e8d5e32599b3f5427a7406dc6ab293..1b3c6cae47c248e90e7d1934f6c0e8aa479c75a4 100644 GIT binary patch delta 3026 zcmV;@3oZ1xF4z~4B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rb0TU1e9lj81P5=N4Wl2OqRCwCuTWxGxXBB?#haJ~(9LM#XkC`kj?Fb`- zs%!%lmTd?on!$d6CaUsdf4cGyiD?orA(#;22TW5nRWJ!L#(!2-z>jJ}Fc2D5DHUwp zT0vJz*L8(<rCr*zNs}~j9LJX*$B*B0udf|DAN^Rbbmi-NZQpy&d(L^D=e(~i03L4O z&BhJB-S7@@ujhx4Mu2z>D9!<sQ||)@*p?U-Yca;fR{)7PaP9)|-!t;LWGk@w0pP*= zfHl29z5u-PcYomd-va+Q+T1;@<tT!-1=zM2!Pi*S7!!*EsiYW~OaQ4ic}>K{IG#(y z<vaNq;Je#_-LHwkk3Rxz8j|0!Y!{vt0RS95K8?q>0Wa=e!U%93*=^g540jq8j~QcP zE#`bIY79%n<yt&e{!O>+pn$V@FJ6mAfM<Rq#>b+-qkj*J@vg%sEWz?-;aL&%uWiRu z-@Jq~=YjoiF3<t41Ekw!4~|YODn{^HA}$8;!2vmD6!_jN<MegCl}Z2{|G6{gftUBn z@#Y7BO&jYQ)OX8Gc=X}(*!0)}9Z;MD&Rvu}7|tA}ShSp@E2=}A5y8=>!-CP`HduXL z{U>nfn17_kgZKHL)3yWt@`?ald}U)4+nz7r)k8~=0woV9&B+a?^34~tN)2c+5yW)S zH6Rg}<6zXWsHNM1kul)#+dyx(Tz4J7ajH?>b2>0IINXo}mZb<T3YW_@htV=JDpj6N zO(uX$2e3LP1+jk>FtAo$yR$Yty92OX?A|ww℘Y4tYSa9BqYJU~1YJ&uAQ*5LB3) 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 Ujfg)FSpWb407*qoM6N<$g6$-Du>b%7 literal 5944 zcmV-87su#{P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm000fw z000fw0YWI7cmMzZ2XskIMF-yj8VWWU&6p-~000)(Nkl<Zc-rNgS&U@YdEb9$x#uo* zZ|&99)!QsRGvr8PQWmvZ2CNvNq&R?q#6TbfaFFC74?!RxixDGmoCGltJ3ta3c?fJI zK;S&sdN6IomIMoNkOx`O0#mYOEhI(FP~^;Trl-5ByOz71B@ayvC2Jc>kmQlRr$SYo zTXp{Tod5s-ecwF-2>b|#<VQU8L-8lIL~3X%fB(It&^+?a30qeZiizgVa}6JV|4pi; zeNERE-_I?ejU-JaaUwCP1mWrCn%*>GxRYZ>imEQ@?MG~1>oS{;Ik`3G;HcsK|MUhY zw;KSi{na6F`un>$JO)XU1+s2}ZyTQarRTZ+$;I~;04>27Nn|8>0-Z$C=|qhBirFk> zFihwVBJz=-e?De>A%--?5mT>gWWD0Xi*wr0&{P4_?GTivJ4tzQvE=5>1^sK9UeUoG z!^eK}F8}YpADvD9-DBSR4`)yXngCJ>A_S^q>8gafsd?&Oe3_R%vv_R)7%dt1C7VOT z{<dLML=>5zm%`3CaB<?;oJ53JQ;WbMEwvR?OO0(MaST?*EL1_>F+@d#i!|sG5->#v zbVA#BR;vZVTAqLLfW%0=jyPC*qC`?hlDl_LP#X~UG}>x@{XN&Qji(rE{?`Avj6%_b zhNhCV)}w+VsFpm5(B31p;n)AhXYtlQI0rP=bL*bx);-J9&#sX`oJi70QY6sJCA$;D zY@*5Y2$O(}JW<>->}fV<ia56nk{W9a&S*@okvgT-4$!0`A)+OUGwzm$>|GdgbZbF> z&_#COxt9(Z^-~7JA*<txxC_sG<OJKCP2?wkVS*er$YqRhKx^@>BuWCUlN_x|A{WrA z;SE1K<LReve&;0UfwJ<HmFH*y9KfGlZ@#^(NXR>yZdcRmM|Ap<{y3vIN!Zyd*cisd z#?cuF)||5Q$T^Pgp0d;La<Xn%mNj`tBlCo)^*sNF6#yoe?Egd$v?cUw^kGbGN^%lR zqNys&QPmJ7G1597|M|%S0q}h#!EZ;9-L6LFnn+oaBBeWtc<vK()+cAoo)wbbZo=SV zME|^@x0kT@rXkuX>K0DRn%Ec&j=Bvz^>;td`qVxg0DQOLoquzmb3ff<_w7R_g8>J3 z@9}|u_B;pAEgl{pkQJIF*A&BuxRCTV5<dCA?tJZcdYWQp$TlT|M-;Qihg|;gO{&VW zv<<jGYhf~+(CL4fgCB$uN{nPMG0Zk&CPPIhS0qEjbYhrn=a^pLloh+PoGZH*m<~3$ zvpVAF<do71JT*-mW98~T0Dt@6JjSJ;3mhD^teTpYsu9YPSq%tW;%JtZRqep9*&Gb< z&VT15cwg_eBu^!Su4Xch*x4@F97>|Xp^}oc8<-3tRG!i=I-orv>eHVL7<3FVma173 zj3m+tK`Lx$`SZIk5Ou($3hQB%_n0q_>BI(S2L$Hy<&6GD!u)PUOQ0VOn8&wSEGt@7 zBaB9iiptkm8CbDq?LY)gvg}Zvz6Jn_Omlu3Gwe$?dy4&?h|QrUjU3w(c*~C$$nA`p z5vxVX!SP*Qu4;--%&MtzRMcJ)Nr{t7w9jZNi8L)W4($a&KqR4Z4Z|eiw1HK-MoLW@ zCwN`6T-WrA4!YH3MW1VL?(vZiR6O^`cX;c2w@8d3O(I-t5mw=}W9^n$uUND-bpYcl z4(2Bu-dH|30E@NdGuOWrW8S_0YTVQG3Qdwi+*z_Y*7U}Ltmi0tF~fetc%~T*Q;Lm% z9M-5ZMYal!!qZ|>M^PmNt*{bmUlL`K<$6gbPSK{rYJI>PpFGD$K5&OmfA}u%amS3) zF_jCj3V3HJL%@bL&Kjz=p=>;YnA6W6J&+OlzNvuL(C=%8W5b}Q2n9^GA}(C*v9XgA z^%ZGfaqr%O;a0-M@j0A`AP9bL|91fRseie}yMO*F%jTHFYC&B#9EX-*1vQezs${XY z<e|qizkI~evx|qv2YgdP%{8{NSbGNIyME<7<I5eQ3k|-7+BdWWPFhb@J8ac*`n2HB z|JA_*UH_r>0XowR_BDeiV)lNviye3(3xD+2ZsH#>EB=A_fZ>K_JWS|MHG{EXuots= zvB%bKj_p+BdCIux^2>kcV|?-HldoM7J<ae^%El8plQ$>qJXWwuE0$$NRRx~^w~Gg! z{CB+qib7K4n&H486l`s29=qD(b&u!tr!k}%y-`AzWQ+$BB4cRvG1f|atFcXuQwkKg z$WWL*r}l`YE%^uU{xHvd;%xH!PxScde>`RO6C2F!8Uo0=M-`U{(X#R_FV2rST$fDJ zf>D)o=aVhZ{m+-V^_lsDt$?qj!-Ed=a>KBr7<FM|19tWjMzQ9R*KJbF1YRjrxrEIT zZKTMfKpaU<OU<M|Ld1%eiW-Sjf;Pk`9Fi6-V=7gmP*mPP9MjMs5IEm5NJjjpUwP{O z<bUzE-o`thyvhsZ^Stalxhc>Bgzl1sgd=%~Z7ppGgjepUGlJP$yNq5p<obti^Qr%Q z{hI=yfPW3(d|<Km9G-aYEgZLx94{YP4(F0(8CaEpMeTUuizmzvYHVf6a*5AkB4z01 z8Cj=5$QVh43kzH*iBwAv8l^Q75W%38LWu+^4G_`FKow4jb<F9i<$XW%e*pN8fADVJ z^R9Q`q@Z=4C2NF?>BoI~D#xQZ7N?xrij}RYU4u~uBVs~`a9$t^XmriubM=F9fCtu< zXZ=bVeB-X=<6rp7r$^s%Ic;qjE^en3Lq)eI$@&pjA5EBC=(Br%M6a8WCNaIdk1;tU zEz)~z<CxQsQu7P%`w#$cesaj)eD{+aRVA7h6K7;0K?#jgnoMb`P}7!yh5%6nQqp)! zDO+-%qoT7!Y50yF^N*ISZ#94URKOS*%?u{dOfMQf@u9OloAot6_ST$pkL|L1wMVua z6VDvI%^@egVyK54lt+A_yvf40R87s%sswAvbcao`i4L$luDN^Xh}Ch;XaC9V9}*eV z(4Qt0yD{0@BX<9K!FuFzjVJOFr6Wdai1Lnd6*#zeOm(m2OTT)L#r5i8EQ`bRO+B`r z=+NIxkrzDuy@cLg!pqGP5G<BUkP3xF3PI2<O&#zAXad0mhEHZJe&hQHz{X57o@(|l z<m^9DaACj0bg$2NoDnCA$an@>2ehWPg2#IA2jK7h+7)J(N63D~mAzf!Xuy}U7YN3p z+Jx)!5K%*E1vM5e<yoSoG{J*X&|vWuEM!d^JkkexZ%*L9y+U-a1%M)vjE9=Z81^;{ zlab)UPQ+~1W40BsvE5@Z?NaM)(oRAY_Yi(f<4;(Hn{?C=lUzilEy8!vGT?EvzDCKG zrEPfjrRVPd-Y>rIUEHez&n};#Eh}WZrU`2liq<)TgjSZEI%vGbNeRLcDeyJOpr~z2 zV=Zmd;B1SE1PVd#a)*;=R$mW5swKPAm@7Lmk6lT5{B;?ZcVn`!z(*zK5rbBNERL`u zFzWS@!e9xMb%aQUs5T-}0%!>mq*oX;QUxp}nn17$Z%UkRk)#A1-UmMaXZOyO<VsHK zEwx*b$AXpf)OAU(O|Y?GDHN&K90||DIa(T8r)Yx1I1ep&>u8LJ;E}CEYlw^>EG5HB z5hu@lgB4I(&$Bm6p1oP}2Os~&?y1|6OnWfdker_#Gn*==8-}&kT)H%8d$(XRo{$ex zRP2aVLMmdS2%K7hk5B}>_f$=V(F%ztQ1R)Ho+U4Dd~(2Xa|bPBI<imAoQ9HK+o!A- z%&G8ojg^j?3X3Bkkt)JDj}Q=APep^Q0x=Ph1Ov3vlV47O`FF+vrz_9t3ZA>=`RJ$r zVzJ@&Hyt<I&`d8G_Rbevd%VYFBO~h?ib2HARu`MJeDp(S9^?9-F8ICQeU>;C>^`zd zksDk%A+s4xElG%3IcSwbDv&NhNQksSOL>+#ViA#~8%c6+AV1T(S_JAV{^69t{#aA& zrSx`U(p{)8Sh7bV;*E&7h)HxrZ6P|)RHr43p;x7(jUrAAwrn|`x7<ED;*<aA&V3@( z4~z8A?^)*e7QFcMg5FT0wk5?yL$cElPb&6)azL`7(XFCvL01y#1hNr;q^<+Cb<lv0 zCARe6KLECNH5d1Dwk~9xJ0EdwcZ12cr|6AYi;7XN%U^l)_wQ@|#V7jgT}|1)lrz0F zA|F6+)CJSvGfkl4hCgDiJd3(!c?y}4v_4?VfD!>|Jn96N%a$N5YiFs-8t1`uzC!?d zxnyIkxjc*LcVo;*ac$qQe|3YcS(kKFK)EFD=Zr?%L{W)TQ(AXIB-fB6c)Lcjji9C_ zWA0wUH?Jn}zw_C5@yOnfQLZYM<qDm5sN4~daI~Cbg{4L@YD=7LS+8sSqNR#G#0K9q z2m`1<t6EmF1*dV12M=0-E+pLhx^x(}x|;n>cx+el=(Q1#KU%P{-Jz3I3^$fE*#H@0 z%CL!|<k%Th6fy1|Vtt2NB!nsllOWM(UDH?(KEmlWmXbg~*dvrESi74@)3B~yb!Sc6 z&@`u{DrfGFY1@W4PLLEBRbzm%zDL@`VAqHir~<O}h{%KTfJ3!`wpIArW3)yE2h!7` zFx?1f{$h6+ZX8)|9Kj!b4*0{{_nE!OB-6fRdpc)#meA{enax4Xbkb#KH(@dbAC>e+ z1Nwsjk<pa(0U`=CZjNLPQs61EuEDjAz>-D%Wim6ux>pq?)|S#Pu)y*9kT?cK0<ESF z70asRs5-%~Efp==LWV}K!6lx?2Bh$W))PvP0R#c5B%*?j(WD*u+GKFC_AJ((FWy?f zr@p$<I{%hk;_YqC)+}LrD(LPNbjQ%oASoj9LQ?c=&cD8;x##YW`_2FQ99OO$^4Qf~ z=IVqi<1x;*xY}~><Ou5=$E>N#mL?6@){~%V79JNn>c%2sN4xTvss$lY))Pxj(3;3= zOr{<#8Qi*<aOtrw*`{FQLQZ^6pdwJ)iuv&hQN^rpJDSagHh?k#i$@(Q1d>SRq(;${ z4K#tz|K1Uwf5mq^6f$`0OBJ`i^c9}C^Hq&f$;Q=$^Ka`jx|{%kj@P)xp+kf=g4QX5 z^#lvfON?lc(O;r;SV|ad7!F_l#t&ayyqt3R4IM7LzDqGxZ0;AB4a2&%oE%i#E*E63 z&!Sx+l_p*pD%BzgPzo9g&bPFY1QbDl)ZZfjid@p`!N%BdVLRjEg@nltOolOe)*;O^ zRN_gxF_YmCvV_P;uAkiCJ&%6;%<)Ym7hj)oVXx2TRza3~-u|9V;z@+_EiOcy21|4I z1W|)>0ii(UkYNx)5POBK1F;l*;y3Qm)DRi)ULw6`dE9<$06K|eoJ&Rp3^VBGhEWb1 z1A)vXJ3ESNdl{n(n%N|!O&eCNW9=2rNwRbkgrZ_j({|8gC>>*)1Z!Iwxx@uU@Cq3$ zb@i$bm>+na{=Z9}=2d0*)k_JFj(SKZ@h-+&OQ(@60wjsTM=h%3kgY-{z(S&AAQFlf z{^S84kmw|m?SW*w57Pl$-HO@UkxYu1M7NB(5M>e5UC1X1I*rbX%G%Sm76?T2Knc8W zS^Gm;E3r1h%ZNxwLffHs$2i?WXvkcQ4<)fvT)vVKk~3D8?kuN&<_inFhofbM7kxyl zShWi6!3D^bpfL&S)Z=4CY-6HC;PJGzr?uan-|qvksyxr$_B?w(sr$-Z`Q`|AjHHvn zu#gOglF{azota{^spt<S!(mD{PZ<mZgF%6kHD1>U-$6Q!6cIA?xiHT8?ceWE$p#a0 zXbg3Tc<;}Ake6PpIGTI33shwaAx3*eWg`+TNV7m2Swc`4A2BcyO=zh^;P7tsy={%H z8qcbMyK@gO0)P6Ai0s9$Z;kaO(^<x~*LOL;pVBELNA;Q{lFT+c4Er&iK^LE#`Sqti zc)<Q<LO)L!&pHUHNlb^>w6saUwSaYK=}3Hpz~H50b?AOLo1;=n_8-aFxs=o0l*qm$ z83cCDbs3FgTq~iK{K?1e^3<>0cz7O?deE3`8FqFuc6T~-Cx%d1;!Vl8pRg87M2Jzs z&@BD;b_={#y&v`^oy0JnXwK~wT)tLt;bKC6&_Qa8lPh!*801~@qUM+W`4{=$A6zos z)cm{u@&r5EIi!j@Bn(YKX&cr}#qIKts%>z=VuXPx!g^1A;=VTk6dg%FljJ#U3^b!c zG3ZK0L&erC#&%$DJfc6$XmyvtK%%pNQm>Sz+8$XUNOMJ+6etnV_(SS?&b(UEK_FDd zxmgETlBI?x9=pK89dgpHiCu)(Ew(Ocsv1;-wi+iL9dC$|f`zDQOYz_UWJa<#mRy<| zF3k*&?Z8&%=oArqyPB<Y0%<fJXryB8ENvTbjpTR*bqw2E0~XZOUXt1bbf4?DBy}r@ z!dV-vZTj@$2+SN|1)^329nP8=9=ggPr34XkaVI;|p_7Iz5v-~P;|(f+tt$jAPTR9n zAI^e?NXO__lAtK(&4UB5ZaiPO<@v%b3!hrwug;`K(lwG^2c|vA_E0k}1Y2Dg3?#Cn zI5(ACd|j8uH@tA~gkF@=8KmGeD2Z=9cuQ~*8butJ1m_Xf;_Ql6gLSa76@3$<qaJ~V z^A~df?j2czXg~{Cd+M-2iWC(*LQ7N`<8_Jf0pS8|(-LIh<hc3nwt%&;uxF|8%{hGT zCie>oUmve_j*~<(?%rl&<4bfpif&i2wV|2LGInP%y?(^FCmCjt3=}rjI3E$o1{LSv zTXfVg+3eiEW-aE(wnPR)Q#C|Ujg?)5lxVGqMT%OqI2#a@G+wcsH$NB>tSZk-Rl`en zo7XgM*wqXQ&2-bSvu9|+t1SMmxBM~N+lI+@%-+7{k;@sgYX%*qC>ase0;4oi3ViGd zwWC?vA5I_eHFr?K8{RVE?LRf;9q-&ED>Nv<(Mies-un?wkL|<Z1B`~zB<9>s%wViZ zB1kgHZ~gXJ^>TZfaQSM&<*OYoU&z>gbi!~e;<OT^or1_~wDYLQ(O8cP73<Xxzz0YP z!(7uZG;yX$H1txz{+?!gGoe4wjQWaUU$L=knC_%BPSTRl=?;j}80Razn}aIv1Mu(v z!;EWhn^2xM7~Q2oaJXtHiXmB)VS+-+29KjTu{7oC{z;SX7=TWq=_ZgE$TP`CA=w)$ zW?jj22zz@e`&T+lCK0i4L^!;4oHmB*tC;mlfwxQsj-(^-NR$y|xr8*vqzVx%%gSOy zh4mGYj}T5EWP<-H8NYW3ss<f2QRJ~@O~({OS&Sx-D1-A2>qSkuUb0?3;1;@XZc@qq zRC8$>ab+r*3>4kmFziQ+dvIyy$#e1QC=-zkV`L2L+YRlyp=|=IHgIFna<Fn36_cfo zstmLaL?lV$h}wg89$HURwYV0P6}0t|$VtdFLL~TFk-TyoW;Ji|F3`&d1W{sTL_g`# z`Wk!#(OGHR1wpf_xcy@J+5lLTo=@Ls`1FkjkPa>BrjjCsZVJ6vGR+lvA&3p=ShG2@ z42BKUNzAaX2u;9rfOVkul7SMeS1Za&5PaZNR*aW|rn^Rm1nP)TL$CMBd7wLvM8{}t zv9==1X0#q$Rbr*1slnGJ!PXof*Bl=%UmF0gC9L%vEnYcH^%^44lDyDN`jT#{DRN0S z11S}ITZ--TEA}q;*xDXa6dI#pQb_LHftQahtqWB1yF@0(2`HOm5H)zkx?Ccu(ZOMZ zrCdCixIHv7INLP5@mh`z4I&s?f7a?UnWS`z)!ZS3$9wQTaB$G_;*0Aaejo5%s}?`v a@&5r(5FNWpasO!m0000<MNUMnLSTY~yiOnh diff --git a/game/modules/tome/data/gfx/talents/light_armour_training.png b/game/modules/tome/data/gfx/talents/light_armour_training.png new file mode 100644 index 0000000000000000000000000000000000000000..385f270aeb40bdc96be5617df29ef40004dec90d GIT binary patch literal 7884 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/track.png b/game/modules/tome/data/gfx/talents/track.png index 6f0351a17bf4aa1e36b2cf040d74052ec897fe8d..78b1ae58807f9c43e4ed9daae278f1e57dbd260d 100644 GIT binary patch literal 5919 zcmV+)7vSiLP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~kd9G&2MD^!xw-7OY7` zK~#9!<(qkw+*OswKkv8H+EvwSddVIFffy2kC}0$V!bBMs**v4;pbU(RG9F-5P-hN< zI5UWjBOE6RBO<5+Bg>#iR1l&W!2>Q~i%E!C$ewh%ySln-uix_KkNc{ts?%AJsB?~W z&hK<p*ROu>y}RG<y;lL6KjD{Ce`8solu$z{Ll!09sT61r!U|}Ail@XtX`p64t3#}) zo9;31^`!fi*@LpoZMyYmO353gTJI$^-_^IE%(<E#tbke#Dm7W(sedu^!{85qwm`?h zF9QY8;}8I04XTeoB`XUx@7C=B=NwQ25LST*SROD47Qk#!5ugMNftLpo5a|XTfGU`0 zb(u|SpbdgNs61G4IiSvhs)92QR1$0t7?Jy;Z9oQW8&n9k16CI}KDZUIlHi08DM7d! zp1ZwS0u&@F5IEp>fS(2@Du)ki;8lU`;GPK8r$L9U9Mx5@6zFMSTVPj&cw|7u&B3}s z56R!C5BMT6N`dM!pHraPL3PO5)+p!>P*HG{NE$$N8ZZD(5rSC|_kldvHLw%lCV?@q zLvUw-YYQRl0NkkjRZ1jlLIvU-pxdFA5Gkk)Lr{e<0RKU7XMh(2*MVBlYB|Dju(yDk z52{yGhAvRuh7e=s{+#)4Hn0)Y2qGc_pd8Q{;j~>8&U%l4bqsJKM0)@iR0-T7=)Am- z#eiOLOF~3D2W||gKs+TZj<$gtio`@*QRBM0J9T|Y^n;!*-0{basCZD(klhZ$zlQcC zI4;yGlhoRS>N-fB1lDx0B8c8NMqNs>S*oBiq9P~}W1{A&+Y!JngU-R&W~i=(^s^9s zE4cF^k~C^i0;?kHL;|ovS<6j;>w?`Osu?MQy$ReUa(Jf(*=-H}O{hSZ3l&E=;#pA5 zfbWCjL3<R+8b(K_HgGzGS{dwJ5Lqmn^NL_+WQ8Ct#t27rp8!<aa5QEJ;zG0r$`-qz zE1)XE>9Hc@_d?H1Xgd>P$BE#C4#X0G4bC)hGje$CKqLcXVfUSoNy6-7!AXF<6YjrP z#Ghsf$V8wm4jxeRp<0E|he`mP3cI$OA5GyjEgRf8q}ss>ghLU)av|sjD+g*!#N1Dc z9_oxSkd~2_94KF;AQFMl6_M74vq2vAZ-z<<PV5BdSg?~uzoVi$@q+BpwZZk^m9N4} zFTxq8LplU|6dwHy_+i743jq{#c0<qsz6(`HEVW;TiVM+&vWPc@3se?FlQ8d%5M3sA zMAg9e!0HsEq(V82sz49|MdRYSjQH<?;29Ww8Tv02TVh$@IIU}iH7Jcj+=jM<7(F)% zjxA~!je`>b_QS@n!I~FD-z}g`!!PfEZM(&;wZs8RL3=_z)ok!O<ltTn;#G+DLvJta z*#=?QaDTQfI=A4>ka;gSvmvk{@Qi*&AhbaB07;Po?FoTs1FIYKn7kj}3_G{O&M(8# zC6IhuLrh!Ltp=TakQfm6=_rW#qC!rGc!ss#gr7ev`%r*mLH7Hw>Y3KVw-BHw384+u zGSn>al2D7wLy9)codJ8dH-2c_V8>zcn_=Jsa(F)qcn~B(xea%zLI~oZ5~3bTiLMK4 zMEtjmH8%JB3(&V43i&AlsSr9d5OpDv0yPNkfJjSNf~|MKPktt@TWeYC<+bp{Y7<cD zgAgDSirAGs*s%)IZ-TG~0#^*p+>>C<^H3@ngQj5VNwD}+5XL1~@k(Nlut7(`stExD zEr+)p35Zlph@y@0(>d5XXgI9J2=3iCbs(t}bhzLIF#ID}{XKa97a^L0osYr8-xn`c zKd9EQYyaUwVJ!wCH2_f!*L@cJ06z9lFmMjEDR55%=e|Y&F)afpEC+Y1=yec4`%JLX zq6VSiyb2(U3CC3+_qxV#`Y~B|WUX+vnLAU7zfurWkV$|u40n79Dk1EA2zqD1$~(mN zgyCz<1;P-vtcBC(!K*Kc7YID~{7rDi58(Zu27AEVY;uIbEPU%$i2&;{_wuu0*$ogz zjN!9E+h9dOyTbhduu4rn--5MUCPkNrcxBokrC`-PQ1V1={_`6~JHpp?_yz$2xaD8q znmv&0fWQ|CutHe<EIj>gxa<Om*v1PQcNm0nAY}-!^<_Ax43QYr#vo#Xq5!c8^~A=C znlRV{--7k)j&QdcvN_oLBz*6O;-<s!^`)~DIhj(z4Q(jdEP~BhS8xytTS_9uTOWW; zFTm=D;F>Ri+YMF%d@UXz_jBl2C_X&2p}G}5`aTnP90B(%)d*u>E4Qb7UbD{mf#~vN z{nHvkeelEA?-{Sa%TK||TVdm?;O~QU5i%u6Yp6UAH{A%2|2wp~kcq*F5r2JzY^?9& zXdJ$U0I&C@5#rtXW$-+CU)T$F2_iMHcEJ}uAr|_(Pr&p41rZ<C{O{C6|3kg3qxmr1 z#GNpNotsP&Gy-?t0y}d;9Ipnq-3~9_4?lYH=yCJ)Fz={d3UtIlUwjVwhu=Z}&HK>t z7}~bcO37v0Xvap|mVEww?BfWp-_L_>3*Fa_{>m57@u(bD@kc%A!I;(RMd}v6j=3F7 z)SKleJV?-DDd@0aG(6C=9F3P!t@}OFSMy#b2w+)~RoQj}AZ;c>b7)y#P=}2uu>R2I zcw0@vL66FzO$Mq=GG<$5zgFWglL=iX6k7J_n>Z&7n{olifsbDer=9|F3*4E|*9Yw# z2KNItY=B}>9@^OnJ#n~mC4Bus38sRe)s-Gij@N@N%aVgTw(R+qk3)YFGAF{qh4A7_ za=<VYT*3Ds9*1eu6w{``W8a36g61=~i9uF?wk*NcHf;fm#rVMxT5EiNANhhDC=r*% zv)K+DXOwh$5y@o0h7B92ROI(NpM&engFU|?8L!(_S&aibF8tLBxbSL7wZXi3J!G>( z<nu6d7OY(h<+7}+6htGCNF*4TzKBG87Q@3^Aol{NuYhW;i2#X&$)SCiGY1}j09Jkl zezQ|V-3I0>Sn^I7m<|h$hqsxprlU4Rs>Tj0?<;j?#YYMv0|cO^od>#i%;Blkha zEa7ll3VOQb`F2rK=)HU3leb8w2(aJ;m^lDT-Uydmtk}E<bl5?DPnHi}BhhDr0C9Na zyF#(e&%-A^1C@#_R?n;J;#b!>%lvQ299X$hu)p?>zo1mwN2$1)<!8zwzIW&-@?eLz zZ2>YD%!P*^gI6}nnseqrZU<ccmyit_aYtaX%`j-xbu3GyCK`eJ?gkZ846f7s-A%GL zr`fXWnxvPGZ^XE1<MqQ%gvP!kIkpWiZG$t;6QbO6$9I@}5)2H$FMb85zNvv6AE_iL zB_bb*z<F<n&)yC-Po(t0yWpWG8u+Ad?9ODv8-^ysRPx?Z;OD`PXtr-_RGX~kXeitX z(|TaWoJm!zI{X!Z$L@u->m{GJEV%FUu<8dey-f&q`8Apw|5j72!oI!m&2P&=T(?2M zBjS7%RxE>0-wK)Z$)wZp{)^!L$K=45zefnX=7|QUAO0V>_0zJRZ5vNz+;pg=;G%$R zu|Y6vqPi2pwqZ!8p{@NuBNU0igAYU44bi9+NE`=d%@=(C^LNYUeII`I0$jRS3}a6> zJpP1;vTYwcwrE+)h3l?{+wO$EzQt6k&vW8J7^?|4-}N?FaS?3V1W!KR@CvhL!9`cV zuYN2dUtdqvYaa<AY~VLSKx-lt3}NqH$d1DPN+SlalpOXm*URQQI*lDL*No%D>Z0KO zm2wE*hxIl1;!QAp1|*Yk|7}9BLrH;U+;JoV*W3V^420p!EL|)XI}BvaE3P$Qh67#Q z#y#4Q8-?xL6kW$%#ohm*aGi#|I`=H-=zy-S9)?F7uH9-*V!rh)(Y1+y!vr0+1D9Pb z6rMG+QE^pBL8P;DKJ6LkULeHLTHN4|o`J7@4n{^Gm|-e5hmZoxxVi_wA-@?Jfh#U; z7*Z76YzULiKq?L0(;I<XGzyt^jpIDWsb}g5gKa6;u^GC1pto;`Ku=ZylV^{FFwife z+wK@n8{-#=$^w2Mx?X?n*{|sDZ>N7i(cceOTq2tZ&3$*=2YXiwSMRx3M75=4-Nb#{ zhBqAx(Qe5Y%Omjf7h8?-adTnL?6>2(kV^H@(bI_ZX3v(ZSo#gycQrhfZNt*V@X7{J zp&vgj=hb==AQEbbm<N6J1`&PRmd)<pZ#Wr<znuv3d`%d}D3>%NBTyV|GO8x*yykXO zi?>BL9p^wPP^J)a{l_4YNYd8_@Az{Aa_WYq{@F9IWy?>PGds?V8T;r+xAqM99_-pB z;$A<z<G}e>h=e`&R3lP6fB-=NU${knyx={sbe@Q<Qc@)v7=Tm?hK3t1VtO|W4nD)s z5bW6l53g>(Yt3$R>tkYIf4bTbz&g<KyAGUkHaM=!U7u_CbIaHwfTy04&97fq2B27I zO@xMqA(MvEmPQbD{bi6$K{N(8d{m5J-6gj|V!p)n<)Rp_hgQMTq-^Z+iy;=3duPpR zEE=(4ct}Kc-74e4BBCzQnEZ{n@UM@;oVn1`2W^fJs4fMT@%taW3P!TM>>JE+*MG~i zqON&XME0>`1Zr8aOXZR<q#4!d?>m{kKKRhz%i%9x4lAyPL=px!!k|fn(34tZFpyTQ z1}83tU$24ocKF7#z&7~sCt-LP`Ui}UH49eC(A_N?ik=0R=S1J;Es$ECN<tcFk3%9O z>T}t-@byQ{M(QE24Od<T!?i(T30Qfv)cJ!Nw6{s2WYtfln!Ig2%sEX8Euq&iXrYEe z={Ics1zfNKK5{dRWTCCi#nT>teQl#|pqYXIbt$M;;FOc$rw>6b1M?TbS04~67K^Zb zyBMXq7wDP;<q9lZ2ASC~tylDLBn!1F<SnrJA*Nwu6wbX8?)hFbByEu13?$0n1&~=N zYgh`V^}}%;@P>0CJ0kmxMdi1<_X^`sQe7I$)zIy5{*@3ik4S7Qn||qW$>qXae-i%a zOa&HrCjLL;Vp!M<|NJQ!cnjDr<nwaXQ^~O^#B1{Ke8CW9AC$Mis~e%Jz|yeiWjOt9 z(3O<DgJwKm!^P*q=2xW#nXzHrdMITfmXzLwD&qP|Igx@?8;lj;m(PjoR*00u6SB{a zF4*|=RxY_x)U)Qb>OKedYE6ykIK~syL(7<kg5RKeJql|EB<hi6s1F1s>c+O7E^FN= zg*(PJOynlI3H4E}2unS93xdX8Iuo*HIcx$yf+oObiXw_S9AMM3f#${aLB4Ogr@7T` zvZ_r6OzH%$x3V?2#c>E|Zh}xWm{5O!Zr;b_-~B#O;iC##s;27*5$VY&vr+=eUUEJ< z;-W39@!e6a3molNJ)WpXq(=gt)TN-goL3Ks-uy1O<h<6L<o`7R>R`ruFM#<or_Lc1 zjUXywkR#W`3{D+1wZ%<`F?j3yVCnG<0y)hcA4)+I$cKOYYE2z|y5MYh%h~YclT9tW zlS1ev$H1v)NKh04LwjN4dKladr3w@kELaRx3)b$CE;F@3Jdsn+!sg6@OD~0yy>Q<H zM<3OFO@}w4-<E<iFEV)JA@;I<2YldU=s8{5@N@`g6`_`cV&3#ExlkFC_BlJ+9EBR) zIb%6=9|JSzHZrz9mfkxqB-8MbYrzX)s0`!!&_#}${sDG8E3rr+fN}uU0CEK=`%nxZ ztDqW@ri}^7SBje*8<w35GnPnHH$4Sw*0icYbKBa{k_<(w3$52DVsW_cMp*Pts7Qk; zYga+BGIbTIPK2jdf!+(5H$bi^z1gK2lw25#ftLWc9ST|4@{CBz1fM+%asiC@!`x*J z38-gkoo#UKjfY2dUX!TXaO#o<(p<+KFMSWpJ`XB3B>JFp26S~Dx+-0(O6mRaAHw%< z6z-SW!0QvVTBSvc3S*$llgi`T%mkErVRRhEGB9_bk+DVNaLGqt`f^yhs5O;+U6mdi z-thrA`3(j$bl~JgaPkMC>PvfGNkI_-Y4l-A^S&=(?@R08(d!|*4#x8^?!b5;e+wxY zYd8QCEGHmag0W%wQFpJI1#n@>BIrE_Mu8K~1X~>*+*F6T$F`w64VlGoqRBI+wZnOz zkS5K72L&6(Y#4KdAV=~F0!h%eZHMoE5{7;a<0UAL3qkWqC`TF*pjF4$^SdE82tx|8 zK4hjzA`*$iG0P!81jP_ir$O(urUL3g4&RxCW9N!UtEmDU2aaDT9PT{{y3%mbhoCeQ ziY^r5V)zOU6mn9ev5&9<tTp&G7%#$;{{}n117oh_Fr_LK1}9;HT0<@m*&Q$*iY@Tx zin}=FG|+P)mx1vNlu~f&a>>OLQ2|7zBESiYV8vCCj88!*EsfN3S3p5SwI440M{t%w zK7g??7~Kh@J0Q0Y#&V{RZvfgOwXmU*M$CQBLGc+VZiV8YxW^ViL~F>8fV}{m?K0(I zCE%D7AaVud64L#x$Iax%J7E4AnE6)N{Vc5C(AwwcMj@7h;(R#ce0btvF;coI!$~E9 zV}#2p0(u4%<6xB`EJ~ju?V{5`Ra)<y7^D-B-GBH%ZRQMUTP6*j+JTY<q-7Su_Zs%Z z25v?{YPpQd)b@)<@Vmf09=ta2G*k;vNy^-Smx1(2z+CV~Veq%o-Z}v?Bw*HAz_HTL z>+XSl`x`{EY?yrvWX=|AU3H+Mpc0X0?WzY=SK4;VRjCQ!!}LEBxGlTG5a>|0Ae1(I z-3|U6@FP$wf}e%jZz2CGO+!;iAHL;?*pmTUgBk)g4t5(@1K{RBk4mGXWqJzrtOGL& zWkb*p<2mUFO`i|Fdtl$7A%X?z1;(#?!WqW`KPLlQ+JbPu)Dwe<3`TG%cm-fs2B0V& zngE47l-7c^8ItXgm;=@+p!=kQU5Ar;g{!+k9Vgx1&Mu(SxWR->Z8&>CkAPj3w%MQ} zP0yhtcAz}T!jI=5GEXMS=zyMg!{FTw-3#YIJ}X65+mzH8GIK*6pm#xFNx{~yfbNAb z4PLKwsUJ}*OaNg)jA4EV+_eyMMKW3-F>RtPm6P_>S`qAaU^m#a<-NZP>@o1#fxHYl z=#=RVhzdeGVOWe6ca;n^5I}gWl+ku?f^-VXDX8W}+VDY*3W!QlLRHld{;SeSt`i1H zDhW|+rwPibgD5VfViG!+3$3|>Hj{1DD%8|LFu`iga2(K`=8J_;Ym=T~D=vjm%aiG= z0Kxin0Coxq5{&p;Q8REcD)$fq1+XuK&U?X`1C<!)9@9weNvet&(6n}l^$u(Z+YGUN zc}!pn((J@URooavXMjB)I05vdz$>j>K4^niGXeY#`J@su-xt`TZ+0gHoj_Tpxk6j! z3aJk>>=hAbM-#Qv;HSV>rdxcU+^>Mx6{6>rVX&&A%YItsiKv0zFH#efL^^a21PPff z2n`}^bwgxG4z5oJJzHx3s%VBXtX89Z*luxvV8n27k3nqBxSKu>f+AS^A&d$a^bpwf zVaFU;ZA~Jn<(|q$*=SfbQzD+xv-t*K9fM#{+z>k;>@b6u<KT^%9-pY}E7&N~p^PXq z8=RzAcJ0akR2B3vgsCHMy>GyWCgD+0pv?p>WdoQw5*Mg~5#_*G;Yi)mK$rusY^bhe zh{}%21Q`aT&{a_nJ8I&LvJh4)V*^rV`m`#^ib_jvAC5`<q0Q9j#9vdA*T%n7l`Hgw zfJfS!*NU;I-z}-pYLd=b{9$L(U&mUCKk@PT{{vgAFZSZG@vi^?002ovPDHLkV1iS8 B^u7Q9 literal 3946 zcmV-w50&tVP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph% z2saKzO}1kI01oO&L_t(&-rZVxaGd3N|GnRR?0$Po+FePj)3RJ-uoZ)eL11&(V2*^N zr6mkxN=pcx$xs@YHUlkWrX{5Aq_oo{Eg5JbgvMZkLu&}wj<Lg0Ffj%p+p;Xnpxb+C z@BOa+v4>WB=)#7y?|5wQ_r2eK&+mDD&-pI!e|!-DV1X8Z1I%joCxBqd6$WSl_-dO! zPpOl@2w;E#02^>OPzM+lTWR1G;OUYpCU6CC5ukr@0BGPC@EDNF0U!Veur+qC0xUqh z@KFce1TFx?FO)h={$Hx*js&nDm;}5))7)D}fR8`JyH(%~;MAERAye}X3+xBB1ATyF z?yU^)YoG_<mi0~@cpaDmE&(n9ym?PtV1<DQ&|3Hy1hhPx02#OxkSlmL3cLpl0FxDr z4*}hPXSo*G4~zmwf%ky~;0EM*VI+Y601`kq0ALh&3JA?lApq?F4VXZ-;+6xDmZ<eo z6&QthFa<mhYy&20Kbr!c1NH+d03ZfD3ydu20{|KUd$sE>;OjukQUDA9{|<~5<Tfkp zsn&Qf3+w=PmuTS^z`@1%001Z8otp#zSb^Js)k~yJKkzDW7`PTVw*mlNLl6zv3G6CZ zPX+b?ug!UUUI0AM27FX<MFegE)-O@|EN~nEFb+HkbOGUtP{J0%Lj<TV==&95XNhqJ zfOmk*oJXm0rv7%W%G>gOo{vj602>z<G)mWL;L{Qh{-^=~ThQd&z`p_!zy$UH&(9Ti zxPlJl7Dxlz0RT4xs{tBl2CP5?0B|mF4lq`*psONq)mkG!bfL`30%O2Sz$mZ}a01T( zsYT|2G%y8tfG}_xhywovYy`FfE})?RpdUC|5=L$XE?XRcV+++C9H0U(0;2$cUjk-H z?q3KykOc++35Wx~0SrI|27!+OH;@K~3NDo`{851>pa(F37{Jx$RSI~iis|R9dcXvB z6~b$_THu}!0DuIf0jd6z`dBztn*1#NmVglm2gB9hx(?_E_5wX6-edxY0IrZIMuGoc zNFWn9wpf+d005|}Iun^Gj~|(A=ya(1qYfYdJOP{rHk6bVgTTK45ugX4f%k#87Lp>h zD7sf&)bh)y3E)ZKBoGCPz~jIRKoHmm>?x@BY<3RJ@*kZ9CJTj12=D?X@EUNq5H5cK zD8TSpZw)^4(t(vgD=+{&1EfoW@)00Ztxx)$ut1qLV!-ni@jm)_G-qdGS%C@Qz!%lj zms*4&0#AtokwlthDTbj81FA+Rl6o?wCzBb&sN#}}P0@8d5l@^MRxm^qD2q&qBE`^z z5NNuY&6vrwkxm=wjH&BpIRH_hZuzRSr(5ziuyt<MW~C*G;#fk{#4t=%Gm}Xp7}8FD zk{KA1-uocaKM)LsqNaJq;tNH=ThFatC9Yj9cXtYne$JsVqDV0e2qBtgX0k>iVMJ#1 z$tiVgGJD|d_<y|~HBB?`1ENUXeMjA@t~rgmX~Hl}LI_3W`<n~bSpX!G{NPCQuD#NZ zoyU$GJ^mSCunbwdTDti<=Vg6Lpo!;LQYHWZiXvn#SA6x{u02s*FF3KTn_1Na@b00+ z>-%PcVJ#BXk|{&eOqwEsK)IZZub%B_6S_NvCO>yx_sn_SGhe%@=b0Vro_KQi<mBY? zr0;AK?)l@o8?JUZ9SneYLO(K?IeI*Od^j^XrG}zfHe(v5$#Ik{QVu)QP{&?>mA$o@ z&t#1pwmbmCfU21QUfmOY^zrd|*y(aG=ba;6bESRDCR<be$OC_hzAv5g(4*Wt?|rhg z=s}ZfH`^clb6;17U>F!Yk>2@g<dr?qfn%vy+$d#vnE-78zO|Xps(Hgx1pua+H34v3 zm7+|RsO}Xa#}dOZZ3_L?d+~35XXJ)E2A_KFbSiCZ_)_GFZMMyu8kR(xJHO`n=f4Yd zbqG_Z)khy6zy7wtzy99n@JPn*<qX3Vc&arphfaA{A$bY2*|`Wgmb~y}NBm^(KmKiV z`CO|@eD=rfyI<&XIvAEA&;F?Wwe4Mf7g_=E9Qnf=Tmx_R#837PyxDW<2J0gI_0C&8 zll^PrCwt%6*?sYPD<NPR@<%ti4!-_-Klwo`0AB;Ud&kOc4>vW`&6&5!GPV1KuK3B` zzq#K(rxwbp=ERf=z+1<$%q;GXR^f+_1+Lp{x5)X7AqeEcb(SCfeanXPEt#zOvmL>2 z-aj%tl4<gBk3H11vQt<Pz~+s%2k-OAGWDDPiQjqe@cy@Brioi`a{a?2O<f&A?(Kw- zIu~=-?RDRKsL7_xCM&B<yPOPw(eZ3~F_*jKt!E{PDyr(6U$5&uw@TmD?C1XC9&ZlS z-UBoDKk~`cX?0bX_?O@E$?|*!VoMYMoqK&QC-dPz>fQ%W9UDpmXbtf9-qldlQR%vV zi~YuHX6I@yC*!a&x^9k7sO12T4P{IdjXuur<%*%|vWt~kqMW}*UbP~x?^pIjfAHf; zO*60EY`@`Z$2{b@>vqq1=Sbm*_VD*dKR%kTq5IZb+gkWqUc2=QJ74h3743rEMn|Ih z$fucd0R2Z((?QkaV%GQORbJ;|+^(9%lGQ@{eOxhMKlR+{-TP-ami)<Wb!EgYuHM!1 zAAH3L;OXtb*Y?f!9<2eM)E*Qx`8bP(20#e<)>~<s42@(?jaE?T<f+X2hm!!Vzsg~? z&^b@nw3<muH_XydFcZ^%_~cY9uCM8luDQZqRsFZ#<f?PC$A{BDd3L%qP-Zgo)vH-G zUput5@R#=~0N!{j7M;<{0i@E#^S=zKnt9O$*5AL*3E<Q5?1@vEng!^znqzQr9e5|c z_dtvg+;p8ovC@?}Ys+Oe0NZzlhlb~T?FaqIbZrbD4y0ycI?s{2Z?9_&@KdMNov(ze zcVxSENB8WX;W_eG_j+%;*_BS4KiwY8W$4Pa<K^(s$#l-L3`1CkWU|H!FNd<Kxu!?1 zbp6ZwltwQ%F{Qrzs|ZDbWe82@3xosj#NT);R`o5@LG7o{2dx(R+kfW0{T4TX=Uxnb z(4VT_4@775?`|7w_H*4U#BGl>Uw@V3-QOmT9#8jlmmg-##B`1&58mguS!t_<vRG(_ zCWc{3B4rq+EK!$Ttn587%W_GiuDH~eOC1m1=Q9id&@^)<uE%0}WJZrfbyYJ<BY4p` zeHU6De!$<mT4EUT>fY$%|2A1lzj7Zv^ilE~-yV770sn^cEn7C(HgB|5&FYGk{>B}3 z^ALCAMOL?yIUUk+AG<n)HRnhG9Cl{QCfnk3_N8C8=6Ih>89#q1^xbXaxqLNWM|SXo z#BKMSxb{l>)tB2=c8G2lBZ`z-@a9<Dn4DH;VtOKJB$Gxgp(hf?OkCGA69gPf6bo&& z(lkXHeOwVhOEW)sB7N|%9*Y|@F<m!I06a%27D|?Bi$uvXEsK<*(D9@Rz%;3>YNj(r zGHFaqsfRyKy|^p3cYipU(idoG%IXW3lWC}96)T;|ng<UhG~I0Wb2LMeNh6guG|g01 zQ`1eum{X-OG+36(W{sl%hyq2?P_uJ369S4N3=M`Q9LtCzC(BAUi;+`ff*`D0*GmyI z5($luPldu!P5S~570=vi@HVuxwVa{3(3$9GDQ0N`WGz|8Mu%V*ekTAZKE<<YX~%2~ z&$zl=9anWQ0#gM5D-w$SoTTS0T*uZ9xxPGI5Q<PtMF&{~ATop^4Qm>j`<iomW}}d; zk#1hk4eiM!L&n*bo}#IiOIutkT;UVtV`E<7oBNsto1kShJ*(>(z4*75(d@1E97xv+ z*QtG{w2YQNsdslUomU9FLdFiMp96q~wGEA5ZmfDM9Z63ep6dEam(o~X2$xO|iYB4} z@G{lDNfcc?#d3;II@{9Q0=D)m+i9*QStBPSho3$?-9KG6?;wO!Qi}pWSdMd_N88rY zwzW!IE1_pM(JZa_6++0e#g*I=!_N|xxAC1@I|auAjaw?1>i>EFr*D30XvWgU>vEmU z$+N#8aIJK8eYJ~M_+`dPLj33Z<%YbcQY_VWd7Gonv6yGoggW^0;Lxvzw6wMa0KAQt zTzM98RxWT!z}{kauW~PQXk}sDtK7EceDUKy-|t)JTf*2|)kl6ka^%G$>1cYf02rRJ z_$;~qH(t<a57+^C*Lqort*K_35UM)ItX`|+ksNIfLJ?=Dv+eS>rDiVEFvky$_y4Rv zJ|17}2~E!Zl_tf1p+8qEDNTyA)0vA`mHyypb=1m7jy4BHQ&ykV(eCKDs)MsG@8>ND z9S<FT=5X*xuyTx91%Rc&!rS=3B>};fcQuNkyuDtErR)K_qrIHLN|VyDwZqb2sWhg& z-41}a^W8UgD^1FxXXNE~8J>ZG;IW{V(iT485bQ$W;y{^F9c>QZI-h@?KYSt_Ivy&E zGqOi+-_qXypZ%pTkm@8$y(O2nBzKMIY(n<PN<f)-f5NObxEEcbf1Tgi=@eZeE3%~# zvL*o5!ZvMaqFAa-ot;}d8J<xSD#cL6=ti-W=n?^VR(YB)Y98J_T$ID!VxPxzihJtM zt=F^q^oP@0rb@KQ#<Ib|AT7|W#8&+_rfTdX6+_9q9RblTauzNf$%h42Vso`2p-A(^ z&9SlAbpLct>y>1yT<(=_5TwItR%WXL(6f4YC>%Z!9<hx$JDv5b>uoJIR%DldM#fut z(J2-I@Cskd8?3~3Z0Sf&B@@#L!68)E0=3xBN~~ZLQlZ*s#U|2`^w_&&6Ne_OK5PBz zdRAghn9C`rX`U`7CIF&Cr1{yRz~Z&EZEmAkT4_=ipZ;i$7Tsbg1$Z0p?e)64TxB~A z)rgKn2VWjM`qEJ&Yb^7W((1LAdT?11s9#+lAB&4_u~u@ZY6saP17HM3X;M6^JgzR6 z?2$*`9St4}R-TiarddqS%K;!a$TUyu865<YN2)C7TQ;>U^>p4Au(fPz@pOBvK5NmW zl1HLBTF=ba4KD|P<dk@YPfjPxOh5aj!jiw%(dMXhdeI?r7A}=ZEdW5z=#w8zvKDrc zYBMy0AV0;A3`bJI)LHs9grT0L&V(#FiJrk1{eNBm3(0SHoTaT`#Q*>R07*qoM6N<$ Ef*%}VW&i*H diff --git a/game/modules/tome/data/gfx/talents/trained_reactions.png b/game/modules/tome/data/gfx/talents/trained_reactions.png new file mode 100644 index 0000000000000000000000000000000000000000..3932fe977a5244c45cb0ffa65311379292fa2038 GIT binary patch literal 3413 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/tumble.png b/game/modules/tome/data/gfx/talents/tumble.png new file mode 100644 index 0000000000000000000000000000000000000000..f8cd3bdc06794e0dbc0690fe462d394d7a8aecd1 GIT binary patch literal 2175 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 B8Lj{T literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/talents/cunning/lethality.lua b/game/modules/tome/data/talents/cunning/lethality.lua index 8d0a2e82c5..60f6081595 100644 --- a/game/modules/tome/data/talents/cunning/lethality.lua +++ b/game/modules/tome/data/talents/cunning/lethality.lua @@ -23,12 +23,18 @@ newTalent{ mode = "passive", points = 5, require = cuns_req1, + critpower = function(self, t) return self:combatTalentScale(t, 7.5, 20, 0.75) end, + -- called by _M:combatCrit in mod.class.interface.Combat.lua getCriticalChance = function(self, t) return self:combatTalentScale(t, 2.3, 7.5, 0.75) end, + passives = function(self, t, p) + self:talentTemporaryValue(p, "combat_critical_power", t.critpower(self, t)) + end, info = function(self, t) local critchance = t.getCriticalChance(self, t) - return ([[You are trained to strike critical areas when fighting, and have a %d%% increased critical strike chance. - Also, when using knives, you use your Cunning instead of your Strength for bonus damage.]]): - format(critchance) + local power = t.critpower(self, t) + return ([[You have learned to find and hit weak spots. All your strikes have a %0.2f%% greater chance to be critical hits, and your critical hits do %0.1f%% more damage. + Also, when using knives, you now use your Cunning instead of your Strength for bonus damage.]]): + format(critchance, power) end, } @@ -118,7 +124,7 @@ newTalent{ end, info = function(self, t) return ([[Become a whirling storm of blades, increasing attack speed by %d%% and causing melee attacks to strike an additional adjacent target other than your primary target for %d%% weapon damage. -This talent is exhausting to use, draining -6 stamina each turn.]]):format(t.getSpeed(self, t)*100, t.getDamage(self,t)*100) +This talent is exhausting to use, draining 6 stamina each turn.]]):format(t.getSpeed(self, t)*100, t.getDamage(self,t)*100) end, } diff --git a/game/modules/tome/data/talents/cunning/stealth.lua b/game/modules/tome/data/talents/cunning/stealth.lua index 1b8c704311..ae3fe4af87 100644 --- a/game/modules/tome/data/talents/cunning/stealth.lua +++ b/game/modules/tome/data/talents/cunning/stealth.lua @@ -152,7 +152,7 @@ newTalent{ info = function(self, t) local multiplier = t.getMultiplier(self, t) return ([[When striking from stealth, the attack is automatically critical if the target does not notice you just before you land it. Spell and mind crits always critically strike, regardless of whether the target can see you. -In addition, the surprise caused by your assault increases your critical multiplier by %d%%. This effect persists for 3 turns after exiting stealth, or 4 turns at talent level 3 and above.]]): +In addition, the surprise caused by your assault increases your critical multiplier by %d%%. This effect persists for 2 turns after exiting stealth, or 3 turns at talent level 3 and above.]]): format(multiplier) end, } @@ -163,15 +163,15 @@ newTalent{ require = cuns_req3, points = 5, mode = "passive", - getLife = function(self, t) return self:combatTalentScale(t, 1, 3) end, - getStamina = function(self, t) return self:combatTalentScale(t, 0.5, 2) end, - getReduction = function(self, t) return self:combatTalentStatDamage(t, "cun", 5, 25) end, + getLife = function(self, t) return self:combatTalentScale(t, 2, 10) end, --12 @TL5, mostly useful for out of combat as this won't do much in a fight + getStamina = function(self, t) return self:combatTalentScale(t, 1, 2.5) end, --2.9 @TL5 + getReduction = function(self, t) return self:combatTalentStatDamage(t, "cun", 10, 35) end, --29 @100 Cun, effectively about 40% weaker than Automated Cloak Tesselation with less uptime getDuration = function(self,t) if self:getTalentLevel(t) >= 3 then return 3 else return 2 end end, info = function(self, t) return ([[You have a special affinity for darkness. When standing in an unlit grid, enemies observing you will not prevent you from entering stealth. - While stealted, and for %d turns thereafter, all damage against you is reduced by %d, your life regeneration is increased by %0.1f, and your stamina regeneration is increased %0.1f]]): - format(t.getDuration(self, t), t.getReduction(self,t), t.getLife(self,t), t.getStamina(self,t)) + While stealthed, all damage against you is reduced by %d, your life regeneration is increased by %0.1f, and your stamina regeneration is increased %0.1f. This effect persists for 2 turns after exiting stealth, or 3 turns at talent level 3 and above.]]): + format(t.getReduction(self,t), t.getLife(self,t), t.getStamina(self,t)) end, } diff --git a/game/modules/tome/data/talents/cunning/survival.lua b/game/modules/tome/data/talents/cunning/survival.lua index 9db5e8c9cc..0d9ccf049c 100644 --- a/game/modules/tome/data/talents/cunning/survival.lua +++ b/game/modules/tome/data/talents/cunning/survival.lua @@ -24,27 +24,108 @@ newTalent{ mode = "passive", points = 5, sense = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end, - trapPower = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getCun(25, true), 0, 0, 90, 125) end, -- ~90 at TL5, 100 cunning + seePower = function(self, t) return self:combatScale(self:getCun(15, true)*self:getTalentLevel(t), 5, 0, 80, 75) end, --I5 + getResists = function(self, t) return self:combatTalentLimit(t, 40, 5, 25) end, passives = function(self, t, p) self:talentTemporaryValue(p, "heightened_senses", t.sense(self, t)) + self:talentTemporaryValue(p, "see_invisible", t.seePower(self, t)) + self:talentTemporaryValue(p, "see_stealth", t.seePower(self, t)) + if self:getTalentLevel(t) >= 3 then + self:talentTemporaryValue(p, "resist_unseen", t.getResists(self, t)) + end + end, + info = function(self, t) + return ([[You notice the small things others do not notice, allowing you to "see" creatures in a %d radius even outside of light radius. + This is not telepathy, however, and it is still limited to line of sight. + Also, your attention to detail increases stealth detection and invisibility detection by %d. + At level 3, you are able to react quickly to stealthed and invisible enemies attacking you, reducing the damage they deal by %d%%. + The detection power improves with your Cunning.]]): + format(t.sense(self,t), t.seePower(self,t), t.getResists(self,t)) + end, +} + +newTalent{ + name = "Track", + type = {"cunning/survival", 2}, + require = cuns_req2, + points = 5, + random_ego = "utility", + cooldown = 20, + radius = function(self, t) return math.floor(self:combatScale(self:getCun(10, true) * self:getTalentLevel(t), 5, 0, 55, 50)) end, + no_npc_use = true, + action = function(self, t) + local rad = self:getTalentRadius(t) + self:setEffect(self.EFF_SENSE, 3 + self:getTalentLevel(t), { + range = rad, + actor = 1, + }) + return true + end, + info = function(self, t) + local rad = self:getTalentRadius(t) + return ([[Sense foes around you in a radius of %d for %d turns. + The radius will increase with your Cunning.]]):format(rad, 3 + self:getTalentLevel(t)) + end, +} + +newTalent{ + name = "Device Mastery", + type = {"cunning/survival", 3}, + require = cuns_req3, + mode = "passive", + points = 5, + cdReduc = function(tl) + if tl <=0 then return 0 end + return math.floor(100*tl/(tl+7.5)) -- Limit < 100% + end, + passives = function(self, t, p) + self:talentTemporaryValue(p, "use_object_cooldown_reduce", t.cdReduc(self:getTalentLevel(t))) end, on_learn = function(self, t) - if self:getTalentLevel(t) >= 3 and not self:knowTalent(self.T_DISARM_TRAP) then + if not self:knowTalent(self.T_DISARM_TRAP) then self:learnTalent(self.T_DISARM_TRAP, true, 1) end end, on_unlearn = function(self, t) - if self:getTalentLevel(t) < 3 and self:knowTalent(self.T_DISARM_TRAP) then + if self:getTalentLevel(t) < 1 and self:knowTalent(self.T_DISARM_TRAP) then self:unlearnTalent(self.T_DISARM_TRAP, 1) end end, + trapPower = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getCun(25, true), 0, 0, 125, 125) end, info = function(self, t) - return ([[You notice the small things others do not notice, allowing you to "see" creatures in a %d radius even outside of light radius. - This is not telepathy, however, and it is still limited to line of sight. - Also, your attention to detail allows you to detect traps around you (%d detection 'power'). - At level 3, you learn to disarm known traps (%d disarm 'power'). - The trap detection and disarming ability improves with your Cunning.]]): - format(t.sense(self,t),t.trapPower(self,t),t.trapPower(self,t)) + return ([[Your cunning manipulations allow you to use charms (wands, totems and torques) more efficiently, reducing their cooldowns and the power cost of all usable items by %d%%. +In addition, your knowledge of devices allows you to detect traps around you and disarm known traps (%d detection and disarm 'power'). +The trap detection and disarming ability improves with your Cunning. ]]): + format(t.cdReduc(self:getTalentLevel(t)), t.trapPower(self,t)) --I5 + end, +} + +newTalent{ + name = "Danger Sense", + type = {"cunning/survival", 4}, + require = cuns_req4, + points = 5, + mode = "passive", + getTrigger = function(self, t) return self:combatTalentScale(t, 0.15, 0.40, 0.5) end, + cooldown = function(self, t) return 30 end, + no_npc_use = true, + getReduction = function(self, t) + return self:combatTalentLimit(t, 75, 25, 65) + end, + callbackOnHit = function(self, t, cb, src) + if self.life > self.max_life*t.getTrigger(self,t) and self.life - cb.value <= self.max_life*t.getTrigger(self,t) and not self:isTalentCoolingDown(t) then + self:setEffect("EFF_DANGER_SENSE", 1, {reduce = t.getReduction(self, t)}) + local eff = self:hasEffect("EFF_DANGER_SENSE") + eff.dur = eff.dur - 1 + cb.value = cb.value * (100-t.getReduction(self, t)) / 100 + self:startTalentCooldown(t) + end + return cb.value + end, + info = function(self, t) + return ([[You react quickly when in danger - on falling below %d%% life, all damage you take from the attack and all further damage that turn is reduced by %d%%. +This talent has a cooldown.]]): + format(t.getTrigger(self,t)*100, t.getReduction(self,t) ) end, } @@ -88,77 +169,10 @@ newTalent{ return true end, info = function(self, t) - local ths = self:getTalentFromId(self.T_HEIGHTENED_SENSES) + local ths = self:getTalentFromId(self.T_DEVICE_MASTERY) local power = ths.trapPower(self,ths) return ([[You search an adjacent grid for a hidden trap (%d detection 'power') and attempt to disarm it (%d disarm 'power'). To disarm a trap, you must be able to enter its grid to manipulate it, even though you stay in your current location. Success depends on your skill in the %s talent and your Cunning, and failing to disarm a trap may trigger it.]]):format(power, power + (self:attr("disarm_bonus") or 0), ths.name) end, -} - -newTalent{ - name = "Charm Mastery", - type = {"cunning/survival", 2}, - require = cuns_req2, - mode = "passive", - points = 5, - cdReduc = function(tl) - if tl <=0 then return 0 end - return math.floor(100*tl/(tl+7.5)) -- Limit < 100% - end, - passives = function(self, t, p) - self:talentTemporaryValue(p, "use_object_cooldown_reduce", t.cdReduc(self:getTalentLevel(t))) - end, --- on_unlearn = function(self, t) --- end, - info = function(self, t) - return ([[Your cunning manipulations allow you to use charms (wands, totems and torques) more efficiently, reducing their cooldowns by %d%%.]]): - format(t.cdReduc(self:getTalentLevel(t))) - end, -} - -newTalent{ - name = "Piercing Sight", - type = {"cunning/survival", 3}, - require = cuns_req3, - mode = "passive", - points = 5, - -- called by functions _M:combatSeeStealth and _M:combatSeeInvisible functions mod\class\interface\Combat.lua - seePower = function(self, t) return self:combatScale(self:getCun(15, true)*self:getTalentLevel(t), 5, 0, 80, 75) end, --I5 - info = function(self, t) - return ([[You look at your surroundings with more intensity than most people, allowing you to see stealthed or invisible creatures. - Increases stealth detection by %d and invisibility detection by %d. - The detection power increases with your Cunning.]]): - format(t.seePower(self,t), t.seePower(self,t)) - end, -} - -newTalent{ - name = "Evasion", - type = {"cunning/survival", 4}, - points = 5, - require = cuns_req4, - random_ego = "defensive", - tactical = { ESCAPE = 2, DEFEND = 2 }, - cooldown = 30, - getDur = function(self) return math.floor(self:combatStatLimit("wil", 30, 6, 15)) end, -- Limit < 30 - getChanceDef = function(self, t) - if self.perfect_evasion then return 100, 0 end - return self:combatLimit(5*self:getTalentLevel(t) + self:getCun(25,true) + self:getDex(25,true), 50, 10, 10, 37.5, 75), - self:combatScale(self:getTalentLevel(t) * (self:getCun(25, true) + self:getDex(25, true)), 0, 0, 55, 250, 0.75) - -- Limit evasion chance < 50%, defense bonus ~= 55 at level 50 - end, - speed = "combat", - action = function(self, t) - local dur = t.getDur(self) - local chance, def = t.getChanceDef(self,t) - self:setEffect(self.EFF_EVASION, dur, {chance=chance, defense = def}) - return true - end, - info = function(self, t) - local chance, def = t.getChanceDef(self,t) - return ([[Your quick wit allows you to see attacks before they land, granting you a %d%% chance to completely evade them and granting you %d defense for %d turns. - Duration increases with Willpower, and chance to evade and defense with Cunning and Dexterity.]]): - format(chance, def,t.getDur(self)) - end, -} +} \ No newline at end of file diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua index 91bfd6b387..7e9a476bf0 100644 --- a/game/modules/tome/data/talents/misc/npcs.lua +++ b/game/modules/tome/data/talents/misc/npcs.lua @@ -3117,4 +3117,136 @@ newTalent{ You estimate your current chance to maintain stealth as %0.1f%%.]]): format(t.stealthMult(self, t), t.getChance(self, t, true), t.getChance(self, t, false, true)) end, +} + +newTalent{ + name = "Hack'n'Back", + type = {"other/other", 1}, + points = 5, + cooldown = 14, + stamina = 30, + tactical = { ESCAPE = 1, ATTACK = { weapon = 0.5 } }, +-- require = techs_dex_req1, + requires_target = true, + is_melee = true, + target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end, + range = 1, + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1) end, + getDist = function(self, t) return math.ceil(self:combatTalentScale(t, 1.2, 3.3)) end, + on_pre_use = function(self, t) + if self:attr("never_move") then return false end + return true + end, + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y, target = self:getTarget(tg) + if not target or not self:canProject(tg, x, y) then return nil end + local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true) + + if hitted then + self:knockback(target.x, target.y, t.getDist(self, t)) + end + + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local dist = t.getDist(self, t) + return ([[You hit your target, doing %d%% damage, distracting it while you jump back %d squares away.]]): + format(100 * damage, dist) + end, +} + +newTalent{ + name = "Mobile Defence", + type = {"other/other", 1}, + mode = "passive", + points = 5, +-- require = techs_dex_req2, + getDef = function(self, t) return self:getTalentLevel(t) * 0.08 end, + getHardiness = function(self, t) return self:getTalentLevel(t) * 0.06 end, + -- called by _M:combatDefenseBase function in mod\class\interface\Combat.lua + getDef = function(self, t) return self:combatTalentLimit(t, 1, 0.10, 0.40) end, -- Limit to <100% defense bonus + -- called by _M:combatArmorHardiness function in mod\class\interface\Combat.lua + getHardiness = function(self, t) return self:combatTalentLimit(t, 100, 6, 30) end, -- Limit < 100% + info = function(self, t) + return ([[Whilst wearing leather or lighter armour, you gain %d%% Defense and %d%% Armour hardiness.]]): + format(t.getDef(self, t) * 100, t.getHardiness(self, t)) + end, +} + +newTalent{ + name = "Light of Foot", + type = {"other/other", 1}, + mode = "passive", + points = 5, +-- require = techs_dex_req3, + getFatigue = function(self, t) return self:combatTalentLimit(t, 100, 1.5, 7.5) end, -- Limit < 50% + passives = function(self, t, p) + self:talentTemporaryValue(p, "fatigue", -t.getFatigue(self, t)) + end, + info = function(self, t) + return ([[You are light on your feet, handling your armour better. Each step you take regenerates %0.2f stamina, and your fatigue is permanently reduced by %0.1f%%. + At level 3 you are able to walk so lightly that you never trigger traps that require pressure.]]): + format(self:getTalentLevelRaw(t) * 0.2, t.getFatigue(self, t)) + end, + +} + +newTalent{ + name = "Strider", + type = {"other/other", 1}, + mode = "passive", + points = 5, +-- require = techs_dex_req4, + incspeed = function(self, t) return self:combatTalentScale(t, 0.02, 0.10, 0.75) end, + CDreduce = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 1, 5)) end, -- Limit < 8 + passives = function(self, t, p) + local cdr = t.CDreduce(self, t) + self:talentTemporaryValue(p, "movement_speed", t.incspeed(self, t)) + self:talentTemporaryValue(p, "talent_cd_reduction", + {[Talents.T_RUSH]=cdr, [Talents.T_HACK_N_BACK]=cdr, [Talents.T_DISENGAGE]=cdr, [Talents.T_EVASION]=cdr}) + end, + info = function(self, t) + return ([[You literally dance around your foes, increasing your movement speed by %d%% and reducing the cooldown of Hack'n'Back, Rush, Disengage and Evasion by %d turns.]]): + format(t.incspeed(self, t)*100,t.CDreduce(self, t)) + end, +} + + +newTalent{ + name = "Charm Mastery", + type = {"other/other", 1}, +-- require = cuns_req2, + mode = "passive", + points = 5, + cdReduc = function(tl) + if tl <=0 then return 0 end + return math.floor(100*tl/(tl+7.5)) -- Limit < 100% + end, + passives = function(self, t, p) + self:talentTemporaryValue(p, "use_object_cooldown_reduce", t.cdReduc(self:getTalentLevel(t))) + end, +-- on_unlearn = function(self, t) +-- end, + info = function(self, t) + return ([[Your cunning manipulations allow you to use charms (wands, totems and torques) more efficiently, reducing their cooldowns by %d%%.]]): + format(t.cdReduc(self:getTalentLevel(t))) + end, +} + +newTalent{ + name = "Piercing Sight", + type = {"other/other", 1}, +-- require = cuns_req3, + mode = "passive", + points = 5, + -- called by functions _M:combatSeeStealth and _M:combatSeeInvisible functions mod\class\interface\Combat.lua + seePower = function(self, t) return self:combatScale(self:getCun(15, true)*self:getTalentLevel(t), 5, 0, 80, 75) end, --I5 + info = function(self, t) + return ([[You look at your surroundings with more intensity than most people, allowing you to see stealthed or invisible creatures. + Increases stealth detection by %d and invisibility detection by %d. + The detection power increases with your Cunning.]]): + format(t.seePower(self,t), t.seePower(self,t)) + end, } \ No newline at end of file diff --git a/game/modules/tome/data/talents/techniques/assassination.lua b/game/modules/tome/data/talents/techniques/assassination.lua index eb8ba2af48..ee5ac70ae6 100644 --- a/game/modules/tome/data/talents/techniques/assassination.lua +++ b/game/modules/tome/data/talents/techniques/assassination.lua @@ -66,9 +66,10 @@ newTalent{ end end - if target.dead and self:knowTalent(self.T_STEALTH) and not self:isTalentActive(self.T_STEALTH) and not self:isTalentCoolingDown(self.T_STEALTH) then + if target.dead and self:knowTalent(self.T_STEALTH) and not self:isTalentActive(self.T_STEALTH) then game:onTickEnd(function() self.hide_chance = 1000 + self.talents_cd["T_STEALTH"] = 0 self:forceUseTalent(self.T_STEALTH, {ignore_energy=true, silent = true}) self.hide_chance = nil end) @@ -81,7 +82,7 @@ newTalent{ dam = t.getDamage(self,t)*100 perc = t.getPercent(self,t)*100 return ([[Attempt to finish off a wounded enemy, striking them with both weapons for %d%% weapon damage, plus additional physical damage for each hit that lands equal to %d%% of their missing life (divided by rank: from 1 (critter) to 5 (elite boss)). - A target brought below 20%% of its maximum life may be instantly slain, which you may take advantage of to slip back into stealth if it's not on cooldown.]]): + A target brought below 20%% of its maximum life may be instantly slain, which you may take advantage of to slip back into stealth.]]): format(dam, perc) end, } @@ -105,7 +106,7 @@ newTalent{ info = function(self, t) local radius = self:getTalentRadius(t) local duration = t.getDuration(self,t) - return ([[When you exit stealth, you reveal yourself dramatically, intimitading foes around you. + return ([[When you exit stealth, you reveal yourself dramatically, intimidating foes around you. All enemies that witness you leaving stealth within radius %d will be stricken with terror, which randomly inflicts stun, slow (40%% power), or confusion (50%% power) for %d turns.]]) :format(radius, duration) end, diff --git a/game/modules/tome/data/talents/techniques/combat-training.lua b/game/modules/tome/data/talents/techniques/combat-training.lua index 8c71ed0df2..f320d77568 100644 --- a/game/modules/tome/data/talents/techniques/combat-training.lua +++ b/game/modules/tome/data/talents/techniques/combat-training.lua @@ -99,11 +99,49 @@ newTalent{ end, } +newTalent{ + name = "Light Armour Training", + type = {"technique/combat-training", 1}, + mode = "passive", + levelup_screen_break_line = true, + no_unlearn_last = true, + points = 5, + require = {stat = {dex = function(level) return 16 + (level + 2) * (level - 1) end}}, + getArmorHardiness = function(self, t) + return math.max(0, self:combatLimit(self:getTalentLevel(t) * 4, 100, 5, 3.75, 50, 37.5)) + end, + getDefense = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getDex(), 4, 0, 45.7, 500) end, + getPercentageDefense = function(self, t) return self:combatTalentLimit(t, 75, 15, 45) end, + getStamina = function(self, t) return self:combatTalentLimit(t, 5, 1.5, 3.5) end, + callbackOnMove = function(self, t, moved, force, ox, oy) + if not moved or force or (ox == self.x and oy == self.y) then return end + + local nb_foes = 0 + local add_if_visible_enemy = function(x, y) + local target = game.level.map(x, y, game.level.map.ACTOR) + if target and self:reactionToward(target) < 0 and self:canSee(target) then + nb_foes = nb_foes + 1 + end + end + local adjacent_tg = {type = "ball", range = 0, radius = 1, selffire = false} + self:project(adjacent_tg, self.x, self.y, add_if_visible_enemy) + + if nb_foes > 0 then + self:setEffect(self.EFF_MOBILE_DEFENCE, 2, {power=t.getDefense(self,t), stamina=t.getStamina(self,t)}) + end + end, + info = function(self, t) + return ([[Whilst wearing leather or lighter armour, you gain %d Defense and %d%% Armour hardiness. + In addition, stepping into a tile adjacent to a visible enemy will increase your stamina regeneration by %0.1f and total Defense by %d%% for 2 turns. + The Defense bonus scales with your Dexterity.]]): + format(t.getDefense(self,t), t.getArmorHardiness(self,t), t.getStamina(self,t), t.getPercentageDefense(self,t)) + end, +} + newTalent{ name = "Combat Accuracy", short_name = "WEAPON_COMBAT", type = {"technique/combat-training", 1}, points = 5, - levelup_screen_break_line = true, require = { level=function(level) return (level - 1) * 4 end }, mode = "passive", --getAttack = function(self, t) return self:getTalentLevel(t) * 10 end, diff --git a/game/modules/tome/data/talents/techniques/duelist.lua b/game/modules/tome/data/talents/techniques/duelist.lua index 4da20bbefb..587b19d2a4 100644 --- a/game/modules/tome/data/talents/techniques/duelist.lua +++ b/game/modules/tome/data/talents/techniques/duelist.lua @@ -22,13 +22,13 @@ local Object = require "engine.Object" local Map = require "engine.Map" newTalent{ - name = "Parry", + name = "Dual Weapon Mastery", type = {"technique/duelist", 1}, points = 5, require = techs_dex_req1, mode = "passive", - getDeflectChance = function(self, t) return self:combatTalentLimit(t, 100, 20, 61) end, -- ~67% at TL 6.5 - getDeflectPercent = function(self, t) return self:combatTalentLimit(t, 100, 20, 40) end, + getDeflectChance = function(self, t) return self:combatTalentLimit(t, 100, 20, 65) end, + getDeflectPercent = function(self, t) return self:combatTalentLimit(t, 100, 20, 50) end, getDeflect = function(self, t, fake) local dam,_,weapon = 0,self:hasDualWeapon() if not weapon or weapon.subtype=="mindstar" and not fake then return 0 end @@ -48,6 +48,9 @@ newTalent{ end return t.getDeflectPercent(self, t) * dam/100 end, + getoffmult = function(self,t) + return self:combatTalentLimit(t, 1, 0.65, 0.85)-- limit <100% + end, callbackOnActBase = function(self, t) local mh, oh = self:hasDualWeapon() -- if self:hasDualWeapon() then @@ -60,10 +63,11 @@ newTalent{ block = t.getDeflect(self,t) chance = t.getDeflectChance(self,t) perc = t.getDeflectPercent(self,t) + mult = t.getoffmult(self,t)*100 return ([[Up to %d times a turn, you have a %d%% chance to parry up to %d damage (%d%% of your offhand weapon damage) from a melee or ranged attack. A successful parry reduces damage like armour (before any attack multipliers) and prevents critical strikes. It is difficult to parry attacks from unseen attackers and you cannot parry with a mindstar. - The number of attacks you can parry and their chance partially stacks with those of Dual Weapon Defense.]]): - format(t.getDeflects(self, t, true), chance, block, perc) + In addition, the damage dealt by your offhand weapon is increased to %d%%.]]): + format(t.getDeflects(self, t, true), chance, block, perc, mult) end, } @@ -126,7 +130,7 @@ newTalent{ cooldown = 30, no_energy = true, getChance = function(self, t) return self:combatTalentLimit(t, 25, 5, 15) end, - critResist = function(self, t) return self:combatTalentScale(t, 3, 8, 0.75) end, + critResist = function(self, t) return self:combatTalentScale(t, 15, 50, 0.75) end, on_pre_use = function(self, t, silent, fake) local armor = self:getInven("BODY") and self:getInven("BODY")[1] if armor and (armor.subtype == "heavy" or armor.subtype == "massive") then @@ -168,8 +172,8 @@ newTalent{ range = 1, target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end, getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 3, 5)) end, - getSpeedPenalty = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "dex", 5, 50), 50, 10, 0, 30, 35.7) end, -- Limit < 50% - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 1.5) end, + getSpeedPenalty = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "dex", 5, 50), 100, 10, 0, 50, 35.7) end, -- Limit < 100% + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 2.5) end, on_pre_use = function(self, t, silent) if self:attr("never_move") then if not silent then game.logPlayer(self, "You must be able to move to use this talent.") end diff --git a/game/modules/tome/data/talents/techniques/field-control.lua b/game/modules/tome/data/talents/techniques/field-control.lua index 535ff39fa4..5a073d5416 100644 --- a/game/modules/tome/data/talents/techniques/field-control.lua +++ b/game/modules/tome/data/talents/techniques/field-control.lua @@ -18,64 +18,64 @@ -- darkgod@te4.org -newTalent{ - name = "Disengage", - type = {"technique/field-control", 1}, - require = techs_dex_req1, - points = 5, - random_ego = "utility", - cooldown = 12, - stamina = 20, - range = 7, - tactical = { ESCAPE = 2 }, - requires_target = true, - target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end, - on_pre_use = function(self, t) - if self:attr("never_move") then return false end - return true - end, - getDist = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, - action = function(self, t) - local tg = self:getTalentTarget(t) - local x, y, target = self:getTarget(tg) - if not target or not self:canProject(tg, x, y) then return nil end - - self:knockback(target.x, target.y, t.getDist(self, t)) - return true - end, - info = function(self, t) - return ([[Jump away %d grids from your target.]]):format(t.getDist(self, t)) - end, -} - -newTalent{ - name = "Track", - type = {"technique/field-control", 2}, - require = techs_dex_req2, - points = 5, - random_ego = "utility", - stamina = 20, - cooldown = 20, - radius = function(self, t) return math.floor(self:combatScale(self:getCun(10, true) * self:getTalentLevel(t), 5, 0, 55, 50)) end, - no_npc_use = true, - action = function(self, t) - local rad = self:getTalentRadius(t) - self:setEffect(self.EFF_SENSE, 3 + self:getTalentLevel(t), { - range = rad, - actor = 1, - }) - return true - end, - info = function(self, t) - local rad = self:getTalentRadius(t) - return ([[Sense foes around you in a radius of %d for %d turns. - The radius will increase with your Cunning.]]):format(rad, 3 + self:getTalentLevel(t)) - end, -} +--newTalent{ +-- name = "Disengage", +-- type = {"technique/field-control", 1}, +-- require = techs_dex_req1, +-- points = 5, +-- random_ego = "utility", +-- cooldown = 12, +-- stamina = 20, +-- range = 7, +-- tactical = { ESCAPE = 2 }, +-- requires_target = true, +-- target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end, +-- on_pre_use = function(self, t) +-- if self:attr("never_move") then return false end +-- return true +-- end, +-- getDist = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, +-- action = function(self, t) +-- local tg = self:getTalentTarget(t) +-- local x, y, target = self:getTarget(tg) +-- if not target or not self:canProject(tg, x, y) then return nil end +-- +-- self:knockback(target.x, target.y, t.getDist(self, t)) +-- return true +-- end, +-- info = function(self, t) +-- return ([[Jump away %d grids from your target.]]):format(t.getDist(self, t)) +-- end, +--} +-- +--newTalent{ +-- name = "Track", +-- type = {"technique/field-control", 2}, +-- require = techs_dex_req2, +-- points = 5, +-- random_ego = "utility", +-- stamina = 20, +-- cooldown = 20, +-- radius = function(self, t) return math.floor(self:combatScale(self:getCun(10, true) * self:getTalentLevel(t), 5, 0, 55, 50)) end, +-- no_npc_use = true, +-- action = function(self, t) +-- local rad = self:getTalentRadius(t) +-- self:setEffect(self.EFF_SENSE, 3 + self:getTalentLevel(t), { +-- range = rad, +-- actor = 1, +-- }) +-- return true +-- end, +-- info = function(self, t) +-- local rad = self:getTalentRadius(t) +-- return ([[Sense foes around you in a radius of %d for %d turns. +-- The radius will increase with your Cunning.]]):format(rad, 3 + self:getTalentLevel(t)) +-- end, +--} newTalent{ name = "Heave", - type = {"technique/field-control", 3}, + type = {"technique/field-control", 1}, require = techs_dex_req3, points = 5, random_ego = "defensive", @@ -117,7 +117,7 @@ newTalent{ newTalent{ name = "Slow Motion", - type = {"technique/field-control", 4}, + type = {"technique/field-control", 2}, require = techs_dex_req4, mode = "sustained", points = 5, diff --git a/game/modules/tome/data/talents/techniques/mobility.lua b/game/modules/tome/data/talents/techniques/mobility.lua index f3376127ab..69b383e2d0 100644 --- a/game/modules/tome/data/talents/techniques/mobility.lua +++ b/game/modules/tome/data/talents/techniques/mobility.lua @@ -1,5 +1,5 @@ -- ToME - Tales of Maj'Eyal --- Copyright (C) 2009 - 2016 Nicolas Casalini +-- Copyright (C) 2009 - 2014 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -20,95 +20,186 @@ local Map = require "engine.Map" newTalent{ - name = "Hack'n'Back", + name = "Disengage", type = {"technique/mobility", 1}, - points = 5, - cooldown = 14, - stamina = 30, - tactical = { ESCAPE = 1, ATTACK = { weapon = 0.5 } }, require = techs_dex_req1, + points = 5, + random_ego = "utility", + cooldown = 10, + stamina = 12, + range = 7, + getSpeed = function(self, t) return self:combatTalentScale(t, 100, 250, 0.75) end, + getReload = function(self, t) return math.floor(self:combatTalentScale(t, 2, 10)) end, + tactical = { ESCAPE = 2 }, requires_target = true, - is_melee = true, target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end, - range = 1, - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1) end, - getDist = function(self, t) return math.ceil(self:combatTalentScale(t, 1.2, 3.3)) end, on_pre_use = function(self, t) if self:attr("never_move") then return false end return true end, + getDist = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y, target = self:getTarget(tg) if not target or not self:canProject(tg, x, y) then return nil end - local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true) - if hitted then - self:knockback(target.x, target.y, t.getDist(self, t)) + self:knockback(target.x, target.y, t.getDist(self, t)) + + if self:getTalentLevel(t) >= 4 then + self:setEffect("EFF_AVOIDANCE", 1, {power=100}) + local eff = self:hasEffect("EFF_AVOIDANCE") + eff.dur = eff.dur - 1 + end + + game:onTickEnd(function() + self:setEffect(self.EFF_WILD_SPEED, 3, {power=t.getSpeed(self,t)}) + end) + + local weapon, ammo, offweapon = self:hasArcheryWeapon() + if weapon and ammo and not ammo.infinite then + ammo.combat.shots_left = math.min(ammo.combat.shots_left + t.getReload(self, t), ammo.combat.capacity) + game.logSeen(self, "%s reloads.", self.name:capitalize()) end return true end, info = function(self, t) - local damage = t.getDamage(self, t) - local dist = t.getDist(self, t) - return ([[You hit your target, doing %d%% damage, distracting it while you jump back %d squares away.]]): - format(100 * damage, dist) + return ([[Jump away %d grids from your target and gain a burst of speed on landing, increasing you movement speed by %d%% for 3 turns. + Any actions other than movement will end the speed boost. + At talent level 4 you avoid all attacks against you while disengaging. + If you have a quiver equip, you also take the time to reload %d shots.]]): + format(t.getDist(self, t), t.getSpeed(self,t), t.getReload(self,t)) end, } -newTalent{ - name = "Mobile Defence", +newTalent { + name = "Tumble", type = {"technique/mobility", 2}, - mode = "passive", - points = 5, require = techs_dex_req2, - getDef = function(self, t) return self:getTalentLevel(t) * 0.08 end, - getHardiness = function(self, t) return self:getTalentLevel(t) * 0.06 end, - -- called by _M:combatDefenseBase function in mod\class\interface\Combat.lua - getDef = function(self, t) return self:combatTalentLimit(t, 1, 0.10, 0.40) end, -- Limit to <100% defense bonus - -- called by _M:combatArmorHardiness function in mod\class\interface\Combat.lua - getHardiness = function(self, t) return self:combatTalentLimit(t, 100, 6, 30) end, -- Limit < 100% - info = function(self, t) - return ([[Whilst wearing leather or lighter armour, you gain %d%% Defense and %d%% Armour hardiness.]]): - format(t.getDef(self, t) * 100, t.getHardiness(self, t)) + points = 5, + random_ego = "attack", + cooldown = function(self, t) + return math.max(10 - self:getTalentLevel(t), 1) + end, + no_energy = true, + no_break_stealth = true, + tactical = { ESCAPE = 2 }, + stamina = function(self, t) + local eff = self:hasEffect(self.EFF_EXHAUSTION) + if eff and eff.charges then + return 15 + eff.charges*15 + else + return 15 + end + end, + range = function(self, t) + return math.floor(self:combatTalentScale(t, 2, 4)) + end, + getDuration = function(self, t) + return math.max(20 - self:getTalentLevel(t), 5) + end, + target = function(self, t) + return {type="beam", range=self:getTalentRange(t), talent=t} + end, + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y, target = self:getTarget(tg) + if not x or not y then return end + if self.x == x and self.y == y then return end + if core.fov.distance(self.x, self.y, x, y) > self:getTalentRange(t) or not self:hasLOS(x, y) then return end + + if target or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move", self) then + game.logPlayer(self, "You must have an empty space to roll to.") + return false + end + + self:move(x, y, true) + + game:onTickEnd(function() + self:setEffect(self.EFF_EXHAUSTION, t.getDuration(self,t), { max_stacks=5 }) + end) + + return true end, + info = function(self, t) + return ([[Move to a spot within range, bounding around, over, or through any enemies in the way. This can be used while pinned, and does not break stealth. + This quickly becomes exhausting to use, increasing the stamina cost by 15 for %d turns after use.]]):format(t.getDuration(self,t)) + end } -newTalent{ - name = "Light of Foot", +newTalent { + name = "Trained Reactions", type = {"technique/mobility", 3}, - mode = "passive", + mode = "sustained", points = 5, + cooldown = function(self, t) return 10 end, + sustain_stamina = 10, + no_energy = true, require = techs_dex_req3, - getFatigue = function(self, t) return self:combatTalentLimit(t, 100, 1.5, 7.5) end, -- Limit < 50% - passives = function(self, t, p) - self:talentTemporaryValue(p, "fatigue", -t.getFatigue(self, t)) + tactical = { BUFF = 2 }, + activate = function(self, t) + return {} end, - info = function(self, t) - return ([[You are light on your feet, handling your armour better. Each step you take regenerates %0.2f stamina, and your fatigue is permanently reduced by %0.1f%%. - At level 3 you are able to walk so lightly that you never trigger traps that require pressure.]]): - format(self:getTalentLevelRaw(t) * 0.2, t.getFatigue(self, t)) + deactivate = function(self, t, p) + return true + end, + getLifeTrigger = function(self, t) + return self:combatTalentLimit(t, 10, 40, 22) + end, + getReduction = function(self, t) + return (0.05 + (self:combatTalentLimit(t, 1, 0.15, 0.50) * self:combatLimit(self:combatDefense(), 1, 0.20, 10, 0.50, 50)))*100 end, + callbackOnHit = function(self, t, cb, src) + if cb.value >= self.max_life * t.getLifeTrigger(self, t) * 0.01 and use_stamina(self, 10) then + -- Apply effect with duration 0. + self:setEffect("EFF_SKIRMISHER_DEFENSIVE_ROLL", 1, {reduce = t.getReduction(self, t)}) + local eff = self:hasEffect("EFF_SKIRMISHER_DEFENSIVE_ROLL") + eff.dur = eff.dur - 1 + cb.value = cb.value * (100-t.getReduction(self, t)) / 100 + end + return cb.value + end, + info = function(self, t) + local trigger = t.getLifeTrigger(self, t) + local reduce = t.getReduction(self, t) + return ([[While this talent is sustained, you anticipate deadly attacks against you. + Any time you would lose more than %d%% of your life in a single hit, you instead duck out of the way and assume a defensive posture. + This reduces the triggering damage and all further damage in the same turn by %d%%. + This costs 10 stamina each time it triggers. + The damage reduction increases based on your Defense.]]) + :format(trigger, reduce, cost) + end, } newTalent{ - name = "Strider", + name = "Evasion", type = {"technique/mobility", 4}, - mode = "passive", points = 5, require = techs_dex_req4, - incspeed = function(self, t) return self:combatTalentScale(t, 0.02, 0.10, 0.75) end, - CDreduce = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 1, 5)) end, -- Limit < 8 - passives = function(self, t, p) - local cdr = t.CDreduce(self, t) - self:talentTemporaryValue(p, "movement_speed", t.incspeed(self, t)) - self:talentTemporaryValue(p, "talent_cd_reduction", - {[Talents.T_RUSH]=cdr, [Talents.T_HACK_N_BACK]=cdr, [Talents.T_DISENGAGE]=cdr, [Talents.T_EVASION]=cdr}) + random_ego = "defensive", + tactical = { ESCAPE = 2, DEFEND = 2 }, + cooldown = 30, + stamina = 20, + no_energy = true, + getDur = function(self, t) return math.floor(self:combatTalentLimit(t, 30, 5, 9)) end, -- Limit < 30 + getChanceDef = function(self, t) + if self.perfect_evasion then return 100, 0 end + return self:combatLimit(5*self:getTalentLevel(t) + self:getDex(50,true), 50, 10, 10, 37.5, 75), + self:combatScale(self:getTalentLevel(t) * (self:getDex(50, true)), 0, 0, 55, 250, 0.75) + -- Limit evasion chance < 50%, defense bonus ~= 55 at level 50 + end, + speed = "combat", + action = function(self, t) + local dur = t.getDur(self,t) + local chance, def = t.getChanceDef(self,t) + self:setEffect(self.EFF_EVASION, dur, {chance=chance, defense = def}) + return true end, info = function(self, t) - return ([[You literally dance around your foes, increasing your movement speed by %d%% and reducing the cooldown of Hack'n'Back, Rush, Disengage and Evasion by %d turns.]]): - format(t.incspeed(self, t)*100,t.CDreduce(self, t)) + local chance, def = t.getChanceDef(self,t) + return ([[Your quick wit allows you to see melee attacks before they land, granting you a %d%% chance to completely evade them and granting you %d defense for %d turns. + The chance to evade and defense increases with your Dexterity.]]): + format(chance, def,t.getDur(self,t)) end, -} +} \ No newline at end of file diff --git a/game/modules/tome/data/talents/techniques/pugilism.lua b/game/modules/tome/data/talents/techniques/pugilism.lua index 4cd2ef1951..e1546a01ed 100644 --- a/game/modules/tome/data/talents/techniques/pugilism.lua +++ b/game/modules/tome/data/talents/techniques/pugilism.lua @@ -39,7 +39,13 @@ newTalent{ no_unlearn_last = true, getAttack = function(self, t) return self:getDex(25, true) end, getDamage = function(self, t) return self:combatStatScale("dex", 5, 35) end, - getFlatReduction = function(self, t) return math.min(35, self:combatStatScale("str", 1, 30, 0.75)) end, + getFlatReduction = function(self, t) + if self:knowTalent(self.T_REFLEX_DEFENSE) then + return math.min(35, self:combatStatScale("str", 1, 30, 0.75)) * (1 + (self:callTalent(self.T_REFLEX_DEFENSE, "getFlatReduction")/100) ) + else + return math.min(35, self:combatStatScale("str", 1, 30, 0.75)) + end + end, -- 13 Strength = 2, 20 = 5, 30 = 9, 40 = 12, 50 = 16, 55 = 17, 70 = 22, 80 = 25 activate = function(self, t) cancelStances(self) diff --git a/game/modules/tome/data/talents/techniques/throwing-knives.lua b/game/modules/tome/data/talents/techniques/throwing-knives.lua index 21c9509419..2dcd2b8dc9 100644 --- a/game/modules/tome/data/talents/techniques/throwing-knives.lua +++ b/game/modules/tome/data/talents/techniques/throwing-knives.lua @@ -273,7 +273,7 @@ newTalent{ local power = t.getCritPower(self,t) local chance = t.getChance(self,t) return ([[You are able to target your throwing knives with pinpoint accuracy, increasing their critical strike chance by %d%% and critical strike damage by %d%%. -In addition, your critical strikes with throwing knives have a %d%% chance will to randomly disable your target, possibly disarming, silencing or pinning them for 2 turns.]]) +In addition, your critical strikes with throwing knives have a %d%% chance to randomly disable your target, possibly disarming, silencing or pinning them for 2 turns.]]) :format(crit, power, chance) end, } diff --git a/game/modules/tome/data/talents/techniques/thuggery.lua b/game/modules/tome/data/talents/techniques/thuggery.lua index 3901e32cd5..12fd4df033 100644 --- a/game/modules/tome/data/talents/techniques/thuggery.lua +++ b/game/modules/tome/data/talents/techniques/thuggery.lua @@ -127,24 +127,22 @@ newTalent{ tactical = { BUFF = 2 }, getCrit = function(self, t) return self:combatTalentStatDamage(t, "dex", 10, 50) / 1.5 end, getPen = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "str", 10, 50), 100, 0, 0, 35.7, 35.7) end, -- Limit to <100% - getDrain = function(self, t) return self:combatTalentLimit(t, 0, 11, 6) end, -- Limit to >0 stam + drain_stamina = 6, activate = function(self, t) local ret = { crit = self:addTemporaryValue("combat_physcrit", t.getCrit(self, t)), pen = self:addTemporaryValue("resists_pen", {[DamageType.PHYSICAL] = t.getPen(self, t)}), - drain = self:addTemporaryValue("stamina_regen_on_hit", - t.getDrain(self, t)), } return ret end, deactivate = function(self, t, p) self:removeTemporaryValue("combat_physcrit", p.crit) self:removeTemporaryValue("resists_pen", p.pen) - self:removeTemporaryValue("stamina_regen_on_hit", p.drain) return true end, info = function(self, t) return ([[You go all out, trying to burn down your foes as fast as possible. - Every hit in battle has +%d%% critical chance and +%d%% physical resistance penetration, but each strike drains %0.1f stamina.]]): + Every hit in battle has +%d%% critical chance and +%d%% physical resistance penetration, but this talent drains 6 stamina each turn.]]): format(t.getCrit(self, t), t.getPen(self, t), t.getDrain(self, t)) end, } diff --git a/game/modules/tome/data/talents/techniques/unarmed-training.lua b/game/modules/tome/data/talents/techniques/unarmed-training.lua index a859bc9140..5e018dfd87 100644 --- a/game/modules/tome/data/talents/techniques/unarmed-training.lua +++ b/game/modules/tome/data/talents/techniques/unarmed-training.lua @@ -112,30 +112,20 @@ newTalent{ end, } --- It's a bit wierd that this works against mind attacks newTalent{ name = "Reflex Defense", type = {"technique/unarmed-training", 4}, - require = techs_cun_req4, -- bit icky since this is clearly dex, but whatever, cun turns defense special *handwave* + require = techs_cun_req4, points = 5, mode = "passive", - getDamageReduction = function(self, t) - return self:combatTalentLimit(t, 1, 0.15, 0.50) * self:combatLimit(self:combatDefense(), 1, 0.15, 10, 0.5, 50) -- Limit < 100%, 25% for TL 5.0 and 50 defense + getFlatReduction = function(self, t) return self:combatTalentScale(t, 30, 70, 0.75) end, + critResist = function(self, t) return self:combatTalentScale(t, 15, 50, 0.75) end, + passives = function(self, t, p) + self:talentTemporaryValue(p, "ignore_direct_crits", t.critResist(self, t)) end, - getDamagePct = function(self, t) - return self:combatTalentLimit(t, 0.1, 0.3, 0.15) -- Limit trigger > 10% life - end, - callbackOnHit = function(self, t, cb) - if ( cb.value > (t.getDamagePct(self, t) * self.max_life) ) then - local damageReduction = cb.value * t.getDamageReduction(self, t) - cb.value = cb.value - damageReduction - game.logPlayer(self, "#GREEN#You twist your body in complex ways mitigating the blow by #ORCHID#" .. math.ceil(damageReduction) .. "#LAST#.") - end - return cb.value - end, info = function(self, t) - return ([[Your understanding of physiology allows you to apply your reflexes in new ways. Whenever you would receive damage (from any source) greater than %d%% of your maximum life you reduce that damage by %0.1f%% (based on your Defense).]]): - format(t.getDamagePct(self, t)*100, t.getDamageReduction(self, t)*100 ) - end, + return ([[Your understanding of physiology allows you to apply your reflexes in new ways, increasing the flat damage reduction granted by Striking Stance by %d%% and causing direct critical hits (physical, mental, spells) against you to have a %d%% lower Critical multiplier (but always do at least normal damage).]]): + format(t.getFlatReduction(self,t), t.critResist(self,t) ) + end } diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua index afbf99b4f6..19e6367ab6 100644 --- a/game/modules/tome/data/timed_effects/physical.lua +++ b/game/modules/tome/data/timed_effects/physical.lua @@ -2069,7 +2069,7 @@ newEffect{ -- Note: This effect is cancelled by EFF_DISARMED } newEffect{ -- Note: This effect is cancelled by EFF_DISARMED - name = "PARRY", image = "talents/parry.png", + name = "PARRY", image = "talents/dual_weapon_mastery.png", desc = "Parrying", deflectchance = function(self, eff, adj) -- The last partial deflect has a reduced chance to happen adj = adj or 1 @@ -3507,3 +3507,72 @@ newEffect{ deactivate = function(self, eff) end, } + +newEffect{ + name = "AVOIDANCE", image = "talents/disengage.png", + desc = "Avoidance", + long_desc = function(self, eff) return ("%d%% chance to fully evade any damaging actions."):format(eff.power) end, + type = "physical", + subtype = { evade=true }, + status = "beneficial", + parameters = { power=10 }, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("cancel_damage_chance", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("cancel_damage_chance", eff.tmpid) + end, +} + +newEffect{ + name = "EXHAUSTION", image = "talents/slumber.png", + desc = "Exhaustion", + long_desc = function(self, eff) return ("The target is exhausted, increasing the stamina cost of Tumble by %d."):format(eff.charges*30) end, + type = "other", + subtype = { }, + status = "detrimental", + parameters = { }, + charges = function(self, eff) return eff.charges end, + on_merge = function(self, old_eff, new_eff) + new_eff.charges = math.min(old_eff.charges + 1, 5) + return new_eff + end, + activate = function(self, eff) + eff.charges = 1 + end, + deactivate = function(self, eff) + end, +} + +newEffect { + name = "DANGER_SENSE", image = "talents/danger_sense.png", + desc = "Danger Sense", + type = "physical", + subtype = {tactic = true}, + status = "beneficial", + parameters = { + -- percent of all damage to ignore + reduce = 50 + }, + on_gain = function(self, eff) return "#Target# danger sense lets them narrowly avoid the blow!" end, + activate = function(self, eff) + self:effectTemporaryValue(eff, "incoming_reduce", eff.reduce) + end, + long_desc = function(self, eff) + return ([[The target is avoiding damage, ignoring %d%% of all incoming damage.]]) + :format(eff.reduce) + end, +} + +newEffect{ + name = "MOBILE_DEFENCE", image = "talents/light_armour_training.png", + desc = "Mobile Defense", + long_desc = function(self, eff) return ("Increases stamina regeneration by %d and total defense by %d%%."):format(eff.stamina, eff.power) end, + type = "physical", + subtype = { tactic=true }, + status = "beneficial", + parameters = {stamina=1, power=10}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "stamina_regen", eff.stamina) + end, +} -- GitLab