Commit 7d574472f0a4c68e42a294c5b43241792f2bee8a

Authored by Chris Davidson
1 parent cc38936c

Revise Archmage

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