Commit 920771afedb9f2716bd9060a9afc540e93c49a6f

Authored by DarkGod
1 parent a784489c

Revamped Brawler's Finishing Moves tree to make it more appealing

... ... @@ -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,
... ...
... ... @@ -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 },
... ...