...
|
...
|
@@ -73,54 +73,54 @@ newTalent{ |
73
|
73
|
end
|
74
|
74
|
end,
|
75
|
75
|
action = function(self, t)
|
76
|
|
-
|
|
76
|
+
|
77
|
77
|
local tg = {type="hit", range=self:getTalentRange(t)}
|
78
|
78
|
local x, y, target = self:getTarget(tg)
|
79
|
79
|
if not x or not y or not target then return nil end
|
80
|
80
|
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
|
81
|
|
-
|
|
81
|
+
|
82
|
82
|
local grappled = false
|
83
|
|
-
|
|
83
|
+
|
84
|
84
|
-- force stance change
|
85
|
|
- if target and not self:isTalentActive(self.T_GRAPPLING_STANCE) then
|
|
85
|
+ if target and not self:isTalentActive(self.T_GRAPPLING_STANCE) then
|
86
|
86
|
self:forceUseTalent(self.T_GRAPPLING_STANCE, {ignore_energy=true, ignore_cd = true})
|
87
|
87
|
end
|
88
|
|
-
|
|
88
|
+
|
89
|
89
|
-- breaks active grapples if the target is not grappled
|
90
|
90
|
if target:isGrappled(self) then
|
91
|
91
|
grappled = true
|
92
|
92
|
else
|
93
|
93
|
self:breakGrapples()
|
94
|
94
|
end
|
95
|
|
-
|
|
95
|
+
|
96
|
96
|
-- end the talent without effect if the target is to big
|
97
|
97
|
if self:grappleSizeCheck(target) then
|
98
|
98
|
return true
|
99
|
99
|
end
|
100
|
|
-
|
|
100
|
+
|
101
|
101
|
-- start the grapple
|
102
|
102
|
local hit = self:startGrapple(target)
|
103
|
|
-
|
|
103
|
+
|
104
|
104
|
local duration = t.getDuration(self, t)
|
105
|
|
-
|
|
105
|
+
|
106
|
106
|
-- do crushing hold if we know it
|
107
|
107
|
if hit and self:knowTalent(self.T_CRUSHING_HOLD) then
|
108
|
|
- local t = self:getTalentFromId(self.T_CRUSHING_HOLD)
|
|
108
|
+ local t = self:getTalentFromId(self.T_CRUSHING_HOLD)
|
109
|
109
|
if grappled and not target.no_breath and not target.undead and target:canBe("silence") then
|
110
|
110
|
target:setEffect(target.EFF_STRANGLE_HOLD, duration, {src=self, power=t.getDamage(self, t) * 1.5})
|
111
|
111
|
else
|
112
|
112
|
target:setEffect(target.EFF_CRUSHING_HOLD, duration, {src=self, power=t.getDamage(self, t)})
|
113
|
113
|
end
|
114
|
|
-
|
|
114
|
+
|
115
|
115
|
end
|
116
|
|
-
|
|
116
|
+
|
117
|
117
|
return true
|
118
|
118
|
end,
|
119
|
119
|
info = function(self, t)
|
120
|
120
|
local duration = t.getDuration(self, t)
|
121
|
121
|
local power = t.getPower(self, t)
|
122
|
122
|
local drain = t.getDrain(self, t)
|
123
|
|
- return ([[Grapples the target for %d turns. A grappled opponent will be unable to move and it's attack and defense will be reduced by %d. Any movement from the target or you will break the grapple. Maintaining a grapple drains %d stamina per turn.
|
|
123
|
+ return ([[Grapples the target for %d turns. A grappled opponent will be unable to move and its attack and defense will be reduced by %d. Any movement from the target or you will break the grapple. Maintaining a grapple drains %d stamina per turn.
|
124
|
124
|
You may only grapple a single target at a time and using any targeted unarmed talent on a target that you're not grappling will break the grapple.
|
125
|
125
|
The grapple attack and defense reduction as well as success chance will scale with the strength stat.
|
126
|
126
|
Performing this action will switch your stance to Grappling Stance.]])
|
...
|
...
|
@@ -143,40 +143,40 @@ newTalent{ |
143
|
143
|
getMaim = function(self, t) return 10 + self:combatTalentStatDamage(t, "str", 5, 20) * (1 + getGrapplingStyle(self, dam)) end,
|
144
|
144
|
-- Learn the appropriate stance
|
145
|
145
|
action = function(self, t)
|
146
|
|
-
|
|
146
|
+
|
147
|
147
|
local tg = {type="hit", range=self:getTalentRange(t)}
|
148
|
148
|
local x, y, target = self:getTarget(tg)
|
149
|
149
|
if not x or not y or not target then return nil end
|
150
|
150
|
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
|
151
|
|
-
|
|
151
|
+
|
152
|
152
|
local grappled = false
|
153
|
|
-
|
|
153
|
+
|
154
|
154
|
-- breaks active grapples if the target is not grappled
|
155
|
155
|
if target:isGrappled(self) then
|
156
|
156
|
grappled = true
|
157
|
157
|
else
|
158
|
158
|
self:breakGrapples()
|
159
|
159
|
end
|
160
|
|
-
|
|
160
|
+
|
161
|
161
|
-- end the talent without effect if the target is to big
|
162
|
162
|
if self:grappleSizeCheck(target) then
|
163
|
163
|
return true
|
164
|
164
|
end
|
165
|
|
-
|
|
165
|
+
|
166
|
166
|
local hit = self:startGrapple (target)
|
167
|
|
-
|
|
167
|
+
|
168
|
168
|
-- deal damage and maim if appropriate
|
169
|
169
|
if hit then
|
170
|
|
-
|
|
170
|
+
|
171
|
171
|
if grappled then
|
172
|
172
|
self:project(target, x, y, DamageType.PHYSICAL, self:physicalCrit(t.getDamage(self, t), nil, target))
|
173
|
173
|
target:setEffect(target.EFF_MAIMED, t.getDuration(self, t), {power=t.getMaim(self, t)})
|
174
|
174
|
else
|
175
|
175
|
self:project(target, x, y, DamageType.PHYSICAL, self:physicalCrit(t.getDamage(self, t), nil, target))
|
176
|
176
|
end
|
177
|
|
-
|
|
177
|
+
|
178
|
178
|
end
|
179
|
|
-
|
|
179
|
+
|
180
|
180
|
return true
|
181
|
181
|
end,
|
182
|
182
|
info = function(self, t)
|
...
|
...
|
@@ -222,14 +222,14 @@ newTalent{ |
222
|
222
|
getSlam = function(self, t) return 20 + self:combatTalentStatDamage(t, "str", 30, 500) * (1 + getGrapplingStyle(self, dam)) end,
|
223
|
223
|
-- Learn the appropriate stance
|
224
|
224
|
action = function(self, t)
|
225
|
|
-
|
|
225
|
+
|
226
|
226
|
local tg = {type="hit", range=self:getTalentRange(t)}
|
227
|
227
|
local x, y, target = self:getTarget(tg)
|
228
|
228
|
if not x or not y or not target then return nil end
|
229
|
229
|
if math.floor(core.fov.distance(self.x, self.y, x, y)) > self:getTalentRange(t) then return nil end
|
230
|
|
-
|
|
230
|
+
|
231
|
231
|
local grappled = false
|
232
|
|
-
|
|
232
|
+
|
233
|
233
|
-- do the rush
|
234
|
234
|
local l = line.new(self.x, self.y, x, y)
|
235
|
235
|
local tx, ty = self.x, self.y
|
...
|
...
|
@@ -253,18 +253,18 @@ newTalent{ |
253
|
253
|
else
|
254
|
254
|
self:breakGrapples()
|
255
|
255
|
end
|
256
|
|
-
|
|
256
|
+
|
257
|
257
|
if math.floor(core.fov.distance(self.x, self.y, x, y)) == 1 then
|
258
|
258
|
-- end the talent without effect if the target is to big
|
259
|
259
|
if self:grappleSizeCheck(target) then
|
260
|
260
|
return true
|
261
|
261
|
end
|
262
|
|
-
|
|
262
|
+
|
263
|
263
|
local hit = self:startGrapple (target)
|
264
|
|
-
|
|
264
|
+
|
265
|
265
|
-- takedown or slam as appropriate
|
266
|
266
|
if hit then
|
267
|
|
-
|
|
267
|
+
|
268
|
268
|
if grappled then
|
269
|
269
|
self:project(target, x, y, DamageType.PHYSICAL, self:physicalCrit(t.getSlam(self, t), nil, target))
|
270
|
270
|
if target:checkHit(self:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("stun") then
|
...
|
...
|
@@ -280,10 +280,10 @@ newTalent{ |
280
|
280
|
game.logSeen(target, "%s resists the daze!", target.name:capitalize())
|
281
|
281
|
end
|
282
|
282
|
end
|
283
|
|
-
|
|
283
|
+
|
284
|
284
|
end
|
285
|
285
|
end
|
286
|
|
-
|
|
286
|
+
|
287
|
287
|
return true
|
288
|
288
|
end,
|
289
|
289
|
info = function(self, t)
|
...
|
...
|
|