Commit 3c6e16fb506a0dc12324f2187d77c20202531f7b
1 parent
be347a9d
Updated whip & punch sounds
Big brawlers update, removing some unfun talents in favor of better ones
Showing
16 changed files
with
246 additions
and
100 deletions
... | ... | @@ -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, | ... | ... |

3.7 KB

3.46 KB

2.36 KB
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
... | ... | @@ -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", | ... | ... |
-
Please register or login to post a comment