From 73d567bf58a9955c0096968ab75edc28e277f634 Mon Sep 17 00:00:00 2001 From: Eric Wykoff <ericwykoff@yahoo.com> Date: Tue, 15 Jul 2014 18:13:49 -0500 Subject: [PATCH] Paradox Mage revision --- game/engines/default/engine/Projectile.lua | 9 +- game/modules/tome/class/Actor.lua | 182 +++-- game/modules/tome/class/Player.lua | 4 +- game/modules/tome/class/interface/Archery.lua | 18 +- game/modules/tome/class/interface/Combat.lua | 37 +- .../tome/class/interface/TooltipsData.lua | 2 +- .../tome/data/birth/classes/chronomancer.lua | 41 +- game/modules/tome/data/chats/escort-quest.lua | 10 +- game/modules/tome/data/damage_types.lua | 153 ++-- .../objects/world-artifacts-far-east.lua | 4 +- .../tome/data/gfx/particles/bolt_paradox.lua | 51 ++ .../data/gfx/particles/temporal_teleport.lua | 6 +- .../tome/data/gfx/particles/trail_paradox.lua | 56 ++ .../gfx/particles_images/spatial_fragment.png | Bin 0 -> 11179 bytes .../gfx/particles_images/temporal_bolt.png | Bin 0 -> 9657 bytes .../gfx/shockbolt/trap/chronomine_blue_01.png | Bin 0 -> 6684 bytes .../gfx/shockbolt/trap/chronomine_blue_02.png | Bin 0 -> 6689 bytes .../gfx/shockbolt/trap/chronomine_blue_03.png | Bin 0 -> 6684 bytes .../gfx/shockbolt/trap/chronomine_blue_04.png | Bin 0 -> 6558 bytes .../gfx/shockbolt/trap/chronomine_red_01.png | Bin 0 -> 6541 bytes .../gfx/shockbolt/trap/chronomine_red_02.png | Bin 0 -> 6346 bytes .../gfx/shockbolt/trap/chronomine_red_03.png | Bin 0 -> 6515 bytes .../gfx/shockbolt/trap/chronomine_red_04.png | Bin 0 -> 6517 bytes .../gfx/shockbolt/trap/trap_warpmine_01.png | Bin 8547 -> 0 bytes .../gfx/shockbolt/trap/trap_warpmine_02.png | Bin 8493 -> 0 bytes game/modules/tome/data/gfx/talents/banish.png | Bin 4402 -> 3838 bytes .../tome/data/gfx/talents/braid_lifelines.png | Bin 0 -> 5828 bytes .../tome/data/gfx/talents/carbon_spikes.png | Bin 4905 -> 0 bytes .../tome/data/gfx/talents/cease_to_exist.png | Bin 2521 -> 2671 bytes .../tome/data/gfx/talents/damage_smearing.png | Bin 2853 -> 4590 bytes .../data/gfx/talents/dimensional_anchor.png | Bin 1785 -> 2145 bytes .../data/gfx/talents/dimensional_shift.png | Bin 0 -> 3484 bytes .../data/gfx/talents/dimensional_step.png | Bin 4307 -> 4363 bytes .../tome/data/gfx/talents/discontinuity.png | Bin 0 -> 6684 bytes .../data/gfx/talents/echoes_from_the_past.png | Bin 4334 -> 4105 bytes .../modules/tome/data/gfx/talents/empower.png | Bin 0 -> 5318 bytes .../data/gfx/talents/energy_absorption.png | Bin 5206 -> 4384 bytes .../data/gfx/talents/energy_decomposition.png | Bin 3420 -> 6420 bytes .../modules/tome/data/gfx/talents/entropy.png | Bin 0 -> 5205 bytes .../tome/data/gfx/talents/extension.png | Bin 0 -> 3820 bytes .../tome/data/gfx/talents/fateweaver.png | Bin 3488 -> 3812 bytes .../tome/data/gfx/talents/fractured_space.png | Bin 0 -> 9378 bytes .../tome/data/gfx/talents/gravity_locus.png | Bin 0 -> 4792 bytes .../tome/data/gfx/talents/gravity_spike.png | Bin 2783 -> 3480 bytes .../tome/data/gfx/talents/gravity_well.png | Bin 4557 -> 6773 bytes game/modules/tome/data/gfx/talents/matrix.png | Bin 0 -> 6320 bytes .../tome/data/gfx/talents/paradox_mastery.png | Bin 3265 -> 0 bytes .../tome/data/gfx/talents/phase_pulse.png | Bin 0 -> 5108 bytes .../tome/data/gfx/talents/phase_shift.png | Bin 3698 -> 4607 bytes .../tome/data/gfx/talents/polarity_shift.png | Bin 0 -> 5542 bytes .../modules/tome/data/gfx/talents/quicken.png | Bin 0 -> 4801 bytes game/modules/tome/data/gfx/talents/redux.png | Bin 3965 -> 2705 bytes .../tome/data/gfx/talents/repulsion_blast.png | Bin 4538 -> 6429 bytes .../tome/data/gfx/talents/rethread.png | Bin 4262 -> 4398 bytes .../tome/data/gfx/talents/seal_fate.png | Bin 4349 -> 2933 bytes .../data/gfx/talents/spatial_fragments.png | Bin 0 -> 4057 bytes .../tome/data/gfx/talents/spatial_tether.png | Bin 0 -> 6878 bytes .../gfx/talents/sphere_of_destruction.png | Bin 0 -> 5500 bytes .../tome/data/gfx/talents/spin_fate.png | Bin 4155 -> 4593 bytes .../tome/data/gfx/talents/spint_fate.png | Bin 1772 -> 0 bytes game/modules/tome/data/gfx/talents/swap.png | Bin 3373 -> 3392 bytes .../tome/data/gfx/talents/temporal_bolt.png | Bin 0 -> 4998 bytes .../tome/data/gfx/talents/temporal_clone.png | Bin 4482 -> 4599 bytes .../tome/data/gfx/talents/temporal_fugue.png | Bin 4976 -> 6597 bytes .../data/gfx/talents/temporal_reprieve.png | Bin 3584 -> 5663 bytes .../tome/data/gfx/talents/temporal_wake.png | Bin 2916 -> 4378 bytes .../tome/data/gfx/talents/time_skip.png | Bin 5315 -> 4520 bytes game/modules/tome/data/gfx/talents/warp.png | Bin 0 -> 3866 bytes .../tome/data/gfx/talents/warp_mastery.png | Bin 0 -> 4744 bytes .../tome/data/gfx/talents/warp_mine.png | Bin 4103 -> 0 bytes .../tome/data/gfx/talents/warp_mine_away.png | Bin 4910 -> 5227 bytes .../data/gfx/talents/warp_mine_toward.png | Bin 5030 -> 5921 bytes .../tome/data/gfx/talents/warp_mines.png | Bin 3114 -> 4126 bytes .../tome/data/gfx/talents/webs_of_fate.png | Bin 5277 -> 5478 bytes .../tome/data/gfx/talents/wormhole.png | Bin 5568 -> 4506 bytes .../talents/chronomancy/age-manipulation.lua | 9 +- .../data/talents/chronomancy/anomalies.lua | 377 +++++---- .../talents/chronomancy/blade-threading.lua | 107 +-- .../talents/chronomancy/bow-threading.lua | 73 +- .../data/talents/chronomancy/chronomancer.lua | 18 +- .../data/talents/chronomancy/chronomancy.lua | 41 +- .../tome/data/talents/chronomancy/energy.lua | 163 ++-- .../talents/chronomancy/fate-threading.lua | 217 +++--- .../data/talents/chronomancy/fate-weaving.lua | 90 ++- .../tome/data/talents/chronomancy/gravity.lua | 201 +++-- .../data/talents/chronomancy/guardian.lua | 43 +- .../talents/chronomancy/induced-phenomena.lua | 339 +++++++++ .../tome/data/talents/chronomancy/matter.lua | 15 +- .../tome/data/talents/chronomancy/other.lua | 719 ++++++++++++++++-- .../tome/data/talents/chronomancy/paradox.lua | 229 +----- .../talents/chronomancy/spacetime-folding.lua | 517 +++++++------ .../talents/chronomancy/spacetime-weaving.lua | 301 +++----- .../talents/chronomancy/spatial-tears.lua | 311 ++++++++ .../talents/chronomancy/speed-control.lua | 76 +- .../data/talents/chronomancy/spellbinding.lua | 156 ++++ .../talents/chronomancy/temporal-archery.lua | 2 +- .../talents/chronomancy/temporal-hounds.lua | 44 +- .../talents/chronomancy/threaded-combat.lua | 32 +- .../chronomancy/timeline-threading.lua | 518 ++++++++++--- .../data/talents/chronomancy/timetravel.lua | 414 +++++----- .../tome/data/talents/misc/inscriptions.lua | 7 +- game/modules/tome/data/talents/misc/npcs.lua | 4 +- game/modules/tome/data/talents/uber/mag.lua | 6 +- .../tome/data/timed_effects/magical.lua | 206 +++-- .../modules/tome/data/timed_effects/other.lua | 157 ++-- .../tome/data/timed_effects/physical.lua | 52 +- .../tome/data/zones/town-point-zero/npcs.lua | 2 +- .../data/zones/unhallowed-morass/npcs.lua | 1 - game/modules/tome/dialogs/DeathDialog.lua | 9 + .../talents/ChronomancyContingency.lua | 4 +- .../dialogs/talents/ChronomancyEmpower.lua | 133 ++++ .../dialogs/talents/ChronomancyExtension.lua | 133 ++++ .../dialogs/talents/ChronomancyMatrix.lua | 133 ++++ .../dialogs/talents/ChronomancyQuicken.lua | 133 ++++ 114 files changed, 4506 insertions(+), 2059 deletions(-) create mode 100644 game/modules/tome/data/gfx/particles/bolt_paradox.lua create mode 100644 game/modules/tome/data/gfx/particles/trail_paradox.lua create mode 100644 game/modules/tome/data/gfx/particles_images/spatial_fragment.png create mode 100644 game/modules/tome/data/gfx/particles_images/temporal_bolt.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_01.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_02.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_03.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_04.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_01.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_02.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_03.png create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_04.png delete mode 100644 game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_01.png delete mode 100644 game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_02.png create mode 100644 game/modules/tome/data/gfx/talents/braid_lifelines.png delete mode 100644 game/modules/tome/data/gfx/talents/carbon_spikes.png create mode 100644 game/modules/tome/data/gfx/talents/dimensional_shift.png create mode 100644 game/modules/tome/data/gfx/talents/discontinuity.png create mode 100644 game/modules/tome/data/gfx/talents/empower.png create mode 100644 game/modules/tome/data/gfx/talents/entropy.png create mode 100644 game/modules/tome/data/gfx/talents/extension.png create mode 100644 game/modules/tome/data/gfx/talents/fractured_space.png create mode 100644 game/modules/tome/data/gfx/talents/gravity_locus.png create mode 100644 game/modules/tome/data/gfx/talents/matrix.png delete mode 100644 game/modules/tome/data/gfx/talents/paradox_mastery.png create mode 100644 game/modules/tome/data/gfx/talents/phase_pulse.png create mode 100644 game/modules/tome/data/gfx/talents/polarity_shift.png create mode 100644 game/modules/tome/data/gfx/talents/quicken.png create mode 100644 game/modules/tome/data/gfx/talents/spatial_fragments.png create mode 100644 game/modules/tome/data/gfx/talents/spatial_tether.png create mode 100644 game/modules/tome/data/gfx/talents/sphere_of_destruction.png delete mode 100644 game/modules/tome/data/gfx/talents/spint_fate.png create mode 100644 game/modules/tome/data/gfx/talents/temporal_bolt.png create mode 100644 game/modules/tome/data/gfx/talents/warp.png create mode 100644 game/modules/tome/data/gfx/talents/warp_mastery.png delete mode 100644 game/modules/tome/data/gfx/talents/warp_mine.png create mode 100644 game/modules/tome/data/talents/chronomancy/induced-phenomena.lua create mode 100644 game/modules/tome/data/talents/chronomancy/spatial-tears.lua create mode 100644 game/modules/tome/data/talents/chronomancy/spellbinding.lua create mode 100644 game/modules/tome/dialogs/talents/ChronomancyEmpower.lua create mode 100644 game/modules/tome/dialogs/talents/ChronomancyExtension.lua create mode 100644 game/modules/tome/dialogs/talents/ChronomancyMatrix.lua create mode 100644 game/modules/tome/dialogs/talents/ChronomancyQuicken.lua diff --git a/game/engines/default/engine/Projectile.lua b/game/engines/default/engine/Projectile.lua index 10d8d32b19..bb4acc084d 100644 --- a/game/engines/default/engine/Projectile.lua +++ b/game/engines/default/engine/Projectile.lua @@ -250,8 +250,15 @@ function _M:on_move(x, y, target) self.src.__project_source = self -- intermediate projector source if self.project and self.project.def.typ.line then self.src:projectDoAct(self.project.def.typ, self.project.def.tg, self.project.def.damtype, self.project.def.dam, self.project.def.particles, self.x, self.y, self.tmp_proj) end if self.project and self.project.def.typ.stop_block then - self.src:projectDoStop(self.project.def.typ, self.project.def.tg, self.project.def.damtype, self.project.def.dam, self.project.def.particles, self.x, self.y, self.tmp_proj, self.x, self.y, self) + elseif self.homing then + if (self.x == self.homing.target.x and self.y == self.homing.target.y) then + game.level:removeEntity(self, true) + self.dead = true + self.homing.on_hit(self, self.src, self.homing.target) + else + self.homing.on_move(self, self.src) + end end self.src.__project_source = nil end diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 40f03a3ce4..f3f8a812a1 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -1388,10 +1388,6 @@ function _M:move(x, y, force) local eff = self:hasEffect(self.EFF_CURSE_OF_SHROUDS) if eff then eff.moved = true end - if self:knowTalent(self.T_CELERITY) then - self:callTalent(self.T_CELERITY, "doCelerity") - end - if self:attr("move_stamina_instead_of_energy") and self:getStamina() > self:attr("move_stamina_instead_of_energy") then self:incStamina(-self:attr("move_stamina_instead_of_energy")) else @@ -1453,11 +1449,15 @@ function _M:move(x, y, force) self:forceUseTalent(self.T_BODY_OF_STONE, {ignore_energy=true}) end - -- Chronomancy auras - + -- Celerity + if moved and ox and oy and (ox ~= self.x or oy ~= self.y) and self:knowTalent(self.T_CELERITY) then + self:callTalent(self.T_CELERITY, "doCelerity") + end + -- Break channels if moved then self:breakPsionicChannel() + self:breakSpacetimeTuning() end if not force and moved and ox and oy and (ox ~= self.x or oy ~= self.y) and self:knowTalent(self.T_LIGHT_OF_FOOT) then @@ -1468,6 +1468,7 @@ function _M:move(x, y, force) local blur = 0 if game.level.data.zero_gravity then blur = 2 end if self:attr("lightning_speed") or self:attr("step_up") or self:attr("wild_speed") then blur = 3 end + if self:hasEffect(self.EFF_CELERITY) then local eff = self:hasEffect(self.EFF_CELERITY) blur = eff.charges end self:setMoveAnim(ox, oy, config.settings.tome.smooth_move, blur, 8, config.settings.tome.twitch_move and 0.15 or 0) end @@ -1496,6 +1497,16 @@ function _M:waitTurn() self:reloadQS() end end + + -- Tune paradox up or down + if not self:hasEffect(self.EFF_SPACETIME_TUNING) and self.preferred_paradox and (self:getParadox() ~= self:getMinParadox() or self.preferred_paradox > self:getParadox()) then + local power = 0 + if math.abs(self:getParadox() - self.preferred_paradox) > 1 then + local duration = self:callTalent(self.T_SPACETIME_TUNING, "getDuration") + power = (self.preferred_paradox - self:getParadox())/duration + self:setEffect(self.EFF_SPACETIME_TUNING, duration, {power=power}) + end + end self:useEnergy() end @@ -1583,23 +1594,44 @@ function _M:teleportRandom(x, y, dist, min_dist) if game.level.data.no_teleport_south and y + dist > self.y then y = self.y - dist end + + -- Dimensional Anchor, prevent teleports and deal damage if self:hasEffect(self.EFF_DIMENSIONAL_ANCHOR) then local p = self:hasEffect(self.EFF_DIMENSIONAL_ANCHOR) - DamageType:get(DamageType.MATTER).projector(p.src or self, self.x, self.y, DamageType.MATTER, p.damage) + DamageType:get(DamageType.WARP).projector(p.src or self, self.x, self.y, DamageType.WARP, p.damage) return end + local ox, oy = self.x, self.y local ret = engine.Actor.teleportRandom(self, x, y, dist, min_dist) if self.x ~= ox or self.y ~= oy then + -- Phase Pulse + if self:isTalentActive(self.T_PHASE_PULSE) then + self:callTalent(self.T_PHASE_PULSE, "doPulse", ox, oy) + end + self.x, self.y, ox, oy = ox, oy, self.x, self.y self:dropNoTeleportObjects() if self:attr("defense_on_teleport") or self:attr("resist_all_on_teleport") or self:attr("effect_reduction_on_teleport") then self:setEffect(self.EFF_OUT_OF_PHASE, 5, {defense=self:attr("defense_on_teleport") or 0, resists=self:attr("resist_all_on_teleport") or 0, effect_reduction=self:attr("effect_reduction_on_teleport") or 0}) end - if self:knowTalent(self.T_PHASE_SHIFT) then - self:callTalent(self.T_PHASE_SHIFT, "doPhaseShift") + + -- Dimensional shift, chance to clear effects on teleport + if self:knowTalent(self.T_DIMENSIONAL_SHIFT) then + self:callTalent(self.T_DIMENSIONAL_SHIFT, "doShift") end + + -- Teleportation does not clear Time Dilation + if self:isTalentActive(self.T_TIME_DILATION) then + self:callTalent(self.T_TIME_DILATION, "updateOnTeleport", ox, oy) + end + self.x, self.y, ox, oy = ox, oy, self.x, self.y + else + -- Phase Blast failure + if self:isTalentActive(self.T_PHASE_PULSE) then + self:callTalent(self.T_PHASE_PULSE, "doPulse", ox, oy, true) + end end return ret end @@ -2131,6 +2163,21 @@ function _M:onTakeHit(value, src, death_note) return 0 end end + if self:attr("phase_shift_chrono") and not self.turn_procs.phase_shift_chrono and value > self.max_life *0.1 then + self.turn_procs.phase_shift_chrono = true + local nx, ny = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true}) + if nx then + local ox, oy = self.x, self.y + if not self:teleportRandom(nx, ny, 0) then + game.logSeen(self, "The spell fizzles!") + else + game.level.map:particleEmitter(ox, oy, 1, "temporal_teleport") + game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + game:delayedLogDamage(src or {}, self, 0, ("#STEEL_BLUE#(%d shifted)#LAST#"):format(value/2), nil) + value = value/2 + end + end + end if self:attr("retribution") then -- Absorb damage into the retribution @@ -2261,7 +2308,7 @@ function _M:onTakeHit(value, src, death_note) self:removeEffect(self.EFF_PSI_DAMAGE_SHIELD) end end - + if value > 0 and self:attr("shadow_empathy") then -- Absorb damage into a random shadow local shadow = self:callTalent(self.T_SHADOW_EMPATHY, "getRandomShadow") @@ -2329,6 +2376,11 @@ function _M:onTakeHit(value, src, death_note) value = 0 end end + + -- Paradox Shield + if value > 0 and self:isTalentActive(self.T_PRESERVE_PATTERN) then + value = self:callTalent(self.T_PRESERVE_PATTERN, "doPerservePattern", src, value) + end if value <=0 then return 0 end if self.knowTalent and (self:knowTalent(self.T_SEETHE) or self:knowTalent(self.T_GRIM_RESOLVE)) then @@ -2989,7 +3041,7 @@ function _M:die(src, death_note) if src and src.attr and src:attr("psi_per_kill") then src:incPsi(src:attr("psi_per_kill")) end - + -- Increases blood frenzy if src and src.knowTalent and src:knowTalent(src.T_BLOOD_FRENZY) and src:isTalentActive(src.T_BLOOD_FRENZY) then src.blood_frenzy = src.blood_frenzy + src:callTalent(src.T_BLOOD_FRENZY,"bonuspower") @@ -3008,7 +3060,7 @@ function _M:die(src, death_note) rsrc.changed = true end end - + -- handle hate changes on kill if src and src.knowTalent and src:knowTalent(src.T_HATE_POOL) then local t = src:getTalentFromId(src.T_HATE_POOL) @@ -3077,6 +3129,7 @@ function _M:die(src, death_note) p.src:project({type="ball", radius=4, x=self.x, y=self.y}, self.x, self.y, DamageType.ACID, p.explosion, {type="acid"}) end + -- Chronomancy stuff if self:hasEffect(self.EFF_TEMPORAL_DESTABILIZATION) then local p = self:hasEffect(self.EFF_TEMPORAL_DESTABILIZATION) if self:hasEffect(self.EFF_CONTINUUM_DESTABILIZATION) then @@ -3105,6 +3158,11 @@ function _M:die(src, death_note) end end) end + + if self:hasEffect(self.EFF_TRIM_THREADS) then + local p = self:hasEffect(self.EFF_TRIM_THREADS) + p.src:incParadox(-p.reduction) + end if self:hasEffect(self.EFF_GHOUL_ROT) then local p = self:hasEffect(self.EFF_GHOUL_ROT) @@ -3218,6 +3276,7 @@ function _M:resetToFull() self.air = self.max_air self.psi = self.max_psi self.hate = self.max_hate + self.paradox = self.preferred_paradox or 300 end -- Level up talents to match actor level @@ -4341,7 +4400,7 @@ end --- Paradox checks function _M:getModifiedParadox() - local will_modifier = 2 + self:callTalent(self.T_PARADOX_MASTERY,"WilMult") + local will_modifier = (1 + (self:attr("paradox_will_multi") or 0)) * 2 will_modifier = (self:getWil() + (self:attr("paradox_reduce_anomalies") or 0)) * will_modifier local sustain_modifier = self:getMinParadox() local modified_paradox = math.max(0, self:getParadox() - will_modifier + sustain_modifier) @@ -4375,8 +4434,9 @@ function _M:paradoxDoAnomaly(reduction, anomaly_type, chance, target, silent) end -- See if we create an anomaly - if not game.zone.no_anomalies and not self:attr("no_paradox_fail") and not self.turn_procs.anomalies_checked then - self.turn_procs.anomalies_checked = true -- This is so players can't chain cancel out of targeting to trigger anomalies on purpose, we clear it out in postUse + if not game.zone.no_anomalies and not self:attr("no_paradox_fail") then + if not forced and self.turn_procs.anomalies_checked then return false end -- This is so players can't chain cancel out of targeting to trigger anomalies on purpose, we clear it out in postUse + if not forced then self.turn_procs.anomalies_checked = true end -- return true if we roll an anomly if rng.percent(chance) then @@ -4385,43 +4445,46 @@ function _M:paradoxDoAnomaly(reduction, anomaly_type, chance, target, silent) anomaly_type = "major" else -- Check for Bias? - if self.anomaly_bias and rng.percent(self.anomaly_bias.chance) then - anomaly_type = self.anomaly_bias.type - end + if self.anomaly_bias and rng.percent(self.anomaly_bias.chance) then anomaly_type = self.anomaly_bias.type end + -- Revert no-major to random + if anomaly_type == "no-major" then anomaly_type = "random" end end -- Now pick anomalies filtered by type local ts = {} for id, t in pairs(self.talents_def) do - if anomaly_type ~= "random" and anomaly_type ~= "no-major" then - if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type == anomaly_type then ts[#ts+1] = id end + if anomaly_type ~= "random" then + if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type == anomaly_type and not self:isTalentCoolingDown(t) then ts[#ts+1] = id end else - if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type ~= "major" then ts[#ts+1] = id end + if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type ~= "major" and not self:isTalentCoolingDown(t) then ts[#ts+1] = id end end end -- Did we find anomalies? if ts[1] then -- Do we have a target? If not we pass to anomaly targeting - -- The ignore energy calls here allow anomalies to be cast even when it's not the players turn (i.e. Preserve Pattern) + -- The ignore energy calls here allow anomalies to be cast even when it's not the players turn if target then - self:forceUseTalent(rng.table(ts), {ignore_cooldown=true, ignore_energy=true, force_target=target}) + self:attr("anomaly_forced_target", 1) + self:forceUseTalent(rng.table(ts), {ignore_energy=true, force_target=target}) + self:attr("anomaly_forced_target", -1) else - self:forceUseTalent(rng.table(ts), {ignore_cooldown=true, ignore_energy=true}) + self:forceUseTalent(rng.table(ts), {ignore_energy=true}) end - -- Drop some game messages - if not silent then - if forced then - game.logPlayer(self, "#STEEL_BLUE#You've moved to another time thread.") - else - game.logPlayer(self, "#LIGHT_RED#You lose control and unleash an anomaly!") - end - end - -- Reduce Paradox - if reduction and reduction > 0 then - self:incParadox(-reduction) + end + + -- Drop some game messages; these happen so Paradox gets reduced even if an anomaly isn't found + if not silent then + if forced then + game.logPlayer(self, "#STEEL_BLUE#You've moved to another time thread.") + else + game.logPlayer(self, "#LIGHT_RED#You lose control and unleash an anomaly!") end end + -- Reduce Paradox + if reduction and reduction > 0 then + self:incParadox(-reduction) + end return true end @@ -4443,9 +4506,15 @@ function _M:incParadox(paradox) if self:getModifiedParadox() < 600 and self:getModifiedParadox() + paradox >= 600 then game.logPlayer(self, "#LIGHT_RED#Spacetime fights against your control!") end - if self:getParadox() > 600 and self:getParadox() + paradox <= 600 then + if self:getModifiedParadox() > 600 and self:getModifiedParadox() + paradox <= 600 then game.logPlayer(self, "#LIGHT_BLUE#Spacetime has calmed... somewhat.") end + + -- Cosmic Cycle + if self:isTalentActive(self.T_COSMIC_CYCLE) then + self:callTalent(self.T_COSMIC_CYCLE, "doCosmicCycle") + end + return previous_incParadox(self, paradox) end @@ -4839,7 +4908,11 @@ function _M:getTalentSpeed(t) local speed_type = self:getTalentSpeedType(t) local speed = self:getSpeed(speed_type) - -- EDGE: Put Quicken Here? + -- Quicken + local p = self:isTalentActive(self.T_QUICKEN) + if p and p.talent == t.id then + speed = math.max(0.1, speed - self:callTalent(self.T_QUICKEN, "getPower")) + end local hd = {"Actor:getTalentSpeed", talent = t, speed_type = speed_type, speed = speed,} if self:triggerHook(hd) then speed = hd.speed end @@ -5038,6 +5111,7 @@ function _M:postUseTalent(ab, ret, silent) if ab.id ~= self.T_GATHER_THE_THREADS and ab.is_spell then self:breakChronoSpells() end if not ab.no_reload_break then self:breakReloading() end self:breakStepUp() + self:breakSpacetimeTuning() --if not (util.getval(ab.no_energy, self, ab) or ab.no_break_channel) and not (ab.mode == "sustained" and self:isTalentActive(ab.id)) then self:breakPsionicChannel(ab.id) end for tid, _ in pairs(self.sustain_talents) do @@ -5047,12 +5121,6 @@ function _M:postUseTalent(ab, ret, silent) end end - if ab.id ~= self.T_REDUX and self:hasEffect(self.EFF_REDUX) and ab.type[1]:find("^chronomancy/") and ab.mode == "activated" and self:getTalentLevel(self.T_REDUX) >= self:getTalentLevel(ab.id) then - self:removeEffect(self.EFF_REDUX) - -- this still consumes energy but works as the talent suggests it does - self:forceUseTalent(ab.id, {ignore_energy=true, ignore_cd = true}) - end - if not ab.innate and self:hasEffect(self.EFF_RAMPAGE) and ab.id ~= self.T_RAMPAGE and ab.id ~= self.T_SLAM then local eff = self:hasEffect(self.EFF_RAMPAGE) value = self.tempeffect_def[self.EFF_RAMPAGE].do_postUseTalent(self, eff, value) @@ -5141,9 +5209,6 @@ function _M:breakStepUp() if self:hasEffect(self.EFF_SKIRMISHER_DIRECTED_SPEED) then self:removeEffect(self.EFF_SKIRMISHER_DIRECTED_SPEED) end - if self:hasEffect(self.EFF_CELERITY) then - self:removeEffect(self.EFF_CELERITY) - end end --- Breaks lightning speed if active @@ -5160,6 +5225,12 @@ function _M:breakChronoSpells() end end +function _M:breakSpacetimeTuning() + if self:hasEffect(self.EFF_SPACETIME_TUNING) then + self:removeEffect(self.EFF_SPACETIME_TUNING) + end +end + --- Break Psionic Channels function _M:breakPsionicChannel(talent) if self:isTalentActive(self.T_MIND_STORM) and talent ~= self.T_MIND_STORM then @@ -5212,7 +5283,7 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery) if t.positive then d:add({"color",0x6f,0xff,0x83}, "Positive energy cost: ", {"color",255, 215, 0}, ""..math.round(util.getval(t.positive, self, t) * (100 + self:combatFatigue()) / 100, 0.1), true) end if t.negative then d:add({"color",0x6f,0xff,0x83}, "Negative energy cost: ", {"color", 127, 127, 127}, ""..math.round(util.getval(t.negative, self, t) * (100 + self:combatFatigue()) / 100, 0.1), true) end if t.hate then d:add({"color",0x6f,0xff,0x83}, "Hate cost: ", {"color", 127, 127, 127}, ""..math.round(util.getval(t.hate, self, t) * (100 + 2 * self:combatFatigue()) / 100, 0.1), true) end - if t.paradox then d:add({"color",0x6f,0xff,0x83}, "Paradox cost: ", {"color", 176, 196, 222}, ""..math.round(util.getval(t.paradox, self, t), 0.1), true) end + if t.paradox then d:add({"color",0x6f,0xff,0x83}, "Paradox cost: ", {"color", 176, 196, 222}, ""..math.round(util.getval(t.paradox, self, t)), true) end if t.psi then d:add({"color",0x6f,0xff,0x83}, "Psi cost: ", {"color",0x7f,0xff,0xd4}, ""..math.round(util.getval(t.psi, self, t) * (100 + 2 * self:combatFatigue()) / 100, 0.1), true) end if t.feedback then d:add({"color",0x6f,0xff,0x83}, "Feedback cost: ", {"color",0xFF, 0xFF, 0x00}, ""..math.round(util.getval(t.feedback, self, t) * (100 + 2 * self:combatFatigue()) / 100, 0.1), true) end if t.fortress_energy then d:add({"color",0x6f,0xff,0x83}, "Fortress Energy cost: ", {"color",0x00,0xff,0xa0}, ""..math.round(t.fortress_energy, 0.1), true) end @@ -5236,7 +5307,7 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery) else d:add({"color",0x6f,0xff,0x83}, "Range: ", {"color",0xFF,0xFF,0xFF}, "melee/personal", true) end if not config.ignore_ressources then - if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, "Cooldown: ", {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end + if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, ("%sCooldown: "):format(t.fixed_cooldown and "Fixed " or ""), {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end end local speed = self:getTalentProjectileSpeed(t) if speed then d:add({"color",0x6f,0xff,0x83}, "Travel Speed: ", {"color",0xFF,0xFF,0xFF}, ""..(speed * 100).."% of base", true) @@ -5273,7 +5344,7 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery) end else if not config.ignore_ressources then - if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, "Cooldown: ", {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end + if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, ("%sCooldown: "):format(t.fixed_cooldown and "Fixed " or ""), {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end end end @@ -5320,7 +5391,12 @@ function _M:getTalentCooldown(t) if eff and not self:attr("talent_reuse") then cd = 1 + cd * eff.power end - + + local p = self:isTalentActive(self.T_MATRIX) + if p and p.talent == t.id then + cd = math.floor(cd * (1 - self:callTalent(self.T_MATRIX, "getPower"))) + end + if t.is_spell then return math.ceil(cd * (1 - (self.spell_cooldown_reduction or 0))) elseif t.is_summon then @@ -5340,6 +5416,12 @@ function _M:startTalentCooldown(t, v) self.talents_cd[t.id] = math.max(v, self.talents_cd[t.id] or 0) else if not t.cooldown then return end + if t.id ~= self.T_REDUX and self:hasEffect(self.EFF_REDUX) then + local eff = self:hasEffect(self.EFF_REDUX) + if t.type[1]:find("^chronomancy/") and self:getTalentCooldown(t) <= eff.max_cd and t.mode == "activated" and not t.fixed_cooldown then + return + end + end self.talents_cd[t.id] = self:getTalentCooldown(t) end if self.talents_cd[t.id] <= 0 then self.talents_cd[t.id] = nil end diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index 9eb86b3b9a..f694ff0e1a 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -1216,7 +1216,7 @@ function _M:playerUseItem(object, item, inven) self:breakStepUp() self:breakStealth() self:breakLightningSpeed() - -- self:breakPsionicChannel() + self:breakSpacetimeTuning() return true end @@ -1224,7 +1224,7 @@ function _M:playerUseItem(object, item, inven) self:breakStealth() self:breakLightningSpeed() self:breakReloading() - -- self:breakPsionicChannel() + self:breakSpacetimeTuning() self.changed = true end) local ok, ret = coroutine.resume(co) diff --git a/game/modules/tome/class/interface/Archery.lua b/game/modules/tome/class/interface/Archery.lua index 832baa330b..ffde75dff3 100644 --- a/game/modules/tome/class/interface/Archery.lua +++ b/game/modules/tome/class/interface/Archery.lua @@ -429,12 +429,9 @@ local function archery_projectile(tx, ty, tg, self, tmp) -- Temporal cast if hitted and self:knowTalent(self.T_WEAPON_FOLDING) and self:isTalentActive(self.T_WEAPON_FOLDING) then local dam = self:callTalent(self.T_WEAPON_FOLDING, "getDamage") - local burst_damage = 0 - local burst_radius = 0 if self:knowTalent(self.T_FRAYED_THREADS) then - burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") - burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") - dam = dam - burst_damage + local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") + local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.TEMPORAL, burst_damage) end if dam > 0 and not target.dead then @@ -444,13 +441,10 @@ local function archery_projectile(tx, ty, tg, self, tmp) if hitted and self:knowTalent(self.T_IMPACT) and self:isTalentActive(self.T_IMPACT) then local dam = self:callTalent(self.T_IMPACT, "getDamage") local power = self:callTalent(self.T_IMPACT, "getApplyPower") - local burst_damage = 0 - local burst_radius = 0 if self:knowTalent(self.T_FRAYED_THREADS) then - burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") - burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") - dam = dam - burst_damage - self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=dam/2, power_check=power}) + local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") + local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") + self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=burst_damage/2, power_check=power}) end if dam > 0 and not target.dead then DamageType:get(DamageType.IMPACT).projector(self, target.x, target.y, DamageType.IMPACT, {dam=dam, daze=dam/2, power_check=power}, tmp) @@ -492,7 +486,7 @@ local function archery_projectile(tx, ty, tg, self, tmp) -- Resource regen on hit if hitted and self:attr("stamina_regen_on_hit") then self:incStamina(self.stamina_regen_on_hit) end if hitted and self:attr("mana_regen_on_hit") then self:incMana(self.mana_regen_on_hit) end - + -- Ablative armor if hitted and not target.dead and target:attr("carbon_spikes") then if target.carbon_armor >= 1 then diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index 59a621c71d..a62b7e6026 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -89,6 +89,7 @@ function _M:attackTarget(target, damtype, mult, noenergy, force_unharmed) -- Break before we do the blow, because it might start step up, we dont want to insta-cancel it self:breakStepUp() + self:breakSpacetimeTuning() if self:attr("feared") then if not noenergy then @@ -625,9 +626,8 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) local burst_damage = 0 local burst_radius = 0 if self:knowTalent(self.T_FRAYED_THREADS) then - burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") - burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") - dam = dam - burst_damage + local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") + local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.TEMPORAL, burst_damage) end if dam > 0 and not target.dead then @@ -637,13 +637,10 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) if hitted and self:knowTalent(self.T_IMPACT) and self:isTalentActive(self.T_IMPACT) then local dam = self:callTalent(self.T_IMPACT, "getDamage") local power = self:callTalent(self.T_IMPACT, "getApplyPower") - local burst_damage = 0 - local burst_radius = 0 if self:knowTalent(self.T_FRAYED_THREADS) then - burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") - burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") - dam = dam - burst_damage - self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=dam/2, power_check=power}) + local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent") + local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius") + self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=burst_damage/2, power_check=power}) end if dam > 0 and not target.dead then DamageType:get(DamageType.IMPACT).projector(self, target.x, target.y, DamageType.IMPACT, {dam=dam, daze=dam/2, power_check=power}, tmp) @@ -886,6 +883,16 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) if hitted and self:attr("mana_regen_on_hit") then self:incMana(self.mana_regen_on_hit) end if hitted and self:attr("psi_regen_on_hit") then self:incPsi(self.psi_regen_on_hit) end + -- Ablative armor + if hitted and not target.dead and target:attr("carbon_spikes") then + if target.carbon_armor >= 1 then + target.carbon_armor = target.carbon_armor - 1 + else + -- Deactivate without loosing energy + target:forceUseTalent(target.T_CARBON_SPIKES, {ignore_energy=true}) + end + end + if hitted and not target.dead and target:knowTalent(target.T_STONESHIELD) then local t = target:getTalentFromId(target.T_STONESHIELD) local m, mm, e, em = t.getValues(self, t) @@ -893,12 +900,6 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) target:incEquilibrium(-math.min(dam * e, em)) end - -- Ablative Armor - if hitted and not target.dead and target:attr("carbon_spikes") then - local t = target:getTalentFromId(target.T_CARBON_SPIKES) - t.do_carbonLoss(target, t) - end - -- Set Up if not hitted and not target.dead and not evaded and not target:attr("stunned") and not target:attr("dazed") and not target:attr("stoned") and target:hasEffect(target.EFF_DEFENSIVE_MANEUVER) then local t = target:getTalentFromId(target.T_SET_UP) @@ -1190,12 +1191,12 @@ function _M:combatArmor() add = add + ga.getArmor(self, ga) end end - if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then - add = add + self.carbon_armor - end if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then add = add + self:callTalent(self.T_ARMOUR_OF_SHADOWS,"ArmourBonus") end + if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then + add = add + self.carbon_armor + end return self.combat_armor + add end diff --git a/game/modules/tome/class/interface/TooltipsData.lua b/game/modules/tome/class/interface/TooltipsData.lua index 00265d6f6c..6171a93766 100644 --- a/game/modules/tome/class/interface/TooltipsData.lua +++ b/game/modules/tome/class/interface/TooltipsData.lua @@ -112,7 +112,7 @@ All afflicted talents are based on Hate, and many are more effective at higher l TOOLTIP_PARADOX = [[#GOLD#Paradox#LAST# Paradox represents how stable the current timeline is. As your Paradox grows so does your Spellpower, but you may be shifted to a more stable timeline when you attempt to use your magic. -When your Paradox is above 600 the shifts will become more violent. +When your modified Paradox is above 600 the shifts will become more violent. Your control over chronomancy spells increases with your Willpower. ]] diff --git a/game/modules/tome/data/birth/classes/chronomancer.lua b/game/modules/tome/data/birth/classes/chronomancer.lua index 149154ecf1..c3feec1c45 100644 --- a/game/modules/tome/data/birth/classes/chronomancer.lua +++ b/game/modules/tome/data/birth/classes/chronomancer.lua @@ -69,25 +69,32 @@ newBirthDescriptor{ random_rarity = 2, stats = { mag=5, wil=2, con=2, }, talents_types = { - ["chronomancy/age-manipulation"]={true, 0.3}, - -- ["chronomancy/anomalies"]={true, 0}, - ["chronomancy/chronomancy"]={true, 0.3}, - ["chronomancy/energy"]={true, 0.3}, + -- class ["chronomancy/fate-threading"]={true, 0.3}, ["chronomancy/gravity"]={true, 0.3}, - ["chronomancy/matter"]={true, 0.3}, - ["chronomancy/paradox"]={false, 0.3}, + ["chronomancy/spacetime-folding"]={true, 0.3}, ["chronomancy/speed-control"]={true, 0.3}, - ["chronomancy/timeline-threading"]={false, 0.3}, + ["chronomancy/timeline-threading"]={true, 0.3}, ["chronomancy/timetravel"]={true, 0.3}, + + -- locked class + ["chronomancy/spellbinding"]={false, 0.3}, + ["chronomancy/spatial-tears"]={false, 0.3}, + + -- generic + ["chronomancy/chronomancy"]={true, 0.3}, + ["chronomancy/fate-weaving"]={true, 0.3}, ["chronomancy/spacetime-weaving"]={true, 0.3}, - ["cunning/survival"]={false, 0}, + + -- locked generic + ["chronomancy/energy"]={false, 0.3}, + ["cunning/survival"]={false, 0}, }, talents = { - [ActorTalents.T_DISENTANGLE] = 1, + [ActorTalents.T_TEMPORAL_BOLT] = 1, [ActorTalents.T_DIMENSIONAL_STEP] = 1, - [ActorTalents.T_DUST_TO_DUST] = 1, - [ActorTalents.T_TURN_BACK_THE_CLOCK] = 1, + [ActorTalents.T_RETHREAD] = 1, + [ActorTalents.T_DISENTANGLE] = 1, }, copy = { max_life = 90, @@ -119,21 +126,25 @@ newBirthDescriptor{ -- class ["chronomancy/blade-threading"]={true, 0.3}, ["chronomancy/bow-threading"]={true, 0.3}, - ["chronomancy/fate-threading"]={true, 0.3}, + ["chronomancy/fate-threading"]={true, 0.1}, ["chronomancy/spacetime-folding"]={true, 0.3}, - ["chronomancy/speed-control"]={true, 0.1}, + ["chronomancy/speed-control"]={true, 0.3}, ["chronomancy/guardian"]={true, 0.3}, + -- class locked ["chronomancy/threaded-combat"]={false, 0.3}, ["chronomancy/temporal-hounds"]={false, 0.3}, ["chronomancy/timetravel"]={false, 0.1}, -- generic - ["cunning/survival"]={false, 0}, ["technique/combat-training"]={true, 0.3}, + ["chronomancy/chronomancy"]={true, 0.3}, - ["chronomancy/fate-weaving"]={false, 0.1}, ["chronomancy/spacetime-weaving"]={true, 0.3}, + + -- generic locked + ["chronomancy/fate-weaving"]={false, 0.1}, + ["cunning/survival"]={false, 0}, }, birth_example_particles = "temporal_focus", talents = { diff --git a/game/modules/tome/data/chats/escort-quest.lua b/game/modules/tome/data/chats/escort-quest.lua index e0ebbba00f..2d956450b5 100644 --- a/game/modules/tome/data/chats/escort-quest.lua +++ b/game/modules/tome/data/chats/escort-quest.lua @@ -164,11 +164,11 @@ local reward_types = { types = { ["chronomancy/chronomancy"] = 0.8, }, - talents = { --- Note to Darkgod; burn this comment after reading - [Talents.T_CONTINGENCY] = 1, --- Quick explanation; Precognition is really similar to track now so there's the overlap argument - [Talents.T_SEE_THE_THREADS] = 1, --- The other thought is that these are both some pretty cool effects and may help to hook players that otherwise - -- [Talents.T_PRECOGNITION] = 1, --- wouldn't stick around long enough to unlock Chronomancers. Anyway that's my thoughts on it, if it doesn't feel right - }, --- feel free to change it. + talents = { + [Talents.T_CONTINGENCY] = 1, + -- [Talents.T_SEE_THE_THREADS] = 1, + [Talents.T_PRECOGNITION] = 1, + }, stats = { [Stats.STAT_MAG] = 2, [Stats.STAT_CUN] = 1, diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index cb1c8cf1e5..7fd060785c 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -246,17 +246,6 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) --target.T_STONE_FORTRESS could be checked/applied here (ReduceDamage function in Dwarven Fortress talent) - -- Damage Smearing - if dam > 0 and type ~= DamageType.TEMPORAL and target.isTalentActive and target:isTalentActive(target.T_DAMAGE_SMEARING) then - local percent = target:callTalent(target.T_DAMAGE_SMEARING, "getPercent") - local duration = target:callTalent(target.T_DAMAGE_SMEARING, "getDuration") - local smear = dam * percent - local type = DamageType.TEMPORAL - target:setEffect(target.EFF_SMEARED, duration, {src=src, power=smear/duration, no_ct_effect=true}) - game:delayedLogDamage(src, target, 0, ("%s(%d smeared)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", smear), false) - dam = dam - smear - end - -- affinity healing, we store it to apply it after damage is resolved local affinity_heal = 0 if target.damage_affinity then @@ -328,13 +317,6 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) if lastdam - dam > 0 then game:delayedLogDamage(src, target, 0, ("%s(%d antimagic)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam - dam), false) end end - if dam > 0 and target.isTalentActive and target:isTalentActive(target.T_ENERGY_DECOMPOSITION) then - local t = target:getTalentFromId(target.T_ENERGY_DECOMPOSITION) - lastdam = dam - dam = t.on_damage(target, t, type, dam) - if lastdam - dam > 0 then game:delayedLogDamage(src, target, 0, ("%s(%d dissipated)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam - dam), false) end - end - -- Flat damage reduction ("armour") if dam > 0 and target.flat_damage_armor then local dec = math.min(dam, (target.flat_damage_armor.all or 0) + (target.flat_damage_armor[type] or 0)) @@ -362,7 +344,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) print("[PROJECTOR] numbed dam", dam) end if src:attr("generic_damage_penalty") then - dam = dam - dam * src:attr("generic_damage_penalty") / 100 + dam = dam - dam * math.min(100, src:attr("generic_damage_penalty")) / 100 print("[PROJECTOR] generic dam", dam) end @@ -372,6 +354,11 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) local def = src.tempeffect_def[src.EFF_CURSE_OF_MISFORTUNE] dam = def.doUnfortunateEnd(src, eff, target, dam) end + + if src and src.hasEffect and src:hasEffect(src.EFF_SEAL_FATE) then + src:callEffect(src.EFF_SEAL_FATE, "doDamage", target) + end + if src:attr("crushing_blow") and (dam * (1.25 + (src.combat_critical_power or 0)/200)) > target.life then dam = dam * (1.25 + (src.combat_critical_power or 0)/200) @@ -467,31 +454,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) end -- Braided damage if dam > 0 and target:hasEffect(target.EFF_BRAIDED) then - local p = target:hasEffect(target.EFF_BRAIDED) - local braid_damage = dam * p.power/ 100 - if p.braid_one and not p.braid_one.dead and p.braid_one:hasEffect(p.braid_one.EFF_BRAIDED) then - game:delayedLogMessage(p.src, p.braid_one, "braided", "#CRIMSON##Source# damages #Target# through the Braid!") - game:delayedLogDamage(p.src, p.braid_one, braid_damage, ("#PINK#%d braided #LAST#"):format(braid_damage), false) - p.braid_one:takeHit(braid_damage, p.src) - end - if p.braid_two and not p.braid_two.dead and p.braid_two:hasEffect(p.braid_two.EFF_BRAIDED) then - game:delayedLogMessage(p.src, p.braid_two, "braided", "#CRIMSON##Source# damages #Target# through the Braid!") - game:delayedLogDamage(p.src, p.braid_two, braid_damage, ("#PINK#%d braided #LAST#"):format(braid_damage), false) - p.braid_two:takeHit(braid_damage, p.src) - end - end - - if dam > 0 and src ~= target and target.knowTalent and target:knowTalent(target.T_SPIN_FATE) then - if target.turn_procs and not target.turn_procs.spin_fate then - target:callTalent(target.T_SPIN_FATE, "doSpinFate") - if target.hasEffect and target:hasEffect(target.EFF_WEBS_OF_FATE) and not target.turn_procs.webs_of_fate then - target.turn_procs.webs_of_fate = true - elseif target.hasEffect and target:hasEffect(target.EFF_SEAL_FATE) and not target.turn_procs.seal_fate then - target.turn_procs.seal_fate = true - else - target.turn_procs.spin_fate = true - end - end + game:onTickEnd(function()target:callEffect(target.EFF_BRAIDED, "doBraid", dam)end) end if target.knowTalent and target:knowTalent(target.T_RESOLVE) then local t = target:getTalentFromId(target.T_RESOLVE) t.on_absorb(target, t, type, dam) end @@ -608,7 +571,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) end end end - + if src.turn_procs and src.turn_procs.is_crit then if src.knowTalent and src:knowTalent(src.T_ELEMENTAL_SURGE) then src:triggerTalent(src.T_ELEMENTAL_SURGE, nil, target, type, dam) @@ -616,7 +579,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) src.turn_procs.is_crit = nil end - + if src.turn_procs and not src.turn_procs.dazing_damage and src.hasEffect and src:hasEffect(src.EFF_DAZING_DAMAGE) then if target:canBe("stun") then local power = math.max(src:combatSpellpower(), src:combatMindpower(), src:combatPhysicalpower()) @@ -2500,22 +2463,28 @@ newDamageType{ newDamageType{ name = "gravity", type = "GRAVITY", projector = function(src, x, y, type, dam) + if _G.type(dam) == "number" then dam = {dam=dam} end local target = game.level.map(x, y, Map.ACTOR) if not target then return end - if target and target:attr("never_move") then - dam = dam * 1.5 + if target then + if target:isTalentActive(target.T_GRAVITY_LOCUS) then return end + if dam.slow then + target:setEffect(target.EFF_GRAVITY_SLOW, dam.dur, {dam.slow, apply_power=apply, no_ct_effect=true}) + end + if dam.anti then + target:setEffect(target.EFF_ANTI_GRAVITY, dam.dur, {apply_power=apply, no_ct_effect=true}) + end end - DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam) + DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam) end, } newDamageType{ name = "gravity pin", type = "GRAVITYPIN", projector = function(src, x, y, type, dam) - DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam) local target = game.level.map(x, y, Map.ACTOR) local reapplied = false - if target then + if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then -- silence the apply message if the target already has the effect for eff_id, p in pairs(target.tmp) do local e = target.tempeffect_def[eff_id] @@ -2528,6 +2497,7 @@ newDamageType{ else game.logSeen(target, "%s resists the pin!", target.name:capitalize()) end + DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam) end end, } @@ -2825,17 +2795,6 @@ newDamageType{ end, } -newDamageType{ - name = "temporal echo", type = "TEMPORAL_ECHO", - projector = function(src, x, y, type, dam) - local target = game.level.map(x, y, Map.ACTOR) - if target then - dam = (target.max_life - target.life) * dam - DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam) - end - end, -} - newDamageType{ name = "draining physical", type = "DEVOUR_LIFE", projector = function(src, x, y, type, dam) @@ -3385,7 +3344,17 @@ newDamageType{ end, } +-- Prevents Teleportation newDamageType{ + name = "dimensional anchor", type = "DIMENSIONAL_ANCHOR", + projector = function(src, x, y, type, dam) + if _G.type(dam) == "number" then dam = {dam=dam, apply_power=apply_power or src:combatSpellpower()} end + local target = game.level.map(x, y, Map.ACTOR) + if target then + target:setEffect(target.EFF_DIMENSIONAL_ANCHOR, 1, {damage=dam.dam, src=src, apply_power=dam.apply_power, no_ct_effect=true}) + end + end, +}newDamageType{ name = "brain storm", type = "BRAINSTORM", projector = function(src, x, y, type, dam) local target = game.level.map(x, y, Map.ACTOR) @@ -3437,3 +3406,63 @@ newDamageType{ end end, } + +-- Temporal/Physical damage with possible chance to debalitate +newDamageType{ + name = "warp", type = "WARP", + projector = function(src, x, y, type, dam) + local target = game.level.map(x, y, Map.ACTOR) + if not target then return end + if _G.type(dam) == "number" then dam = {dam=dam, chance=chance or 0, dur=dur or 3, apply_power=apply_power or src:combatSpellpower()} end + + -- Factor in fractured space bonuses + local fracture = false + if src.isTalentActive and src:isTalentActive(src.T_FRACTURED_SPACE) then + fracture = src:isTalentActive(src.T_FRACTURED_SPACE) + end + if fracture then + dam.chance = math.min(100, dam.chance + (src:callTalent(src.T_FRACTURED_SPACE, "getChance")*fracture.charges)) + dam.dam = dam.dam * (1 + (src:callTalent(src.T_FRACTURED_SPACE, "getDamage")*fracture.charges)/100) + end + + -- Deal Damage + DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam / 2) + DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam.dam / 2) + + -- Increase fracture charges and refresh decay rate + if fracture then + fracture.charges = math.min(6, fracture.charges + 1) + fracture.decay = 0 + end + + -- Pull random effect + if rng.percent(dam.chance) then + local effect = rng.range(1, 4) + if effect == 1 then + if target:canBe("stun") then + target:setEffect(target.EFF_STUNNED, dam.dur, {apply_power=dam.apply_power}) + else + game.logSeen(target, "%s resists the stun!", target.name:capitalize()) + end + elseif effect == 2 then + if target:canBe("blind") then + target:setEffect(target.EFF_BLINDED, dam.dur, {apply_power=dam.apply_power}) + else + game.logSeen(target, "%s resists the blindness!", target.name:capitalize()) + end + elseif effect == 3 then + if target:canBe("pin") then + target:setEffect(target.EFF_PINNED, dam.dur, {apply_power=dam.apply_power}) + else + game.logSeen(target, "%s resists the pin!", target.name:capitalize()) + end + elseif effect == 4 then + if target:canBe("confusion") then + target:setEffect(target.EFF_CONFUSED, dam.dur, {power=50, apply_power=dam.apply_power}) + else + game.logSeen(target, "%s resists the confusion!", target.name:capitalize()) + end + end + end + end, +} \ No newline at end of file diff --git a/game/modules/tome/data/general/objects/world-artifacts-far-east.lua b/game/modules/tome/data/general/objects/world-artifacts-far-east.lua index b894dd7ac9..ea54c24a28 100644 --- a/game/modules/tome/data/general/objects/world-artifacts-far-east.lua +++ b/game/modules/tome/data/general/objects/world-artifacts-far-east.lua @@ -554,13 +554,11 @@ newEntity{ base = "BASE_STAFF", [Talents.T_PARADOX_CLONE] = 7, [Talents.T_TEMPORAL_CLONE] = 5, [Talents.T_TIME_STOP] = 5, - -- [Talents.T_GRAVITY_WELL] = 6, -- thematically wrong [Talents.T_BODY_REVERSION] = 2, }, talents_types_mastery = { - ["chronomancy/timeline-threading"] = 0.2, + ["chronomancy/fate-threading"] = 0.2, ["chronomancy/timetravel"] = 0.2, - ["chronomancy/paradox"] = 0.2, ["spell/temporal"] = 0.2, }, }, diff --git a/game/modules/tome/data/gfx/particles/bolt_paradox.lua b/game/modules/tome/data/gfx/particles/bolt_paradox.lua new file mode 100644 index 0000000000..ff1885d362 --- /dev/null +++ b/game/modules/tome/data/gfx/particles/bolt_paradox.lua @@ -0,0 +1,51 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +return { generator = function() + local radius = 0 + local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2 + local ad = rng.float(0, 360) + local a = math.rad(ad) + local r = rng.float(0, sradius / 6) + local x = r * math.cos(a) + local y = r * math.sin(a) + local bx = math.floor(x / engine.Map.tile_w) + local by = math.floor(y / engine.Map.tile_h) + local static = rng.percent(40) + + return { + trail = 1, + life = 6, + size = 3, sizev = 0, sizea = 0, + + x = x, xv = 0, xa = 0, + y = y, yv = 0, ya = 0, + dir = a, dirv = 0, dira = 0, + vel = sradius / 2 / 6, velv = 0, vela = 0, + + r = rng.range(250, 255)/255, rv = 0, ra = 0, + g = rng.range(120, 128)/255, gv = 0, ga = 0, + b = rng.range(114, 147)/255, bv = 0, ba = 0, + a = rng.range(80, 220)/255, av = 0, aa = 0, + } +end, }, +function(self) + self.ps:emit(30) +end, +30*6 \ No newline at end of file diff --git a/game/modules/tome/data/gfx/particles/temporal_teleport.lua b/game/modules/tome/data/gfx/particles/temporal_teleport.lua index 5de134fdd7..65395be791 100644 --- a/game/modules/tome/data/gfx/particles/temporal_teleport.lua +++ b/game/modules/tome/data/gfx/particles/temporal_teleport.lua @@ -27,9 +27,9 @@ return { life = { 20, 30 }, size = { 3, 7 }, sizev = {0, 0}, sizea = {0, 0}, - r = {70, 250}, rv = {0, 10}, ra = {0, 0}, - g = {130, 250}, gv = {0, 0}, ga = {0, 0}, - b = {180, 0}, bv = {0, 10}, ba = {0, 0}, + r = {0, 176}, rv = {0, 10}, ra = {0, 0}, + g = {196, 255}, gv = {0, 0}, ga = {0, 0}, + b = {222, 255}, bv = {0, 10}, ba = {0, 0}, a = {25, 255}, av = {0, 0}, aa = {0, 0}, }, function(self) diff --git a/game/modules/tome/data/gfx/particles/trail_paradox.lua b/game/modules/tome/data/gfx/particles/trail_paradox.lua new file mode 100644 index 0000000000..c443c25846 --- /dev/null +++ b/game/modules/tome/data/gfx/particles/trail_paradox.lua @@ -0,0 +1,56 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +local nb = 0 + +return { generator = function() + local radius = 0 + local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2 + local ad = rng.float(0, 360) + local a = math.rad(ad) + local r = rng.float(0.1, sradius / 2) + local x = r * math.cos(a) + local y = r * math.sin(a) + local bx = math.floor(x / engine.Map.tile_w) + local by = math.floor(y / engine.Map.tile_h) + local static = rng.percent(40) + + return { + trail = 1, + life = 3 + 9 * (sradius - r) / sradius, + size = 3, sizev = 0, sizea = 0, + + x = x, xv = 0, xa = 0, + y = y, yv = 0, ya = 0, + dir = 0, dirv = 0, dira = 0, + vel = 0, velv = 0, vela = 0, + + r = rng.range(250, 255)/255, rv = 0, ra = 0, + g = rng.range(120, 128)/255, gv = 0.005, ga = 0.0005, + b = rng.range(114, 147)/255, bv = 0, ba = 0, + a = rng.range(80, 220)/255, av = static and -0.034 or 0, aa = 0.005, + } +end, }, +function(self) + if nb < 1 then + self.ps:emit(30) + end + nb = nb + 1 +end, +30 diff --git a/game/modules/tome/data/gfx/particles_images/spatial_fragment.png b/game/modules/tome/data/gfx/particles_images/spatial_fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..a666db2d2dd99c08b079780a253eb9be573cd9a8 GIT binary patch literal 11179 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 JPDHLkV1h3vljHyZ literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/particles_images/temporal_bolt.png b/game/modules/tome/data/gfx/particles_images/temporal_bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..0ffab2efe3eab1d2ee2ebe373a28a36ec5a54d66 GIT binary patch literal 9657 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_01.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_01.png new file mode 100644 index 0000000000000000000000000000000000000000..f7faecde70ab285d38b2767d9f35642dff19582a GIT binary patch literal 6684 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 O08mlXgjLF02L2ahbUzsY literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_02.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a8407740aef3247a22dd19681f7798cd0dc78551 GIT binary patch literal 6689 zcmbVxWmHuC-uBQfp`^qxfHceiQql}Dgw)W83^M})(nFU>%OD`2(jknrlynaw(j{OJ zw=~j?gb&{5+~<8iob|kGy?gEb&);?Z`qPdxyst$=$wmnP0BB&^P~+=a<<Cb>dOemp zdCpx=tQZXojETDg#t-3z2B@Ok?a@G(E5Z?Nj7FdWJU^io001HfC%6U1LSIiF>Fz3q z_#-3c@9J@l1^^V4{XGy!7c>TFk9Kr&Qv~g_bbx?PC`FL@U45{=hdTO^lXjpN+9dEk z92w|>ltY1(m4FKV^4A2eXbb}A@A}xyTi#z0^f#~k_4?1TI0*Q+2*yPb^e>|<^bLXP z?p|o%T`@^fBp3n#N=u7Dr0z;fLqvcQV2Fe``1+L=g-FTYm6n%~0si{|U2F3~ImjDB zHUF*adZ!3_gu!^oi;MgD`HA^Sin)6^ibLe&<o<9-NQhobh<XROVG#bJZr(iqFhJ4X zNG~T3jFY<?@DC%x-rWbI2)efPUoN<M=<EN7*v<Rjfw~TvxIe-}93lo5cXj>a*Wc3K z7-RJRG2_2Vd&2`f(Bj5uZ+9Or<aItAc>V!j$L@bu^hfa88hHaRr|YC39z)%cKCWmt z3=FCWy1o%ZIichw!B8+%Qc_h$6RfTw1%b$dWx;allCrWIckjw+K*9fT{5Pz$`dwK$ zIoZ2lb=m7oXh^9^YDlO_Ny=(!s!2eh;Jg1|VQ$_Sgc}n5k6x#1z5m8a{jXSgbuTmm z<L(7_cYpj(1sFbZ$GCexa`ynLn@9r%%$?j&?tb2af70_WZ=q-}Ctoy5)63lz_;-Be zo&Jk{Ns0fL-~Ym*{(oX7er=5SpW^txishf9>k9m{{7>m$Z~oIfXt(Q*@w#q}2}>** z0AMnLK~>@YUpK9tyxFIH6yG(he{lp$b^>@+$RqWVL403~f7F;JFVBd*dez8azW?dr zK3~a2!UfISeMl~xQBLfhXVIob+KiYk(|cKllk6FY%gEv3ocJmYDTqA$7W1f1T2$#r z%hAoylh&XS#gle2?xG&9gTxsU74ki@fH{JBj<1vo{q}Pto!{pbf7wi3!D0tD%jB`; z&u4CqigLgNP;3<Gr)=Yfx^KcG^`fXb(xclj_N{E|?U1YI2LWpo6<51|RmyNO9~~RC zmu@30B*imFF}j-Sy5x%Z<poFl6TQ>1J3!X_F#?o=4r0kzU(z`0_l!k;NxVHG4T)F+ z4T<y;gV|aS5|fSO(onCi?kMUR$Wa3#{kHCkHeT-FUb>=C3^TFO(j6lcGwd||UazHW z->S-2tb8-v_v?Qi`MW3fbD4G#*3az08pXTCD9_a1O09;yA6I<Jp3{V^zHh!uhUMzD zE}D?oJ#GxUyqmov%6eXpomE)mH<%XNo8AZs=i!fZpeLSt_{g~QJz0XjaiLYuJJ2JC zr&4SYok4uY`ytM}+D{EtsCZjde^fSRn6i?TDWA06R^E^J_M09eGHyTvXfEXRQ<gGu zzo(9@u^9rHSL&^n3jm0*1$CP^sq#R#(i+1ucp_ZaH0ai;qPx_lV*<3yF<Ed`s?4hH zfH$u0vs1+kF1g8nYh`C7#A6S%qdvbI!kwUShKF@`B}GCC7g++`hIyu;EjD`s?0bEH z-L4GFFryECFK-S?;0A1#h1vq10pVxgbc`#qGjejy3aU!e9gx*lC3@zRU!KxKZDaj! zF-cJ9;N0PxQ1KPa#HhX8y|tWYDV^GdwhAX5%*|5LE0V#{r0TE{P=dEHPOdOql9X^) zR_%GL_cK#H#T#_J5fZINR?<$5L;PEfEqX%4h>Vo-lu_Jx|71MX0oA+^{N;Y`y<ar1 z3rW(U<oB|E0{a{ee0@Vh*-So*i9E(f#@m}kSkH*X<iu+(_T@&w+76G&ye77?6ju`~ zE4`8#bC>b}hCM<U-GSl8x&WwMtJK;lWi0;&LBGEb2iHq_O*8$%z7aHo6;bzVh{R{h z+Q!4~LHoteUk5*3JiZiO%ju|4V?8jKMyyCFLGisuK3J;<trywMKoJJz0B$`(SvO*n zHN%|!i`s_)p2z|1g5LeO0j`UKpGI|G%!0dD_nI`#)<EiWYY9ynBhH!*l-1sR94Q+- zSC44@6JU66)VV@i9`w)!JJOsj*9<QUIS-=J9cd4=Kco6^)8MyU^s8ya*E_?(Cvwy# zngP=Bj%Qa<J6WnOZHe!{DV|mn$mmt8s$}IShBE`PyczEq+V`H7gl#RajLZD~aUK?B z>}rb>#EZC&W;?7=(BP)n`mh&SZ~12euZl~$590hgw>P}$&XNja2-Eb^scjKiFY$Wt zOxv~L5piXc!L-D#l`PUN?)#U^y1SGlhrb%=9VBMhb;@m=@nXpYE{w8QLeN_(r1Zv> z?UZ)YCrJ=<qihJmP*P+tS3b1xEMlkQZ0?KhPV324jQ!}hysiy<*Vcte8r~nTp9m<$ z%1vwicxpgNpkMowiL3laRi~+V9OP%brceFVkh$$y%IZN{R7q&zn-+$}-U@FPh9|Uh zjo1xg$E2|3fElZ2^Bq?=0-4Pa=9Cs4W4)UY2X%2(c1;0PALEjg__GBP^;F%7EK|~C zY!zk`Rco8;!ue1k^v8Y??NsG_tMAyCnP1sDnMg!(FTpr;PX&CnP2V$q2^bY{9qMVz z*2jm2Co#jK&`NJm%UdRIpNogg*61~h#fjY?{kjeE@NcoAiI{|zy-}4{nd0c$B<*8& zRddQYDw8oR9$mu#bSIKV(*A0;rmK#ATpxRXUZefd8>38hDGA7?kH-cyWF>vsL~^J7 zWPapoqoG6SP{vBx3@QM$5tK?})Jz%lc*LDY^3(khMqJ`uGP6TTWREa}hB3~+-J(+J z!TiUeZ_^OPS8sLSlH)LSrIKp{=*V8`A6p#z0*^@avackB0+}_cpV~Ah3=LDpjePiV z2y#vffQH9!4KtNezwv5%=EFAI(H7M@))RF?L}+h+wnVs}?pWb~JkkprIAc_=(YjR& zy~{HQ;ydlk^zT9v<^8aQR`}^_NDL~FC=~*IGIb30+XRNW6a(cS3LwjNRF<rYWk$gI zs|$P@YrOS^ElOr*uqjQ2dr`dG+;pOI{<rT}h0n})!-q8?wgve&HsS;7NX2ll$dQ~- zPA%3S9ha9ajdh-!6C?0y&#sSY@k*QajNabfM@JRby2C3g@<*!C&hVj$U=_76FrZ+{ zQgr)470W?Wb?fJ?0_~@S5d}%^dL604sm#wgf=DmR%srNm(K99kuPfQL5O1Q5suC7@ zOeX6wqb}1xnc&x2<oCa;mH9CScBkb!*~@<IKDHxjE8~1_&88XmJYkM*=XdCBrh%su z24S4GuNPJ}&`Y^B$qgnwUGfE}o-(u<>qu&`@S>&NdJF~N!df~1`)pPEHoR0&fED%i z2sgTUwvIcs*Aq<1AYqsLMLm^u;D3&<J?;J!up~g&v0H&=6J9XMDdZnnz~|<Ev|E;z zE@vz~XJTTLl=WRAHj|OG_|hJpj(j`j&2WmlKYaq89^H$d9{Fpggqtb%9>KgpRZRe^ zlHy$96?ZvI$fU`{1cpA{mSqQMGKcnQSV>w=eZ>aw1@A{2RhpGO41o<4eJr}_plJ!b z71d2o$rj#=dEzbe&OY99<J-eCA!7btKf~nWd3E*<r<D^o(%*Vq;;9~;nA@>3A+N|q zoQv0S3AexfT+48I{mCF)>IrJCoBvgsqp<%;!olK+7SpPQ<@t<-i=_Tj1tZ8~laa$H zp_&)?3KIC-NXWMP5vs0thHaVUVQJ|Ay1dD<h@@^%Q*>Ov!dNld$ni$zZ6Z{S=?i$A zb3;PCq}ucN7l_~>JYaU4?k_lP+iSt#9)*YR@WUe#Xu|sjNJ^XDz;kvCWs4O3VHUU9 zl)IX^Ri8|a?8!rOk1{u;n_!~mk?hk2!m>5^akkRHI#3S#{6&4@MO|Z9dWpNJ`imjK zJ@unk@5|S}Ky`8G4XJ0#mP-TrP|s*3H&4^YC{apaLzH!<yXvjSdg4O`tu|^F-+Mco zB0F6UhNXm*BckL2H9{yaX_^lz2ur6JD3XX_Q+hni!q!|b0%eRW?|%~2gNo#J_o&kO zb(PZF_;RQ8<k02*G6=e-o5(?Ewc%d&**s3Z*5t{f<GhoWiXUU^g7+R)Ip8v~v?+vd zbJi5GgIci0_1)O2=Lu=F5R;6j6TZphiS}<3ho)Tn6_`AmEEN>b8JJf49;BYE4!d@C zD5`ap;qzWW#{f8bydNvm;6{mw+F4^vu;5Dnz0@(8WSCYgscVE+tJ=vbAzzFB3oW;o zn`A1EV{hc;ZZ4L<ELTZ2JE|?5#fqQdCtYoV2BH{nW-qtr2H(6Mz<ZM{`bTsxgV+ov zc%pCAYjI!$UCO7m-HtSPSL=6w-X&}L@D^-SbZR7b=XRd6gSMAzPqnUrwm_;^-xREu z`>4x|>f4s}s9^SObo>`2T~A5lojg}qem^3aoe8i=m$xSpM3mxN3((PPv9T<liqCDJ zMy#d2uhjjZwfM{+T_Dx9JS(j#(?kH>IPS#kc0vgfju+6Uzws+6ly>51QTD4lkUen5 zSD{D78ZePjoIrOw6AXQ_9!%P%%A7sN^o&}MRnB78Vs%y8h3M18JTy*YYUuVWF<fYH z4rqv3h@)!GzPLALnIIag7%^aHOoaVrIaD%U7FBRb_|v*4wT;J-(JBNmQoO5dZfKqJ zbXpp0I*_mY7$LRr%uzQsy+l);4S(p%+dw=p0lwU4sLX9sTjcwZf&c!Quhy7<jhnI_ zvXVMCMP4S%%zbxCQ6x2k_j|$J7`66@H0xK*!eyDO>uKR$Y1L#sFa^OF+9)D8m34q( z(;d?geOIuD^jThe8qI)Cxj;RWQQuRK9#bzP5m`NbUg*k|M-M25Bq7HrdoQWLF_Py9 zDPX~kdJ}Pb%LglTOUf5~gDRnCg;%lh6X1br(Z@8gRXvO)E$<}#+xto*5{JanZcb~T z20kUEefIfFLq@jR;{CAfgU=ez<wjETg9JFinnpqnj5;Vjub`lF{i&aSrLX4v#$~UW zb*J9-SpP~4bb!3<;YmHPjD8aCJPexmp?E6o<}al~g42$F-_2OpV1KAaqh#VY9)B9d z1cOI?E?1G`Nvg(31cQf3&#+NX(m-4)^g6?@LA01`+1=9TX>k|e?`$$=rYR37%+~^g zS>#o=5pYwt-bFJXhNF<TVeJ#^3Z^2T@0U^Ce(xk9J)5>!DXU6H%;P?x?@fL46{9_1 zw$ARhCGk@D95C`GCDvk(FSyVZZRq%=rLVtQ?Flj3OEynx&Pqe6tp1kq%U%NcY^7hG z36zBzb``~T+2k=ear*ZbXRsSDVsKiT2uSu>*G7J%iu`)@ENlO4<Zh*H^Ks^zf#Ppb zUbPmL`BoK@pT|BsmFFAvRLM`0XTvnPqIq~J)H_GV{5YsfEJez~<p|B~Kg<-qC|`;% zUZHU&W|*ClPP2b#bfdqB(rlWe#<Nr>H2U<(p=3dEbI50o@^+42KV6HaEQ`h;SRmKU z4rN8FBNTucQY;tQ+>_*y*oJI`M^0%Q1(FIUjW>#NpiM?A>7tn1=!I3Aw>=g*>qM3) zMfkkr*zf5?Q1RQP>%(zu#4vT1z((I{8ovd}EK-&il0vOhRG-AVc_A5#63QtZ2^Cwu zRZRhl4Ir!;#S8oyHqyZ#o2Vj5mHg6`-O5}x9k7sM(P!+u#u?8&++P*Lv15GachRc+ z>=4^HlTNQhnmQ}btIAv#9+bf8b9Hw+B^fUPig<((UT@3k&|SLP3$OK8-<{~1k7Sv# zQ!FQUK1{-&NHNCt-HtGN@<xlfswOanu#f*^<f8`Z`8R6KccLJ6m7M!4Vt7<B#jLr_ z!h;~uiqI_&fHr?N<HqFP@bD9rB~$fO;A=uBEohNT)cAVI`#A%RZpMMLuxDUz8uf;X z<ICQAwh+EZy_=7Zix)^C(wgoC$-%7ArfMn$2Qh=Tthml**fUn+@3O@x8refaT;M4Z zkL<ln`kc2@S?PXdT+GC9#QiG6$FM)YrMvGJb;>FDgv3|<iOh}YjO2zjH+Td}fe&jz z+#nNnI8b^u>o6AV6#6YB-fGSf=$1^?>};J#yq0qIv)DAVvAJGtdOLsTY)0A&bwDz> zyuvzhOL6-Sp=(O3s=-UK4@oy9Yx3$D%w=ROMULS2MBGlYa$`Fm^3&1?_%~;1<(ja8 zr=LgWpw;|&l*;YNZ}Kk2G5f>2)t__DcBqT5=?HR2OcdAdPlWkI?_fZ=)Lb2jQrn}a zfJ!Y|?blaA@z~Xr*J3%GH*X_}1mAH~KI}R2-cc!cG}=;(dcDn=Ld6@0(KevJVz>y8 zdq3p!*iZhGRoP|j=+T@#i~Qsj2hQ=m_oPWY55Aqbyn|k8`*`N#F9PQS&zj$wAKth) zCwUxl=)xhrb{Ybg!$n+Q(C6=v<}a!58DPsjBcul4#R2>!gadumInHdRb#G)$`L#^h zY<g~3eYNIQN<n?}z>#UQcIDY)mWw90D&jm)HwqB@RHEadc%hni*tbZA<w9XRJ-(Aw zMwJ%%=CD(&f2lYBW%l0t!AZjkC9O=Bx+uCVYGl&n;z`W!J1=J9F1X{lwLWR%I><R) zevc;hI#)hLuUw{Q_jCs;6Qt!H6M*)(sY_KPkJhe;qtk2~<|&>{HMG>*oN{^fSz|q$ zn`e1Ad_HM7FO#LTbuCoY_wP(Iy~?np7KD5xV{fF)fb%QEnWIUX;6Z2YVQ#!2BN0?b zu8#8C`bJ{!<BU_*niT~J`IIQ1IJXJ4ocp&<3G^y`a|q)CW0L<mV4_Egh2M<bzL->w zZ0_^7?s9QlHzw*0F~6yqIN}SnZz`Fen`P0zfpk1=2NaWmZ!y$f*~g~pmK<}9YnQGl zErRVA%Hkrs6Xx{wjbvyJ>X>8N5pn5KGh&hJDp1^z&VAsB_V{Cc*Bv9NB1{POOW60_ z_`|++Keu$)*;ewI>fDL@ydHyJrtlp1m=8-RN5TB6S4&D-*i!duzF+hmAeO7ogN4f- zQ3M5OpXlJKXV4agG$)~haaa7T@|kO6kfqI(Kr?p9iQ=4%=G5qyBP?uu_rigI(o%NJ zFVUAQGHpiw+32k!D3w-4#k3YSAT6*(Dm2qF_B~i##Zkb&I};@kU{Us4r3K%TlN6ZQ zbqbui@ryDw_9l%VN>Dg6d#kow+l0)`!)fWmgw0h(X?b^6fWrGD6Vi8x!_FhER~#Qh z5(l;Uc-`n50mdh<(b2?>1}8fb=XHX(K;qECFLxhK<|J;+pAWtDhB`1uDhBP{`)D<; zomOyVK>!og0@hp%Gh__LMh<3!m(b+_`Mw$sNAZ@rx!iyf8BC=K)w`ShAmRs#`h=e_ zoqdM9)5zZSlvDPhO4_u&^r#);^e^T&6~c4Ll(=j7*?on3t8MeTQu{LostolfsVO9R zCMFBs?ar|Wn-XtC?a_$q!-cIkv-)}D9{s|}Yj8*PTB$F?`fXyl@lL?<8m&bwDW!tF z-^%yn^zFrstjB_WlH&LoZY|HAE~IMF+VM%XH?VW%r#KVwB>2gQ*Lf~R(UF(H)bh#G z(y}4lH^_OOuDh7Yf!}r<LKDI^BVME&5PdDoEl#90-lRrK_|EUlchR30p5$zJU)W}o z2Jyz7lPL-`{iIJx+(=Su{HX1k`_~DfUBlakZxQ~WRRXR)qMV+~oekM}i0$UOYF~&J zitEcP*U$1@uAd{0fMC+jzlZFVCk~<AFI!|EaYdDCQ(|xP`Bh)q_A2ixZwIygOyoO8 zMaEd=$2=I-BC&f{El)5?{-k}U?^!4p;8+PYJ+s7#6c@-90;rWlwU7+Y*zx%!>^+R# z40hZkS_pOYJO16I*J{A>;RLV<6qm;Ulo%jL=9mp+>;t@B(;H9)N0aWN9{_yp-=*5U znn#yJ2B6zAi6J9M=A;wa_avB+G&)Pp9Jr^s<s9N7A+b1O-1e$BhfsU|BMI$Kg0Xgb zuHB5y0R0odt|2)K*~iB3K7RQbs>q0?9uJ7LJbq+DTvLK8+~Y0a7cZd#d1Q->gYpe1 zc%39VXj_nL_llOF)An4sm&nWODOAtqVbjG&z$hoe*pGgLQw@6pe?i7*km!1WH;v#z zyyy?nPj0(8$;Ey7DTI}v@qA$-y!xs!YT}Z>&Mf!4)%SoT=eSR^4|p~`r#)z8*x|>| zh_JJ{2NOXTN?&SC-uv~O0|HSh+jmqIYaQG8(^Z6~&3OgxHho)ZUfe&w4eV6{)CB>O z*nxrLM3t~@Rcugg_k(C<Tc$>$&g`IV0GQMGl3+nha1Jsh3jnz0(lx&#V@CxC(i(pc z(WjNTfD!JF)h=n-*@X#jhGyp)5H0{0X$cp@Z7yL%9;3A%2spU5ZUT}{xMeQ5ThxB@ acLH|28*!eRLKJ^~+Q2mKLo3znp8gL=3pq^y literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_03.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_03.png new file mode 100644 index 0000000000000000000000000000000000000000..37d51af69fb3b9b8270090de89481dcc0658a30c GIT binary patch literal 6684 zcmbVRXEa=GyPgoecSA5rbYsS-!{{}74WbQ3pBY9MElTw0QKLi`Q6j<+B1B8kdypUr z5+y{5e&qY!_dVywx6WDX?6vp(lzm^<U7!7DCm0!MQIWHe0{{Rj9c^`!t5NySLrQ!l zYu$a8t_Gl=hNYh=*2OOni9-QYoUx85kPaH@iZVeVor8UbPznG5p^LkjrJtp~9^46w z1|$FIfP>K9S7-o0K`F=^>Ewy>1398x-7yHBosL&LAa`d3&uuAvh`zTP%FSIn1cx#W zF)(uq@pO`N=221vDFnf<2+$}$Bq#{&h4F<4A$b193%{EG*%s#k{Y%Bq6T$Our!4i2 zKx$YV3M2)Fi8(=_P>{4V7%C|xEe#a~NkE_y;*hIbS_~=)my(7{$bkO3c&@DBoL%51 z>Y9Jqx>_N4-2D8!;o{<ffq~#a7#NFl6^F{n$^GGwkPy4l5c3Vj_#uPDFuuHhGpM6{ zopA2ne(qQd=no^(5$o@V;JNbj-yxvA_4WTD#`yk~sH>ET2O+)1p<swO8vQ4(e`)*r znV|mLjsK|aYZmN{5;sBlV*PPWSM_k={TqChyZ_zLAH^$g;D$K&tD+#i)Ui(fXcWdz zM;*a)^#<(h?hJ=P)FJ9Hn2L-hL`_2y3YCS(Lgdt7va%XdQgRyVkiR+p6INOkDyOL; zr2<ity{d$Uq^g9ZgsQrn=9N^FR8jp0tAp|NLt>mzf7^AxvilcS?tjI?)o>`J9~NhZ z#d`hS0Y+|EKdi4C)*GZ|Dh(36?T&HA2Koy9DbK&7RY&3615nPII4m0Uul&N@|AT#) z#Qzodzp>8$pPY$bIV1k3IsQkp{JnM6fq$m|wEorNpTmQ~T%8!))zL7PC?x{`nDunj zRm_6sH}AOn+6?$3&R+yKk2nx_1Nf9lWAxH_ZqAvkJTp)KIt$LpX`{crH)Owev*s-2 zjH+r6T5QH72bTA#*tE=^1?w`mXe<OelDLGyuuB*4DiT7U>-VzMRZWEHo>;>ODeaCB zVLSM>B@CI+%?qVVhGN2>a)2wbd!Za}h_a14+Z+t=82=VW;BbNE3>Ra+1gX1hYj9{< zXl;_MKYYN)D3KDQ7fR(`U14mmTB&;ffnF~LE^U{x-_3fS{Ns3*!uoP|>B+7;-uj2D z{cT_1^yV*q$;FJZZhF-bZ~5PI5D-K7b24pBH$MQ7#*`IrHj!+$H8E&eS|i@qBRtSE zsF81#Oy)2dvAV-shT|UsUz(rzAiic2D+kHgk4H^KNVRPGY4YDoadY^!7R**qreZ~% z+5baQyJ{+w{nmxST>4KXsN;dKiO_1NElWtx&Tf)VR)4)#>+Z^uxss0z0Wje40z*VW za_1_H$icZS;>XQLJ7U1o7s-nXs{)2I;N6+;VfT0iVqEC1*Q>di)OM1j=$n*Vzv0pt zeSh6ulHlIRt@1CYliF$5OCy=JgU;XB`bs^Kpq!4_xZ4`BLh|I287ewHLJ4Ru=L`hr z*0dIsLanx4(&cYg`dTmo2sDkY1Ju|o5HjXgb>_7LwH37p%CmZz8~e{RA5S$8X8Gou zi_HgTsLy-J%y>-<+TerN9wqJA;d|CbWkT(>c?~bTGa8jZNXm8D`$YvugHmIPw-w@f zAKU;K)a4zxnuogLyG5Pa-`m!Y7gUj|X1{vMH#MJ^mp3O)@g(0}PuyH2JMR|v9Z1w5 z1szSVD!<CmeoEq_^}a$3o3-fL$s?E#J!`^b63gW&F0Q}7u-DZMlC>{7E-Qe_S7Vdq z1p!idzr?pyTJ}vMm07jCUP5k(@Kd$QO%!#!D_5m;X&Z!-p@pC7Av)R`e?L-1$z8^- zeu~nuPSc5L{Lpe3?In$MWnp%Km~VCWfc4r0U8LG#7jf(O+#<z80i=m|=SBTOz{fT5 zlV0{83(kE4a)JQHCi2DcXU$+VCq1h;)qEGh3c~>a^)iH0;2kON6K0byYZ7E=ww_!m zi7C0}wzKz}<NHZ1a}&q-lbKQc^IBCPMd}Rln<QAXclxP5WdVo6Wv44hlwK*ATaQ2% zbKP{^sAz9L)BbLN=YaO(jcn7IrSpNDGPjP3-!Z>@?07}|(z&sIS__X|rFdbnv-qM1 z+6UcATcjMyh<D}7a?iqw?2LF$r21VKhi}-|Pj#I}_k9(xS7_O*Sg9GfWQ_JKfS?)H zx-J=sg~}8P`Z7Z=-yaQ^;^%t%Jy^oMx~WXP=xAL(m+cUd@+N3Ljlp(0eE$^G)pWL{ zbh>O`Vs<CZ{VhbdYQvy;KgPXsnr$%otguR8HsqqMrso&KZshsm8fcGOhlWTvPXhR| zM^-E@uUfi!*2>Z{_;IdCapVW7gFA$U$G_G-Gm)<!TF|*j%yMei*`i;A)313l$zH(K z8I_6YOt!no9cGTwpfkpgq>x51QE;JLaNTYhSJ%n(@e}OJgF~XR9n6@+0Sf(md6J56 zB{xz~F&;mC<n!7%HnMWgKZ)Uqtf=>luH%~%$9DMb%R>tBv$2Wew<~7i<6~AyKBwCn zl%(Aq4K`{AvA%<^eoA_Y^~sCBy0`t+e>R&y8rup9jG7zOrH!K_2jYn2J|yu3y#{<8 zr@URP!pAFGEW21ev&JrvV^Gu{aIlziClF)j^CIA)Wc-`9Ww}qJq_F~Ra=0}2!v_R_ zl<{f3g()w#L-LrH+QOo~4>Gb_M+)WeXZr6XHrn~xWmSAzqq~=%x3HbmB)Hs(_KU2O zkC`J&lUs@$S16Fdlo^$dxpO_N<SrKJ^$!F&Qq6hMZ51Vjj`jPYImbrdlzi;ZGd-9S zuo!;dbvzxRcwF%5vU2pJ$AuYPX{2|>sF?-p16Xf*Y$UT+*W<Cy!IzqLxfS&E4R0jP z_*RY`@#EfMT!9u?q>G|qjsczChMR@!Sf&VRiq)HryI+h)$#dbS=4SiUiH=lwKbDVM zQuM`16?r!&g(>0*SUR>i%z&C-aZCl0?XB(6FUPvSwh|IJI)2^f*~=4n+P{B-UwZJ1 z{l0UKpi6>>X0FDqpItJCQCh^xeVy_7*!)E2++gy;a*%()EyKM|LGTTwaA|u%r>ZsO zFZtCn!%+RT&o?#J`CgPa%b6VOOlvC0#PV(P(CRA&u^2SQ&VG7rHmnJ?t1PAdt{W_Q z3U<+sF)RvW8vw4nidfUPS!|EV6R4eS-&{Rm;tFU=JU%`?`8K?Wa=m*u^8}<ORXgp@ z$#<be0P-lBS=mM<L5tak?ks{6`2-<?<i{I%Yq;3Gl>`RElE77XeS=*zq9rQttq$W0 z4_4w1QUio0T9>3Vm;v`LE;#w~8-2+RnG%78<2hpDUXIPf*3r)8<?;$-?)vO^>Ys=5 z9gUXEg<)q&KYOkRPB(C0=BB)S#6vAjcT+9=j!X8gUP8M>5z)i&EI{|GQ`p-@v4RbQ ziu|Yyl}cMI=?A-9_jvJvEQuPc?xs~khhBWljCkQdj)6Ex>)!8*ow`xWYsGtfh%joF z@L;m@7IQBvPqQO^QG=0{H%+FNpN1XKN762ag&H$Dp9|o&pL)-pKd|o%r4tyYY}}s| z`W+tCvgP@6W0(Jc2B~k7_qH?tmT>RUz!(7X^2`Y{et+oMw99*u<xH7mT#NPjiLW&n zA#`wA^y0~YvEYre61v<XGVk4Cs!fP)*pa7w+-KE@Q^U1%bs^5nZ!E@$BUX%UTe1a~ z>LC*PE%o)|`}yv(ZJiwn5AgTq&KR``wTZ!@IIH0LC>eXaWJrXUdr@{v>eCeF3BExF zre5g-J;Q1q5xIG5<*(-pEEm>>_t}%5A|LEl)VAC7=NFq=E5Gxa;#r&&o?>8qvDVZ% zrNw{ercQQsz#TU^wJ&W#!2VVl($Nh{S_A*Fl)Rp}_rDI{n`bvn`9J$fRdzFZy#T9L zHR>{`i~t?bzo_>g$Da8yvs|vix2MtX#n+&=hy+mEdtrDsqG|vK*XEow9_P$Bd)^k9 zQiJ7H%lII)t9FpnQkREU*L89JuE+AucQA)NeuXk@VWoa{(3(*h!w}eNA1yeWYgMEc zToKdQmel3TbZ=%Q)7>nbIqBDa;t6BO9lx~>BD1F`dJtJgU7jX*Islv&(rRp_GbE;` zE?Uy_Muj%8yOwStfIIUICqwZ`+0gJfZ(QWVlMas~^T)%ROrZS5oeN}DP^in>VV1hN z8e$fcp81DyUP5t$;Igcz5MD1w&n*HMT~lvsF#WRe=6>U%O~rdBx}1XERo@Y$d(nbM zaK!Ek^Vt+Pxg7^_Ctu<TB!#u>U894A;UoID0*EiV(7>hA<gREvxcVd(n6=8(t|TKk zhs_8rvD#|{tc!-23AlPGND2K|=w8<s&t^-iU4i(s%h>yt#?)k2bja)pe%t$L^ICT4 zu{S<yV_<`hkfftm`u-x-v?pKd34KPA{O_&%(F@~FtaYYm)i*M!jHF<Ec;=Pa3IRUG zTXN1n_*T<S9I6r)r)}4>h9^)-b7fp_YTATKwzNy%BGYd$0m^7gc17<JW(G6^Zs~Q{ zSk+D^**~X5u4lE>>-K4_CZ^^IW})jI<utOJ3ZmL3+(|HNa2}B)L4CTzyJ_Jpu!Bt5 zr2<XapN&6);&&vkRZ1DN^GLry#sgr-l<nu#^NSpez-|d#V^_=2h}bl7#__9r^htH{ ztqpcM=fCMS^2N>I4xN2QDXDJ>DS>y1TVIzGv$iy|nO3k+Xq*D4TjPc9#tp-thj0}c zFY_@?T2y{+q12ngtyAT*9^zN$=p9{Zmm~WjogDAPdiNyXE4)g+v(_*Xl+gAK66ilz zH%S%}AB9eqt>}QgIhkkDPVuLqs30b5b^B13hIQK7o*JG%IlLKyDzQO*x#mNk`fizb z88FpjVP{ycV{UKy<LD9EV6yoc(kg+eZ<>ePik2F$3r-}8t4W9%T;QU%`qEf32CIc} zn(R~h)P)leiNq9QRs%d4ddZ1WIFfr*d7I>PSTN&ST1Fc_Rqx~&IHn27{NLnF7&cQP zVxM-fweMNu?xMp?gT~NcQH!TA@NNHer+OG_oil+X*(fW~Dwf_VVPSDGEc+lNXuGEB z6<VM@8-hBpZI`|lZ<Ty=m-cJuLvDwX{N}+xj;N9pHqMC(0@Lz7>t(pLJhZ)(xVT1s zL-P!g#8=znVNp^@H)sh5Dzc)YL;F>`Z>2LB#bm%L2MIX@s9)APp?H)i12t33r<`y1 zFtu}X#Zsp+B-g(E5Hwk9@VIDaAKdbBYap>=-s+%lW1bRNuzf4wb|Hu~D!p~1Qtp1j zJ920w#=0>@lweP}m8*x0=ziUAdhmxA64lL{wvJydxs{_N<Tg#&cItSG&9%sdbXNge z0W_U$nndG#jTUB&2C;+_Iq~^*XM7|>Y7@L=jakDNZs*#nAdaKiZK|&r)gYPrrL)Cd zrpYZ;ys_wv(bMU?@9W<sr$+@HEjc`5hWW~9dbl%UxE<El@zlhVq7S7~f(dRr_RW@L z)O|^+{zm0-oqll`ob706O#QZkd|HO%nNRJl@cTi<`>^tA>(1rF8GD-Z4-ZX#)R}C6 z>ze#T;B_|-1vzO`*eNfTXg#j0_IC_}+SI3(BAW<J3%*vXHj@lW6yJOny`7c~vJD&! zbg*W|5j~{G-!QmQ^*YwH@jbDy>BMy%HP(=};0mJF9a!NBYZ^@Wtez#qK1Rn;QVSK% z|0?m(qD5n8*y#~Z@-$gS?*V13OHgvEGK?bq;UmRo_1+T1-2zQ%6_cX~W;L5^B+dNN zl-`AiVT=4nsdD|SWG3M_iThw%r5V*hqn{jcOWmQEFGlpty^rtD&9AO6x;t#WNbPAt zQ#$8RNYbGp+xm$$H2`;E+H{$dUcf-AxFh<Unkdci0oj-b=9NaQpDB6Shz;U%ukHOI zWrp^Kw(gE&6YKN-F+kb_d6CJQvdl+{_XeNb7gT`|jlYP$B|}lsY|6e^oD?Jf@Yf|P z@*6)fM)%Qaior|ATcmmXv)d-G51hQH?EC!o%vmkSt|bg}LGGe*34ZVkxhVUrmSjkM z9;L|rzMM*#3OpjTi0<m>!k>GVT5C_nEqF|;2*qua^ZtP8t&}OS%+g#_lx20(TzcGL zOqH>l1#zTXn7<fmcye;YuJH>WYkMT+5nOz)O%1$W?S!B&G5pq0W`X|P-_K^-kyNzi zG~<@>fdyK8$3f3@zwIOGbMziD!m6E74gP*G3VzGx(~?Wmr1@53+mwGeKS4yM!erIw z4Q~zvxMsvgo-yPh*>d*p>O}73^yC4%&&Fglvh9AC(w!x|6@G(yy@&H7mvg|EV-G?l zLeHef+w@ln+c*&*<jE6JXpx~)Wl(^+S29)k*|x(ka*S;#p(8BG;|Ti3?<m&>q*G29 zlK3-c`AFZ(3+vdrXds>c)IO&Eh^=?D^biX}JjpDppT7Y-eChBj`)Bxo6U`!xQC#Zk zFBxG@Thr*6vK_0(iBMt@)s5DMi#Onp5x|aT&a=Ue&M9o=R+XwB<n@^>H6I+9^;SP- z>a2y!)sBDWe=#;`$Ge-yCx0J?P<~5F%v2`QP>Bgti&1OlqROy$Pd}8mNJpR)I5GtV zIDphZ;^AttlalChEjTMsNp|vCbJxQ>w(7+-H@fJDv{6Y&%8Zb+rO)>2^z!LS4$v=x zz@dGX*G^kpCu7<l%o}@NDs|*oTJ8vx>`g3b@PWHa$R$lvw+$UEH~d4kO5DO)o!<3b z^2ELDXRUhj(RSQ8&Zaz|OG%NPQgO5TOmKe11eU~o^V@n9VW3Lp_iu6Edm2GG-$g$i ziBoIvCB|;jm~O01(&ab|FVVhIp0-iebbZ!XKaS2HoJb&0iX2)THU$~)KqNvHc^u#0 z^d=ay%01~YVgX_Wf;JRvYe(94+<Mk=7%jes1t(9>qsPAVVp0_(03HPQRUM~`snT&G zQ^#s-I#Ua-H#8|jThff$#tLeLzE>iP4pv5GM4<)59kGzDq`~J_Lu6loI{8m)RuPGn zS@o%Or>Sh=>6~(%hqf@GSBjFKKAc{Bf5hh#h+jq1+ZHU(@Sh+st@2C9zsnYw<uWo$ zp`>MGK<cs|Vs%-hfDOALN#+hpirVFEL;PrjfSM}<0)DSB%z7k|!G&$g)HY{)bPuRj z<}5&aUD-VQJfLBSe)WM2CAO)qGuv&s5&vs14ccIWjqBf$plD)tAzh~=G7MU!ys7kd zv6NSyW9cYn@*}k-OVi=#?Gkkxw>AM?tGP{%Vw6Tc+&lV-nt0LG2hj}0^zD6S&C_D& zZw^fwn~0zfJ`1gb$!4l6;CmDx|5Pg%<;c5!m(<OMNshI;pX2gve`#!OR9{4Y3X{I= ze5jHuoAjw;IzzLT@j#1Q+e3~Z{p*Nm=}@xv-~ySNU4K4{#|+BiRYuFc6+v1E;Tm(x zPySL-)zPU5zBE0OWJ(R3txF+i!pPX>i88R*>dY=J?=JLMPh3YorZ>D#cAP>o*Tl*f z$XuI{&y93(&bQuYs=pWAkf_`V>DsDD@IWPX-U;R-(f?%8Dp)>h=~=CylSct{kUfYs zKXf}w>(`RJh!_xS^4YxkT`=Ss#vz19#ds+NY!JK;uuv_N8XRMS*HA;ogD!unvP;>K z-b>5pV@x!%nggnB-h=SvcDZB|`hF9kL7i0v7~?`Cl-Z9M4#qSRJCVr)7pKtzvMZ7M zMb(O0J5%V!-$>~V(@sJB4&7?%_Y758WO+dM&(mv-pC&%;sD##?MrwV(R{W;3=g7Zs z2Pn=TLc7<^G#A&^aH<^`d)aV)dLuIKn)1YZl1DNt(XESLmu%7q%7k~r>J>M(<1Uu( z%^WQ<7L$@3Ly$jp2qEru1^`Kd5-!<>87@Hg7rxVe{v%*!NoXa2R3m%G^(g(d@CbX^ zkKMaUFls<aSd6Au2#9ynHTJin!;NnmTGZWlDHU-()jS59>@IIR%{;fhhOoUNiG(f_ z#Wh_Zxj{77K=3p+8bTffpV^l(0!Wk5aZ$m$yP8`R9G(giWg{k?IsGvw6Exnh2M!|F zyW?qs_4(~4$N*n>Nx7lOm#l=KBOAL1R4lw@u(P`Qcdko>%S9)r5CR3tn4{ubVYKlM z3#4QMMM7Nrp{wazmjIf<-CaCuM;Gpx=E`05GMZudkQk2Ox>J-cweSGRu<yRfZ-kyn za0ySLP00oAh9T!5sjT;p)ltjKMn-pq$4$61Hy<p|6iwQxn6F-&r|fI0IQMX$_$CtH z@Q~t90u1PrAv!L=I$@;34YKcf3Fn-y1T{AH=^)RUbGFN(cU*NB$%Fv6qiY~J_5Jd= zPysv*)W9Y72zcRU^_dfJRD>t#cGEtHP}<5|K{%zT0Y<4wOHYHlk^NOi+<oUW`;cBG z9l%n7ZWjqL_2D&6v%_#!KpZfFm6c0}Gh!TYL%LPAd|^uQI^Y<9>ov}LbIIEcSS4$# VyiONdaP_+eprc`+Ua#s9^<O>#Im-Y5 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_04.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_04.png new file mode 100644 index 0000000000000000000000000000000000000000..34effaa41d50f87ec8e879e5dad28f19b8691a9a GIT binary patch literal 6558 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_01.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_01.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf85a7f483427aaf0faba4c89f70acae01f845a GIT binary patch literal 6541 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 Z<dai~y#5(n^5+MMG15%GPS-W&zW{?;d4>Q0 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_02.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_02.png new file mode 100644 index 0000000000000000000000000000000000000000..6d087dc041682fbed1bc6407b97232707f7da60f GIT binary patch literal 6346 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 Z;QhB)NTy4D{GY!IT55Wzw<^}*{{{I@Oj-Z{ literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_03.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_03.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec3e0c40fa9c7c255c4a537865998b5976aeb71 GIT binary patch literal 6515 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 AEdT%j literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_04.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_04.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9a404462c3010db185d61c206ac82924616f34 GIT binary patch literal 6517 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 Dw4|AD literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_01.png b/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_01.png deleted file mode 100644 index c6964845c5d5e5cee71c8ce6c7bf5e935b478ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8547 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 diff --git a/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_02.png b/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_02.png deleted file mode 100644 index 88f787802024f201258a852ea35241e2d2c338b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8493 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 b|GxnM2&VCkoC;4p00000NkvXXu0mjf@hfC( diff --git a/game/modules/tome/data/gfx/talents/banish.png b/game/modules/tome/data/gfx/talents/banish.png index 8dcf8a09e7ecc1af4a57fdc5ece5e499dbea88c1..4be985d8817006a5ea8d64776125fde7e5915eae 100644 GIT binary patch literal 3838 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 ArT_o{ literal 4402 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 diff --git a/game/modules/tome/data/gfx/talents/braid_lifelines.png b/game/modules/tome/data/gfx/talents/braid_lifelines.png new file mode 100644 index 0000000000000000000000000000000000000000..f486ca16e3e626d84e44e72a91418e20e1c496e6 GIT binary patch literal 5828 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 O0000<MNUMnLSTX)4_rn7 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/carbon_spikes.png b/game/modules/tome/data/gfx/talents/carbon_spikes.png deleted file mode 100644 index 4684f1c67b77be09d8954151faca0b02894ed3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4905 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 bh1Y)rWz689?A-rr00000NkvXXu0mjf)T>b2 diff --git a/game/modules/tome/data/gfx/talents/cease_to_exist.png b/game/modules/tome/data/gfx/talents/cease_to_exist.png index d06442d3522a6067e20689f1efa2fbae86f06834..1b1fab471aaafecaf1e1c8117ddcaae88b13046f 100644 GIT binary patch literal 2671 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 literal 2521 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 diff --git a/game/modules/tome/data/gfx/talents/damage_smearing.png b/game/modules/tome/data/gfx/talents/damage_smearing.png index 0795f2634ad83c14d74ca0241718d03b6f07424f..2824e199284aca281eeeb3f1a8ab0a097243dc4c 100644 GIT binary patch literal 4590 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 Y0qh^L@xcQb>Hq)$07*qoM6N<$f*{@TZ2$lO delta 2840 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 diff --git a/game/modules/tome/data/gfx/talents/dimensional_anchor.png b/game/modules/tome/data/gfx/talents/dimensional_anchor.png index 13631e942c011c64603118117696e48d42b86001..b83df653229172b6faf094aa019d953bf785e9df 100644 GIT binary patch delta 2132 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 KMNUMnLSTX!vhKeC delta 1769 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 LNkvXXu0mjfbGt-w diff --git a/game/modules/tome/data/gfx/talents/dimensional_shift.png b/game/modules/tome/data/gfx/talents/dimensional_shift.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a3f2e3c7c839615c3f9f7f1d0b0dfae7ba0972 GIT binary patch literal 3484 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 KMNUMnLSTZV6{Da4 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/dimensional_step.png b/game/modules/tome/data/gfx/talents/dimensional_step.png index 1a5ec6cfcaa24e3ef8d423a4e8e6213091ec2a96..203657d98d94d531379bd4934b481341099833db 100644 GIT binary patch literal 4363 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 FV1j_&b!Pwo literal 4307 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 BNtgft diff --git a/game/modules/tome/data/gfx/talents/discontinuity.png b/game/modules/tome/data/gfx/talents/discontinuity.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb4e35106a124e7b35d40018dd7bef4d8d37e0e GIT binary patch literal 6684 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/echoes_from_the_past.png b/game/modules/tome/data/gfx/talents/echoes_from_the_past.png index 9b013bf3c8fc01fd3fd40f6bcb2d1e56fd2273ee..1370f0481a851736ab4e959263113504aee5ca0d 100644 GIT binary patch delta 4101 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 D{do$6 delta 4332 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 a0RIcXd1=AvGQ~sy0000<MNUMnLSTZN?^|yG diff --git a/game/modules/tome/data/gfx/talents/empower.png b/game/modules/tome/data/gfx/talents/empower.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2f4c042119607d0c128f4578a545407a6fd7e0 GIT binary patch literal 5318 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 Yf8W{8EZL(WK>z>%07*qoM6N<$f=#ebR{#J2 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/energy_absorption.png b/game/modules/tome/data/gfx/talents/energy_absorption.png index e196a0475a05d6efe9bf247891cab2e862e7f7cd..aaea4e17c21152f433d3f1bffaeedbb38883e14b 100644 GIT binary patch delta 4373 zcmV+w5$f*ND4-&c85#xv0063Kaozv`00v@9M??V90K)(q6Z&?ukuDy8-Uk*CG8n;# zZ2JHJ5Uoi>K~#9!<y&`nR8`vlom=PLnaL!iAU%`-3K)Ti2nkJH6x>B=3c|XdG(n28 z&xgGrqN0m_pdueCg03{%3Rn<S5Tz*Xvr(j%BtSAXQ*Jru>>o3eOd_J|8VKK>=efBv zbI(2Jec$tY>p39+IR1lwn}GlDCe`)?*Y)iX=+iS#sR&!)=`&Yl{hD{i-qzEX*DBNT z!=BREtFLX!xS$bW+mw&EIZwOuj*eNn?uh=1SIij?6)D4pw9>LN9m0i<0Q=$l`Y=j4 z!r>U6n?0an)cEDv*<P43u}_5BX1cD+Sp3EgTJ!mpS2Xut)w?Bs(%de!q{L?|d;1%y zq{Nr@TL~n!X$0r|?S`^J16pT^A_1iwiXz~l$2J$we`!O*GxaYjY~x+Ie26C;F~m<d z9QXct^wN6CXE`~ZijUqK#Tz$J+@{4U-*M^+R)4hr<j7IW(*ds5Apr={VCe%&s3Io5 zviMtH@18Bh=FOacX|g2Xll8~^GiI$9ckekt00@m6W!ZO4>W*87w@Zr|Hev=b@;W@t zIA<CFWMrgO{ILBF2c=Y!WdW4RVa5z+>THLOR0N8yo~Hwl>x2M$^=Ru|w)lp6sv@FZ z<0pLpcYnTid_~LV&UD5ARTZJg3OEtCZ5bpMvq1<@5$2(P%Zuho!C<&jRX+P@d|6&g zcb1|k=AVWx@sAtTMZ2bVQ+G9S3&4ygHwRvPX``o37(usNbpsrN=%Aca7w1eWy7~pr zBad(LnU)YG074Z}RD{BWQU+C3!}DI+6={?Iw35nvPPV5!zkNoQC=!gDw9>z2>%pAt zEd3|8fiYlz>f|eVo$&(u_n!)if&jw^i|sFI984l^!7E>6w7BF+X~50zl`Dz>Ng|js z?K6LN(;4#2Ss&{Fs_Aj}Zn=tKQaBu%_3p}V>H)xGvo>(IOW^<@iUg<2Xqg}oWM#_f zfa0$c0@%H`B+VaW5z}N?{`yU-rm3Myy(6Oix5s;bs;0?6sbDT!u~i13oM{}*AyUo( z&PgQcwYF?MkkPUG%Yo<Se;vGi^2h$6BbREjEP!*s<x-To;s)hg$Gja__0~-~0N2rd z)9A)8kNOy;tgu_NblbK>RS_{};zt1h**`bPo_*z_BoR;=^W-+m_8vZRx*h-=JXo4O zYj!Dr0AT9mo_^D$kR-vbsHh-yCJ@@RWq;O)+urjlicC$z5W94)pV75T!%RvoQP&;x zulIdg@{d(Jv(Glhj-5x8m_Z_jL9zU`VF~~v^?9R)8KJwU7CJcxR=l&<4?wFkaX=-^ zBq=cFzq+z61&tsG!1kRb%FBzsLL?HabY(4nn_qOguv;V9v>5$x&5x=-P~l2G>vwIt zvc(Jjlw}w;Y${aDTd>V4DfLA<<~MPU9M&PtFiZge6h)$&wiX8`PF*D(KVI&xGXnU9 zW_<AOm|&NJtZc)eAcR2I6~18MH~wk&zvoG!bo`j2(#Id^aZxy8CF}^m6O`+^48|CL zVzIb$aJe)#cH-*t6>o3P{-w!90FRtc?$@jyAMDUBEsJwN)3ksji6jy+q{}YN)|^gP z*@le=oB*(G$5Gdk75hr>7<ai&DI<y^;Y4vHy!5T_L;Y@e%`hzI@uF@GGCAikO`F_s zeQW2IuS>m0j(W8^n+~^c*U(qcF}<FDBoWMgar>!^hSOd38a>L^Z#)rXjN{IUU9$iL zlKqDbX(yVdC8(-|(GymlE-0MqoIZ0+X8&t1G4B8G{5;00LgZ-7#v2O<DFCcGD}Ww_ zEhWRWVB2EsiKo|PClINP8vhQ{of4>Rk}d_g$?n#aiQP2Lfq$$%P`dK{?<(Pcef#JF zr)jb?*dFd0aD9hpofQCMj0=Q7l&aIAsxm-0h`?b}N&uiq;~Ya(sY_Kw%$~EchJhpO zOyg6^(f_*E<~bLDqA0OZf4Rap|M@|IrLWy|dd4IDLj|3412qlqnsxgPO_xAKTY2&M zA*TR@WLYg=vUso-i`kH5$=tDj^OytxO`B*Yqa3m<V9(x@)m-7T&wWWXhg>Z$U`(L^ zkd^64JC}hFpE9v$+4KjB(qo2^k>s{lPvDN*+vCvTu($UgUR6V(u#<D((4mvrAAWr7 zbnl)GvIh>xtv_=3{a}nE60smj1ou6(F$^FB0D>VV3nIY5;dVRaP$*b`Iq9bx_SPFY z=Kb<}|JqH~oSL-w^{>q<3L3_G^=NvL5sQTYWS$c@_&>96I5~W1>-v;(I5gReMyVtS zOaOS?Z-GOS1*28l7cIX(l=Sm_!TcfRw+ze6ibgCDLLf_u{qT%0%AcLHKD!E~Vny)u zy?P{U3U^KWq+;oc?XI(bkYb%Y{D5g$rgQF#J3>!Av(8=X0_fedZTVYE2V`0n!}eX} z{@cc`^6&e8bZ#_i$Mrcm839h6GRix2e6HH6=(-;6-mR%&7#8__<3S1F)rj_ZoUxr- zZ>O3nI2nhr;_bcGLyxZIp-}WE%su*Gzp_!cw$IWv8Erc~?>l*aGLTX0HelAwt7Ow+ zC@zTv`wv*?PES|rgEJ7qA&>+B1b_%YlO~SLqQX31>idyM#JP6eo_e2eJdjb7`S$G^ z1&$w_DrlPEga8Nx>P>^&xPJWZPG@dzc53!#PJggp*|^b{WyM3|eP?C<ce4SCBKzC6 z%}6&46Zbr@o&gYl_wGF*217ims?g%g&!H*;FDtX6X&zA@G_bX_@rxgS&G6Q`HMa=i zNK^p?d+rO{qlzNY31d6CY}=MT`Cz27`h!E!`Z<nJQMX(VK(j2<M(N3LXxyYXo#!MO zYSFyD!l(^Z74h}<W63d<D+=cuC8tbpTABnvi4GmUx?;nB#)CElAh&tuuTs4pMR}I0 zz^!Q_uI%xu|B0tQaZi72P5N~MmW5PRfaVbO!2|QO!fs7+IH#(n$@p;Xk@AAV7u26i zv43|2RD>fj5TY~A;dYCbF9Gi2;$V7y$GHGd3Lpo7Hevi_WdZ<j+i21xD<DY%J9MZ_ z0@xW1RqNJ&?sCg!x<hrAA3kzAt13%8<kU2cTUMAHJQ!ld#i6ooJBsz!mh7-gOZ}PW zv>tH$xYs2}k`aqV)tiUp<Eh!}Yj(LPagX)t)zo8KHhT4Hn7wz;ZQvY`WeK}?2g;s! zVzabt`3_eqT|fR9%2reYAez~<Y1YZ3N6YF1K>nqF%_?F>w4R~}7&Bp|Z}*-PIp?)3 z{>p;EzCZTQ&2Z?7(YD<Sc5!jwC;GQ^$xZ&geH*1$n>mF7Q6xBeBo^vkv<SgqIEe`3 zRLL}(fI2A?%{g<ng^3`@cTMW7*fvvQF$9~pdD@u>qtBlJoK7ux<iI4Ib1KQIY(4bw z=aFT9%YRV3UV|4D<QQ}2T+7<Dc4jhOeezT)IO2CvB(b&^FEC0<LLLCf&u`-2v~i>> z5;i2x<Gz$}KoS+&weXdS{Rd8Zek<L-YarCVT|@7NPe*t-s3?elrb!S*z%VH+o5h_0 zsmXmJ8cP022*S1`qfz5$VOf?M-xzWGo_gYc52UE5nFKD-wd)Sz?)%nAfk4>#@6i0a z7evz1^w7NL|40W9YT>e}C7Bij5^(?_)frC~HAt!e0B{!neb+AksXkXN%t0--TC50> z*p$gVLXSS$Ih!RSVIiTVJXy*~)d9{SiUO$3!FgN=vMiwg_3xhCu;D=c+7du5ro-HS zF?L+OgE2r9fD^?L-{eW32PREgA2JLQBSIA_2;unV+hFX^BR`2eHgk*5vWW=+uq=jW zW?wB|kO*kgrh$Lg&JpP`gJSdM(}8~dUUwxe^|0ajkyjS>(J75XL)Rqe>b#&~hSTEd ztl~d$VuJ2)2#TgjXxZZB@)O10%nJ&C0V7AYqp=u;riqw5c@0wCROimwVahm&01$B4 zl;W~Z*>+W-#7uwYnOznk9MPza5hE^DE;tqF-MfWC1i-Qx`t)g@EMU+vV=phcb84r| zWO9^*`Uf8l*4wwQUy_tTkDiU=){_H$uWe>sXez)g^T9|s5_SQAq6+YO5y+^2Cn`iR zHO6>6Gfc7mJh5Y3c8XN!P9g}PI^zJRfFL>o9?#>R+7Li3ZH?(64x^G_%Vuz=aSx*u z;7RCL#RNR@*@#iN+{DE>z!<4qB3<Ji0KQ~(sLrcEb{6N1k}7B=++gZ=&H<LVCj+3W zC@Cd6;sE0m4u?m-U~B*ph{-vB2T4&bp7L3DNC*Yt-}aR+viAqSR}>r(SrIA)b4Ef1 zPA(V~@cW5d6yqx_q(plTO~Rr@`vUjgy`Gns2hx-B0AO|LlIvTz=vp*ure`pkk{bXZ zAc#bQXDx2lDFm2iSR`;5sWHC8p&3PmE4*VzzvoF|KH222zB-)I{*w8B8E^dkaIq*< z8HYq(5U362Yts!XKkPYef&*ZH!y%zh@8#jGTaHwo`jTWV(6C`zN&Wh1rvZeMzu!LY zod#>x6bF%FAGU2Tt+hz7)(%K)SbvO;7||LWz*}z~IQ8Y12XeZ1Z&^O!j?1L$`?nHZ zZtk&d?jeLgk|e%wU%<P6c+q#l?Ae=zL4%emq0l`RGff#B`0TSI?1Br0i;7y7zrX6n zOi>bW^RTrCX3Z+hY1T}2TZ!!O=ZJB+R62LgHz9YLBRufNW{p%uLZ{BJ`}giENx#6d zLD17D?}-t?)>RcG$v8<U9zj(_sAeqy03<<#WigbMnf^8xKbKyATL`Gl%~A1@>0dHY z;KVd|HKWF9{8$^~@q04=uZ#&;JUo^}f@ybuYF?oAfOrw~(1EEW%}vxK><Qs#R)M69 z67D{}cNq0ue#N{C`n0&C?{$BV>bk;`tIIh7XJ@#0{7PDXSyHU4u30SBGJUmwK49Oz zQ|S*pxXDZ6$OdPBRiQAiSqn_4f+9;8IQZ>AFc?m&ZTf2QoFEBz?$pF8C}<$IYE=&c zQNU<CG~m2?HH@LUB6_`6G%qhh_4%54ckDc(;a@!ZcHV4&%cTb=j_+y?9(b|T_TmhW zWm?3xY23I8Rmxs7=K)X23KMpKAYKzx6oviYw_e|prQgec3trwL8iwJla{^EmH8OAR zjpoq7tvum~K~fcrAigzTwLhNnIhE}ip$<<qiivE}sjK$V<-2_ormS>ZmgT4u0_fbS zY4H7bZqX^TrD~;blER~qSb0>P5lH2q6M!V{sT(9n@d!vMoQRTQ54w4|_lr&YbIz*~ z?A$TezjoDst!`>lDK*ari(i$5GXM!|&k`%jIElvsiT4;t+z2uPFamH=X)jU@WIQ=C zrIl|E&F<H?ed&2afGA1P<NKzGl-f#_k4M#M5b{$ICyOFyjD)Ll-|8#QQ&oagc?=#u zP1dQ~|N4&|FH1k?2zYvCf0I&MNv+((S3kaTELrh?VO6N$DgAzOC5K@(5L6i<lFHwb zLNN>rZ!H=AZ>jNb6aWeR<(7QcnN~5*L;}VjmCRQPBjrj$yOLp6y;K(e9v`b(sGQPr zo9dn(g>3@oQ~-l-%;zz~ICGSin$%S4J}QNgS_5P$_bN0bqQRsc;MMmHYc|VbxO3u_ z^qdB8Lf7<Z#Tfeq)FlZ|_&~yve&Eci&r|fDfSi@-n(gXdO<e#?{E8znzl#8_>)VNX z(v^Qr>M2I<7yJBDznbMISyZm<+Qz?m%U-3{y+G<Y{r?ZGF8ss9d2Rm$aOVS=M;l)A P00000NkvXXu0mjf#^P;) literal 5206 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 QtN;K207*qoM6N<$f=4*S{r~^~ diff --git a/game/modules/tome/data/gfx/talents/energy_decomposition.png b/game/modules/tome/data/gfx/talents/energy_decomposition.png index ac7fd54da287366c2a144d54059a701e643dab03..b480066e721148758d7c336b47f363da2662ed94 100644 GIT binary patch literal 6420 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 literal 3420 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 diff --git a/game/modules/tome/data/gfx/talents/entropy.png b/game/modules/tome/data/gfx/talents/entropy.png new file mode 100644 index 0000000000000000000000000000000000000000..af9afe0b78ff555944d648432ed5ab1a3aa50c1d GIT binary patch literal 5205 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 P00000NkvXXu0mjfm?Y}h literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/extension.png b/game/modules/tome/data/gfx/talents/extension.png new file mode 100644 index 0000000000000000000000000000000000000000..050833e330fb249bebe115b491733f6a21e882b0 GIT binary patch literal 3820 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/fateweaver.png b/game/modules/tome/data/gfx/talents/fateweaver.png index 3a0ae723fc5b3a8af99faf4c50b4cb6c4d1c471a..c1cfbed29aecde24d08b39080affdf321e8a7151 100644 GIT binary patch delta 3787 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 BRB`|S delta 3460 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 diff --git a/game/modules/tome/data/gfx/talents/fractured_space.png b/game/modules/tome/data/gfx/talents/fractured_space.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5338e75a13c3d1109b716f62c2035d221781c7 GIT binary patch literal 9378 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/gravity_locus.png b/game/modules/tome/data/gfx/talents/gravity_locus.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed4b10b269de270ef08a98e8f763a868ec5e4a1 GIT binary patch literal 4792 zcmV;p5=ZTcP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-Uk~LIT@fB^``&;5=BWw zK~#9!?VD+krB!*yf9ITcyKCR>zP)$P-pmZlAj^OfL<B@M8Y?1{YfRKwDYZ;0RH@~M zL`_9YV@zq#N=i$kW+_XfV#Gw0B4$t+KtKj&h8bq<o|#_n?YrOmF6W$lxVY0pPeV@? z>Qi;U-E;1F{_lDJ&;MDj04%@7CiyM5-vO}JKadZ^s@GmTrk?u%T(Q9+<*p8dn=bO6 z`v6!Aw_KAt>vdOcb}8oMa~}Yy1lOJKG0}T=*ZF-nq^Weoa~}ZL5%gvh|MbTEir3uw zx;)KT(1?BmNHF6Inz6tl_}4$}ecJE8>zWMfiVi&)#g*s%25`W&+XJR5np{e;VZh<b zZ||co`|Cd&xPrgDA<Onrm+6XOzG)Fskn+~{HE>q^BwfL9UT~yjR=j!I6KolB+5JSw z#DGhbK*pDR;&r{u)ighuikYcswv9O4cv%`x31V%TuWH8n6t$*d*9MQf4}~kgah@Pd zEQxuR0cggS9U~6cPP%+<&&m$;=hx@ZfRF-XB}fnoCI%$^dBx84KC@L#lvtKpmTVwM zd6Gf~YHfIMD(0Op$*vfHD>pjqnsE5k?#|l00^fQp=2bgA{`(zyE*w2Gc2{lnxqfHB zQX4XXBt{TwI9AeV3!bMaw=KO{#dy)B+_cm?mZi2Owt~63ArnZX6ujr<XC~0`g5tAp z$nm#-kU1;o0mRuRL&dD*yYK9w8N;z9!&e{du;*w@x!JvQ!v)3fUzp<cS7yM%<Fg6v z(DJ+uKAqSSCYF>Z(H0(^ir75lkQkU<(hTGk2FqxVBGwjRA#ma3VnV5@`Rbk~51)vM zwPm<Rars7<t0z6K+Tzd&;ay*;^5|*3wg3RU|7962o^V-LbchWsHVwtRL!?1lkdCAo zT0B?Mjw}xzkGN>Pi=!k~Ko~=#qnRpcW-AGoZVV`-1+Cc9mytM1P_Aq8DS<>Vy%4c! z(7|`0*|C)Cnu$J%v=${GaA3Nmx$&Qu&P^2fmwP*80!bsX2qnp<71fTV8N))u(vB_K z3g&8>W^Cz6D`u*eQp>VfxA>l<)`6Ky!v5)qAdq;TLMcfn7HA{r$to;@a?{{Aio^&) zEog+6d`2RrWU*;!#gJIR=YP~XcVTe0sxd;42^1EHwBYcZ#`h$JjAFiKI8{lw`|%E8 z0>ga{g9V2$fzFeki6NIg2Rl4)xWlozgpRgUTb6~orrb8PqON0iJ=Uh$HdI4PrELj( zf#*tE2^4Y)Atd#V<&J&fxdQ-T&yk1(FbIT%^T$1EZA&e*WK)Vp2WoB0j}CT0IJu-L zHw}f1;?Qi&BgaA>n+k~%%ia?ql_r#%n#jO`lM!<@&20}fI5Zn`a!C_wK_;aLe1}rQ zGE*_MBFnK-!l4Dd;;^^sF!-x>x@xGlEmDD$f@W-K#g<ajkn$8G{Vp5ZhQIq}nIm&C zJ2wPu8u6KL8tyyT=8lINKilh@dulkYKuN*+qD!LT3wKu8d%VNjt}n20*d?2mSh^fj zEGQfS^_FJCkV~zhSL?>=0q|Ub1&%Lj`g0CK3XUzrY@hI%uNhLFWT3|dVE4WjyZ5yi zFS@itL#h7j2madKRa{4q2?UkK&mU*A(+!X91mdJCt|XRrY|vJ)P&4%S;@ktUb;P9+ z!uq01q@fWTJXg}}Sf&<Z0$-B+N_;uF7@u*^II&b3zq}|DNc!^*<+>r40%HZWmS%b} zCJZfuJ(7|Glfy1g%*N-212zsgtnYW|#FoXT;pjrbfl~>NBM5xSjtwc6T84WLw0Nd= z&*N><z9N%WbmA_T?3<3*IOKBW_7s~2UABz4y!(dSs`gjF2hV1~a6$2fxAzkp!Bk08 zX&E*Qx%i&s*g}jpf=<$9^v{2P=@|pCSWD>7JB;?Z<kJ#I3UVn$wP9GO8Zy41(Kd_} z6jx6A-1%4sa~8_xXF}-d6ww8v4ma*f^U|FuVhi;S%+?KkIfoB@t;|d%VXWUFmr~4C z5)RKiyUBcC&SC4Ai=zam7Gpd|^5Hl1;R^7S;P6by`d-PAxr9fiLhe2oad;s)J0-Yv zP;vdF!>ga?v)DFBCCLPe!5&3q1)T(hl7t#+PXdtkB~l4K`pq(jPM?Dc1~5@{`Kz1z zNfHazGMtyBT<{eLYq8q0P)&#vL&^cGEg9Ex=YfdN-xpG8+cQhyo|NE2FVFD8Ntce1 zw3BXZH$qU0V6kBde92<NFxKx98aP$f-13FF6<xoHL5~+-(t{L&dMhE;pd{SCzs~8! zrzf(vTvuS@pi8TxnH+IxwGCsvl6)YTT}r4nHJgiy-as&2idkxC{`&SNGgWhTxxkh| zhj(9-V#k=rV%suYaEXki84FHVHA+c(vks0cXhra)|Eu!-Ux@EdW!GQU!<O+BQ*$AO zoP(4SSAn(`3{;y5x9u)3yMFtG&)Z(w%V197DNEo$7#SREu@-VZC~NVRWx5pejR)KO z=R@J@qQK$#g!g@;!Awolj-cK#fS}egl<J1wjKuQ<iGeV-T(r?Yqw{aLzQ{<?=g8>} z1AQKWuh=vmFwol-GseO|!Q~adw|wdByfGgs;Na<ysfC121dbBaI+l7zGgs3bU5Kf5 z44=HSc}C|~6b3u7<xjp)rQ9@FV6JKyDmYxY-lrXbHWncSN(qjhAr5aC_VIm1t*II4 z^+*SbX4|k-OL*Ww1K(F@Ynd4KIe$Z%O{2k6?z3+yB%hWH^f=5^5?YaAzN$H~nDFRy zjHd*}yy6pgG`Rm*{Oss}#901qPmAfY=0rK+p%Wd1urx!<j}M1*BEzYrnD0DLUv`fd z?8pO_{(^&&g86bxZ^7mGOh_T`k`5#bl?1J!TuZq8{OnWT%F`kD9c<$%$<|Sy11BR= zo?u<kVWQt5a0SM~T?bZ{9IaRgJ#;)`q@dWf(c_Z!0ZK~7i;9aj`P{j;#RvX<fiPO0 z0sHfcl&5(7c$-dWXtWJcY|*w$MA@`MPu5|2K4f|!Wa~t*>|UR{V~H=`wS+d7of~|r zO+!8<DdrT868zUg?X{7@51)v*VB8~{f%^_eeCOd74<3Dbq<vSg_ehJ8qQ|anSxR+H zN?Ybi5yrw&y{jTKfx>eI&)=S7wj2?7g3dCa-hZgg{fF9Y8glugtMg2bxb&n1N?1-V z>9qkMpOU0}fu{t!HV3R9^w|A)hac{5b7XFL4G<-kE#m>Rr5H=Z<U|@PCHs#w5EfE7 zhxt;(Y&qiM$t;~vvwpxMjF-PrFE}s7RXfs*791veCF03oR&5xHS-Ca<Y$__UzN8*O zxoH^8JG|o343}>Wc>H9{t+$t#?GFz3x?lwc%gkcP?w{0{81|{u62=F8iUpUUK9^#_ zq0!bHobF(k@&ATPvh12nv2EC;+14yIH1mmNte{AY<@_=C*-wVv`?4IxocdY4Kjp*Y zr$cmNX|^r9Hm7*gHHBr@-}O+HY+7(=s?Bhp%Zo4WVX)WZ`4{9E=<7;cM+x>GZc@l7 z?%ns)ggRbydBL_c!v%#AmPlKwEyGY=lJ=pKST5V>apk1<>;dqy9Rb&F_YeZCwJg>( z$LC@kB{0Bvzl%1O)EV;f`}Q}OUrNZN6f>oWdNX0H-=)~&5Jv`UEK0(869J2rm=m*4 z%`KB-9=SkJNGpsM4CEawaCAPQ(J_qmI%EUEM_<#!y1u7x$Ubd0_?9bEy!zsRcG49* z`%fqIW)y|2Ltjo&YZ<C7&0<|MSJCV}zI<K&&~%%=oWm6t<S5q@HjMbVj$p17aqM)+ zc@qH=_|kV5(aUJ+Y@qNQffVqQqaA!#uw~GtFDuD-0ztP@{KRa+8!r#oKa)JA1b$io z#tM>8-jrqQu)|<pQ4cM>X~kH-gQL1&C<&bidUM@^=QsA$Svo^`${0Ac7%{gLbJ_MR zCuT#^p2T;$MUHzOt#ily)n%Orn6D<h>6!vZXJRhj5-`!Hc<^Y4IJPX-G_A;z_avh| z3at$<+TyaYU-HAl@yhxFTZ)puxH{mfEiUy)Ae3aGX-Nl?lrL!|g88~3my&c0c#h(9 zP4nQ<kT2d<J*%wlr&Z)yOVbWlUe#Pb;PTNo58zAi9WdIUgvAwbYBAwdIU()B&QV1a z8Cszwjt$@18}jwN5wTtdfc~^#Brln%8=?fHgub+7(}2T{afcV4=P^`pNsPb<L8WCm zvY4<~(|r8f71j;7_^xEW5>suhvP`>-<x-O2UI)*S9G{EWFzE7;*Y|T`A!ejU(wi0> zosAgDEB2j=_}-%(9z7MaQ2+Tkr08b4OD((l&d^PlrTOC*W_WliMo2*+Em>;A=1~_% zN=}p#d`~g881w1dOJ|JbE45c%o@e{G$3V`ZCnd-Pa9}zjj0`W@=Hn^BQX?UWE${it z60_Bn3!zoD#@6*a{Mj{GHV(NcM{@5IArnQ1@uEv)1dbz!6L{cAhg-j0dPdG~8~1tH zrCGL)dGrJlS9M!sVPxpbNUXN>rX*5mUh($}XYI_YilS4cgeT@=`qGlT4=>v4GurDg zU(qz%8dpK*$pb!9yJ(Zo<giB}Et#(*JaQ}~9|(r>3Qs{_wp$JQ%=a6s8hKsy34d^) zLpw4EAkmh`rb5>BEBZ5vskxYPJt3D8`0g{C@W}cS*MYsqI`roxJ11N!4a3wz%+x}H z)s}Xo`QHPbRqem(zQCy^L!;e&*YbhnlJy=-P1DWKD+!luP7!N<#sPo$f*e~$e1>}! zM`t5Gdq;&t|NNO<u`R`A=cT!5L%^}Qh_C*z#=%n|$L3<Lzc9^(6CQ~+qyvS_LKtZr z0ZLd(jc)imrvNw#`qPqARn6o`x1}v*x3RH()Fn;~hh`#NCHTN=`-x&pA*UGXaTv-w z1fJv{ZtL>HC7T1T-jQK)*uzyY(eLo?R}|R2uf-1@YZFD5o{XSUw?vU<-*m_Yqb|8X z5IBOg+Z9H}o<ji68+3>hL)rx;x-~tWST+wjPxcNqQws^7f5#AkCul{Mdk%GIhlaqD z?AjDCIqLDm>4>*p*MksHX=-{h5@QU5ImOM-&rxk?;zToBw#130FYR#2I*%|h=)|HN zNf;S66djJPpbY+u8zVopn=cKxc%4gMR-r^UoOrHyQl>unWCFoJPI2!O9k!0Tq&&%J zuR}g1!CErDq|!9J^3p7&nkMH9d<8lIS9Mk2j&YB6Y$;|HDF<?Xw~3nd1%cE3UQZyX zcMK1nh|e7fzGSP{Jq(t)O2X0EggCY+Veyp3b1V)pSBcp=>|heh`aVTZN|5s)P7GH} z`dqm+MYWkQ(d*FaXetfOKu&VH6w{v(WIVyTg2Y$QpOJX7tEtO%jnNi~<wPmrwU_$m zjssqGp-*2*Ag!g*w(LF_@yN-TR%99KQCu<Uv2&fzSV1yX)@&K+4pJxqV9^q44Z~DR zvvZwG5*zRZi#1K)3PitR(||+9gXGDcL9J!@`0X|BJshG9^k*fz*1No9o5xU2;z_{` z+db|$aCXg^RSBU--(R2+3O;sci`(`-b=taf+~rem?B#gLFx(^YJ;|vhO))3&96_mJ zumV!9AW0zQ3mP3my=}VVa&C7VCgniAZFuu%mlssSdC3P}p62p(ic3FUU0VQdy)n(f zMZ>38Fpl=p9X@ZpD#u`6Af@EwlBOA2CWjr$O-r?7=u34S9n5#r+;-R<lQ~sR819j* z>s7qwGbO6+r_U{}opgE8X2l1;+gTd`&L2{A63fxEm=^u}oAX>a;gLy6+Oee-LLn=N z6U)i6;fcAJOE&oQXCzX>@r8tete_oRvYzC}$3x!#_1emtsOfHX@D~%FXN?2)&z=1! z%5+(C#U@B1gRdZ+mFzhZ@!@aRC^df$<oTm6fAi`*!};#(F_@KPe9QM9JG<eha?75Z zD6mpHx{%;0C^a;`gn#^Aom;+A`6cH8_MeWq=`$rBor)RCN>YyH$ZX7knRrdlx8?wx zT++B$2GW9${ZE6hJaFcw#Vud0a(q4_jx8fO$!yI$w*jcOEUi#;*W)2ye|Tl&^wuxe zP-vQ=S?lASi~kH+Qp)m?J61j~WP$g7qeU^rb02`LFZhoKLc-+i$mvJNV&Z7+Z@^Ch zU$f84w>egc)vdj5(y_x?Y1jCSYYRZm7td(@Xnt)0Sd|q1O|swpclfs*fd2=oOZU9Q S?(^0F0000<MNUMnLSTZWLPJCV literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/gravity_spike.png b/game/modules/tome/data/gfx/talents/gravity_spike.png index a986352e653a5b88e1058e71e471bde61867d3d4..8a6e7b09c4f6775e3db14ebe6477b48eef8bd418 100644 GIT binary patch delta 3462 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 literal 2783 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 diff --git a/game/modules/tome/data/gfx/talents/gravity_well.png b/game/modules/tome/data/gfx/talents/gravity_well.png index b374335def95a3798280179a3c9a5770a829f215..4dd85288e0ef465cb65692269174294077a3f634 100644 GIT binary patch literal 6773 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 X4hLCi2{$_S00000NkvXXu0mjft|G-J literal 4557 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 diff --git a/game/modules/tome/data/gfx/talents/matrix.png b/game/modules/tome/data/gfx/talents/matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..91200083eace7401c16943a80b30b9afaac7efaf GIT binary patch literal 6320 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/paradox_mastery.png b/game/modules/tome/data/gfx/talents/paradox_mastery.png deleted file mode 100644 index b2da719851cfd4f744979047dd045ede6b8d2748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3265 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 diff --git a/game/modules/tome/data/gfx/talents/phase_pulse.png b/game/modules/tome/data/gfx/talents/phase_pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..0085e5161bdfadff2a626634e166e143b39aec69 GIT binary patch literal 5108 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 W-{?hle3_X50000<MNUMnLSTXnHuBp5 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/phase_shift.png b/game/modules/tome/data/gfx/talents/phase_shift.png index 8e5480bdf4cc6faffcc6ba34dadbeaec3efccf70..2cc474bb2d431d825ea80898644f06efc95d11d0 100644 GIT binary patch literal 4607 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 delta 3691 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 JPDHLkV1gcZ;{*Tz diff --git a/game/modules/tome/data/gfx/talents/polarity_shift.png b/game/modules/tome/data/gfx/talents/polarity_shift.png new file mode 100644 index 0000000000000000000000000000000000000000..51a9c0583c651c8b97bbc9b9175c3c67ae32dcc7 GIT binary patch literal 5542 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/quicken.png b/game/modules/tome/data/gfx/talents/quicken.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac9df4f244bee41c6a7785f21734b1f648084f3 GIT binary patch literal 4801 zcmV;y5<cyTP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0EGZ_ z0GV2DZ}9*C010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U$Q{E(r*4Fd+Z{5>81( zK~#9!<(p@i6jj#8fA>~(nw}X6N)TN|1TleNK*FjENKh0|f{2Ks=<4%=?h1l}y5Nht zrZp^xBCCR7ksyL13L*&XBKU|(P+1i)k+U$NyXw9lZl&(7o*8CEKfLukMF*;@?)jf{ z{wLiL5$Y>`fkTFV7k=v`cK&Om|G6k(=ls?%{qG85ng1_D=C!7g`+P%IzV2!rwsZcL zhf=?c;*RK%{LNwdjRA0v3tM$%?Cno;Uh@k=&HqRoMu@cHm*RjhM8i0s<w>X0`;tK< z;|cG(z593b&$*NMe%m)0*H**<+5R8K13?Zj@~HZV0gx?x&1h||y6h&7t9K&FgdGab zhRti4K5sIIN)G;_02me6`4I;|BI$m?HJo#1Tg?HEP!+NNhb!OZ-4ACSHURmez^@8` z3xY(^`qcJxYu`7M1gii5Ksudb;nJ7*bp1!w3WHTK|04!KquNdAciD{;C5v;TKotRS zkDYtA@z#QgY~ArgwE_6mIG~7P`d&JiMkh2uiabfsVE_<xfpr@`Va7WzVyTk600cp( ziuwPd0Ca2Bhc+$S0|F_*5DJAtpjV_kfd$F9#nM#^_~M(->DO%#M;%qeO=Z060SXhg z_enYbF8=6E-v8IzRpJ5DP)8nsb5CkZ&(7B%rO>Ms8g=1VfIxV{3k3h!w4ON&CULOj zXU`H^wQNVvPFEu`SWHlqu(FqnG%d=?N_qY57uopTC%>Hq9A9)I19}doW^t_m>>2?> zDE(Ey4fY+_!}NL2vuVpWm;v*bD3Dt7Jv#TLP0NcM$b{np4yxdNFHlI+X7Aqbm^ynB zJ9lsY^#DjvK>tgw=hVh$AUx9qp%hAJ^B2xy5nx$q-dr$)<?ELabFMZ~nH&)C{~AR# zx#o%+IJ0p>WQO>G%S~I~A1H_^K3=neX>Y%RWu-k3jtBtV&h1XecAY^9t=*i}2~B>& z(X4=V8`dyo&V-zMMT0d#76H~hx*p^He2>EkKFV6V0>iXWK-5s45+bJJ&4si0V8y}; zEkFi7+cub05&Y~E&!K<!0hmTaKTs$T3ZeAlgLoK**1o<Dl8M~=nW#!~c8TGEqRn0g z>P{(r;e^mtppc55oqE#g_nmlY<_mnid3|nv5&}kr0Msw2&y9U<q~6i>w5C;9=+Y~Y zrlTr_69P3VqB`Z4zzd^7KrCu`R*+WSB}l2cMgZ6XX();dlMK1`fB5$MZ<#!OG9@K@ zDtuI40Q&!-AHP4hZ6E}JkPg}o>e>n*ZKo+MEhAZwL@DL)fI=ydqAJY<kpZdz3`2t$ zk6MnndKFu?ZKv)rbr67M3!<j-B937w9Z8g;@d*uiaQOc+?}NF#vt)i=F31bO=}nsY zCL?qp6Rt!`p(F?;Sh8v<uP&N~KylgmmvCA8uG&PER$nSDC_{JzSk>cDnWn&km{!52 zA2;*tYm?cwdpFISp279K2T~&$^Fyc7?uQq0HGrozZo+#@=jWJzr2t4nVMsrMdoPZ& zfAif&o_*~Fc3XQqE1A1u9t&11;>Iic)AF?Dn#3IKlp%;z0feXtu?QrhikN9rT7Hm8 z)26WIt95$864q^4%dm07xx9TRdUo#S*@xi}aIi%rDzQMb!h%LB&-axO2&MS>;6a|9 zHifl6eUWj!D_n{aCd_=E1`Cg4$bdmaO%46wT7VRaSqtX!_6P4})S0oUA3fgs;9VB} z>jMV$>QAd?Ej%+<LT3x6p)m3itz8KKQXvfut@eGz$Ll`h=~<I=t_{=dkNbXL<lo0~ z(V4A@6GKrN@(`7wc`wO2_E>JdXBZ;uH$mZDk}NAP=b2YuVE%{ibN`?2KnRz2lp}+k zSNIBBVul1mxWuAwwspt0!zT2!m1gS0f8~k}T>`$DC%deFERT#BMV~I0P@XE!D1n1j zV6L^mmK|F$r1I9Ch}lF;?J}X7m(E$C1xVWoXa0i@JEA!utyh<>bZg(9XI`Dc>UC?f zG#h2;fc~6+R&$hsEjxA)jo3NmZzYivDKvM11_4KLE&&ELUpWT|g_I(oF_D*0QXvEv zaWcJV)b@Nc8ILjih8x)Q<ByD=@&a3SZRg6)o$1rHD}@Qau`cuU2GX`q$kD8NUr2>v zDvtwQAi{(XT15pGKp-0<gVC#^jo^DXnz*5<(ecM}eeXUjS-G6PmvkXwD5Rk?O9dpN zR^EO>=q$i_pdp+b1?8vYGF<aj06>SqV7{Nv0xAq|LXk=fVo?Psw(Z)@<NtVxAGU4; zV8y4a8PuyMy*sz_s>k4SY)g3B%m|lJ6}o2AbaDb|gAhoRr}0GGFRx2Vjmj;+Gesxa zuZROo@^@)t5d~O0^V$p+tXQEJ6L|8Av)<s%g$ud+=Kh?~<Ydomr4eRR`PW;RuyqJj zZW*QBxLSFD;h2x`dNB&iPE})EW%J&$<xHG0qrzdu-u(v{{lo;$Y;rPvx^~Qazrwhc zhqKCkg#}7TDedY_hFlJi!gU8hpROI~+Ol<(wSWE@XVBu*#!Q$o0~>{nB5v5ko!Fd+ z+C)u#0+gpDYc_n%<e4+Mb8vQtDF0Enb}b$oF+{Idx)DsfaMV=Qvj8EL*WA!VV-t^= z+;(j*uI|>62cDh67uz<6SCKVqGwP4m(&&Wa_;}6wKsn{Qg(Bf3H7>EnA{J#S1JhKP zra{LxE$P_iY{tJbi@6^x&!Z&C&;h;Z-r=0UBkYXgsWRfu?*dZk+}f)F{BpPM(MR#* zs3Cm3_A4HG?iErTaBgOB=M7iVsm-|{pgbM!gW1CS*`OVW9NO)M4Cu+#-P$v5;>)c4 z&qnXs9v#|oYyTdO`P=$lLTSEox{&dRa`-2tvlX|nm8ggV6o%nefqo7Ui=~}V1Ff1h zVb<TrFn`G+w(i`+&;dO(fhpa@FodEoZc`9o@k5rNpn?J{$mqKC7SyR-%#)*TWzB|- zyt&{#Mh@;rjpC#iWi*cnKfP93crPKU4hIN_1f>IncRH?NIKH-V^H)rtzl3*}tzyxN zPmt0^8ajoRhHi*R=Y3c>%V`bR{<96|`2{hXveJD_pEr+HYrf*2^A_o~Ic;yl@%gB! zh!~1QOd+H~7#fg7+{y@nRdxYWI2I)o5{SkuuO+r?_kJFH?iD`!@>|FA1mm82jaTL_ zV9d|~G&;T>h7=hIP1LZdmB<q=WzZFTjwnwH#=km;>GPL*q&$88hs<8MoZ*9e(WUL# z4&h}LSrMIg#G|Uhiqp)O$r&NFfZL_{+l#ZAyJ&fc+t_@+bvuLZevFIGYsQEhufnKK z0fDx%x0kG9+{8C9WC}AYJx--99+)_dX>Yy9{kIR`l!o;)0g$S~v^uW^h+r5r++KkG z?z1nyWyk}Qu(65e_)_MB7O(uA#VbE&V2^g8X>C4sJ}PNZr&gTnMm)sV-|r@E39tDX zc5L0Ti@~FwpkwRi+<V*A{&+(Au54G(nv)e4Lqd6DE+G`3t=~)vMcl~>rKr3@+<)*O z%U*qej;))Kw)Dkzmh7>p_TL7_M0jNQK*kQ~%lBJ%5{uXrC9E9nhaJm4S?_CJ3h%uk zbtH(G`m8bln&eyp(|z}RS`Z?)P?AC*ogc)al85f-#~V-G#>u~{6WXA>rQgLYp7Iwi zYIQ1Qsj{4;thg}kod_^Y<+x;K-Jx4qwtf|=(j?l<^**1Jr1S?5Qsy_?;QTM6NQ&qQ zjv*B>L(!yRU1mP{C+08vj4|V9QdVA0*9%T(?2z6RCZiy2udc7?Naoocg5$CXAd%Kh z)q+g+kC?hRt71PudGS<Hd4n;i{a`pX99MGlhf6PLPSX?X@%$SLcyw4lOjGy^7m8Rk z(_DiKcAF$tT86W?P#Ler;aWg2EJ;Iy;Brc}J3@xjTM&wp(iHbRHIs!aK1T{g+tnL* zcvx@#aNcQP=?9x4lfjFUxiLK0DYDX%(zJk}wjFB_A;pjju2PjXM1<=G0wom5ghe8x z@X6kdVcFTODn&GAGjZBto|?J<D=jdbC;xn?jG^OR=Cnq~^7x3WXi&d4NKt9{$_Aru zt#T+x2Zz+29PuodDJ_##ZHTz#sv;4$v9Ucjhz2^ew!`kh?_5eKjN7bU`z3cgI*kJd zOPvKPCmQ&P()w?HqRUN>)AQn%Tzh$&(2_X}VDCH2_G7s4>!HeklzLLDyfat}#A3Er zT1u(t+vOZuHES3?(1_SM{&@25>TpWKy4-Z%OP=t-qgHW>8bxUe9nBRLq*=IpCHFox zl{*GrKq6+7h}n622)eLR98*K^@EuozVf&#_*kFW5fvBm&ZY-jZ(LC*}U`_2>LcL=O znfc^(%y{xTj;UD~TEqavV-cRXs}Ju!Ka|EN9Fv(>R8pP_0r8m06@xmk@b$ZB+oDna zy$VsqO}*Rk`rG%>utPJgP9u;D2o(xor6g#eu<SBSiMPWi8ntwom5SD9HDuMak-YfE zzZo-Oo*tJw$F2P?VECYpjt%OLa99ykt2mXn$M3eZsae37hp%JL+RY3Z_c~j5?)R?i z+@=vDNA`lF3Y-d1`F<w_C|y;Rl$GTSQ>3X#J5fX=sh6=jE8rV9_h`rHn=VF3C`{-w z*fl?)1WG~LvKjHW+3eZ3kIDC6i7X0i2q-o9bnTZ6ylbjg*nl2d1gAW~9soeohIN@V z<rXrwpaB1V^CMoI{Sl82>p@ZT;{&wr+{<*DxDgv{n>mlq;pMkhdsS`F%Dng40Qmc{ z^i^>T9vgl+1G}FdoDc-2vQFGJEr{EJYC>mapMUf<14d5u?p~f2IRKQEOX7j~LDQ4! zGHL29{(U?koHvFW=Y>D7kJvf`6oRkkEa%>*-*F~WA_IWzTt;dk?VQsedZZZo$V^)F z8qZf7x9Nl?VME-~r{Tsr_jG+wf6n%K5fIuPPbK4a2C)gU?&ICxPjNF+U!lOX;qy)0 za>c`*@L?gk3LKzOPT(gM<p{R#+D?Z-6X<r~X*@T!JH(?7@@ZeHashFbG58c&VJKoM zEKB6(@ot(Mw@Ah<Es&k1uHv-s6F*1%9V)vI@YqAsShZ$j=m@Xa%@2TsrJ1>*nL-fH zgN~a9$DPc=M)B5?^)&9ZjyrF-h{1y{3h2~!(bC@)=-<{TidU=w!)=QCR##XM4U}n) zkcH{Y%~TGFE_~u0o}0eXpJh}MWs+HY4@H#vDuV3@naKn3tcGGTk<Mx?CKx}u2W>BG z>NQM>D;<gg*2GVHxo-4yR)6tRre=~>4ge3{-h~!@Tj^F*(C@PV*gAJLfBx%Rq%EI! zq|6Poh1r`ev#jI40>C{^ZFDRzJ<yw@8q|Vh+GiRS98?H?_;@`xkD1M(l9HTz+|aWb z*WBF=uWAYkVg)Q<{T7Cgn$G5*_J&GjX6*;45&*RfKPIOvk>dhxJ4|m_3NvH<diABv z7<F$qh#G->Jdl_>i&;E%DPtxq0-#0H`aJ&F70{q&{)HwiI8e$z#=OD&r5o}~Qyl<m zQb)y{9~l9DC@mKmn~`0mhJj!Pepe8;c<}a%={TS@1k2cj<@M|_6_lpfwQ3W!+nxgP zw7>b%#msxQV8z7udE|v<S<`AVOh3Dn|E~eazL5(+G9D;HZQX(n*6jsO`?+?F0w#~W zk_N3$(lOcy#&Z?e)a!&WH>?G^xO?AS$IbW6A#J6+PW9mckRyB;0QHQcm2c*Ggb(~M z2tZg76baPnskEfcS;sTs@$S%|D1#UMzpYW=CPnV+H#-?IYzAL^yECJH&u-g;$S8Ho zQzCEp3knn5GIv-2WDB1SKu~xi>rYnx*yn5pjPByMh1|}K;kbkV>@r@yXD+YLU!Rp5 z*cq8*aJ(i%T0Z3|5iWcf01XRjDgWj&!)y+fO5b8C0U#c=GwO9C<ZpJQ6pSC;g=W{B z6&M8xFl|11ZaL$gU6dy|vh%pW;R4|7bI1okG%M@{0WeK}&{$mPM~wpqO(Les0KoHS z!ndn8`CTC|JlYe^I*yVLH*oV`X0!J|Y5wFTZifn=4}j7#NsYo3`3N9bomL1y<|IaV zA*N<=I;R_?2PrD2YZC^5Yre<TD`fY+eR-ehPKzUEuJ%jHrIXe9exFYJZLorv6_N$2 z!0$!HEwS)MqR87A4O&3TndVrw$k`hZbe-+H_Uk=8hj~OJifF`gqLUq(w`2=^*wf+v bFUS7@amXOT#EnCC00000NkvXXu0mjf+4C<B literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/redux.png b/game/modules/tome/data/gfx/talents/redux.png index 34a7bb4dbcab6b6595f3adf70dafff9b6294e9cc..7ae45948d9b28d77854f9e485bf68e56b17f120f 100644 GIT binary patch delta 2681 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 literal 3965 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 XjOV`NLp_C100000NkvXXu0mjflpdB0 diff --git a/game/modules/tome/data/gfx/talents/repulsion_blast.png b/game/modules/tome/data/gfx/talents/repulsion_blast.png index 4ed66410bf53ce914cb41f85a661132b459085a1..5556b8f7fbeaa5e3c44dda9e95bac04897aa22f9 100644 GIT binary patch literal 6429 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 literal 4538 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 YZw0WotbE4Yi~s-t07*qoM6N<$f~+v8X8-^I diff --git a/game/modules/tome/data/gfx/talents/rethread.png b/game/modules/tome/data/gfx/talents/rethread.png index 3f53a62d6595abf1755a058f030806d61a8dafea..41fdca00a7bd57c5503239ff36ed4ca17a3a6142 100644 GIT binary patch literal 4398 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 literal 4262 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 IM6N<$f~SEas{jB1 diff --git a/game/modules/tome/data/gfx/talents/seal_fate.png b/game/modules/tome/data/gfx/talents/seal_fate.png index 629d3fdcddce8916d5b12e32405c9b799cccf6a5..3258ceabba00e268e241d538d6401b89051b000e 100644 GIT binary patch delta 2901 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 delta 4328 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 Warh&Y)Q8Ie0000<MNUMnLSTZMC2L~< diff --git a/game/modules/tome/data/gfx/talents/spatial_fragments.png b/game/modules/tome/data/gfx/talents/spatial_fragments.png new file mode 100644 index 0000000000000000000000000000000000000000..b44f8480cee0d961924105c21a8bb204e2fe519e GIT binary patch literal 4057 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 LNkvXXu0mjf4*b5U literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/spatial_tether.png b/game/modules/tome/data/gfx/talents/spatial_tether.png new file mode 100644 index 0000000000000000000000000000000000000000..a7144cefc368706fb9e0addedaa8d4f94bff6f99 GIT binary patch literal 6878 zcmV<48X@J0P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U$O01rH2hk}m)N8f!^J zK~#9!<(qkQRYlhJf9KpJH#3=tBq0My$Os{T%nCB9prT@<qC$%(i2BlEe=03Xx3=8~ ztw@7SBM3GEjR=CuARs7{f`EY}3?V=uA@e{WB)K_5)%VA_T#OkQx?Ssg*LT*sYu%*k z?ArCz-n*W?tF8h_ex*lIRHPLAzx*h_CIJ5%9=9uBx^=sq@bDPUp35aWYhSA``T7RZ zzyA|B9JNRZrYYF9YiW~yo}O*E_13XyT0K%ogapITICA8Z7G?YS#Sj&BFQ%zs7&=md zlnPQpgH}yZ;o4uv0%rg1-wYk{Fs2F9r;lax=H;!v7$4t**I(a)-QEVnfa;6oyfbqc z1qGRn`uX^TFmmL3bV(b7DHKc-G)-sg)@khDKc`vQs_I63{8-}Se@k$1A50VLV}K!` zxM&mS&Ml>+Wc_~(fDQN~Kzf&6bnV&~fPn)apr+;`+1V{yLRD1}>({?SP*50gaow@o zeHb`!5}uxI$j;vC>Zj{<WM!>m-wz8242q;(yHr$FB{p^#efqpieSI~>#RnS6mQqkz znL%#uQjQ*-g~L&Vmscp>-r<%7`g9~Ld^8>7-@wPG6NXVsUEQhwJO->>v4_rSeGw)Y zCM;h3HVYQK?&|F2<x742<z}p*Cx4jsH6Hdhm;x?Tl`w18Fp7$fHtFl{AI`n^%_A{! zq-#~{>o4=oH^1k|k;Sbl>+bGHhYr6bI_4>Syi=W)Au&zMvWkjUQdIOY)z#nLd=T8S z<rLxJv6#YAZq1qx`RiXN0Wki_Khm|^5T;MRpNkhOnh2XXaS{FdkH>TZxM}0NtXcDN zvjYbNM03x*^NEYS+XX~zT{YXknaa^)%dV-o-5x@8)RVN2dJ0c_+*LO*K{pIaia(*W zbSX78Kin7q9v*gf?=HsMJHVQVA^FSOllgqzLfW>CV9lC*G)?g0iv!8d-qS>2LP8&2 zet8q_?tYjiR8|)A?z=-NDLK)s0>Qx@88PAmqM`<27$5{(zFfifZ>ErQ^3&^DMNiKN zA|uBW9zGs7_x1><RTu^sx`UF^rBqZbrLHdH`nJKKptkJVU5peerXgAU(M;yge+@ss zKsIl#z%VSN*RA^p^XI?NtWpyvE}>uFaTrcB-Lz>I>(>3D#Ywbno5Jwn3kVPEhaoKa zmo66Z?YC1neR|z>o3yugEMehK(XQQiR5b))fGH$~p`hs(DKA?>Rn=k|8cw#(17c&7 zm@{WJm6a7tnshgs)_}LSA1hX5(>A0%hN&P-NpZ<}rcCKaMaB6hG7=N}F?H%D+}wRJ zO-W@%A@9u@LU~zkixX(qt}A!mwSZgN-im2T3=^uW^ZD+(7dUrr(+veUAD>j(-SQ+M zp-%#Sn1+IBN-kf{AUC(y%@d(z%QEQDA<gM?RseeY?MK<U^V1frVHv%8J%(X|Fk$1y zzwp&pueUlzcz7>{4P8KRa2kfwq^qh<v2*8h6c%p3;b`yc+l{tu#}gFvTP|PDCMTzN z%K(fX{UqzxuSC-toRn5U%EsO1&HIM*^g*sjY?um9Pv}H`{;_5iNJ<*O?|%0cs?7(} zgo^Tf=FS~LMaAh>6_1SU&yc|%;NK?61$cSIG4|}5OiAgUo7(z3Jri*_a#{vp!h|Wz zcw-Lv=L@i@9^8F*XD(c58ujnE<3Ym0Vi`U9_xSsVa`^C0UV3R@tAkIRxRUPOA4Zs# zZ*JK57MnNy>6%JMM-OG-!1?(4##w+HP*#3~y?dUeqT;}R&IH}v-O+X3)o|ua9qw+P z7$y`K7tyzG`&I?bocR?!dJJdqVB0kZO->%j3omRyQ9Tg`l$M=g{`{d-Rh_-&yB#`= zV8DR+czH#-fG90J!1v!j%Y_R^ZVChm$a(V?$}8Ui85frz3k#*p&lfW9jF8KhZ*SBN z$Uc4Uls222R1`%5a{Bb;vR%6lP5L$WQ4~c^ob;*u=K@pCpKr*yb4@vH*!1gq*V6An zId<H6`OMRX96w%{<Hi|s*syP<zkkwo%eb=m5|E#*`9jW`^?swq$&>$&EG!f<KVQnc zJRx6xd8Vsv`t%QEMuw2Pc3qOe!R=iCS5?~$DUgyfM9!aAE9cKQ<=nZ3eC@Ry84wV8 z-S2no_^5nhY>6B{UYEZer_0A5*X6*0o29RB-1RNQ6%^L4UC)T&Bk9pIovf^@rnK#w zL!=~kb+N1t9aI3`fB!QE4IYJQfUXNhkM6|TvnOu4Zt%>+)pYK3ziXTg8((L~_P<`Y zjD&=7^z8K>Hr3y`GfB>$-^8IqFHl#Pf9)9X#TQ?4_ucnWURFUw`?fzzPyNZwt#)m9 z!-jR?#EDGY-96Z|rxb6mHcqkw6DADc@ZsG}1_=yoht1|rMMXiYlSoayi)Wr$57G_8 zR46IUVc|cAa_Lgxbpw%<^fcYO{|!a)b~0HgC|Jkg!&7iLidzPtXV0GO+qWOnfDb<S zfZx6NysOi__ddj;4_9NF3a8KH(!YNKilPu28qT*n3S0n~rsS1Z9%1|T&z$V8J*!sb zV;Iu4vLz+?Y}>Y!HEZ5R2(y_~*v8XOuO%h<9!vp-p|D}YtL)k}`-ZG4Ir(|g(`SOT zTVo42cXkz-Sudh#6-|R6Aph~f2huc5scEL{n%=FEuZ$i0j4UaUvanFdk3Zhv`hVB1 zedW=kLS|+PnUNvn!GorJ^wAex?V+KOa^uEY`SsU^+_cG*UwviD_3KT!cC9IU_a4=v zZ+7l<kDN2dA>Vt~l(T0Wa_Wm&($6pKMgyEoPI*Z_{D?#TX0$FxJ*dn3@7HBw;+sul zz?G-6sEB}oAj&E(5Ed2I2q`ZwZzfFmANuth#Pa2f*|1@?lQ=!ij2R1Et8AE(l`G~l zXU<d<MZwF<k7dhF;^)`)Dtk06n)~^>S*%<!t;NE~gbC|NOdRgaP9+;RzRaFI@7-{m zNlAH?)YP{y1(cWl!0z4sn<qkD)6zJ!cMk%Eg^QN(+|()8HNfj{%;S-VpZggI@XfY0 zOq(_uMNv>y8y|g?MOauOrXgMFwkhDunJi|^7(iX!#b#x9?mUul<JKUhf?+5W7a!%L zkA_fNTXw@hq^8awBxEo<clK|Y3C??G7L%WT3Q*`dXfTHkXIx*7uyh;UyAN<qPQerk zKmD|qXC@7B_4)ksGQ534tU`tXLRe|5DJ1XCeuy6rG@tp|Y#u!I)E9J&AL;^l!-lEs z+xPeXPEF9m-5u>`OtAFWF+zfZxp3(cAqgF?Ti~~wj}sCai7-`6p<oEe%gg2A$I<{8 zG;lP3_`?cJXZsa4cg1qP|9&lV=Z<bsep=cn9(!yR!dYJ|D$L^Je+{LsuHvQuP_KM> zb@Jp!4MRtb0$n4(+lz&>T93fJZ|#Gdn>zp_9=sLdxQr?_6ro`=bz&nsFloXJ0KVI~ zhPsPos8U0fIyQ7{iiu4%vDpND`aH;@MHNIuq%=ELX69O6d(Dr$ydBtV5FXK)S6(Th zM~}(>8329K(zv}xkE;V6KhEDj{18RcnDCp2=#`${qL9J24d#n~Z2+LIzLt@X^u=as zxJeB+G*qb(5)cG{5P}CDj;6FI2UTdOrjAYO*o1~n=(tG@e{UaV&-{r8M!weUc!uHN z!w-kCYSkEQHc)LaV#MEh=IMiYc?I1Z0QI$(`N#C>jT&Ek>n%!(i;<ef=A}zo6cQ59 zhV-N)=Ds->fU^Z>m^k%eYhqHvCN(}@d9?&?ng)+QmCotheU=3{C$9<}73&>UXgqZP zt2{FLFD;IH<j88?c*BqUb2}|-XrIpSe_uwoZWC`D0I3@!MMg5Dckf0WhK(DC)HVFw zJy`tbKQ}8xchq7tbw&*v!Nf671F(DFw+y(i3$MQQ9Jh@~;CxZjOz+vLLpku{MpQIZ zblh-Y6B?>CEMU;Mcj&Vu#P?}&0=iz$qD6yQyXG;MD~%XFk0+nphut1<{pSLs2M;DG zGLpWXJ2QXvYFCHysw({Kp7iP5iS)!ow*9b=^Q9$?Q`GPX2KVX*!r-<ZeK}Wnp5v!; zsH?Bz<e3v_y4Ios+jp-cG$@pg(a9i%RTY(2KT?{cr3_@#H~(yPA|<6q*}HcRG10wf z;}?#<Z##PTdWlOlMU<8vzBT|CE?#8JkRb&6`f?~IhungzynWlgeN4FTK78$-{ATD7 z-ud|BMncLe%6axTkAjpS1b6lu#O*z9!!#u&m1WdB>RVO*hlATtq#!-9rv-p8T^~hC zyzJf_&G~_fs`IVNF-@I}!^^pJF^{B<ccVx_eB9l{#0=v^&N@u9q4lb8=8`2O#l%oh zUPj!*k2Fp)Vxq}hu>w$7v1JQSzWHXO_T5WXkQAGM6ktdd(*z-HRMlLf`{+9m;`&aB z+xP`BV$fqedfyaG38txH2!(HUuVT^4Y1i%Bb`M`3AHABeupS80;v^flJWuxVe>ZOd z0NJNcGj{MG+IV@Bb@nVL@~@_m71bB<a&x0^N(yPQv3!@2L4IketNmbhCKK)%i4Z1= z5J=MmDX_b{F`)ZxtlDyY=XecTJy|(F^7VHsxwG#Bc-Y)ggo&HGCtG)|xNZPUQzIjD z1vNDVB*YB?DTwcI7g3RSkb8QA%Nm+6!5`m$pDuB6lw7DHdhEC+g7a3aB%*Byb-G5t zh<h5fy*%a#ri~qMS%6RxQlbk5A#5z)vYyu$%xYFye;<D){^kXO+Jx}kfgNo5{wowk z!OiB*f<JyqaA14t9S+94bnDF(LG6Bwd2l76ZM$HaDn+GPtXOk*Qwsn%a{4q+4jhP| z-A-;%5l8bI7ZWz^-^b(;!*N#>5+fp6w|B3rZEsd4-Q(klZx`nDWq~3D2!qZY5-2Du z;rQ9chnQ`A{MokPYm%c9h`J?;e(C*5>5#^@eVY-&<jWn)>7Ck_K;J+<+q(Fs05D9A zjO>3?S6f0t%mAt{<&$+{b@KoeR#kClS{mU2ZRnqp!h2tS+4xkrrUtvJ(l0TQl&DB{ zA3e&sva3nSnw{VAyO9szrl=@VAe}%UBtviQ$Ce-WP;v2stN*korjQ&N2SOlCi6R7H zZ6mm?%K*OIZMn^s?>{HlFMxx`zyFVTe{oqh2Q&XgP@5?73U;@g40VZ)X5XLxjDo_1 z4;Qk0chf4*=>-dD9}+^nt`jh3Ory45iHU4^dp4$!m_o(G3PPq(XfO=API{QS1_x3~ z{xxk5UE(@f#Sf_>1Q=352!)cWO2)qR7@DCqIhXivJuV^?;^%kO4bGioZ+13P*Le5Q zN1A<c=pX-x)HFPS<x?7`%=>e4ShDF0Y^H%~=%|K<YHHX-19nA_`Hxku2^~6~fof`~ z;wmGwSfNI!zaMMf{ERj}ZGN>YGA;m~=+(1P!wbunfu`YSv+-2_+nc<2rnHp5tX%`T z#zWn@F(@^)QTx;-A5mIXf=y_+nL0L8!)6$$hK5ZT+}rau0RFyy85LC}7C?rEVp?EX zIf8+oha0QkSWZMp#B~%`6@0zgV0ZVt@pO3Ovy&LLXfY1Ma5Zjt{y7FGCQ+;FgiM{< ztbh|UXA&I}LW5}#IO*9&rWzd*LguXZ5E4wOTBa=(OsP;+TSu3vPg&=7o?h&kxfB!| z0?Ygjr^}d9v0TVhnDWn8IC}25OMX;n41H4jlNQ^9=vz7>P_1KerwdiqRFZS<2pPFM z$vnNMbtd>gY6`w~J3pPj%C`2O$>Z66{qRtrs=khc=bDz6H)Le++<^YLp^zF8&e}tV zTx}QY>Zq%$Wl&PG7372o(&7nrn~na-UHJ5e@6Zf`tr_3*Siiwmz%(UD(*jeND8l;t z&TfOrD?Lwsxy4e$0^9LF_e~+tH^5?{SLm~_-nF}X5)m9l*N%5Etj7~5iW{d24>u3M zL#e6U-XVr12M)R#FVxl1JuHm4pg``3i{qW`JDLDcU0)BT;P%*9l0!rJ@mxM<%FBNS z;%RP+?LbUWkVTM$KryWg0PXzS5E0y#tyvjdsIB2x!5QvJ>uKFBbkSi6rjuMr!GM(B z)Hv!maXy!dOBL)myp6lM4z_&R^`1nLCW<sIFq}J4Tv#fDx;{*P*-0ud75@T&<YWd! zMKN#Rel+uHx%!8*XL-I?FKmkBvZk{?zo`}MK6Q#Q>FES`dNQg@7iMqY-pCbJ?%$8M zn~h#E(I^(bMIumyNlLp2svQmv=jU;@yadzK>D?j01r|~`CvSm(6!eJcjHjnJht6bC zuhp~Zz$S*K4Zv=5N0Fw}5}cMJ1d0@vr%MAB@beDjQ0}+C03b1egn$4l>+ATju;{88 zI~;Th2_`8pm^)%(n7M0Lv%a(;JDcZv_r``KEj*mhjx;`~{5B_tRX^^hLqGuWA;Dk@ zCr^;v5ue1Nf^(d!Eay;OE(syG5F2ufwVI|gDZ0WZoTi=<7Dr@Adv=}p5kr`Kbzmd6 zC-%h8?rph&=>*T2VJes|7pbT&=HRJajR6?mA(oWDK*D`|So90!_vYs_<<{;fLZS=7 z_XSN)crH2|7`o0K(a|IX2lG==5vM9E8~3TNXYJt(W^LO-M*dlHN{TpESiqiBC#cgJ z$SJkVa?8=57@E+DwqD*>Q)3~1#x6~y6hsBxLYJsiwr1}^BH4U+8|jgWg!l$neX*>_ z<x<kJf{II}95}V7@h)&*Y%D8A3<pIaX3=6Q>l>%AACDNpL&-@<MZs_O-&(HHOrA`9 za4?1x1pno)7~<yc3fokb-BV`Z<K>I#jOwOTtzAKaiM3M*sc^2UjET$MLL!k;^3q+C z=n>l;Q{sG2u?QAcAvXK`Q9jr@yD<;=^2`~~G-%Kmmz2~*p_g`S2TeoKH2(05s?pD% z;h%hh)HH0S$*NJKZknK&LU7N**{HgP&Cs1hslnnCLc?ZixC@J4M70TI`S>^SboW3} z6yE*%pKQzAhRw7}YpT>yq_gBEHB^kIL<nHr$z0Giej6X(M4`%h2g|dwk($P|Ze3AY zP`t3Fh8a6{fTnR*R1_oP<8B&+s=CWOvTU9;VMDVRrD(urSk-3r3K&8s$ist`<7N=- zWQ`x~S<SJ+V-|3xvjTkuK-mHSpXB5qHH{cgI}zUAO%!@%&t9aagRV2<XBFgMKJOkl zKyGO%=sGKgkHEubyWz<PdRgNiEiK~J4XaU2rxh3$ZMN8AgNs4hgpRiY%f`Gykhebo zbGCnso3N_VZceaNsi6v^`GUxqni{4hC4mss7zTUF8XrA1m?mMKcG3d^=o1>s?941g z3rWhCr%&@jr&Mf0&^0uaPfzCF5C9(zABn1{9Iq(jWMvsXZZ^7xhJ%zy(+X@-NE9KF z!gK{jMF`Tu;@F&X0L{?({K$6v-0j2%hg<DZP+n8P_jx}xwE%!mPoF{RI^!ZEn^o-9 z0|%{Gp=rF?%2`2iZ5`A1?nP=EL&Mr}Urfvm0WcsUg7@wiLYL5X0Q_z54t~fxiOsN9 z)7{WqK5n^#;r!@y3<$>C-EPGaDOmF3m;8C_hqyU&jGtRT69AT-Jqwyfn9WA4k53cD z>I{R0$B!d5o#*3X@odGs=VoPdqM{rcbUqo-ANzH>LXf8?c0)%sbiNq*5N*A@QGjPQ zuc5H2%#~fbnHo0zO7f(+CTJ5HA>MwCWF9Te<E4#%M>QR&vK0V!S5~4oG=QcvHlq0q z?Dfnn&>E1M##^0ITb;~3Tecx}4Mo#gJz&6f0TAow56%^~85-Z*KN_2AsXB7qax_Ps z<@bhj!lu(2u2_YkQ_#$1?xIT-Jpa}EG&Iz;3;@8t^9zu=#uK-MHmjgR2<D&6Md}*Q zv~Q1hD=S;-a4_wl<u(I@gLtq7*J@+|c6V&LhE3N|b&ViZVdLE+0nkj7`@URhnX=&w zhE8j-nL0M3ft`6rTfF{S?YPXGeQR3>U|CTS=o-ODlACb@fEhVC(4ZqVjlU))v^t>= za!-+6S%GZOSlYcCUe|C1MaZiws#`0a?CZmVeglv|QSD{MZvDcl9q889raJo<U99BI zeOp?+6WC%|++`}7#+1-d+@wGklI<6pUR)4>2a-O%ex&>Qu;6?l4Xv=gFN%u!pXg{5 zA?Otp$jb9AUwjI5cV}Ewq?Io?4@#sEboBK{0Q)P-D6Xqz`N?B=DGG`d<X@_0#mOxG zba3a5G0x@y0BEPGbo2Bi$?nOVpVj|={_Lu*=9P$W5GJ?S?QE>9YH^@C)8s-!149D? ziSqR1RBau{E?;iGuVL_FY^;^eI&%Tl2|}NsU^FBLDl5>0$=<Re)}1}YhWyhUtG@9& z0%}VQpHx(WrsHE8boKIT(VS-HorMOCM*{)~c5`cWu!RK$WL~I3Y8s1^lUj@&)w)iD z!vUI(s%faYhGIBLkfHN(TmoBfAH+cC7WrSP2{yTi;BZjws0Ur+aex071-w&SjMOz~ zXkb?RYuD{Y9?3+}G|(FOEG4DIep`x5KywB{O+(SGJj7;LfF#=OEKcjj?ZIt-9RL89 zS6u*2<592Hi;QobF9J>H0dF5}xrP-~83t2xPa!p(zFuC84he4lzR~&fple9Y84R71 zSDZod%4cCpXWSL#*8$*@%QZ;dz-}1ywtKYLZ%$<;y4C=?#;nk5ugH?}at>d-2%5&i z$VhzDrfO`vaDfZ8^+-)aYC4M3{I6Jms$0N#Ns}+qyZ<@>oYW1<O)IiL?(Ng6pg)zD zgQjzjhX?JiVFdsWoIZneg0`kZbhCY4$;$&>bEfH6;(>Gj*PSd-*GTrT^S8K;Hw8e8 zyMT+7*i?Gk?R55VXV#^f7W*A&(0JL;7lfdjhX*Ta>slSyAtl9{#+{yCM5s0{3Bf^! zqcMH0uV<vMFCnVpsu8NL^G0#C-X~0wJ-um=l7p9PZU}(?+K;DyDd>O8ud@HY|MmF) Y1yw6MwNW#k0RR9107*qoM6N<$g5b7AV*mgE literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/sphere_of_destruction.png b/game/modules/tome/data/gfx/talents/sphere_of_destruction.png new file mode 100644 index 0000000000000000000000000000000000000000..237f62b5b78300ee98a39ca59249376a543bde9e GIT binary patch literal 5500 zcmV-?6@%)DP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U$Q`Cm5t>PuBnd6$wd1 zK~#9!<(qeS)kPNfKex9eH=R@hB(zXM2Ms+U%L)swx{5BWB8mv=+7M6#WU-;LD2gCh zK|o+Z2wjSFLJ>j;1VRW&Nbfhv&8_GC1K-4K5)3T3ukX(D%=6sm%sFRfzQ37s&YYR6 z0EGYHqU3+P+;#w3_(t8dtl8j&QK$cX12A*whYV;p;>IWM;l*2%=hD4X^zRpd4xznq z8nryqXCfoIKhk8mK)*oVnK=h_u#(<=V}8E?bc>3^rdET=&8XP>dHRlNzbezbSrl(i zn~O470f8<$_3HHd1)xv+euzea${-l^N=Eh^LElb&t}FBKkiVlg>(P4&Mza=mg_$00 zI{p3t2=r}^m)?$AE2wmWUaw%@?$<eR=E!yB-d;YLq|3=@RXPl6Pkb#QjOaf6wgI5H z-ElxfU`x8R?#AW3izKEdHd$`cxQD5%c93-P0!f!rsCHEUJ^{F1(W$j4l}hYR2QIhk zzcL1OQyH6i1rZxMlrx3LxLA;U!yWZ&*PWj2W9SvpnGU{@<OP}Nnl9w}fX(JjPN1GL zdk)!Y$H_=aApZ1G((<m}P#=Ci-gF9%#_3dX;KKe}zXHDa!(Q-Iq0v`!(VfA$ywhwy zzM8VqyaxH(HtWEo*r(_p(-tw6BTgkcmjW+`9*0?pf2DBMUqOyDj3Q4xYM&Bf-1!9N z=x~Hs$S`H|*@|s^_U%?|Hb;Yf4DH{Gegk?D)gc07z7kuei3PjA<-m!3w{`^pWT-CF zyfOxrN=;Yq5Zbpjv2M@D_4rzaMltjLdGs(uqf(fuR21OUJ1H#4BQfnKE?v1yZgD;Z z6=hgeZk$>l%)TLnw-2B=xHTgJ;;8bg#1N%n>ObOm?T@4QZ22x`Zd!@k?XJ_8kADzR zU1Km5RiLbd>HsI_vM=2FEdX$~>MX&&oiSQGQ5b})sV8x{>h9h7BUdq?TYu1Iqp4~| zfjy5;wl60B)N;xyORuZ{@Im<Q=if0MqWSAzhw<=Tov=F8JT&$pVqYG^^qFsRWLNFi z-F@IFfBDNOOhq~h4N9^jv=rs!-X1r2*>VhR>uSW{292Be(;I8rB14<AbNX5C>@)zK z!bp)#n6PFfvG0Vj;^4wxo&3L-(`S=;dD{E5yz>b@-?N9JHi4*vgPHr*B3^vu%^JS^ z{5&*SE;LphE-z0qQm@=TFW_bN=HUm&vv2!ulCPYsp%3gG$$PJiry!#*;xzI7mgOwo z{XresHesFV)hUivt$N}YZKkuso6=V4*fP90mairwEs2brc#iEkfV%;Y;1?9a%yrvn z;o*%sEtA~D^NgSU1R{c3rD8zOSb7g0$eHxBY+SMSw{wHBUApuB>kr@-C@=M9{A+KL zm6HL0w}%f8jTp~};bVxZYK9nGSdAJ)z$rq0=d-x7LnyBb!Ho*<u+wO(f+$^hj?edg z!p^Mtdi^~!?G?s!>Ce?n6NT1vCe9v@)9L*0!~w0NIx}P1e7ucC6gvuedcuoTS*>W) z8fHE?n?ZLE#jXdp(M^QaABBgNqvsR3n0}Gmq5|xC3u;e2rr@qbb?i<=M-@KV9<<n| zhjImJ)*@cmIhKS=r|R@Oa_BHdPy7c4b3Vn%S9xsG_}?A?PY+L)e!LwEUQ}93neyBa zY&I+XVg~Z{Q{SM~2&MWI3jM5X+P0JL*Kgrs#-;1()M&Nb8#kO6V#m=kG?EIH0jpmn zTh4D~%8M`6;T>|{y*&HI91Mm29N4mxS?`RwX%OUQ>e9KN$hK9xWYy|3V)h9VKt@0M ziX7jXD~^>SwpC7<KK6OJS^a%__LPKOd*xz$ikv@pR<>T)COU(z4$tG$=E=VfIb}_} zTl)4Md9!`pxX@j(f0k_vcgw-Ac1vupAp*$rla|QQl@>X+IakhqlqSJ`p*KDGU)Jg4 zrpcM4b8;~Ilx(=XM|1{5o%Z=F5@gNhD%rC-PZSEpZv(*B?;V!iAO9#{J@<hC^4ue{ z<lxdAIk}=jHoUsymQ4JYbzs~*vi000*^-hh>vwIg(`NSZlRfbl<?@<CGW*eqH>_I) z%xY*~`1l3Ur}sS=jlL8VWYo~_9X64^G40V*_%iN;M~UlxCv%>hfHy8qB_HDcxqoWX zz6<LVO?c-Hbnt75QlX^8Qqm}I`sIt{WTi7^a9`R;B_X~hwjVqJfUVj}3%!CqQLTw? z5y>YTSJ#OaAHDYxoNgESMFrP4f(nI#c99YEis?$<*e>`OU1-G0?xU$J_;P)Xz~`T( z5b0aUvAr93eept)mmEbCWF@^inb=W}U3bz0<L+kkvrnTNF#unM4uwFM96ik_M1zY@ zf7r;pxgU^rA*JE`;>=fhWK17WRxsl3>7=Ayz821^)Fgkok7|psaMNcj+4^OT%-%IS z(b{vcSSr|i@ECiJpWvs|^Vl5rx{;uWF#5hfGkC<k*v+lU(8Q3g?m=jqJ8G20bi4zd z)__XmX8!6gSpD`37{f9FxclL!8=bg+KoIde&+_pXo9NM}4?cDw2m{R&2693a5Rwle zc|0|?H=B+g<Bi2D8`Lv<_FRhH7JMpoygOw^4c+N-vS#ZJ9Ci)&4ScYM-m6PjJXOW0 zRW|f09Rs`fWBMb{VK#a;916ew&IhEOIFH+^K;zV-lOS})S^(mD$6->HlAW7{PN$~d zKwnhqVy6A`Eh?+54Gy|{_f8}xU!hx<XuM4-a?&$d_V{xQ4-co8LP2k(k}mD<<<%*R zDK2tiP`i0>^q)vcIgD1Tsi*JV$&0BjX+?BIEG@%Y*3efU`5wDMgRh4N5ka8<+}X7= z)dp{DS}$xW1J!65|Nd0+%Zje=1{Xd)P1eo&T$aDRK|D-eHT1;A%jDeJPi69$p|W=2 z>r!#{eM$TAAB`HAsMZl;mvnJTzKDp78a3)yjnbUAW{6da#95go=Z@@bkSFy(isT%~ zmf0`9QHP$kbdO}NST7Ss{aFCfX?3z`@eW!0)h1cKbiIU!v}l?aP$(4g&5ZXY(A%fh z+8RA1<;!J~6hB`E^=m7a&dishq>p9nsMtm)lV6e`cFC10yIn#;LYi!uA0IznTqWfq zxdk%ynP=;@&z?3*@{eT8l@0sq(Bt2EU-DKQk!4SQSUYYHZ&~)`E@{!a(|_g$2ej)h zmp}bpF0EQ6lm0eb63?!Z3zxrdlz;MTQ^jFT5xX-_x^(SYuRSm@K!%MRDZ@sN6n}sJ zdhP4}wNgY%L`n<myTv|zCGTX8<R+XFgI-@lpZ3?kN&bqXa`Npx^*-o-90!c;JwyuM z-7Q&jkI3dJ8|BjGJemK_=Z*49YNohTGiBL=1$F2?X0z<yzgb*TEG6QU0&$B=ME302 zBVJx!HG>Td3=okLahDd!@FBzN=<xLPlq1z?aw_|XbnD!qhJN3mKS<G@!;-!FM3Yxr zlk)-1{Csg5g-k~-cmC`dcJ1BLAn)+uaR>rRVfvgowZ~}>FLDoM6WgZ`3UOn`g7fE* z3>-L+oSYm?CezR7`~ogsxJ0SiNS`4?>*%*wEVvX3vLy(ue`pOottgLjtsAYT8m(G; zYZD?$lP@lvFA=_N5CL3pD)Cr@yhHBl2Pim~e}TNh!W#OT`D@XL5xL~WxW}GFsqi6K zq2%ca696z8jjUQ#>%)(nxIm>{M`(D9`iHTsF#N9iqjwr=Xg0eI5d~J04z;>z$*v}+ z#47bF(!=#Q#T#|80{s;YSyvm*z63RoA>*n)`*&}yp&5(@I*c1aHt^cyXZiB0Z)@6? zELnolXk`BU`P_5QAJA&G*zI<zRnBYc^xyJ;06s}7ni)%=x}t{Wa;dST`Ji{YQ8w}0 zHhBe<SC%76a4W9`koIa@qr5GfMdIqIBhgwLLig(43tz{z9>4wk^LjGNmM!~v7DjsX z=n6oW$mUcP6mjO<xw-%cgrN`xmhw<?3v+7dA<cX#^*52D^P%Dwz}yl5GHmJCgR8DZ zURt5h+uA6vEy9djt-$?@RD;XqLW|H07kZtp{v}BbO@Xt@O=w6n+WAIdE;5s}w{DKV zN59@wwXk9HaC1Jb_KqSfGzd>sAr5EL^MZ{65dCi#k{M}fs8m<bDU;Eb=c02t8dX}5 ze=RE;65hNv<9qZls-O4VlqoOOlbJGQ3jCZ3OgMFnkC(iO0tI@{Ty`GVT!(kqeIxME zmr$9xw+=m~V@KQ`8j>v;b+?Prd}9E#3~$TRGZ*m8qW5bp?71u|ZEEt}-dxs&;)rh6 zsM6G<r}4>!xafX$R>1nrOF`h(>96tLy!U9?vL&rrwPL}71-$(7%TQ@&;rk1C?$zn^ zxMv8Cuu@+A@U?pS|8oD`sB!YIJsawtFr#`<Pz^~bN&Mdfp10AP4G%46Qr|I6%LoMp zgvv(?e~^E!+$;0;9g;EA=hQ}EZ>*P9Ytv-&wp7`0xLnj~O@qF5=#b%JKYc+ek7tX& zUu}?M@-T@M6pOf}ZvDBWTgqkS)~%B2sFn=LlpP7*)zkgjv<XsnI#bH`W{9W3R73YL zddT)o$+9XwNxF866F>|GFZp`fPqKOP3EBSlo$^56`>r1cczgOV^Z8G4xYSfxOh}%F z*7}Y$?dN}7K^Rvt8cHyGU8a3>hXxVdzB3-RvlLgQi&vkojRPtxD(O0)|1Xdi9OUC5 z4+nWDJ%qcW@4`1-&Ds5@xVzV1>bgEp6LV%ggQ{6BU+()3i?y;gQ99&))K)=V<>IH4 zy8sybzy~OF;Zz!eC^P#qs>@XRw;A5}7MMBy1Dv8nYjNP0TTMv1o#Mn@HSO_-x8k8M z#>1S0hi?{xVmmjwtmZ6Tib`c;++X8}?%ckHekwVMpx_|(@Ba~S;ieon7Tj1+V#6Uh zOr14>Vg2jBE84Vf6FHasD9sLM+S_&WIKv+shY>4@hj-U*#Y=~A`&M9UUWjNw@8#m} z!=@17*Sg_2;Q9HF5#-;TPQC7;f8RJd2840!V(kTprK*zn)CBJ6&=U{T+;#ULK3w#5 z!^w+9OPKi7BwYDH?D}dWZTokl++qPBFE5Y&0|pWh5J23JK7@q_Q&CaHp(AHVJaM`~ zeJeivp2+atl$8ooUYkH=Rjr%5W8h#s!~L;mma}eiZ6I|abstq0u&K?QPg%#wQ=3RQ zv$yG4VLxwQ(P`^uVq3LqEn80QmR$$pC1Gd0ga!mQD&H=$y<~q^D!JbkNY>g^Y2Bjv z4d?8XN~Qd;e3Mk2&XKF<%4E*GkLvM!aqvgkmA*s1{^GNGZEf20y!A=Z*XO(``+oRN zk~Xc8_a;AcUEbIZgCyf?i&PyrDy}O($y;wd+vI*88a+x1E+$FEg%oj~J|kbh{#HGn zkuN?ai!3K)P4Px)+qKPalNI*z@|2T1zmj7+*2%Wx3F77BeO>;}QBhKvut}=2PKwA8 z5%+QV>a&k!*zkKLC@}aJmfTDFb-GjL&3s8LC5Oc6JSEPoQ{qfIB`=O0Q%`SrR2$h^ z@T2^zY>mA1&GWzAy#OG8x@WNLI&nxgq+gadR<HO~euY9IAI+N~l942mo+7Snt5jx- z*fT}!w!>18kR_M5SS5XHp}6wSipWV3IVlI%e<Bgh>L*hSdV`$UlqhSDpO<APH;YQ8 zx~X|Inil`Hl5+7f!L7Q{szXPD0|U@IT>NzW*mY&L?%c=xC0}DNRS*`|njo_uDxktp zinZE=Q?0>evQTLiR<7B?n6XoN_v3FUtF+WT!Ku{jTCxQ%HyAQu;**b3R#yDqc_j7e zvW-Ls1)|dCvi8Ut=FeDhL-Os~wj(ek5QRcZNpT5jsVP)cG=7lr^YUl;yT|d<TX9vD z^U9)^*>`5&e=>y|u*eF9g!<RF`k%b}k?c77t!y~IUf%g|ljwAYTYftPNL=r`<-j-P zvTeClHm@p_fw6J_vCbRX0+C@YSn}9A^o<>kcc3R{Qj!2+^Ukd_4{ApQ1Mx98=Yjj4 zq1aNur5kt`c)jB7ZDz(Na~SdRgJ?^1*xgEAnKhh*pRSz}TLgvCZ_xdWesC(y{X$7R zf3(TEZwP>1U1I4I5skNxik?9+Bxk2_weZ?gw*C9|lV5(7E`R8W-J^<@gYV?QeotW4 zRFIl{=B6gzJUoC`r#;Ecf6hSLB9g0~ZqDbX@xr4+$h>+HfM9=rHopESfzi>FhxuVO z={d10{`NeQY9HAKPkkAR3Nv<{i@sg^l5j4eru~QQ-*f2DE++l+bt2mj!mJEp>SG`A z+)JNvbbmZ2_I^XciR0v5=Mhu)4xJg)p&Ng@KZb}NCLAse*@YGqfv|S^V)iawQ-^=h z(4p8&L3FOXf^U@-RqLSJX9T~UyMT^GTC92_l^!~({9Fv5(C{<(@X&TVdH)*>{$mfS zO-l62Dtr}3sM5Hp(1a0uR!Kog2~w=$!W}lu?E~=;9g+Ktm@3`qO=VncW5e!nvU1T1 z7A;>_?};41=kZ?=>Q)n+n~B<KB~cl`3-5kFc3Rr41;Eej!{%|bC{`FaS#*YDnddll zA(<;#+1HgbnLHSN?*sgCa14FhWMNfn$Z<szo!1;^K>(^M4JSwE;qY*vb3)J_J-*px zd~+s|jX!PV#L)xS)gKVzPfScSceIY;uIAymQ~|uVV;5VtuD`Van2n}u*VzB&lW(-N zjr1X`MO#{%TH$4HgNU2_Hs$1&UZyDfDi@DmpscL?ruA!7YJvlrk&%1#)^CCTAInWg zg1>r^5)#Nm6aK`wCm&$;6BD^|<s6qX3z{U`t#b@-zx@%W=Djg_cw(~@P*qj+`vO2~ z&@yq>M9hAk*qm+#3}}wEAcy2jh1Zpf8{C%{pLqd|hbLYUF?8-d2oHNcr_Utb765MB zKSoOOOGr;Ipwww2UtLXsTFK*&Jwkw&XX9T(sbci#zftYdfX#`Is~EGRkS#lR+_o)n zTmLh3@Q0%~Emc@;RthW4OrElsg7U_VsLSnQ!c$L?e<cs4Lx;E9fwDB8g8aPSCje*m z9mDCcQ(@6C>xtQ1%E<av8JEk&^D`!KB{dzDOT+#H`)|7;l-pTne=$u=X3v|FT{QC} yiH>Y{TgUhRyc<*~6o}luA^y+D0sr&=9{)cnGR>2`3!)YP0000<MNUMnLSTa37xkb3 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/spin_fate.png b/game/modules/tome/data/gfx/talents/spin_fate.png index a95fe19d9122b4933f281802dbdd37fec873f1b9..9fb6a19b51833415c41aebf3e5c8d2a2031c309d 100644 GIT binary patch delta 4574 zcmV<45h3ooAn_xRJ%0_?000fw0YWI7cmMzZ2XskIMF-vo7Y8yTrcr0v000qwNkl<Z zc-rNgd0bY-`oO<4^RkGF8K{6FxZ#4iTLiA4f=k-1+n!~bUawo;>Sq01Zi`))^j7AU z`<{ZSXzEoHHB2!xmm)z0)GX6L6b0GdGrvF1;YF?sAZXisn19cC&pGqVndg~je+E(A z(?_E*n*f0Z0ce2+geZ6km`@6ZLcu#NhzN_I<$cXbN;$!iqu+8k{s>A+oSdA{+8QS` z=mPk{&w?)a<C-7W-GfG7yPRw81(1`MOJKcvRCTY+z9ZiiEcKSnc0Tnd%A@)F`q8{; zD_Y#wf=7Elihs~>DE=E_Vt26V^DX4&<#DH5-`>6G)V2*dIXP^K{jx+b3V5?TKJM%5 zhl`U7)v8s;CIKn%@$x44{vi52^)$@_o06WM&W~r$-Z29Fav_~A!4IIMA|WM(w2POD zg%MoCVCB`ks(TUCCWx^19ck6PB?!Y5C2f#?DV-Vf=YO(k+qOGGgpWqQL1niJ?D%Rw zi=#LEIs~}3Nhx_Kq6g1D_9V4@d`umq4bm@NV9bOG95{5ST)+2Bubzar3+D2bD-0b! z;qHmR&6?Jl#N)?^ieAH>{c-r$_QSh|7jAA9=-I6+ZCf^H*Oy<Cn_E6QBHwPOL)$hu z*=)q@`+tg@+}vAl5O=X1O-y9)%P;Z5@FAQ%e;y?yt(rAw`?@uB?bNY+zLAuSlnSL3 zP3qPC^*P{%$|^0Dm1{obd|DbELxK@P5Zb;S0d?!KZRf5s&)>dHYbsZC<HDs3jwBxY z?Qp>Vwsjjf658isPNbYdN=3(zU_M>EkP5D@Wq+FY<WD~#l)}HJPw_g6U%6#mzRZ&Y z2Cyt@HA*RbYu04z>L@%t?!E0fe>nRyQc7xhd;j(cP|!Y@HJjJp9*>j~7Z+!umoBEd zr{`_Wm71Q8l!|-YtNeZl0I+T6PM#k!45@55IlB<Od<h;^tCo76^o$IoQb?QpeGvd4 zK7S#BC;AUSNr_TUteQU;o6T0LIWn`dkU}A)qN1DItz&_^ft0^r9a`Skf<_G+5m2u_ zKHgqb_pHYLgZmlw>OaV}Y;~WWJs3V{APL8gb0|KZ7EJ@G;_lA!k7x13fPp3cUS7T( zsU#R0C!4za1dvkFGrTtuVciJ{Zif^CjemhegS4(dNKi0e?~3J#e$R0<F_Gwvn{ak^ zX6!#-#jqO~h8=;Rj-NkcUwwslrc5oV`(+Y9IO5j3BLXd(w_)0(xg6M;!1&RV2?_3m z5DI}n3W*TXyq5~3KnQ`8lQV0Ue?mx55CBnY*RgC>6jCXak|?Q=O42(boZz-?OMkQu z7Z(?#G)3U9c!FUay0bBIHw&gm(jhnusT4vAq!361LJG&da1cTwWI<Ofm^G8;_caAz z@`oRil#+sw3Mr-8mE!$>zk`&;FWJ3PC4`blCApfNedh?!v~f$;uh_$TZ_mQp%hy5* zun;ZSb*!C7DwGrm3g07?Nf;E7OMjM7sbWO{2E8=Wfw)Ofg|a#E*6X8+U6)7Iswk<< zZ{7(jpp;_b*x4+Y7EMiWUl2AfU%8CLVsWhia{*E+1d6QeY*H_za`{RY!rE1&%^YuW zgH$#a&6#bw%c-d>TNQ<n0wvAeR7%mKYghbzeQ&wGT0TAqDM`<`SbRpPw13Dq54@ib z|Gf+sXJ<5;)U;Gy88?7`3>i(EmO)6NNlQP^#;t4FyDyd_@rTH`eCY;q>Pldv#<U9# zA);G24eQqhG%cDnC#+K^w(s1@e`d_!xu>7P5OySB08+!7ufImWp~G*w#yYiqkxFsq z?9U}snI-HmKK+W`wJu5T-hYs+_iReh{hk`80o|~Epgy$wNBy67=jjIZ8tKx^S<pQ_ zJoTHS$LQqmztg+7Z*x4K^6q&3{r-LWySO-gWY2DWX!jTT;1@e}<A8vh&b4~pTphDI zQV)FQ>0-ZIViA})dI3*A@;9{Bq+U43BmLU3=#%LHJkX{+T_0}6%YUO^<akno1LncD z?HD<96mzF9rvJ0Iw&SU3sl55_cmkTW;K+CJJYZ@3<*OpC@YWOoWr@#-!GmsUf~!~e zL@LG6<HyS<BQ$%`2I|%hK-mQQ5AWjj@i#}NQ9vL=2fj*|&<Lb3Gt3{(oW#tzA6_@M zrcX_rot!y&`eb3|*neuSuC8QT8vNLygBXS#Z8xyn4Gbe6Z5VXu(ThtN8AafNTDNA( zTmQl^?1Vr5RN1Y-?1`V@=TjezW>xh3n<8J`(~HHkqKRCzjj)d05kjJc<b&x&k*`t1 zi`moWl6>?OyJPkevt<V<N0ZqSy@^g83X>w)*DQR`SNlw5s(&O(6<UTaojP5&j!x}D zkW!L*;X<*<7fXPtV^&hLMjbRTf5jB$ESq%0agX(Rp3PDFX%^VVkp|O-X6=S3X3Z}| zzGrxE;&yyPc-J0C6apMRL6gQ!SUP_ZGd{SUQ@%f%VEF^ea*)jH?zp(?#zusNB9&y< z-hCw!?VDPGmw#WJM18+N(6A)xLn1fKyWzOEU!O*Jmp*8;$;Jj~B{+TNByWr>)YL)u zw`0cpa~wqxga#o%Y7~Gl0E0fgdy|=!$!q`je-7B=Nl8d)+H}(rXwIJhnRDmQ7g<YS z<3?1hSP5;|+5GwEC3D+v^ssBlUkPa)fuUhr>>5_CpMQNr;0IcDpi9SxOf6#ISRjUG zz|bd(jGaGg1r#_%vd}G7ND!v0ETu%Cc;=~RXwtZm12*kKI?}=V5@}P+Te9@J^*sC7 z<0vJ$l9k1=q~zNpK(%{)82IF9v;j#c<C(T_?9F}u`-05Mm7y&TFjZ>Qx@DaC@swj+ z_ilY~tA9`lff)l75J5@-Qi7Cd>nfD#{*D~+k^?>`C&xtI5`*mAJXS<TnSP1oKHF?I zdUWfGkdhUvKP`FS_P-Ct4V#D7ke8pws7cS>5;(A7OSHz(F-$R-^3mHx#&rk@MQa13 zu-xAQ4iHEwQBs&LvXGAWp>yZXg>q`MnOtLWz<(R##yQ@7vT!~CgZsbWP>xGht|~DB zis*peq5bi=rv_SU-ktGx?DqUy0@tt8*pz!MOxc&3m@l@FnRTVexEj^GOs_+0bLRyh zG}`2TKp@ZvsnNnLhE}Omn9izRy_y*h0I_@b^4aG90`St%AvoEb@vc#Wp@Rlu*fr}u z+kaT9I;4XGT%0TLSj68!!&ir6`0m*LVu9T%R0eIbzhQAf<l4p7t~nJZKCfIhMMVp% zz-;ckL^>ixErk_C38Yd*!gzl_f0R_DU%JFo&-Vks$J?8cLxv!gWWlVNmW2?!H*H$! zau)?Z`abk3h6Y1xrY{{`e8hEcbrX4q0)I3qu<t-D0I$7NSZ+9Y=qt2QAR>U)2q6$w zpd^GuD2vUd4Iw1^4;*m7w{G2vD_L0tckF~PS%&DSNHbhkiUtiDAeCh0>NR9szFc|& zxK*f3NXuSeXx40<LvCJ9v4B;pcw$%tD7b!m^q}K?x6p?O>lgt*<eH_Xk~EzJQ-5a| zm_#T@lITL~fK)78w9qk^U+vm7Yu%bFnVD#<S+i;--rnA(MX;(sAb4l;<kDxa03Pl< z$f3yAY@Jggz>02_t+NZ(0S2u(dhA=r`+M9y82J210Ip_VW%}$XXssQ@DzF*_im)Ij zAQ2=dC$oBusmUw2y3!#ujI69Iw13vDTE3j%2Oo6g3WPGv=PRQ}V;IKm5ukJ1zoIp4 zj$K}I?Wt@Ivu7CqemIi?Kt2Be0Gc#vMyuxc17<w1EoO6pq!hIt2unFiGBPgGIjqnn zzM7ql)*2}#yS8s9v~y?6XHb>}QS3YLHS0gyczgNFpl01IO|IFvYf*^-O@9zw1d;TM zX%78R@NUvuGaWF4NA%@i<40lG?WRt+23`oks@1Eg+prFqS(!z?75w0X{B-&>&6+i{ z9HPRWm!How{rcZ_R?8ODECQ|J#OZIjl69%XfZ5rZCIW^wvlJQ!3o4}?1oEm;lM#bQ zF>SUPM=V(}k0mSS(LSUzfqzZzqk^j|DW{Uyyk#RfIYon)YM#}YIeiA*yN8?NW4AjJ z7?%B{=U@IpUKx(x*p4Rer+U>|e0jKZER=EO5?YIEI6*i}Uv^Hm#Z~4m|Luj5?Af=A zuMZXmFR@?lAoj~0H=Mg;hfa(bHiB*u;Yc(>fW|OU7hs?fz_8&Xh=2e7Xqghawk>;> zv1QM)QUj)?pLZZWb=Eju9r_N{tC`i<pU<5sD(k?~xzU6_`~auVoV>=q*Cj76ms&M_ zY1Og~ojZjQ-Yp!d1WJM-EF~rEW`fhw7igF~WeSn2SC=`XecOeRtJ#@W5<`=nokhRl zJ$U+2Ggol-+>a)43V#m6X@NF0TcYFW@kj_Mr;;pP;lZk98>m#t4QUfdB^^Z7m}zu` zVP%dB&%;fhIg<&KCYK5Es`uPO`o)W7ON;+}{tQ}c>iRb#`BWlPXBPVC3CH72_gEJy zOo3oabR1p7dH`_X;C|`{dNKB`QDkLi6><$Gn`0GJOcQAmXn*3Q$-Hq*s9f4s&BKFj z>!Vp|#SmpWA=0E_EBtFU0HOJB%%|k%=N0i2g4(n<U0tD(RwYPEc&Pg$1T<*KrY-9M z_~zi(eDKi}zWwe9PR>r$@vn=`$!69Mq(CauVd_7iKhtN-xNYPI^?!kdvu9GJauuq$ zyL0mNsj{6C>wgp8mtp<JAZ>!M#{!DHt6a&Q9qZ#!N+500yef%OIPQfMyfa}m3zl4; zZ}9N&ph5iryu7_}adGDG;X@=OB;3|IJGO7nlnMW)nuiC5VJAN?pFzV%uroHcYy|N2 zsmHvj8&OI!cvK%wq!iW2K3={|e{U)E{2LS{f(^@#3xAX{t4Z@0&0^K+<s40jFSlA{ zx2|0nGwOBf)vbeJ*f9))t=qOUWaLPP=`8a(!Os>S!PV83716U;u;Tq2j_DQtC}aLP zfy(agC}|;YGm%%8@-vAc$j{GZZ`^M7eI3VpQzw>sJvD3A<oUjR88o0jZf<U9!@#iH zIgymah<}$~;o#xJw_g~!QUB-PC+Te~6LsXA-NlZ5{E_GM-k3z4c<{VFapV`B5}&3| zC0@`!oJiL{rd-nJPG{(IKV;}PMvW~+LB&Hq)T@{N&(x_p>DV!yk$yp6Oik74=g;Z1 zpU>*pm>At9H1wwMW#)ipjqhj5xTPqYV8F{gIe+;>@x_SX2RhL2*}oCiIRa(FOm)iw zT_MS{=a8Iof}egmL)wK@GBdBBF>rQq#@)R#-rnBS_Vc4rKmdj|&~`g^!@L@X#xU$G zTeh5O)2EY=m{|70NO5i5!h=+Db7R}?bxitbRH<Miy7r=bcyB^Gcfr%c!_pC^c$mI{ zRev14_L(TmmKb&eZP-akNoMor|MKbDwd~qe^0S8JLV)KU9ZuiJhar_D;>jlD<=>uf z?&?~BHm&ZbapNY`uh#%y-&%NjdQzo|J2qz<hCQFmtC{@r%X!Y6IYVM%B8LwjCN3`S zy2?^%nl5X%*_`y&PZIR@sAGEY^P_Zm%zt^edbyks$<NPY!?sV*20YRGMO<Af@Ox?H zc1CE<vPllN_qAaYe>Vgux5LtQdp?GdPs^r3)bk5q-#1^7dg0t}o&e?k4--*y_uzSN zH8QVWrq{Er{yZX3&_<2#kJe@^Fk#Hce;yGiXz7<yQOZX1z_$4N)+00PGVzIret*+M zxFhCe*2GWs7tu+2_h-qvO^cA<tQovx|1>3~V(p^6+<T7)$|ia79}n|=;^9BO4sf`r zhMm4cx{;fgi(zOMOj}QjrfvT`1TZtl7kT`}j^yX(W7zF{{QhdfL;L)(&ESm_kRGg_ z{{@vQS3)U4Wb|StPaFH^Apn50vsVi%KHiF7?K(&)IQ7GE29A7!v<tudaYf+TmYbWy zUtj3R=FiuH27kW>y!ZC3Kdu?PRS#|7UB|3HqFtO_esweW|0w$a1>Qs*T>t<807*qo IM6N<$f@F34UjP6A delta 4133 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 diff --git a/game/modules/tome/data/gfx/talents/spint_fate.png b/game/modules/tome/data/gfx/talents/spint_fate.png deleted file mode 100644 index 25f7666e887a6e27d523eb2e116324e3f1f9eee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 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 O0000<MNUMnLSTZc?@wF+ diff --git a/game/modules/tome/data/gfx/talents/swap.png b/game/modules/tome/data/gfx/talents/swap.png index afb0b6a4a934df7c7d81dde32b03782236e5d54e..9f90da389b4a557bd88d4808cad0630fbedd5967 100644 GIT binary patch literal 3392 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 WDJ~LTPV}t+0000<MNUMnLSTYGWrxN9 literal 3373 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 D)mnJ= diff --git a/game/modules/tome/data/gfx/talents/temporal_bolt.png b/game/modules/tome/data/gfx/talents/temporal_bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..f4bb163da34d6b9213ddd8959484c53f2ab5266b GIT binary patch literal 4998 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 Qm;e9(07*qoM6N<$f<JkgF8}}l literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/temporal_clone.png b/game/modules/tome/data/gfx/talents/temporal_clone.png index 69f316bbdd60df547f97602658c861095d4477b6..27871178fac6951c2276ccf10a5ef098d4ac49df 100644 GIT binary patch literal 4599 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 literal 4482 zcmV-|5q<87P)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW2OJbB1v9}Cvj6}Q6iGxuRA}Dq zT6u6(Ro4HV^Ik7m=!EPE2?S6i3kXO+(6A&3j3PB40!oQ6)}W5xjN34dA|j@A9BQmW z<x@c|5Rd^BsZl|efEZ+7G!kT$kdP3vk`7rqo$h<SKi+%Y(Lr&8alZ0aD)n;v<=*o< z`_jO#>(}*@7G2_FqUh-8Zr!>?L`1mV?o+2u)z;RE$bScbjvYJRJ@W2r<t{>Zh!gMt zClAWfrTI(i>+65%0OI1}p3j|6m<S<AyZ1yOD`#$dxVpOfGSQ^#dUkg9(72(oh;878 z{oehbeDX<6P0dAL)-Jkhv)S^-<~ith0D&x+<^zFxU6-nFJ+@UTbvXbq^Bn{3=*F{j z8W@fndg$YC>ORDiRDSBzsqYJ5(4axrNBxZuB4pAG0#Q(AA=INH^pmo(vdaNLDYft9 zzRYxq<iQ{f%%J3q@DWHodF<G+Z=${E5u>geCDc)fKoEuyK#;FJM~&(_>hfu}$K#o| zc3vYb66;=2{H-1Hx^?SzX#l#eCs76wzybycU<i{zIvAn>j4qs^Y1-w((9+V9w=oaA z$z&M=$e1v6!leN)GdR>>wh+POy1?AAq(Py~d|5qAb#?WkV^4$63PXs5aWxHhI-QpQ z(AL%_TqR7x1QsCzlc_umFqH8?RX(5Za(l@=d-j~Bg%VH)?(A~8E&)J94q`V*Kq3TT zfh9ymCJbTh;oVmzqAl6HMEDC38A2eUOB?Y=`5y@#5zW*VMIxp#kT5_5I=tcI4Ob>q zm6eqp;iW<%1faa3q2ba1PM<!#t?4<T3o1Z20Zd>4LD-$&@?2?Y=@kpNYd5VG{t7Io zw5=^IEtif10FE3v5}jF*toH>)5C9@TKp-mF?)~e^l`F4gM&x$8NB8f^6uxNVljqN$ z|6Tx;QiX+u#h(1mU24Lq6{rIpK1*-E`RS8ewrsgfG59-HonCjUdE5T|`+rzAYAlDt zVYl18UT<q_>whe1BQhM!|F?QTyE4pkcIe>j(81r<CO^0C(PbrFx7pIOv&ZI6jnT76 z3u~ie3*LSD^sZh19{lYgAtKV&-24jykkYHy{ZpTD>NgREfgmiR0b1GLUiwYV;ll>q z37MILCQrU0dI+gFz+b6-`R<CBPi@<F<p9`1Li*lv%gDjEMN8z?iY*&oebw941m@fs zGsa{-C3=DxNkB#xD1@)Ddg0xZbcbWg>#t|fI8kBD1O+jvX?S<%U-m3qcqMEgDI;U{ zti_pEJrbhz5&KoCF*$KL9Shg54~dMNG3_nCqqEpa>?Af42b2S%0U9E;gk8Iq`@P;t z<NpDUg+`)5bTdN{&5_nE`^&Qh7tWkX=+|%3^Uo*t?b}dW+f-F`@#^PCQ=fjzEe}8P zkw5e%pWUIH@P)!3qG!0Kbr~|G<^1_mp<hS{lmp5RWrwmsbU-(LM<x#%<ZEuO(N2mE z(c#zN*P(1sHYgoRi<t6g9smKZc8<^P@zg_46ik>u-yR<RBLT3cb?VnIbNu-5gal(J zbHaqFcP{gXq==Km32{Q~5C{B@up6gO2e51FI?<Ki2IznWLy`O%lm^9Ga-Ti`N*aol z@sS2-5FJW~=ujFWX<&3_X63<ye*F}5K#S~`^vC-bFVn-qelP%6a`GQmz5Bqd?RVa} z`iYmfxVm%!aO333V()0)XM^7cu|sJP4H>Q>tn0<ww=2y9lVX6OG&38AhNw=R0GvN} zP8iT3nxQ-<3}^s{UX_~*;EVJ7Ea`E)KK8fIJ@>-^M5m=a_R5w7`)`#!R5>&_(nmf1 zIDqYI)+pU?+zo?s28lXEiwjFiYObgNH-VrCilMAjTo}TLh>ix}uC6voX9!z1VEovq z_weBWj_=tcx)K}22GO}sw|lyd81a1pgeNCI{K8tX^?(g92-R?H@^5sfvvkJ}(V9eu zXiyAcD2C_;9ggsn6mLU=((4W0i)M0H88w}TU@aP;STj#BE&`*AqZ@$Q;$pC0X=XW2 z95(%-r_rtw{4M}DKKP*M*O<J~&1*!Db9L|DboMOt27@tZcdKX+ot+U806;A!YmK_X z(hy;^wY34zY_<S4Q@h$pNw_21?Tr-`U?0pH5Q;$DzguqZMF4~+B-}K6_Wkd@*L}<w zW9Q(iRiOHS30mjc!s6qV&j)q~>9Z&>Y9O}R0Mzk$bDzFOA{Y(z^#IC0`wY|qt5P-0 z!%!+PM02v;?r&)kR?r}1U8Fg3rceJSfQYVLXD;5HedFB34&$!Q&Neoy_U~V}@mV1e z3j-KnB25FJ%;LthU4uk1l)kMEz(4b5f$9Q8n_-h7gz7VA0G!FsU;Dvd#A2{eu<SMq zK)_R9uXMMt>75iqY3LlCZ8wA*05JL4XGP0|M#9oiRRy5akRi^vxV`h|dwHMLSuuW; z_re7L&_YbDV5?l#3=&mKZ7qO`9XpmTngMRLB9uiIOKownDdYtU_8xsrSPTZ6T_Cdo zr2w?n)xERqNzr@(LkB@|Y+Uc&K>%TKaY?Z`hN>v`R~|nOVA9;Vqvp<4KHuUwGle}t zK~rmEc{zXvstEMC3?(r!Xl*SuH2`#{^Te7pJBwZwYS$Lf0P<B86|t^oPMc<rjNCAD zrts&%u17#z+~{j=22iwkaiu38)Xp7i_RiN`7X%Q|wX1N1sli%PRbinX8XB&r_sy6Z z+pk}FK|yKV20xpAK)9;8vJ$}ZCuV}01C+IszPqWsJfcUBTVHy~?s9FOJzMy=1hj%6 z?5;m?A|yWk_PgihJoS{%<9Th)L!j1nyoWH_s1{c4{m!geN^3$;lc{q?Mi7ARbSjM% z0faUxx=>mg+qW+$QgP_`xpM)md;WQl$MERK&+buPFMxBqckkHuim(KoHvt3>m-sxM zn6$J$J*Hm&@WZ~w#uba67V-xay_LT5*4Ia8WC%xJf8Bj?Sy>eY1;w@N0^!2A=tRj; z0G&sUjLXWZK6tRg{c+G!F{0z+g8*9U>Hr@YihLiuz6e17JMIA4L5PpajUPC$a?hRy z-)=BK{ynQ!0Z7TswYyx~^76pN?cIwo3P0ZqAf<nQA;+-XKZd8I99y{(e8_5XV(0eF z0MbT{0y8*d{4>u0cz@0uBk%=0(uuu$0p#3!@7US10p!2_x*}fyWMpJy5P-Y16#98E zpzS}rVudp<uFrM1SqFs-d*A^88{d2rB;eD<>(_^;q)dP2tpR`fleeK^?XtfsQU=dJ z0QnDn_#uFS!*UgaDLVU+M*ysOYk|^45tP<;blo}tg9hdp%#L&Aq~zw-6&01&<Ogkl zT1$8A0MI$HcS6jN(8R>j{Cx1)06f1{95Vo~+g){TH|X4}_ur>{zTC$j2PK%IBwW*D zv?D62c*6$J>5o<~P+sq~Q>TJD<=p%SXI$K&B}>4EjawB%aaF~xU7?AI4o)+6va%-G zBO_1z>tCQ+FhD2H?cN>Pv!|jSCb?uE_27d5wk%o%@)_P!QE5$KVPtwbI2r7^X52Vm zbMx`z+XCSt&>b?}=sUA#FM9CSn!>`=(WCp^Fe4aQ7>c7i=j3>5YL?8o@3S}FaK^+8 zzx7@a6eZsH=%dQ(UA^FWkTTr-p~D~g8XLRcd^0G*^iCY#b>v7-O-*_A4iL7iUjd-s zU3V!81)vB3l46E-=-Rb((<a5I3}Noy^&yl>8#6|c6HEhcz8S#bk3R+}gIU#;m0tr; zd*sNu{rkg{lczlM22-e|4~8^3eZ&X=rJFYS8XJetngvQREdKhT(?jFqPrmn_;u1wr z)cWbdg#gCfbB`i(w4;c#r%VB`d+l0K@#jmHu-!g5cVbXm7>Zq)lO`#jukb)VG=Q6S zFIog3cfw@jwb+E-Y`34;xl^&nuz?bzDE&q*M9jjWhU*f7(x3pv=xIfbE~7_Zcf-By zOf9DO)Tus?=hMw^gHhkOz52j`xU4LV`@u>=!AOYD(nCXwH*H#)_diYL<=0G{2<isQ zY>anq95V*M7ax28_)3b`)gL{YlA8<8G&<pmVmhRzHkFow+`<60l^r;65darTOHUWQ z9}MX*-HYao1>lT{neyywibH~KhiJsa>0ti+?YBWk*W~2^81?5rgB=LSkN}SEn3mRD zQE__xdbZndd+@JdZWkE=g2R~}8XsSI@L*Nth7ab<0WkKl#}wI&1Wwoy(WQ&e;{jCx z5Y$vyExK=JqZ{YV1G$Z?(2xTNARB;)?%hF2uw1oewO1t$9$bI)=qtawy`rEXaq!@j z?qe;*2q>W~dB6bU{J!_z3rbUDrl<k0uP7q6Z(mPU)zazH>yIA2X3`{A?C?N%A)%<Q zT>;crRsbmZGT-ZVUmQT~mtXGR_zGABS{6bO)B|w1Ttb@Z&KZ7_dA7{4V*%6^6|vnu z?S&V>P7@(nfr+V8dOCoJ9z8})drA?5p<oS4%-F=8`t}9jsi_G~OdS8$zXN)^0V#z= zMFD7OYy>rLefj0@st2~_<+YtJ2#Odux^FLlq&|H>Y@$L?KK*lYjDH+9XAU_B0`0N} zD>X<;O$CrTY?yGgv`fxm&8z@)@6!i>-Q~J})hbYz0QE!w!5J0?z+GE=_SpLs`}PHU zXa5es*V6L86DQuka-}1Bm@tECK6&v)05@25LXa^6ArMmRE*I(gz*}Y*LkI&~yQwT< zVq=Zm*w_kmXoHLZ5;}DPkTQI@J>mwFbb%repsaItEn9Zs>$6?`qP19ab@hv5#-!bT zdrI%#2UoAIJA61QBf}QeUjz&&fCUIVP<Uu!Vq-}O;5E1<?b~KXzshb0;A?FqQh+7_ za8@@<5%h>i0Bz09&;$ap;2B=A+3f~!cE^ryb}zrJp7gb}99p{cko9L{SsA1h=&1k* zl%ZS%2o%{uVq)r#9V2S8y17t*C@@)6f&eJLUvWFFHGHTASHTIu+t47Q04;#c_^`3I z_9r#Ayl(f3haLc3fEeRHlQD__5~BoD!~yd)&JLP#QxgD3csPgxNs0i}zTHoL0Gh*L ze!n3&4uxW0&GF+uwKG?`b?fE@Gf6x_GcY;S(pXkzce#KLX7rWd3km?C>fAX1k;%!X z<cu#av`b@&L8=viEi4R723>48D}Yp!`(j^|_`$8k0}B^^{Kia07nGP^oe%=thnmiw zjZRNjT0{_7yGjj&Gbc^}h)YfVT7WadzgdyCR#yWEjfzr4hLcrd`EhS?Q$@wk(;MBr zV8QA~$CK}XQeFiGoLfF?7J#IF{Q#S(LROY$@K3S-WI+Ldp1pbn67OKFuueW%R0JR? zJzc<oX|&<Z4sG82ts{sZ(bg@_&;LhucBg>@BRh94*}1d+<VgUBSFOsKFahzySV$2d z@N+=LE6R85a7IT<Y#Iqb@LLYRA8@qnKeA;DfL;R!211RPZ#C>)w(MK`wm+^l?Q3Z% z*|x24=~9Dw0G`^~7srirf4Rn}9>qFXNDi)9;%#W?Ic^*%+87aBMALBQ^wzD;*jPQe zw^#v!01-5NvA)*IJ%7&j`b9m}8&jt2eCr9JD!}mNLRAF?^X6GDsLjevAYye;1Q1`r ztMh%0jlCvK5=5IJ91ws}wtDvLD?MWBkdo48^5oQvjN+oAeQ&<mYK*3tQ*(1CJozNW z4*;AJxL<q~yO#g+_rF(4&D^z1A_iFT8KlbIduaMs`T75`A>TzLuImX|Sy>Y&UOiv{ zTrR4t+_Zf8p%p8X*9+z@Lx&ETG9|uOF9J$-?%cd!!TGPg!msPs_3Qd|{esv30T%*u Un1Z~-<p2Nx07*qoM6N<$f^j5tk^lez diff --git a/game/modules/tome/data/gfx/talents/temporal_fugue.png b/game/modules/tome/data/gfx/talents/temporal_fugue.png index c3a614cc0436d9a57ce1ed054ebc48634109c722..2f0a4d4680122ab2dd6267cc5e1f95fd82b39d80 100644 GIT binary patch literal 6597 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 DPs`xd literal 4976 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 diff --git a/game/modules/tome/data/gfx/talents/temporal_reprieve.png b/game/modules/tome/data/gfx/talents/temporal_reprieve.png index 95fc78fc24d2b9b472ac985d96034902916914b5..b31b9f88e35c13e70bade128ecaa75aa452405a4 100644 GIT binary patch literal 5663 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 FV1mQp<5~a! delta 3576 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 diff --git a/game/modules/tome/data/gfx/talents/temporal_wake.png b/game/modules/tome/data/gfx/talents/temporal_wake.png index bbfed84cd90360e718a3548016311d26914b29ec..278bb53e28d4e665ef6893fd975fa4f83c37a9e1 100644 GIT binary patch literal 4378 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 Un%RjcZvX%Q07*qoM6N<$g4|DN$N&HU literal 2916 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 O0000<MNUMnLSTZO=wvGZ diff --git a/game/modules/tome/data/gfx/talents/time_skip.png b/game/modules/tome/data/gfx/talents/time_skip.png index 5ead5acaaf2bc0eca84ee38592af06766a072b8f..5b59b98746d469aa7dcd7d667ea8304ab4b92ac7 100644 GIT binary patch literal 4520 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 GLSTaMM$P2_ literal 5315 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 V7#$+dqeuV%002ovPDHLkV1i5P4uJpw diff --git a/game/modules/tome/data/gfx/talents/warp.png b/game/modules/tome/data/gfx/talents/warp.png new file mode 100644 index 0000000000000000000000000000000000000000..470815ea4e452f4ab4197c0d996929ce2fd7af9c GIT binary patch literal 3866 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/warp_mastery.png b/game/modules/tome/data/gfx/talents/warp_mastery.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a1d90c628701939b6e1930b86e38c86cb37fc7 GIT binary patch literal 4744 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 W^)QTV_3Zip0000<MNUMnLSTZ687sB` literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/warp_mine.png b/game/modules/tome/data/gfx/talents/warp_mine.png deleted file mode 100644 index 43b830b5ceee0fd929e580c2e8e8cc4de8cfd27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4103 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 FV1ie$*a83m diff --git a/game/modules/tome/data/gfx/talents/warp_mine_away.png b/game/modules/tome/data/gfx/talents/warp_mine_away.png index 5268bb01dac6cecce5348f7432881c4c99029e5b..f08f5ff1961ba9331a4847ea400bd1abef670676 100644 GIT binary patch literal 5227 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 literal 4910 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 diff --git a/game/modules/tome/data/gfx/talents/warp_mine_toward.png b/game/modules/tome/data/gfx/talents/warp_mine_toward.png index e8ac5358c4b2ecd9e8ca9c5a7ef768d1f3d75c67..5c509a8f16c21423284337f167508b1b2eb16d1e 100644 GIT binary patch delta 5913 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 delta 5015 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 diff --git a/game/modules/tome/data/gfx/talents/warp_mines.png b/game/modules/tome/data/gfx/talents/warp_mines.png index 2c5d2d55c7c492f051132af2503cd1457ac848eb..31d9e2210e3a8237a70b26417676a82532f643a6 100644 GIT binary patch delta 4112 zcmV+r5by7*7@i=I85#xv0063Kaozv`00v@9M??Vs0RI60puMM)ks%*{2oV!66e^Ql z{Qv+Dt4TybRCwCun|qKK)s@FTx4VDy;4vf2FpTmV<Rwsm>=FhA6fJdELMoskMrC6~ zU3XWlivDBm#-vhfb~Tz9jazD=D@di>)fJKKW-BW}SH-sx6a*0#m_Zn3c**b@=GT4C z*+1^>--CHcf@Uncs_XWDue*QU_k8bpe9yh74WN95w}7ws7Jbn#EHCdvSy?$@7?R0k zFb3i{#@d9owl><@+P<6sR8^hH$dMBmIdTF+hSV`^=t#~QGMt*4!PE{OOi5`(7(x_5 z7#T955{8B_QliKZhOUi#kFwb;ExVg&-qS?mjvX}Y*ujn++u68(c{7_n-om~E2Tn`B z%^%_eDk=tX?zxvRdGbX}m@u8uqb3tZ5JnKCLWZeesnD*Cg8XlH&EJ!O$p6O}07c^j zk{FE>OdO*&ap&R$Y{J?PKH%-OYkB$Yw^{wxTeKcM`uPEH&N&xy{`uE1<Gcl&QCa1L z2_eV{ZHOW_s%e{l3Lk|j0RCEJh{A$<BZ$I05McmV>jX^_)PsO^$HWQ5F(e+K#DUV( z+{}s>U*g|?w~BW*Z~o%}=+|!$e|h;oaLFaNP?8CKhl_>E2@@FyM5u(BynvZ>v~&L{ zyr%hQ1YTqOy(E6r;{qWQC%7g~c=Z6e>oH_4n#7nS;powSBmB#XmHd3ga~$c$uXGAP zSy?3uzx^m*n|4)RokK&IDOB;!fH>I<3e>;wTxbY0TC5pifu<P2*u3Bx$6yo4dcjkn zW1AN~u|?nzJ55oW@WczNxc$i|$tFq908E{_i0@pztVp;_s03bpqremim5x{@a;h6f zaQJXD4GkZE^2sNg*|VpCmgYtd9BkphffkM(JIv9ehl%4XA_71dhLn_)(7%5Lm6es$ z3>w5)wSyTkY$$a@hcSNCC?<{`&7jK4yb0t0$U<U^&wG=|1DHTI%Yp|U;D0u3=o)}I zbAH67m;Sh5q{yptYNrLGnR@RH8&>oF`>WWn;T5)jZ2A4?8n&iSnZm{O^;}wC&jnM@ z&HIVCKs$=e#%qGtjGLca#?m+5=m@~@;j_5@`j-hqa&{Y~PAM$#*#7)`@2%jammcGT z4}SM2B{Fko&g8~<^O!ed#z`jNz$i2c^?qgYT|Z&#zJ0|2T=nghoHKr2-nOH>&E_0j z1TVgS_#n%d-$@*w=v9oaZ&?|4-*5wed->%#Ve_M3tR+j<tl`$>%ZrInNl68wh5$v? zAgYKMf&dUW*t(N@?>(Q^);*neptQ6PnM|oe)tuyLPW88{8yWyDbWsWlZSC!xXm2n2 z&#@CH`2NEW^Rs83;kA2zN^QRiR28EFDj<S?QAI`QS5nfE34XZoY3fE^fC^}!s2DU* zMBz|tGe7*{$ZkjA#=m}mug|?P?>7SV=2PG|yf!(fsRi1lL=gmHiHM0bCeVbCgrG3w zS$F*7Up~Y?KmK^9{n)jCKXo_U$gahUsqWhcM8G-#(*4=@-|v_Vty}jPyLY|oKvqzH z90-Wvsi$t}Q3d0;-2ttDD53`O;H#w1^dqY3`l1H>HJd1EEh>Vwf{M7%rivDfB35Y6 zW_#?<-z;8SAh`P0^4pCY`R`4eI?o1|EIp48H$LY&t_D@70lRmv@9~8>A=L?{sVSia z=kvSffO5yiIw94Ml3K-DEgCr$r^3a5X3_b!zOfM%|2(xI!V|B*!Ievvbe{|@Uw#$q z*Ux3)!e#X9H-JEuNt5RD`s<H&`@-$p*Rkfc<phD_13{Q?gTU=kSo}K(oQVX15UOC* z5+H=cu2qW>cOGlOCKxMhX=vyXfNxHlmK&9pLx))OuTSvWwr!mcURV2+DOc-%9d~Tj z`+s4zwswMccW-anr;He(C!Ty#*WUGyI)Ccap6>7YfmKzb^olDU)M?YM(I5!FP+^QQ zpZVS>4E37Xv-M}!UaP~Z27b2ZpK3ZBMWrN3d#Bf)f8G*>aQ8h|^5&Z>>EC|<zxmDn z0v4&A^8SFBP!l4}5+MYdCDa6e+ulaix#s||;=y0?joCAK{k^r!x#^}(-(M0%o$~$D zIw8`P@Xo<I$C)Iti_OOl=c7R2!?-^dAh4juqKMlS1d9<6l-<pF&T;(2aS-MB@nc=S z|5SxP?NeeRiiCNk60y!<r%}KYD-j3;#0Y|55Wpg82~-eGFj!hzS_&S2?!u&tv%Pdu zQ~^DygM0TixlkwSH9+$OPc7nOzO{l{L98Mo7%OaT*ijH>9jjCA%>ZbAPq+Wuy3X?g zgU7(}3@d0-5Zf*JV{uXMgH0O?o~;f%pF;Oe08(~Wu&sOle<4T6979yakGdjav9TL< zNt_mtSkxxG`un#F?F%D+a@v<MPP+ymTBHFlzx=ElJylTSoM0kIV*SVqni3t!Q{ndZ z6MVF7Ymo`4^}N0}18}ki?BBnO#+@H~C+NVj&fS9u*3(`|oG%cc4=h{p%t_ki?xi>T z0H>iHJGgY|k9;y@e6r+(kwhR-#9BnX1N2Vu{w0r|1c2s~o8GN|0Ugi3`s#BuG<<{# zkcbn~TEsfFRxh|%MH6`Z>1BL+xU~ZSYI}PWpkowBx7%);<Fiuh!kq{ziEFL(AXs+p zZs4wm@9jjr)c@y85C%KjT3h$?SBuWU#<6#1nhSercx(J*2bX<sUKh`HTGG3TkT=n; zK-jfw3zyCv$ckToKgQ7`t!V7Dp?U9ae!lppTz1`MWaDf%0C=9zdo@7O9^!O)SziVW z7))tNITq*rEBaJWeMVLH&$iA9O7AuSH-*;KHg4>nv-0UiE|`9~OGN#MmPVy4`sQ`K z_S72s_wCntgi)t0z1jz)({G)bKuyhX9=iV(7w-I2RqE7##C!OPe*O9FBP+XjI630f zYXP7eCwSjItNmP`Q)BVDfNL!xE)5>ozmmIexwBITBVv)>Ooc_YQvfc$=(|)6I14K- z+#%}tK7xuxRh$F$TwuYRxeOjq-7(dcUhf1w*FWj})eG<RNsfXhs3cDK#E~G!1KiB5 zcxrs>x324dzynCW1YuCMIAN=;9YuB3(A?-b_NSis_;Ui1q;cM&V!86dxgBx=u{O7& z+>5DjaUh&AeL;bs>L)#{PkNGkhNp>J0P*3@h%m8kbTJPQpG5U;A7F|!VEnk*Ir^(& zy)C;D)fAX?CMZ#tBzbMAA2<0Vbe+FAom+I;eZWb7COT}`L?^7VeonxmM*PZ=xZU_9 zM-xC06#@~)4XrD3f|__j)O!J-L$+4YZ;-3*LcQRiegf1OMN~0rF$fm7f{O@(GQ7IB zh-9RI^=<$Pa)B_+pq}^yMi65WH~B}1n-X_3!JukU)B%GNw7TMqA_r@&J?-i6=><R( z2_P_k&b5@4^>t1SMT`*OOaT>y#MdGSiuESpIf8Mdr=q-1zN0|^DnuqctpI%Hm7%)2 zzo1W_L2TXnJaK%ii+j!kEPMBE;rQ`Ggkgq}Bc`C@=KhUwYGS-01Ws&B!S1eu!D-H> zPuzm$@TwXH^zF;hw&QHu*V5_x`<9fjVC)!wnhqb~rJXxZZ62euy|i?o&Ybyx-f~N< z)27|=rCA*PL4Ca*zWML;pJvo+zf9)T*9N1gAG2mX#;8#Xi6Z!D^I~3o<<@Rd9653( zXP!BUzz7EQtze80s9=m@5CYQH--j!L2#jFVU)S{5-=hM!=LD*(-MO8Odv<r*pGW3@ zT*#u)qcCy8ueNOAwzuCQ+X;#40KkY5*D!0=vVtN;c>3uv96sF8?F;A6e~8($ZYDG_ zp-G5LOlT~jiOHCRfS5=VcTE!l6B7{=k`SsTA|ce6KoWN>v2WcTX-udwp|$*M)vtME z%}d?(XLMyHYp=YbsI2x|Yu2!;rKM|sA~bR0PpGe7<`NU~l_e!5XMBcKI6r5nYV*@w zp1!8ZjEIZ#YSZM#XNH~(rCFb9S~BByvEt~m&lh^yDoaX8Yjn~Qn`dX#bJK_sodZx+ zHJfo`|31IGCHeIByz}nw*_)aG#QJ2$Gre>I)aIwO-S2{H9%b<hBWW^}V~19M{ECw2 z0b&U-J@)6G>C<!XH0hMOwcIy;JY)Lw>1YDer>|tlkgw+}MAI66U%lPfxSUn1uI}=M zwY8I}uB!9iT=K1P-k#jKldhwf)Cc%uJRveh3Dli4zM9IYuytQE4F~sk*_VI2<PyFy zbcipM^hMXX;_8@XjXU}N#~&Ae^MD}imxf>@gg`aFo^K3ipS_Ulub<88)z`6e=ZhU) z+T6UJ=H~VMDYr|959hIqE}}XNQJc8Yw>CHHZ2Zz&-!SM%gqn6gL(QNI!K6aFLWW$m zm>9~-1~Y&D3miMPop;~8mkk@1o_1<_s#_)qxOU<sZlC&R3@a}qw7#By&`+UjYR@7$ zqV;TnBP@ynGiSa+&7kvh-ajlVdrv=r$QMpW5i~Wu&ekm}*tUH&d-rbqLWCY)Q_BUz z&*t(`WB6LlAdHP&q_7F0O$cn>^A~?x5c8i+O?-Fbrmn-_^y&Y>u%Qb&fZz(H{f7=| znY^#?j7;LfUy!hW?*^KG_N=94?<V#g*vi3AcXIGh6WLR&EiNx9rM9w)A(aC;yLvEV zs|PWu<}5}J7(gTmkt8l;+JsQDPH;(x64#ofuzEa(IA%#>Be!q<xMwO{TRWE-^-C%5 zQ<eYrC(>NGd?s@Bey-Tb#qc1AJrId&0~g~X<6A698*%$#+S^-yQQL;vb|Qq50Lnt> zUy`Asw1f<nP%WWm39RD{p}J8H)s1qf2~iT~e~W7)8xtf6#>U?HS(=U>;d^V>@z$Y3 zr<M!U)h%Muq#rPFz?cG!Fa?$5N))65do3U)3@jlrk%@`0gkD1&0rI2<>w!rt#JrHc zMmQ2rj5Kz~;;;FCk<Zuy;^b97^rjFd34x7SzyARDee@Ck)!h8YB|{bcM>BTZjf@@h z9V#k^<V)T{bt4{n_D7Oqf}!z(cumL<6X3zZ-5ZG48c7^*IpO`W#zblzD@*~g)&Z6Z zD^BppCKyfl<j|))w|yJG+P;mZ&+rZ6Dc1>>l~qw!H;>_e!!KsUuvwf@S(8)!ocf!r zqrnuIMGB6(<H#gA+8bz`qry4*t6pQg1_U02KyA+9MG~{S^&syw?c~kfyLe$&Bgap% zRPGP@Zm@&T7(9i+)f1?x9?jtDQ4AVz76U75DT@pt){TA&0&)JFS|YMeGsFXw+IcFt zCfK-*=GMJyv>ZA>!+{pIA8cXs{uZ`$Lx#Rk0J_zf(!TWXQ$^qM3d&2$C@(3eB+9st zuYv%h7S#l?3E8-v6WQamW!pI1c9cWMkI)vkf36|*a|fWeZ(sSZ$NwKtb1Ky?`yH+T O0000<MNUMnLSTaV4;|b9 literal 3114 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 Ef~iHzYXATM diff --git a/game/modules/tome/data/gfx/talents/webs_of_fate.png b/game/modules/tome/data/gfx/talents/webs_of_fate.png index aa8e3b51b14f93486ce54eda5d39bbd305b43045..71803764fa6797423c5407f345ebfc34a873f96f 100644 GIT binary patch delta 5466 zcmV-g6{YH(DdsAWJ%0_?000fw0YWI7cmMzZ2XskIMF-vo7Y8#P2`qc1000#8Nkl<Z zc-q~Yd3?=B_s8F7?oD#DU1CWD^~4%QsipRvAhwEqsoH93DQ(qKRn<qeiax4#Y8SD^ znj)4Y2qLI`X;F=oPy|WHe&_ec)o30`+(g>f^ZHF*-`Dr%&VQVlb3QY3<}7ms(ENi% zM9}&l9WrNr{%HXI*NXAa4^3-zq;LUu_8kl4QNn{P8#k)iisJ4iQA&t^9EaJ(j79?* zi%w^6_)cOU-2=eh&YnIU`=QZn-@k>}hxY++GCAVp<c!(bjH`>wv$w1D?O^YK#gdNJ z7Bm*L#ezmZeScf0O#U)wB06I(MXYTkqgH3UwAR)K&4GwxT=^|3GXOPTZA1z8f6=f; zD`u~q$Zt1)$t1klxd6S|y@LqsJGz~qu#GgW-I{J~-ooDA9#P=aupOr^MB=}FIS=Dv zX<DZRq9Ee*kqiKyBqj1BDUo}z_p+T8N0TE3T+O(;xPM}Hal!23irLkb0<Nw&J2}#% zZUY=m_N1hwkerf&+0_LR%Ts}^i&_N85ZZ#aSSLzri2D8J^8joMTgmXAlTjjk^ww9b z-?NCrr}kzr<=dz$V(pc{J!=36iwq_#GMJY2+tS^)4|aC;)OxKBZ&a<r!Q&x_K_O^L z7JG%u*MBbByet!w5=l%-<o4Y=&(%3NIMAkPO9TrGR<9)FNO(q_$-x1$iwmwUE)+Do zVs>%G)zz5-F0Pa)=0W|MH2{rLDuX8D)79wnOkOyI#N;P{(6h}jdbfKoqhY=3Ef7(J zM(%o!seMOwGUT&9Z1{0CT7xJ>)4DB@r+?+VDu3kLp6%r0Yn@$X$Rs>KQgSkX+`rGY zs3=aJJ5T7*qio-^kJX#EWGG+}Av7Z5c>n+&#mDmLoc_ezi$;{9L3JO-4V-~nfufik z91(=$XT!5)Zr7ph3>@E`jX(O6mX?MnK^cU`wHq_6&v2YfPA?6BPm^YdL2>BVQJZO8 zoqwHaRJ%4JiWM6JNl8h~8UTQFOFCaK{eY7f!x0g@N|s~ls6_}MO1OUW$_ob!3f;n% z;Pr?oc=|N0+k&MtS2MKtFiZ}nJPBW@fE&f!JrEK0A3kI=U58dah!R8zn|B9is#Dn! zE#LAjoAxdTF<>+p5G7bF7MliCO3}09+kb#?_+&VNJJ%xuN`w{-eOUFKKZAP>#@^l` zR{+$hQ40}4iSX08Gd9z;Y}nAceUC;w&udPEAradMiP(m=ZaNG`BaPo^^}+%DTJ=Cs zD5Y4sZUKS2H_-F_E^G}B1QC=NXw$SU>*uaxP|rcw*%@sTq(+r$h*Dg>cFktt?SJj; zDB)QQ5yj!-Cu|3xgohVXKllNk`hF+`rK|$=>-;|bI*-V4&~`2S5G5Rp3?(Tg$$AuP zO~7`4dJgZ(_PtvWrO--f-?BX$7jC3~kNzlS$g$rtUS5b2F8%Ve%>Y!YP{FGF6#R7V zylnt<Yc+(=hRvm@n<t16b2pkr>wl&Z9TSB@XjaFUNhAJ~<$x7Rzlx*D2@&DPkj>B4 zTPzk<1+Jvqur37c+X13bB6RlkW81Po`gQM%63Kc}Jc}cu_&w&9%>a}u?S+UUB`uBQ zl$4wS5D`8dHlG&t{7_1GoE*=r6`wL`&U+j`AI{`CBZxc~jv$ov@@DQA{(rbSn=|jz z>J1SQ5|f^A<JOIA8B0%3W7)c;^cdEap#8fL1jInM_TAXAaw~6l>yxD)VL*5o|Hx(l zJU!eI1-I_p$y#6i`N5zJO#9HElJ2EZqKQ0vfDgaw$)#UUXChdzb{gw;E=9D$?Bd3P zDFKuz_3WIlQlaY8<1)e~27gmhQ(5f4h^|As6CAc1gR%<Rvr`XtuiZhPE<K+C@O0Za z*xP=J6fm1nO7ZAXe9i#8-}@`fE`?Dd1ngSK4}sIOKkp9&^39@8Fo;5lfiFM)o@RAh z1K{;ac|<9${PuIMG<<S$5_6Z&qs!o)>^-#KDlEd=-QOa3-F7<pc7Gt@aRLUVc%?*1 zoBMS%IU*>Ml9O@<z+`epM6qi7EJBZMe__WLuAXMpl)faUJV7B0?K7GI-QGn#J*NJ+ ze>+cS{gcEe%vwB~ZtwIY^l+%PKV@L}z+srpW)MaF+I4c#qXs3}Dp>W`vwP3s^&CDG zY;)K59^7T<gl_zP=YIwwf^RcFv{IlTG4aVuS$qkP6PP~lTe`l}i?G87Py$LB5Cs*> zmZN(|KidFJN=Av`?Cg{?0Cq+Pf)8)VHKS?i>3lqOFyY7dBN$K!f&qiUNPd(@adAwY zJ)KF@zqHyGqEJeBZ_r@&ZrV!c_U&_~fAk1Zio%5o<qSY-T7NQ=-&>q#MvD|G`gE48 z7T=d+XHm|}J6}NfSIJULoiG^`Xf%h89YdionM`~*bU1rA1@fkE+bn5s-MIrIyi&Y) z&H#u~6e{S!@LvDUHG|V9ET*z|4N!`RQ%4X{7?hE3CoQC9qc$%kypy9NOJ^^(hSDsW zo<jyO@#}xneSb(ljvkLh2{<}AGj`-i_67#hv32WA^w)1hqeL(ojhIZ&pB@HaGJr>+ z5|s0LjS?PSJdD3b)U97^V(^O(zr(vsCBz_X-4noqRWsRtWH+svw8P%cj=D7(QqWwG z6K9U)34r-C=HOAdC?Z0icLx%4=k`+_@tC~_LJ1BH!GEh%DM}VEj>+DRhV|;v)2|cv zV()YH*XulZ_>lg+dji6l3m3Q<6O%On7q6Y9`l}6bGZ&_MrTRpk4JH0b&IZTeULR4v zMl+Nswgm^Udh?>En*1?acdw_x8_g(aE`WErSE=z@E%qGPnJeL2HTA)-T_;2dQ@@+W zsdJ~FYkw1;kU((Ae)b(WNLep0N_ZB-WOATsgZgys(1B~$f1_IE%D6f^^C&KkV<&&g zJ}7E5*s<V?-PjxLNlJafyPx}J>jBoS-jt7rPC*0?pV-HLmVA+Ay9p!zO~cwv5D^~4 z-Dl{Sw~0@Pw+VpY4ZCo1G;!hb1%{0oVG~W+(tlozA2o_<RVrKKh<}E~v?ez80qy&| zmGue$uxJaXFCC_NeLw8%?WtPf4Z<RWo)1geoA`F(3Pglke?&9s+mYEabm&+pscC6c zuUZQylZoyfdvolkXEDNT10PL&XxZ2rQyewnBjV!YYy#lH!-wqH9n8TaN2yS*9PUMm zJbyEa98KK1eVeP-uV)PaKwQEDo+QRotztcj7V<!efs0o&FPl$?e@ij<5{ME;OzcHU zYI4p-)6ZwQeB}Z@jeSu{(XQ2--2NkmU!$&OOEdocakv*L!i8Th;lC*$*Sh0=Y%JS$ z?c(V1<Gfm-0!0fIMt~;u>vJ#mK0jZ*nt#1FxF>ugXD&yeMbX7~02Rwtd*+gssz}vJ zZves%>t>Pg#I~6^c{Y;1BfF85l88e1WaLCfzVl($v3jE&l`2+7lwxzx=9fA}E?oYZ zx8EC1!js2{Qi#f&n8`LCF!P7e#Kp&=Me)U`g*Z7n1Mpto2`ChCj~}u#WK*t~xqtIV z44ntGB|7E?D8a8?SLS@Z;JJ3SUa$3(Sw+a9121hyj2$@wv#S|V!i>4|xO4ZeZ4seQ zzwM6!L6l<JxRn$sRE*NEcq5`%>^~z<%%rBJ(tl(x!jByUWu$85>TFpVgsY2dMw{2G zR6`UzihD?EYRXFqU$jVJdiePvB7bb!7DV8VpiC!0jsV0yy35R^;}NAO?oo<4lQ$wF zq^2ix^rz65Vr<g1@htOSfKrMgg$olD5KQ?pR=2uBIcpT>{G|&oJ^Noy_!JREy2Zlu zIdgIs69kAn6Ux5BTMz`3gCj~5LHpL{i;25>!wNqBd=v&{#Lj5Ps`+bZ+JCSaMT@v2 zqKLT@^HTkn@bski8#NInd^7v|oK4}J$|C=-NO%&DR)7-DT#C%MM8~m{N9i)46N$-5 zAi}gs(<xWF0wOBQ%usI1sCS2=M3Iu3#^#`)ya7<QR3+w5*^b%O4W$(#igClg$=3{R z%$=L~c5gxSO{-gNFj_sn$A6C>=RNCdG~(;i3Q@wsWy`V;;b&K2XS8R`;F-*ruoh4E zQULrCbq<AKc5&m&u?zAQgp`yNx)1C^+~asetZwh%enT=T$J~@|ovbFbh+_5n4Y>oL z=4(w@J1c^^HGB{e;u0P(dDgp(o!XBzTjwJ{^(yu0(yo8L0Z_eaO@9vjcmy|dL6i~@ z@bvH`EGUEu<#L}}e6wv^1R>&hBxz}BwgWJ@$3(^roozjbMeyG`hkm1*apsaW$hm&U zV$NSVg%aVNULR4uOr@6=e#(StES|LtCnqOF2|;^)Wc=iD)?9?qo{cLv(6*ItuKKK2 zwTd+~zh`fb?J_w-Uw@2Tj(6GDQ3m0Ud(lk%&j23A-ODmOy=l>5TwGj9x1`}WupY@N zNx2r>t$-V=7j2-JyC;Z+yZ7$!-smA*zhSl2Unx<NO{)TNbTlDKvns%!8M9w(f7Gj8 zo8=4UqqU}Xv*yId$G><5d^~U#6-rlo>fP;P#N-ZH3jb%8=YRdrdVna5MtkN=U7Ks+ z%a`>gc=I9LixvZcH5*pp+s!9Kc!21ezthOKG0``p0Y(4beOa+^=?nX=UCU}o#>L0y zD10UW3Yx86Q&7k%X0Q0<g@fF>6V1$p6A%%~dR1h^pigZUzH-Ia@L#mWn&?ypMvNK4 zcME1_qa2fI*MF@&2M!-Zlu)Nu9m00)!zBmhShY%JMBvofb1&rOFCj4@EOI-mx6ZOz zki7@C5q4xJq7+@)_N88}rZ1!^Rnm)P^EQBjwA6Gu^lC}Oi6bwh8!>tW^Or0{l;Gjv zL1gG5yvvu*vaNUd@`xxd+mJ*2OIX~%$@95)Jf_b6n14HWZ(03?iHj)YRyf<XCX<PP zB|9)E1!y|-YC+6x+w**L7tiC}4~Anf7_oD(XXmDEv~T--FtoU*C!!QlH==C^AU!>u zu5E_oNsA91(-~0$A}pPieNtu7EPotK);j?`26W_J?A=_C6?!lXpAM}_PEJ7^gzsm3 z%Y-pwGk+;)lr`ac`;R-e0{|MY65e<eDVb}g;^H4N`tyD$5!{P-F!i(f&$a2?p%+yu zRz-<0W#&Y#M_nVYCF;fvYBj3MjT_O32!jU>WZlYD02Fd_%K#zv!Gm0E0TDpx+<H)+ zm^yL#2mxD`fP&`rTjSTR*R!yb!N?~cP61JzIDZ|<wjVdXwC#|TltlBktq3`I08v7{ zx^;*+7>0Y%q8aJA#Ka`q0XTj6D2S$c-A;LCYX0)+{CxEy2#g;&6|Yid0r=qEPY|&h zR--2l%U2V6(6FJ*o;MGr6vaI~*}Y?X#&)#jN>2s=JN7TnxMAtrq*tC98uC$RQc_Y8 zgMVVx{2kcY+0nc6AVd^vH?FWbBAlBt>-+B+FmxCOWx$|RhA&|-7;Fb1G5HBUT?j`b z__Z07XJ*pU(ik|(x{92foC(`@4lxKy33Gp#!QWN(h3uz&m#$A8AnT2=fp7QCjS_@y z`<5f3DQqrE#j@4&#E4P`($Z20IkX!Q!GGjry)JX$@II1~68{$AhYTFV;m|O4ZruW+ zGUAB?`}Zec<;tAh=D+@P`PWm#KDtj4x1w}uGl;44Y)eM8Xw;sDbz1U9jRq7cR1`5N z49e<ihys)%{K)=%7yOek<9L7gd)Awy2w*`Fu3f)MTzov$s=P*{2K705APk?j?SDwf zBEIn4b$Q<=y?Cd`c$7itJ*pmwNm&OaUM*jZzTHO9;EiS|gEfF53e?l({^zo{ey<SG zG;C9e_*~rY$*weO(u`$`mf&Erx86SlcJJHEnzd`$yZ;%`V@H3)sNuu0q^FabmP+dm zZ*t}8)tmtU2%LWgF$kM>E@thvxqq46%*u86Xvh>w7WcBcs|HX?xOU?*Cr*WP;>;0# zjrxT@?pot{h24r05_ASp!p)o4@$FjwrG)=(=6Cey(hU)?2m}PI;qx!2kdTm&W&74X zJ}g_b5N)wul^;4{1Uvuhwy6H^XZYJ+=q-!R>J9TxW_(xBTu6UEWrN-maDQ3v+whCt zzwwF=Ty{ivY2QyfIXdgC`uX!|-nflEcl4IN5E-Mtp8S1|ZL@m}27?aW6RKmb-_p0E zVsym8qq@{9rEH=tTc(Wu_0mQC`?ae&`sx+!)4cg#>z^m^bT6g1E;_5XEjg!aRc);O z+6>S;S6$M(*Id?n0)EzO=6{6fn$;TQN`TMCPSY16Z|h4Z?&uD_opVL&;9$}}MV!$w zQMdK&sM~tx*VA(ipp%o6jyP~Y|9<V7?$y0}#`l@FfT#PvC|RsD_Vx}8>-`yKbHU8} zT42V)afF2L$kX!OzV0C9%XuRPp+&oz+`RQ-XT@kVay<ML#frJ3M1M18!Z=p>ugvon z3Rty@UBSVu^7qfI1E!DLfLF=#D5b1ID|xoZ4T>|DjxuS+P}0)V@;tbsqZ7x&u3%?p zM|{FVYBhdwtS@Zu5h{9@2MxpCAHvq{TV7g;7Weez*3*j;>aPZjJhcTgP8DVS3Cfv^ z$Cxl}&`Svq)|+F!2Y+<{GzAK{vHFL=9NRBhumbN2-heP};@Er<9>@?rlM-xDvyCq9 z?v-iZyxrvk9klF%{&D5SJSnd1o?(MN&{xjh)mP8m)5G2wm1Ud0z5D5ys91gb#smG; zlyCBN{Qr8guXJ%T>mAE4=pR>J(Cu3E%-4a}EZwTFoxi8AUw^!>t5&I=SqXcV&@oXD z_3axEb#T!Bzf*XfV`eDfNgSuo9|45!9f#zr75CPlPQ=AO0)#E=c4xZ56%@D!r38!C zbnMcOzq7nBHMVi*5&%337stD7)qEZN&2G&>G)6mnf&xPT7(ZqbB}%@6h=Cq`I+2{5 z#NS<BxJ&}(g@5baYcA=}N6*doCD`8APe=V6tD~<x&<nm_rel7K)3<NL>3Opk|E)_u zOFJOD;@74>L*E*QC`HEsualgdd#}#f$%S%dz40nl22alt6fNwITcJXjU0rF`)CYSz zJF8D&fb{fKN|q_YKT&J~z~0V*cl&)xdRiI>kL}{@rBmZJb#62osa>N1b!#`Ga3Oar z>8YgabS##1tCuJWrO5b2niA`c)g3#xax^0Re+Pj7&qe*OF=R^^D?iKs0UY*sDo)_T Qp8x;=07*qoM6N<$f+5?ZJpcdz delta 5264 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 Wrl@UQ<-Py_00{s|MNUMnLSTXiAV`z| diff --git a/game/modules/tome/data/gfx/talents/wormhole.png b/game/modules/tome/data/gfx/talents/wormhole.png index 1f85b3fcaee1b4ee5778908cc7fcece7f986d607..f34fe5e73422a3183267fb223ba0587eb145e655 100644 GIT binary patch literal 4506 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 literal 5568 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 O0000<MNUMnLSTZyR%$f> diff --git a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua index cb7fe1773c..93bca69176 100644 --- a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua +++ b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua @@ -29,12 +29,13 @@ newTalent{ reflectable = true, requires_target = true, proj_speed = 5, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self, t)) end, getDamageStat = function(self, t) return 2 + math.ceil(t.getDamage(self, t) / 15) end, action = function(self, t) local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="temporal_bolt"}} local x, y = self:getTarget(tg) if not x or not y then return nil end + self:projectile(tg, x, y, DamageType.CLOCK, self:spellCrit(t.getDamage(self, t))) game:playSoundNear(self, "talents/spell_generic2") @@ -64,7 +65,7 @@ newTalent{ } newTalent{ - name = "Temporal Fugue", + name = "Temporal Fugue Old", type = {"chronomancy/age-manipulation", 2}, require = chrono_req2, points = 5, @@ -114,7 +115,7 @@ newTalent{ target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 135, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 135, getParadoxSpellpower(self, t)) end, getDuration = function(self, t) return 5 + math.ceil(self:getTalentLevel(t)) end, direct_hit = true, requires_target = true, @@ -163,7 +164,7 @@ newTalent{ return nb end }, is_heal = true, - getHeal = function(self, t) return self:combatTalentSpellDamage(t, 40, 440, getParadoxSpellpower(self)) end, + getHeal = function(self, t) return self:combatTalentSpellDamage(t, 40, 440, getParadoxSpellpower(self, t)) end, getRemoveCount = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5, "log")) end, action = function(self, t) self:attr("allow_on_heal", 1) diff --git a/game/modules/tome/data/talents/chronomancy/anomalies.lua b/game/modules/tome/data/talents/chronomancy/anomalies.lua index 7636f689e2..270b3e9c16 100644 --- a/game/modules/tome/data/talents/chronomancy/anomalies.lua +++ b/game/modules/tome/data/talents/chronomancy/anomalies.lua @@ -25,37 +25,37 @@ local Object = require "engine.Object" local Trap = require "mod.class.Trap" -- All anomaly damage functions come from here with a bit of randomness thrown in to mix it up -getAnomalyDamage = function(self) - local dam = self:combatScale(getParadoxSpellpower(self), 20, 10, 220, 100, 0.75) +getAnomalyDamage = function(self, t) + local dam = self:combatScale(getParadoxSpellpower(self, t), 20, 10, 220, 100, 0.75) return rng.avg(dam / 3, dam, 3) end -getAnomalyDamageAoE = function(self) - local dam = self:combatScale(getParadoxSpellpower(self), 10, 10, 50, 100, 0.75) +getAnomalyDamageAoE = function(self, t) + local dam = self:combatScale(getParadoxSpellpower(self, t), 10, 10, 50, 100, 0.75) return rng.avg(dam / 3, dam, 3) end -- Here we have Effect Power and Anomaly duration, similar to damage but less random -getAnomalyEffectPower = function(self) - local dam = self:combatScale(getParadoxSpellpower(self), 10, 10, 50, 100, 0.75) +getAnomalyEffectPower = function(self, t) + local dam = self:combatScale(getParadoxSpellpower(self, t), 10, 10, 50, 100, 0.75) return math.ceil(rng.avg(dam / 2, dam, 3)) end -getAnomalyDuration = function(self) - local dam = self:combatScale(getParadoxSpellpower(self), 4, 10, 12, 100, 0.75) +getAnomalyDuration = function(self, t) + local dam = self:combatScale(getParadoxSpellpower(self, t), 4, 10, 12, 100, 0.75) return math.ceil(rng.avg(dam / 2, dam, 3)) end -- Determines the anomaly range based on current spellpower -- Generally we just use range = 10 for anomalies, this is for stuff with much longer range (such as teleports) -getAnomalyRange = function(self) - local range = math.floor(self:combatLimit(getParadoxSpellpower(self), 80, 20, 20, 40, 100)) +getAnomalyRange = function(self, t) + local range = math.floor(self:combatLimit(getParadoxSpellpower(self, t), 80, 20, 20, 40, 100)) return range end -- Determines the anomaly radius based on current spellpower -getAnomalyRadius = function(self) - local radius = math.floor(self:combatLimit(getParadoxSpellpower(self),8, 2, 20, 6, 100)) +getAnomalyRadius = function(self, t) + local radius = math.floor(self:combatLimit(getParadoxSpellpower(self, t), 6, 2, 20, 4, 100)) return radius end @@ -102,7 +102,7 @@ end -- For this to work all anomalies have to have no_energy set to true in the talent table, otherwise it will use two turns checkAnomalyTargeting = function(self, t, tg) local x, y = self.x, self.y - if self:knowTalent(self.T_BIAS_WEAVE) and rng.percent(self:callTalent(self.T_BIAS_WEAVE, "getTargetChance")) then + if self:knowTalent(self.T_BIAS_WEAVE) and rng.percent(self:callTalent(self.T_BIAS_WEAVE, "getTargetChance")) and not self:attr("anomaly_forced_target") then if self == game.player then game.bignews:saySimple(180, "#STEEL_BLUE#Targeting %s", t.name) end @@ -121,12 +121,6 @@ end -- Check for effects when hit by an anomaly -- This is called before immunity is checked checkAnomalyTriggers = function(self, target) - if target:knowTalent(target.T_WEBS_OF_FATE) then - target:forceUseTalent(target.T_WEBS_OF_FATE, {ignore_cd=true, ignore_energy=true, ignore_ressources=true}) - end - if target:knowTalent(target.T_SEAL_FATE) then - target:forceUseTalent(target.T_SEAL_FATE, {ignore_cd=true, ignore_energy=true, ignore_ressources=true}) - end if target:hasEffect(target.EFF_TRIM_THREADS) then local eff = target:hasEffect(target.EFF_TRIM_THREADS) eff.src:callTalent(eff.src.T_TRIM_THREADS, "doAnomaly", target, eff) @@ -142,9 +136,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -186,9 +180,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, - range = function(self, t) return getAnomalyRange(self) end, - radius = function(self, t) return getAnomalyRadius(self) end, + cooldown =0, + range = function(self, t) return getAnomalyRange(self, t) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -231,9 +225,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -244,7 +238,7 @@ newTalent{ action = function(self, t) local tg = self:getTalentTarget(t) local x, y = checkAnomalyTargeting(self, t, tg) - local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t), true) + local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRange(t), true) -- Randomly take targets if #tgts <= 0 then return nil end @@ -286,9 +280,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -309,7 +303,7 @@ newTalent{ checkAnomalyTriggers(self, self) if a:canBe("anomaly") then - self:setEffect(self.EFF_DISPLACEMENT_SHIELD, getAnomalyDuration(self)*2, {power=getAnomalyDamage(self)*4, target=a, chance=50}) + self:setEffect(self.EFF_DISPLACEMENT_SHIELD, getAnomalyDuration(self, t)*2, {power=getAnomalyDamage(self, t)*4, target=a, chance=50}) end game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport") @@ -319,7 +313,7 @@ newTalent{ end, info = function(self, t) return ([[50%% chance that damage the caster takes will be warped to a set target. - Once the maximum damage (%d) is absorbed, the time runs out, or the target dies, the shield will crumble.]]):format(getAnomalyDamage(self)*2) + Once the maximum damage (%d) is absorbed, the time runs out, or the target dies, the shield will crumble.]]):format(getAnomalyDamage(self, t)*2) end, } @@ -331,7 +325,7 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, direct_hit = true, no_energy = true, @@ -356,7 +350,7 @@ newTalent{ image = "terrain/wormhole.png", display = '&', color_r=255, color_g=255, color_b=255, back_color=colors.STEEL_BLUE, message = "@Target@ moves onto the wormhole.", - temporary = getAnomalyDuration(self), + temporary = getAnomalyDuration(self, t), x = start_x, y = start_y, canAct = false, energy = {value=0}, @@ -364,12 +358,12 @@ newTalent{ summoned_by = self, -- "summoner" is immune to it's own traps triggered = function(self, x, y, who) if who == self.summoned_by or who:canBe("teleport") then - -- since we're using a precise teleport we'll look for a free grid first - local tx, ty = util.findFreeGrid(self.dest.x, self.dest.y, 5, true, {[engine.Map.ACTOR]=true}) - if tx and ty then - if not who:teleportRandom(tx, ty, 0) then - game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize()) - end + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + if not who:teleportRandom(self.dest.x, self.dest.y, 3, 1) then + game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize()) + elseif who ~= self.summoned_by then + who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power}) + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") end else game.logSeen(who, "%s ignores the wormhole.", who.name:capitalize()) @@ -423,9 +417,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -444,7 +438,7 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(a.EFF_PROBABILITY_TRAVEL, getAnomalyDuration(self)*2, {power=getAnomalyDuration(self)}) + a:setEffect(a.EFF_PROBABILITY_TRAVEL, getAnomalyDuration(self, t)*2, {power=getAnomalyDuration(self, t)}) game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport") game:playSoundNear(self, "talents/spell_generic") @@ -454,7 +448,7 @@ newTalent{ end, info = function(self, t) return ([[Allows up to five targets in a radius of %d to travel up to %d tiles through walls.]]): - format(getAnomalyDuration(self)*2, getAnomalyDuration(self)) + format(getAnomalyDuration(self, t)*2, getAnomalyDuration(self, t)) end, } @@ -466,9 +460,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -487,7 +481,7 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(a.EFF_BLINK, getAnomalyDuration(self)*2, {power=getAnomalyDuration(self)}) + a:setEffect(a.EFF_BLINK, getAnomalyDuration(self, t)*2, {power=getAnomalyDuration(self, t)}) game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport") game:playSoundNear(self, "talents/spell_generic") @@ -497,7 +491,7 @@ newTalent{ end, info = function(self, t) return ([[Up to five targets in a radius of %d are teleporting %d tiles every turn.]]): - format(self:getTalentRadius(t), getAnomalyDuration(self)) + format(self:getTalentRadius(t), getAnomalyDuration(self, t)) end, } @@ -509,16 +503,16 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, requires_target = true, no_energy = true, target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} end, - getSummonTime = function(self, t) return math.ceil(getAnomalyDuration(self)*2) end, + getSummonTime = function(self, t) return math.ceil(getAnomalyDuration(self, t)*2) end, message = "Some innocent bystanders have been teleported into the fight.", action = function(self, t) local tg = self:getTalentTarget(t) @@ -618,16 +612,16 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} end, - getSlow = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self)) / 100) end, + getSlow = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self, t)) / 100) end, message = "@Source@ creates a bubble of slow time.", action = function(self, t) local tg = self:getTalentTarget(t) @@ -641,7 +635,7 @@ newTalent{ checkAnomalyTriggers(self, a) if a:canBe("anomaly") then - a:setEffect(a.EFF_SLOW, getAnomalyDuration(self), {power=t.getSlow(self, t), no_ct_effect=true}) + a:setEffect(a.EFF_SLOW, getAnomalyDuration(self, t), {power=t.getSlow(self, t), no_ct_effect=true}) end game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y}) game:playSoundNear(self, "talents/spell_generic") @@ -662,16 +656,16 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), nowarning=true} end, - getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self)) / 100) end, + getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self, t)) / 100) end, message = "@Source@ creates a bubble of fast time.", action = function(self, t) local tg = self:getTalentTarget(t) @@ -684,7 +678,7 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(a.EFF_SPEED, getAnomalyDuration(self), {power=t.getHaste(self, t)}) + a:setEffect(a.EFF_SPEED, getAnomalyDuration(self, t), {power=t.getHaste(self, t)}) game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y}) game:playSoundNear(self, "talents/spell_generic") end @@ -705,9 +699,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -727,7 +721,7 @@ newTalent{ checkAnomalyTriggers(self, a) if a:canBe("anomaly") and a:canBe("stun") then - a:setEffect(a.EFF_STUNNED, getAnomalyDuration(self)/2, {no_ct_effect=true, apply_power=getParadoxSpellpower(self)}) + a:setEffect(a.EFF_STUNNED, getAnomalyDuration(self, t)/2, {no_ct_effect=true, apply_power=getParadoxSpellpower(self, t)}) end game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y}) game:playSoundNear(self, "talents/spell_generic") @@ -749,9 +743,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -771,7 +765,7 @@ newTalent{ checkAnomalyTriggers(self, a) if a:canBe("anomaly") then - a:setEffect(a.EFF_TIME_PRISON, getAnomalyDuration(self), {no_ct_effect=true}) + a:setEffect(a.EFF_TIME_PRISON, getAnomalyDuration(self, t), {no_ct_effect=true}) end game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y}) game:playSoundNear(self, "talents/spell_generic") @@ -793,9 +787,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -814,7 +808,7 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(a.EFF_TIME_SHIELD, getAnomalyDuration(self), {power=getAnomalyDamage(self)*4, dot_dur=5, time_reducer=40}) + a:setEffect(a.EFF_TIME_SHIELD, getAnomalyDuration(self, t), {power=getAnomalyDamage(self, t)*4, dot_dur=5, time_reducer=40}) game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y}) game:playSoundNear(self, "talents/spell_generic") end @@ -835,9 +829,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -856,7 +850,7 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(a.EFF_INVIGORATE, getAnomalyDuration(self), {power=getAnomalyEffectPower(self)/10}) + a:setEffect(a.EFF_INVIGORATE, getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)/10}) game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y}) game:playSoundNear(self, "talents/spell_generic") end @@ -877,9 +871,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -893,20 +887,22 @@ newTalent{ local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t)) -- Randomly take targets - if #tgts <= 0 then return end + if #tgts <= 0 then return true end local a, id = rng.table(tgts) table.remove(tgts, id) checkAnomalyTriggers(self, a) local x, y = util.findFreeGrid(a.x, a.y, 3, true, {[Map.ACTOR]=true}) if not x then - return + return true end if a:attr("summon_time") then return end - local m = makeParadoxClone(self, a, getAnomalyDuration(self)*2) + local m = makeParadoxClone(self, a, getAnomalyDuration(self, t)*2) m.ai_state = { talent_in=2, ally_compassion=10} game.zone:addEntity(game.level, m, "actor", x, y) game.level.map:particleEmitter(x, y, 1, "generic_teleport", {rm=60, rM=130, gm=20, gM=110, bm=90, bM=130, am=70, aM=180}) + + return true end, info = function(self, t) return ([[Clones a random creature within range.]]):format() @@ -921,9 +917,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown = 0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -937,8 +933,8 @@ newTalent{ -- Add a lasting map effect game.level.map:addEffect(self, - x, y, getAnomalyDuration(self), - DamageType.TEMPORAL, getAnomalyDamageAoE(self), + x, y, getAnomalyDuration(self, t)/2, + DamageType.TEMPORAL, getAnomalyDamageAoE(self, t), tg.radius, 5, nil, engine.MapEffect.new{alpha=85, color_br=200, color_bg=200, color_bb=0, effect_shader="shader_images/paradox_effect.png"}, @@ -947,8 +943,10 @@ newTalent{ return true end, info = function(self, t) - return ([[Creates a temporal storm for %d turns that deals %d temporal damage each turn.]]) - :format(getAnomalyDuration(self), damDesc(self, DamageType.TEMPORAL, getAnomalyDamageAoE(self))) + local duration = self:combatScale(getParadoxSpellpower(self, t), 4, 10, 12, 100, 0.75)/2 + local damage = self:combatScale(getParadoxSpellpower(self, t), 10, 10, 50, 100, 0.75) + return ([[Creates a temporal storm for %d to %d turns that deals between %0.2f and %0.2f temporal damage each turn.]]) + :format(duration/2, duration, damDesc(self, DamageType.TEMPORAL, damage/3), damDesc(self, DamageType.TEMPORAL, damage)) end, } @@ -961,9 +959,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1005,9 +1003,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1037,7 +1035,7 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, radius = 1, direct_hit = true, @@ -1070,7 +1068,7 @@ newTalent{ show_tooltip = true, block_move = true, block_sight = true, - temporary = getAnomalyDuration(self), + temporary = getAnomalyDuration(self, t), x = x + i, y = y + j, canAct = false, act = function(self) @@ -1113,9 +1111,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1146,7 +1144,7 @@ newTalent{ if not target.talents_cd[tid] and t.mode == "activated" and not t.innate then tids[#tids+1] = t end end for i = 1, rng.avg(3, 6, 3) do - local power = getAnomalyDuration(self) + local power = getAnomalyDuration(self, t) local t = rng.tableRemove(tids) if not t then break end target.talents_cd[t.id] = rng.range(2, power) @@ -1160,7 +1158,7 @@ newTalent{ end, info = function(self, t) return ([[Places between three and six talents of up to 5 targets in a radius %d ball on cooldown for up to %d turns.]]): - format(getAnomalyRadius(self), getAnomalyDuration(self)) + format(getAnomalyRadius(self, t), getAnomalyDuration(self, t)) end, } @@ -1172,9 +1170,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1195,7 +1193,7 @@ newTalent{ checkAnomalyTriggers(self, a) if a:canBe("anomaly") and a:canBe("pin") then - a:setEffect(self.EFF_PINNED, getAnomalyDuration(self), {apply_power=getParadoxSpellpower(self)}) + a:setEffect(self.EFF_PINNED, getAnomalyDuration(self, t), {apply_power=getParadoxSpellpower(self, t)}) end end @@ -1216,9 +1214,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1231,8 +1229,8 @@ newTalent{ local x, y = checkAnomalyTargeting(self, t, tg) -- Don't bury the player - if self ~= game.player and not game.player:knowTalent(game.player.T_DIG_OBJECT) then - return + if not game.player:knowTalent(game.player.T_DIG_OBJECT) then + return true end self:doQuake(tg, x, y) @@ -1240,50 +1238,7 @@ newTalent{ end, info = function(self, t) return ([[Causes an earthquake in a radius of %d.]]): - format(getAnomalyRadius(self)) - end, -} - -newTalent{ - name = "Anomaly Calcify", - type = {"chronomancy/anomalies", 1}, - anomaly_type = "physical", - type_no_req = true, - no_unlearn_last = true, - points = 1, - paradox = 0, - cooldown = 1, - range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, - direct_hit = true, - no_energy = true, - requires_target = true, - target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} - end, - message = "@Source@ calcifies several targets.", - action = function(self, t) - local tg = self:getTalentTarget(t) - local x, y = checkAnomalyTargeting(self, t, tg) - local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t)) - - -- Randomly take targets - for i = 1, rng.avg(1, 5, 3) do - if #tgts <= 0 then break end - local a, id = rng.table(tgts) - table.remove(tgts, id) - checkAnomalyTriggers(self, a) - - if a:canBe("anomaly") and a:canBe("stun") and a:canBe("stone") and a:canBe("instakill")then - a:setEffect(a.EFF_STONED, getAnomalyDuration(self), {apply_power=getParadoxSpellpower(self)}) - game.level.map:particleEmitter(a.x, a.y, 1, "archery") - end - end - return true - end, - info = function(self, t) - return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns.]]): - format(getAnomalyRadius(self), getAnomalyDuration(self)) + format(getAnomalyRadius(self, t)) end, } @@ -1295,9 +1250,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1317,14 +1272,14 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(self.EFF_FLAWED_DESIGN, getAnomalyDuration(self), {power=getAnomalyEffectPower(self)}) + a:setEffect(self.EFF_FLAWED_DESIGN, getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)}) game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport") game:playSoundNear(self, "talents/spell_generic") end return true end, info = function(self, t) - return ([[Reduces the resistances of up to five targets in a ball of radius %d by %d%%.]]):format(self:getTalentRadius(t), getAnomalyEffectPower(self)) + return ([[Reduces the resistances of up to five targets in a ball of radius %d by %d%%.]]):format(self:getTalentRadius(t), getAnomalyEffectPower(self, t)) end, } @@ -1336,9 +1291,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1351,7 +1306,7 @@ newTalent{ local x, y = checkAnomalyTargeting(self, t, tg) local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRange(t)) - local dam = getAnomalyRadius(self) -- not a typo, very low damage since this isn't a major anomaly + local dam = getAnomalyRadius(self, t) -- not a typo, very low damage since this isn't a major anomaly -- Randomly take targets for i = 1, rng.avg(3, 6, 3) do @@ -1398,9 +1353,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1412,7 +1367,7 @@ newTalent{ local tg = self:getTalentTarget(t) local tgts = getAnomalyTargets(self, t, self.x, self.y, "ACTOR", self:getTalentRange(t)) - local movedam = self:spellCrit(getAnomalyDamageAoE(self)) + local movedam = self:spellCrit(getAnomalyDamage(self, t)) -- Randomly take targets for i = 1, rng.avg(3, 6, 3) do @@ -1448,6 +1403,49 @@ newTalent{ end, } +newTalent{ + name = "Anomaly Calcify", + type = {"chronomancy/anomalies", 1}, + anomaly_type = "major", + type_no_req = true, + no_unlearn_last = true, + points = 1, + paradox = 0, + cooldown =0, + range = 10, + radius = function(self, t) return getAnomalyRadius(self, t) end, + direct_hit = true, + no_energy = true, + requires_target = true, + target = function(self, t) + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} + end, + message = "@Source@ calcifies several targets.", + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y = checkAnomalyTargeting(self, t, tg) + local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t)) + + -- Randomly take targets + for i = 1, rng.avg(1, 5, 3) do + if #tgts <= 0 then break end + local a, id = rng.table(tgts) + table.remove(tgts, id) + checkAnomalyTriggers(self, a) + + if a:canBe("anomaly") and a:canBe("stun") and a:canBe("stone") and a:canBe("instakill")then + a:setEffect(a.EFF_STONED, getAnomalyDuration(self, t), {apply_power=getParadoxSpellpower(self, t)}) + game.level.map:particleEmitter(a.x, a.y, 1, "archery") + end + end + return true + end, + info = function(self, t) + return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns.]]): + format(getAnomalyRadius(self, t), getAnomalyDuration(self, t)) + end, +} + newTalent{ name = "Anomaly Call", type = {"chronomancy/anomalies", 1}, @@ -1456,9 +1454,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 50, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1499,16 +1497,16 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, target = function(self, t) return {type="hit", range=self:getTalentRange(t), talent=t} end, - getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self)) / 100) end, + getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self, t)) / 100) end, message = "The odds have tilted.", action = function(self, t) local tg = self:getTalentTarget(t) @@ -1520,15 +1518,15 @@ newTalent{ table.remove(tgts, id) checkAnomalyTriggers(self, a) - a:setEffect(self.EFF_SPEED, getAnomalyDuration(self), {power=t.getHaste(self, t)}) - a:setEffect(self.EFF_REGENERATION, getAnomalyDuration(self), {power=getAnomalyEffectPower(self)}) - a:setEffect(self.EFF_PAIN_SUPPRESSION, getAnomalyDuration(self), {power=getAnomalyEffectPower(self)}) + a:setEffect(self.EFF_SPEED, getAnomalyDuration(self, t), {power=t.getHaste(self, t)}) + a:setEffect(self.EFF_REGENERATION, getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)}) + a:setEffect(self.EFF_PAIN_SUPPRESSION, getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)}) game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport") game:playSoundNear(self, "talents/spell_generic") return true end, info = function(self, t) - return ([[Substantially toughens and hastes one target for %d turns.]]):format(getAnomalyDuration(self)) + return ([[Substantially toughens and hastes one target for %d turns.]]):format(getAnomalyDuration(self, t)) end, } @@ -1540,9 +1538,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1558,7 +1556,7 @@ newTalent{ return end if self:attr("summon_time") then return end - local m = makeParadoxClone(self, self, getAnomalyDuration(self)*2) + local m = makeParadoxClone(self, self, getAnomalyDuration(self, t)*2) game.zone:addEntity(game.level, m, "actor", x, y) m.faction = "enemies" m.summoner = nil @@ -1569,7 +1567,7 @@ newTalent{ return true end, info = function(self, t) - return ([[Clones the caster.]]):format(getAnomalyDuration(self)) + return ([[Clones the caster.]]):format(getAnomalyDuration(self, t)) end, } @@ -1581,9 +1579,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1607,7 +1605,7 @@ newTalent{ return end if a:attr("summon_time") then return end - local m = makeParadoxClone(self, a, getAnomalyDuration(self)*2) + local m = makeParadoxClone(self, a, getAnomalyDuration(self, t)*2) game.zone:addEntity(game.level, m, "actor", x, y) m.ai_state = { talent_in=1, ally_compassion=10} game.level.map:particleEmitter(x, y, 1, "generic_teleport", {rm=60, rM=130, gm=20, gM=110, bm=90, bM=130, am=70, aM=180}) @@ -1616,7 +1614,7 @@ newTalent{ return true end, info = function(self, t) - return ([[Clones all creatures in a radius of 10.]]):format(getAnomalyDuration(self)) + return ([[Clones all creatures in a radius of 10.]]):format(getAnomalyDuration(self, t)) end, } @@ -1628,9 +1626,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1662,9 +1660,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1676,7 +1674,7 @@ newTalent{ local tg = self:getTalentTarget(t) local tgts = getAnomalyTargets(self, t, self.x, self.y, "ACTOR", self:getTalentRange(t)) - local movedam = self:spellCrit(getAnomalyDamage(self)) -- High damage + local movedam = self:spellCrit(getAnomalyDamage(self, t)) -- High damage -- Randomly take targets if #tgts <= 0 then return end @@ -1720,9 +1718,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1734,8 +1732,9 @@ newTalent{ local tg = self:getTalentTarget(t) local tgts = getAnomalyTargets(self, t, self.x, self.y, "ACTOR", self:getTalentRange(t)) - local movedam = self:spellCrit(getAnomalyDamageAoE(self)) - local dam = self:spellCrit(getAnomalyDamage(self)/2) + local movedam = self:spellCrit(getAnomalyDamage(self, t)) + local dam = self:spellCrit(getAnomalyDamage(self, t)/2) + local apply_power = getParadoxSpellpower(self, t) -- Randomly take targets for i = 1, rng.avg(3, 6, 3) do @@ -1748,7 +1747,7 @@ newTalent{ local proj = require("mod.class.Projectile"):makeHoming( self, {particle="bolt_lightning", trail="lightningtrail"}, - {speed=2, name="Tornado", dam=dam, movedam=movedam, start_x=orig_x, start_y=orig_y}, + {speed=2, name="Tornado", dam=dam, movedam=movedam, start_x=orig_x, start_y=orig_y, apply=apply_power}, target, self:getTalentRange(t), function(self, src) @@ -1760,7 +1759,7 @@ newTalent{ src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam) src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.MINDKNOCKBACK, self.def.dam) if target:canBe("stun") then - target:setEffect(target.EFF_STUNNED, 4, {apply_power=getParadoxSpellpower(src)}) + target:setEffect(target.EFF_STUNNED, 4, {apply_power=self.def.apply}) else game.logSeen(target, "%s resists the tornado!", target.name:capitalize()) end @@ -1796,9 +1795,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1860,7 +1859,7 @@ newTalent{ local target = game.level.map(px, py, engine.Map.ACTOR) if target then if target:canBe("stun") then - target:setEffect(target.EFF_STUNNED, 3, {apply_power=src:combatSpellpower()}) + target:setEffect(target.EFF_STUNNED, 3, {apply_power=getParadoxSpellpower(src, t)}) else game.logSeen(target, "%s resists the stun!", target.name:capitalize()) end @@ -1871,7 +1870,7 @@ newTalent{ end end - local dam = self:spellCrit(getAnomalyDamage(self)) + local dam = self:spellCrit(getAnomalyDamage(self, t)) meteor(self, x, y, dam) return true @@ -1890,9 +1889,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, @@ -1923,7 +1922,7 @@ newTalent{ end return true end, - temporary = getAnomalyDuration(self)*10, + temporary = getAnomalyDuration(self, t)*10, x = tx, y = ty, canAct = false, energy = {value=0}, @@ -1972,9 +1971,9 @@ newTalent{ no_unlearn_last = true, points = 1, paradox = 0, - cooldown = 1, + cooldown =0, range = 10, - radius = function(self, t) return getAnomalyRadius(self) end, + radius = function(self, t) return getAnomalyRadius(self, t) end, direct_hit = true, no_energy = true, requires_target = true, diff --git a/game/modules/tome/data/talents/chronomancy/blade-threading.lua b/game/modules/tome/data/talents/chronomancy/blade-threading.lua index ab1997ab06..75472cf5a8 100644 --- a/game/modules/tome/data/talents/chronomancy/blade-threading.lua +++ b/game/modules/tome/data/talents/chronomancy/blade-threading.lua @@ -28,9 +28,10 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 10) end, tactical = { ATTACK = {weapon = 2}, DISABLE = 3 }, requires_target = true, - no_energy = "fake", + speed = "weapon", getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, + getWarp = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end, action = function(self, t) local dam, swap = doWardenWeaponSwap(self, t, t.getDamage(self, t)) @@ -39,49 +40,26 @@ newTalent{ local x, y, target = self:getTarget(tg) if not x or not y or not target then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end if core.fov.distance(self.x, self.y, x, y) > 1 then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end - local hitted = self:attackTarget(target, DamageType.MATTER, dam) - + + -- Hit? + local hitted = self:attackTarget(target, nil, dam, true) + + -- Project our warp if hitted then - local chance = rng.range(1, 4) - if chance == 1 then - if target:canBe("stun") then - target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)}) - else - game.logSeen(target, "%s resists the stun!", target.name:capitalize()) - end - elseif chance == 2 then - if target:canBe("blind") then - target:setEffect(target.EFF_BLINDED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)}) - else - game.logSeen(target, "%s resists the blindness!", target.name:capitalize()) - end - elseif chance == 3 then - if target:canBe("pin") then - target:setEffect(target.EFF_PINNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)}) - else - game.logSeen(target, "%s resists the pin!", target.name:capitalize()) - end - elseif chance == 4 then - if target:canBe("confusion") then - target:setEffect(target.EFF_CONFUSED, t.getDuration(self, t), {power=50, apply_power=getParadoxSpellpower(self)}) - else - game.logSeen(target, "%s resists the confusion!", target.name:capitalize()) - end - end - + self:project({type="hit"}, target.x, target.y, DamageType.WARP, {dam=self:spellCrit(t.getWarp(self, t)), chance=100, dur=t.getDuration(self, t), apply_power=getParadoxSpellpower(self, t)}) game.level.map:particleEmitter(target.x, target.y, 1, "generic_discharge", {rm=64, rM=64, gm=134, gM=134, bm=170, bM=170, am=35, aM=90}) - --game:playSoundNear(self, "talents/distortion") - end - + end + return true end, info = function(self, t) local damage = t.getDamage(self, t) * 100 local duration = t.getDuration(self, t) - return ([[Attack the target with your melee weapons for %d%%. Half of this damage will be temporal and half physical. - If the attack hits the target may be stunned, blinded, pinned, or confused for %d turns. - Chance of applying a random effect improves with your Spellpower.]]) - :format(damage, duration) + local warp = t.getWarp(self, t) + return ([[Attack the target with your melee weapons for %d%%. + If the attack hits you'll warp the target, dealing %0.2f temporal and %0.2f physical damage, and may stun, blind, pin, or confuse them for %d turns. + The bonus damage improves with your Spellpower.]]) + :format(damage, damDesc(self, DamageType.TEMPORAL, warp/2), damDesc(self, DamageType.PHYSICAL, warp/2), duration) end } @@ -117,19 +95,17 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 15) end, tactical = { ATTACKAREA = {weapon = 2}, DISABLE = 3 }, requires_target = true, - no_energy = "fake", + speed = "weapon", getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, - getPower = function(self, t) return self:combatTalentSpellDamage(t, 50, 150, getParadoxSpellpower(self)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, + getPower = function(self, t) return self:combatTalentSpellDamage(t, 50, 150, getParadoxSpellpower(self, t)) end, on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end, action = function(self, t) local dam, swap = doWardenWeaponSwap(self, t, t.getDamage(self, t)) local tg = {type="hit", range=self:getTalentRange(t), talent=t} local x, y, target = self:getTarget(tg) if not x or not y or not target then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end - local hit1 = false - local hit2 = false - local hit3 = false + local braid_targets = {} -- do the braid if core.fov.distance(self.x, self.y, x, y) == 1 then @@ -138,35 +114,30 @@ newTalent{ local lx, ly = util.coordAddDir(self.x, self.y, util.dirSides(dir, self.x, self.y).left) local rx, ry = util.coordAddDir(self.x, self.y, util.dirSides(dir, self.x, self.y).right) local lt, rt = game.level.map(lx, ly, Map.ACTOR), game.level.map(rx, ry, Map.ACTOR) - + -- target hit - hit1 = self:attackTarget(target, nil, damage) + local hit1 = self:attackTarget(target, nil, damage, true) + if hit1 then braid_targets[#braid_targets+1] = target end --left hit - if lt then - hit2 = self:attackTarget(lt, nil, damage, true) + if lt and self:reactionToward(lt) < 0 then + local hit2 = self:attackTarget(lt, nil, damage, true) + if hit2 then braid_targets[#braid_targets+1] = lt end end --right hit - if rt then - hit3 = self:attackTarget(rt, nil, damage, true) + if rt and self:reactionToward(rt) < 0 then + local hit3 = self:attackTarget(rt, nil, damage, true) + if hit3 then braid_targets[#braid_targets+1] = rt end end - -- Braid them; no save - if hit1 then - if hit2 or hit3 then - target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, braid_one=lt or nil, braid_two=rt or nil}) - end - end - if hit2 then - if hit1 or hit3 then - lt:setEffect(lt.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, braid_one=target or nil, braid_two=rt or nil}) - end - end - if hit3 then - if hit1 or hit2 then - rt:setEffect(rt.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, braid_one=target or nil, braid_two=lt or nil}) + -- if we hit more than one, braid them + if #braid_targets > 1 then + for i = 1, #braid_targets do + local target = braid_targets[i] + target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, targets=braid_targets}) end end + else if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil @@ -195,8 +166,7 @@ newTalent{ tactical = { ATTACKAREA = {weapon = 2}, ATTACK = {weapon = 2}, }, requires_target = true, is_teleport = true, - direct_hit = true, - no_energy = "fake", + speed = "weapon", getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.6, 1.2) end, getTeleports = function(self, t) return self:getTalentLevel(t) >= 5 and 2 or 1 end, on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end, @@ -208,7 +178,7 @@ newTalent{ -- Hit the target if core.fov.distance(self.x, self.y, target.x, target.y) > 1 then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end - local hitted = self:attackTarget(target, nil, dam) + local hitted = self:attackTarget(target, nil, dam, true) if hitted then -- Get available targets @@ -219,6 +189,7 @@ newTalent{ local a = game.level.map(x, y, Map.ACTOR) if a and self:reactionToward(a) < 0 and self:hasLOS(a.x, a.y) then tgts[#tgts+1] = a + print("Temporal Assault Target %s", a.name) end end end @@ -229,7 +200,7 @@ newTalent{ local a, id = rng.table(tgts) -- since we're using a precise teleport we'll look for a free grid first local tx2, ty2 = util.findFreeGrid(a.x, a.y, 5, true, {[Map.ACTOR]=true}) - if tx2 and ty2 then + if tx2 and ty2 and not a.dead then game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") if not self:teleportRandom(tx2, ty2, 0) then attempts = attempts - 1 diff --git a/game/modules/tome/data/talents/chronomancy/bow-threading.lua b/game/modules/tome/data/talents/chronomancy/bow-threading.lua index 042fbe96e2..b2fe1e6afc 100644 --- a/game/modules/tome/data/talents/chronomancy/bow-threading.lua +++ b/game/modules/tome/data/talents/chronomancy/bow-threading.lua @@ -29,7 +29,7 @@ newTalent{ tactical = { BUFF = 2 }, points = 5, getDamage = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end, - getApplyPower = function(self, t) return getParadoxSpellpower(self) end, + getApplyPower = function(self, t) return getParadoxSpellpower(self, t) end, activate = function(self, t) return {} end, @@ -52,7 +52,7 @@ newTalent{ tactical = { ATTACK = {weapon = 2} }, requires_target = true, range = archery_range, - no_energy = "fake", + speed = 'archery', getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 2.2) end, getParadoxReduction = function(self, t) return math.floor(self:combatTalentScale(t, 10, 20)) end, on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "bow") then if not silent then game.logPlayer(self, "You require a bow to use this talent.") end return false end return true end, @@ -62,9 +62,9 @@ newTalent{ action = function(self, t) local dam, swap = doWardenWeaponSwap(self, t, t.getDamage(self, t)) - local targets = self:archeryAcquireTargets(nil, {one_shot=true, infinite=true}) + local targets = self:archeryAcquireTargets({type="bolt"}, {one_shot=true, infinite=true, no_energy = true}) if not targets then if swap then doWardenWeaponSwap(self, t, nil, "blade") end return end - self:archeryShoot(targets, t, nil, {mult=dam, damtype=DamageType.TEMPORAL}) + self:archeryShoot(targets, t, {type="bolt"}, {mult=dam, damtype=DamageType.TEMPORAL}) return true end, @@ -88,9 +88,9 @@ newTalent{ requires_target = true, range = archery_range, radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.7)) end, - no_energy = "fake", + speed = 'archery', getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end, - getDamageAoE = function(self, t) return self:combatTalentSpellDamage(t, 10, 170, getParadoxSpellpower(self)) end, + getDamageAoE = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self, t)) end, target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t} end, @@ -101,17 +101,45 @@ newTalent{ if not x or not y then return nil end local _ _, _, _, x, y = self:canProject(tg, x, y) - local dam = self:spellCrit(t.getDamageAoE(self, t)) - local grids = self:project(tg, x, y, function(px, py) + local tgts = {} + self:project(tg, x, y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) - if not target then return end - local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) - if tx and ty and target:canBe("knockback") then - target:move(tx, ty, true) - game.logSeen(target, "%s is drawn in by the singularity!", target.name:capitalize()) + if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then + -- If we've already moved this target don't move it again + for _, v in pairs(tgts) do + if v == target then + return + end + end + + -- Do our Knockback + local can = function(target) + if target:checkHit(getParadoxSpellpower(self, t), target:combatPhysicalResist(), 0, 95) and target:canBe("knockback") then -- Deprecated Checkhit call + return true + else + game.logSeen(target, "%s resists the knockback!", target.name:capitalize()) + end + end + if can(target) then + target:pull(x, y, tg.radius, can) + tgts[#tgts+1] = target + game.logSeen(target, "%s is drawn in by the singularity!", target.name:capitalize()) + target:crossTierEffect(target.EFF_OFFBALANCE, getParadoxSpellpower(self, t)) + end end end) - self:project(tg, x, y, DamageType.GRAVITY, self:spellCrit(dam)) + + -- 25% bonus damage per target beyond the first + local dam = self:spellCrit(t.getDamageAoE(self, t)) + dam = dam + math.min(dam, dam*(#tgts-1)/4) + + -- Project our damage last based on number of targets hit + self:project(tg, x, y, function(px, py) + local dist_factor = 1 + (core.fov.distance(x, y, px, py)/5) + local damage = dam/dist_factor + DamageType:get(DamageType.GRAVITY).projector(self, px, py, DamageType.GRAVITY, damage) + end) + game.level.map:particleEmitter(x, y, tg.radius, "gravity_spike", {radius=tg.radius, allow=core.shader.allow("distort")}) game:playSoundNear(self, "talents/earth") @@ -127,9 +155,9 @@ newTalent{ tg.type = "bolt" -- switch our targeting back to a bolt - local targets = self:archeryAcquireTargets(self:getTalentTarget(t), {one_shot=true, x=x, y=y}) + local targets = self:archeryAcquireTargets(tg, {one_shot=true, x=x, y=y, no_energy = true}) if not targets then return end - self:archeryShoot(targets, t, nil, {mult=dam}) + self:archeryShoot(targets, t, {type="bolt"}, {mult=dam}) return true end, @@ -137,9 +165,11 @@ newTalent{ local damage = t.getDamage(self, t) * 100 local radius = self:getTalentRadius(t) local aoe = t.getDamageAoE(self, t) - return ([[Fire a shot doing %d%% damage. When the arrow reaches its destination it will draw in creatures in a radius of %d and inflict %0.2f additional physical damage. - The additional damage scales with your Spellpower and inflicts 50%% extra damage to pinned targets.]]) - :format(damage, radius, damDesc(self, DamageType.PHYSICAL, aoe)) + return ([[Fire a shot doing %d%% damage. When the arrow reaches its destination it will draw in creatures in a radius of %d and inflict %0.2f physical damage. + Each target moved beyond the first deals an additional %0.2f physical damage (up to %0.2f bonus damage). + Targets take reduced damage the further they are from the epicenter (20%% less per tile). + The additional damage scales with your Spellpower.]]) + :format(damage, radius, damDesc(self, DamageType.PHYSICAL, aoe), damDesc(self, DamageType.PHYSICAL, aoe/4), damDesc(self, DamageType.PHYSICAL, aoe)) end } @@ -154,7 +184,7 @@ newTalent{ requires_target = true, range = archery_range, radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.7)) end, - no_energy = "fake", + speed = 'archery', getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end, getClones = function(self, t) return self:getTalentLevel(t) >= 5 and 3 or self:getTalentLevel(t) >= 3 and 2 or 1 end, target = function(self, t) @@ -176,7 +206,7 @@ newTalent{ return nil end - local targets = self:archeryAcquireTargets(self:getTalentTarget(t), {one_shot=true, x=x, y=y}) + local targets = self:archeryAcquireTargets(self:getTalentTarget(t), {one_shot=true, x=x, y=y, no_energy = true}) if not targets then return end self:archeryShoot(targets, t, {type="bolt", friendlyfire=false, friendlyblock=false}, {mult=dam}) @@ -204,6 +234,7 @@ newTalent{ m.arrow_stitched_clone = true m.generic_damage_penalty = 50 m.energy.value = 1000 + m:attr("archery_pass_friendly", 1) m.on_act = function(self) if not self.shoot_target.dead then self:forceUseTalent(self.T_ARROW_STITCHING, {force_level=t.leve, ignore_cd=true, ignore_energy=true, force_target=self.shoot_target, ignore_ressources=true, silent=true}) diff --git a/game/modules/tome/data/talents/chronomancy/chronomancer.lua b/game/modules/tome/data/talents/chronomancy/chronomancer.lua index 9da046ab2d..d99be34c9b 100644 --- a/game/modules/tome/data/talents/chronomancy/chronomancer.lua +++ b/game/modules/tome/data/talents/chronomancy/chronomancer.lua @@ -24,18 +24,18 @@ newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronoma newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/threaded-combat", name = "Threaded Combat", min_lev = 10, description = "A blend of ranged and dual-weapon combat." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/temporal-hounds", name = "Temporal Hounds", min_lev = 10, description = "Call temporal hounds to aid you in combat." } -newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/energy", name = "energy", generic = true, description = "Manipulate raw energy by addition or subtraction." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/fate-threading", name = "Fate Threading", description = "Manipulate the threads of fate." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/gravity", name = "gravity", description = "Call upon the force of gravity to crush, push, and pull your foes." } -newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/matter", name = "matter", description = "Change and shape matter itself." } -newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/paradox", name = "paradox", min_lev = 10, description = "Create loopholes in the laws of spacetime." } -newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/speed-control", name = "Speed Control", description = "Control how fast objects and creatures move through spacetime." } -newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timeline-threading", name = "Timeline Threading", min_lev = 10, description = "Examine and alter the timelines that make up the spacetime continuum." } -newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timetravel", name = "Time Travel", min_lev = 10, description = "Travel through time yourself, or send your foes into the future." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spacetime-folding", name = "Spacetime Folding", description = "Mastery of folding points in space." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/speed-control", name = "Speed Control", description = "Control how fast objects and creatures move through spacetime." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timeline-threading", name = "Timeline Threading", description = "Examine and alter the timelines that make up the spacetime continuum." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timetravel", name = "timetravel", description = "Directly manipulate the flow of time" } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spatial-tears", name = "Spatial Tears", min_lev = 10, description = "Manipulate topological defects in the fabric of spacetime." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spellbinding", name = "Spellbinding", min_lev = 10, description = "Manipulate chronomantic spells." } -- Generic Chronomancy newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/chronomancy", name = "Chronomancy", generic = true, description = "Allows you to glimpse the future, or become more aware of the present." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/energy", name = "energy", generic = true, min_lev = 10, description = "Manipulate raw energy by addition or subtraction." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/fate-weaving", name = "Fate Weaving", generic = true, description = "Weave the threads of fate." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spacetime-weaving", name = "Spacetime Weaving", generic = true, description = "Weave the threads of spacetime." } @@ -43,11 +43,11 @@ newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronoma newTalentType{ no_silence=true, is_spell=true, type="chronomancy/other", name = "Other", generic = true, description = "Miscellaneous Chronomancy effects." } newTalentType{ no_silence=true, is_spell=true, type="chronomancy/age-manipulation", name = "Age Manipulation", description = "Manipulate the age of creatures you encounter." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/matter", name = "matter", description = "Change and shape matter itself." } +newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/paradox", name = "paradox", description = "Break the laws of spacetime." } newTalentType{ no_silence=true, is_spell=true, type="chronomancy/temporal-archery", name = "Temporal Archery", description = "A blend of chronomancy and ranged combat." } newTalentType{ no_silence=true, is_spell=true, type="chronomancy/temporal-combat", name = "Temporal Combat", description = "A blend of chronomancy and physical combat." } - - -- Anomalies are not learnable but can occur instead of an intended spell when paradox gets to high. newTalentType{ no_silence=true, is_spell=true, type="chronomancy/anomalies", name = "anomalies", description = "Spacetime anomalies that can randomly occur when paradox is to high." } @@ -127,6 +127,7 @@ load("/data/talents/chronomancy/gravity.lua") load("/data/talents/chronomancy/matter.lua") load("/data/talents/chronomancy/paradox.lua") load("/data/talents/chronomancy/speed-control.lua") +load("/data/talents/chronomancy/spellbinding.lua") load("/data/talents/chronomancy/temporal-archery.lua") load("/data/talents/chronomancy/temporal-combat.lua") load("/data/talents/chronomancy/guardian.lua") @@ -136,6 +137,7 @@ load("/data/talents/chronomancy/timeline-threading.lua") load("/data/talents/chronomancy/timetravel.lua") load("/data/talents/chronomancy/spacetime-folding.lua") load("/data/talents/chronomancy/spacetime-weaving.lua") +load("/data/talents/chronomancy/spatial-tears.lua") -- Loads many functions and misc. talents load("/data/talents/chronomancy/other.lua") diff --git a/game/modules/tome/data/talents/chronomancy/chronomancy.lua b/game/modules/tome/data/talents/chronomancy/chronomancy.lua index 6410b3fd85..9526791660 100644 --- a/game/modules/tome/data/talents/chronomancy/chronomancy.lua +++ b/game/modules/tome/data/talents/chronomancy/chronomancy.lua @@ -17,7 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org --- EDGE TODO: Icons, Particles, Timed Effect Particles +-- EDGE TODO: Particles, Timed Effect Particles newTalent{ name = "Precognition", @@ -27,8 +27,8 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 10) end, cooldown = 20, no_npc_use = true, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 14)) end, - range = function(self, t) return 10 + math.min(self:combatTalentSpellDamage(t, 10, 20, getParadoxSpellpower(self))) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 14))) end, + range = function(self, t) return 10 + math.min(self:combatTalentSpellDamage(t, 10, 20, getParadoxSpellpower(self, t))) end, action = function(self, t) -- Foresight bonuses local defense = 0 @@ -86,13 +86,16 @@ newTalent{ sustain_paradox = 36, mode = "sustained", no_sustain_autoreset = true, - cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 15, 45, 25)) end, -- Limit >15 + cooldown = 50, + getTrigger= function(self, t) return self:combatTalentScale(t, 0.25, 0.45, 0.6) end, tactical = { DEFEND = 2 }, - no_npc_use = true, + no_npc_use = true, -- so rares don't learn useless talents + allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it callbackOnHit = function(self, t, cb) local p = self:isTalentActive(t.id) local life_after = self.life - cb.value - local cont_trigger = self.max_life * 0.3 + local cont_trigger = self.max_life * t.getTrigger(self, t) -- Cast our contingent spell if p and p.rest_count <= 0 and cont_trigger > life_after then @@ -100,15 +103,18 @@ newTalent{ local cont_id = self:getTalentFromId(cont_t) local t_level = math.min(self:getTalentLevel(t), self:getTalentLevel(cont_t)) - -- Make sure we still know the talent and that the preuse conditions apply - if t_level == 0 or not self:preUseTalent(cont_id, true, true) then + -- Make sure we still know the talent and that the pre-use conditions apply + if t_level == 0 or not self:knowTalent(cont_id) or not self:preUseTalent(cont_id, true, true) then game.logPlayer(self, "#LIGHT_RED#Your Contingency has failed to cast %s!", self:getTalentFromId(cont_t).name) else - self:forceUseTalent(cont_t, {ignore_ressources=true, ignore_cd=true, ignore_energy=true, force_level=t_level}) game.logPlayer(self, "#STEEL_BLUE#Your Contingency triggered %s!", self:getTalentFromId(cont_t).name) + p.rest_count = self:getTalentCooldown(t) + game:onTickEnd(function() + if not self.dead then + self:forceUseTalent(cont_t, {ignore_ressources=true, ignore_cd=true, ignore_energy=true, force_level=t_level}) + end + end) end - - p.rest_count = self:getTalentCooldown(t) end return cb.value @@ -135,14 +141,15 @@ newTalent{ return true end, info = function(self, t) + local trigger = t.getTrigger(self, t) * 100 local cooldown = self:getTalentCooldown(t) local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None" - return ([[Choose an activatable spell that's not targeted. When you take damage that reduces your life below 30%% the spell will automatically cast. + return ([[Choose an activatable spell that's not targeted. When you take damage that reduces your life below %d%% the spell will automatically cast. This spell will cast even if it is currently on cooldown, will not consume a turn or resources, and uses the talent level of Contingency or its own, whichever is lower. This effect can only occur once every %d turns and takes place after the damage is resolved. Current Contingency Spell: %s]]): - format(cooldown, talent) + format(trigger, cooldown, talent) end, } @@ -153,8 +160,10 @@ newTalent{ points = 5, paradox = function (self, t) return getParadoxCost(self, t, 20) end, cooldown = 50, - no_npc_use = true, - getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 10, 25)) end, + no_npc_use = true, -- so rares don't learn useless talents + allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 10, 25))) end, on_pre_use = function(self, t, silent) if checkTimeline(self) then if not silent then @@ -191,7 +200,7 @@ newTalent{ return ([[You peer into three possible futures, allowing you to explore each for %d turns. When the effect expires, you'll choose which of the three futures becomes your present. If you know Foresight you'll gain additional defense and chance to shrug off critical hits (equal to your Foresight values) while See the Threads is active. This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful. - Note that seeing visions of your own death can still be fatal. + If you die in any thread you'll revert the timeline to the point when you first cast the spell and the effect will end. This spell may only be used once per zone level.]]) :format(duration) end, diff --git a/game/modules/tome/data/talents/chronomancy/energy.lua b/game/modules/tome/data/talents/chronomancy/energy.lua index 89418eaefb..d552f75a13 100644 --- a/game/modules/tome/data/talents/chronomancy/energy.lua +++ b/game/modules/tome/data/talents/chronomancy/energy.lua @@ -17,23 +17,27 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org +-- EDGE TODO: Particles, Timed Effect Particles + newTalent{ name = "Energy Decomposition", type = {"chronomancy/energy",1}, mode = "sustained", - require = chrono_req1, + require = chrono_req_high1, points = 5, - sustain_paradox = 20, + sustain_paradox = 24, cooldown = 10, tactical = { BUFF = 2 }, - getAbsorption = function(self, t) return self:combatTalentSpellDamage(t, 5, 150, getParadoxSpellpower(self)) end, -- Increase shield strength - on_damage = function(self, t, damtype, dam) - if not DamageType:get(damtype).antimagic_resolve then return dam end - local absorb = t.getAbsorption(self, t) - -- works like armor with 30% hardiness for projected energy effects - dam = math.max(dam * 0.3 - absorb, 0) + (dam * 0.7) + getDecomposition = function(self, t) return self:combatTalentSpellDamage(t, 5, 150, getParadoxSpellpower(self, t)) end, -- Increase shield strength + callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr) + local decomp = t.getDecomposition(self, t) + local lastdam = dam + + -- works like armor with 30% hardiness + dam = math.max(dam * 0.3 - decomp, 0) + (dam * 0.7) print("[PROJECTOR] after static reduction dam", dam) - return dam + game:delayedLogDamage(src or self, self, 0, ("%s(%d dissipated)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam - dam), false) + return {dam=dam} end, activate = function(self, t) game:playSoundNear(self, "talents/heal") @@ -46,67 +50,41 @@ newTalent{ return true end, info = function(self, t) - local absorption = t.getAbsorption(self, t) - return ([[Partially dissipates all incoming energy damage (all except mind and physical damage), reducing it by 30%%, up to a maximum of %d. - The maximum damage reduction will scale with your Spellpower.]]):format(absorption) - end, -} - -newTalent{ - name = "Entropic Field", - type = {"chronomancy/energy",2}, - mode = "sustained", - require = chrono_req2, - points = 5, - sustain_paradox = 20, - cooldown = 10, - tactical = { BUFF = 2 }, - getPower = function(self, t) return math.min(90, 10 + self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self))) end, - activate = function(self, t) - game:playSoundNear(self, "talents/heal") - return { - particle = self:addParticles(Particles.new("time_shield", 1)), - phys = self:addTemporaryValue("resists", {[DamageType.PHYSICAL]=t.getPower(self, t)/2}), - proj = self:addTemporaryValue("slow_projectiles", t.getPower(self, t)), - } - end, - deactivate = function(self, t, p) - self:removeParticles(p.particle) - self:removeTemporaryValue("resists", p.phys) - self:removeTemporaryValue("slow_projectiles", p.proj) - return true - end, - info = function(self, t) - local power = t.getPower(self, t) - return ([[You encase yourself in a field that slows incoming projectiles by %d%%, and increases your physical resistance by %d%%. - The effect will scale with your Spellpower.]]):format(power, power / 2) + local decomp = t.getDecomposition(self, t) + return ([[Partially dissipates all incoming damage, reducing it by 30%%, up to a maximum of %d. + The maximum damage reduction will scale with your Spellpower.]]):format(decomp) end, } newTalent{ name = "Energy Absorption", - type = {"chronomancy/energy", 3}, - require = chrono_req3, + type = {"chronomancy/energy", 2}, + require = chrono_req_high2, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 20) end, - cooldown = 10, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, + cooldown = 6, + fixed_cooldown = true, tactical = { DISABLE = 2 }, direct_hit = true, requires_target = true, - range = 6, + range = 10, getTalentCount = function(self, t) - return 1 + math.floor(self:combatTalentScale(math.max(1, self:getTalentLevel(t)), 0.5, 2.5, "log")) + return 1 + math.floor(self:combatTalentLimit(t, 3, 0, 2)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t)) end, getCooldown = function(self, t) return math.ceil(self:combatTalentScale(t, 1, 2.6)) end, + target = function (self, t) + return {type="hit", range=self:getTalentRange(t), talent=t} + end, action = function(self, t) - local tg = {type="hit", range=self:getTalentRange(t)} + local tg = self:getTalentTarget(t) local tx, ty = self:getTarget(tg) if not tx or not ty then return nil end local _ _, tx, ty = self:canProject(tg, tx, ty) local target = game.level.map(tx, ty, Map.ACTOR) if not target then return end - if not self:checkHit(self:combatSpellpower(), target:combatSpellResist()) then + if not self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist()) then game.logSeen(target, "%s resists!", target.name:capitalize()) return true end @@ -124,7 +102,7 @@ newTalent{ local t = rng.tableRemove(tids) if not t then break end target.talents_cd[t.id] = cdr - game.logSeen(target, "%s's %s is disrupted by the Energy Absorption!", target.name:capitalize(), t.name) + game.logSeen(target, "%s's %s is disrupted by the Energy Drain!", target.name:capitalize(), t.name) count = count + 1 end @@ -132,17 +110,22 @@ newTalent{ local tids = {} for tid, _ in pairs(self.talents_cd) do local tt = self:getTalentFromId(tid) - if tt.type[1]:find("^chronomancy/") then - tids[#tids+1] = tid + if tt.type[1]:find("^chronomancy/") and not tt.fixed_cooldown then + tids[#tids+1] = tt end end + for i = 1, count do if #tids == 0 then break end local tid = rng.tableRemove(tids) - self.talents_cd[tid] = self.talents_cd[tid] - cdr + self:alterTalentCoolingdown(tid, - cdr) end + + -- Deal our damage in one lump sum + self:project(tg, target.x, target.y, DamageType.TEMPORAL, self:spellCrit(count * t.getDamage(self, t))) end - target:crossTierEffect(target.EFF_SPELLSHOCKED, self:combatSpellpower()) + + target:crossTierEffect(target.EFF_SPELLSHOCKED, getParadoxSpellpower(self, t)) game.level.map:particleEmitter(tx, ty, 1, "generic_charge", {rm=10, rM=110, gm=10, gM=50, bm=20, bM=125, am=25, aM=255}) game.level.map:particleEmitter(self.x, self.y, 1, "generic_charge", {rm=200, rM=255, gm=200, gM=255, bm=200, bM=255, am=125, aM=125}) game:playSoundNear(self, "talents/spell_generic") @@ -151,33 +134,73 @@ newTalent{ info = function(self, t) local talentcount = t.getTalentCount(self, t) local cooldown = t.getCooldown(self, t) + local damage = t.getDamage(self, t) return ([[You sap the target's energy and add it to your own, placing up to %d random talents on cooldown for %d turns. - For each talent put on cooldown, you reduce the cooldown of one of your chronomancy talents currently on cooldown by %d turns.]]): - format(talentcount, cooldown, cooldown) + For each talent put on cooldown, you reduce the cooldown of one of your chronomancy talents currently on cooldown by %d turns and deal %0.2f temporal damage to the target. + The damage done will scale with your Spellpower.]]): + format(talentcount, cooldown, cooldown, damDesc(self, DamageType.TEMPORAL, damage)) end, } newTalent{ name = "Redux", - type = {"chronomancy/energy",4}, - require = chrono_req4, + type = {"chronomancy/energy",3}, + require = chrono_req_high3, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 40) end, - cooldown = 12, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 24, tactical = { BUFF = 2 }, - no_energy = true, - getMaxLevel = function(self, t) return self:getTalentLevel(t) end, + fixed_cooldown = true, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 2, 4))) end, + getMaxCooldown = function(self, t) return math.floor(self:combatTalentScale(t, 3, 8)) end, action = function(self, t) -- effect is handled in actor postUse - self:setEffect(self.EFF_REDUX, 5, {}) + self:setEffect(self.EFF_REDUX, t.getDuration(self, t), {max_cd=t.getMaxCooldown(self, t)}) game:playSoundNear(self, "talents/heal") return true end, info = function(self, t) - local maxlevel = t.getMaxLevel(self, t) - return ([[You may recast the next activated chronomancy spell (up to talent level %0.1f) that you cast within the next 5 turns on the turn following its initial casting. - The Paradox cost of the initial spell will be paid each time it is cast, and the second casting will still consume a turn. - This spell takes no time to cast.]]): - format(maxlevel) + local duration = t.getDuration(self, t) + local cooldown = t.getMaxCooldown(self, t) + return ([[For the next %d turns chronomancy spells with a cooldown of %d or less do not go on cooldown when cast.]]): + format(duration, cooldown) end, } + +newTalent{ + name = "Entropy", + type = {"chronomancy/energy",4}, + require = chrono_req_high4, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 12, + tactical = { ATTACK = { TEMPORAL = 2 }, DEBUFF=3 }, + range = 10, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 100, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, + target = function(self, t) + return {type="hit", range=self:getTalentRange(t), talent=t} + end, + requires_target = true, + direct_hit = true, + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y, target = self:getTarget(tg) + if not x or not y or not target then return nil end + local _ _, x, y = self:canProject(tg, x, y) + + local damage = self:spellCrit(t.getDamage(self, t)) + target:setEffect(target.EFF_ENTROPY, t.getDuration(self, t), {power=damage, src=self, apply_power=getParadoxSpellpower(self, t)}) + + game:playSoundNear(self, "talents/dispel") + + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local duration = t.getDuration(self, t) + return ([[Over the next %d turns all beneficial timed effects on the target tick twice as fast. + Each timed effect affected by this talent deals %0.2f temporal damage to the target. + The damage will scale with your Spellpower.]]):format(duration, damDesc(self, DamageType.TEMPORAL, damage)) + end, +} \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/fate-threading.lua b/game/modules/tome/data/talents/chronomancy/fate-threading.lua index 71cb732e33..9d42d04a95 100644 --- a/game/modules/tome/data/talents/chronomancy/fate-threading.lua +++ b/game/modules/tome/data/talents/chronomancy/fate-threading.lua @@ -20,19 +20,111 @@ -- EDGE TODO: Particles, Timed Effect Particles newTalent{ - name = "Trim Threads", + name = "Disentangle", type = {"chronomancy/fate-threading", 1}, require = chrono_req1, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 10) end, + cooldown = 12, + tactical = { PARADOX = 2 }, + getReduction = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t)) end, + getParadoxMulti = function(self, t) return self:combatTalentLimit(t, 2, 0.10, .75) end, + anomaly_type = "no-major", + no_energy = true, + passives = function(self, t, p) + self:talentTemporaryValue(p, "anomaly_paradox_recovery", t.getParadoxMulti(self, t)) + end, + action = function(self, t) + local reduction = self:spellCrit(t.getReduction(self, t)) + self:paradoxDoAnomaly(reduction, t.anomaly_type, "forced") + return true + end, + info = function(self, t) + local reduction = t.getReduction(self, t) + local paradox = 100 * t.getParadoxMulti(self, t) + return ([[Disentangle the timeline, reducing your Paradox by %d and creating an anomaly. This spell will never produce a major anomaly. + Additionally you recover %d%% more Paradox from random anomalies (%d%% total). + The Paradox reduction will increase with your Spellpower.]]):format(reduction, paradox, paradox + 200) + end, +} + +newTalent{ + name = "Preserve Pattern", + type = {"chronomancy/fate-threading", 2}, + require = chrono_req2, + mode = "sustained", + sustain_paradox = 0, + points = 5, + cooldown = 10, + tactical = { DEFEND = 2 }, + getPercent = function(self, t) return self:combatTalentLimit(t, 50, 10, 30)/100 end, -- Limit < 50% + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 6))) end, + getConversionRatio = function(self, t) return 200 / self:combatTalentSpellDamage(t, 60, 600) end, + damage_feedback = function(self, t, p, src) + if p.particle and p.particle._shader and p.particle._shader.shad and src and src.x and src.y then + local r = -rng.float(0.2, 0.4) + local a = math.atan2(src.y - self.y, src.x - self.x) + p.particle._shader:setUniform("impact", {math.cos(a) * r, math.sin(a) * r}) + p.particle._shader:setUniform("impact_tick", core.game.getTime()) + end + end, + iconOverlay = function(self, t, p) + local val = p.rest_count or 0 + if val <= 0 then return "" end + local fnt = "buff_font" + return tostring(math.ceil(val)), fnt + end, + doPerservePattern = function(self, t, src, dam) + local absorb = dam * t.getPercent(self, t) + local paradox = absorb*t.getConversionRatio(self, t) + self:setEffect(self.EFF_PRESERVE_PATTERN, t.getDuration(self, t), {paradox=paradox/t.getDuration(self, t), no_ct_effect=true}) + game:delayedLogMessage(self, nil, "preserve pattern", "#LIGHT_BLUE##Source# converts damage to paradox!") + game:delayedLogDamage(src, self, 0, ("#LIGHT_BLUE#(%d converted)#LAST#"):format(absorb), false) + dam = dam - absorb + + return dam + end, + activate = function(self, t) + game:playSoundNear(self, "talents/arcane") + + local particle + if core.shader.active(4) then + particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.4, img="runicshield"}, {type="runicshield", shieldIntensity=0.14, ellipsoidalFactor=1, scrollingSpeed=-1, time_factor=12000, bubbleColor={1, 0.5, 0.3, 0.2}, auraColor={1, 0.5, 0.3, 1}})) + else + particle = self:addParticles(Particles.new("time_shield", 1)) + end + + return { + particle = particle, + } + end, + deactivate = function(self, t, p) + self:removeParticles(p.particle) + return true + end, + info = function(self, t) + local ratio = t.getPercent(self, t) * 100 + local absorb = t.getConversionRatio(self, t) * 100 + local duration = t.getDuration(self, t) + return ([[While active, %d%% of all damage you take increases your Paradox by %d%% of the damage absorbed over %d turns. + The amount of Paradox damage you recieve will be reduced by your Spellpower.]]): + format(ratio, absorb, duration) + end, +} + +newTalent{ + name = "Trim Threads", + type = {"chronomancy/fate-threading", 3}, + require = chrono_req3, + points = 5, cooldown = 4, tactical = { ATTACKAREA = { TEMPORAL = 2 } }, range = 10, - radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 2.5)) end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 2)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, 4) end, + getReduction = function(self, t) return self:getTalentLevel(t) * 2 end, target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t} + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, nowarning=true, talent=t} end, requires_target = true, direct_hit = true, @@ -50,60 +142,37 @@ newTalent{ self:project(tg, x, y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end - target:setEffect(target.EFF_TRIM_THREADS, 3, {power=damage/3, src=self, apply_power=getParadoxSpellpower(self)}) + target:setEffect(target.EFF_TRIM_THREADS, t.getDuration(self, t), {power=damage/4, src=self, reduction=t.getReduction(self, t), apply_power=getParadoxSpellpower(self, t)}) end) game.level.map:particleEmitter(x, y, tg.radius, "temporal_flash", {radius=tg.radius}) - game:playSoundNear(self, "talents/dispel") + game:playSoundNear(self, "talents/tidalwave") return true end, info = function(self, t) local damage = t.getDamage(self, t) + local duration = t.getDuration(self, t) local radius = self:getTalentRadius(t) - return ([[Deals %0.2f temporal damage over three turns to all targets in a radius of %d. If the target is hit by an Anomaly the remaining damage will be done instantly. - The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), radius) - end, -} - -newTalent{ - name = "Disentangle", - type = {"chronomancy/fate-threading", 2}, - require = chrono_req2, - points = 5, - cooldown = 12, - tactical = { PARADOX = 2 }, - getReduction = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)) end, - getParadoxMulti = function(self, t) return self:combatTalentLimit(t, 2, 0.10, .75) end, - anomaly_type = "no-major", - no_energy = true, - passives = function(self, t, p) - self:talentTemporaryValue(p, "anomaly_paradox_recovery", t.getParadoxMulti(self, t)) - end, - action = function(self, t) - local reduction = self:spellCrit(t.getReduction(self, t)) - self:paradoxDoAnomaly(reduction, t.anomaly_type, "forced") - return true - end, - info = function(self, t) local reduction = t.getReduction(self, t) - local paradox = 100 * t.getParadoxMulti(self, t) - return ([[Disentangle the timeline, reducing your Paradox by %d and creating an anomaly. This spell will never produce a major anomaly. - Additionally you recover %d%% more Paradox from random anomalies (%d%% total). - The Paradox reduction will increase with your Spellpower.]]):format(reduction, paradox, paradox + 200) + return ([[Deals %0.2f temporal damage over %d turns to all other targets in a radius of %d. If the target is slain before the effect expires you'll recover %d Paradox. + If the target is hit by an Anomaly the remaining damage will be done instantly. + The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration, radius, reduction) end, } newTalent{ name = "Bias Weave", - type = {"chronomancy/fate-threading", 3}, - require = chrono_req3, + type = {"chronomancy/fate-threading", 4}, + require = chrono_req4, points = 5, cooldown = 10, -- Anomaly biases can be set manually for monsters -- Use the following format anomaly_bias = { type = "teleport", chance=50} - on_pre_use = function(self, t, silent) if not self == game.player then return false end return true end, + no_npc_use = true, -- so rares don't learn useless talents + allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it getBiasChance = function(self, t) return self:combatTalentLimit(t, 100, 10, 75) end, getTargetChance = function(self, t) return self:combatTalentLimit(t, 100, 10, 75) end, getAnomalySpeed = function(self, t) return self:combatTalentLimit(t, 1, 0.10, .75) end, @@ -141,72 +210,4 @@ newTalent{ Additionally random anomalies only cost you %d%% of a turn rather than a full turn when they occur. Major anomalies, those occuring when your modified Paradox is over 600, are not affected by this talent.]]):format(target_chance, bias_chance, anomaly_recovery) end, -} - -newTalent{ - name = "Preserve Pattern", - type = {"chronomancy/fate-threading", 4}, - require = chrono_req4, - points = 5, - mode = "sustained", - sustain_paradox = 48, - cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 15, 45, 25)) end, -- Limit >15 - tactical = { DEFEND = 2 }, - getHeal = function(self, t) return self.max_life * self:combatTalentLimit(t, 1.5, 0.09, 0.4) end, -- Limit < 150% max life (to survive a large string of hits between turns) - callbackOnHit = function(self, t, cb) - local p = self:isTalentActive(t.id) - - if p and p.rest_count <= 0 and cb.value >= self.life then - -- Save them from the hit and heal up - cb.value = 0 - self.life = 1 - self:heal(t.getHeal(self, t)) - - -- Make them invulnerable so they don't die to anomalies - game.logSeen(self, "#STEEL_BLUE#%s is rapidly shunted into another timeline!#LAST#", self.name:capitalize()) - local invuln = self.invulnerable - self.invulnerable = 1 - - -- Make some anomalies and remove invulnerability - for i = 1, rng.avg(3, 6, 3) do self:paradoxDoAnomaly(0, nil, "forced", self, true) end - self.invulnerable = invuln - - -- Set the counter on the sustain - p.rest_count = self:getTalentCooldown(t) - if self.player then world:gainAchievement("AVOID_DEATH", self) end - end - - return cb.value - end, - callbackOnActBase = function(self, t) - local p = self:isTalentActive(t.id) - if p.rest_count > 0 then p.rest_count = p.rest_count - 1 end - end, - iconOverlay = function(self, t, p) - local val = p.rest_count or 0 - if val <= 0 then return "" end - local fnt = "buff_font" - return tostring(math.ceil(val)), fnt - end, - activate = function(self, t) - game:playSoundNear(self, "talents/heal") - local ret = { rest_count = 0 } - --[[if core.shader.active(4) then - ret.particle = self:addParticles(Particles.new("shader_ring_rotating", 1, {toback=true, a=0.6, rotation=0, radius=2, img="flamesgeneric"}, {type="sunaura", time_factor=6000})) - else - ret.particle = self:addParticles(Particles.new("golden_shield", 1)) - end]] - return ret - end, - deactivate = function(self, t, p) - -- self:removeParticles(p.particle) - return true - end, - info = function(self, t) - local heal = t.getHeal(self, t) - local cooldown = self:getTalentCooldown(t) - return ([[Any attack that would drop you below 1 hit point instead triggers Preserve Pattern, setting your life to 1, then healing you for %d. - This effect causes three to six anomalies to occur as you move from timeline to timeline until you find one in which you're still alive. - These anomalies may not be targeted though they may be biased. This effect can only occur once every %d turns.]]):format(heal, cooldown) - end, } \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/fate-weaving.lua b/game/modules/tome/data/talents/chronomancy/fate-weaving.lua index 4ca1424078..4b94a54eb4 100644 --- a/game/modules/tome/data/talents/chronomancy/fate-weaving.lua +++ b/game/modules/tome/data/talents/chronomancy/fate-weaving.lua @@ -26,13 +26,31 @@ newTalent{ mode = "passive", points = 5, getSaveBonus = function(self, t) return math.ceil(self:combatTalentScale(t, 2, 8, 0.75)) end, - doSpinFate = function(self, t) - local save_bonus = t.getSaveBonus(self, t) - local resists = self:knowTalent(self.T_FATEWEAVER) and self:callTalent(self.T_FATEWEAVER, "getResist") or 0 - - self:setEffect(self.EFF_SPIN_FATE, 3, {save_bonus=save_bonus, resists=resists, spin=1, max_spin=3}) + callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr) + if dam > 0 and src ~= self then + if self.turn_procs and not self.turn_procs.spin_fate then + + self:setEffect(self.EFF_SPIN_FATE, 3, {save_bonus=t.getSaveBonus(self, t), spin=1, max_spin=3}) + + -- Set our turn procs, we do spin_fate last since it's the only one checked above + if self.hasEffect and self:hasEffect(self.EFF_WEBS_OF_FATE) and not self.turn_procs.spin_webs then + self.turn_procs.spin_webs = true + elseif self.hasEffect and self:hasEffect(self.EFF_SEAL_FATE) and not self.turn_procs.spin_seal then + self.turn_procs.spin_seal = true + else + self.turn_procs.spin_fate = true + end + + -- Reduce damage if we know Fateweaver + if self:knowTalent(self.T_FATEWEAVER) then + local reduction = dam * self:callTalent(self.T_FATEWEAVER, "getReduction") + dam = dam - reduction + game:delayedLogDamage(src, self, 0, ("%s(%d fatewever)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", reduction), false) + end + end + end - return true + return {dam=dam} end, info = function(self, t) local save = t.getSaveBonus(self, t) @@ -41,7 +59,6 @@ newTalent{ format(save, save * 3) end, } - newTalent{ name = "Webs of Fate", type = {"chronomancy/fate-weaving", 2}, @@ -50,15 +67,16 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 10) end, cooldown = 12, tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 }, - getPower = function(self, t) return self:combatTalentSpellDamage(t, 20, 100, getParadoxSpellpower(self))/100 end, - getDuration = function(self, t) return 5 end, + getPower = function(self, t) return paradoxTalentScale(self, t, 15, 30, 50)/100 end, + getDuration = function(self, t) return getExtensionModifier(self, t, 5) end, + no_energy = true, action = function(self, t) local effs = {} -- Find all pins for eff_id, p in pairs(self.tmp) do local e = self.tempeffect_def[eff_id] - if e.subtype.pin then + if e.subtype.pin or e.subtype.stun then effs[#effs+1] = {"effect", eff_id} end end @@ -73,27 +91,23 @@ newTalent{ end -- Set our power based on current spin - local move = t.getPower(self, t) - local pin = t.getPower(self, t)/2 + local imm = t.getPower(self, t) local eff = self:hasEffect(self.EFF_SPIN_FATE) if eff then - move = move * (1 + eff.spin/3) - pin = pin * (1 + eff.spin/3) + imm = imm * (1 + eff.spin/3) end - pin = math.min(1, pin) -- Limit 100% - self:setEffect(self.EFF_WEBS_OF_FATE, t.getDuration(self, t), {move=move, pin=pin}) + self:setEffect(self.EFF_WEBS_OF_FATE, t.getDuration(self, t), {imm=imm}) return true end, info = function(self, t) local power = t.getPower(self, t) * 100 local duration = t.getDuration(self, t) - return ([[Activate to remove pins. You also gain %d%% movement speed and %d%% pin immunity for %d turns. - If you have Spin Fate active these bonuses will be increased by 33%% per spin (up to a maximum of %d%% and %d%% respectively). - This spell will automatically cast when you're hit by most anomalies. This will not consume a turn or put the spell on cooldown. - While Webs of Fate is active you may gain one additional spin per turn. - These bonuses will scale with your Spellpower.]]):format(power, math.min(100, power/2), duration, power * 2, math.min(100, power/2 * 2)) + return ([[Activate to remove pins and stuns. You also gain %d%% pin and stun immunity for %d turns. + If you have Spin Fate active these bonuses will be increased by 33%% per spin (up to a maximum of %d%%). + While Webs of Fate is active you may gain one additional spin per turn. These bonuses will scale with your Spellpower.]]) + :format(power, duration, power * 2) end, } @@ -103,11 +117,12 @@ newTalent{ require = chrono_req3, mode = "passive", points = 5, - getResist = function(self, t) return self:combatTalentScale(t, 2, 8, 0.75) end, + getReduction = function(self, t) return paradoxTalentScale(self, t, 10, 30, 40)/100 end, info = function(self, t) - local resist = t.getResist(self, t) - return ([[You now gain %0.1f%% resist all when you gain spin with Spin Fate (up to a maximum of %0.1f%% resist all at three spin).]]): - format(resist, resist*3) + local reduction = t.getReduction(self, t)*100 + return ([[When Spin Fate is triggered you reduce the triggering damage by %d%%. + This effect scales with your Spellpower.]]): + format(reduction) end, } @@ -119,27 +134,18 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 20) end, cooldown = 24, tactical = { BUFF = 2 }, - getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 25, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return 5 end, + getDuration = function(self, t) return getExtensionModifier(self, t, 5) end, + getProcs = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5)) end, + no_energy = true, action = function(self, t) - -- Set our power based on current spin - local crits = t.getPower(self, t) - local eff = self:hasEffect(self.EFF_SPIN_FATE) - if eff then - crits = crits * (1 + eff.spin/3) - end - - self:setEffect(self.EFF_SEAL_FATE, t.getDuration(self, t), {crit=crits}) - + self:setEffect(self.EFF_SEAL_FATE, t.getDuration(self, t), {procs=t.getProcs(self, t)}) return true end, info = function(self, t) - local power = t.getPower(self, t) + local procs = t.getProcs(self, t) local duration = t.getDuration(self, t) - return ([[Activate to increase critical hit chance and critical damage by %d%% for five turns. - If you have Spin Fate active these bonuses will be increased by 33%% per spin (up to a maximum of %d%%). - This spell will automatically cast when you're hit by most anomalies. This will not consume a turn or put the spell on cooldown. - While Seal Fate is active you may gain one additional spin per turn. - These bonuses will scale with your Spellpower.]]):format(power, power * 2) + return ([[Activate to Seal Fate for %d turns. When you damage a target while Seal Fate is active you have a 50%% chance to increase the duration of one detrimental status effect on it by one turn. + If you have Spin Fate active the chance twill be increased by 33%% per Spin (to a maximum of 100%% at three Spin.) + This can occur at most %d times per turn. While Seal Fate is active you may gain one additional spin per turn.]]):format(duration, procs) end, } \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/gravity.lua b/game/modules/tome/data/talents/chronomancy/gravity.lua index f76e1f7f77..37c7e88612 100644 --- a/game/modules/tome/data/talents/chronomancy/gravity.lua +++ b/game/modules/tome/data/talents/chronomancy/gravity.lua @@ -17,27 +17,71 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org +-- EDGE TODO: Particles, Timed Effect Particles + newTalent{ name = "Repulsion Blast", type = {"chronomancy/gravity",1}, require = chrono_req1, points = 5, paradox = function (self, t) return getParadoxCost(self, t, 10) end, - cooldown = 4, + cooldown = 3, tactical = { ATTACKAREA = {PHYSICAL = 2}, ESCAPE = 2 }, range = 0, radius = function(self, t) return math.floor(self:combatTalentScale(t, 4.5, 6.5)) end, requires_target = true, direct_hit = true, target = function(self, t) - return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false, talent=t} + return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 170, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end - self:project(tg, x, y, DamageType.REPULSION, self:spellCrit(t.getDamage(self, t))) + + -- Project our base damage + local dam = self:spellCrit(t.getDamage(self, t)) + local bonus_dam = dam/2 + self:project(tg, x, y, DamageType.GRAVITY, dam) + + -- Do our knockback + local tgts = {} + local grids = self:project(tg, x, y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then + -- If we've already moved this target don't move it again + for _, v in pairs(tgts) do + if v == target then + return + end + end + + local hit = target:checkHit(getParadoxSpellpower(self, t), target:combatPhysicalResist(), 0, 95) and target:canBe("knockback") + + if hit then + local slam = false + local dist = self:getTalentRadius(t) + 1 - core.fov.distance(self.x, self.y, px, py) + target:knockback(self.x, self.y, dist, false, function(g, x, y) + -- Deal our bonus damage + if game.level.map:checkAllEntities(x, y, "block_move", target) then + slam = true + self:project({type="hit"}, target.x, target.y, DamageType.GRAVITY, bonus_dam) + self:project({type="hit"}, x, y, DamageType.GRAVITY, bonus_dam) + game.logSeen(target, "%s slams into something solid!", target.name:capitalize()) + end + end) + + tgts[#tgts+1] = target + if not slam then game.logSeen(target, "%s is knocked back!", target.name:capitalize()) end + target:crossTierEffect(target.EFF_OFFBALANCE, getParadoxSpellpower(self, t)) + else + game.logSeen(target, "%s resists the knockback!", target.name:capitalize()) + end + + end + end) + game.level.map:particleEmitter(self.x, self.y, tg.radius, "gravity_breath", {radius=tg.radius, tx=x-self.x, ty=y-self.y, allow=core.shader.allow("distort")}) game:playSoundNear(self, "talents/earth") return true @@ -45,9 +89,9 @@ newTalent{ info = function(self, t) local damage = t.getDamage(self, t) local radius = self:getTalentRadius(t) - return ([[Sends out a blast wave of gravity in a %d radius cone, dealing %0.2f physical damage and knocking back creatures caught in the area. This deals 50%% extra damage to pinned targets, in addition to the knockback. - The blast wave may hit targets more then once, depending on the radius and the knockback effect. - The damage will scale with your Spellpower.]]): + return ([[Sends out a blast wave of gravity in a radius %d cone, dealing %0.2f base physical damage and knocking back targets caught in the area. + Targets knocked into walls or other targets take 50%% additional damage and deal 50%% damage to targets they're knocked into. + Closer targets will be knocked back further and the damage will scale with your Spellpower.]]): format(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t))) end, } @@ -58,31 +102,61 @@ newTalent{ require = chrono_req2, points = 5, paradox = function (self, t) return getParadoxCost(self, t, 20) end, - cooldown = 6, + cooldown = 4, tactical = { ATTACKAREA = {PHYSICAL = 2}, DISABLE = 2 }, range = 10, radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.7)) end, direct_hit = true, requires_target = true, target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 170, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end local _ _, _, _, x, y = self:canProject(tg, x, y) - local grids = self:project(tg, x, y, function(px, py) + + local tgts = {} + self:project(tg, x, y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) - if not target then return end - local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) - if tx and ty and target:canBe("knockback") then - target:move(tx, ty, true) - game.logSeen(target, "%s is drawn in by the gravity spike!", target.name:capitalize()) + if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then + -- If we've already moved this target don't move it again + for _, v in pairs(tgts) do + if v == target then + return + end + end + + -- Do our Knockback + local can = function(target) + if target:checkHit(getParadoxSpellpower(self, t), target:combatPhysicalResist(), 0, 95) and target:canBe("knockback") then -- Deprecated Checkhit call + return true + else + game.logSeen(target, "%s resists the knockback!", target.name:capitalize()) + end + end + if can(target) then + target:pull(x, y, tg.radius, can) + tgts[#tgts+1] = target + game.logSeen(target, "%s is drawn in by the singularity!", target.name:capitalize()) + target:crossTierEffect(target.EFF_OFFBALANCE, getParadoxSpellpower(self, t)) + end end end) - self:project(tg, x, y, DamageType.GRAVITY, self:spellCrit(t.getDamage(self, t))) + + -- 25% bonus damage per target beyond the first + local dam = self:spellCrit(t.getDamage(self, t)) + dam = dam + math.min(dam, dam*(#tgts-1)/4) + + -- Project our damage last based on number of targets hit + self:project(tg, x, y, function(px, py) + local dist_factor = 1 + (core.fov.distance(x, y, px, py)/5) + local damage = dam/dist_factor + DamageType:get(DamageType.GRAVITY).projector(self, px, py, DamageType.GRAVITY, damage) + end) + game.level.map:particleEmitter(x, y, tg.radius, "gravity_spike", {radius=tg.radius, allow=core.shader.allow("distort")}) game:playSoundNear(self, "talents/earth") @@ -91,53 +165,49 @@ newTalent{ info = function(self, t) local damage = t.getDamage(self, t) local radius = self:getTalentRadius(t) - return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spells center and inflicts %0.2f physical damage. This deals 50%% extra damage to pinned targets, in addition to the knockback. - The damage dealt will scale with your Spellpower.]]):format(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t))) + return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spell's center and inflicts %0.2f physical damage. + Each target moved beyond the first deals an additional %0.2f physical damage (up to %0.2f bonus damage). + Targets take reduced damage the further they are from the epicenter (20%% less per tile). + The damage dealt will scale with your Spellpower.]]) + :format(radius, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.PHYSICAL, damage/4), damDesc(self, DamageType.PHYSICAL, damage)) end, } newTalent{ - name = "Repulsion Field", + name = "Gravity Locus", type = {"chronomancy/gravity",3}, require = chrono_req3, + mode = "sustained", + sustain_paradox = 24, + cooldown = 10, + tactical = { BUFF = 2 }, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 30) end, - cooldown = 14, - tactical = { ATTACKAREA = {PHYSICAL = 2}, ESCAPE = 2 }, - range = 0, - radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end, - target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false} + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end, + getSlow = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80) end, + callbackOnMeleeHit = function(self, t, target) + if not self.dead and self:isTalentActive(self.T_GRAVITY_LOCUS) then + self:project({type="hit", talent=t}, target.x, target.y, DamageType.GRAVITY, {dam=t.getDamage(self, t), anti=true, dur=2, apply=getParadoxSpellpower(self, t)}) + end end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 80, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end, - direct_hit = true, - requires_target = true, - action = function(self, t) - local tg = self:getTalentTarget(t) - game.level.map:addEffect(self, - self.x, self.y, t.getDuration(self, t), - DamageType.REPULSION, t.getDamage(self, t), - tg.radius, - 5, nil, - engine.MapEffect.new{color_br=200, color_bg=120, color_bb=0, effect_shader="shader_images/paradox_effect.png"}, - function(e) - e.x = e.src.x - e.y = e.src.y - return true - end, - tg.selffire - ) - game:playSoundNear(self, "talents/cloud") + activate = function(self, t) + game:playSoundNear(self, "talents/heal") + local particle = Particles.new("ultrashield", 1, {rm=204, rM=220, gm=102, gM=120, bm=0, bM=0, am=35, aM=90, radius=0.5, density=10, life=28, instop=100}) + return { + proj = self:addTemporaryValue("slow_projectiles", t.getSlow(self, t)), + particle = self:addParticles(particle) + } + end, + deactivate = function(self, t, p) + self:removeTemporaryValue("slow_projectiles", p.proj) + self:removeParticles(p.particle) return true end, info = function(self, t) local damage = t.getDamage(self, t) - local duration = t.getDuration(self, t) - local radius = self:getTalentRadius(t) - return ([[You surround yourself with a radius %d distortion of gravity, knocking back and dealing %0.2f physical damage to all creatures inside it. The effect lasts %d turns. Deals 50%% extra damage to pinned targets, in addition to the knockback. - The blast wave may hit targets more then once, depending on the radius and the knockback effect. - The damage will scale with your Spellpower.]]):format(radius, damDesc(self, DamageType.PHYSICAL, damage), duration) + local proj = t.getSlow(self, t) + return ([[Create a gravity field around you that slows incoming projectiles by %d%% and protects you from all gravity effects. + While this spell is active creatures that hit you in melee combat will take %0.2f physical damage and have their knockback resistance reduced by half for two turns. + The projectile slowing and damage will scale with your spellpower.]]):format(proj, damDesc(self, DamageType.PHYSICAL, damage)) end, } @@ -146,31 +216,31 @@ newTalent{ type = {"chronomancy/gravity", 4}, require = chrono_req4, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 40) end, - cooldown = 24, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 12, tactical = { ATTACKAREA = {PHYSICAL = 2}, DISABLE = 2 }, range = 10, radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end, direct_hit = true, requires_target = true, target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t)) end, + getSlow = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80)/100 end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 4, 8))) end, action = function(self, t) - local duration = t.getDuration(self,t) - local radius = self:getTalentRadius(t) - local dam = t.getDamage(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end local _ _, _, _, x, y = self:canProject(tg, x, y) + -- Add a lasting map effect + local dam = self:spellCrit(t.getDamage(self, t)) game.level.map:addEffect(self, - x, y, duration, - DamageType.GRAVITYPIN, dam, - radius, + x, y, t.getDuration(self,t), + DamageType.GRAVITY, {dam=dam, dur=1, slow=t.getSlow(self, t), apply=getParadoxSpellpower(self, t)}, + self:getTalentRadius(t), 5, nil, {type="gravity_well"}, nil, self:spellFriendlyFire() @@ -182,7 +252,8 @@ newTalent{ local damage = t.getDamage(self, t) local duration = t.getDuration(self, t) local radius = self:getTalentRadius(t) - return ([[Increases local gravity of an area, doing %0.2f physical damage with a chance to pin in a radius of %d each turn for %d turns. - The damage done will scale with your Spellpower.]]):format(damDesc(self, DamageType.PHYSICAL, damage), radius, duration) + local slow = t.getSlow(self, t) + return ([[Increases local gravity in a radius of %d for %d turns, dealing %0.2f physical damage and slowing the movement speed of all affected targets by %d%%. + The damage done will scale with your Spellpower.]]):format(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), slow*100) end, } diff --git a/game/modules/tome/data/talents/chronomancy/guardian.lua b/game/modules/tome/data/talents/chronomancy/guardian.lua index c6ce9167db..26f1b68d3d 100644 --- a/game/modules/tome/data/talents/chronomancy/guardian.lua +++ b/game/modules/tome/data/talents/chronomancy/guardian.lua @@ -17,7 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org --- EDGE TODO: Icons, Particles, Timed Effect Particles +-- EDGE TODO: Particles, Timed Effect Particles newTalent{ name = "Strength of Purpose", @@ -46,9 +46,8 @@ newTalent{ cooldown = 24, fixed_cooldown = true, tactical = { HEAL = 1 }, - getDuration = function(self, t) return math.floor(self:combatTalentLimit(self:getTalentLevel(t), 14, 4, 8)) end, -- Limit < 14 - getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end, - getNumber = function(self, t) return math.ceil(self:getTalentLevel(t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentLimit(self:getTalentLevel(t), 14, 4, 8))) end, -- Limit < 14 + getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end, action = function(self, t) self:setEffect(self.EFF_INVIGORATE, t.getDuration(self,t), {power=t.getPower(self, t)}) return true @@ -67,24 +66,24 @@ newTalent{ require = chrono_req3, points = 5, mode = "passive", - getSplit = function(self, t) return math.min(100, self:combatTalentSpellDamage(t, 20, 50, getParadoxSpellpower(self)))/100 end, - getDuration = function(self, t) return 2 end, + getSplit = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80)/100 end, + getDuration = function(self, t) return getExtensionModifier(self, t, 2) end, getLifeTrigger = function(self, t) return self:combatTalentLimit(t, 10, 40, 24) end, remove_on_clone = true, callbackOnHit = function(self, t, cb, src) local split = cb.value * t.getSplit(self, t) -- If we already split this turn pass damage to our clone - if self.turn_procs.double_edge and self.turn_procs.double_edge ~= self and not self.turn_procs.double_edge.dead then + if self.turn_procs.double_edge and self.turn_procs.double_edge ~= self and game.level:hasEntity(self.turn_procs.double_edge) then split = split/2 -- split the damage - game:delayedLogDamage(src, self.turn_procs.double_edge, split, ("#PINK#%d displaced#LAST#"):format(split), false) + game:delayedLogDamage(src, self.turn_procs.double_edge, split, ("#STEEL_BLUE#(%d shared)#LAST#"):format(split), nil) cb.value = cb.value - split self.turn_procs.double_edge:takeHit(split, src) end -- Do our split - if self.max_life and cb.value >= self.max_life * t.getLifeTrigger(self, t) * 0.01 and not self.turn_procs.double_edge then + if self.max_life and cb.value >= self.max_life * (t.getLifeTrigger(self, t)/100) and not self.turn_procs.double_edge then -- Look for space first local tx, ty = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true}) if tx and ty then @@ -93,17 +92,6 @@ newTalent{ -- clone our caster local m = makeParadoxClone(self, self, t.getDuration(self, t)) - -- remove some talents; note most of this is handled by makeParadoxClone already but we don't want to keep splitting - local tids = {} - for tid, _ in pairs(m.talents) do - local t = m:getTalentFromId(tid) - if t.remove_on_clone then tids[#tids+1] = t end - end - for i, t in ipairs(tids) do - if t.mode == "sustained" and m:isTalentActive(t.id) then m:forceUseTalent(t.id, {ignore_energy=true, silent=true}) end - m.talents[t.id] = nil - end - -- add our clone game.zone:addEntity(game.level, m, "actor", tx, ty) m.ai_state = { talent_in=2, ally_compassion=10 } @@ -125,7 +113,8 @@ newTalent{ self.turn_procs.double_edge = m m:takeHit(split, src) m:setTarget(src or nil) - game:delayedLogDamage(src, m, split, ("#PINK#%d displaced#LAST#"):format(split), false) + game:delayedLogMessage(self, nil, "guardian_damage", "#STEEL_BLUE##Source# shares damage with %s guardian!", string.his_her(self)) + game:delayedLogDamage(src or self, self, 0, ("#STEEL_BLUE#(%d shared)#LAST#"):format(split), nil) else game.logPlayer(self, "Not enough space to summon warden!") @@ -154,9 +143,9 @@ newTalent{ tactical = { ATTACK = {weapon = 2}, DISABLE = 3 }, requires_target = true, range = archery_range, - no_energy = "fake", + speed = function(self, t) return self:hasArcheryWeapon("bow") and "archery" or "weapon" end, getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, on_pre_use = function(self, t, silent) if self:attr("disarmed") then if not silent then game.logPlayer(self, "You require a weapon to use this talent.") end return false end return true end, archery_onhit = function(self, t, target, x, y) target:setEffect(target.EFF_BREACH, t.getDuration(self, t), {}) @@ -166,19 +155,19 @@ newTalent{ if self:hasArcheryWeapon("bow") then -- Ranged attack - local targets = self:archeryAcquireTargets(nil, {one_shot=true}) + local targets = self:archeryAcquireTargets({type="bolt"}, {one_shot=true, no_energy = true}) if not targets then return end - self:archeryShoot(targets, t, nil, {mult=t.getDamage(self, t)}) + self:archeryShoot(targets, t, {type="bolt"}, {mult=t.getDamage(self, t)}) elseif mainhand then -- Melee attack local tg = {type="hit", range=self:getTalentRange(t), talent=t} local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end - local hitted = self:attackTarget(target, nil, t.getDamage(self, t)) + local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true) if hitted then - target:setEffect(target.EFF_BREACH, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)}) + target:setEffect(target.EFF_BREACH, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self, t)}) end else game.logPlayer(self, "You cannot use Breach without an appropriate weapon!") diff --git a/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua b/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua new file mode 100644 index 0000000000..0c094ad7b3 --- /dev/null +++ b/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua @@ -0,0 +1,339 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +-- EDGE TODO: Particles, Timed Effect Particles + +newTalent{ + name = "Cosmic Cycle", + type = {"chronomancy/induced-phenomena", 1}, + require = chrono_req_high1, + points = 5, + sustain_paradox = 36, + mode = "sustained", + no_sustain_autoreset = true, + cooldown = 12, + tactical = { BUFF = 2}, + range = 0, + radius = function(self, t) local p=self:isTalentActive(self.T_COSMIC_CYCLE) return p and p.radius or 0 end, + target = function(self, t) + return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t} + end, + iconOverlay = function(self, t, p) + local val = p.radius or 0 + if val <= 0 then return "" end + local fnt = "buff_font" + return tostring(math.ceil(val)), fnt + end, + getWillMultiplier = function(self, t) return self:combatTalentLimit(t, 100, 17, 50)/100 end, --Limit < 100% + getResistPen = function(self, t) return self:combatTalentLimit(t, 100, 17, 50) end, --Limit < 100% + callbackOnActBase = function(self, t) + local p = self:isTalentActive(self.T_COSMIC_CYCLE) + if not p then return end + p.old_tgts = p.new_tgts + p.new_tgts = {} + + -- Update our target table + self:project(self:getTalentTarget(t), self.x, self.y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if not target then return end + p.new_tgts[#p.new_tgts+1] = target + end) + + if self:knowTalent(self.T_REVERSE_CAUSALITY) then + self:callTalent(self.T_REVERSE_CAUSALITY, "doReverseCausality") + end + + if self:knowTalent(self.T_EPOCH) then + if p.mode == "expansion" then + self:callTalent(self.T_EPOCH, "doAging") + else + self:callTalent(self.T_EPOCH, "doRegression") + end + end + end, + doExpansion = function(self, t, radius) + local p = self:isTalentActive(self.T_COSMIC_CYCLE) + + -- Update Radius + p.radius = radius or p.radius + self:removeParticles(p.particle) + p.particle = self:addParticles(Particles.new("circle", 1, {shader=true, toback=true, a=55, appear=0, speed=0.2, img="cycle_expansion", radius=p.radius})) + + if p.mode ~= "expansion" then + -- change mode + p.mode = "expansion" + + -- Update temporary values + self:removeTemporaryValue("paradox_will_multi", p.will) + p.resist = self:addTemporaryValue("resists_pen", {[DamageType.TEMPORAL] = t.getResistPen(self, t)}) + end + + game.logPlayer(self, "#LIGHT_BLUE#Your cosmic cycle expands.") + + end, + doContraction = function(self, t, radius) + local p = self:isTalentActive(self.T_COSMIC_CYCLE) + + -- Change radius and particles + p.radius = radius or p.radius + self:removeParticles(p.particle) + p.particle = self:addParticles(Particles.new("circle", 1, {shader=true, toback=true, a=55, appear=0, speed=-0.2, img="cycle_contraction", radius=p.radius})) + + if p.mode ~= "contraction" then + p.mode = "contraction" + + -- Update temporary values + self:removeTemporaryValue("resists_pen", p.resist) + p.will = self:addTemporaryValue("paradox_will_multi", t.getWillMultiplier(self, t)) + end + + game.logPlayer(self, "#LIGHT_RED#Your cosmic cycle contracts.") + + end, + doCosmicCycle = function(self, t) + game:onTickEnd(function() + local p = self:isTalentActive(self.T_COSMIC_CYCLE) + if not p then return end + local radius = math.floor(self:getParadox()/100) + + -- Cycle between expansion and contraction + if radius > p.radius then + t.doExpansion(self, t, radius) + elseif radius < p.radius then + t.doContraction(self, t, radius) + end + end) + end, + activate = function(self, t) + local radius = math.floor(self:getParadox()/100) + local will = self:addTemporaryValue("paradox_will_multi", 0) + local resist = self:addTemporaryValue("resists_pen", {[DamageType.TEMPORAL] = t.getResistPen(self, t)}) + + local ret ={ + mode = "expansion", radius = radius, new_tgts ={}, old_tgts ={}, resist = resist, will = will, + particle = self:addParticles(Particles.new("circle", 1, {shader=true, toback=true, a=55, appear=0, speed=0.2, img="cycle_expansion", radius=radius})) + } + game:playSoundNear(self, "talents/arcane") + return ret + end, + deactivate = function(self, t, p) + self:removeParticles(p.particle) + self:removeTemporaryValue("resists_pen", p.resist) + self:removeTemporaryValue("paradox_will_multi", p.will) + return true + end, + info = function(self, t) + local paradox = t.getResistPen(self, t) + local will = t.getWillMultiplier(self, t) * 100 + return ([[Tune yourself into the ebb and flow of spacetime. When your Paradox crosses a 100 point threshold, your Cosmic Cycle gains or loses one radius. + While Cosmic Cycle is expanding, your temporal resistance penetration will be increased by %d%%. While it's contracting, your Willpower for Paradox calculations will be increased by %d%%.]]): + format(paradox, will) + end, +} + +newTalent{ + name = "Polarity Shift", + type = {"chronomancy/induced-phenomena",2}, + require = chrono_req_high2, + points = 5, + cooldown = 6, + tactical = { BUFF = 2, ATTACKAREA = {TEMPORAL = 2} }, + direct_hit = true, + requires_target = true, + on_pre_use = function(self, t, silent) if not self:isTalentActive(self.T_COSMIC_CYCLE) then if not silent then game.logPlayer(self, "You must have Cosmic Cycle active to use this talent.") end return false end return true end, + radius = function(self, t) local p=self:isTalentActive(self.T_COSMIC_CYCLE) return p and p.radius or 0 end, + target = function(self, t) + return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, friendlyfire=false, talent=t} + end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 100) end, + getBraid = function(self, t) return self:combatTalentSpellDamage(t, 25, 50, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, + action = function(self, t) + local p = self:isTalentActive(self.T_COSMIC_CYCLE) + local tg = self:getTalentTarget(t) + + if p.mode == "contraction" then + self:callTalent(self.T_COSMIC_CYCLE, "doExpansion") + + local dam = self:spellCrit(t.getDamage(self, t)) + self:project(tg, self.x, self.y, function(tx, ty) + local target = game.level.map(tx, ty, engine.Map.ACTOR) + if not target then return end + + local proj = require("mod.class.Projectile"):makeHoming( + self, + {particle="arrow", particle_args={tile=("particles_images/alt_temporal_bolt_0%d"):format(rng.range(1, 7)), proj_x=tx, proj_y=ty, src_x=self.x, src_y=self.y}, trail="trail_paradox"}, + {speed=1, name="Polarity Bolt", dam=dam, movedam=dam}, + target, + self:getTalentRadius(t), + function(self, src) + local DT = require("engine.DamageType") + DT:get(DT.TEMPORAL).projector(src, self.x, self.y, DT.TEMPORAL, self.def.movedam) + end, + function(self, src, target) + local DT = require("engine.DamageType") + DT:get(DT.TEMPORAL).projector(src, self.x, self.y, DT.TEMPORAL, self.def.movedam) + end + ) + game.zone:addEntity(game.level, proj, "projectile", self.x, self.y) + end) + + else + self:callTalent(self.T_COSMIC_CYCLE, "doContraction") + + -- Get our targets + local braid_targets = {} + self:project(tg, self.x, self.y, function(tx, ty) + local target = game.level.map(tx, ty, engine.Map.ACTOR) + if target then + braid_targets[#braid_targets+1] = target + end + end) + + -- if we hit more than one, braid them + if #braid_targets > 1 then + for i = 1, #braid_targets do + local target = braid_targets[i] + target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getBraid(self, t), src=self, targets=braid_targets}) + end + end + end + + game:playSoundNear(self, "talents/spell_generic") + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local braid = t.getBraid(self, t) + local duration = t.getDuration(self, t) + return ([[Reverses the polarity of your Cosmic Cycle. If it's currently contracting, it will begin to expand, firing a homing missile at each target within the radius that deals %0.2f temporal damage. + If it's currently expanding, it will begin to contract, braiding the lifelines of all targets within the radius for %d turns. Braided targets take %d%% of all damage dealt to other braided targets. + The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration, braid) + end, +} + +newTalent{ + name = "Reverse Causality", + type = {"chronomancy/induced-phenomena", 3}, + require = chrono_req_high3, + points = 5, + mode = "passive", + getHeal = function(self, t) return self:combatTalentSpellDamage(t, 15, 70, getParadoxSpellpower(self, t)) end, + getReduction= function(self, t) return math.floor(self:combatTalentScale(t, 1, 5)) end, + doReverseCausality = function(self, t) + local p = self:isTalentActive(self.T_COSMIC_CYCLE) + if not p then return end + + local keys = table.compareKeys(p.new_tgts, p.old_tgts) + if p.mode == "expansion" then + local heal = self:spellCrit(t.getHeal(self, t)) + heal = heal * #keys.left + if heal > 0 then + self:heal(heal, self) + end + else + local effs = {} + for eff_id, p in pairs(self.tmp) do + local e = self.tempeffect_def[eff_id] + if e.type ~= "other" and e.status == "detrimental" then + effs[#effs+1] = p + end + end + + for i=1, #keys.right do + local eff = effs[i] + if not eff then break end + eff.dur = eff.dur - t.getReduction(self, t) + if eff.dur <= 0 then + self:removeEffect(eff.effect_id) + effs[i] = nil + end + end + end + + end, + info = function(self, t) + local heal = t.getHeal(self, t) + local reduction = t.getReduction(self, t) + return ([[When a creature enters your expanding Cosmic Cycle, you heal %d life at the start of your next turn. + When a creature leaves your contracting Cosmic Cycle, you reduce the duration of one detrimental effect on you by %d at the start of your next turn. + The healing will scale with your Spellpower.]]):format(heal, reduction) + end, +} + +newTalent{ + name = "Epoch", + type = {"chronomancy/induced-phenomena", 4}, + require = chrono_req_high4, + points = 5, + mode = "passive", + radius = function(self, t) local p=self:isTalentActive(self.T_COSMIC_CYCLE) return p and p.radius or 0 end, + target = function(self, t) + return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, friendlyfire=false, talent=t} + end, + getRegression = function(self, t) return self:combatTalentSpellDamage(t, 5, 25, getParadoxSpellpower(self, t)) end, + getAgingChance = function(self, t) return paradoxTalentScale(self, t, 15, 50, 100) end, + doAging = function(self, t) + local tg = self:getTalentTarget(t) + + self:project(self:getTalentTarget(t), self.x, self.y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if not target then return end + + if rng.percent(t.getAgingChance(self, t)) then + local effect = rng.range(1, 3) + if effect == 1 then + if target:canBe("blind") then + target:setEffect(target.EFF_BLINDED, 3, {apply_power=getParadoxSpellpower(self, t), no_ct_effect=true}) + else + game.logSeen(target, "%s resists the blindness!", target.name:capitalize()) + end + elseif effect == 2 then + if target:canBe("pin") then + target:setEffect(target.EFF_PINNED, 3, {apply_power=getParadoxSpellpower(self, t), no_ct_effect=true}) + else + game.logSeen(target, "%s resists the pin!", target.name:capitalize()) + end + elseif effect == 3 then + if target:canBe("confusion") then + target:setEffect(target.EFF_CONFUSED, 3, {power=50, apply_power=getParadoxSpellpower(self, t), no_ct_effect=true}) + else + game.logSeen(target, "%s resists the confusion!", target.name:capitalize()) + end + end + end + end) + end, + doRegression = function(self, t) + local tg = self:getTalentTarget(t) + + self:project(self:getTalentTarget(t), self.x, self.y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if not target then return end + target:setEffect(target.EFF_REGRESSION, 1, {power=t.getRegression(self, t), apply_power=getParadoxSpellpower(self, t), no_ct_effect=true}) + end) + end, + info = function(self, t) + local regress = t.getRegression(self, t) + local aging = t.getAgingChance(self, t) + return ([[While your cosmic cycle is expanding, creatures in its radius have a %d%% chance to suffer the effects of aging; pinning, blinding, or confusing them for 3 turns. + While your cosmic cycle is contracting, creatures in its radius suffer from age regression; reducing their three highest stats by %d. + The chance and stat reduction will scale with your Spellpower.]]):format(aging, regress) + end, +} \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/matter.lua b/game/modules/tome/data/talents/chronomancy/matter.lua index 7347030e75..7d50b7ea94 100644 --- a/game/modules/tome/data/talents/chronomancy/matter.lua +++ b/game/modules/tome/data/talents/chronomancy/matter.lua @@ -32,7 +32,7 @@ newTalent{ target = function(self, t) return {type="beam", range=self:getTalentRange(t), talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) @@ -60,8 +60,8 @@ newTalent{ sustain_paradox = 20, cooldown = 12, tactical = { BUFF =2, DEFEND = 2 }, - getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 1, 150, getParadoxSpellpower(self)) end, - getArmor = function(self, t) return math.ceil(self:combatTalentSpellDamage(t, 20, 50, getParadoxSpellpower(self))) end, + getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 1, 150, getParadoxSpellpower(self, t)) end, + getArmor = function(self, t) return math.ceil(self:combatTalentSpellDamage(t, 20, 50, getParadoxSpellpower(self, t))) end, do_carbonRegrowth = function(self, t) local maxspikes = t.getArmor(self, t) if self.carbon_armor < maxspikes then @@ -112,8 +112,8 @@ newTalent{ tactical = { ATTACK = 2 }, requires_target = true, direct_hit = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 60, getParadoxSpellpower(self)) end, - getExplosion = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 60, getParadoxSpellpower(self, t)) end, + getExplosion = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = {type="hit", range=self:getTalentRange(t), talent=t} local x, y = self:getTarget(tg) @@ -152,7 +152,7 @@ newTalent{ target = function(self, t) return {type="hit", range=self:getTalentRange(t), talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 30, 300, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 30, 300, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y, target = self:getTarget(tg) @@ -196,5 +196,4 @@ newTalent{ Quantum Spike deals 50%% additional damage to targets affected by temporal destabilization and/or continuum destabilization. The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2)) end, -} - +} \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/other.lua b/game/modules/tome/data/talents/chronomancy/other.lua index 2196d55db7..cce458a64d 100644 --- a/game/modules/tome/data/talents/chronomancy/other.lua +++ b/game/modules/tome/data/talents/chronomancy/other.lua @@ -23,10 +23,8 @@ -- Note that 300 is the optimal balance -- Caps at -50% and +50% getParadoxModifier = function (self) - local pm = util.bound(math.sqrt(self:getParadox() / 300), 0.5, 1.5) --- local pm = math.sqrt(self:getParadox()/300) --- pm = math.min(1.5, pm) --- pm = math.max(0.5, pm) + local paradox = self:getParadox() + local pm = util.bound(math.sqrt(paradox / 300), 0.5, 1.5) return pm end @@ -37,13 +35,42 @@ getParadoxCost = function (self, t, value) end -- Paradox Spellpower (regulates spellpower for chronomancy) -getParadoxSpellpower = function(self, mod, add) +getParadoxSpellpower = function(self, t, mod, add) local pm = getParadoxModifier(self) - local mod = mod or 0 - local spellpower = self:combatSpellpower(pm + mod, add) + local mod = mod or 1 + + -- Empower? + local p = self:isTalentActive(self.T_EMPOWER) + if p and p.talent == t.id then + pm = pm + self:callTalent(self.T_EMPOWER, "getPower") + end + + local spellpower = self:combatSpellpower(mod * pm, add) return spellpower end +-- Paradox Talent scaling based on Spellpower (thanks grayswandir) +paradoxTalentScale = function(self, t, low, high, limit) + local low_power = 50 + local high_power = 150 + return self:combatLimit( + self:combatTalentSpellDamage(t, low_power, high_power, getParadoxSpellpower(self, t)), + limit, + low, low_power, + high, high_power) +end + +-- Extension Spellbinding +getExtensionModifier = function(self, t, value) + local mod = 1 + local p = self:isTalentActive(self.T_EXTENSION) + if p and p.talent == t.id then + mod = mod + self:callTalent(self.T_EXTENSION, "getPower") + end + value = math.ceil(value * mod) + return value +end + --- Warden weapon functions -- Checks for weapons in main and quickslot doWardenPreUse = function(self, weapon, silent) @@ -130,11 +157,15 @@ makeParadoxClone = function(self, target, duration) m.puuid = nil m.on_acquire_target = nil m.no_inventory_access = true + m.no_levelup_access = true m.on_takehit = nil m.seen_by = nil m.can_talk = nil m.clone_on_hit = nil m.self_resurrect = nil + m.escort_quest = nil + m.unused_talents = 0 + m.unused_generics = 0 if m.talents.T_SUMMON then m.talents.T_SUMMON = nil end if m.talents.T_MULTIPLY then m.talents.T_MULTIPLY = nil end @@ -146,12 +177,11 @@ makeParadoxClone = function(self, target, duration) local tids = {} for tid, _ in pairs(m.talents) do local t = m:getTalentFromId(tid) - if t.no_npc_use then tids[#tids+1] = t end - if t.remove_on_clone then tids[#tids+1] = t end + if (t.no_npc_use and not t.allow_temporal_clones) or t.remove_on_clone then tids[#tids+1] = t end end for i, t in ipairs(tids) do if t.mode == "sustained" and m:isTalentActive(t.id) then m:forceUseTalent(t.id, {ignore_energy=true, silent=true}) end - m.talents[t.id] = nil + m:unlearnTalentFull(t.id) end -- remove timed effects @@ -233,10 +263,10 @@ newTalent{ info = function(self, t) local duration = t.getDuration(self, t) local preference = self.preferred_paradox - local spellpower = getParadoxSpellpower(self) + local spellpower = getParadoxSpellpower(self, t) local after_will, will_modifier, sustain_modifier = self:getModifiedParadox() local anomaly = self:paradoxFailChance() - return ([[Use to set your preferred Paradox. While resting you'll adjust your Paradox towards this number over %d turns. + return ([[Use to set your preferred Paradox. While resting or waiting you'll adjust your Paradox towards this number over %d turns. The time it takes you to adjust your Paradox scales down with your Spellpower to a minimum of 10 turns. Preferred Paradox : %d @@ -265,7 +295,7 @@ newTalent{ return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t} end, getDuration = function(self, t) return math.ceil(self:combatTalentScale(self:getTalentLevel(t), 2.3, 4.3)) end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) @@ -303,8 +333,8 @@ newTalent{ target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} end, - getSlow = function(self, t) return math.min(10 + self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self))/ 100 , 0.6) end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 60, getParadoxSpellpower(self)) end, + getSlow = function(self, t) return math.min(10 + self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t))/ 100 , 0.6) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 60, getParadoxSpellpower(self, t)) end, getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, action = function(self, t) local tg = self:getTalentTarget(t) @@ -334,72 +364,6 @@ newTalent{ end, } -newTalent{ - name = "Swap", - type = {"chronomancy/other", 1}, - require = chrono_req1, - points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 10) end, - cooldown = 10, - tactical = { DISABLE = 2, }, - requires_target = true, - direct_hit = true, - range = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, - getConfuseDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 3, 7)) end, - getConfuseEfficency = function(self, t) return math.min(50, self:getTalentLevelRaw(t) * 10) end, - action = function(self, t) - local tg = {type="hit", range=self:getTalentRange(t)} - local tx, ty, target = self:getTarget(tg) - if not tx or not ty then return nil end - if tx then - local _ _, tx, ty = self:canProject(tg, tx, ty) - if tx then - target = game.level.map(tx, ty, Map.ACTOR) - if not target then return nil end - end - end - - -- checks for spacetime mastery hit bonus - local power = getParadoxSpellpower(self) - if self:knowTalent(self.T_SPACETIME_MASTERY) then - power = getParadoxSpellpower(self) * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower")) - end - - if target:canBe("teleport") and self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) then - -- first remove the target so the destination tile is empty - game.level.map:remove(target.x, target.y, Map.ACTOR) - local px, py - px, py = self.x, self.y - if self:teleportRandom(tx, ty, 0) then - -- return the target at the casters old location - game.level.map(px, py, Map.ACTOR, target) - self.x, self.y, target.x, target.y = target.x, target.y, px, py - game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") - game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") - target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self:combatSpellpower(0.3)}) - -- confuse them - self:project(tg, target.x, target.y, DamageType.CONFUSION, { dur = t.getConfuseDuration(self, t), dam = t.getConfuseEfficency(self, t), }) - else - -- return the target without effect - game.level.map(target.x, target.y, Map.ACTOR, target) - game.logSeen(self, "The spell fizzles!") - end - else - game.logSeen(target, "%s resists the swap!", target.name:capitalize()) - end - - game:playSoundNear(self, "talents/teleport") - return true - end, - info = function(self, t) - local range = self:getTalentRange(t) - local duration = t.getConfuseDuration(self, t) - local power = t.getConfuseEfficency(self, t) - return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d. The targeted creature will be confused (power %d%%) for %d turns. - The spell's hit chance will increase with your Spellpower.]]):format (range, power, duration) - end, -} - newTalent{ name = "Spacetime Mastery", type = {"chronomancy/other", 1}, @@ -518,4 +482,597 @@ newTalent{ This spell takes no time to cast.]]): format(power, duration) end, +} + +newTalent{ + name = "Gather the Threads", + type = {"chronomancy/other", 1}, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, + cooldown = 12, + tactical = { BUFF = 2 }, + getThread = function(self, t) return self:combatTalentScale(t, 7, 30, 0.75) end, + getReduction = function(self, t) return self:combatTalentScale(t, 3.6, 15, 0.75) end, + action = function(self, t) + self:setEffect(self.EFF_GATHER_THE_THREADS, 5, {power=t.getThread(self, t), reduction=t.getReduction(self, t)}) + game:playSoundNear(self, "talents/spell_generic2") + return true + end, + info = function(self, t) + local primary = t.getThread(self, t) + local reduction = t.getReduction(self, t) + return ([[You begin to gather energy from other timelines. Your Spellpower will increase by %0.2f on the first turn and %0.2f more each additional turn. + The effect ends either when you cast a spell, or after five turns. + Eacn turn the effect is active, your Paradox will be reduced by %d. + This spell will not break Spacetime Tuning, nor will it be broken by activating Spacetime Tuning.]]):format(primary + (primary/5), primary/5, reduction) + end, +} + +newTalent{ + name = "Entropic Field", + type = {"chronomancy/other",1}, + mode = "sustained", + points = 5, + sustain_paradox = 20, + cooldown = 10, + tactical = { BUFF = 2 }, + getPower = function(self, t) return math.min(90, 10 + self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t))) end, + activate = function(self, t) + game:playSoundNear(self, "talents/heal") + return { + particle = self:addParticles(Particles.new("time_shield", 1)), + phys = self:addTemporaryValue("resists", {[DamageType.PHYSICAL]=t.getPower(self, t)/2}), + proj = self:addTemporaryValue("slow_projectiles", t.getPower(self, t)), + } + end, + deactivate = function(self, t, p) + self:removeParticles(p.particle) + self:removeTemporaryValue("resists", p.phys) + self:removeTemporaryValue("slow_projectiles", p.proj) + return true + end, + info = function(self, t) + local power = t.getPower(self, t) + return ([[You encase yourself in a field that slows incoming projectiles by %d%%, and increases your physical resistance by %d%%. + The effect will scale with your Spellpower.]]):format(power, power / 2) + end, +} + +newTalent{ + name = "Fade From Time", + type = {"chronomancy/other", 1}, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 24, + tactical = { DEFEND = 2, CURE = 2 }, + getResist = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end, + getdurred = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)), 100, 0, 0, 32.9, 32.9) end, -- Limit < 100% + action = function(self, t) + -- fading managed by FADE_FROM_TIME effect in mod.data.timed_effects.other.lua + self:setEffect(self.EFF_FADE_FROM_TIME, 10, {power=t.getResist(self, t), durred=t.getdurred(self,t)}) + game:playSoundNear(self, "talents/heal") + return true + end, + info = function(self, t) + local resist = t.getResist(self, t) + local dur = t.getdurred(self,t) + return ([[You partially remove yourself from the timeline for 10 turns. + This increases your resistance to all damage by %d%%, reduces the duration of all detrimental effects on you by %d%%, and reduces all damage you deal by 20%%. + The resistance bonus, effect reduction, and damage penalty will gradually lose power over the duration of the spell. + The effects scale with your Spellpower.]]): + format(resist, dur) + end, +} + +newTalent{ + name = "Paradox Clone", + type = {"chronomancy/other", 1}, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 50) end, + cooldown = 50, + tactical = { ATTACK = 1, DISABLE = 2 }, + range = 2, + requires_target = true, + no_npc_use = true, + getDuration = function(self, t) return math.floor(self:combatTalentLimit(self:getTalentLevel(t), 50, 4, 8)) end, -- Limit <50 + getModifier = function(self, t) return rng.range(t.getDuration(self,t)*2, t.getDuration(self, t)*4) end, + action = function (self, t) + if checkTimeline(self) == true then + return + end + + local tg = {type="bolt", nowarning=true, range=self:getTalentRange(t), nolock=true, talent=t} + local tx, ty = self:getTarget(tg) + if not tx or not ty then return nil end + local _ _, tx, ty = self:canProject(tg, tx, ty) + if not tx or not ty then return nil end + + local x, y = util.findFreeGrid(tx, ty, 2, true, {[Map.ACTOR]=true}) + if not x then + game.logPlayer(self, "Not enough space to summon!") + return + end + + local sex = game.player.female and "she" or "he" + local m = require("mod.class.NPC").new(self:cloneFull{ + no_drops = true, + faction = self.faction, + summoner = self, summoner_gain_exp=true, + exp_worth = 0, + summon_time = t.getDuration(self, t), + ai_target = {actor=nil}, + ai = "summoned", ai_real = "tactical", + ai_tactic = resolvers.tactic("ranged"), ai_state = { talent_in=1, ally_compassion=10}, + desc = [[The real you... or so ]]..sex..[[ says.]] + }) + m:removeAllMOs() + m.make_escort = nil + m.on_added_to_level = nil + + m.energy.value = 0 + m.player = nil + m.puuid = nil + m.max_life = m.max_life + m.life = util.bound(m.life, 0, m.max_life) + m.forceLevelup = function() end + m.die = nil + m.on_die = nil + m.on_acquire_target = nil + m.seen_by = nil + m.can_talk = nil + m.on_takehit = nil + m.no_inventory_access = true + m.clone_on_hit = nil + m.remove_from_party_on_death = true + + -- Remove some talents + local tids = {} + for tid, _ in pairs(m.talents) do + local t = m:getTalentFromId(tid) + if t.no_npc_use then tids[#tids+1] = t end + end + for i, t in ipairs(tids) do + m.talents[t.id] = nil + end + + game.zone:addEntity(game.level, m, "actor", x, y) + game.level.map:particleEmitter(x, y, 1, "temporal_teleport") + game:playSoundNear(self, "talents/teleport") + + if game.party:hasMember(self) then + game.party:addMember(m, { + control="no", + type="minion", + title="Paradox Clone", + orders = {target=true}, + }) + end + + self:setEffect(self.EFF_IMMINENT_PARADOX_CLONE, t.getDuration(self, t) + t.getModifier(self, t), {}) + return true + end, + info = function(self, t) + local duration = t.getDuration(self, t) + return ([[You summon your future self to fight alongside you for %d turns. At some point in the future, you'll be pulled into the past to fight alongside your past self after the initial effect ends. + This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.]]):format(duration) + end, +} + +newTalent{ + name = "Displace Damage", + type = {"chronomancy/other", 1}, + mode = "sustained", + require = chrono_req1, + sustain_paradox = 48, + cooldown = 10, + tactical = { BUFF = 2 }, + points = 5, + -- called by _M:onTakeHit function in mod\class\Actor.lua to perform the damage displacment + getDisplaceDamage = function(self, t) return self:combatTalentLimit(t, 25, 5, 15)/100 end, -- Limit < 25% + range = 10, + callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr) + if dam > 0 and src ~= self then + -- find available targets + local tgts = {} + local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true) + for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do + local a = game.level.map(x, y, Map.ACTOR) + if a and self:reactionToward(a) < 0 then + tgts[#tgts+1] = a + end + end end + + -- Displace the damage + local a = rng.table(tgts) + if a then + local displace = dam * t.getDisplaceDamage(self, t) + game:delayedLogMessage(self, a, "displace_damage"..(a.uid or ""), "#PINK##Source# displaces some damage onto #Target#!") + DamageType.defaultProjector(self, a.x, a.y, type, displace, tmp, true) + dam = dam - displace + end + end + + return {dam=dam} + end, + activate = function(self, t) + return {} + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local displace = t.getDisplaceDamage(self, t) * 100 + return ([[You bend space around you, displacing %d%% of any damage you receive onto a random enemy within range. + ]]):format(displace) + end, +} + +newTalent{ + name = "Repulsion Field", + type = {"chronomancy/other",1}, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 30) end, + cooldown = 14, + tactical = { ATTACKAREA = {PHYSICAL = 2}, ESCAPE = 2 }, + range = 0, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end, + target = function(self, t) + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false} + end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 80, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end, + direct_hit = true, + requires_target = true, + action = function(self, t) + local tg = self:getTalentTarget(t) + game.level.map:addEffect(self, + self.x, self.y, t.getDuration(self, t), + DamageType.REPULSION, t.getDamage(self, t), + tg.radius, + 5, nil, + engine.MapEffect.new{color_br=200, color_bg=120, color_bb=0, effect_shader="shader_images/paradox_effect.png"}, + function(e) + e.x = e.src.x + e.y = e.src.y + return true + end, + tg.selffire + ) + game:playSoundNear(self, "talents/cloud") + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local duration = t.getDuration(self, t) + local radius = self:getTalentRadius(t) + return ([[You surround yourself with a radius %d distortion of gravity, knocking back and dealing %0.2f physical damage to all creatures inside it. The effect lasts %d turns. Deals 50%% extra damage to pinned targets, in addition to the knockback. + The blast wave may hit targets more then once, depending on the radius and the knockback effect. + The damage will scale with your Spellpower.]]):format(radius, damDesc(self, DamageType.PHYSICAL, damage), duration) + end, +} + +newTalent{ + name = "Temporal Clone", + type = {"chronomancy/other", 1}, + points = 5, + cooldown = 12, + paradox = function (self, t) return getParadoxCost(self, t, 15) end, + tactical = { ATTACK = 2, DISABLE = 2 }, + requires_target = true, + range = 10, + remove_on_clone = true, + target = function (self, t) + return {type="hit", range=self:getTalentRange(t), talent=t, nowarning=true} + end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 12))) end, + getDamagePenalty = function(self, t) return 60 - math.min(self:combatTalentSpellDamage(t, 0, 20, getParadoxSpellpower(self, t)), 30) end, + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y, target = self:getTarget(tg) + if not x or not y then return nil end + local _ _, _, _, x, y = self:canProject(tg, x, y) + if not x or not y then return nil end + local target = game.level.map(x, y, Map.ACTOR) + if not target then return end + + -- Find space + local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) + if not tx then + game.logPlayer(self, "Not enough space to summon!") + return + end + + -- Rank Penalty + local duration = t.getDuration(self, t) + if target.rank > 1 then duration = math.ceil(t.getDuration(self, t)/(target.rank/2)) end + + -- Clone the target + local m = makeParadoxClone(self, target, duration) + -- Add and change some values + m.faction = self.faction + m.summoner = self + m.generic_damage_penalty = t.getDamagePenalty(self, t) + m.max_life = m.max_life * (100 - t.getDamagePenalty(self, t))/100 + m.life = m.max_life + m.remove_from_party_on_death = true + + -- Handle some AI stuff + m.ai_state = { talent_in=2, ally_compassion=10 } + + game.zone:addEntity(game.level, m, "actor", tx, ty) + + -- Set our target + if self:reactionToward(target) < 0 then + m:setTarget(target) + end + + if game.party:hasMember(self) then + game.party:addMember(m, { + control="no", + type="temporal-clone", + title="Temporal Clone", + orders = {target=true}, + }) + end + + game.level.map:particleEmitter(tx, ty, 1, "temporal_teleport") + game:playSoundNear(self, "talents/spell_generic") + + return true + end, + info = function(self, t) + local duration = t.getDuration(self, t) + local damage_penalty = t.getDamagePenalty(self, t) + return ([[Clones the target creature for up to %d turns. The duration of the effect will be divided by half the target's rank, and the target will have have %d%% of its normal life and deal %d%% less damage. + If you clone a hostile creature the clone will target the creature it was cloned from. + The life and damage penalties will be lessened by your Spellpower.]]): + format(duration, 100 - damage_penalty, damage_penalty) + end, +} + +newTalent{ + name = "Paradox Mastery", + type = {"chronomancy/other", 1}, + mode = "passive", + points = 5, + -- Static history bonus handled in timetravel.lua, backfire calcs performed by _M:getModifiedParadox function in mod\class\Actor.lua + WilMult = function(self, t) return self:combatTalentScale(t, 0.15, 0.5) end, + stabilityDuration = function(self, t) return math.floor(self:combatTalentScale(t, 0.4, 2.7, "log")) end, --This is still used by an older talent, leave it here for backwards compatability + passives = function(self, t, p) + self:talentTemporaryValue(p, "paradox_will_mutli", t.WilMult(self, t)) + end, + info = function(self, t) + return ([[You've learned to focus your control over the spacetime continuum, and quell anomalous effects. Increases your effective Willpower for anomaly calculations by %d%%.]]): + format(t.WilMult(self, t) * 100) + end, +} + +newTalent{ + name = "Damage Smearing", + type = {"chronomancy/other", 1}, + mode = "sustained", + sustain_paradox = 48, + cooldown = 24, + tactical = { DEFEND = 2 }, + points = 5, + getPercent = function(self, t) return self:combatTalentLimit(t, 50, 10, 30)/100 end, -- Limit < 50% + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 6))) end, + callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr) + if dam > 0 and type ~= DamageType.TEMPORAL then + local smear = dam * t.getPercent(self, t) + self:setEffect(self.EFF_DAMAGE_SMEARING, t.getDuration(self, t), {dam=smear/t.getDuration(self, t), no_ct_effect=true}) + game:delayedLogDamage(src, self, 0, ("%s(%d smeared)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", smear), false) + dam = dam - smear + end + + return {dam=dam} + end, + activate = function(self, t) + game:playSoundNear(self, "talents/spell_generic") + return {} + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local percent = t.getPercent(self, t) * 100 + local duration = t.getDuration(self, t) + return ([[You convert %d%% of all non-temporal damage you receive into temporal damage spread out over %d turns. + This damage will bypass resistance and affinity.]]):format(percent, duration) + end, +} + +newTalent{ + name = "Banish", + type = {"chronomancy/other", 1}, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, + cooldown = 10, + tactical = { ESCAPE = 2 }, + range = 0, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5.5)) end, + getTeleport = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 8, 16)) end, + target = function(self, t) + return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t} + end, + requires_target = true, + direct_hit = true, + action = function(self, t) + local tg = self:getTalentTarget(t) + local hit = false + + self:project(tg, self.x, self.y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if not target or target == self then return end + game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") + if self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) and target:canBe("teleport") then + if not target:teleportRandom(target.x, target.y, self:getTalentRadius(t) * 4, self:getTalentRadius(t) * 2) then + game.logSeen(target, "The spell fizzles on %s!", target.name:capitalize()) + else + target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=getParadoxSpellpower(self, t, 0.3)}) + game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") + hit = true + end + else + game.logSeen(target, "%s resists the banishment!", target.name:capitalize()) + end + end) + + if not hit then + game:onTickEnd(function() + if not self:attr("no_talents_cooldown") then + self.talents_cd[self.T_BANISH] = self.talents_cd[self.T_BANISH] /2 + end + end) + end + + game:playSoundNear(self, "talents/teleport") + + return true + end, + info = function(self, t) + local radius = self:getTalentRadius(t) + local range = t.getTeleport(self, t) + return ([[Randomly teleports all targets within a radius of %d around you. Targets will be teleported between %d and %d tiles from their current location. + If no targets are teleported the cooldown will be halved. + The chance of teleportion will scale with your Spellpower.]]):format(radius, range / 2, range) + end, +} + +newTalent{ + name = "Swap", + type = {"chronomancy/other", 1}, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, + cooldown = 10, + tactical = { DISABLE = 1 }, + requires_target = true, + direct_hit = true, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, + getConfuseDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 3, 7)) end, + getConfuseEfficency = function(self, t) return math.min(50, self:getTalentLevelRaw(t) * 10) end, + action = function(self, t) + local tg = {type="hit", range=self:getTalentRange(t)} + local tx, ty, target = self:getTarget(tg) + if not tx or not ty then return nil end + if tx then + local _ _, tx, ty = self:canProject(tg, tx, ty) + if tx then + target = game.level.map(tx, ty, Map.ACTOR) + if not target then return nil end + end + end + + -- Check hit + if target:canBe("teleport") and self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) then + -- Grab the caster's location + local px, py = self.x, self.y + + -- Remove the target so the destination tile is empty + game.level.map:remove(target.x, target.y, Map.ACTOR) + + -- Try to teleport to the target's old location + if self:teleportRandom(tx, ty, 0) then + -- Put the target back in the caster's old location + game.level.map(px, py, Map.ACTOR, target) + target.x, target.y = px, py + + -- confuse them + self:project(tg, target.x, target.y, DamageType.CONFUSION, { dur = t.getConfuseDuration(self, t), dam = t.getConfuseEfficency(self, t), apply_power=getParadoxSpellpower(self, t)}) + target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=getParadoxSpellpower(self, t, 0.3)}) + + game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") + game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + else + -- If we can't teleport, return the target + game.level.map(target.x, target.y, Map.ACTOR, target) + game.logSeen(self, "The spell fizzles!") + end + else + game.logSeen(target, "%s resists the swap!", target.name:capitalize()) + end + + game:playSoundNear(self, "talents/teleport") + return true + end, + info = function(self, t) + local range = self:getTalentRange(t) + local duration = t.getConfuseDuration(self, t) + local power = t.getConfuseEfficency(self, t) + return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d. The targeted creature will be confused (power %d%%) for %d turns. + The spell's hit chance will increase with your Spellpower.]]):format (range, power, duration) + end, +} + +newTalent{ + name = "Temporal Wake", + type = {"chronomancy/other", 1}, + points = 5, + random_ego = "attack", + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 10, + tactical = { ATTACK = {TEMPORAL = 1, PHYSICAL = 1}, CLOSEIN = 2, DISABLE = { stun = 2 } }, + direct_hit = true, + requires_target = true, + is_teleport = true, + target = function(self, t) + return {type="beam", start_x=x, start_y=y, range=self:getTalentRange(t), selffire=false, talent=t} + end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y, target = self:getTarget(tg) + if not x or not y then return nil end + if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then + game.logSeen(self, "You do not have line of sight.") + return nil + end + local _ _, x, y = self:canProject(tg, x, y) + local ox, oy = self.x, self.y + + -- If we target an actor directly project onto the other side of it (quality of life) + if target then + local dir = util.getDir(x, y, self.x, self.y) + x, y = util.coordAddDir(x, y, dir) + end + + -- since we're using a precise teleport we'll look for a free grid first + local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) + if tx and ty then + if not self:teleportRandom(tx, ty, 0) then + game.logSeen(self, "The teleport fizzles!") + else + local dam = self:spellCrit(t.getDamage(self, t)) + local x, y = ox, oy + self:project(tg, x, y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if target then + -- Deal warp damage first so we don't overwrite a big stun with a little one + DamageType:get(DamageType.WARP).projector(self, px, py, DamageType.WARP, dam) + + -- Try to stun + if target:canBe("stun") then + target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self, t)}) + else + game.logSeen(target, "%s resists the stun!", target.name:capitalize()) + end + end + end) + game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "temporal_lightning", {tx=x-self.x, ty=y-self.y}) + game:playSoundNear(self, "talents/lightning") + end + end + + return true + end, + info = function(self, t) + local stun = t.getDuration(self, t) + local damage = t.getDamage(self, t) + return ([[Violently fold the space between yourself and another point within range. + You teleport to the target location, and leave a temporal wake behind that stuns for %d turns and deals %0.2f temporal and %0.2f physical warp damage to targets in the path. + The damage will scale with your Spellpower.]]): + format(stun, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2)) + end, } \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/paradox.lua b/game/modules/tome/data/talents/chronomancy/paradox.lua index 936e39dc76..1cba0e3267 100644 --- a/game/modules/tome/data/talents/chronomancy/paradox.lua +++ b/game/modules/tome/data/talents/chronomancy/paradox.lua @@ -17,234 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -newTalent{ - name = "Paradox Mastery", - type = {"chronomancy/paradox", 1}, - mode = "passive", - require = chrono_req_high1, - points = 5, - -- Static history bonus handled in timetravel.lua, backfire calcs performed by _M:getModifiedParadox function in mod\class\Actor.lua - WilMult = function(self, t) return self:combatTalentScale(t, 0.15, 0.5) end, - stabilityDuration = function(self, t) return math.floor(self:combatTalentScale(t, 0.4, 2.7, "log")) end, - getResist = function(self, t) return self:combatTalentScale(t, 10, 35) end, - passives = function(self, t, p) - self:talentTemporaryValue(p, "resists", {[DamageType.TEMPORAL] = t.getResist(self, t)}) - end, - info = function(self, t) - return ([[You've learned to focus your control over the spacetime continuum, and quell anomalous effects. Increases your Temporal resistance by %d%%, extends the duration of the Static History stability effect by %d turns, and increases your effective willpower for failure, anomaly, and backfire calculations by %d%%.]]): - format(t.getResist(self, t), t.stabilityDuration(self, t), t.WilMult(self, t) * 100) - end, -} +-- EDGE TODO: Particles, Timed Effect Particles -newTalent{ - name = "Cease to Exist", - type = {"chronomancy/paradox", 2}, - require = chrono_req_high2, - points = 5, - cooldown = 24, - paradox = function (self, t) return getParadoxCost(self, t, 40) end, - range = 10, - tactical = { ATTACK = 2 }, - requires_target = true, - direct_hit = true, - no_npc_use = true, - getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 5, 9)) end, - getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end, - -- Resistance reduction handled under CEASE_TO_EXIST in data\timed_effects\magical.lua - getPower = function(self, t) - return self:combatLimit(self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)), 100, 0, 0, 32.9, 32.9) -- Limit < 100% - end, - on_pre_use = function(self, t, silent) - if checkTimeline(self) then - if not silent then - game.logPlayer(self, "The timeline is too fractured to do this now.") - end - return false - end - return true - end, - do_instakill = function(self, t) - -- search for target because it's ID will change when the chrono restore takes place - local tg = false - local grids = core.fov.circle_grids(self.x, self.y, 10, true) - for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do - local a = game.level.map(x, y, Map.ACTOR) - if a and a:hasEffect(a.EFF_CEASE_TO_EXIST) then - tg = a - end - end end - - if tg then - game:onTickEnd(function() - tg:removeEffect(tg.EFF_CEASE_TO_EXIST) - game.logSeen(tg, "#LIGHT_BLUE#%s never existed, this never happened!", tg.name:capitalize()) - tg:die(self) - end) - end - end, - action = function(self, t) - -- get our target - local tg = {type="hit", range=self:getTalentRange(t)} - local tx, ty = self:getTarget(tg) - if not tx or not ty then return nil end - local _ _, tx, ty = self:canProject(tg, tx, ty) - - local target = game.level.map(tx, ty, Map.ACTOR) - if not target then return end - if target == self then - game.logSeen(self, "#LIGHT_STEEL_BLUE#%s tries to remove %sself from existance!", self.name, string.his_her(self)) - self:incParadox(400) - game.level.map:particleEmitter(self.x, self.y, 1, "ball_temporal", {radius=1, tx=self.x, ty=self.y}) - return true - end - - -- does the spell hit? if not nothing happens - if not self:checkHit(self:combatSpellpower(), target:combatSpellResist()) then - game.logSeen(target, "%s resists!", target.name:capitalize()) - return true - end - - -- Manualy start cooldown before the chronoworld is made - game.player:startTalentCooldown(t) - - -- set up chronoworld next, we'll load it when the target dies in class\actor - game:onTickEnd(function() - game:chronoClone("cease_to_exist") - end) - - target:setEffect(target.EFF_CEASE_TO_EXIST, t.getDuration(self,t), {power=t.getPower(self, t)}) - - return true - end, - info = function(self, t) - local duration = t.getDuration(self, t) - local power = t.getPower(self, t) - return ([[Over the next %d turns, you attempt to remove the target from the timeline. Its resistances will be reduced by %d%%, and if you manage to kill it while the spell is in effect, you'll be returned to the point in time you cast this spell and the target will be slain. - This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful. - The duration will scale with your Paradox and the resistance penalty will scale with your Spellpower.]]) - :format(duration, power) - end, -} -newTalent{ - name = "Fade From Time", - type = {"chronomancy/paradox", 3}, - require = chrono_req_high3, - points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 20) end, - cooldown = 24, - tactical = { DEFEND = 2, CURE = 2 }, - getResist = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end, - getdurred = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)), 100, 0, 0, 32.9, 32.9) end, -- Limit < 100% - action = function(self, t) - -- fading managed by FADE_FROM_TIME effect in mod.data.timed_effects.other.lua - self:setEffect(self.EFF_FADE_FROM_TIME, 10, {power=t.getResist(self, t), durred=t.getdurred(self,t)}) - game:playSoundNear(self, "talents/heal") - return true - end, - info = function(self, t) - local resist = t.getResist(self, t) - local dur = t.getdurred(self,t) - return ([[You partially remove yourself from the timeline for 10 turns. - This increases your resistance to all damage by %d%%, reduces the duration of all detrimental effects on you by %d%%, and reduces all damage you deal by 20%%. - The resistance bonus, effect reduction, and damage penalty will gradually lose power over the duration of the spell. - The effects scale with your Spellpower.]]): - format(resist, dur) - end, -} - -newTalent{ - name = "Paradox Clone", - type = {"chronomancy/paradox", 4}, - require = chrono_req_high4, - points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 50) end, - cooldown = 50, - tactical = { ATTACK = 1, DISABLE = 2 }, - range = 2, - requires_target = true, - no_npc_use = true, - getDuration = function(self, t) return math.floor(self:combatTalentLimit(self:getTalentLevel(t), 50, 4, 8)) end, -- Limit <50 - getModifier = function(self, t) return rng.range(t.getDuration(self,t)*2, t.getDuration(self, t)*4) end, - action = function (self, t) - if checkTimeline(self) == true then - return - end - - local tg = {type="bolt", nowarning=true, range=self:getTalentRange(t), nolock=true, talent=t} - local tx, ty = self:getTarget(tg) - if not tx or not ty then return nil end - local _ _, tx, ty = self:canProject(tg, tx, ty) - if not tx or not ty then return nil end - - local x, y = util.findFreeGrid(tx, ty, 2, true, {[Map.ACTOR]=true}) - if not x then - game.logPlayer(self, "Not enough space to summon!") - return - end - - local sex = game.player.female and "she" or "he" - local m = require("mod.class.NPC").new(self:cloneFull{ - no_drops = true, - faction = self.faction, - summoner = self, summoner_gain_exp=true, - exp_worth = 0, - summon_time = t.getDuration(self, t), - ai_target = {actor=nil}, - ai = "summoned", ai_real = "tactical", - ai_tactic = resolvers.tactic("ranged"), ai_state = { talent_in=1, ally_compassion=10}, - desc = [[The real you... or so ]]..sex..[[ says.]] - }) - m:removeAllMOs() - m.make_escort = nil - m.on_added_to_level = nil - - m.energy.value = 0 - m.player = nil - m.puuid = nil - m.max_life = m.max_life - m.life = util.bound(m.life, 0, m.max_life) - m.forceLevelup = function() end - m.die = nil - m.on_die = nil - m.on_acquire_target = nil - m.seen_by = nil - m.can_talk = nil - m.on_takehit = nil - m.no_inventory_access = true - m.clone_on_hit = nil - m.remove_from_party_on_death = true - - -- Remove some talents - local tids = {} - for tid, _ in pairs(m.talents) do - local t = m:getTalentFromId(tid) - if t.no_npc_use then tids[#tids+1] = t end - end - for i, t in ipairs(tids) do - m.talents[t.id] = nil - end - - game.zone:addEntity(game.level, m, "actor", x, y) - game.level.map:particleEmitter(x, y, 1, "temporal_teleport") - game:playSoundNear(self, "talents/teleport") - - if game.party:hasMember(self) then - game.party:addMember(m, { - control="no", - type="minion", - title="Paradox Clone", - orders = {target=true}, - }) - end - - self:setEffect(self.EFF_IMMINENT_PARADOX_CLONE, t.getDuration(self, t) + t.getModifier(self, t), {}) - return true - end, - info = function(self, t) - local duration = t.getDuration(self, t) - return ([[You summon your future self to fight alongside you for %d turns. At some point in the future, you'll be pulled into the past to fight alongside your past self after the initial effect ends. - This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.]]):format(duration) - end, -} diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua index b32c5ab6f6..e8c0b67bab 100644 --- a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua +++ b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua @@ -21,15 +21,99 @@ local Trap = require "mod.class.Trap" +makeWarpMine = function(self, t, x, y, type) + -- Mine values + local dam = self:spellCrit(self:callTalent(self.T_WARP_MINES, "getDamage")) + local duration = self:callTalent(self.T_WARP_MINES, "getDuration") + local detect = math.floor(self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8) + local disarm = math.floor(self:callTalent(self.T_WARP_MINES, "trapPower")) + local power = getParadoxSpellpower(self, t) + local dest_power = getParadoxSpellpower(self, t, 0.3) + + -- Our Mines + local mine = Trap.new{ + name = ("warp mine: %s"):format(type), + type = "temporal", id_by_type=true, unided_name = "trap", + display = '^', color=colors.BLUE, image = ("trap/chronomine_%s_0%d.png"):format(type == "toward" and "blue" or "red", rng.avg(1, 4, 3)), + shader = "shadow_simulacrum", shader_args = { color = {0.2, 0.2, 0.2}, base = 0.8, time_factor = 1500 }, + dam = dam, t=t, power = power, dest_power = dest_power, + temporary = duration, + x = x, y = y, type = type, + summoner = self, summoner_gain_exp = true, + disarm_power = disarm, detect_power = detect, + canTrigger = function(self, x, y, who) + if who:reactionToward(self.summoner) < 0 then return mod.class.Trap.canTrigger(self, x, y, who) end + return false + end, + triggered = function(self, x, y, who) + -- Project our damage + self.summoner:project({type="hit",x=x,y=y, talent=t}, x, y, engine.DamageType.WARP, self.dam) + + -- Teleport? + if not who.dead then + -- Does our teleport hit? + local hit = self.summoner:checkHit(self.power, who:combatSpellResist() + (who:attr("continuum_destabilization") or 0)) and who:canBe("teleport") + if hit then + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + local teleport_done = false + + if self.type == "toward" then + -- since we're using a precise teleport we'll look for a free grid first + local tx, ty = util.findFreeGrid(self.summoner.x, self.summoner.y, 5, true, {[engine.Map.ACTOR]=true}) + if tx and ty then + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + if not who:teleportRandom(self.summoner.x, self.summoner.y, 1, 0) then + game.logSeen(self, "The teleport fizzles!") + else + teleport_done = true + end + end + elseif self.type == "away" then + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + if not who:teleportRandom(self.summoner.x, self.summoner.y, 10, 5) then + game.logSeen(self, "The teleport fizzles!") + else + teleport_done = true + end + end + + -- Destabailize? + if teleport_done then + who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power}) + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + game:playSoundNear(self, "talents/teleport") + end + else + game.logSeen(who, "%s resists the teleport!", who.name:capitalize()) + end + end + + return true, true + end, + canAct = false, + energy = {value=0}, + act = function(self) + self:useEnergy() + self.temporary = self.temporary - 1 + if self.temporary <= 0 then + if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end + game.level:removeEntity(self) + end + end, + } + + return mine +end + newTalent{ name = "Warp Mines", type = {"chronomancy/spacetime-folding", 1}, points = 5, mode = "passive", require = chrono_req1, - getRange = function(self, t) return math.floor(self:combatTalentScale(t, 5, 10, 0.5, 0, 1)) end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, -- Duration of glyph + getRange = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end, -- Duration of mines trapPower = function(self,t) return math.max(1,self:combatScale(self:getTalentLevel(t) * self:getMag(15, true), 0, 0, 75, 75)) end, -- Used to determine detection and disarm power, about 75 at level 50 on_learn = function(self, t) local lev = self:getTalentLevelRaw(t) @@ -52,10 +136,10 @@ newTalent{ local disarm = t.trapPower(self,t) local duration = t.getDuration(self, t) return ([[Learn to lay Warp Mines in a radius of 1 out to a range of %d. - Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f temporal and %0.2f physical damage. + Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f physical and %0.2f temporal (warp) damage. The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns. The damage caused by your Warp Mines will improve with your Spellpower.]]): - format(range, damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage), detect, disarm, duration) --I5 + format(range, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) --I5 end, } @@ -65,7 +149,7 @@ newTalent{ points = 1, cooldown = 10, paradox = function (self, t) return getParadoxCost(self, t, 10) end, - tactical = { ATTACKAREA = { TEMPORAL = 2 }, CLOSEIN = 2 }, + tactical = { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, CLOSEIN = 2 }, requires_target = true, range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange")end, no_unlearn_last = true, @@ -75,76 +159,17 @@ newTalent{ local tx, ty = self:getTarget(tg) if not tx or not ty then return nil end local __, tx, ty = self:canProject(tg, tx, ty) - - - local dam = self:spellCrit(self:callTalent(self.T_WARP_MINES, "getDamage")) - local duration = self:callTalent(self.T_WARP_MINES, "getDuration") - local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8 - local disarm = self:callTalent(self.T_WARP_MINES, "trapPower") - + -- Lay the mines in a ball self:project(tg, tx, ty, function(px, py) local target_trap = game.level.map(px, py, Map.TRAP) if target_trap then return end if game.level.map:checkEntity(px, py, Map.TERRAIN, "block_move") then return end - -- Our Mines - local power = getParadoxSpellpower(self) - local trap = Trap.new{ - name = "warp mine: toward", - type = "temporal", id_by_type=true, unided_name = "trap", - display = '^', color=colors.BLUE, image = "trap/trap_warpmine_01.png", - shader = "shadow_simulacrum", - shader_args = { color = {0.2, 0.2, 0.6}, base = 0.8, time_factor = 1500 }, - dam = dam, power = power, - canTrigger = function(self, x, y, who) - if who:reactionToward(self.summoner) < 0 then return mod.class.Trap.canTrigger(self, x, y, who) end - return false - end, - triggered = function(self, x, y, who) - self:project({type="hit",x=x,y=y}, x, y, engine.DamageType.MATTER, self.dam) - -- Teleport Toward - if not who.dead then - local hit = self.summoner:checkHit(self.power, who:combatSpellResist() + (who:attr("continuum_destabilization") or 0)) and who:canBe("teleport") - if not hit then - game.logSeen(who, "%s resists the teleport!", who.name:capitalize()) - else - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - -- since we're using a precise teleport we'll look for a free grid first - local tx, ty = util.findFreeGrid(self.summoner.x, self.summoner.y, 5, true, {[Map.ACTOR]=true}) - if tx and ty then - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - if not who:teleportRandom(self.summoner.x, self.summoner.y, 1, 0) then - game.logSeen(self, "The warp fizzles!") - else - who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=power*0.3}) - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - end - end - end - end - - return true, true - end, - temporary = duration, - x = px, y = py, - disarm_power = math.floor(disarm), - detect_power = math.floor(detect), - canAct = false, - energy = {value=0}, - act = function(self) - self:useEnergy() - self.temporary = self.temporary - 1 - if self.temporary <= 0 then - if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end - game.level:removeEntity(self) - end - end, - summoner = self, - summoner_gain_exp = true, - } + -- Make our mine + local trap = makeWarpMine(self, t, px, py, "toward") - -- Add mines + -- Add the mine game.level:addEntity(trap) trap:identify(true) trap:setKnown(self, true) @@ -161,11 +186,11 @@ newTalent{ local duration = self:callTalent(self.T_WARP_MINES, "getDuration") local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8 local disarm = self:callTalent(self.T_WARP_MINES, "trapPower") - return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you and inflict %0.2f temporal and %0.2f physical damage. + return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you and inflict %0.2f physical and %0.2f temporal (warp) damage. The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns. The damage caused by your Warp Mines will improve with your Spellpower. Using this talent will trigger the cooldown on Warp Mine Away.]]): - format(damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage), detect, disarm, duration) + format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) end, } @@ -175,7 +200,7 @@ newTalent{ points = 1, cooldown = 10, paradox = function (self, t) return getParadoxCost(self, t, 10) end, - tactical = { ATTACKAREA = { TEMPORAL = 2 }, ESCAPE = 2 }, + tactical = { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, ESCAPE = 2 }, requires_target = true, range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") end, no_unlearn_last = true, @@ -185,12 +210,6 @@ newTalent{ local tx, ty = self:getTarget(tg) if not tx or not ty then return nil end local _ _, tx, ty = self:canProject(tg, tx, ty) - - local dam = self:spellCrit(self:callTalent(self.T_WARP_MINES, "getDamage")) - local duration = self:callTalent(self.T_WARP_MINES, "getDuration") - local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8 - local disarm = self:callTalent(self.T_WARP_MINES, "trapPower") - local power = getParadoxSpellpower(self) -- Lay the mines in a ball self:project(tg, tx, ty, function(px, py) @@ -198,57 +217,10 @@ newTalent{ if target_trap then return end if game.level.map:checkEntity(px, py, Map.TERRAIN, "block_move") then return end - -- Our Mines - local trap = Trap.new{ - name = "warp mine away", - type = "temporal", id_by_type=true, unided_name = "trap", - display = '^', color=colors.BLUE, image = "trap/trap_warpmine_02.png", - shader = "shadow_simulacrum", - shader_args = { color = {0.6, 0.2, 0.2}, base = 0.8, time_factor = 1500 }, - dam = dam, power = power, - canTrigger = function(self, x, y, who) - if who:reactionToward(self.summoner) < 0 then return mod.class.Trap.canTrigger(self, x, y, who) end - return false - end, - triggered = function(self, x, y, who) - self:project({type="hit",x=x,y=y}, x, y, engine.DamageType.MATTER, self.dam) - -- Teleport Away - if not who.dead then - local hit = self.summoner:checkHit(self.power, who:combatSpellResist() + (who:attr("continuum_destabilization") or 0)) and who:canBe("teleport") - if not hit then - game.logSeen(who, "%s resists the teleport!", who.name:capitalize()) - else - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - if not who:teleportRandom(self.summoner.x, self.summoner.y, 10, 5) then - game.logSeen(self, "The warp fizzles!") - else - who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=power*0.3}) - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - end - end - end + -- Make our mine + local trap = makeWarpMine(self, t, px, py, "away") - return true, true - end, - temporary = duration, - x = px, y = py, - disarm_power = math.floor(disarm), - detect_power = math.floor(detect), - canAct = false, - energy = {value=0}, - act = function(self) - self:useEnergy() - self.temporary = self.temporary - 1 - if self.temporary <= 0 then - if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end - game.level:removeEntity(self) - end - end, - summoner = self, - summoner_gain_exp = true, - } - - -- Add mines + -- Add the mine game.level:addEntity(trap) trap:identify(true) trap:setKnown(self, true) @@ -265,139 +237,225 @@ newTalent{ local duration = self:callTalent(self.T_WARP_MINES, "getDuration") local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8 local disarm = self:callTalent(self.T_WARP_MINES, "trapPower") - return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you and inflict %0.2f temporal and %0.2f physical damage. + return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you and inflict %0.2f physical and %0.2f temporal (warp) damage. The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns. The damage caused by your Warp Mines will improve with your Spellpower. Using this talent will trigger the cooldown on Warp Mine Away.]]): - format(damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage), detect, disarm, duration) + format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) end, } newTalent{ - name = "Banish", + name = "Wormhole", type = {"chronomancy/spacetime-folding", 2}, require = chrono_req2, points = 5, paradox = function (self, t) return getParadoxCost(self, t, 10) end, cooldown = 10, tactical = { ESCAPE = 2 }, - range = 0, - radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5.5)) end, - getTeleport = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 8, 16)) end, - target = function(self, t) - return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t} - end, - direct_hit = true, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, + radius = function(self, t) return math.floor(self:combatTalentLimit(t, 1, 7, 3)) end, -- Limit to radius 1 + requires_target = true, + getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10))) end, + no_npc_use = true, action = function(self, t) - local tg = self:getTalentTarget(t) - local hit = false + -- Target the entrance location + local tg = {type="bolt", nowarning=true, range=1, nolock=true, simple_dir_request=true, talent=t} + local entrance_x, entrance_y = self:getTarget(tg) + if not entrance_x or not entrance_y then return nil end + local _ _, entrance_x, entrance_y = self:canProject(tg, entrance_x, entrance_y) + local trap = game.level.map(entrance_x, entrance_y, engine.Map.TRAP) + if trap or game.level.map:checkEntity(entrance_x, entrance_y, Map.TERRAIN, "block_move") then game.logPlayer(self, "You can't place a wormhole entrance here.") return end - --checks for spacetime mastery hit bonus - local power = getParadoxSpellpower(self) - if self:knowTalent(self.T_SPACETIME_MASTERY) then - power = getParadoxSpellpower(self) * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower")) - end + -- Target the exit location + local tg = {type="hit", nolock=true, pass_terrain=true, nowarning=true, range=self:getTalentRange(t)} + local exit_x, exit_y = self:getTarget(tg) + if not exit_x or not exit_y then return nil end + local _ _, exit_x, exit_y = self:canProject(tg, exit_x, exit_y) + local trap = game.level.map(exit_x, exit_y, engine.Map.TRAP) + if trap or game.level.map:checkEntity(exit_x, exit_y, Map.TERRAIN, "block_move") or core.fov.distance(entrance_x, entrance_y, exit_x, exit_y) < 2 then game.logPlayer(self, "You can't place a wormhole exit here.") return end - self:project(tg, self.x, self.y, function(px, py) - local target = game.level.map(px, py, Map.ACTOR) - if not target or target == self then return end - game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") - if self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) and target:canBe("teleport") then - if not target:teleportRandom(target.x, target.y, self:getTalentRadius(t) * 4, self:getTalentRadius(t) * 2) then - game.logSeen(target, "The spell fizzles on %s!", target.name:capitalize()) - else - target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=power*0.3}) - game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") - hit = true - end - else - game.logSeen(target, "%s resists the banishment!", target.name:capitalize()) - end - end) + -- Wormhole values + local power = getParadoxSpellpower(self, t) + local dest_power = getParadoxSpellpower(self, t, 0.3) - if not hit then - game:onTickEnd(function() - if not self:attr("no_talents_cooldown") then - self.talents_cd[self.T_BANISH] = self.talents_cd[self.T_BANISH] /2 - end - end) + -- Our base wormhole + local function makeWormhole(x, y, dest_x, dest_y) + local wormhole = mod.class.Trap.new{ + name = "wormhole", + type = "annoy", subtype="teleport", id_by_type=true, unided_name = "trap", + image = "terrain/wormhole.png", + display = '&', color_r=255, color_g=255, color_b=255, back_color=colors.STEEL_BLUE, + message = "@Target@ moves onto the wormhole.", + temporary = t.getDuration(self, t), + x = x, y = y, dest_x = dest_x, dest_y = dest_y, + radius = self:getTalentRadius(t), + canAct = false, + energy = {value=0}, + disarm = function(self, x, y, who) return false end, + power = power, dest_power = dest_power, + summoned_by = self, -- "summoner" is immune to it's own traps + triggered = function(self, x, y, who) + local hit = who == self.summoned_by or who:checkHit(self.power, who:combatSpellResist()+(who:attr("continuum_destabilization") or 0), 0, 95) and who:canBe("teleport") -- Bug fix, Deprecrated checkhit call + if hit then + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + if not who:teleportRandom(self.dest_x, self.dest_y, self.radius, 1) then + game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize()) + else + if who ~= self.summoned_by then who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power}) end + game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") + game:playSoundNear(self, "talents/teleport") + end + else + game.logSeen(who, "%s ignores the wormhole.", who.name:capitalize()) + end + return true + end, + act = function(self) + self:useEnergy() + self.temporary = self.temporary - 1 + if self.temporary <= 0 then + game.logSeen(self, "Reality asserts itself and forces the wormhole shut.") + if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end + game.level:removeEntity(self) + end + end, + } + + return wormhole end + + -- Adding the entrance wormhole + local entrance = makeWormhole(entrance_x, entrance_y, exit_x, exit_y) + game.level:addEntity(entrance) + entrance:identify(true) + entrance:setKnown(self, true) + game.zone:addEntity(game.level, entrance, "trap", entrance_x, entrance_y) + entrance.faction = nil + game:playSoundNear(self, "talents/heal") - game:playSoundNear(self, "talents/teleport") + -- Adding the exit wormhole + local exit = makeWormhole(exit_x, exit_y, entrance_x, entrance_y) + exit.x = exit_x + exit.y = exit_y + game.level:addEntity(exit) + exit:identify(true) + exit:setKnown(self, true) + game.zone:addEntity(game.level, exit, "trap", exit_x, exit_y) + exit.faction = nil + -- Linking the wormholes + entrance.dest = exit + exit.dest = entrance + + game.logSeen(self, "%s folds the space between two points.", self.name) return true end, info = function(self, t) + local duration = t.getDuration(self, t) local radius = self:getTalentRadius(t) - local range = t.getTeleport(self, t) - return ([[Randomly teleports all targets within a radius of %d around you. Targets will be teleported between %d and %d tiles from their current location. - If no targets are teleported the cooldown will be halved. - The chance of teleportion will scale with your Spellpower.]]):format(radius, range / 2, range) + local range = self:getTalentRange(t) + return ([[You fold the space between yourself and a second point within a range of %d, creating a pair of wormholes. Any creature stepping on either wormhole will be teleported near the other (radius %d accuracy). + The wormholes will last %d turns and must be placed at least two tiles apart. + The chance of teleporting enemies will scale with your Spellpower.]]) + :format(range, radius, duration) end, } newTalent{ - name = "Temporal Wake", + name = "Spatial Tether", type = {"chronomancy/spacetime-folding", 3}, require = chrono_req3, points = 5, - random_ego = "attack", - paradox = function (self, t) return getParadoxCost(self, t, 20) end, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, cooldown = 10, - tactical = { ATTACK = {TEMPORAL = 1}, CLOSEIN = 2, DISABLE = { stun = 2 } }, - direct_hit = true, + tactical = { DISABLE = 2 }, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, requires_target = true, - is_teleport = true, + getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10))) end, + getChance = function(self, t) return paradoxTalentScale(self, t, 10, 20, 30) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end, target = function(self, t) - return {type="beam", range=self:getTalentRange(t), friendlyfire=false, talent=t} + return {type="hit", range=self:getTalentRange(t), nowarning=true, talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end, - range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 10, 0.5, 0, 1)) end, + no_energy=true, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end - if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then - game.logSeen(self, "You do not have line of sight.") - return nil - end local _ _, x, y = self:canProject(tg, x, y) - local ox, oy = self.x, self.y + local target = game.level.map(x, y, Map.ACTOR) + if not target then return end + if game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then return end + + -- Tether values + local power = getParadoxSpellpower(self, t) + local dest_power = getParadoxSpellpower(self, t, 0.3) - -- since we're using a precise teleport we'll look for a free grid first - local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) - if tx and ty then - if not self:teleportRandom(tx, ty, 0) then - game.logSeen(self, "The teleport fizzles!") - else - local dam = self:spellCrit(t.getDamage(self, t)) - local x, y = ox, oy - self:project(tg, x, y, function(px, py) - DamageType:get(DamageType.MATTER).projector(self, px, py, DamageType.MATTER, dam) - local target = game.level.map(px, py, Map.ACTOR) - if target then - if target:canBe("stun") then - target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)}) + -- Store the old terrain + local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN) + if not oe or oe:attr("temporary") then return true end + + -- Make our tether + local tether = mod.class.Object.new{ + old_feat = oe, type = oe.type, subtype = oe.subtype, + name = "temporal instability", image = oe.image, add_mos = {{image="object/temporal_instability.png"}}, + display = '&', color=colors.LIGHT_BLUE, + temporary = t.getDuration(self, t), + power = power, dest_power = dest_power, chance = t.getChance(self, t), + x = x, y = y, target = target, + summoner = self, summoner_gain_exp = true, + canAct = false, + energy = {value=0}, + act = function(self) + self:useEnergy() + self.temporary = self.temporary - 1 + + -- Teleport + if not self.target.dead and (game.level and game.level:hasEntity(self.target)) then + local hit = self.summoner == self.target or (self.summoner:checkHit(self.power, self.target:combatSpellResist() + (self.target:attr("continuum_destabilization") or 0), 0, 95) and self.target:canBe("teleport")) + if hit and rng.percent(self.chance * core.fov.distance(self.x, self.y, self.target.x, self.target.y)) then + game.level.map:particleEmitter(self.target.x, self.target.y, 1, "temporal_teleport") + -- Since we're using a precise teleport, find a free grit first + local tx, ty = util.findFreeGrid(self.x, self.y, 5, true, {[engine.Map.ACTOR]=true}) + if not self.target:teleportRandom(tx, ty, 1, 0) then + game.logSeen(self, "The teleport fizzles!") else - game.logSeen(target, "%s resists the stun!", target.name:capitalize()) + if target ~= self.summoner then + self.target:setEffect(self.target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power}) + end + game.level.map:particleEmitter(self.target.x, self.target.y, 1, "temporal_teleport") + game:playSoundNear(self, "talents/teleport") end + else + game.logSeen(self.target, "%s resists the teleport!", self.target.name:capitalize()) end - end) - game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "temporal_lightning", {tx=x-self.x, ty=y-self.y}) - game:playSoundNear(self, "talents/lightning") - end - end + end + + -- End the effect? + if self.temporary <= 0 then + game.level.map(self.x, self.y, engine.Map.TERRAIN, self.old_feat) + game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y) + game.level:removeEntity(self) + end + end, + } + + -- add our tether to the map + game.level:addEntity(tether) + game.level.map(x, y, Map.TERRAIN, tether) + game.nicer_tiles:updateAround(game.level, x, y) + game.level.map:updateMap(x, y) + game:playSoundNear(self, "talents/heal") return true end, info = function(self, t) - local stun = t.getDuration(self, t) - local damage = t.getDamage(self, t)/2 - return ([[Violently fold the space between yourself and another point within range. - You move to the target location, and leave a temporal wake behind that stuns for %d turns and inflicts %0.2f temporal and %0.2f physical damage to everything in the path. - The damage will scale with your Spellpower.]]): - format(stun, damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage)) + local duration = t.getDuration(self, t) + local chance = t.getChance(self, t) + return ([[Tethers the target to the location for %d turns. For each tile the target moves away from the target location it has a %d%% chance each turn of being teleported back to the tether. + The teleportation chance scales with your Spellpower.]]) + :format(duration, chance) end, } @@ -407,12 +465,12 @@ newTalent{ require = chrono_req4, points = 5, paradox = function (self, t) return getParadoxCost(self, t, 20) end, - cooldown = 24, + cooldown = 12, tactical = { DISABLE = 2 }, - range = 10, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end, target = function(self, t) return {type="ball", range=self:getTalentRange(t), friendlyfire=false, radius=self:getTalentRadius(t), talent=t} end, @@ -422,16 +480,19 @@ newTalent{ local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end - local _ _, x, y = self:canProject(tg, x, y) - - local damage = self:spellCrit(t.getDamage(self, t)) - self:project(tg, x, y, function(px, py) - local target = game.level.map(px, py, Map.ACTOR) - if not target then return end - target:setEffect(target.EFF_DIMENSIONAL_ANCHOR, t.getDuration(self, t), {damage=damage, src=self, apply_power=getParadoxSpellpower(self)}) - end) + local _ _, _, _, x, y = self:canProject(tg, x, y) + + -- Add a lasting map effect + local dam = self:spellCrit(t.getDamage(self, t)) + game.level.map:addEffect(self, + x, y, t.getDuration(self,t), + DamageType.DIMENSIONAL_ANCHOR, {dam=dam, dur=1, src=self, apply=getParadoxSpellpower(self, t)}, + self:getTalentRadius(t), + 5, nil, + {type="temporal_cloud"}, + nil, false, false + ) - game.level.map:particleEmitter(x, y, tg.radius, "ball_teleport", {radius=tg.radius}) game:playSoundNear(self, "talents/teleport") return true @@ -440,7 +501,7 @@ newTalent{ local damage = t.getDamage(self, t)/2 local radius = self:getTalentRadius(t) local duration = t.getDuration(self, t) - return ([[Anchors enemies in a radius of %d. Anchored targets will be prevented from teleporting for %d turns and take %0.2f temporal and %0.2f physical damage on teleport attempts. - The damage will scale with your Spellpower.]]):format(radius, duration, damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage)) + return ([[Create a radius %d anti-telport field for %d turns. Enemies in the field will be anchored, preventing teleportation and taking %0.2f physical and %0.2f temporal (warp) damage on teleport attempts. + The damage will scale with your Spellpower.]]):format(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage)) end, } \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua b/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua index 7662ceef24..07e3effa38 100644 --- a/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua +++ b/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua @@ -17,7 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org --- EDGE TODO: Icons, Particles, Timed Effect Particles +-- EDGE TODO: Particles, Timed Effect Particles newTalent{ name = "Dimensional Step", @@ -27,261 +27,180 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 10) end, cooldown = 10, tactical = { CLOSEIN = 2, ESCAPE = 2 }, - range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 10, 0.5, 0, 1)) end, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, requires_target = true, target = function(self, t) - return {type="hit", range=self:getTalentRange(t), nolock=true, nowarning=true} + return {type="hit", nolock=true, range=self:getTalentRange(t)} end, direct_hit = true, no_energy = true, is_teleport = true, action = function(self, t) local tg = self:getTalentTarget(t) - local x, y = self:getTarget(tg) + local x, y, target = self:getTarget(tg) if not x or not y then return nil end - if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then + if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then -- To prevent teleporting through walls game.logSeen(self, "You do not have line of sight.") return nil end - local __, x, y = self:canProject(tg, x, y) - - game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") - - -- since we're using a precise teleport we'll look for a free grid first - local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) - if tx and ty then - if not self:teleportRandom(tx, ty, 0) then - game.logSeen(self, "The spell fizzles!") + local _ _, x, y = self:canProject(tg, x, y) + + -- Swap? + if self:getTalentLevel(t) >= 5 and target then + -- Hit? + if target:canBe("teleport") and self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) then + -- Grab the caster's location + local ox, oy = self.x, self.y + + -- Remove the target so the destination tile is empty + game.level.map:remove(target.x, target.y, Map.ACTOR) + + -- Try to teleport to the target's old location + if self:teleportRandom(x, y, 0) then + -- Put the target back in the caster's old location + game.level.map(ox, oy, Map.ACTOR, target) + target.x, target.y = ox, oy + + game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport") + game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + else + -- If we can't teleport, return the target + game.level.map(target.x, target.y, Map.ACTOR, target) + game.logSeen(self, "The spell fizzles!") + end + else + game.logSeen(target, "%s resists the swap!", target.name:capitalize()) + end + else + game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + -- since we're using a precise teleport we'll look for a free grid first + local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true}) + if tx and ty then + if not self:teleportRandom(tx, ty, 0) then + game.logSeen(self, "The spell fizzles!") + else + game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + end end end - - game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + game:playSoundNear(self, "talents/teleport") - return true end, info = function(self, t) local range = self:getTalentRange(t) - return ([[Teleports you to up to %d tiles away, to a targeted location in line of sight. Additional talent points increase the range. - This spell takes no time to cast.]]):format(range) + return ([[Teleports you to up to %d tiles away, to a targeted location in line of sight. + At talent level 5 you may swap positions with a target creature.]]):format(range) end, } newTalent{ - name = "Phase Shift", + name = "Dimensional Shift", type = {"chronomancy/spacetime-weaving", 2}, mode = "passive", require = chrono_req2, points = 5, - getChance = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end, - doPhaseShift = function(self, t) + getReduction = function(self, t) return math.ceil(self:getTalentLevel(t)) end, + getCount = function(self, t) + return 1 + math.floor(self:combatTalentLimit(t, 3, 0, 2)) + end, + doShift = function(self, t) local effs = {} - -- Go through all effects for eff_id, p in pairs(self.tmp) do local e = self.tempeffect_def[eff_id] - if e.status == "detrimental" and e.type ~= "other" then - effs[#effs+1] = {"effect", eff_id} + if e.type ~= "other" and e.status == "detrimental" and e.subtype ~= "cross tier" then + effs[#effs+1] = p end end - - -- Roll to remove each one - for i = 1, #effs do - if #effs == 0 then break end + + for i=1, t.getCount(self, t) do local eff = rng.tableRemove(effs) - if eff[1] == "effect" and rng.percent(t.getChance(self, t)) then - self:removeEffect(eff[2]) + if not eff then break end + eff.dur = eff.dur - t.getReduction(self, t) + if eff.dur <= 0 then + self:removeEffect(eff.effect_id) end end + end, info = function(self, t) - local chance = t.getChance(self, t) - return ([[When you teleport you have a %d%% chance to remove each detrimental status effect currently affecting you. - Each effect is checked individually and the chance scales with your Spellpower.]]): - format(chance) + local count = t.getCount(self, t) + local reduction = t.getReduction(self, t) + return ([[When you teleport you reduce the duration of up to %d detrimental effects by %d turns.]]): + format(count, reduction) end, } newTalent{ - name = "Wormhole", + name = "Phase Shift", type = {"chronomancy/spacetime-weaving", 3}, require = chrono_req3, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 10) end, - cooldown = 10, - tactical = { ESCAPE = 2 }, - range = 10, - radius = function(self, t) return math.floor(self:combatTalentLimit(t, 0, 7, 3)) end, -- Limit to radius 0 - requires_target = true, - getDuration = function (self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10)) end, - no_npc_use = true, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 24, + tactical = { DEFEND = 2 }, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentLimit(t, 25, 3, 7, true))) end, action = function(self, t) - local tg = {type="bolt", nowarning=true, range=1, nolock=true, simple_dir_request=true, talent=t} - local entrance_x, entrance_y = self:getTarget(tg) - if not entrance_x or not entrance_y then return nil end - local _ _, entrance_x, entrance_y = self:canProject(tg, entrance_x, entrance_y) - local trap = game.level.map(entrance_x, entrance_y, engine.Map.TRAP) - if trap or game.level.map:checkEntity(entrance_x, entrance_y, Map.TERRAIN, "block_move") then game.logPlayer(self, "You can't place a wormhole entrance here.") return end - - -- Finding the exit location - -- First, find the center possible exit locations - local x, y, radius, minimum_distance - radius = self:getTalentRadius(t) - minimum_distance = 0 - local tg = {type="ball", nolock=true, pass_terrain=true, nowarning=true, range=self:getTalentRange(t), radius=radius} - x, y = self:getTarget(tg) - print("[Target]", x, y) - if not x then return nil end - -- Make sure the target is within range - if core.fov.distance(self.x, self.y, x, y) > self:getTalentRange(t) then - game.logPlayer(self, "Pick a valid location.") - return false - end - - -- Second, select one of the possible exit locations - local poss = {} - for i = x - radius, x + radius do - for j = y - radius, y + radius do - if game.level.map:isBound(i, j) and - core.fov.distance(x, y, i, j) <= radius and - core.fov.distance(x, y, i, j) >= minimum_distance and - self:canMove(i, j) and not game.level.map(i, j, engine.Map.TRAP) then - poss[#poss+1] = {i,j} - end - end - end - if #poss == 0 then game.logPlayer(self, "No exit location could be found.") return false end - local pos = poss[rng.range(1, #poss)] - local exit_x, exit_y = pos[1], pos[2] - print("[[wormhole]] entrance ", entrance_x, " :: ", entrance_y) - print("[[wormhole]] exit ", exit_x, " :: ", exit_y) - - --checks for spacetime mastery hit bonus - local power = getParadoxSpellpower(self) - if self:knowTalent(self.T_SPACETIME_MASTERY) then - power = power * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower")) - end - - -- Adding the entrance wormhole - local entrance = mod.class.Trap.new{ - name = "wormhole", - type = "annoy", subtype="teleport", id_by_type=true, unided_name = "trap", - image = "terrain/wormhole.png", - display = '&', color_r=255, color_g=255, color_b=255, back_color=colors.STEEL_BLUE, - message = "@Target@ moves onto the wormhole.", - temporary = t.getDuration(self, t), - x = entrance_x, y = entrance_y, - canAct = false, - energy = {value=0}, - disarm = function(self, x, y, who) return false end, - power = power, - summoned_by = self, -- "summoner" is immune to it's own traps - triggered = function(self, x, y, who) - if who == self.summoned_by or who:checkHit(self.power, who:combatSpellResist()+(who:attr("continuum_destabilization") or 0), 0, 95) and who:canBe("teleport") then -- Bug fix, Deprecrated checkhit call - -- since we're using a precise teleport we'll look for a free grid first - local tx, ty = util.findFreeGrid(self.dest.x, self.dest.y, 5, true, {[engine.Map.ACTOR]=true}) - if tx and ty then - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - if not who:teleportRandom(tx, ty, 0) then - game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize()) - elseif who ~= self.summoned_by then - who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.destabilization_power}) - game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport") - end - end - else - game.logSeen(who, "%s ignores the wormhole.", who.name:capitalize()) - end - return true - end, - act = function(self) - self:useEnergy() - self.temporary = self.temporary - 1 - if self.temporary <= 0 then - game.logSeen(self, "Reality asserts itself and forces the wormhole shut.") - if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end - game.level:removeEntity(self) - end - end, - } - entrance.faction = nil - game.level:addEntity(entrance) - entrance:identify(true) - entrance:setKnown(self, true) - game.zone:addEntity(game.level, entrance, "trap", entrance_x, entrance_y) - game.level.map:particleEmitter(entrance_x, entrance_y, 1, "temporal_teleport") - game:playSoundNear(self, "talents/heal") - - -- Adding the exit wormhole - local exit = entrance:clone() - exit.x = exit_x - exit.y = exit_y - game.level:addEntity(exit) - exit:identify(true) - exit:setKnown(self, true) - game.zone:addEntity(game.level, exit, "trap", exit_x, exit_y) - game.level.map:particleEmitter(exit_x, exit_y, 1, "temporal_teleport") - - -- Linking the wormholes - entrance.dest = exit - exit.dest = entrance - - game.logSeen(self, "%s folds the space between two points.", self.name) + self:setEffect(self.EFF_PHASE_SHIFT, t.getDuration(self, t), {}) + game:playSoundNear(self, "talents/teleport") return true end, info = function(self, t) local duration = t.getDuration(self, t) - local radius = self:getTalentRadius(t) - return ([[You fold the space between yourself and a second point within range (radius %d accuracy), creating a pair of wormholes. Any creature stepping on either wormhole will be teleported to the other. The wormholes will last %d turns. - The chance of teleporting enemies will scale with your Spellpower.]]) - :format(radius, duration) + return ([[Phase shift yourself for %d turns; any damage greater than 10%% of your maximum life will teleport you to an adjacent tile and be reduced by 50%% (can only happen once per turn).]]): + format(duration) end, } newTalent{ - name = "Displace Damage", + name = "Phase Pulse", type = {"chronomancy/spacetime-weaving", 4}, - mode = "sustained", require = chrono_req4, - sustain_paradox = 48, + tactical = { ATTACKAREA = {TEMPORAL = 1, PHYSICAL = 1} }, + mode = "sustained", + sustain_paradox = 36, cooldown = 10, - tactical = { BUFF = 2 }, points = 5, - -- called by _M:onTakeHit function in mod\class\Actor.lua to perform the damage displacment - getDisplaceDamage = function(self, t) return self:combatTalentLimit(t, 25, 5, 15)/100 end, -- Limit < 25% - range = 10, - callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr) - if dam > 0 and src ~= self then - -- find available targets - local tgts = {} - local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true) - for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do - local a = game.level.map(x, y, Map.ACTOR) - if a and self:reactionToward(a) < 0 then - tgts[#tgts+1] = a - end - end end - - -- Displace the damage - local a = rng.table(tgts) - if a then - local displace = dam * t.getDisplaceDamage(self, t) - game:delayedLogMessage(self, a, "displace_damage"..(a.uid or ""), "#PINK##Source# displaces some damage onto #Target#!") - DamageType.defaultProjector(self, a.x, a.y, type, displace, tmp, true) - dam = dam - displace - end - end + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 70, getParadoxSpellpower(self, t)) end, + range = 0, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end, + target = function(self, t) + return {type="ball", range=100, radius=self:getTalentRadius(t), selffire=false, talent=t} + end, + doPulse = function(self, t, ox, oy, fail) + local tg = self:getTalentTarget(t) + local dam = self:spellCrit(t.getDamage(self, t)) + local distance = core.fov.distance(self.x, self.y, ox, oy) + local chance = distance * 10 - return {dam=dam} + if not fail then + dam = dam * (1 + math.min(1, distance/10)) + game:onTickEnd(function() + self:project(tg, ox, oy, DamageType.WARP, dam) + self:project(tg, self.x, self.y, DamageType.WARP, dam) + end) + else + dam = dam *2 + chance = 100 + tg.radius = tg.radius * 2 + game:onTickEnd(function() + self:project(tg, self.x, self.y, DamageType.WARP, dam) + end) + end end, activate = function(self, t) + game:playSoundNear(self, "talents/spell_generic") return {} end, deactivate = function(self, t, p) return true end, info = function(self, t) - local displace = t.getDisplaceDamage(self, t) * 100 - return ([[You bend space around you, displacing %d%% of any damage you receive onto a random enemy within range. - ]]):format(displace) + local damage = t.getDamage(self, t)/2 + local radius = self:getTalentRadius(t) + return ([[When you teleport with Phase Pulse active you deal %0.2f physical and %0.2f temporal (warp) damage to all targets in a radius of %d around you. + For each space you move from your original location the damage is increased by 10%% (to a maximum bonus of 100%%). If the teleport fails, the blast radius and damage will be doubled. + This effect occurs both at the entrance and exist locations and the damage will scale with your Spellpower.]]): + format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), radius) end, } diff --git a/game/modules/tome/data/talents/chronomancy/spatial-tears.lua b/game/modules/tome/data/talents/chronomancy/spatial-tears.lua new file mode 100644 index 0000000000..a632e4b150 --- /dev/null +++ b/game/modules/tome/data/talents/chronomancy/spatial-tears.lua @@ -0,0 +1,311 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +-- EDGE TODO: Particles, Timed Effect Particles + +local Object = require "mod.class.Object" + +newTalent{ + name = "Spatial Fragments", + type = {"chronomancy/spatial-tears",1}, + require = chrono_req_high1, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, + cooldown = 3, + tactical = { ATTACK = { TEMPORAL = 1, PHYSICAL = 1 }, }, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, + proj_speed = 4, + target = function(self, t) + return {type="bolt", range=self:getTalentRange(t), talent=t, nowarning=true, display={particle="arrow", particle_args={tile=("particles_images/spatial_fragment"):format(rng.range(1, 4))}}} + end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 100, getParadoxSpellpower(self, t)) end, + action = function(self, t) + local p = self:isTalentActive(self.T_FRACTURED_SPACE) + + local tg = self:getTalentTarget(t) + -- Beam? + local beam = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges >=6 or false + if beam then + tg.type = "beam" + end + local x, y, target = self:getTarget(tg) + if not x or not y then return nil end + if beam then self:isTalentActive(self.T_FRACTURED_SPACE).charges = 0 end + + -- Fire one bolt per available target + if target == self then + -- Find available targets + local tgts = {} + local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true) + for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do + local a = game.level.map(x, y, Map.ACTOR) + if a and self:reactionToward(a) < 0 then + tgts[#tgts+1] = a + end + end end + + -- Fire a bolt at each one + local dam = self:spellCrit(t.getDamage(self, t)) + for i = 1, 3 do + if #tgts <= 0 then break end + local a, id = rng.table(tgts) + table.remove(tgts, id) + self:projectile(tg, a.x, a.y, DamageType.WARP, dam, nil) + end + else + -- Fire all bolts at one target + local dam = self:spellCrit(t.getDamage(self, t)) + for i = 1, 3 do + self:projectile(tg, x, y, DamageType.WARP, dam, nil) + end + end + + game:playSoundNear(self, "talents/earth") + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t)/2 + return ([[Fire three Spatial Fragments at the target that each inflict %0.2f physical and %0.2f temporal (warp) damage. If you target yourself you'll instead fire one Spatial Fragment at up to three targets within range. + If Fractured Space is fully charged the projectiles will be able to pierce through targets. This will consume your Fractured Space charges. + The damage scales with your Spellpower.]]) + :format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage)) + end, +} + +newTalent{ + name = "Discontinuity", + type = {"chronomancy/spatial-tears", 2}, + require = chrono_req_high2, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 6, + tactical = { ATTACK = { TEMPORAL = 1, PHYSICAL = 1 }, }, + range = 10, + direct_hit = true, + requires_target = true, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end, + getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, + getLength = function(self, t) return 1 + math.floor(self:combatTalentScale(t, 3, 7)/2)*2 end, + target = function(self, t) + local halflength = math.floor(t.getLength(self,t)/2) + local block = function(_, lx, ly) + return game.level.map:checkAllEntities(lx, ly, "block_move") + end + return {type="wall", range=self:getTalentRange(t), halflength=halflength, talent=t, halfmax_spots=halflength+1, block_radius=block} + end, + action = function(self, t) + local tg = self:getTalentTarget(t) + local x, y = self:getTarget(tg) + if not x or not y then return nil end + local _ _, _, _, x, y = self:canProject(tg, x, y) + if game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then return nil end + + local damage = self:spellCrit(t.getDamage(self, t)) + local block = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges >=6 or false + if block then self:isTalentActive(self.T_FRACTURED_SPACE).charges = 0 end + self:project(tg, x, y, function(px, py, tg, self) + local oe = game.level.map(px, py, Map.TERRAIN) + if not oe or oe.special then return end + if not oe or oe:attr("temporary") or game.level.map:checkAllEntities(px, py, "block_move") then return end + local e = Object.new{ + old_feat = oe, + type = "void", subtype = "void", + name = "discontinuity", + display = ' ', image = ("terrain/rift/rift_floor_0%d.png"):format(rng.avg(0, 4, 3)), + _noalpha = false, + always_remember = true, + does_block_move = block, + block_move = block, + pass_projectile = true, + is_void = true, + can_pass = {pass_void=1}, + show_tooltip = true, + temporary = t.getDuration(self, t), + x = px, y = py, + dam = damage, + canAct = false, + act = function(self) + local tg = {type="ball", range=0, friendlyfire=false, radius = 1, talent=t, x=self.x, y=self.y,} + self.summoner.__project_source = self + local grids = self.summoner:project(tg, self.x, self.y, engine.DamageType.WARP, self.dam) + if core.shader.active() then + game.level.map:particleEmitter(self.x, self.y, tg.radius, "starfall", {radius=tg.radius, tx=self.x, ty=self.y}) + else + game.level.map:particleEmitter(self.x, self.y, tg.radius, "shadow_flash", {radius=tg.radius, grids=grids, tx=self.x, ty=self.y}) + end + self.summoner.__project_source = nil + self:useEnergy() + self.temporary = self.temporary - 1 + if self.temporary <= 0 then + game.level.map(self.x, self.y, engine.Map.TERRAIN, self.old_feat) + game.level:removeEntity(self) + game.level.map:updateMap(self.x, self.y) + game.nicer_tiles:updateAround(game.level, self.x, self.y) + end + end, + dig = function(src, x, y, old) + game.level:removeEntity(old) + return nil, old.old_feat + end, + summoner_gain_exp = true, + summoner = self, + } + e.tooltip = mod.class.Grid.tooltip + game.level:addEntity(e) + game.level.map(px, py, Map.TERRAIN, e) + if not block then + game.nicer_tiles:updateAround(game.level, px, py) + game.level.map:updateMap(px, py) + end + end) + + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t)/2 + local length = t.getLength(self, t) + local duration = t.getDuration(self, t) + return ([[Create a void wall of length %d that lasts %d turns. Each turn the wall deals %0.2f physical and %0.2f temporal (warp) damage to all enemies within a radius of 1. + If Fractured Space is fully charged the wall will block movement, but not sight or projectiles. This will consume your Fractured Space charges. + The damage will scale with your Spellpower.]]) + :format(length, duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage)) + end, +} + +newTalent{ + name = "Fractured Space", + type = {"chronomancy/spatial-tears",3}, + require = chrono_req_high3, + mode = "sustained", + sustain_paradox = 24, + cooldown = 10, + tactical = { BUFF = 2 }, + points = 5, + getDamage = function(self, t) return self:combatTalentLimit(t, 100, 10, 75)/12 end, + getChance = function(self, t) return self:combatTalentLimit(t, 100, 10, 75)/6 end, + iconOverlay = function(self, t, p) + local val = p.charges or 0 + if val <= 0 then return "" end + local fnt = "buff_font" + return tostring(math.ceil(val)), fnt + end, + callbackOnActBase = function(self, t) + -- Charge decay + local p = self:isTalentActive(self.T_FRACTURED_SPACE) + p.decay = p.decay + 1 + if p.decay >=2 then + p.decay = 0 + p.charges = math.max(p.charges - 1, 0) + end + end, + activate = function(self, t) + game:playSoundNear(self, "talents/heal") + --local particle = Particles.new("ultrashield", 1, { rm=0, rM=176, gm=196, gM=255, bm=222, bM=255, am=25, aM=125, radius=0.2, density=30, life=28, instop=-40}) + return { + charges = 0, decay = 0 + -- particle = self:addParticles(particle) + } + end, + deactivate = function(self, t, p) + -- self:removeParticles(p.particle) + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local chance = t.getChance(self, t) + local charges = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges or 0 + return ([[Each time you deal warp damage Fractured Space gains one charge, up to a maximum of six charges. If you're not generating charges one charge will decay every other turn. + Each charge increases warp damage by %d%% and gives your Warp damage a %d%% chance to stun, blind, pin, or confuse affected targets for 3 turns. + If Fractured Space is fully charged, your Spatial Tears talents will consume them when cast and have bonus effects (see indvidual talent descriptions). + + Current damage bonus: %d%% + Current effect chance: %d%%]]):format(damage, chance, damage * charges, chance * charges) + end, +} + +newTalent{ + name = "Sphere of Destruction", + type = {"chronomancy/spatial-tears", 4}, + require = chrono_req_high4, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 18) end, + cooldown = 18, + tactical = { ATTACKAREA = {PHYSICAL = 2, TEMPORAL = 2} }, + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end, + radius = 3, + proj_speed = 3, + target = function(self, t) + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} + end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 100, getParadoxSpellpower(self, t)) end, + action = function(self, t) + local tg = {type="beam", range=self:getTalentRange(t), talent=t, display={particle="icestorm"}} + local x, y = self:getTarget(tg) + if not x or not y then return nil end + local _ _, _, _, x, y = self:canProject(tg, x, y) + + -- Store some values inside the target table so they're not lost when we reload + tg.chrono_sphere = {} + tg.chrono_sphere.dam = self:spellCrit(t.getDamage(self, t)) + tg.chrono_sphere.strip = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges >=6 or false + if tg.chrono_sphere.strip then self:isTalentActive(self.T_FRACTURED_SPACE).charges = 0; tg.chrono_sphere.power = getParadoxSpellpower(self, t) end + + -- A beam projectile + self:projectile(tg, x, y, function(px, py, tg, self) + -- That projects balls as it moves + local tg2 = self:getTalentTarget(self:getTalentFromId(self.T_SPHERE_OF_DESTRUCTION)) + self:project(tg2, px, py, function(px2, py2) + local DamageType = require "engine.DamageType" + DamageType:get(DamageType.WARP).projector(self, px2, py2, DamageType.WARP, tg.chrono_sphere.dam) + + -- Do we strip a sustain? + if tg.chrono_sphere.strip then + local target = game.level.map(px2, py2, engine.Map.ACTOR) + if not target then return end + + local effs = {} + -- Go through all sustained spells + for tid, act in pairs(target.sustain_talents) do + if act then + effs[#effs+1] = {"talent", tid} + end + end + + if #effs == 0 then return end + local eff = rng.table(effs) + + if self:checkHit(tg.chrono_sphere.power, target:combatSpellResist(), 0, 95, 5) then + target:crossTierEffect(target.EFF_SPELLSHOCKED, tg.chrono_sphere.power) + target:forceUseTalent(eff[2], {ignore_energy=true}) + end + end + end) + end) + + game:playSoundNear(self, "talents/icestorm") + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t)/2 + return ([[Create a Sphere of Destruction that travels towards the target location, inflicting %0.2f physical and %0.2f temporal (warp) damage in a radius of three. + If Fractured Space is fully charged the Sphere will remove a single sustain from targets it damages. This will consume your Fractured Space charges. + The sphere can hit a single target multiple times in one turn and the damage will scale with your Spellpower.]]) + :format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage)) + end, +} diff --git a/game/modules/tome/data/talents/chronomancy/speed-control.lua b/game/modules/tome/data/talents/chronomancy/speed-control.lua index 254cc93594..acbd0d107c 100644 --- a/game/modules/tome/data/talents/chronomancy/speed-control.lua +++ b/game/modules/tome/data/talents/chronomancy/speed-control.lua @@ -17,7 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org --- EDGE TODO: Icons, Particles, Timed Effect Particles +-- EDGE TODO: Particles, Timed Effect Particles newTalent{ name = "Celerity", @@ -25,19 +25,18 @@ newTalent{ require = chrono_req1, points = 5, mode = "passive", - getSpeed = function(self, t) return self:combatTalentScale(t, 0.1, 0.25, 0.5) end, - doCelerity = function(self, t) - local speed = t.getSpeed(self, t) - - self:setEffect(self.EFF_CELERITY, 3, {speed=speed, charges=1, max_charges=3}) - + getSpeed = function(self, t) return self:combatTalentScale(t, 10, 30)/100 end, + doCelerity = function(self, t, x, y) + if self.x ~= x or self.y ~= x then + local speed = t.getSpeed(self, t) + self:setEffect(self.EFF_CELERITY, 1, {speed=speed, charges=1, max_charges=3}) + end return true end, info = function(self, t) local speed = t.getSpeed(self, t) * 100 - return ([[When you move you gain %d%% movement speed, stacking up to three times. - Performing any action other than movement will break this effect.]]): - format(speed, speed) + return ([[When you move you gain %d%% movement speed for one turn. This effect stacks up to three times. + ]]):format(speed) end, } @@ -48,11 +47,12 @@ newTalent{ points = 5, sustain_paradox = 36, mode = "sustained", + no_sustain_autoreset = true, cooldown = 12, tactical = { ATTACKAREA = 1, DISABLE = 3 }, range = 0, - radius = 3, - getSlow = function(self, t) return math.min(self:combatTalentSpellDamage(t, 10, 25, getParadoxSpellpower(self))/ 100 , 0.6) end, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end, + getSlow = function(self, t) return paradoxTalentScale(self, t, 20, 40, 60)/100 end, target = function(self, t) return {type="ball", range=self:getTalentRange(t), friendlyfire=false, radius = self:getTalentRadius(t), talent=t} end, @@ -70,18 +70,23 @@ newTalent{ else p.charges = math.min(p.charges + 1, 3) end + -- Dilate Time if p.charges > 0 and not self.resting then self:project(self:getTalentTarget(t), self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end - target:setEffect(target.EFF_SLOW, 2, {power=p.power*p.charges, apply_power=self:combatSpellpower(), no_ct_effect=true}) + target:setEffect(target.EFF_SLOW, 1, {power=p.power*p.charges, apply_power=getParadoxSpellpower(self, t), no_ct_effect=true}) end) end end, + updateOnTeleport = function(self, t, x, y) + local p = self:isTalentActive(self.T_TIME_DILATION) + p.x, p.y = x, y + end, activate = function(self, t) local ret ={ - x = self.x, y=self.y, power = t.getSlow(self, t), charges = 0 + x = self.x, y=self.y, power = t.getSlow(self, t)/3, charges = 0 } game:playSoundNear(self, "talents/arcane") return ret @@ -92,9 +97,10 @@ newTalent{ end, info = function(self, t) local slow = t.getSlow(self, t) * 100 - return ([[Time Dilates around you, reducing the speed of all enemies within a radius of three by up to %d%%. This effect builds gradually over three turns and loses %d%% power each time you move. - The speed decrease will scale with your Spellpower]]): - format(slow*3, slow) + local radius = self:getTalentRadius(t) + return ([[Time Dilates around you, reducing the speed of all enemies within a radius of %d by up to %d%%. This effect builds gradually over three turns and loses %d%% power each time you move. + Movement via teleport will not lower the power and the speed decrease will scale with your Spellpower.]]): + format(radius, slow, slow/3) end, } @@ -106,15 +112,23 @@ newTalent{ paradox = function (self, t) return getParadoxCost(self, t, 20) end, cooldown = 24, tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 }, - getPower = function(self, t) return self:combatScale(self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)), 0, 0, 0.57, 57, 0.75) end, + getPower= function(self, t) return paradoxTalentScale(self, t, 20, 40, 60)/300 end, + getDuration = function(self, t) return getExtensionModifier(self, t, 4) end, + no_energy = true, action = function(self, t) - self:setEffect(self.EFF_SPEED, 4, {power=t.getPower(self, t)}) + local celerity = self:hasEffect(self.EFF_CELERITY) and self:hasEffect(self.EFF_CELERITY).charges or 0 + local dilation = self:isTalentActive(self.T_TIME_DILATION) and self:isTalentActive(self.T_TIME_DILATION).charges or 0 + local move = t.getPower(self, t) * celerity + local speed = t.getPower(self, t) * dilation + + self:setEffect(self.EFF_HASTE, t.getDuration(self, t), {move=move, speed=speed}) return true end, info = function(self, t) - local power = t.getPower(self, t) - return ([[Increases your global speed by %d%% for the next 4 game turns. - The speed increase will scale with your Spellpower.]]):format(100 * power) + local duration = t.getDuration(self, t) + local power = t.getPower(self, t) * 100 + return ([[Increases your movement speed by %d%% per stack of Celerity and your attack, spell, and mind speed by %d%% per stack of Time Dilation for the next %d game turns. + The speed increase will scale with your Spellpower.]]):format(power, power, duration) end, } @@ -123,31 +137,33 @@ newTalent{ type = {"chronomancy/speed-control", 4}, require = chrono_req4, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 48) end, + paradox = function (self, t) return getParadoxCost(self, t, 24) end, cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 45, 25)) end, -- Limit >10 tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 }, no_energy = true, on_pre_use = function(self, t, silent) local time_dilated = false if self:isTalentActive(self.T_TIME_DILATION) then - local t, p = self:getTalentFromId(self.T_TIME_DILATION), self:isTalentActive(self.T_TIME_DILATION) + local p = self:isTalentActive(self.T_TIME_DILATION) if p.charges == 3 then time_dilated = true end end - if not time_dilated then if not silent then game.logPlayer(self, "Time must be fully dilated in order to stop time.") end return false end return true + if not time_dilated then if not silent then game.logPlayer(self, "Time must be fully dilated in order to cast time stop.") end return false end return true end, - getReduction = function(self, t) return 80 - math.min(self:combatTalentSpellDamage(t, 0, 20, getParadoxSpellpower(self)), 30) end, + getReduction = function(self, t) return 80 - paradoxTalentScale(self, t, 0, 20, 40) end, + getDuration = function(self, t) return getExtensionModifier(self, t, 2) end, action = function(self, t) - self.energy.value = self.energy.value + 2000 - self:setEffect(self.EFF_TIME_STOP, 2, {power=t.getReduction(self, t)}) + self.energy.value = self.energy.value + (t.getDuration(self, t) * 1000) + self:setEffect(self.EFF_TIME_STOP, 1, {power=t.getReduction(self, t)}) game.logSeen(self, "#STEEL_BLUE#%s has stopped time!#LAST#", self.name:capitalize()) return true end, info = function(self, t) + local duration = t.getDuration(self, t) local reduction = t.getReduction(self, t) - return ([[Gain two turns. During this time your damage will be reduced by %d%%. + return ([[Gain %d turns. During this time your damage will be reduced by %d%%. Time must be fully dilated in order to use this talent. - The damage reduction penalty will be lessened by your Spellpower.]]):format(reduction) + The damage reduction penalty will be lessened by your Spellpower.]]):format(duration, reduction) end, } diff --git a/game/modules/tome/data/talents/chronomancy/spellbinding.lua b/game/modules/tome/data/talents/chronomancy/spellbinding.lua new file mode 100644 index 0000000000..1921cdc7c7 --- /dev/null +++ b/game/modules/tome/data/talents/chronomancy/spellbinding.lua @@ -0,0 +1,156 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +-- EDGE TODO: Particles, Timed Effect Particles + +newTalent{ + name = "Empower", + type = {"chronomancy/spellbinding", 1}, + require = chrono_req_high1, + points = 5, + sustain_paradox = 24, + mode = "sustained", + no_sustain_autoreset = true, + cooldown = 10, + no_npc_use = true, + allow_temporal_clones = true, + getPower = function(self, t) return self:combatTalentLimit(t, 1, 0.1, 0.5) end, + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- temporal clones *CAN* learn spellbinding talents but can't change the value + activate = function(self, t) + local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyEmpower").new(self)) + if not talent then return nil end + + return { + talent = talent, rest_count = 0 + } + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local power = t.getPower(self, t) * 100 + local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None" + return ([[Empowers the selected chronomancy spell, increasing spellpower when casting it by %d%%. + + Current Empowered Spell: %s]]): + format(power, talent) + end, +} + +newTalent{ + name = "Extension", + type = {"chronomancy/spellbinding", 1}, + require = chrono_req_high1, + points = 5, + sustain_paradox = 24, + mode = "sustained", + no_sustain_autoreset = true, + cooldown = 10, + no_npc_use = true, + allow_temporal_clones = true, + getPower = function(self, t) return self:combatTalentLimit(t, 0.5, 0.05, 0.25) end, + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- temporal clones *CAN* learn spellbinding talents but can't change the value + activate = function(self, t) + local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyExtension").new(self)) + if not talent then return nil end + + return { + talent = talent, rest_count = 0 + } + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local power = t.getPower(self, t) * 100 + local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None" + return ([[Extends the duration of the selected chronomancy spell by %d%%. + + Current Extended Spell: %s]]): + format(power, talent) + end, +} + +newTalent{ + name = "Matrix", + type = {"chronomancy/spellbinding", 1}, + require = chrono_req_high1, + points = 5, + sustain_paradox = 24, + mode = "sustained", + no_sustain_autoreset = true, + cooldown = 10, + no_npc_use = true, + allow_temporal_clones = true, + getPower = function(self, t) return self:combatTalentLimit(t, 0.5, 0.05, 0.25) end, + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- temporal clones *CAN* learn spellbinding talents but can't change the value + activate = function(self, t) + local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyMatrix").new(self)) + if not talent then return nil end + + return { + talent = talent, rest_count = 0 + } + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local power = t.getPower(self, t) * 100 + local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None" + return ([[Reduces the cooldown of the selected chronomancy spell by %d%%. + + Current Matrix Spell: %s]]): + format(power, talent) + end, +} + +newTalent{ + name = "Quicken", + type = {"chronomancy/spellbinding", 1}, + require = chrono_req_high1, + points = 5, + sustain_paradox = 24, + mode = "sustained", + no_sustain_autoreset = true, + cooldown = 10, + no_npc_use = true, -- so rares don't learn useless talents + allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it + getPower = function(self, t) return self:combatTalentLimit(t, 1, 0.1, 0.5) end, + activate = function(self, t) + local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyQuicken").new(self)) + if not talent then return nil end + + return { + talent = talent, rest_count = 0 + } + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local power = t.getPower(self, t) * 100 + local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None" + return ([[Reduces the casting speed of the selected chronomancy spell by %d%%. + + Current Quickened Spell: %s]]): + format(power, talent) + end, +} diff --git a/game/modules/tome/data/talents/chronomancy/temporal-archery.lua b/game/modules/tome/data/talents/chronomancy/temporal-archery.lua index 777cf93355..41dac39492 100644 --- a/game/modules/tome/data/talents/chronomancy/temporal-archery.lua +++ b/game/modules/tome/data/talents/chronomancy/temporal-archery.lua @@ -80,7 +80,7 @@ newTalent{ cooldown = 10, tactical = { BUFF = 2 }, no_energy = true, - getPower = function(self, t) return 10 + self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self)) end, + getPower = function(self, t) return 10 + self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self, t)) end, activate = function(self, t) local power = t.getPower(self, t) return { diff --git a/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua b/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua index 7622814fe1..87d8930df7 100644 --- a/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua +++ b/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua @@ -29,7 +29,7 @@ summonTemporalHound = function(self, t) end local m = require("mod.class.NPC").new{ - type = "animal", subtype = "hounds", + type = "animal", subtype = "canine", display = "C", image = "npc/summoner_wardog.png", color=colors.LIGHT_DARK, shader = "shadow_simulacrum", shader_args = { color = {0.6, 0.6, 0.2}, base = 0.8, time_factor = 1500 }, @@ -51,9 +51,10 @@ summonTemporalHound = function(self, t) infravision = 10, combat_armor = 2, combat_def = 4, - combat = { dam=self:getTalentLevel(t) * 10 + rng.avg(12,25), atk=10, apr=10, dammod={str=0.8}, damtype=DamageType.MATTER, sound="creatures/wolves/wolf_attack_1" }, + combat = { dam=self:getTalentLevel(t) * 10 + rng.avg(12,25), atk=10, apr=10, dammod={str=0.8, mag=0.8}, damtype=DamageType.WARP, sound="creatures/wolves/wolf_attack_1" }, summoner = self, summoner_gain_exp=true, + resolvers.sustains_at_birth(), } m:resolve() @@ -130,6 +131,7 @@ summonTemporalHound = function(self, t) }) end + self:attr("summoned_times", 1) end newTalent{ @@ -187,7 +189,7 @@ newTalent{ -- unsummon the hounds :( for _, e in pairs(game.level.entities) do - if e.summoner and e.summoner == self and e.subtype == "hounds" then + if e.summoner and e.summoner == self and e.name == "temporal hound" then e.summon_time = 0 end end @@ -217,7 +219,7 @@ newTalent{ requires_target = true, on_pre_use = function(self, t, silent) local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS) - if not p then + if not p or p.hounds < 1 then if not silent then game.logPlayer(self, "You must have temporal hounds to use this talent.") end @@ -230,7 +232,7 @@ newTalent{ end, direct_hit = true, getDefense = function(self, t) - return self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self)) + return self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self, t)) end, action = function(self, t) -- Pick our target @@ -244,17 +246,19 @@ newTalent{ local __, x, y = self:canProject(tg, x, y) -- Summon a new Hound - local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS) - local talent = self:getTalentFromId(self.T_TEMPORAL_HOUNDS) - if p.hounds < p.max_hounds then - summonTemporalHound(self, talent) - p.hounds = p.hounds + 1 - end + if self:getTalentLevel(t) >=5 then + local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS) + local talent = self:getTalentFromId(self.T_TEMPORAL_HOUNDS) + if p.hounds < p.max_hounds then + summonTemporalHound(self, talent) + p.hounds = p.hounds + 1 + end + end -- Find our hounds local hnds = {} for _, e in pairs(game.level.entities) do - if e.summoner and e.summoner == self and e.subtype == "hounds" then + if e.summoner and e.summoner == self and e.name == "temporal hound" then hnds[#hnds+1] = e end end @@ -290,7 +294,7 @@ newTalent{ local defense = t.getDefense(self, t) return ([[Command your Temporal Hounds to teleport to the targeted location. If you target a creature with this effect your hounds will set that creature as their target. When you learn this talent, your hounds gain %d defense and %d%% resist all after any teleport. - If you're not at your maximum number of hounds when you cast this spell a new one will be summoned. + At talent level five, if you're not at your maximum number of hounds when you cast this spell a new one will be summoned. The teleportation bonuses scale with your Spellpower.]]):format(defense, defense, defense/2, defense/2) end, } @@ -304,9 +308,9 @@ newTalent{ getImmunities = function(self, t) return self:combatTalentLimit(t, 1, 0.15, 0.50) -- Limit <100% end, - getRegen = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end, - getHaste = function(self, t) return self:combatScale(self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)), 0, 0, 0.57, 57, 0.75) end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end, + getRegen = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end, + getHaste = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80)/100 end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 2, 6))) end, doBlink = function(self, t, hound) -- Triggered when the hounds is hit local regen, haste = t.getRegen(self, t), t.getHaste(self, t) if hound:hasEffect(hound.EFF_UNRAVEL) then @@ -348,7 +352,7 @@ newTalent{ direct_hit = true, on_pre_use = function(self, t, silent) local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS) - if not p then + if not p or p.hounds < 1 then if not silent then game.logPlayer(self, "You must have temporal hounds to use this talent.") end @@ -359,7 +363,7 @@ newTalent{ getResists = function(self, t) return self:combatTalentLimit(t, 100, 15, 50) -- Limit <100% end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self, t)) end, getDamageStat = function(self, t) return 2 + math.ceil(t.getDamage(self, t) / 15) end, target = function(self, t) return {type="cone", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t} @@ -371,7 +375,7 @@ newTalent{ local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true) for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do local a = game.level.map(x, y, Map.ACTOR) - if a and a.summoner == self and a.subtype == "hounds" then + if a and a.summoner == self and a.name == "temporal hound" then hounds[#hounds+1] = a tg[#tg+1] = {type="cone", range=0, radius=self:getTalentRadius(t), start_x=a.x, start_y=a.y, selffire=false, talent=t} end @@ -397,7 +401,7 @@ newTalent{ DamageType:get(DamageType.TEMPORAL).projector(a, px, py, DamageType.TEMPORAL, dam) -- Don't turn back the clock other hounds local target = game.level.map(px, py, Map.ACTOR) - if target and target.subtype ~= "hounds" then + if target and target.name ~= "temporal hound" then target:setEffect(target.EFF_TURN_BACK_THE_CLOCK, 3, {power=t.getDamageStat(self, t), apply_power=a:combatSpellpower(), min_dur=1}) end end) diff --git a/game/modules/tome/data/talents/chronomancy/threaded-combat.lua b/game/modules/tome/data/talents/chronomancy/threaded-combat.lua index 482b4bb921..6501ddbac6 100644 --- a/game/modules/tome/data/talents/chronomancy/threaded-combat.lua +++ b/game/modules/tome/data/talents/chronomancy/threaded-combat.lua @@ -17,7 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org --- EDGE TODO: Talents, Icons, Particles, Timed Effect Particles +-- EDGE TODO: Particles, Timed Effect Particles newTalent{ name = "Frayed Threads", @@ -25,12 +25,12 @@ newTalent{ require = chrono_req_high1, mode = "passive", points = 5, - getPercent = function(self, t) return math.min(100, self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)))/100 end, + getPercent = function(self, t) return paradoxTalentScale(self, t, 40, 80, 100)/100 end, getRadius = function(self, t) return self:getTalentLevel(t) > 4 and 2 or 1 end, info = function(self, t) local percent = t.getPercent(self, t) * 100 local radius = t.getRadius(self, t) - return ([[Your Weapon Folding and Impact spells now deal %d%% of their damage in a radius of %d. + return ([[Your Weapon Folding and Impact spells now deal an additional %d%% damage in a radius of %d. The damage percent will scale with your Spellpower.]]) :format(percent, radius) end @@ -46,7 +46,7 @@ newTalent{ tactical = { ATTACKAREA = { weapon = 3 } , DISABLE = 3 }, requires_target = true, range = archery_range, - no_energy = "fake", + speed = function(self, t) return self:hasArcheryWeapon("bow") and "archery" or "weapon" end, getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 1.9) end, getCooldown = function(self, t) return self:getTalentLevel(t) >= 5 and 2 or 1 end, on_pre_use = function(self, t, silent) if self:attr("disarmed") then if not silent then game.logPlayer(self, "You require a weapon to use this talent.") end return false end return true end, @@ -62,7 +62,7 @@ newTalent{ for tid, cd in pairs(self.talents_cd) do local tt = self:getTalentFromId(tid) if tt.type[1]:find("^chronomancy/blade") then - self.talents_cd[tid] = cd - t.getCooldown(self, t) + self:alterTalentCoolingdown(tt, - t.getCooldown(self, t)) end end end, @@ -73,7 +73,7 @@ newTalent{ if self:hasArcheryWeapon("bow") then -- Ranged attack - local targets = self:archeryAcquireTargets(tg, {one_shot=true}) + local targets = self:archeryAcquireTargets(tg, {one_shot=true, no_energy = true}) if not targets then return end self:archeryShoot(targets, t, tg, {mult=dam}) elseif mainhand then @@ -81,13 +81,13 @@ newTalent{ self:project(tg, self.x, self.y, function(px, py, tg, self) local target = game.level.map(px, py, Map.ACTOR) if target and target ~= self then - local hit = self:attackTarget(target, nil, dam) + local hit = self:attackTarget(target, nil, dam, true) -- Refresh bow talents if hit then for tid, cd in pairs(self.talents_cd) do local tt = self:getTalentFromId(tid) if tt.type[1]:find("^chronomancy/bow") then - self.talents_cd[tid] = cd - t.getCooldown(self, t) + self:alterTalentCoolingdown(tt, - t.getCooldown(self, t)) end end end @@ -118,7 +118,7 @@ newTalent{ require = chrono_req_high3, mode = "passive", points = 5, - getPercent = function(self, t) return math.min(50, 10 + self:combatTalentSpellDamage(t, 0, 30, getParadoxSpellpower(self)))/100 end, + getPercent = function(self, t) return paradoxTalentScale(self, t, 10, 30, 50)/100 end, info = function(self, t) local percent = t.getPercent(self, t) * 100 return ([[Your Bow Threading and Blade Threading spells now deal %d%% more weapon damage if you did not have the appropriate weapon equipped when you initated the attack. @@ -136,8 +136,8 @@ newTalent{ cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 15, 45, 25)) end, -- Limit >15 tactical = { ATTACK = {weapon = 4} }, range = 10, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 12)) end, - getDamagePenalty = function(self, t) return 60 - math.min(self:combatTalentSpellDamage(t, 0, 20, getParadoxSpellpower(self)), 30) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 12))) end, + getDamagePenalty = function(self, t) return 60 - paradoxTalentScale(self, t, 0, 20, 30) end, requires_target = true, target = function(self, t) return {type="hit", range=self:getTalentRange(t)} @@ -168,7 +168,6 @@ newTalent{ local tids = {} for tid, _ in pairs(m.talents) do local t = m:getTalentFromId(tid) - if t.remove_on_clone then tids[#tids+1] = t end local tt = self:getTalentFromId(tid) if not tt.type[1]:find("^chronomancy/blade") and not tt.type[1]:find("^chronomancy/threaded") and not tt.type[1]:find("^chronomancy/guardian") then tids[#tids+1] = t @@ -181,11 +180,12 @@ newTalent{ m.ai_state = { talent_in=2, ally_compassion=10 } m.generic_damage_penalty = t.getDamagePenalty(self, t) - m:setTarget(target or nil) m.remove_from_party_on_death = true game.zone:addEntity(game.level, m, "actor", tx, ty) + m:setTarget(target or nil) + if game.party:hasMember(self) then game.party:addMember(m, { control="no", @@ -234,7 +234,6 @@ newTalent{ local tids = {} for tid, _ in pairs(m.talents) do local t = m:getTalentFromId(tid) - if t.remove_on_clone then tids[#tids+1] = t end local tt = self:getTalentFromId(tid) if not tt.type[1]:find("^chronomancy/bow") and not tt.type[1]:find("^chronomancy/threaded") and not tt.type[1]:find("^chronomancy/guardian") and not t.innate then tids[#tids+1] = t @@ -248,11 +247,12 @@ newTalent{ m.ai_state = { talent_in=2, ally_compassion=10 } m.generic_damage_penalty = t.getDamagePenalty(self, t) m:attr("archery_pass_friendly", 1) - m:setTarget(target or nil) m.remove_from_party_on_death = true game.zone:addEntity(game.level, m, "actor", tx, ty) + m:setTarget(target or nil) + if game.party:hasMember(self) then game.party:addMember(m, { control="no", @@ -283,6 +283,6 @@ newTalent{ local damage_penalty = t.getDamagePenalty(self, t) return ([[Summons a blade warden and a bow warden from an alternate timeline for %d turns. The wardens are out of phase with this reality and deal %d%% less damage but the bow warden's arrows will pass through friendly targets. Each warden knows all Threaded Combat, Temporal Guardian, and Blade Threading or Bow Threading spells you know. - The damage reduction penalty will be lessened by your Spellpower.]]):format(duration, damage_penalty) + The damage penalty will be lessened by your Spellpower.]]):format(duration, damage_penalty) end, } diff --git a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua index a2d943c2fa..609beb7d15 100644 --- a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua +++ b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua @@ -17,157 +17,453 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org +-- EDGE TODO: Particles, Timed Effect Particles + newTalent{ - name = "Gather the Threads", + name = "Rethread", type = {"chronomancy/timeline-threading", 1}, - require = chrono_req_high1, + require = chrono_req1, points = 5, + cooldown = 4, paradox = function (self, t) return getParadoxCost(self, t, 10) end, - cooldown = 12, - tactical = { BUFF = 2 }, - getThread = function(self, t) return self:combatTalentScale(t, 7, 30, 0.75) end, - getReduction = function(self, t) return self:combatTalentScale(t, 3.6, 15, 0.75) end, + tactical = { ATTACKAREA = {TEMPORAL = 2}, PARADOX = 2 }, + range = 10, + direct_hit = true, + reflectable = true, + requires_target = true, + target = function (self, t) + return {type="bolt", range=self:getTalentRange(t), talent=t} + end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end, + getTargetCount = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6, "log")) end, action = function(self, t) - self:setEffect(self.EFF_GATHER_THE_THREADS, 5, {power=t.getThread(self, t), reduction=t.getReduction(self, t)}) - game:playSoundNear(self, "talents/spell_generic2") + local tg = self:getTalentTarget(t) + local fx, fy = self:getTarget(tg) + if not fx or not fy then return nil end + + local nb = t.getTargetCount(self, t) + local affected = {} + local braid_targets = {} + local first = nil + + self:project(tg, fx, fy, function(dx, dy) + local actor = game.level.map(dx, dy, Map.ACTOR) + if actor and not affected[actor] then + affected[actor] = true + first = actor + + self:project({type="ball", selffire=false, x=dx, y=dy, radius=10, range=0}, dx, dy, function(bx, by) + local actor = game.level.map(bx, by, Map.ACTOR) + if actor and not affected[actor] and self:reactionToward(actor) < 0 then + affected[actor] = true + end + end) + return true + end + end) + + if not first then return end + local targets = { first } + affected[first] = nil + local possible_targets = table.listify(affected) + + for i = 2, nb do + if #possible_targets == 0 then break end + local act = rng.tableRemove(possible_targets) + targets[#targets+1] = act[1] + end + + local sx, sy = self.x, self.y + local damage = self:spellCrit(t.getDamage(self, t)) + for i, actor in ipairs(targets) do + local tgr = {type="beam", range=self:getTalentRange(t), selffire=false, talent=t, x=sx, y=sy} + self:project(tgr, actor.x, actor.y, function(px, py) + DamageType:get(DamageType.TEMPORAL).projector(self, px, py, DamageType.TEMPORAL, damage) + + -- Get our braid targets + local target = game.level.map(px, py, Map.ACTOR) + if target and not target.dead and self:knowTalent(self.T_BRAID_LIFELINES) then + braid_targets[#braid_targets+1] = target + end + end) + + game.level.map:particleEmitter(sx, sy, math.max(math.abs(actor.x-sx), math.abs(actor.y-sy)), "temporalbeam", {tx=actor.x-sx, ty=actor.y-sy}) + sx, sy = actor.x, actor.y + end + + -- Braid them + if #braid_targets > 1 then + for i = 1, #braid_targets do + local target = braid_targets[i] + local t = self:getTalentFromId(self.T_BRAID_LIFELINES) + target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getBraid(self, t), src=self, targets=braid_targets}) + end + end + + game:playSoundNear(self, "talents/heal") return true end, info = function(self, t) - local primary = t.getThread(self, t) - local reduction = t.getReduction(self, t) - return ([[You begin to gather energy from other timelines. Your Spellpower will increase by %0.2f on the first turn and %0.2f more each additional turn. - The effect ends either when you cast a spell, or after five turns. - Eacn turn the effect is active, your Paradox will be reduced by %d. - This spell will not break Spacetime Tuning, nor will it be broken by activating Spacetime Tuning.]]):format(primary + (primary/5), primary/5, reduction) + local damage = t.getDamage(self, t) + local targets = t.getTargetCount(self, t) + return ([[Rethread the timeline, dealing %0.2f temporal damage to the target before moving on to a second target. + Rethread 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. + The damage will increase with your Spellpower.]]): + format(damDesc(self, DamageType.TEMPORAL, damage), targets) end, } newTalent{ - name = "Rethread", + name = "Temporal Fugue", type = {"chronomancy/timeline-threading", 2}, - require = chrono_req_high2, + require = chrono_req2, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 10) end, - cooldown = 4, - tactical = { ATTACK = {TEMPORAL = 2} }, - range = 10, - direct_hit = true, - reflectable = true, - requires_target = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self)) end, - getReduction = function(self, t) return self:combatTalentScale(t, 1.2, 5, 0.75) end, + cooldown = 24, + paradox = function(self, t) return getParadoxCost(self, t, 20) end, + tactical = { ATTACK = 2, DISABLE = 2 }, + remove_on_clone = true, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 8))) end, + on_pre_use = function(self, t, silent) if self:hasEffect(self.EFF_TEMPORAL_FUGUE) then return false end return true end, action = function(self, t) - local tg = {type="beam", range=self:getTalentRange(t), talent=t} - local x, y = self:getTarget(tg) - if not x or not y then return nil end - local _ _, x, y = self:canProject(tg, x, y, t.paradox) - self:project(tg, x, y, DamageType.RETHREAD, {dam=self:spellCrit(t.getDamage(self, t)), reduction = t.getReduction(self, t)}) - game.level.map:particleEmitter(self.x, self.y, tg.radius, "temporalbeam", {tx=x-self.x, ty=y-self.y}) - game:playSoundNear(self, "talents/heal") + local clones = {self} + + -- Clone the caster + local function makeFugueClone(self, t) + local sex = game.player.female and "she" or "he" + local m = makeParadoxClone(self, self, t.getDuration(self, t)) + -- Add and change some values + m.name = self.name + m.desc = [[The real you... or so ]]..sex..[[ says.]] + m.shader = nil + m.shader_args = nil + m.faction = self.faction + m.summoner = self + m.remove_from_party_on_death = true + + -- Handle some AI stuff + m.ai_state = { talent_in=1, ally_compassion=10 } + m.ai_tactic = { closein=0, defend=4, disable=4, escape=4, heal=2, safe_range=3} + + return m + end + + -- Add our clones + for i = 1, 2 do + local tx, ty = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true}) + if tx and ty then + -- Make our clone and add to the party + local m = makeFugueClone(self, t) + if game.party:hasMember(self) then + game.party:addMember(m, { + control="full", + type="fugue clone", + title="Fugue Clone", + orders = {target=true}, + }) + end + + -- and the level + game.zone:addEntity(game.level, m, "actor", tx, ty) + game.level.map:particleEmitter(m.x, m.y, 1, "temporal_teleport") + clones[#clones+1] = m + end + end + + -- No clones? Exit the spell + if #clones < 2 then + game.logPlayer(self, "Not enough space to summon!") + return + end + + -- Link them + for i = 1, #clones do + local target = clones[i] + target:setEffect(target.EFF_TEMPORAL_FUGUE, 10, {targets=clones}) + end + + game:playSoundNear(self, "talents/spell_generic") + return true end, info = function(self, t) - local damage = t.getDamage(self, t) - local reduction = t.getReduction(self, t) - return ([[Creates a wake of temporal energy that deals %0.2f damage in a beam, as you attempt to rethread the timeline. Affected targets may be stunned, blinded, pinned, or confused for 3 turns. - Each target you hit with Rethread will reduce your Paradox by %0.1f. - The damage will increase with your Spellpower.]]): - format(damDesc(self, DamageType.TEMPORAL, damage), reduction) + local duration = t.getDuration(self, t) + return ([[For the next %d turns two alternate versions of you enter your timeline. While the effect is active all damage done by you or your copies is reduced by two thirds and all damage recieved is split between the three of you. + Temporal Fugue does not normally cooldown while active. You may take direct control of your clones.]]): + format(duration) end, } newTalent{ - name = "Temporal Clone", + name = "Braid Lifelines", type = {"chronomancy/timeline-threading", 3}, - require = chrono_req_high3, + require = chrono_req3, + mode = "passive", points = 5, - cooldown = 30, - paradox = function (self, t) return getParadoxCost(self, t, 30) end, - tactical = { ATTACK = 2, DISABLE = 2 }, + getBraid = function(self, t) return self:combatTalentSpellDamage(t, 25, 40, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end, + info = function(self, t) + local braid = t.getBraid(self, t) + local duration = t.getDuration(self, t) + return ([[Your Rethread now braids the lifelines of all targets it hits for %d turns. Braided targets take %d%% of all damage dealt to other braided targets. + The amount of damage shared will scale with your Spellpower.]]) + :format(duration, braid) + end +} + +newTalent{ + name = "Cease to Exist", + type = {"chronomancy/timeline-threading", 4}, + require = chrono_req4, + points = 5, + cooldown = 24, + paradox = function (self, t) return getParadoxCost(self, t, 25) end, + range = 10, + tactical = { ATTACK = 2 }, requires_target = true, - range = 6, - no_npc_use = true, - getDuration = function(self, t) -- limit < cooldown (30) - return math.floor(self:combatTalentLimit(self:getTalentLevel(t), t.cooldown, 4, 8)) + direct_hit = true, + no_npc_use = true, -- so rares don't learn useless talents + allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects + on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it + getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 5, 9)) end, + getPower = function(self, t) return paradoxTalentScale(self, t, 20, 50, 100) end, + target = function(self, t) + return {type="hit", range=self:getTalentRange(t), talent=t} + end, + on_pre_use = function(self, t, silent) + if checkTimeline(self) then + if not silent then + game.logPlayer(self, "The timeline is too fractured to do this now.") + end + return false + end + return true + end, + do_instakill = function(self, t) + -- search for target because it's ID will change when the chrono restore takes place + local tg = false + local grids = core.fov.circle_grids(self.x, self.y, 10, true) + for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do + local a = game.level.map(x, y, Map.ACTOR) + if a and a:hasEffect(a.EFF_CEASE_TO_EXIST) then + tg = a + end + end end + + if tg then + game:onTickEnd(function() + tg:removeEffect(tg.EFF_CEASE_TO_EXIST) + game.logSeen(tg, "#LIGHT_BLUE#%s never existed, this never happened!", tg.name:capitalize()) + tg:die(self) + end) + end end, - getSize = function(self, t) return 2 + math.ceil(self:getTalentLevelRaw(t) / 2 ) end, action = function(self, t) - local tg = {type="hit", range=self:getTalentRange(t), talent=t} - local tx, ty, target = self:getTarget(tg) - if not tx or not ty then return nil end - local _ _, _, _, tx, ty = self:canProject(tg, tx, ty) + -- get our target + local tg = self:getTalentTarget(t) + local tx, ty = self:getTarget(tg) if not tx or not ty then return nil end + local _ _, tx, ty = self:canProject(tg, tx, ty) + local target = game.level.map(tx, ty, Map.ACTOR) - if not target or self:reactionToward(target) >= 0 then return end + if not target then return end - -- Find space - local x, y = util.findFreeGrid(tx, ty, 1, true, {[Map.ACTOR]=true}) - if not x then - game.logPlayer(self, "Not enough space to summon!") - return + if target == self then + game.logSeen(self, "#LIGHT_STEEL_BLUE#%s tries to remove %sself from existance!", self.name, string.his_her(self)) + self:incParadox(400) + game.level.map:particleEmitter(self.x, self.y, 1, "ball_temporal", {radius=1, tx=self.x, ty=self.y}) + return true end - - local allowed = t.getSize(self, t) - - if target.rank >= 3.5 or -- No boss - target:reactionToward(self) >= 0 or -- No friends - target.size_category > allowed - then + + -- does the spell hit? if not nothing happens + if not self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist()) then game.logSeen(target, "%s resists!", target.name:capitalize()) return true end + + -- Manualy start cooldown before the chronoworld is made + game.player:startTalentCooldown(t) + + -- set up chronoworld next, we'll load it when the target dies in class\actor + game:onTickEnd(function() + game:chronoClone("cease_to_exist") + end) + + -- Set our effect + target:setEffect(target.EFF_CEASE_TO_EXIST, t.getDuration(self,t), {src=self, power=t.getPower(self,t)}) + + return true + end, + info = function(self, t) + local duration = t.getDuration(self, t) + local power = t.getPower(self, t) + return ([[Over the next %d turns, you attempt to remove the target from the timeline, lowering all its resistance by %d%%. + If you manage to kill the target while the spell is in effect, you'll be returned to the point in time you cast this spell and the target will be slain. + This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful. + The resistance penalty will scale with your Spellpower.]]) + :format(duration, power) + end, +} - local m = target:cloneFull{ - no_drops = true, - faction = self.faction, - summoner = self, summoner_gain_exp=true, - exp_worth = 0, -- bug fix - summon_time = t.getDuration(self, t), - ai_target = {actor=target}, - ai = "summoned", ai_real = target.ai, - } - m:removeAllMOs() - m.make_escort = nil - m.on_added_to_level = nil - - m.energy.value = 0 - m.life = m.life - m.forceLevelup = function() end - -- Handle special things - m.on_die = nil - m.on_acquire_target = nil - m.seen_by = nil - m.can_talk = nil - m.clone_on_hit = nil - if m.talents.T_SUMMON then m.talents.T_SUMMON = nil end - if m.talents.T_MULTIPLY then m.talents.T_MULTIPLY = nil end - +-- This was a really cool affect but the game really assumes that the player is on the map +-- I suspect there's a lot of unforseen bugs in this code but I'm leaving it here incase someone else wants to attempt to do something similar in the future +--[=[newTalent{ + name = "Temporal Fugue", + type = {"chronomancy/timeline-threading", 2}, + require = chrono_req2, + points = 5, + cooldown = 12, + paradox = function (self, t) return getParadoxCost(self, t, 15) end, + tactical = { DISABLE = 3 }, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 4, 8))) end, + getDamagePenalty = function(self, t) return 80 - paradoxTalentScale(self, t, 0, 20, 40) end, + getClones = function(self, t) return 3 end, + on_pre_use = function(self, t, silent) if self ~= game.player and self.fugue_clones then return false end return true end, + action = function(self, t) + -- If the spell is active cancel the effect + if self.fugue_clones then + for _, e in pairs(game.level.entities) do + if e.summoner and e.summoner == self.summoner and e.fugue_clones and e ~= self then + e:die() + end + end + return true + end + + -- Remove the player + local x, y = self.x, self.y + game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport") + game.level:removeEntity(self, true) + + -- Setup our Fugue Clones + local fugue_count = 0 + local function makeFugueClone(self, t, x, y) + local m = makeParadoxClone(self, self, t.getDuration(self, t)) + + -- Flavor :) + local sex = self.female and "she" or "he" + m.name = self.name + m.desc = [[The real ]]..self.name:capitalize()..[[... or so ]]..sex..[[ says.]] + m.shader = nil + m.shader_args = nil + + -- Add and change some values + m.generic_damage_penalty = t.getDamagePenalty(self, t) + m.max_life = m.max_life * (100 - t.getDamagePenalty(self, t))/100 + m.life = m.max_life + m.remove_from_party_on_death = true + m.timetravel_immune = 1 + + -- Handle some AI stuff + m.ai_state = { talent_in=2, ally_compassion=10 } + + -- Track clones when we die + m.on_die = function(self) + -- If we're the last return the caster + if self.fugue_clones <= 1 then + -- don't level up on return + local old_levelup = self.summoner.forceLevelup + local old_check = self.summoner.check + self.summoner.forceLevelup = function() end + self.summoner.check = function() end + game.zone:addEntity(game.level, self.summoner, "actor", self.x, self.y) + self.summoner.forceLevelup = old_levelup + self.summoner.check = old_check + if game.party:hasMember(self) then + game.party:setPlayer(self.summoner) + end + else + -- find fellow clones and update the clone count + for _, e in pairs(game.level.entities) do + if e.summoner and e.summoner == self.summoner and e.fugue_clones then + e.fugue_clones = e.fugue_clones - 1 + if e.fugue_clones <= 1 then + e.summon_time = 0 + end + end + end + end + local add_paradox = math.max(0, self:getParadox() - self.summoner:getParadox()) + self.summoner:incParadox(add_paradox/3) + end + + return m + end + + -- Add the primary clone to the game + local m = makeFugueClone(self, t, x, y) + if game.party:hasMember(self) then + game.party:addMember(m, { + control="full", + type="fugue clone", + title="Fugue Clone", + orders = {target=true}, + }) + end game.zone:addEntity(game.level, m, "actor", x, y) - game.level.map:particleEmitter(x, y, 1, "temporal_teleport") - - -- force target to attack double - local a = game.level.map(tx, ty, Map.ACTOR) - if a and self:reactionToward(a) < 0 then - a:setTarget(m) + local fugue_count = 1 + + -- Swap control to the primary clone + if game.party:hasMember(self) then + game.party:setPlayer(m) + m.summon_time = m.summon_time + 1 end + + m:resetCanSeeCache() + + -- Make the rest of our clones + for i = 1, t.getClones(self, t)-1 do + local m = makeFugueClone(self, t, x, y) + + local poss = {} + local range = t.getClones(self, t) + for i = x - range, x + range do + for j = y - range, y + range do + if game.level.map:isBound(i, j) and + core.fov.distance(x, y, i, j) <= range and -- make sure they're within range + self:canMove(i, j) and self:hasLOS(i, j) then -- keep them in line of sight + poss[#poss+1] = {i,j} + end + end + end + if #poss == 0 then break end + local pos = poss[rng.range(1, #poss)] + tx, ty = pos[1], pos[2] - game:playSoundNear(self, "talents/spell_generic") + -- And add to the party + if game.party:hasMember(self) then + game.party:addMember(m, { + control="full", + type="fugue clone", + title="Fugue Clone", + orders = {target=true}, + }) + end + + -- Add us to the level + game.zone:addEntity(game.level, m, "actor", tx, ty) + game.level.map:particleEmitter(m.x, m.y, 1, "temporal_teleport") + fugue_count = fugue_count + 1 + end + + -- Add the fugue counter + for _, e in pairs(game.level.entities) do + if e.summoner and e.summoner == self then + e.fugue_clones = fugue_count + end + end + + game.level.map:particleEmitter(m.x, m.y, 1, "temporal_teleport") + game:playSoundNear(m, "talents/teleport") + return true end, info = function(self, t) local duration = t.getDuration(self, t) - local allowed = t.getSize(self, t) - local size = "gargantuan" - if allowed < 4 then - size = "medium" - elseif allowed < 5 then - size = "big" - elseif allowed < 6 then - size = "huge" - end - return ([[Pulls a %s size or smaller copy of the target from another timeline; the copy stays for %d turns. The copy and the target will be compelled to attack each other immediately.]]): - format(size, duration) + local damage_penalty = t.getDamagePenalty(self, t) + return ([[Split yourself into three fugue clones. The clones have %d%% of your maximum life, deal %d%% less damage, and last %d turns. + Each clone that dies will increase your Paradox by 33%% of the difference between its Paradox and your own. This will never reduce your Paradox. + When only one clone is left, or if you cast the spell while in the fugue state, the spell will end, returning you to the position of the last active clone. + The life and damage penalties will be reduced by your Spellpower.]]): + format(100 - damage_penalty, damage_penalty, duration) end, -} - - +}]=]-- \ No newline at end of file diff --git a/game/modules/tome/data/talents/chronomancy/timetravel.lua b/game/modules/tome/data/talents/chronomancy/timetravel.lua index e416f07b35..b0b3538d09 100644 --- a/game/modules/tome/data/talents/chronomancy/timetravel.lua +++ b/game/modules/tome/data/talents/chronomancy/timetravel.lua @@ -17,101 +17,146 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org --- EDGE TODO: Icons, Particles, Timed Effect Particles +-- EDGE TODO:Particles, Timed Effect Particles newTalent{ - name = "Time Skip", + name = "Temporal Bolt", type = {"chronomancy/timetravel",1}, - require = chrono_req_high1, + require = chrono_req1, points = 5, - cooldown = 4, + cooldown = 3, + fixed_cooldown = true, paradox = function (self, t) return getParadoxCost(self, t, 10) end, - tactical = { ATTACK = {TEMPORAL = 1}, DISABLE = 2 }, + tactical = { ATTACK = {TEMPORAL = 2}, DISABLE = 1 }, range = 10, + reflectable = true, + proj_speed = 3, direct_hit = true, requires_target = true, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self, t)) end, target = function(self, t) - return {type="hit", range=self:getTalentRange(t), talent=t} + return {type="hit", range=self:getTalentRange(t), friendlyfire=false, talent=t} end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 250, getParadoxSpellpower(self)) end, - getDuration = function(self, t) return 2 + math.ceil(self:combatTalentScale(self:getTalentLevel(t), 0.3, 2.3)) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end - local _ _, x, y = self:canProject(tg, x, y) - local target = game.level.map(x, y, Map.ACTOR) - if not target then return end + + local dam = self:spellCrit(t.getDamage(self, t)) + + -- Hit our initial target; quality of life hack + self:project(tg, x, y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if not target then return end + -- Refresh talent + for tid, cd in pairs(self.talents_cd) do + local tt = self:getTalentFromId(tid) + if tt.type[1]:find("^chronomancy/") and not tt.fixed_cooldown then + self:alterTalentCoolingdown(tt, - 1) + end + end + DamageType:get(DamageType.TEMPORAL).projector(self, x, y, DamageType.TEMPORAL, dam) + end) + + -- Make our homing missile + self:project(tg, x, y, function(x, y) + local proj = require("mod.class.Projectile"):makeHoming( + self, + {particle="arrow", particle_args={tile="particles_images/temporal_bolt", proj_x=self.x, proj_y=self.y, src_x=x, src_y=y}, trail="trail_paradox"}, + {speed=3, name="Temporal Bolt", dam=dam, apply=getParadoxSpellpower(self, t), start_x=x, start_y=y}, + self, self:getTalentRange(t), + function(self, src) + local target = game.level.map(self.x, self.y, engine.Map.ACTOR) + if target and not target.dead and src:reactionToward(target) < 0 then + local DT = require("engine.DamageType") + local multi = (10 - self.homing.count)/20 + local dam = self.def.dam * (1 + multi) + src:project({type="hit", friendlyfire=false, talent=t}, self.x, self.y, DT.TEMPORAL, dam) + + -- Refresh talent + for tid, cd in pairs(src.talents_cd) do + local tt = src:getTalentFromId(tid) + if tt.type[1]:find("^chronomancy/") and not tt.fixed_cooldown then + src:alterTalentCoolingdown(tt, - 1) + end + end + end + end, + function(self, src) + end + ) + game.zone:addEntity(game.level, proj, "projectile", x, y) + end) + + game:playSoundNear({x=x, y=y}, "talents/distortion") - if target:attr("timetravel_immune") then - game.logSeen(target, "%s is immune!", target.name:capitalize()) - return - end + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + return ([[Pull a bolt of temporal energy back through time. The bolt will home in on your location, dealing %0.2f temporal damage to enemies, and reducing the cooldown of one chronomancy talent on cooldown by one turn per enemy hit. + The bolt gains 5%% damage each time it moves and the damage will scale with your Spellpower.]]): + format(damDesc(self, DamageType.TEMPORAL, damage)) + end, +} - local power = self:combatSpellpower() * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower")) - local hit = self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) - if not hit then game.logSeen(target, "%s resists!", target.name:capitalize()) return true end - self:project(tg, x, y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t))) - game.level.map:particleEmitter(x, y, 1, "temporal_thrust") - game:playSoundNear(self, "talents/arcane") - if target.dead or target.player then return true end - target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self:combatSpellpower(0.3)}) +newTalent{ + name = "Echoes From The Past", + type = {"chronomancy/timetravel", 2}, + require = chrono_req2, + points = 5, + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 10, + tactical = { ATTACKAREA = {TEMPORAL = 2} }, + range = 0, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end, + target = function(self, t) + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} + end, + direct_hit = true, + requires_target = true, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 18, 160, getParadoxSpellpower(self, t)) end, + getPercent = function(self, t) return paradoxTalentScale(self, t, 20, 40, 60)/100 end, + action = function(self, t) + local tg = self:getTalentTarget(t) - -- Replace the target with a temporal instability for a few turns - local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN) - if not oe or oe:attr("temporary") then return true end - local e = mod.class.Object.new{ - old_feat = oe, type = oe.type, subtype = oe.subtype, - name = "temporal instability", image = oe.image, add_mos = {{image="object/temporal_instability.png"}}, - display = '&', color=colors.LIGHT_BLUE, - temporary = t.getDuration(self, t), - canAct = false, - target = target, - act = function(self) - self:useEnergy() - self.temporary = self.temporary - 1 - -- return the rifted actor - if self.temporary <= 0 then - game.level.map(self.target.x, self.target.y, engine.Map.TERRAIN, self.old_feat) - game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y) - game.level:removeEntity(self) - local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true}) - local old_levelup = self.target.forceLevelup - self.target.forceLevelup = function() end - game.zone:addEntity(game.level, self.target, "actor", mx, my) - self.target.forceLevelup = old_levelup - end - end, - summoner_gain_exp = true, summoner = self, - } + local damage = self:spellCrit(t.getDamage(self, t)) + self:project(tg, self.x, self.y, function(px, py) + DamageType:get(DamageType.TEMPORAL).projector(self, px, py, DamageType.TEMPORAL, damage) + + -- Echo + local target = game.level.map(px, py, Map.ACTOR) + if not target then return end + local percent = t.getPercent(self, t)/target.rank + local dam = (target.max_life - target.life) * percent + DamageType:get(DamageType.TEMPORAL).projector(self, px, py, DamageType.TEMPORAL, dam) + end) - game.logSeen(target, "%s has moved forward in time!", target.name:capitalize()) - game.level:removeEntity(target, true) - game.level:addEntity(e) - game.level.map(x, y, Map.TERRAIN, e) - game.nicer_tiles:updateAround(game.level, x, y) - game.level.map:updateMap(x, y) + game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_temporal", {radius=tg.radius}) + game:playSoundNear(self, "talents/teleport") return true end, info = function(self, t) + local percent = t.getPercent(self, t) * 100 + local radius = self:getTalentRadius(t) local damage = t.getDamage(self, t) - local duration = t.getDuration(self, t) - return ([[Inflicts %0.2f temporal damage, if the target fails a spell save. If your target survives, it will be removed from time for %d turns. - The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration) + return ([[Creates a temporal echo in a radius of %d around you. Affected targets will take %0.2f temporal damage, as well as up to %d%% of the difference between their current life and max life as additional temporal damage. + The additional damage will be divided by the target's rank and the damage scales with your Spellpower.]]): + format(radius, damDesc(self, DamageType.TEMPORAL, damage), percent) end, } newTalent{ name = "Temporal Reprieve", - type = {"chronomancy/timetravel", 2}, - require = chrono_req_high2, + type = {"chronomancy/timetravel", 3}, + require = chrono_req3, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 36) end, - cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 45, 25)) end, -- Limit >10 + paradox = function (self, t) return getParadoxCost(self, t, 20) end, + cooldown = 40, no_npc_use = true, - on_pre_use = function(self, t) return self:canBe("planechange") end, - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end, fixed_cooldown = true, + on_pre_use = function(self, t) return self:canBe("planechange") end, + getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 2, 6))) end, action = function(self, t) if game.zone.is_temporal_reprieve then game.logPlayer(self, "This talent cannot be used from within the reprieve.") @@ -157,7 +202,7 @@ newTalent{ self.temporal_reprieve_on_die = self.on_die self.on_die = function(self, ...) - self:removeEffect(self.EFF_DREAMSCAPE) + self:removeEffect(self.EFF_TEMPORAL_REPRIEVE) local args = {...} game:onTickEnd(function() if self.temporal_reprieve_on_die then self:temporal_reprieve_on_die(unpack(args)) end @@ -182,175 +227,96 @@ newTalent{ } newTalent{ - name = "Echoes From The Past", - type = {"chronomancy/timetravel", 3}, - require = chrono_req_high3, + name = "Time Skip", + type = {"chronomancy/timetravel",4}, + require = chrono_req4, points = 5, - paradox = function (self, t) return getParadoxCost(self, t, 20) end, - cooldown = 10, - tactical = { ATTACKAREA = {TEMPORAL = 2} }, - range = 0, - radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end, + cooldown = 4, + paradox = function (self, t) return getParadoxCost(self, t, 10) end, + tactical = { ATTACK = {TEMPORAL = 1}, DISABLE = 2 }, + range = 10, + direct_hit = true, + requires_target = true, target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} + return {type="hit", range=self:getTalentRange(t), talent=t} end, - direct_hit = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 18, 160, getParadoxSpellpower(self)) end, - getPercent = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 1, 10, getParadoxSpellpower(self)), 0.5, .1, 0, 0.1575, 5.75) end, -- Limit to <50% + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 250, getParadoxSpellpower(self, t)) end, + getDuration = function(self, t) return getExtensionModifier(self, t, 2 + math.ceil(self:combatTalentScale(self:getTalentLevel(t), 0.3, 2.3))) end, action = function(self, t) local tg = self:getTalentTarget(t) - self:project(tg, self.x, self.y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t))) - self:project(tg, self.x, self.y, DamageType.TEMPORAL_ECHO, t.getPercent(self, t)) - game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_temporal", {radius=tg.radius}) - game:playSoundNear(self, "talents/teleport") - return true - end, - info = function(self, t) - local percent = t.getPercent(self, t) * 100 - local radius = self:getTalentRadius(t) - local damage = t.getDamage(self, t) - return ([[Creates a temporal echo in a nova around you, in a radius of %d. Affected targets will take %0.2f temporal damage, as well as %d%% of the difference between their current life and max life as additional temporal damage. - The percentage and damage scales with your Spellpower.]]): - format(radius, damDesc(self, DamageType.TEMPORAL, damage), percent) - end, -} - -newTalent{ - name = "Damage Smearing", - type = {"chronomancy/timetravel", 4}, - mode = "sustained", - require = chrono_req_high4, - sustain_paradox = 84, - cooldown = 24, - tactical = { DEFEND = 2 }, - points = 5, - -- called in damage_types to split the damage - getPercent = function(self, t) return self:combatTalentLimit(t, 50, 10, 30)/100 end, -- Limit < 50% - getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end, - activate = function(self, t) - game:playSoundNear(self, "talents/spell_generic") - return {} - end, - deactivate = function(self, t, p) - return true - end, - info = function(self, t) - local percent = t.getPercent(self, t) * 100 - local duration = t.getDuration(self, t) - return ([[You convert %d%% of all non-temporal damage you receive into temporal damage spread out over %d turns. - ]]):format(percent, duration) - end, -} + local x, y = self:getTarget(tg) + if not x or not y then return nil end + local _ _, x, y = self:canProject(tg, x, y) + local target = game.level.map(x, y, Map.ACTOR) + if not target then return end ---[=[ -newTalent{ - name = "Door to the Past", - type = {"chronomancy/timetravel", 4}, - require = chrono_req_high4, no_sustain_autoreset = true, - points = 5, - mode = "sustained", - sustain_paradox = 150, - cooldown = 25, - no_npc_use = true, - getAnomalyCount = function(self, t) return math.ceil(self:getTalentLevel(t)) end, - on_learn = function(self, t) - if not self:knowTalent(self.T_REVISION) then - self:learnTalent(self.T_REVISION, nil, nil, {no_unlearn=true}) - end - end, - on_unlearn = function(self, t) - if not self:knowTalent(t) then - self:unlearnTalent(self.T_REVISION) - end - end, - do_anomalyCount = function(self, t) - if self.dttp_anomaly_count == 0 then - -- check for anomaly - if not game.zone.no_anomalies and not self:attr("no_paradox_fail") and self:paradoxFailChance() then - -- Random anomaly - local ts = {} - for id, t in pairs(self.talents_def) do - if t.type[1] == "chronomancy/anomalies" then ts[#ts+1] = id end - end - if not silent then game.logPlayer(self, "Your Door to the Past has caused an anomaly!") end - self:forceUseTalent(rng.table(ts), {ignore_energy=true}) - end - -- reset count - self.dttp_anomaly_count = t.getAnomalyCount(self, t) - else - self.dttp_anomaly_count = self.dttp_anomaly_count - 1 - end - end, - activate = function(self, t) - if checkTimeline(self) == true then - return + if target:attr("timetravel_immune") then + game.logSeen(target, "%s is immune!", target.name:capitalize()) + return true end - -- set the counter - self.dttp_anomaly_count = t.getAnomalyCount(self, t) - + -- Project our damage + self:project(tg, x, y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t))) + + game.level.map:particleEmitter(x, y, 1, "temporal_thrust") game:playSoundNear(self, "talents/arcane") - return { - game:onTickEnd(function() - game:chronoClone("revision") - end), - particle = self:addParticles(Particles.new("temporal_aura", 1)), + + -- If they're dead don't remove them from time + if target.dead or target.player then return true end + + -- Check hit + local power = getParadoxSpellpower(self, t) + local hit = self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) + if not hit then game.logSeen(target, "%s resists!", target.name:capitalize()) return true end + + -- Apply spellshock and destabilization + target:crossTierEffect(target.EFF_SPELLSHOCKED, getParadoxSpellpower(self, t)) + target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=getParadoxSpellpower(self, t, 0.3)}) + + -- Placeholder for the actor + local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN) + if not oe or oe:attr("temporary") then return true end + local e = mod.class.Object.new{ + old_feat = oe, type = oe.type, subtype = oe.subtype, + name = "temporal instability", image = oe.image, add_mos = {{image="object/temporal_instability.png"}}, + display = '&', color=colors.LIGHT_BLUE, + temporary = t.getDuration(self, t), + canAct = false, + target = target, + act = function(self) + self:useEnergy() + self.temporary = self.temporary - 1 + -- return the rifted actor + if self.temporary <= 0 then + game.level.map(self.target.x, self.target.y, engine.Map.TERRAIN, self.old_feat) + game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y) + game.level:removeEntity(self) + local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true}) + local old_levelup = self.target.forceLevelup + local old_check = self.target.check + self.target.forceLevelup = function() end + self.target.check = function() end + game.zone:addEntity(game.level, self.target, "actor", mx, my) + self.target.forceLevelup = old_levelup + self.target.check = old_check + end + end, + summoner_gain_exp = true, summoner = self, } - end, - deactivate = function(self, t, p) - if game._chronoworlds then game._chronoworlds = nil end - self.dttp_anomaly_count = nil - self:removeParticles(p.particle) - return true - end, - info = function(self, t) - local count = t.getAnomalyCount(self, t) - return ([[This powerful spell allows you to mark a point in time that you can later return to by casting Revision (which you'll automatically learn upon learning this spell). Maintaining such a doorway causes constant strain on the spacetime continuum and can possibly trigger an anomaly (using your current anomaly chance) once every %d turns. - This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful. - Additional talent points will increase the time between anomaly checks.]]): - format(count) - end, -} - -newTalent{ - name = "Revision", - type = {"chronomancy/other", 1}, - type_no_req = true, - points = 1, - message = "@Source@ revises history.", - cooldown = 50, - paradox = 25, - no_npc_use = true, - on_pre_use = function(self, t, silent) if not self:isTalentActive(self.T_DOOR_TO_THE_PAST) then if not silent then game.logPlayer(self, "Door to the Past must be active to use this talent.") end return false end return true end, - no_unlearn_last = true, - action = function(self, t) - - -- Prevent Revision After Death - if game._chronoworlds == nil then - game.logPlayer(game.player, "#LIGHT_RED#Your spell fizzles.") - return - end - - game:onTickEnd(function() - if not game:chronoRestore("revision", true) then - game.logSeen(self, "#LIGHT_RED#The spell fizzles.") - return - end - game.logPlayer(game.player, "#LIGHT_BLUE#You unfold the spacetime continuum to a previous state!") - - -- Manualy start the cooldown of the "old player" - game.player:startTalentCooldown(t) - game.player:incParadox(t.paradox * (1 + (game.player.paradox / 300))) - game.player:forceUseTalent(game.player.T_DOOR_TO_THE_PAST, {ignore_energy=true}) - -- remove anomaly count - if self.dttp_anomaly_count then self.dttp_anomaly_count = nil end - if game._chronoworlds then game._chronoworlds = nil end - end) - + + -- Replace the target with the instability and update the map + game.logSeen(target, "%s has moved forward in time!", target.name:capitalize()) + game.level:removeEntity(target, true) + game.level:addEntity(e) + game.level.map(x, y, Map.TERRAIN, e) + game.nicer_tiles:updateAround(game.level, x, y) + game.level.map:updateMap(x, y) return true end, info = function(self, t) - return ([[Casting Revision will return you to the point in time you created a temporal marker using Door to the Past.]]) - :format() + local damage = t.getDamage(self, t) + local duration = t.getDuration(self, t) + return ([[Inflicts %0.2f temporal damage. If your target survives, it may be removed from time for %d turns. + The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration) end, -}]=] +} \ No newline at end of file diff --git a/game/modules/tome/data/talents/misc/inscriptions.lua b/game/modules/tome/data/talents/misc/inscriptions.lua index 2851df5e6f..1fdda0c562 100644 --- a/game/modules/tome/data/talents/misc/inscriptions.lua +++ b/game/modules/tome/data/talents/misc/inscriptions.lua @@ -1012,7 +1012,7 @@ newInscription{ if target:attr("timetravel_immune") then game.logSeen(target, "%s is immune!", target.name:capitalize()) - return + return true end local hit = self:checkHit(self:combatSpellpower(), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) @@ -1021,6 +1021,7 @@ newInscription{ self:project(tg, x, y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t))) game.level.map:particleEmitter(x, y, 1, "temporal_thrust") game:playSoundNear(self, "talents/arcane") + self:incParadox(-25) if target.dead or target.player then return true end target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self:combatSpellpower(0.3)}) @@ -1044,9 +1045,12 @@ newInscription{ game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y) local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true}) local old_levelup = self.target.forceLevelup + local old_check = self.target.check self.target.forceLevelup = function() end + self.target.check = function() end game.zone:addEntity(game.level, self.target, "actor", mx, my) self.target.forceLevelup = old_levelup + self.target.check = old_check end end, summoner_gain_exp = true, summoner = self, @@ -1064,6 +1068,7 @@ newInscription{ local damage = t.getDamage(self, t) local duration = t.getDuration(self, t) return ([[Inflicts %0.2f temporal damage. If your target survives, it will be sent %d turns into the future. + It will also lower your paradox by 25 (if you have any). Note that messing with the spacetime continuum may have unforeseen consequences.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration) end, short_info = function(self, t) diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua index dd5d107c2a..954bb1faf6 100644 --- a/game/modules/tome/data/talents/misc/npcs.lua +++ b/game/modules/tome/data/talents/misc/npcs.lua @@ -1550,7 +1550,7 @@ newTalent{ direct_hit = true, reflectable = true, requires_target = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self)) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self, t)) end, action = function(self, t) local tg = {type="hit", range=self:getTalentRange(t), talent=t} local x, y = self:getTarget(tg) @@ -1637,7 +1637,7 @@ newTalent{ range = 10, direct_hit = true, requires_target = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self)) * 10000 end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self, t)) * 10000 end, action = function(self, t) local tg = {type="hit", range=self:getTalentRange(t), talent=t} local x, y = self:getTarget(tg) diff --git a/game/modules/tome/data/talents/uber/mag.lua b/game/modules/tome/data/talents/uber/mag.lua index 0f1d0971c6..4d8ea5aa17 100644 --- a/game/modules/tome/data/talents/uber/mag.lua +++ b/game/modules/tome/data/talents/uber/mag.lua @@ -108,8 +108,7 @@ uberTalent{ info = function(self, t) return ([[You can wrap temporal threads around you, assuming the form of a telugoroth for 10 turns. While in this form you gain pinning, bleeding, blindness and stun immunity, 30%% temporal resistance, your temporal damage bonus is set to your current highest damage bonus + 30%%, 50%% of the damage you deal becomes temporal, and you gain 20%% temporal resistance penetration. - You also are able to cast two anomalies: Anomaly Rearrange and Anomaly Temporal Storm. - Transforming to this form will increase your paradox by 400 but also grant the equivalent of +200 willpower to control paradoxes and failures. This reverts back at the end of the effect.]]) + You also are able to cast two anomalies: Anomaly Rearrange and Anomaly Temporal Storm.]]) :format() end, } @@ -182,6 +181,8 @@ uberTalent{ who:learnTalent(who.T_BONE_SHIELD,true,math.ceil(tlevel*2/3)) elseif who.name == "mucus ooze" then who:learnTalent(who.T_VIRULENT_DISEASE,true,tlevel) + elseif who.name == "temporal hound" then + who:learnTalent(who.T_ELEMENTAL_DISCORD,true,tlevel) else -- print("Error: attempting to apply talent Blighted Summoning to incorrect creature type") return false @@ -214,6 +215,7 @@ uberTalent{ - Yeek Wayists: Dark Portal - Bloated Oozes: Bone Shield (level %d) - Mucus Oozes: Virulent Disease + - Temporal Hounds: Elemental Discord Your necrotic minions and wild-summons get a bonus to Magic equal to yours. The talent levels increase with your level, and other race- or object-based summons may also be affected. ]]):format(tl,math.ceil(tl*2/3)) diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua index 0392f2f86f..f2bba636a0 100644 --- a/game/modules/tome/data/timed_effects/magical.lua +++ b/game/modules/tome/data/timed_effects/magical.lua @@ -1479,15 +1479,11 @@ newEffect{ newEffect{ name = "REDUX", image = "talents/redux.png", desc = "Redux", - long_desc = function(self, eff) return "The next activated chronomancy talent that the target uses will be cast twice." end, + long_desc = function(self, eff) return ("Chronomancy spells with cooldown less than %d will not go on cooldown when cast."):format(eff.max_cd) end, type = "magical", subtype = { temporal=true }, status = "beneficial", - parameters = { power=1}, - activate = function(self, eff) - end, - deactivate = function(self, eff) - end, + parameters = { max_cd=1}, } newEffect{ @@ -1533,18 +1529,18 @@ newEffect{ newEffect{ name = "HASTE", image = "talents/haste.png", desc = "Haste", - long_desc = function(self, eff) return ("Increases global action speed by %d%%."):format(eff.power * 100) end, + long_desc = function(self, eff) return ("Increases movement speed by %d%% and attack, spell, and mind speed by %d%%."):format(eff.move * 100, eff.speed * 100) end, type = "magical", subtype = { temporal=true }, status = "beneficial", - parameters = { power=0.1 }, + parameters = { move=0.1, speed=0.1 }, on_gain = function(self, err) return "#Target# speeds up.", "+Haste" end, on_lose = function(self, err) return "#Target# slows down.", "-Haste" end, - damageOnAct = function(self, eff) - DamageType:get(DamageType.MATTER).projector(eff.src or self, self.x, self.y, DamageType.MATTER, eff.src:spellCrit(eff.dam)) - end, activate = function(self, eff) - eff.glbid = self:addTemporaryValue("global_speed_add", eff.power) + self:effectTemporaryValue(eff, "movement_speed", eff.move) + self:effectTemporaryValue(eff, "combat_physspeed", eff.speed) + self:effectTemporaryValue(eff, "combat_spellspeed", eff.speed) + self:effectTemporaryValue(eff, "combat_mindspeed", eff.speed) end, deactivate = function(self, eff) self:removeTemporaryValue("global_speed_add", eff.glbid) @@ -1554,11 +1550,11 @@ newEffect{ newEffect{ name = "CEASE_TO_EXIST", image = "talents/cease_to_exist.png", desc = "Cease to Exist", - long_desc = function(self, eff) return ("The target is being removed from the timeline, reducing all resistances by %d%%."):format(eff.power) end, + long_desc = function(self, eff) return ("The target is being removed from the timeline, all its resistances have been lowered by %d%%."):format(eff.power) end, type = "magical", subtype = { temporal=true }, status = "detrimental", - parameters = { power = 1 }, + parameters = { power = 1, damage=1 }, on_gain = function(self, err) return "#Target# is being removed from the timeline.", "+Cease to Exist" end, activate = function(self, eff) eff.resists = self:addTemporaryValue("resists", { all = -eff.power}) @@ -1634,13 +1630,13 @@ newEffect{ newEffect{ name = "SPIN_FATE", image = "talents/spin_fate.png", desc = "Spin Fate", - long_desc = function(self, eff) return ("The target's defense and saves have been increased by %d and it's resist all by %d%%."):format(eff.save_bonus * eff.spin, eff.resists * eff.spin) end, + long_desc = function(self, eff) return ("The target's defense and saves have been increased by %d."):format(eff.save_bonus * eff.spin) end, display_desc = function(self, eff) return eff.spin.." Spin" end, charges = function(self, eff) return eff.spin end, type = "magical", subtype = { temporal=true }, status = "beneficial", - parameters = { save_bonus=0, spin=0, resists=0, max_spin=3}, + parameters = { save_bonus=0, spin=0, max_spin=3}, on_gain = function(self, err) return "#Target# spins fate.", "+Spin Fate" end, on_lose = function(self, err) return "#Target#'s fate is no longer being spun.", "-Spin Fate" end, on_merge = function(self, old_eff, new_eff) @@ -1649,7 +1645,6 @@ newEffect{ self:removeTemporaryValue("combat_physresist", old_eff.physid) self:removeTemporaryValue("combat_spellresist", old_eff.spellid) self:removeTemporaryValue("combat_mentalresist", old_eff.mentalid) - self:removeTemporaryValue("resists", old_eff.resid) -- add some spin old_eff.spin = math.min(old_eff.spin + 1, new_eff.max_spin) @@ -1659,7 +1654,6 @@ newEffect{ old_eff.physid = self:addTemporaryValue("combat_physresist", old_eff.save_bonus * old_eff.spin) old_eff.spellid = self:addTemporaryValue("combat_spellresist", old_eff.save_bonus * old_eff.spin) old_eff.mentalid = self:addTemporaryValue("combat_mentalresist", old_eff.save_bonus * old_eff.spin) - old_eff.resid = self:addTemporaryValue("resists", {all = old_eff.resists * old_eff.spin}) old_eff.dur = new_eff.dur @@ -1671,7 +1665,6 @@ newEffect{ eff.physid = self:addTemporaryValue("combat_physresist", eff.save_bonus * eff.spin) eff.spellid = self:addTemporaryValue("combat_spellresist", eff.save_bonus * eff.spin) eff.mentalid = self:addTemporaryValue("combat_mentalresist", eff.save_bonus * eff.spin) - eff.resid = self:addTemporaryValue("resists", {all = eff.resists *eff.spin}) eff.particle = self:addParticles(Particles.new("arcane_power", 1)) end, deactivate = function(self, eff) @@ -1679,7 +1672,6 @@ newEffect{ self:removeTemporaryValue("combat_physresist", eff.physid) self:removeTemporaryValue("combat_spellresist", eff.spellid) self:removeTemporaryValue("combat_mentalresist", eff.mentalid) - self:removeTemporaryValue("resists", eff.resid) self:removeParticles(eff.particle) end, } @@ -2311,10 +2303,8 @@ newEffect{ self:effectTemporaryValue(eff, "resists", {[DamageType.TEMPORAL] = 30}) self:effectTemporaryValue(eff, "resists_pen", {[DamageType.TEMPORAL] = 20}) self:effectTemporaryValue(eff, "talent_cd_reduction", {[self.T_ANOMALY_REARRANGE] = -4, [self.T_ANOMALY_TEMPORAL_STORM] = -4}) - self:effectTemporaryValue(eff, "paradox_reduce_anomalies", 200) self:learnTalent(self.T_ANOMALY_REARRANGE, true) self:learnTalent(self.T_ANOMALY_TEMPORAL_STORM, true) - self:incParadox(400) self.replace_display = mod.class.Actor.new{ image = "npc/elemental_temporal_telugoroth.png", @@ -2325,7 +2315,6 @@ newEffect{ game.level.map:updateMap(self.x, self.y) end, deactivate = function(self, eff) - self:incParadox(-400) self:unlearnTalent(self.T_ANOMALY_REARRANGE) self:unlearnTalent(self.T_ANOMALY_TEMPORAL_STORM) self.replace_display = nil @@ -2870,28 +2859,10 @@ newEffect{ end, } -newEffect{ - name = "TIME_DILATION", image = "talents/time_dilation.png", - desc = "Time Dilation", - long_desc = function(self, eff) return ("Reduces global action speed by %d%%."):format(eff.slow * 100) end, - type = "magical", - subtype = { temporal=true, slow=true }, - status = "detrimental", - parameters = { slow=0.1}, - on_gain = function(self, err) return "#Target# slows down.", "+Time Dilation" end, - on_lose = function(self, err) return "#Target# speeds up.", "-Time Dilation" end, - activate = function(self, eff) - eff.tmpid = self:addTemporaryValue("global_speed_add", -eff.slow) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("global_speed_add", eff.tmpid) - end, -} - newEffect{ name = "DIMENSIONAL_ANCHOR", image = "talents/dimensional_anchor.png", desc = "Dimensional Anchor", - long_desc = function(self, eff) return ("The target is unable to teleport and takes %0.2f temporal and %0.2f physical damage if they try."):format(eff.slow * 100) end, + long_desc = function(self, eff) return ("The target is unable to teleport and takes %0.2f temporal and %0.2f physical damage if they try."):format(eff.damage, eff.damage) end, type = "magical", subtype = { temporal=true, slow=true }, status = "detrimental", @@ -2941,15 +2912,27 @@ newEffect{ parameters = { power=0 }, on_gain = function(self, err) return "#Target#'s lifeline has been braided.", "+Braided" end, on_lose = function(self, err) return "#Target#'s lifeline is no longer braided.", "-Braided" end, - on_timeout = function(self, eff) - local braids = 0 - if eff.braid_one and eff.braid_one:hasEffect(eff.braid_one.EFF_BRAIDED) and not eff.braid_one.dead then - braids = braids + 1 + doBraid = function(self, eff, dam) + local braid_damage = dam * eff.power/ 100 + for i = 1, #eff.targets do + local target = eff.targets[i] + if target ~= self and not target.dead then + game:delayedLogMessage(eff.src, target, "braided", "#CRIMSON##Source# damages #Target# through the Braid!") + game:delayedLogDamage(eff.src, target, braid_damage, ("#PINK#%d braided #LAST#"):format(braid_damage), false) + target:takeHit(braid_damage, eff.src) + end end - if eff.braid_two and eff.braid_two:hasEffect(eff.braid_two.EFF_BRAIDED) and not eff.braid_two.dead then - braids = braids + 1 + end, + on_timeout = function(self, eff) + local alive = false + for i = 1, #eff.targets do + local target = eff.targets[i] + if target ~=self and not target.dead then + alive = true + break + end end - if braids == 0 then + if not alive then self:removeEffect(self.EFF_BRAIDED) end end, @@ -2980,16 +2963,16 @@ newEffect{ newEffect{ name = "WEBS_OF_FATE", image = "talents/webs_of_fate.png", desc = "Webs of Fate", - long_desc = function(self, eff) return ("Moving along the webs of fate, increasing move speed by %d%% and pin immunity by %d%%."):format(eff.move*100, eff.pin*100) end, + long_desc = function(self, eff) return ("Moving along the webs of fate, increasing stun and pin immunity by %d%%."):format(eff.imm*100) end, type = "magical", subtype = { temporal=true, speed=true }, status = "beneficial", on_gain = function(self, err) return "#Target# moves along the webs of fate.", "+Fate Webs" end, on_lose = function(self, err) return "#Target# is no longer moving along the webs of fate.", "-Fate Webs" end, - parameters = { move=0.1, pin=0.1 }, + parameters = { imm=0.1 }, activate = function(self, eff) - self:effectTemporaryValue(eff, "pin_immune", eff.pin) - self:effectTemporaryValue(eff, "movement_speed", eff.move) + self:effectTemporaryValue(eff, "pin_immune", eff.imm) + self:effectTemporaryValue(eff, "stun_immune", eff.imm) end, deactivate = function(self, eff) end, @@ -2998,18 +2981,45 @@ newEffect{ newEffect{ name = "SEAL_FATE", image = "talents/seal_fate.png", desc = "Seal Fate", - long_desc = function(self, eff) return ("The target is sealing fate, increasing critical chance and critical power by %d%%."):format(eff.crit) end, - type = "mental", + long_desc = function(self, eff) return ("The target is sealing fate, increasing the duration of detrimental status effects on targets it damages by one."):format() end, + type = "magical", subtype = { focus=true }, status = "beneficial", - parameters = { crit=10 }, + parameters = { procs=1 }, on_gain = function(self, err) return "#Target# seals fate.", "+Seal Fate" end, on_lose = function(self, err) return "#Target# is no longer sealing fate.", "-Seal Fate" end, + doDamage = function(self, eff, target) + if self.turn_procs and target.tmp then + if self.turn_procs.seal_fate and self.turn_procs.seal_fate >= eff.procs then return end + local chance = 50 + local spin = self:hasEffect(self.EFF_SPIN_FATE) + if spin then + chance = chance * (1 + spin.spin/3) + end + + if rng.percent(chance) then + local effs = {} + -- Go through all spell effects + for eff_id, p in pairs(target.tmp) do + local e = target.tempeffect_def[eff_id] + if e.status == "detrimental" and e.type ~= "other" then + effs[#effs+1] = p + end + end + + if #effs > 0 then + local p = rng.table(effs) + game.logPlayer(self, "%s", p.name) + game.logPlayer(self, "%s", p.dur) + p.dur = p.dur + 1 + end + + self.turn_procs.seal_fate = (self.turn_procs.seal_fate or 0) + 1 + end + + end + end, activate = function(self, eff) - self:effectTemporaryValue(eff, "combat_physcrit", eff.crit) - self:effectTemporaryValue(eff, "combat_spellcrit", eff.crit) - self:effectTemporaryValue(eff, "combat_mindcrit", eff.crit) - self:effectTemporaryValue(eff, "combat_critical_power", eff.crit) end, } @@ -3045,6 +3055,80 @@ newEffect{ end, } +newEffect{ + name = "ENTROPY", image = "talents/entropy.png", + desc = "Entropy", + long_desc = function(self, eff) return ("The target's timed effects are ticking twice as fast and it's taking %d temporal damage per turn, per timed effect."):format(eff.power) end, + on_gain = function(self, err) return "#Target# is caught in an entropic field!", "+Entropy" end, + on_lose = function(self, err) return "#Target# is free from the entropy.", "-Entropy" end, + type = "magical", + subtype = { temporal=true }, + status = "detrimental", + parameters = {power=10}, + on_timeout = function(self, eff) + local count = 0 + local todel = {} + + -- Go through all spell effects + for eff_id, p in pairs(self.tmp) do + local e = self.tempeffect_def[eff_id] + if e.type ~= "other" and e.status == "beneficial" then + if p.dur <= 0 then + todel[#todel+1] = eff + else + if e.on_timeout then + if p.src then p.src.__project_source = p end -- intermediate projector source + if e.on_timeout(self, p) then + todel[#todel+1] = eff + end + if p.src then p.src.__project_source = nil end + end + end + count = count + 1 + p.dur = p.dur - e.decrease + end + end + + DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power*count) + + while #todel > 0 do + self:removeEffect(table.remove(todel)) + end + end, +} + +newEffect{ + name = "PHASE_SHIFT", image = "talents/phase_shift.png", + desc = "Phase Shift", + long_desc = function(self, eff) return ("When hit for more than 10%% of your maximum life you teleport and reappear near where you were, reducuing the damage by 50%%.") end, + type = "magical", + subtype = { arcane=true }, + status = "beneficial", + parameters = { }, + activate = function(self, eff) + self:effectTemporaryValue(eff, "phase_shift_chrono", 1) + end, +} + +newEffect{ + name = "REGRESSION", image = "talents/temporal_bolt.png", + desc = "Regression", + long_desc = function(self, eff) return ("Reduces your three highest stats by %d."):format(eff.power) end, + on_gain = function(self, err) return "#Target# has regressed.", "+Regression" end, + on_lose = function(self, err) return "#Target# has returned to its natural state.", "-Regression" end, + type = "physical", + subtype = { temporal=true }, + status = "detrimental", + parameters = { power=1}, + activate = function(self, eff) + local l = { {Stats.STAT_STR, self:getStat("str")}, {Stats.STAT_DEX, self:getStat("dex")}, {Stats.STAT_CON, self:getStat("con")}, {Stats.STAT_MAG, self:getStat("mag")}, {Stats.STAT_WIL, self:getStat("wil")}, {Stats.STAT_CUN, self:getStat("cun")}, } + table.sort(l, function(a,b) return a[2] > b[2] end) + local inc = {} + for i = 1, 3 do inc[l[i][1]] = -eff.power end + self:effectTemporaryValue(eff, "inc_stats", inc) + end, +} + newEffect{ name = "TRIM_THREADS", image = "talents/trim_threads.png", desc = "Trim Threads", @@ -3067,4 +3151,4 @@ newEffect{ on_timeout = function(self, eff) DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power) end, -} +} \ No newline at end of file diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua index ed2708d9d8..68aa850bba 100644 --- a/game/modules/tome/data/timed_effects/other.lua +++ b/game/modules/tome/data/timed_effects/other.lua @@ -396,48 +396,24 @@ newEffect{ newEffect{ name = "DAMAGE_SMEARING", image = "talents/damage_smearing.png", desc = "Damage Smearing", - long_desc = function(self, eff) return ("Passes damage received in the present onto the future self."):format(eff.power) end, - type = "other", - subtype = { time=true }, - status = "beneficial", - parameters = { power=10 }, - on_gain = function(self, err) return "The fabric of time alters around #target#.", "+Damage Smearing" end, - on_lose = function(self, err) return "The fabric of time around #target# stabilizes.", "-Damage Smearing" end, - activate = function(self, eff) - eff.particle = self:addParticles(Particles.new("time_shield", 1)) - end, - deactivate = function(self, eff) - self:removeParticles(eff.particle) - end, -} - -newEffect{ - name = "SMEARED", - desc = "Smeared", - long_desc = function(self, eff) return ("Damage received in the past is returned as %0.2f temporal damage per turn."):format(eff.power) end, + long_desc = function(self, eff) return ("Damage received in the past is returned as %0.2f temporal damage per turn."):format(eff.dam) end, type = "other", subtype = { time=true }, status = "detrimental", - parameters = { power=10 }, + parameters = { dam=10 }, on_gain = function(self, err) return "#Target# is taking damage received in the past!", "+Smeared" end, on_lose = function(self, err) return "#Target# stops taking damage received in the past.", "-Smeared" end, on_merge = function(self, old_eff, new_eff) -- Merge the flames! - local olddam = old_eff.power * old_eff.dur - local newdam = new_eff.power * new_eff.dur - local dur = math.ceil((old_eff.dur + new_eff.dur) / 2) - old_eff.dur = dur - old_eff.power = (olddam + newdam) / dur - return old_eff + local olddam = old_eff.dam * old_eff.dur + local newdam = new_eff.dam * new_eff.dur + new_eff.dam = (olddam + newdam) / new_eff.dur + return new_eff end, on_timeout = function(self, eff) - DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power) - end, - activate = function(self, eff) - eff.particle = self:addParticles(Particles.new("time_shield", 1)) - end, - deactivate = function(self, eff) - self:removeParticles(eff.particle) + local dead, val = self:takeHit(eff.dam, self, {special_death_msg="was smeared across all space and time"}) + + game:delayedLogDamage(eff, self, val, ("%s%d %s#LAST#"):format(DamageType:get(DamageType.TEMPORAL).text_color or "#aaaaaa#", math.ceil(val), DamageType:get(DamageType.TEMPORAL).name), false) end, } @@ -2469,13 +2445,9 @@ newEffect{ subtype = { time=true }, status = "beneficial", parameters = { power=10}, - on_gain = function(self, err) return "#Target# retunes the fabric of spaceime.", "+Spacetime Tuning" end, + on_gain = function(self, err) return "#Target# retunes the fabric of spacetime.", "+Spacetime Tuning" end, on_timeout = function(self, eff) - if not self.resting then - self:removeEffect(self.EFF_SPACETIME_TUNING) - else - self:incParadox(eff.power) - end + self:incParadox(eff.power) end, } @@ -2486,17 +2458,17 @@ newEffect{ return ("The target has stopped time and is dealing %d%% less damage."):format(eff.power) end, charges = function(self, eff) - local energy = self.energy.value - if energy < 2000 then + local charges = math.floor(self.energy.value/1000) - 1 + if charges <= 0 then self:removeEffect(self.EFF_TIME_STOP) end - return math.floor(energy/1000) + return charges end, type = "other", subtype = {time=true}, status = "detrimental", - decrease = 0, - no_stop_enter_worlmap = true, no_stop_resting = true, + --decrease = 0, + --no_stop_enter_worlmap = true, no_stop_resting = true, parameters = {power=50}, activate = function(self, eff) self:effectTemporaryValue(eff, "generic_damage_penalty", eff.power) @@ -2516,18 +2488,8 @@ newEffect{ on_timeout = function(self, eff) -- Clone protection if not self.on_die then return end - -- Certain talents don't cooldown in the reprieve - if not self:attr("no_talents_cooldown") then - for tid, _ in pairs(self.talents_cd) do - local t = self:getTalentFromId(tid) - if t and t.fixed_cooldown then - self.talents_cd[tid] = self.talents_cd[tid] + 1 - end - end - end end, activate = function(self, eff) - end, deactivate = function(self, eff) -- Clone protection @@ -2590,6 +2552,71 @@ newEffect{ end, } +newEffect{ + name = "TEMPORAL_FUGUE", image = "talents/temporal_fugue.png", + desc = "Temporal Fugue", + long_desc = function(self, eff) return "This target is splitting all damage with its fugue clones." end, + type = "other", + subtype = { time=true }, + status = "beneficial", + parameters = { power=10 }, + decrease = 0, + callbackOnHit = function(self, eff, cb, src) + local clones = {} + -- Find our clones + for i = 1, #eff.targets do + local target = eff.targets[i] + if target ~= self and not target.dead and game.level:hasEntity(target) then + clones[#clones+1] = target + end + end + + -- Split the damage + if #clones > 0 and not src.turn_procs.temporal_fugue_damage then + self.turn_procs.temporal_fugue_damage = true + cb.value = cb.value/#clones + game:delayedLogMessage(self, nil, "fugue_damage", "#STEEL_BLUE##Source# shares damage with %s fugue clones!", string.his_her(self)) + for i = 1, #clones do + local target = clones[i] + if target ~= self then + target:takeHit(cb.value, self) + game:delayedLogDamage(src or self, self, 0, ("#STEEL_BLUE#(%d shared)#LAST#"):format(cb.value), nil) + end + end + + self.turn_procs.temporal_fugue_damage = nil + end + + -- If we're the last clone remove the effect + if #clones <= 0 then + self:removeEffect(self.EFF_TEMPORAL_FUGUE) + end + + return cb.value + end, + on_timeout = function(self, eff) + -- Temporal Fugue does not cooldown while active + if self.talents_cd[self.T_TEMPORAL_FUGUE] then + self.talents_cd[self.T_TEMPORAL_FUGUE] = self.talents_cd[self.T_TEMPORAL_FUGUE] + 1 + end + + local alive = false + for i = 1, #eff.targets do + local target = eff.targets[i] + if target ~=self and not target.dead then + alive = true + break + end + end + if not alive then + self:removeEffect(self.EFF_TEMPORAL_FUGUE) + end + end, + activate = function(self, eff) + self:effectTemporaryValue(eff, "generic_damage_penalty", 66) + end, +} + newEffect{ name = "DRACONIC_WILL", image = "talents/draconic_will.png", desc = "Draconic Will", @@ -2604,3 +2631,25 @@ newEffect{ self:effectTemporaryValue(eff, "negative_status_effect_immune", 1) end, } + +newEffect{ + name = "PRESERVE_PATTERN", image = "talents/preserve_pattern.png", + desc = "Preserve Pattern", + long_desc = function(self, eff) return ("Damage received in the past is returned as %0.2f paradox damage per turn."):format(eff.paradox) end, + type = "other", + subtype = { time=true }, + status = "detrimental", + parameters = { paradox=10 }, + on_gain = function(self, err) return "#Target# converts damage into paradox.", "+Preserve" end, + on_lose = function(self, err) return "#Target# stops converting damage to paradox..", "-Preserve" end, + on_merge = function(self, old_eff, new_eff) + -- Merge the flames! + local oldparadox = old_eff.paradox * old_eff.dur + local newparadox = new_eff.paradox * new_eff.dur + new_eff.paradox = (oldparadox + newparadox) / new_eff.dur + return new_eff + end, + on_timeout = function(self, eff) + self:incParadox(eff.paradox) + end, +} \ No newline at end of file diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua index 62518ff327..ea966eb9b2 100644 --- a/game/modules/tome/data/timed_effects/physical.lua +++ b/game/modules/tome/data/timed_effects/physical.lua @@ -2825,30 +2825,68 @@ newEffect { newEffect{ name = "CELERITY", image = "talents/celerity.png", desc = "Celerity", - long_desc = function(self, eff) return ("The target is moving is %d%% faster."):format(eff.speed * 100 * eff.stack) end, + long_desc = function(self, eff) return ("The target is moving is %d%% faster."):format(eff.speed * 100 * eff.charges) end, type = "physical", - display_desc = function(self, eff) return eff.stack.." Celerity" end, - charges = function(self, eff) return eff.stack end, + display_desc = function(self, eff) return eff.charges.." Celerity" end, + charges = function(self, eff) return eff.charges end, subtype = { speed=true, temporal=true }, status = "beneficial", - parameters = {speed=0.1, stack=1, max_stack=3}, + parameters = {speed=0.1, charges=1, max_charges=3}, on_merge = function(self, old_eff, new_eff) -- remove the old value self:removeTemporaryValue("movement_speed", old_eff.tmpid) -- add a charge - old_eff.stack = math.min(old_eff.stack + 1, new_eff.max_stack) + old_eff.charges = math.min(old_eff.charges + 1, new_eff.max_charges) -- and apply the current values - old_eff.tmpid = self:addTemporaryValue("movement_speed", old_eff.speed * old_eff.stack) + old_eff.tmpid = self:addTemporaryValue("movement_speed", old_eff.speed * old_eff.charges) old_eff.dur = new_eff.dur return old_eff end, activate = function(self, eff) - eff.tmpid = self:addTemporaryValue("movement_speed", eff.speed * eff.stack) + eff.tmpid = self:addTemporaryValue("movement_speed", eff.speed * eff.charges) end, deactivate = function(self, eff) self:removeTemporaryValue("movement_speed", eff.tmpid) end, } + +newEffect{ + name = "GRAVITY_SLOW", image = "talents/gravity_well.png", + desc = "Gravity Slow", + long_desc = function(self, eff) return ("The target is caught in a gravity well, reducing movement speed by %d%%."):format(eff.slow* 100) end, + type = "physical", + subtype = { speed=true }, + status = "detrimental", + parameters = { slow=0.15 }, + on_gain = function(self, err) return "#Target# is slowed by gravity.", "+Gravity Slow" end, + on_lose = function(self, err) return "#Target# is free from the gravity well.", "-Gravity Slow" end, + activate = function(self, eff) + eff.slowid = self:addTemporaryValue("movement_speed", -eff.slow) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("movement_speed", eff.slowid) + end, +} + +newEffect{ + name = "ANTI_GRAVITY", image = "talents/gravity_locus.png", + desc = "Anti-Gravity", + long_desc = function(self, eff) return ("Target is caught in an anti-gravity field, halving its knockback resistance."):format() end, + type = "physical", + subtype = { spacetime=true }, + status = "detrimental", + on_gain = function(self, err) return nil, "+Anti-Gravity" end, + on_lose = function(self, err) return nil, "-Anti-Gravity" end, + on_merge = function(self, old_eff, new_eff) + old_eff.dur = new_eff.dur + return old_eff + end, + activate = function(self, eff) + if self:attr("knockback_immune") then + self:effectTemporaryValue(eff, "knockback_immune", -self:attr("knockback_immune") / 2) + end + end, +} \ No newline at end of file diff --git a/game/modules/tome/data/zones/town-point-zero/npcs.lua b/game/modules/tome/data/zones/town-point-zero/npcs.lua index 733eac9649..2884c41c47 100644 --- a/game/modules/tome/data/zones/town-point-zero/npcs.lua +++ b/game/modules/tome/data/zones/town-point-zero/npcs.lua @@ -188,7 +188,7 @@ newEntity{ base = "BASE_NPC_POINT_ZERO_TOWN", define_as = "ZEMEKKYS", [Talents.T_GRAVITY_SPIKE]=5, [Talents.T_REPULSION_FIELD]=5, [Talents.T_GRAVITY_WELL]=5, - [Talents.T_ENERGY_DECOMPOSITION]=5, + [Talents.T_ENTROPY]=5, [Talents.T_ENERGY_ABSORPTION]=5, [Talents.T_REDUX]=5, [Talents.T_TEMPORAL_FUGUE]=5, diff --git a/game/modules/tome/data/zones/unhallowed-morass/npcs.lua b/game/modules/tome/data/zones/unhallowed-morass/npcs.lua index 341a568b64..822c713a85 100644 --- a/game/modules/tome/data/zones/unhallowed-morass/npcs.lua +++ b/game/modules/tome/data/zones/unhallowed-morass/npcs.lua @@ -33,7 +33,6 @@ newEntity{ autolevel = "spider", ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=2, }, - global_speed_base = 1.2, stats = { str=10, dex=17, mag=3, con=7 }, combat = { dammod={dex=0.8} }, combat_armor = 1, combat_def = 1, diff --git a/game/modules/tome/dialogs/DeathDialog.lua b/game/modules/tome/dialogs/DeathDialog.lua index 6ee772a12d..d6b1c6caba 100644 --- a/game/modules/tome/dialogs/DeathDialog.lua +++ b/game/modules/tome/dialogs/DeathDialog.lua @@ -263,6 +263,10 @@ function _M:use(item) self.actor:updateModdableTile() self.actor:check("on_resurrect", "lichform") game:saveGame() + elseif act == "threads" then + game:chronoRestore("see_threads_base", true) + game:onTickEnd(function()game.player:removeEffect(game.player.EFF_SEE_THREADS)end) + game:saveGame() elseif act == "easy_mode" then self:eidolonPlane() elseif act == "skeleton" then @@ -308,6 +312,11 @@ function _M:generateList() if config.settings.cheat then list[#list+1] = {name="Resurrect by cheating", action="cheat"} end if not self.actor.no_resurrect and allow_res then + if self.actor:hasEffect(self.actor.EFF_SEE_THREADS) and game._chronoworlds then + self:use{action="threads"} + self.dont_show =true + return + end if self.actor:isTalentActive(self.actor.T_LICHFORM) then self:use{action="lichform"} self.dont_show = true diff --git a/game/modules/tome/dialogs/talents/ChronomancyContingency.lua b/game/modules/tome/dialogs/talents/ChronomancyContingency.lua index ebb807e82f..cbe55e7965 100644 --- a/game/modules/tome/dialogs/talents/ChronomancyContingency.lua +++ b/game/modules/tome/dialogs/talents/ChronomancyContingency.lua @@ -43,7 +43,7 @@ function _M:init(actor) Dialog.init(self, "Contingency", game.w * 0.6, game.h * 0.8) self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[ -You may select a spell for Contingency to automatically use when your life falls below 25%. Only active spells that do not require a target may be chosen. +You may select a spell for Contingency to automatically use when your life falls below a percentage. Only active spells that do not require a target may be chosen. ]]} self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true} @@ -104,7 +104,7 @@ function _M:generateList() -- Generate lists of all talents by category for j, t in pairs(self.actor.talents_def) do - if self.actor:knowTalent(t.id) and t.mode == "activated" and t.is_spell and not t.requires_target and not t.hide then + if self.actor:knowTalent(t.id) and t.mode == "activated" and t.is_spell and not t.requires_target and not t.hide and not t.fixed_cooldown then local nodes = talents local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"} diff --git a/game/modules/tome/dialogs/talents/ChronomancyEmpower.lua b/game/modules/tome/dialogs/talents/ChronomancyEmpower.lua new file mode 100644 index 0000000000..6ce9532190 --- /dev/null +++ b/game/modules/tome/dialogs/talents/ChronomancyEmpower.lua @@ -0,0 +1,133 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Dialog = require "engine.ui.Dialog" +local TreeList = require "engine.ui.TreeList" +local ListColumns = require "engine.ui.ListColumns" +local Textzone = require "engine.ui.Textzone" +local TextzoneList = require "engine.ui.TextzoneList" +local Separator = require "engine.ui.Separator" + +module(..., package.seeall, class.inherit(Dialog)) +-- Could use better icons when available +--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"}) +--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"}) + +-- generate talent status separately to enable quicker refresh of Dialog +local function TalentStatus(who,t) + local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} + + return tostring(status) +end + +function _M:init(actor) + self.actor = actor + actor.hotkey = actor.hotkey or {} + Dialog.init(self, "Empower", game.w * 0.6, game.h * 0.8) + + self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[ +You may select a chronomancy spell to Empower, increasing your effective spellpower when casting that spell. +]]} + self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true} + + self:generateList() + + local cols = { + {name="", width={40,"fixed"}, display_prop="char"}, + {name="Talent", width=80, display_prop="name"}, + } + self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end} + self.c_list.cur_col = 2 + + self:loadUI{ + {left=0, top=0, ui=self.c_list}, + {right=0, top=self.c_tut.h + 20, ui=self.c_desc}, + {right=0, top=0, ui=self.c_tut}, + {hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}}, + } + self:setFocus(self.c_list) + self:setupUI() + + self.key:addBinds{ + EXIT = function() game:unregisterDialog(self) end, + } +end + +function _M:on_register() + game:onTickEnd(function() self.key:unicodeInput(true) end) +end + +function _M:select(item) + if item then + self.c_desc:switchItem(item, item.desc) + self.cur_item = item + end +end + +function _M:use(item) + if not item or not item.talent then return end + self.actor:talentDialogReturn(item.talent) + game:unregisterDialog(self) +end + +-- Display the player tile +function _M:innerDisplay(x, y, nb_keyframes) + if self.cur_item and self.cur_item.entity then + self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64) + end +end + +function _M:generateList() + -- Makes up the list + local list = {} + local letter = 1 + + local talents = {} + local chars = {} + + -- Generate lists of all talents by category + for j, t in pairs(self.actor.talents_def) do + if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and t.mode ~= "passive" then + local nodes = talents + local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"} + + -- Pregenerate icon with the Tiles instance that allows images + if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end + + nodes[#nodes+1] = { + name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(), + cname=t.name, + status=status, + entity=t.display_entity, + talent=t.id, + desc=self.actor:getTalentFullDescription(t), + color=function() return {0xFF, 0xFF, 0xFF} end + } + end + end + table.sort(talents, function(a,b) return a.cname < b.cname end) + for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end + + list = { + { char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Empower.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true }, + chars = chars, + } + self.list = list +end diff --git a/game/modules/tome/dialogs/talents/ChronomancyExtension.lua b/game/modules/tome/dialogs/talents/ChronomancyExtension.lua new file mode 100644 index 0000000000..aaed588ea8 --- /dev/null +++ b/game/modules/tome/dialogs/talents/ChronomancyExtension.lua @@ -0,0 +1,133 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Dialog = require "engine.ui.Dialog" +local TreeList = require "engine.ui.TreeList" +local ListColumns = require "engine.ui.ListColumns" +local Textzone = require "engine.ui.Textzone" +local TextzoneList = require "engine.ui.TextzoneList" +local Separator = require "engine.ui.Separator" + +module(..., package.seeall, class.inherit(Dialog)) +-- Could use better icons when available +--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"}) +--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"}) + +-- generate talent status separately to enable quicker refresh of Dialog +local function TalentStatus(who,t) + local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} + + return tostring(status) +end + +function _M:init(actor) + self.actor = actor + actor.hotkey = actor.hotkey or {} + Dialog.init(self, "Extension", game.w * 0.6, game.h * 0.8) + + self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[ +You may select a chronomancy spell to Extend, increasing the duration of that spell. +]]} + self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true} + + self:generateList() + + local cols = { + {name="", width={40,"fixed"}, display_prop="char"}, + {name="Talent", width=80, display_prop="name"}, + } + self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end} + self.c_list.cur_col = 2 + + self:loadUI{ + {left=0, top=0, ui=self.c_list}, + {right=0, top=self.c_tut.h + 20, ui=self.c_desc}, + {right=0, top=0, ui=self.c_tut}, + {hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}}, + } + self:setFocus(self.c_list) + self:setupUI() + + self.key:addBinds{ + EXIT = function() game:unregisterDialog(self) end, + } +end + +function _M:on_register() + game:onTickEnd(function() self.key:unicodeInput(true) end) +end + +function _M:select(item) + if item then + self.c_desc:switchItem(item, item.desc) + self.cur_item = item + end +end + +function _M:use(item) + if not item or not item.talent then return end + self.actor:talentDialogReturn(item.talent) + game:unregisterDialog(self) +end + +-- Display the player tile +function _M:innerDisplay(x, y, nb_keyframes) + if self.cur_item and self.cur_item.entity then + self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64) + end +end + +function _M:generateList() + -- Makes up the list + local list = {} + local letter = 1 + + local talents = {} + local chars = {} + + -- Generate lists of all talents by category + for j, t in pairs(self.actor.talents_def) do + if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and t.getDuration and t.mode ~= "passive" then + local nodes = talents + local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"} + + -- Pregenerate icon with the Tiles instance that allows images + if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end + + nodes[#nodes+1] = { + name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(), + cname=t.name, + status=status, + entity=t.display_entity, + talent=t.id, + desc=self.actor:getTalentFullDescription(t), + color=function() return {0xFF, 0xFF, 0xFF} end + } + end + end + table.sort(talents, function(a,b) return a.cname < b.cname end) + for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end + + list = { + { char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Extension.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true }, + chars = chars, + } + self.list = list +end diff --git a/game/modules/tome/dialogs/talents/ChronomancyMatrix.lua b/game/modules/tome/dialogs/talents/ChronomancyMatrix.lua new file mode 100644 index 0000000000..9a1d579cc5 --- /dev/null +++ b/game/modules/tome/dialogs/talents/ChronomancyMatrix.lua @@ -0,0 +1,133 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Dialog = require "engine.ui.Dialog" +local TreeList = require "engine.ui.TreeList" +local ListColumns = require "engine.ui.ListColumns" +local Textzone = require "engine.ui.Textzone" +local TextzoneList = require "engine.ui.TextzoneList" +local Separator = require "engine.ui.Separator" + +module(..., package.seeall, class.inherit(Dialog)) +-- Could use better icons when available +--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"}) +--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"}) + +-- generate talent status separately to enable quicker refresh of Dialog +local function TalentStatus(who,t) + local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} + + return tostring(status) +end + +function _M:init(actor) + self.actor = actor + actor.hotkey = actor.hotkey or {} + Dialog.init(self, "Matrix", game.w * 0.6, game.h * 0.8) + + self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[ +You may select a chronomancy spell to Matrix, reducing the cooldown of that spell. +]]} + self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true} + + self:generateList() + + local cols = { + {name="", width={40,"fixed"}, display_prop="char"}, + {name="Talent", width=80, display_prop="name"}, + } + self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end} + self.c_list.cur_col = 2 + + self:loadUI{ + {left=0, top=0, ui=self.c_list}, + {right=0, top=self.c_tut.h + 20, ui=self.c_desc}, + {right=0, top=0, ui=self.c_tut}, + {hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}}, + } + self:setFocus(self.c_list) + self:setupUI() + + self.key:addBinds{ + EXIT = function() game:unregisterDialog(self) end, + } +end + +function _M:on_register() + game:onTickEnd(function() self.key:unicodeInput(true) end) +end + +function _M:select(item) + if item then + self.c_desc:switchItem(item, item.desc) + self.cur_item = item + end +end + +function _M:use(item) + if not item or not item.talent then return end + self.actor:talentDialogReturn(item.talent) + game:unregisterDialog(self) +end + +-- Display the player tile +function _M:innerDisplay(x, y, nb_keyframes) + if self.cur_item and self.cur_item.entity then + self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64) + end +end + +function _M:generateList() + -- Makes up the list + local list = {} + local letter = 1 + + local talents = {} + local chars = {} + + -- Generate lists of all talents by category + for j, t in pairs(self.actor.talents_def) do + if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and t.cooldown and t.mode ~= "passive" and not t.fixed_cooldown then + local nodes = talents + local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"} + + -- Pregenerate icon with the Tiles instance that allows images + if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end + + nodes[#nodes+1] = { + name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(), + cname=t.name, + status=status, + entity=t.display_entity, + talent=t.id, + desc=self.actor:getTalentFullDescription(t), + color=function() return {0xFF, 0xFF, 0xFF} end + } + end + end + table.sort(talents, function(a,b) return a.cname < b.cname end) + for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end + + list = { + { char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Matrix.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true }, + chars = chars, + } + self.list = list +end diff --git a/game/modules/tome/dialogs/talents/ChronomancyQuicken.lua b/game/modules/tome/dialogs/talents/ChronomancyQuicken.lua new file mode 100644 index 0000000000..a0b19f6f78 --- /dev/null +++ b/game/modules/tome/dialogs/talents/ChronomancyQuicken.lua @@ -0,0 +1,133 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009 - 2014 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Dialog = require "engine.ui.Dialog" +local TreeList = require "engine.ui.TreeList" +local ListColumns = require "engine.ui.ListColumns" +local Textzone = require "engine.ui.Textzone" +local TextzoneList = require "engine.ui.TextzoneList" +local Separator = require "engine.ui.Separator" + +module(..., package.seeall, class.inherit(Dialog)) +-- Could use better icons when available +--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"}) +--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"}) + +-- generate talent status separately to enable quicker refresh of Dialog +local function TalentStatus(who,t) + local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} + + return tostring(status) +end + +function _M:init(actor) + self.actor = actor + actor.hotkey = actor.hotkey or {} + Dialog.init(self, "Quicken", game.w * 0.6, game.h * 0.8) + + self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[ +You may select a chronomancy spell to Quicken, reducing the time it takes you to cast that spell. +]]} + self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true} + + self:generateList() + + local cols = { + {name="", width={40,"fixed"}, display_prop="char"}, + {name="Talent", width=80, display_prop="name"}, + } + self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end} + self.c_list.cur_col = 2 + + self:loadUI{ + {left=0, top=0, ui=self.c_list}, + {right=0, top=self.c_tut.h + 20, ui=self.c_desc}, + {right=0, top=0, ui=self.c_tut}, + {hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}}, + } + self:setFocus(self.c_list) + self:setupUI() + + self.key:addBinds{ + EXIT = function() game:unregisterDialog(self) end, + } +end + +function _M:on_register() + game:onTickEnd(function() self.key:unicodeInput(true) end) +end + +function _M:select(item) + if item then + self.c_desc:switchItem(item, item.desc) + self.cur_item = item + end +end + +function _M:use(item) + if not item or not item.talent then return end + self.actor:talentDialogReturn(item.talent) + game:unregisterDialog(self) +end + +-- Display the player tile +function _M:innerDisplay(x, y, nb_keyframes) + if self.cur_item and self.cur_item.entity then + self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64) + end +end + +function _M:generateList() + -- Makes up the list + local list = {} + local letter = 1 + + local talents = {} + local chars = {} + + -- Generate lists of all talents by category + for j, t in pairs(self.actor.talents_def) do + if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and not t.no_energy and t.mode ~= "passive" then + local nodes = talents + local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"} + + -- Pregenerate icon with the Tiles instance that allows images + if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end + + nodes[#nodes+1] = { + name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(), + cname=t.name, + status=status, + entity=t.display_entity, + talent=t.id, + desc=self.actor:getTalentFullDescription(t), + color=function() return {0xFF, 0xFF, 0xFF} end + } + end + end + table.sort(talents, function(a,b) return a.cname < b.cname end) + for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end + + list = { + { char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Quicken.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true }, + chars = chars, + } + self.list = list +end -- GitLab