Commit 3c6e16fb506a0dc12324f2187d77c20202531f7b

Authored by DarkGod
1 parent be347a9d

Updated whip & punch sounds

Big brawlers update, removing some unfun talents in favor of better ones
... ... @@ -73,7 +73,7 @@ newEntity{ base = "BASE_INFUSION",
73 73
74 74 inscription_kind = "protect",
75 75 inscription_data = {
76   - cooldown = 20,
  76 + cooldown = 18,
77 77 dur = 6,
78 78 power = 10,
79 79 use_stat_mod = 0.1,
... ... @@ -804,7 +804,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR",
804 804 wielder = {
805 805 combat_def = 10,
806 806 combat_armor = 15,
807   - combat_armor_hardiness = 40,
  807 + combat_armor_hardiness = 30,
808 808 inc_stats = { [Stats.STAT_CON] = 5, [Stats.STAT_WIL] = 4, },
809 809 combat_mindpower = 10,
810 810 combat_mindcrit = 5,
... ...
... ... @@ -2126,3 +2126,51 @@ newTalent{
2126 2126 :format(damage, drain, daze, dazemax)
2127 2127 end,
2128 2128 }
  2129 +
  2130 +newTalent{
  2131 + name = "Relentless Strikes",
  2132 + type = {"technique/other", 1},
  2133 + points = 5,
  2134 + mode = "passive",
  2135 + getStamina = function(self, t) return self:combatTalentScale(t, 1/4, 5/4, 0.75) end,
  2136 + getCooldownReduction = function(self, t) return self:combatTalentLimit(t, 0.67, 0.09, 1/3) end, -- Limit < 67%
  2137 + info = function(self, t)
  2138 + local stamina = t.getStamina(self, t)
  2139 + local cooldown = t.getCooldownReduction(self, t)
  2140 + return ([[Reduces the cooldown on all your Pugilism talents by %d%%. Additionally, every time you earn a combo point, you will regain %0.2f stamina.
  2141 + Note that stamina gains from combo points occur before any talent stamina costs.]])
  2142 + :format(cooldown * 100, stamina)
  2143 + end,
  2144 +}
  2145 +
  2146 +newTalent{
  2147 + name = "Combo String",
  2148 + type = {"technique/other", 1},
  2149 + mode = "passive",
  2150 + points = 5,
  2151 + getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 0.3, 2.3)) end,
  2152 + getChance = function(self, t) return self:combatLimit(self:getTalentLevel(t) * (5 + self:getCun(5, true)), 100, 0, 0, 50, 50) end, -- Limit < 100%
  2153 + info = function(self, t)
  2154 + local duration = t.getDuration(self, t)
  2155 + local chance = t.getChance(self, t)
  2156 + return ([[When gaining a combo point, you have a %d%% chance to gain an extra combo point. Additionally, your combo points will last %d turns longer before expiring.
  2157 + The chance of building a second combo point will improve with your Cunning.]]):
  2158 + format(chance, duration)
  2159 + end,
  2160 +}
  2161 +
  2162 +newTalent{
  2163 + name = "Steady Mind",
  2164 + type = {"technique/other", 1},
  2165 + mode = "passive",
  2166 + points = 5,
  2167 + getDefense = function(self, t) return self:combatTalentStatDamage(t, "dex", 5, 35) end,
  2168 + getMental = function(self, t) return self:combatTalentStatDamage(t, "cun", 5, 35) end,
  2169 + info = function(self, t)
  2170 + local defense = t.getDefense(self, t)
  2171 + local saves = t.getMental(self, t)
  2172 + return ([[Superior cunning and training allows you to outthink and outwit your opponents' physical and mental assaults. Increases Defense by %d and Mental Save by %d.
  2173 + The Defense bonus will scale with your Dexterity, and the save bonus with your Cunning.]]):
  2174 + format(defense, saves)
  2175 + end,
  2176 +}
... ...
... ... @@ -42,9 +42,53 @@ newTalent{
42 42 }
43 43
44 44 newTalent{
45   - name = "Daunting Presence",
  45 + name = "Unflinching Resolve",
46 46 type = {"technique/conditioning", 2},
47 47 require = techs_con_req2,
  48 + mode = "passive",
  49 + points = 5,
  50 + getChance = function(self, t) return self:combatStatLimit("con", 1, .28, .745)*self:combatTalentLimit(t,100, 28,74.8) end, -- Limit < 100%
  51 + do_unflinching_resolve = function(self, t)
  52 + local effs = {}
  53 + -- Go through all spell effects
  54 + for eff_id, p in pairs(self.tmp) do
  55 + local e = self.tempeffect_def[eff_id]
  56 + if e.status == "detrimental" then
  57 + if e.subtype.stun then
  58 + effs[#effs+1] = {"effect", eff_id}
  59 + elseif e.subtype.blind and self:getTalentLevel(t) >=2 then
  60 + effs[#effs+1] = {"effect", eff_id}
  61 + elseif e.subtype.confusion and self:getTalentLevel(t) >=3 then
  62 + effs[#effs+1] = {"effect", eff_id}
  63 + elseif e.subtype.pin and self:getTalentLevel(t) >=4 then
  64 + effs[#effs+1] = {"effect", eff_id}
  65 + elseif e.subtype.slow and self:getTalentLevel(t) >=5 then
  66 + effs[#effs+1] = {"effect", eff_id}
  67 + end
  68 + end
  69 + end
  70 +
  71 + if #effs > 0 then
  72 + local eff = rng.tableRemove(effs)
  73 + if eff[1] == "effect" and rng.percent(t.getChance(self, t)) then
  74 + self:removeEffect(eff[2])
  75 + game.logSeen(self, "%s has recovered!", self.name:capitalize())
  76 + end
  77 + end
  78 + end,
  79 + info = function(self, t)
  80 + local chance = t.getChance(self, t)
  81 + return ([[You've learned to recover quickly from effects that would disable you. Each turn, you have a %d%% chance to recover from a single stun effect.
  82 + At talent level 2 you may also recover from blindness, at level 3 confusion, level 4 pins, and level 5 slows.
  83 + Only one effect may be recovered from each turn, and the chance to recover from an effect scales with your Constitution.]]):
  84 + format(chance)
  85 + end,
  86 +}
  87 +
  88 +newTalent{
  89 + name = "Daunting Presence",
  90 + type = {"technique/conditioning", 3},
  91 + require = techs_con_req3,
48 92 points = 5,
49 93 mode = "sustained",
50 94 sustain_stamina = 20,
... ... @@ -90,50 +134,6 @@ newTalent{
90 134 }
91 135
92 136 newTalent{
93   - name = "Unflinching Resolve",
94   - type = {"technique/conditioning", 3},
95   - require = techs_con_req3,
96   - mode = "passive",
97   - points = 5,
98   - getChance = function(self, t) return self:combatStatLimit("con", 1, .28, .745)*self:combatTalentLimit(t,100, 28,74.8) end, -- Limit < 100%
99   - do_unflinching_resolve = function(self, t)
100   - local effs = {}
101   - -- Go through all spell effects
102   - for eff_id, p in pairs(self.tmp) do
103   - local e = self.tempeffect_def[eff_id]
104   - if e.status == "detrimental" then
105   - if e.subtype.stun then
106   - effs[#effs+1] = {"effect", eff_id}
107   - elseif e.subtype.blind and self:getTalentLevel(t) >=2 then
108   - effs[#effs+1] = {"effect", eff_id}
109   - elseif e.subtype.confusion and self:getTalentLevel(t) >=3 then
110   - effs[#effs+1] = {"effect", eff_id}
111   - elseif e.subtype.pin and self:getTalentLevel(t) >=4 then
112   - effs[#effs+1] = {"effect", eff_id}
113   - elseif e.subtype.slow and self:getTalentLevel(t) >=5 then
114   - effs[#effs+1] = {"effect", eff_id}
115   - end
116   - end
117   - end
118   -
119   - if #effs > 0 then
120   - local eff = rng.tableRemove(effs)
121   - if eff[1] == "effect" and rng.percent(t.getChance(self, t)) then
122   - self:removeEffect(eff[2])
123   - game.logSeen(self, "%s has recovered!", self.name:capitalize())
124   - end
125   - end
126   - end,
127   - info = function(self, t)
128   - local chance = t.getChance(self, t)
129   - return ([[You've learned to recover quickly from effects that would disable you. Each turn, you have a %d%% chance to recover from a single stun effect.
130   - At talent level 2 you may also recover from blindness, at level 3 confusion, level 4 pins, and level 5 slows.
131   - Only one effect may be recovered from each turn, and the chance to recover from an effect scales with your Constitution.]]):
132   - format(chance)
133   - end,
134   -}
135   -
136   -newTalent{
137 137 name = "Adrenaline Surge", -- no stamina cost; it's main purpose is to give the player an alternative means of using stamina based talents
138 138 type = {"technique/conditioning", 4},
139 139 require = techs_con_req4,
... ...
... ... @@ -30,7 +30,7 @@ newTalent{
30 30 requires_target = true,
31 31 --on_pre_use = function(self, t, silent) if not self:hasEffect(self.EFF_COMBO) then if not silent then game.logPlayer(self, "You must have a combo going to use this ability.") end return false end return true end,
32 32 getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.8) + getStrikingStyle(self, dam) end,
33   - getDuration = function(self, t, comb) return math.ceil(self:combatTalentScale(t, 1, 5) * (0.25 + comb/5)) end,
  33 + getDuration = function(self, t, comb) return 2 + math.ceil(self:combatTalentScale(t, 1, 5) * (0.25 + comb/5)) end,
34 34 action = function(self, t)
35 35 local tg = {type="hit", range=self:getTalentRange(t)}
36 36 local x, y, target = self:getTarget(tg)
... ... @@ -199,7 +199,7 @@ newTalent{
199 199 tactical = { ATTACK = { weapon = 2 } },
200 200 requires_target = true,
201 201 --on_pre_use = function(self, t, silent) if not self:hasEffect(self.EFF_COMBO) then if not silent then game.logPlayer(self, "You must have a combo going to use this ability.") end return false end return true end,
202   - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 2, 3.5) + getStrikingStyle(self, dam) end,
  202 + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 2.8) + getStrikingStyle(self, dam) end,
203 203 getBonusDamage = function(self, t) return self:getCombo(combo)/5 end, -- shift more of the damage to CP
204 204 getStamina = function(self, t, comb)
205 205 return self:combatLimit((self:getTalentLevel(t) + comb), 0.5, 0, 0, 0.2, 10) * self.max_stamina
... ...
... ... @@ -39,23 +39,26 @@ newTalent{
39 39 no_unlearn_last = true,
40 40 getAttack = function(self, t) return self:getDex(25, true) end,
41 41 getDamage = function(self, t) return self:combatStatScale("dex", 5, 50) end,
  42 + getFlatReduction = function(self, t) return self:combatStatLimit("str", 20, 1, 12) end, -- limit because high flat reduction can fuck melee players
42 43 activate = function(self, t)
43 44 cancelStances(self)
44 45 local ret = {
45 46 atk = self:addTemporaryValue("combat_atk", t.getAttack(self, t)),
  47 + flat = self:addTemporaryValue("flat_damage_armor", {all = t.getFlatReduction(self, t)})
46 48 }
47 49 return ret
48 50 end,
49 51 deactivate = function(self, t, p)
50 52 self:removeTemporaryValue("combat_atk", p.atk)
  53 + self:removeTemporaryValue("flat_damage_armor", p.flat)
51 54 return true
52 55 end,
53 56 info = function(self, t)
54 57 local attack = t.getAttack(self, t)
55 58 local damage = t.getDamage(self, t)
56   - return ([[Increases your Accuracy by %d, and the damage multiplier of your striking talents (Pugilism and Finishing Moves) by %d%%.
57   - The bonuses will scale with your Dexterity.]]):
58   - format(attack, damage)
  59 + return ([[Increases your Accuracy by %d, the damage multiplier of your striking talents (Pugilism and Finishing Moves) by %d%%, and reduces all damage taken by %d.
  60 + The offensive bonuses scale with your Dexterity and the damage reduction with your Strength.]]):
  61 + format(attack, damage, t.getFlatReduction(self, t))
59 62 end,
60 63 }
61 64
... ... @@ -65,11 +68,12 @@ newTalent{
65 68 require = techs_dex_req1,
66 69 points = 5,
67 70 random_ego = "attack",
68   - cooldown = function(self, t) return math.ceil(3 * getRelentless(self, cd)) end,
  71 + --cooldown = function(self, t) return math.ceil(3 * getRelentless(self, cd)) end,
  72 + cooldown = 3,
69 73 message = "@Source@ throws two quick punches.",
70 74 tactical = { ATTACK = { weapon = 2 } },
71 75 requires_target = true,
72   - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.1, 0.8) + getStrikingStyle(self, dam) end,
  76 + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.5, 0.8) + getStrikingStyle(self, dam) end,
73 77 -- Learn the appropriate stance
74 78 on_learn = function(self, t)
75 79 if not self:knowTalent(self.T_STRIKING_STANCE) then
... ... @@ -134,31 +138,16 @@ newTalent{
134 138 end,
135 139 }
136 140
  141 +
  142 +
137 143 newTalent{
138   - name = "Relentless Strikes",
  144 + name = "Spinning Backhand",
139 145 type = {"technique/pugilism", 2},
140 146 require = techs_dex_req2,
141 147 points = 5,
142   - random_ego = "utility",
143   - mode = "passive",
144   - getStamina = function(self, t) return self:combatTalentScale(t, 1/4, 5/4, 0.75) end,
145   - getCooldownReduction = function(self, t) return self:combatTalentLimit(t, 0.67, 0.09, 1/3) end, -- Limit < 67%
146   - info = function(self, t)
147   - local stamina = t.getStamina(self, t)
148   - local cooldown = t.getCooldownReduction(self, t)
149   - return ([[Reduces the cooldown on all your Pugilism talents by %d%%. Additionally, every time you earn a combo point, you will regain %0.2f stamina.
150   - Note that stamina gains from combo points occur before any talent stamina costs.]])
151   - :format(cooldown * 100, stamina)
152   - end,
153   -}
154   -
155   -newTalent{
156   - name = "Spinning Backhand",
157   - type = {"technique/pugilism", 3},
158   - require = techs_dex_req3,
159   - points = 5,
160 148 random_ego = "attack",
161   - cooldown = function(self, t) return math.ceil(12 * getRelentless(self, cd)) end,
  149 + --cooldown = function(self, t) return math.ceil(12 * getRelentless(self, cd)) end,
  150 + cooldown = 8,
162 151 stamina = 12,
163 152 range = function(self, t) return math.ceil(2 + self:combatTalentScale(t, 2.2, 4.3)) end, -- being able to use this over rush without massive investment is much more fun
164 153 chargeBonus = function(self, t, dist) return self:combatScale(dist, 0.15, 1, 0.50, 5) end,
... ... @@ -254,18 +243,74 @@ newTalent{
254 243 end,
255 244 }
256 245
  246 +-- If kick, normal attack+small kick effect?
  247 +newTalent{
  248 + name = "Axe Kick",
  249 + type = {"technique/pugilism", 3},
  250 + require = techs_dex_req3,
  251 + points = 5,
  252 + stamina = 20,
  253 + random_ego = "attack",
  254 + cooldown = function(self, t)
  255 + return 20
  256 + end,
  257 + getDuration = function(self, t)
  258 + --return self:combatTalentScale(t, 1, 3)
  259 + return self:combatTalentLimit(t, 5, 1, 4)
  260 + end,
  261 + message = "@Source@ raises their leg and snaps it downward in a devastating axe kick.",
  262 + tactical = { ATTACK = { weapon = 2 } },
  263 + requires_target = true,
  264 + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.8, 2) + getStrikingStyle(self, dam) end, -- low damage scaling, investment gets the extra CP
  265 + action = function(self, t)
  266 + local tg = {type="hit", range=self:getTalentRange(t)}
  267 + local x, y, target = self:getTarget(tg)
  268 + if not x or not y or not target then return nil end
  269 + if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end
  270 +
  271 + -- breaks active grapples if the target is not grappled
  272 + if target:isGrappled(self) then
  273 + grappled = true
  274 + else
  275 + self:breakGrapples()
  276 + end
  277 +
  278 + local hit1 = false
  279 +
  280 + hit1 = self:attackTarget(target, nil, t.getDamage(self, t), true)
  281 +
  282 + if hit1 then
  283 + target:setEffect(target.EFF_DELIRIOUS_CONCUSSION, t.getDuration(self, t), {})
  284 + end
  285 +
  286 + -- build combo points
  287 + if hit1 then
  288 + self:buildCombo()
  289 + self:buildCombo()
  290 + end
  291 + return true
  292 +
  293 + end,
  294 + info = function(self, t)
  295 + local damage = t.getDamage(self, t) * 100
  296 + return ([[Deliver a devastating axe kick dealing %d%% damage. If the blow connects your target is brain damaged, causing all talents to fail for %d turns and earning 2 combo points.]])
  297 + :format(damage, t.getDuration(self, t))
  298 + end,
  299 +}
  300 +
257 301 newTalent{
258 302 name = "Flurry of Fists",
259 303 type = {"technique/pugilism", 4},
260 304 require = techs_dex_req4,
261 305 points = 5,
262 306 random_ego = "attack",
263   - cooldown = function(self, t) return math.ceil(24 * getRelentless(self, cd)) end,
  307 + --cooldown = function(self, t) return math.ceil(24 * getRelentless(self, cd)) end,
  308 + cooldown = 16,
264 309 stamina = 15,
265 310 message = "@Source@ lashes out with a flurry of fists.",
266 311 tactical = { ATTACK = { weapon = 2 } },
267 312 requires_target = true,
268   - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1.1) + getStrikingStyle(self, dam) end,
  313 + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 0.8) + getStrikingStyle(self, dam) end,
269 314 action = function(self, t)
270 315 local tg = {type="hit", range=self:getTalentRange(t)}
271 316 local x, y, target = self:getTarget(tg)
... ... @@ -317,4 +362,3 @@ newTalent{
317 362 :format(damage)
318 363 end,
319 364 }
320   -
... ...
... ... @@ -60,8 +60,9 @@ newTalent{
60 60 points = 5,
61 61 require = { stat = { cun=function(level) return 12 + level * 6 end }, },
62 62 mode = "passive",
63   - getDamage = function(self, t) return self:getTalentLevel(t) * 10 end,
64   - getPercentInc = function(self, t) return math.sqrt(self:getTalentLevel(t) / 5) / 2 end,
  63 + --getDamage = function(self, t) return self:getTalentLevel(t) * 10 end,
  64 + getDamage = function(self, t) return self:combatTalentScale(t, 10, 30, 0.25) end,
  65 + getPercentInc = function(self, t) return math.sqrt(self:getTalentLevel(t) / 5) / 4 end,
65 66 info = function(self, t)
66 67 local damage = t.getDamage(self, t)
67 68 local inc = t.getPercentInc(self, t)
... ... @@ -72,20 +73,30 @@ newTalent{
72 73 }
73 74
74 75 newTalent{
75   - name = "Steady Mind",
  76 + name = "Unified Body",
76 77 type = {"technique/unarmed-training", 2},
77   - mode = "passive",
78   - points = 5,
79 78 require = techs_cun_req2,
80   - getDefense = function(self, t) return self:combatTalentStatDamage(t, "dex", 5, 35) end,
81   - getMental = function(self, t) return self:combatTalentStatDamage(t, "cun", 5, 35) end,
82   - info = function(self, t)
83   - local defense = t.getDefense(self, t)
84   - local saves = t.getMental(self, t)
85   - return ([[Superior cunning and training allows you to outthink and outwit your opponents' physical and mental assaults. Increases Defense by %d and Mental Save by %d.
86   - The Defense bonus will scale with your Dexterity, and the save bonus with your Cunning.]]):
87   - format(defense, saves)
  79 + mode = "sustained",
  80 + points = 5,
  81 + --sustain_stamina = 50,
  82 + cooldown = 18,
  83 + tactical = { BUFF = 2 },
  84 + getStr = function(self, t) return math.ceil(self:combatTalentScale(t, 1.5, 7.5, 0.75) + self:combatTalentStatDamage(t, "cun", 2, 10)) end,
  85 + getCon = function(self, t) return math.ceil(self:combatTalentScale(t, 1.5, 7.5, 0.75) + self:combatTalentStatDamage(t, "dex", 5, 20)) end,
  86 + activate = function(self, t)
  87 + return {
  88 + stat1 = self:addTemporaryValue("inc_stats", {[self.STAT_CON] = t.getCon(self, t)}),
  89 + stat2 = self:addTemporaryValue("inc_stats", {[self.STAT_STR] = t.getStr(self, t)}),
  90 + }
88 91 end,
  92 + deactivate = function(self, t, p)
  93 + self:removeTemporaryValue("inc_stats", p.stat1)
  94 + self:removeTemporaryValue("inc_stats", p.stat2)
  95 + return true
  96 + end,
  97 + info = function(self, t)
  98 + return ([[Your mastery of unarmed combat unifies your body. Increases your Strength by %d based on Cunning and your Constitution by %d based on Dexterity.]]):format(t.getStr(self, t), t.getCon(self, t))
  99 + end
89 100 }
90 101
91 102 newTalent{
... ... @@ -106,18 +117,41 @@ newTalent{
106 117 }
107 118
108 119 newTalent{
109   - name = "Combo String",
  120 + name = "Reflex Defense",
110 121 type = {"technique/unarmed-training", 4},
111   - require = techs_cun_req4,
112   - mode = "passive",
  122 + require = techs_cun_req4, -- bit icky since this is clearly dex, but whatever, cun turns defense special *handwave*
113 123 points = 5,
114   - getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 0.3, 2.3)) end,
115   - getChance = function(self, t) return self:combatLimit(self:getTalentLevel(t) * (5 + self:getCun(5, true)), 100, 0, 0, 50, 50) end, -- Limit < 100%
  124 + mode = "sustained",
  125 + cooldown = 10,
  126 + no_energy = true, -- annoying when sustains take energy without a good reason
  127 + tactical = { BUFF = 2 },
  128 + getDefensePct = function(self, t)
  129 + return self:combatTalentLimit(t, 1, 0.05, 0.9) -- ugly, fix later
  130 + end,
  131 + getDamageReduction = function(self, t)
  132 + return t.getDefensePct(self, t) * self:combatDefense() / 100
  133 + end,
  134 + getDamagePct = function(self, t)
  135 + return 0.2
  136 + end,
  137 + activate = function(self, t)
  138 +
  139 + return {}
  140 + end,
  141 + deactivate = function(self, t, p)
  142 + return true
  143 + end,
  144 + callbackOnHit = function(self, t, cb)
  145 + if ( cb.value > (t.getDamagePct(self, t) * self.max_life) ) then
  146 + local damageReduction = cb.value * t.getDamageReduction(self, t)
  147 + cb.value = cb.value - damageReduction
  148 + game.logPlayer(self, "#GREEN#You twist your body in complex ways mitigating the blow by " .. math.ceil(damageReduction) .. ".")
  149 + end
  150 + return cb.value
  151 + end,
116 152 info = function(self, t)
117   - local duration = t.getDuration(self, t)
118   - local chance = t.getChance(self, t)
119   - return ([[When gaining a combo point, you have a %d%% chance to gain an extra combo point. Additionally, your combo points will last %d turns longer before expiring.
120   - The chance of building a second combo point will improve with your Cunning.]]):
121   - format(chance, duration)
  153 + return ([[Your understanding of physiology allows you to apply your reflexes in new ways. Whenever you receive damage greater than %d%% of your maximum life you reduce that damage by %d%% based on your defense.]]):
  154 + format(t.getDamagePct(self, t)*100, t.getDamageReduction(self, t)*100 )
122 155 end,
123 156 }
  157 +
... ...
... ... @@ -24,6 +24,26 @@ local Chat = require "engine.Chat"
24 24 local Map = require "engine.Map"
25 25 local Level = require "engine.Level"
26 26
  27 +
  28 +
  29 +newEffect{
  30 + name = "DELIRIOUS_CONCUSSION", image = "talents/slippery_moss.png",
  31 + desc = "Concussion",
  32 + long_desc = function(self, eff) return ("The target can't think straight, causing their actions to fail."):format() end,
  33 + type = "physical",
  34 + subtype = { mental=true },
  35 + status = "detrimental",
  36 + parameters = {},
  37 + on_gain = function(self, err) return "#Target#'s brain isn't quite working right!", "+Concussion" end,
  38 + on_lose = function(self, err) return "#Target# regains their concentration.", "-Concussion" end,
  39 + activate = function(self, eff)
  40 + eff.tmpid = self:addTemporaryValue("talent_fail_chance", 100)
  41 + end,
  42 + deactivate = function(self, eff)
  43 + self:removeTemporaryValue("talent_fail_chance", eff.tmpid)
  44 + end,
  45 +}
  46 +
27 47 newEffect{
28 48 name = "CUT", image = "effects/cut.png",
29 49 desc = "Bleeding",
... ...