Showing
9 changed files
with
43 additions
and
43 deletions
... | ... | @@ -131,7 +131,7 @@ newTalent{ |
131 | 131 | no_energy = true, |
132 | 132 | tactical = { DEFEND = 2 }, |
133 | 133 | getShield = function(self, t) return 40 + self:combatTalentSpellDamage(t, 5, 500) / 10 end, |
134 | - getDisruption = function(self, t) return self:combatTalentSpellDamage(t, 10, 20) end, | |
134 | + getDisruption = function(self, t) return 20 + self:combatTalentSpellDamage(t, 1, 10) end, | |
135 | 135 | getNumEffects = function(self, t) return math.max(1,math.floor(self:combatTalentScale(t, 3, 7, "log"))) end, |
136 | 136 | on_pre_use = function(self, t) |
137 | 137 | for eff_id, p in pairs(self.tmp) do | ... | ... |
... | ... | @@ -158,7 +158,7 @@ newTalent{ |
158 | 158 | return tg |
159 | 159 | end, |
160 | 160 | getNb = function(self, t) return math.floor(self:combatTalentScale(t, 3.3, 4.7)) end, |
161 | - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 180) end, | |
161 | + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 180) end, -- 100, 900 at 6.5 assuming all hit. Not bad. | |
162 | 162 | action = function(self, t) |
163 | 163 | local tg = self:getTalentTarget(t) |
164 | 164 | local x, y = self:getTarget(tg) |
... | ... | @@ -201,10 +201,13 @@ newTalent{ |
201 | 201 | getNb = function(self, t) return math.floor(self:combatTalentLimit(t, 15, 5, 9)) end, -- Limit duration < 15 |
202 | 202 | callbackOnTalentPost = function(self, t, ab) |
203 | 203 | if not self:hasEffect(self.EFF_AETHER_AVATAR) then return end |
204 | - if ab.type[1]:find("^aether/") or ab.type[1]:find("^arcane/") then return end | |
205 | - if ab.type[1]:find("^aegis/") and self:hasEffect(self.EFF_AETHER_AVATAR).aegis then return end | |
204 | + if ab.mode == "sustained" then return end | |
205 | + if ab.use_only_arcane then return end | |
206 | + if ab.type[1] == "spell/aegis" and self:hasEffect(self.EFF_AETHER_AVATAR).aegis then return end | |
206 | 207 | if self.turn_procs.aether_avatar_penalty then return end |
207 | 208 | self:incMana(-50) |
209 | + game.logSeen(self, "#VIOLET#%s loses 50 mana from using a non-Arcane talent!#LAST#", self.name:capitalize()) | |
210 | + | |
208 | 211 | self.turn_procs.aether_avatar_penalty = true |
209 | 212 | end, |
210 | 213 | action = function(self, t) |
... | ... | @@ -215,7 +218,7 @@ newTalent{ |
215 | 218 | end, |
216 | 219 | info = function(self, t) |
217 | 220 | return ([[Fill yourself with aether forces, completely surrounding your body for %d turns. |
218 | - While active, you lose 50 mana the first time you use a non-Arcane or Aether talent each turn, your cooldown for them is divided by 3, your arcane damage is increased by 25%%, your Disruption Shield radius is increased to 10, and your maximum mana is increased by 33%%.]]): | |
221 | + While active, you lose 50 mana the first time you use a non-sustain, non-Arcane or Aether talent each turn, your cooldown for them is divided by 3, your arcane damage and penetration is increased by 25%%, your Disruption Shield radius is increased to 10, and your maximum mana is increased by 33%%.]]): | |
219 | 222 | format(t.getNb(self, t)) |
220 | 223 | end, |
221 | 224 | } | ... | ... |
... | ... | @@ -22,7 +22,6 @@ newTalent{ |
22 | 22 | type = {"spell/air", 1}, |
23 | 23 | require = spells_req1, |
24 | 24 | points = 5, |
25 | - random_ego = "attack", | |
26 | 25 | mana = 10, |
27 | 26 | cooldown = 3, |
28 | 27 | tactical = { ATTACK = {LIGHTNING = 2} }, |
... | ... | @@ -50,10 +49,12 @@ newTalent{ |
50 | 49 | end, |
51 | 50 | info = function(self, t) |
52 | 51 | local damage = t.getDamage(self, t) |
53 | - return ([[Conjures up mana into a powerful beam of lightning, doing %0.2f to %0.2f damage | |
52 | + return ([[Conjures up mana into a powerful beam of lightning, doing %0.2f to %0.2f damage (%0.2f average) | |
54 | 53 | The damage will increase with your Spellpower.]]): |
55 | 54 | format(damDesc(self, DamageType.LIGHTNING, damage / 3), |
56 | - damDesc(self, DamageType.LIGHTNING, damage)) | |
55 | + damDesc(self, DamageType.LIGHTNING, damage), | |
56 | + damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2)) | |
57 | + | |
57 | 58 | end, |
58 | 59 | } |
59 | 60 | |
... | ... | @@ -62,8 +63,7 @@ newTalent{ |
62 | 63 | type = {"spell/air", 2}, |
63 | 64 | require = spells_req2, |
64 | 65 | points = 5, |
65 | - random_ego = "attack", | |
66 | - mana = 30, | |
66 | + mana = 20, | |
67 | 67 | cooldown = 8, |
68 | 68 | tactical = { ATTACKAREA = {LIGHTNING = 2} }, --note: only considers the primary target |
69 | 69 | range = 10, |
... | ... | @@ -71,7 +71,7 @@ newTalent{ |
71 | 71 | reflectable = true, |
72 | 72 | requires_target = true, |
73 | 73 | target = function(self, t) return {type="bolt", range=self:getTalentRange(t), talent=t} end, |
74 | - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 250) end, | |
74 | + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 330) end, | |
75 | 75 | getTargetCount = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8, "log")) end, |
76 | 76 | action = function(self, t) |
77 | 77 | local tg = self:getTalentTarget(t) |
... | ... | @@ -132,11 +132,12 @@ newTalent{ |
132 | 132 | info = function(self, t) |
133 | 133 | local damage = t.getDamage(self, t) |
134 | 134 | local targets = t.getTargetCount(self, t) |
135 | - return ([[Invokes a forking beam of lightning doing %0.2f to %0.2f damage and forking to another target. | |
135 | + return ([[Invokes a forking beam of lightning doing %0.2f to %0.2f damage (%0.2f average) and forking to another target. | |
136 | 136 | It can hit up to %d targets up to 10 grids apart, and will never hit the same one twice; nor will it hit the caster. |
137 | 137 | The damage will increase with your Spellpower.]]): |
138 | 138 | format(damDesc(self, DamageType.LIGHTNING, damage / 3), |
139 | 139 | damDesc(self, DamageType.LIGHTNING, damage), |
140 | + damDesc(self, DamageType.LIGHTNING, (damage + damage / 3) / 2), | |
140 | 141 | targets) |
141 | 142 | end, |
142 | 143 | } |
... | ... | @@ -199,18 +200,14 @@ newTalent{ |
199 | 200 | require = spells_req4, |
200 | 201 | points = 5, |
201 | 202 | mode = "sustained", |
202 | - sustain_mana = 30, | |
203 | + sustain_mana = 50, | |
203 | 204 | cooldown = 15, |
204 | 205 | tactical = { ATTACKAREA = {LIGHTNING = 2} }, |
205 | 206 | range = 6, |
206 | 207 | direct_hit = true, |
207 | 208 | getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 80) end, |
208 | 209 | getTargetCount = function(self, t) return math.floor(self:getTalentLevel(t)) end, |
209 | - getManaDrain = function(self, t) return -1.5 * self:getTalentLevelRaw(t) end, | |
210 | 210 | callbackOnActBase = function(self, t) |
211 | - local mana = t.getManaDrain(self, t) | |
212 | - if self:getMana() <= mana + 1 then return end | |
213 | - | |
214 | 211 | local tgts = {} |
215 | 212 | local grids = core.fov.circle_grids(self.x, self.y, 6, true) |
216 | 213 | for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do |
... | ... | @@ -231,7 +228,6 @@ newTalent{ |
231 | 228 | if core.shader.active() then game.level.map:particleEmitter(a.x, a.y, tg.radius, "ball_lightning_beam", {radius=tg.radius, tx=x, ty=y}, {type="lightning"}) |
232 | 229 | else game.level.map:particleEmitter(a.x, a.y, tg.radius, "ball_lightning_beam", {radius=tg.radius, tx=x, ty=y}) end |
233 | 230 | game:playSoundNear(self, "talents/lightning") |
234 | - self:incMana(mana) | |
235 | 231 | end |
236 | 232 | end, |
237 | 233 | activate = function(self, t) |
... | ... | @@ -247,11 +243,9 @@ newTalent{ |
247 | 243 | info = function(self, t) |
248 | 244 | local targetcount = t.getTargetCount(self, t) |
249 | 245 | local damage = t.getDamage(self, t) |
250 | - local manadrain = t.getManaDrain(self, t) | |
251 | 246 | return ([[Conjures a furious, raging lightning storm with a radius of 6 that follows you as long as this spell is active. |
252 | - Each turn, a random lightning bolt will hit up to %d of your foes for 1 to %0.2f damage in a radius of 1. | |
253 | - This powerful spell will drain %0.2f mana with each hit. | |
247 | + Each turn, a random lightning bolt will hit up to %d of your foes for 1 to %0.2f damage (%0.2f average) in a radius of 1. | |
254 | 248 | The damage will increase with your Spellpower.]]): |
255 | - format(targetcount, damDesc(self, DamageType.LIGHTNING, damage),-manadrain) | |
249 | + format(targetcount, damDesc(self, DamageType.LIGHTNING, damage), damDesc(self, DamageType.LIGHTNING, damage / 2)) | |
256 | 250 | end, |
257 | 251 | } | ... | ... |
... | ... | @@ -100,7 +100,7 @@ newTalent{ |
100 | 100 | type = {"spell/arcane", 3}, |
101 | 101 | require = spells_req3, |
102 | 102 | points = 5, |
103 | - mana = 35, | |
103 | + mana = 20, | |
104 | 104 | cooldown = 12, |
105 | 105 | use_only_arcane = 1, |
106 | 106 | range = 10, |
... | ... | @@ -117,7 +117,7 @@ newTalent{ |
117 | 117 | target = game.level.map(tx, ty, Map.ACTOR) |
118 | 118 | if not target then return nil end |
119 | 119 | |
120 | - target:setEffect(target.EFF_ARCANE_VORTEX, 6, {src=self, dam=t.getDamage(self, t)}) | |
120 | + target:setEffect(target.EFF_ARCANE_VORTEX, 6, {src=self, dam=self:spellCrit(t.getDamage(self, t))}) | |
121 | 121 | game:playSoundNear(self, "talents/arcane") |
122 | 122 | return true |
123 | 123 | end, |
... | ... | @@ -131,6 +131,7 @@ newTalent{ |
131 | 131 | end, |
132 | 132 | } |
133 | 133 | |
134 | +-- Mana gain on deactivation is mostly to preserve this talent's role as a counter to mana drain | |
134 | 135 | newTalent{ |
135 | 136 | name = "Disruption Shield", |
136 | 137 | type = {"spell/arcane",4}, |
... | ... | @@ -157,11 +158,10 @@ newTalent{ |
157 | 158 | game.logSeen(self, "#VIOLET#%s's disruption shield collapses and then explodes in a powerful manastorm!", self.name:capitalize()) |
158 | 159 | dam = math.min(dam, t.getMaxDamage(self, t)) -- Damage cap |
159 | 160 | -- Add a lasting map effect |
160 | - --self:setEffect(self.EFF_ARCANE_STORM, 10, {power=t.getArcaneResist(self, t)}) | |
161 | 161 | local radius = self:hasEffect(self.EFF_AETHER_AVATAR) and 10 or 3 |
162 | 162 | game.level.map:addEffect(self, |
163 | 163 | self.x, self.y, 10, |
164 | - DamageType.ARCANE, dam / 10, | |
164 | + DamageType.ARCANE, self:spellCrit(dam / 10), | |
165 | 165 | radius, |
166 | 166 | 5, nil, |
167 | 167 | {type="arcanestorm", only_one=true}, |
... | ... | @@ -203,7 +203,7 @@ newTalent{ |
203 | 203 | self.disruption_shield_absorb = (self.disruption_shield_absorb or 0) + amt |
204 | 204 | self:incMana(-mana) |
205 | 205 | |
206 | - if self:getMana() / self:getMaxMana() <= 0.25 then | |
206 | + if self:getMana() / self:getMaxMana() <= 0.1 then | |
207 | 207 | local dam = self.disruption_shield_absorb |
208 | 208 | |
209 | 209 | -- Deactivate without losing energy |
... | ... | @@ -231,20 +231,23 @@ newTalent{ |
231 | 231 | end, |
232 | 232 | deactivate = function(self, t, p) |
233 | 233 | self:removeParticles(p.particle) |
234 | + if self:attr("save_cleanup") then return true end | |
235 | + | |
234 | 236 | local dam = self.disruption_shield_absorb |
235 | 237 | |
236 | 238 | -- Explode! |
237 | 239 | local t = self:getTalentFromId(self.T_DISRUPTION_SHIELD) |
238 | 240 | t.explode(self, t, dam) |
239 | 241 | self.disruption_shield_absorb = nil |
242 | + self:incMana(100) | |
240 | 243 | return true |
241 | 244 | end, |
242 | 245 | info = function(self, t) |
243 | 246 | local radius = self:hasEffect(self.EFF_AETHER_AVATAR) and 10 or 3 |
244 | 247 | return ([[Surround yourself with arcane forces, disrupting any attempts to harm you and instead redirecting it to your mana. |
245 | 248 | 25%% of all damage taken is redirected to your mana at a ratio of %0.2f mana per damage. Damage shield bonuses will reduce this cost. |
246 | - If your mana is brought below 25%% by the shield, it will de-activate and the chain reaction will release a deadly arcane storm around you with radius %d for 10 turns, dealing 10%% of the damage absorbed each turn, up to a maximum of %d total damage. | |
247 | - Dropping below 25%% mana will automatically deactivate this talent. | |
249 | + On deactivation you will gain 100 mana and release a deadly arcane storm around you with radius %d for 10 turns, dealing 10%% of the damage absorbed each turn, up to a maximum of %d total damage. | |
250 | + Dropping below 10%% mana will automatically deactivate this talent. | |
248 | 251 | The mana to damage ratio improves with your Spellpower.]]): |
249 | 252 | format(t.getManaRatio(self, t), radius, damDesc(self, DamageType.ARCANE, t.getMaxDamage(self, t))) |
250 | 253 | end, | ... | ... |
... | ... | @@ -65,7 +65,7 @@ newTalent{ |
65 | 65 | mode = "sustained", |
66 | 66 | require = spells_req2, |
67 | 67 | points = 5, |
68 | - sustain_mana = 30, | |
68 | + sustain_mana = 15, | |
69 | 69 | cooldown = 10, |
70 | 70 | tactical = { BUFF = 2 }, |
71 | 71 | getArmor = function(self, t) return self:combatTalentSpellDamage(t, 10, 23) end, |
... | ... | @@ -118,7 +118,7 @@ newTalent{ |
118 | 118 | require = spells_req3, |
119 | 119 | points = 5, |
120 | 120 | random_ego = "attack", |
121 | - mana = 40, | |
121 | + mana = 20, | |
122 | 122 | cooldown = 12, |
123 | 123 | direct_hit = true, |
124 | 124 | tactical = { ATTACKAREA = { PHYSICAL = 2 }, DISABLE = { knockback = 2 }, ESCAPE = { knockback = 1 } }, | ... | ... |
... | ... | @@ -130,8 +130,7 @@ newTalent{ |
130 | 130 | type = {"spell/fire",3}, |
131 | 131 | require = spells_req3, |
132 | 132 | points = 5, |
133 | - random_ego = "attack", | |
134 | - mana = 40, | |
133 | + mana = 20, | |
135 | 134 | cooldown = 8, |
136 | 135 | tactical = { ATTACKAREA = { FIRE = 2 } }, |
137 | 136 | range = 7, |
... | ... | @@ -142,7 +141,7 @@ newTalent{ |
142 | 141 | target = function(self, t) |
143 | 142 | return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t, display={particle="bolt_fire", particle_args={size_factor=1.5}, trail="firetrail"}, sound_stop="talents/fireflash"} |
144 | 143 | end, |
145 | - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 280) end, | |
144 | + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 330) end, | |
146 | 145 | action = function(self, t) |
147 | 146 | local tg = self:getTalentTarget(t) |
148 | 147 | local x, y = self:getTarget(tg) |
... | ... | @@ -177,7 +176,6 @@ newTalent{ |
177 | 176 | type = {"spell/fire",4}, |
178 | 177 | require = spells_req4, |
179 | 178 | points = 5, |
180 | - random_ego = "attack", | |
181 | 179 | mana = 100, |
182 | 180 | cooldown = 30, |
183 | 181 | tactical = { ATTACKAREA = { FIRE = 3 } }, | ... | ... |
... | ... | @@ -22,7 +22,6 @@ newTalent{ |
22 | 22 | type = {"spell/water",1}, |
23 | 23 | require = spells_req1, |
24 | 24 | points = 5, |
25 | - random_ego = "attack", | |
26 | 25 | mana = 12, |
27 | 26 | cooldown = 8, |
28 | 27 | tactical = { DISABLE = {stun = 0.5}, ATTACKAREA = { COLD = 1 } }, |
... | ... | @@ -34,7 +33,7 @@ newTalent{ |
34 | 33 | return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} |
35 | 34 | end, |
36 | 35 | getDamage = function(self, t) return self:combatTalentSpellDamage(t, 4, 50) end, |
37 | - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, | |
36 | + getDuration = function(self, t) return 8 end, | |
38 | 37 | action = function(self, t) |
39 | 38 | local tg = self:getTalentTarget(t) |
40 | 39 | local x, y = self:getTarget(tg) |
... | ... | @@ -43,7 +42,7 @@ newTalent{ |
43 | 42 | -- Add a lasting map effect |
44 | 43 | game.level.map:addEffect(self, |
45 | 44 | x, y, t.getDuration(self, t), |
46 | - DamageType.GLACIAL_VAPOUR, t.getDamage(self, t), | |
45 | + DamageType.GLACIAL_VAPOUR, self:spellCrit(t.getDamage(self, t)), | |
47 | 46 | self:getTalentRadius(t), |
48 | 47 | 5, nil, |
49 | 48 | {type="ice_vapour"}, |
... | ... | @@ -113,8 +112,7 @@ newTalent{ |
113 | 112 | type = {"spell/water",3}, |
114 | 113 | require = spells_req3, |
115 | 114 | points = 5, |
116 | - random_ego = "attack", | |
117 | - mana = 25, | |
115 | + mana = 10, | |
118 | 116 | cooldown = 10, |
119 | 117 | tactical = { ESCAPE = { knockback = 2 }, ATTACKAREA = { COLD = 0.5, PHYSICAL = 0.5 }, DISABLE = { knockback = 1 } }, |
120 | 118 | direct_hit = true, | ... | ... |
... | ... | @@ -103,7 +103,7 @@ newTalent{ |
103 | 103 | points = 5, |
104 | 104 | getChance = function(self, t) return self:getTalentLevelRaw(t) * 10 end, |
105 | 105 | info = function(self, t) |
106 | - return ([[When your Burning Wake talent is active, your Inferno and Burning Wake effects have a %d%% chance, each turn, to remove a status effect (physical, magical, curse or hex) from the targets. | |
106 | + return ([[When your Burning Wake talent is active, your Inferno and Burning Wake effects have a %d%% chance, each turn, to remove a status effect (physical or magical) from the targets. | |
107 | 107 | If the target is hostile, it will remove a beneficial effect. |
108 | 108 | If the target is friendly, it will remove a detrimental effect (but still burn).]]):format(t.getChance(self, t)) |
109 | 109 | end, | ... | ... |
... | ... | @@ -2564,10 +2564,13 @@ newEffect{ |
2564 | 2564 | status = "beneficial", |
2565 | 2565 | parameters = { }, |
2566 | 2566 | activate = function(self, eff) |
2567 | + local inc_mana = self:getMaxMana() * 0.33 | |
2567 | 2568 | self:effectTemporaryValue(eff, "inc_damage", {[DamageType.ARCANE]=25}) |
2568 | - self:effectTemporaryValue(eff, "max_mana", self:getMaxMana() * 0.33) | |
2569 | - self:effectTemporaryValue(eff, "arcane_cooldown_divide", 3) | |
2569 | + self:effectTemporaryValue(eff, "resists_pen", {[DamageType.ARCANE]=25}) | |
2570 | 2570 | |
2571 | + self:effectTemporaryValue(eff, "max_mana", inc_mana) | |
2572 | + self:effectTemporaryValue(eff, "arcane_cooldown_divide", 3) | |
2573 | + self:incMana(inc_mana) | |
2571 | 2574 | if not self.shader then |
2572 | 2575 | eff.set_shader = true |
2573 | 2576 | self.shader = "shadow_simulacrum" |
... | ... | @@ -2582,6 +2585,7 @@ newEffect{ |
2582 | 2585 | self:removeAllMOs() |
2583 | 2586 | game.level.map:updateMap(self.x, self.y) |
2584 | 2587 | end |
2588 | + self.mana = math.min(self.mana, self.max_mana) | |
2585 | 2589 | end, |
2586 | 2590 | } |
2587 | 2591 | ... | ... |
-
Please register or login to post a comment