Commit 920771afedb9f2716bd9060a9afc540e93c49a6f
1 parent
a784489c
Revamped Brawler's Finishing Moves tree to make it more appealing
Showing
5 changed files
with
111 additions
and
47 deletions
... | ... | @@ -305,6 +305,7 @@ newBirthDescriptor{ |
305 | 305 | [ActorTalents.T_DOUBLE_STRIKE] = 1, |
306 | 306 | [ActorTalents.T_WEAPON_COMBAT] = 1, |
307 | 307 | [ActorTalents.T_ARMOUR_TRAINING] = 1, |
308 | + [ActorTalents.T_UNARMED_MASTERY] = 1, -- early game is absolutely stupid without this | |
308 | 309 | }, |
309 | 310 | copy = { |
310 | 311 | resolvers.equip{ id=true, | ... | ... |

3.33 KB
... | ... | @@ -2069,3 +2069,60 @@ newTalent{ |
2069 | 2069 | format(t.getDuration(self, t), damDesc(self, DamageType.COLD, self:combatTalentSpellDamage(t, 5, 140))) |
2070 | 2070 | end, |
2071 | 2071 | } |
2072 | + | |
2073 | + | |
2074 | +newTalent{ | |
2075 | + name = "Body Shot", | |
2076 | + type = {"technique/other", 1}, | |
2077 | + points = 5, | |
2078 | + cooldown = 10, | |
2079 | + stamina = 10, | |
2080 | + message = "@Source@ throws a body shot.", | |
2081 | + tactical = { ATTACK = { weapon = 2 }, DISABLE = { stun = 2 } }, | |
2082 | + requires_target = true, | |
2083 | + --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, | |
2084 | + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.8) + getStrikingStyle(self, dam) end, | |
2085 | + getDuration = function(self, t, comb) return math.ceil(self:combatTalentScale(t, 1, 5) * (0.25 + comb/5)) end, | |
2086 | + getDrain = function(self, t) return self:combatTalentScale(t, 2, 10, 0.75) * self:getCombo(combo) end, | |
2087 | + action = function(self, t) | |
2088 | + local tg = {type="hit", range=self:getTalentRange(t)} | |
2089 | + local x, y, target = self:getTarget(tg) | |
2090 | + if not x or not y or not target then return nil end | |
2091 | + if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end | |
2092 | + | |
2093 | + -- breaks active grapples if the target is not grappled | |
2094 | + if target:isGrappled(self) then | |
2095 | + grappled = true | |
2096 | + else | |
2097 | + self:breakGrapples() | |
2098 | + end | |
2099 | + | |
2100 | + local hit = self:attackTarget(target, nil, t.getDamage(self, t), true) | |
2101 | + | |
2102 | + if hit then | |
2103 | + -- try to daze | |
2104 | + if target:canBe("stun") then | |
2105 | + target:setEffect(target.EFF_DAZED, t.getDuration(self, t, self:getCombo(combo)), {apply_power=self:combatPhysicalpower()}) | |
2106 | + else | |
2107 | + game.logSeen(target, "%s resists the body shot!", target.name:capitalize()) | |
2108 | + end | |
2109 | + | |
2110 | + target:incStamina(- t.getDrain(self, t)) | |
2111 | + | |
2112 | + end | |
2113 | + | |
2114 | + self:clearCombo() | |
2115 | + | |
2116 | + return true | |
2117 | + end, | |
2118 | + info = function(self, t) | |
2119 | + local damage = t.getDamage(self, t) * 100 | |
2120 | + local drain = self:getTalentLevel(t) * 2 | |
2121 | + local daze = t.getDuration(self, t, 0) | |
2122 | + local dazemax = t.getDuration(self, t, 5) | |
2123 | + return ([[A punch to the body that deals %d%% damage, drains %d of the target's stamina per combo point, and dazes the target for %d to %d turns, depending on the amount of combo points you've accumulated. | |
2124 | + The daze chance will increase with your Physical Power. | |
2125 | + Using this talent removes your combo points.]]) | |
2126 | + :format(damage, drain, daze, dazemax) | |
2127 | + end, | |
2128 | +} | ... | ... |
... | ... | @@ -81,9 +81,9 @@ newTalent{ |
81 | 81 | tactical = { ATTACK = { weapon = 2 }, }, |
82 | 82 | requires_target = true, |
83 | 83 | --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, |
84 | - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.1, 0.8) + getStrikingStyle(self, dam) end, | |
85 | - getAreaDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 10, 300) * (1 + getStrikingStyle(self, dam)) end, | |
86 | - radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.25, 2.25)) end, | |
84 | + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.6, 1.5) + getStrikingStyle(self, dam) end, | |
85 | + getAreaDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 20, 600) * (1 + getStrikingStyle(self, dam)) end, | |
86 | + radius = function(self, t) return (1 + self:getCombo(combo) ) end, | |
87 | 87 | action = function(self, t) |
88 | 88 | local tg = {type="hit", range=self:getTalentRange(t)} |
89 | 89 | local x, y, target = self:getTarget(tg) |
... | ... | @@ -117,67 +117,73 @@ newTalent{ |
117 | 117 | local areamax = t.getAreaDamage(self, t) * 1.25 |
118 | 118 | local radius = self:getTalentRadius(t) |
119 | 119 | return ([[A powerful concussive punch that deals %d%% weapon damage to your target. If the punch hits, all targets in a radius of %d will take %0.2f to %0.2f damage, depending on the amount of combo points you've accumulated. |
120 | - The area damage will scale with your Strength, and the radius will increase by 1 for every four talent levels. | |
120 | + The area damage will scale with your Strength, and the radius will increase by 1 per combo point. | |
121 | 121 | Using this talent removes your combo points.]]) |
122 | 122 | :format(damage, radius, damDesc(self, DamageType.PHYSICAL, area), damDesc(self, DamageType.PHYSICAL, areamax)) |
123 | 123 | end, |
124 | 124 | } |
125 | 125 | |
126 | 126 | newTalent{ |
127 | - name = "Body Shot", | |
127 | + name = "Butterfly Kick", | |
128 | 128 | type = {"technique/finishing-moves", 3}, |
129 | 129 | require = techs_dex_req3, |
130 | 130 | points = 5, |
131 | 131 | random_ego = "attack", |
132 | - cooldown = 10, | |
132 | + cooldown = function(self, t) | |
133 | + return self:combatTalentScale(t, 30, 10) | |
134 | + end, | |
133 | 135 | stamina = 10, |
134 | - message = "@Source@ throws a body shot.", | |
135 | - tactical = { ATTACK = { weapon = 2 }, DISABLE = { stun = 2 } }, | |
136 | + range = function(self, t) | |
137 | + return (2 + self:getCombo(combo) ) or 1 | |
138 | + end, | |
139 | + radius = function(self, t) | |
140 | + return 1 | |
141 | + end, | |
142 | + getDamage = function(self, t) | |
143 | + return self:combatTalentWeaponDamage(t, 1, 1.5) + getStrikingStyle(self, dam) | |
144 | + end, | |
145 | + getBonusDamage = function(self, t) return (self:getCombo(combo)/10) or 0 end, | |
136 | 146 | requires_target = true, |
137 | - --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, | |
138 | - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.8) + getStrikingStyle(self, dam) end, | |
139 | - getDuration = function(self, t, comb) return math.ceil(self:combatTalentScale(t, 1, 5) * (0.25 + comb/5)) end, | |
140 | - getDrain = function(self, t) return self:combatTalentScale(t, 2, 10, 0.75) * self:getCombo(combo) end, | |
147 | + no_npc_use = true, -- I mark this by default if I don't understand how the AI might use something, which is always | |
148 | + target = function(self, t) | |
149 | + return {type="ball", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t)} | |
150 | + end, | |
141 | 151 | action = function(self, t) |
142 | - local tg = {type="hit", range=self:getTalentRange(t)} | |
152 | + if not (self:getCombo(combo) > 0) then return end -- abort if we have no CP, this is to make it base 2+requires CP because base 1 autotargets in melee range | |
153 | + local tg = self:getTalentTarget(t) | |
143 | 154 | local x, y, target = self:getTarget(tg) |
144 | - if not x or not y or not target then return nil end | |
145 | - if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end | |
155 | + if not x or not y then return nil end | |
156 | + local _ _, x, y = self:canProject(tg, x, y) | |
146 | 157 | |
147 | - -- breaks active grapples if the target is not grappled | |
148 | - if target:isGrappled(self) then | |
149 | - grappled = true | |
150 | - else | |
151 | - self:breakGrapples() | |
158 | + if game.level.map(x, y, Map.ACTOR) then | |
159 | + x, y = util.findFreeGrid(x, y, 1, true, {[Map.ACTOR]=true}) | |
160 | + if not x then return end | |
152 | 161 | end |
153 | 162 | |
154 | - local hit = self:attackTarget(target, nil, t.getDamage(self, t), true) | |
155 | - | |
156 | - if hit then | |
157 | - -- try to daze | |
158 | - if target:canBe("stun") then | |
159 | - target:setEffect(target.EFF_DAZED, t.getDuration(self, t, self:getCombo(combo)), {apply_power=self:combatPhysicalpower()}) | |
160 | - else | |
161 | - game.logSeen(target, "%s resists the body shot!", target.name:capitalize()) | |
162 | - end | |
163 | - | |
164 | - target:incStamina(- t.getDrain(self, t)) | |
163 | + if game.level.map:checkAllEntities(x, y, "block_move") then return end | |
165 | 164 | |
165 | + local ox, oy = self.x, self.y | |
166 | + self:move(x, y, true) | |
167 | + if config.settings.tome.smooth_move > 0 then | |
168 | + self:resetMoveAnim() | |
169 | + self:setMoveAnim(ox, oy, 8, 5) | |
166 | 170 | end |
167 | 171 | |
168 | - self:clearCombo() | |
172 | + self:project(tg, self.x, self.y, function(px, py, tg, self) | |
173 | + local target = game.level.map(px, py, Map.ACTOR) | |
174 | + if target and target ~= self then | |
175 | + local totalDamage = t.getDamage(self, t) * (1 + t.getBonusDamage(self, t) ) | |
176 | + | |
169 | 177 | |
178 | + local hit = self:attackTarget(target, nil, totalDamage, true) | |
179 | + end | |
180 | + end) | |
181 | + | |
182 | + self:clearCombo() | |
170 | 183 | return true |
171 | 184 | end, |
172 | 185 | info = function(self, t) |
173 | - local damage = t.getDamage(self, t) * 100 | |
174 | - local drain = self:getTalentLevel(t) * 2 | |
175 | - local daze = t.getDuration(self, t, 0) | |
176 | - local dazemax = t.getDuration(self, t, 5) | |
177 | - return ([[A punch to the body that deals %d%% damage, drains %d of the target's stamina per combo point, and dazes the target for %d to %d turns, depending on the amount of combo points you've accumulated. | |
178 | - The daze chance will increase with your Physical Power. | |
179 | - Using this talent removes your combo points.]]) | |
180 | - :format(damage, drain, daze, dazemax) | |
186 | + return ([[You spin into a flying leap and deliver a powerful kick dealing %d%% weapon damage to all enemies in a radius of 1 as you land. The range will increase by 1 per combo point and total damage will increase by 10%% per combo point. You must have at least 1 CP to use this talent.]]):format(t.getDamage(self, t)*100) | |
181 | 187 | end, |
182 | 188 | } |
183 | 189 | |
... | ... | @@ -193,8 +199,8 @@ newTalent{ |
193 | 199 | tactical = { ATTACK = { weapon = 2 } }, |
194 | 200 | requires_target = true, |
195 | 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, |
196 | - getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.4, 2.1) + getStrikingStyle(self, dam) end, | |
197 | - getBonusDamage = function(self, t) return self:getCombo(combo)/10 end, | |
202 | + getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 2, 3.5) + getStrikingStyle(self, dam) end, | |
203 | + getBonusDamage = function(self, t) return self:getCombo(combo)/5 end, -- shift more of the damage to CP | |
198 | 204 | getStamina = function(self, t, comb) |
199 | 205 | return self:combatLimit((self:getTalentLevel(t) + comb), 0.5, 0, 0, 0.2, 10) * self.max_stamina |
200 | 206 | end, -- Limit 50% stamina gain |
... | ... | @@ -211,7 +217,7 @@ newTalent{ |
211 | 217 | self:breakGrapples() |
212 | 218 | end |
213 | 219 | |
214 | - local damage = t.getDamage(self, t) + (t.getBonusDamage(self, t) or 0) | |
220 | + local damage = t.getDamage(self, t) * (1 + (t.getBonusDamage(self, t) or 0)) | |
215 | 221 | |
216 | 222 | local hit = self:attackTarget(target, nil, damage, true) |
217 | 223 | |
... | ... | @@ -237,12 +243,12 @@ newTalent{ |
237 | 243 | end, |
238 | 244 | info = function(self, t) |
239 | 245 | local damage = t.getDamage(self, t) * 100 |
246 | + local maxDamage = damage * 2 | |
240 | 247 | local stamina = t.getStamina(self, t, 0)/self.max_stamina*100 |
241 | 248 | local staminamax = t.getStamina(self, t, 5)/self.max_stamina*100 |
242 | - return ([[A vicious finishing strike that deals %d%% damage + 10%% damage per combo point you have. If the target ends up with low enough life (<20%%), it might be instantly killed. | |
249 | + return ([[A vicious finishing strike that deals %d%% damage increased by 20%% per combo point you have up to a max of %d%%. If the target ends up with low enough life (<20%%), it might be instantly killed. | |
243 | 250 | Killing a target with Haymaker will instantly restore %d%% to %d%% of your maximum stamina, depending on the amount of combo points you've accumulated. |
244 | 251 | Using this talent removes your combo points.]]) |
245 | - :format(damage, stamina, staminamax) | |
252 | + :format(damage, maxDamage, stamina, staminamax) | |
246 | 253 | end, |
247 | 254 | } |
248 | - | ... | ... |
... | ... | @@ -160,7 +160,7 @@ newTalent{ |
160 | 160 | random_ego = "attack", |
161 | 161 | cooldown = function(self, t) return math.ceil(12 * getRelentless(self, cd)) end, |
162 | 162 | stamina = 12, |
163 | - range = function(self, t) return math.ceil(self:combatTalentScale(t, 2.2, 4.3)) end, | |
163 | + 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 | 164 | chargeBonus = function(self, t, dist) return self:combatScale(dist, 0.15, 1, 0.50, 5) end, |
165 | 165 | message = "@Source@ lashes out with a spinning backhand.", |
166 | 166 | tactical = { ATTACKAREA = { weapon = 2 }, CLOSEIN = 1 }, | ... | ... |
-
Please register or login to post a comment