diff --git a/game/engines/default/engine/class.lua b/game/engines/default/engine/class.lua index 6d301b1dd1177e7fd83e7a7c75353410afc80258..1c0b318e2a7386e0ba6fb14824f08afbc8bd822d 100644 --- a/game/engines/default/engine/class.lua +++ b/game/engines/default/engine/class.lua @@ -244,3 +244,45 @@ function load(str, delayloading) end return obj end + +--- "Reloads" a cloneFull result object +-- This will make sure each object and subobject method :loaded() is called +function _M:cloneReloaded() + local delay_load = {} + local seen = {} + + local function reload(obj) +-- print("setting obj class", obj.__CLASSNAME) + setmetatable(obj, {__index=require(obj.__CLASSNAME)}) + if obj.loaded then +-- print("loader found for class", obj, obj.__CLASSNAME) + if not obj.loadNoDelay then + delay_load[#delay_load+1] = obj + else + obj:loaded() + end + end + end + + local function recurs(t) + if seen[t] then return end + seen[t] = true + for k, e in pairs(t) do + if type(k) == "table" then + recurs(k) + if k.__CLASSNAME then reload(k) end + end + if type(e) == "table" then + recurs(e) + if e.__CLASSNAME then reload(e) end + end + end + end + + -- Start reloading + recurs(self) + reload(self) + + -- Computed delayed loads + for i = 1, #delay_load do delay_load[i]:loaded() end +end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 22394d79898f30736d8e7144e916daf5c598f81c..c9428c3e991a4031ddefff459346e7b07734545b 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -541,6 +541,8 @@ function _M:changeLevel(lev, zone, keep_old_lev, force_down) -- Autosave if config.settings.tome.autosave and left_zone and left_zone.short_name ~= "wilderness" and left_zone.short_name ~= self.zone.short_name then self:saveGame() end + + self.player:onEnterLevelEnd(self.zone, self.level) end function _M:getPlayer() diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index dc11ce6221eb90925b5caa537cf9eb7790da08b7..29a40f0d163332c0d63cad502bbe13ca721423e6 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -122,6 +122,20 @@ function _M:onEnterLevel(zone, level) for i, eff_id in ipairs(effs) do self:removeEffect(eff_id) end end +function _M:onEnterLevelEnd(zone, level) + -- Clone level when they are made, for chronomancy + if self:attr("level_cloning") then + local d = Dialog:simplePopup("Chronomancy", "Folding the space time structure...") + d.__showup = nil + core.display.forceRedraw() + + local clone = level:cloneFull() + level.backup = clone + + game:unregisterDialog(d) + end +end + function _M:onLeaveLevel(zone, level) -- Fail past escort quests local eid = "escort-duty-"..zone.short_name.."-"..level.level diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua index f5de6dfc02b28c360f30743ab6e875f321853838..f5633bc5bb486fead5017c1d36a3cb9d4f7b4dc8 100644 --- a/game/modules/tome/data/birth/classes/mage.lua +++ b/game/modules/tome/data/birth/classes/mage.lua @@ -30,11 +30,11 @@ newBirthDescriptor{ __ALL__ = "disallow", Archmage = function() return profile.mod.allow_build.mage and "allow" or "disallow" end, Alchemist = "allow", - Pyromancer = function() return profile.mod.allow_build.mage_pyromancer and "allow" or "disallow" end, - Cryomancer = function() return profile.mod.allow_build.mage_cryomancer and "allow" or "disallow" end, - Tempest = function() return profile.mod.allow_build.mage_tempest and "allow" or "disallow" end, - Geomancer = function() return profile.mod.allow_build.mage_geomancer and "allow" or "disallow" end, - Maelstrom = function() return profile.mod.allow_build.mage_maelstrom and "allow" or "disallow" end, +-- Pyromancer = function() return profile.mod.allow_build.mage_pyromancer and "allow" or "disallow" end, +-- Cryomancer = function() return profile.mod.allow_build.mage_cryomancer and "allow" or "disallow" end, +-- Tempest = function() return profile.mod.allow_build.mage_tempest and "allow" or "disallow" end, +-- Geomancer = function() return profile.mod.allow_build.mage_geomancer and "allow" or "disallow" end, +-- Maelstrom = function() return profile.mod.allow_build.mage_maelstrom and "allow" or "disallow" end, }, }, copy = { @@ -87,6 +87,12 @@ newBirthDescriptor{ {type="weapon", subtype="staff", name="elm staff", autoreq=true}, {type="armor", subtype="cloth", name="linen robe", autoreq=true}, }, + resolvers.generic(function(self) + if profile.mod.allow_build.mage_pyromancer then self:learnTalentType("spell/wildfire", false, 1.3) end + if profile.mod.allow_build.mage_cryomancer then self:learnTalentType("spell/ice", false, 1.3) end + if profile.mod.allow_build.mage_geomancer then self:learnTalentType("spell/stone", false, 1.3) end + if profile.mod.allow_build.mage_tempest then self:learnTalentType("spell/storm", false, 1.3) end + end), }, copy_add = { life_rating = -4, diff --git a/game/modules/tome/data/talents/chronomancy/timetravel.lua b/game/modules/tome/data/talents/chronomancy/timetravel.lua index bf4650e4770c78c95b6d4cec0ae79c7009e94021..82900fd63b21d9bfc70e34875cad929249545683 100644 --- a/game/modules/tome/data/talents/chronomancy/timetravel.lua +++ b/game/modules/tome/data/talents/chronomancy/timetravel.lua @@ -17,7 +17,7 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org - + newTalent{ name = "Backtrack", type = {"chronomancy/timetravel", 1}, @@ -122,53 +122,39 @@ newTalent{ type = {"chronomancy/timetravel", 4}, require = chrono_req4, points = 5, - mode = "sustained", - sustain_mana = 170, - cooldown = 15, - tactical = { - ATTACKAREA = 10, - }, - range = 5, - do_storm = function(self, t) - if self:getMana() <= 0 then - local old = self.energy.value - self.energy.value = 100000 - self:useTalent(self.T_THUNDERSTORM) - self.energy.value = old - return + paradox = 100, + cooldown = 100, + no_npc_use = true, + on_learn = function(self, t) + self:attr("level_cloning", 1) + end, + on_unlearn = function(self, t) + self:attr("level_cloning", -1) + end, + action = function(self, t) + if not game.level.backup then + game.logSeen(self, "#LIGHT_RED#The spell fizzles.") end - local tgts = {} - local grids = core.fov.circle_grids(self.x, self.y, 5, 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 + game:onTickEnd(function() + local level = game.level.backup + level:cloneReloaded() + -- Look for the "old" player + for uid, e in pairs(level.entities) do + if e.game_ender then + game.level = level + game.player:replaceWith(e) + game.player:move(game.player.x, game.player.y, true) + game.logPlayer(game.player, "#LIGHT_BLUE#You unfold the space time continuum to a previous state!") - -- Randomly take targets - local tg = {type="hit", range=self:getTalentRange(t), talent=t} - for i = 1, math.floor(self:getTalentLevel(t)) do - if #tgts <= 0 then break end - local a, id = rng.table(tgts) - table.remove(tgts, id) + -- Manualy start the cooldown of the "old player" + game.player:startTalentCooldown(t) + return + end + end - self:project(tg, a.x, a.y, DamageType.LIGHTNING, rng.avg(1, self:spellCrit(self:combatTalentSpellDamage(t, 15, 80)), 3)) - game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(a.x-self.x), math.abs(a.y-self.y)), "lightning", {tx=a.x-self.x, ty=a.y-self.y}) - game:playSoundNear(self, "talents/lightning") - end - end, - activate = function(self, t) - game:playSoundNear(self, "talents/thunderstorm") - game.logSeen(self, "#0080FF#A furious lightning storm forms around %s!", self.name) - return { - drain = self:addTemporaryValue("mana_regen", -3 * self:getTalentLevelRaw(t)), - } - end, - deactivate = function(self, t, p) - game.logSeen(self, "#0080FF#The furious lightning storm around %s calms down and disappears.", self.name) - self:removeTemporaryValue("mana_regen", p.drain) + game.logPlayer(self, "#LIGHT_RED#The space time continuum seems to be too disturted to use.") + end) return true end, info = function(self, t) diff --git a/game/modules/tome/data/talents/spells/ice.lua b/game/modules/tome/data/talents/spells/ice.lua index c7ea1f911dfa3730205b6668f26da617c9bcfd73..6ac6a2116b4af073a0f27c2f7735b16d4a3ae546 100644 --- a/game/modules/tome/data/talents/spells/ice.lua +++ b/game/modules/tome/data/talents/spells/ice.lua @@ -20,7 +20,7 @@ newTalent{ name = "Ice Shards", type = {"spell/ice",1}, - require = spells_req1, + require = spells_req_high1, points = 5, mana = 12, cooldown = 3, @@ -58,7 +58,7 @@ newTalent{ newTalent{ name = "Frozen Ground", type = {"spell/ice",2}, - require = spells_req2, + require = spells_req_high2, points = 5, mana = 25, cooldown = 10, @@ -85,7 +85,7 @@ newTalent{ newTalent{ name = "Shatter", type = {"spell/ice",3}, - require = spells_req3, + require = spells_req_high3, points = 5, mana = 25, cooldown = 15, @@ -142,7 +142,7 @@ newTalent{ newTalent{ name = "Uttercold", type = {"spell/ice",4}, - require = spells_req4, + require = spells_req_high4, points = 5, mode = "sustained", sustain_mana = 50, diff --git a/game/modules/tome/data/talents/spells/stone.lua b/game/modules/tome/data/talents/spells/stone.lua index 395d30a604211af63fe9f3ae1f51adfee93fb71a..a260a19580133a9ada57b428dd74361d6377dddd 100644 --- a/game/modules/tome/data/talents/spells/stone.lua +++ b/game/modules/tome/data/talents/spells/stone.lua @@ -20,7 +20,7 @@ newTalent{ name = "Earthen Missiles", type = {"spell/stone",1}, - require = spells_req1, + require = spells_req_high1, points = 5, random_ego = "attack", mana = 10, @@ -63,7 +63,7 @@ newTalent{ local count = 2 if self:getTalentLevel(t) >= 5 then count = count + 1 - end + end local damage = t.getDamage(self, t) return ([[Conjures %d missile shaped rocks that you target individually at any target or targets in range. Each missile deals %0.2f physical damage and an additional %0.2f bleeding damage every turn for 5 turns. At talent level 5 you can conjure one additional missle. @@ -74,7 +74,7 @@ newTalent{ newTalent{ name = "Body of Stone", type = {"spell/stone",2}, - require = spells_req2, + require = spells_req_high2, points = 5, mode = "sustained", sustain_mana = 70, @@ -129,7 +129,7 @@ newTalent{ newTalent{ name = "Earthquake", type = {"spell/stone",3}, - require = spells_req3, + require = spells_req_high3, points = 5, random_ego = "attack", mana = 50, @@ -175,7 +175,7 @@ newTalent{ newTalent{ name = "Crystalline Focus", type = {"spell/stone",4}, - require = spells_req4, + require = spells_req_high4, points = 5, mode = "sustained", sustain_mana = 50, diff --git a/game/modules/tome/data/talents/spells/storm.lua b/game/modules/tome/data/talents/spells/storm.lua index ca8a704d756290b20d34822dd3eb70025e0bb2a0..9914df77fbb7ea1512f8f90ccb205b7ee87bd7c7 100644 --- a/game/modules/tome/data/talents/spells/storm.lua +++ b/game/modules/tome/data/talents/spells/storm.lua @@ -20,7 +20,7 @@ newTalent{ name = "Nova", type = {"spell/storm",1}, - require = spells_req1, + require = spells_req_high1, points = 5, mana = 12, cooldown = 8, @@ -34,7 +34,7 @@ newTalent{ action = function(self, t) local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t} local dam = self:spellCrit(t.getDamage(self, t)) - self:project(tg, self.x, self.y, DamageType.LIGHTNING_DAZE, rng.avg(dam / 3, dam, 3)) + self:project(tg, self.x, self.y, DamageType.LIGHTNING_DAZE, {daze=75, rng.avg(dam / 3, dam, 3)}) local x, y = self.x, self.y -- Lightning ball gets a special treatment to make it look neat local sradius = (tg.radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2 @@ -52,7 +52,7 @@ newTalent{ end, info = function(self, t) local dam = damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t)) - return ([[A lightning emanates from you in a circual wave, doing %0.2f to %0.2f lightning damage and possibly dazing them. + return ([[A lightning emanates from you in a circual wave, doing %0.2f to %0.2f lightning damage and possibly dazing them (75%% chance). The damage will increase with the Magic stat]]):format(dam / 3, dam) end, } @@ -60,7 +60,7 @@ newTalent{ newTalent{ name = "Shock", type = {"spell/storm",2}, - require = spells_req2, + require = spells_req_high2, points = 5, mana = 8, cooldown = 3, @@ -90,7 +90,7 @@ newTalent{ newTalent{ name = "Hurricane", type = {"spell/storm",3}, - require = spells_req3, + require = spells_req_high3, points = 5, mode = "sustained", sustain_mana = 100, @@ -102,7 +102,7 @@ newTalent{ direct_hit = true, getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 150) end, getChance = function(self, t) return 30 + self:getTalentLevel(t) * 5 end, - getRadius = function(self, t) + getRadius = function(self, t) local radius = 2 if self:getTalentLevel(t) >= 3 then radius = 3 end return radius @@ -122,7 +122,7 @@ newTalent{ info = function(self, t) local damage = t.getDamage(self, t) local chance = t.getChance(self, t) - local radius = t.getRadius(self, t) + local radius = t.getRadius(self, t) return ([[Each time one of your lightning spell dazes a target it has %d%% chances to creates a chain reaction that summons a mighty Hurricane that last for 10 turns around the target with radius of %d. Each turn all creatures around it will take %0.2f to %0.2f lightning damage. Only 2 hurricanes can exist at the same time. @@ -133,7 +133,7 @@ newTalent{ newTalent{ name = "Tempest", type = {"spell/storm",4}, - require = spells_req4, + require = spells_req_high4, points = 5, mode = "sustained", sustain_mana = 50, diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua index efc4e66ce50183f2c18235e5ffee36d154b788db..60db51c39db96557b5e033061ce41d8584c7be00 100644 --- a/game/modules/tome/data/talents/spells/wildfire.lua +++ b/game/modules/tome/data/talents/spells/wildfire.lua @@ -20,7 +20,7 @@ newTalent{ name = "Blastwave", type = {"spell/wildfire",1}, - require = spells_req1, + require = spells_req_high1, points = 5, mana = 12, cooldown = 5, @@ -48,7 +48,7 @@ newTalent{ newTalent{ name = "Dancing Fires", type = {"spell/wildfire",2}, - require = spells_req2, + require = spells_req_high2, points = 5, mana = 35, cooldown = 16, @@ -85,7 +85,7 @@ newTalent{ newTalent{ name = "Combust", type = {"spell/wildfire",3}, - require = spells_req3, + require = spells_req_high3, points = 5, mana = 40, cooldown = 14, @@ -131,7 +131,7 @@ newTalent{ newTalent{ name = "Wildfire", type = {"spell/wildfire",4}, - require = spells_req4, + require = spells_req_high4, points = 5, mode = "sustained", sustain_mana = 50, diff --git a/game/modules/tome/data/texts/unlock-mage_cryomancer.lua b/game/modules/tome/data/texts/unlock-mage_cryomancer.lua index 7e3558629f5c9296a8a6612c70386d0600455a60..9ac57aed0543b723babddf5d98a9791840880448 100644 --- a/game/modules/tome/data/texts/unlock-mage_cryomancer.lua +++ b/game/modules/tome/data/texts/unlock-mage_cryomancer.lua @@ -17,22 +17,16 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -return "New Class: #LIGHT_GREEN#Cryomancer", -[[ -Magic has not disappeared from Maj'Eyal with the end of the Spellhunt. +return "New Talent Category: #LIGHT_GREEN#Ice", +[[Since the dawn of time mages have experimented with the elements. +While most mages are content using the Water school, a few of them took their research deeper and created Ice magic. +At its core lies the Uttercold, a cold so cold it can even damage creatures normaly immune. -During the Age of Dusk, as the Spellhunt was nearing its end, a powerful mage of the Kar'Krul, Linaniil, created a safe haven for the few remaining mages of all races. -This place is Angolwen, the City of Magic, and for over two thousands years has taught magic to preserve and expand it. +You have mastered ice magic and can now create new Archmage characters that can learn the #LIGHT_GREEN#Ice talents#WHITE#. -You have uncovered the secrets of the ice magic and can now create new characters with the #LIGHT_GREEN#Cryomancer class#WHITE#. - -Cryomancers are specialized archmagi, attuned to the magical properties of ice. -Class features:#YELLOW# -- Cast potent ice spells to freeze your foes. -- Freeze your foes and make them shatter into pieces. -- Learn to master the Uttercold, a cold so deep it can pierce even those resistant to normal cold. -- Manipulate the forces of magic themselves#WHITE# - -All mages use mana to cast their spells. -It slowly replenishes over time. +Talents: +- #YELLOW#Ice Shards: #WHITE#Fires slow moving ice crystals at a target area, each hit has a chance to freeze +- #YELLOW#Frozen Ground: #WHITE#Unleash a nova of ice on the ground, stopping the movements of anything caught inside +- #YELLOW#Shatter: #WHITE#Shatters all frozen creatures in your sight, dealing increased damage or even killing them +- #YELLOW#Uttercold: #WHITE#Master the Uttercold and pierce even through cold immunities ]] diff --git a/game/modules/tome/data/texts/unlock-mage_geomancer.lua b/game/modules/tome/data/texts/unlock-mage_geomancer.lua index 8132b197163a5a888069d5dc8910e3e8298d293b..7891e8201717b941e26c420427cbf112b4e50c33 100644 --- a/game/modules/tome/data/texts/unlock-mage_geomancer.lua +++ b/game/modules/tome/data/texts/unlock-mage_geomancer.lua @@ -17,22 +17,16 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -return "New Class: #LIGHT_GREEN#Geomancer", -[[ -Magic has not disappeared from Maj'Eyal with the end of the Spellhunt. +return "New Talent Category: #LIGHT_GREEN#Stone", +[[Since the dawn of time mages have experimented with the elements. +While most mages are content using the Earth school, a few of them took their research deeper and created Stone magic. +At its core lies the Crystalline Focus, which can create attacks so sharp they can cut throught physical immunity. -During the Age of Dusk, as the Spellhunt was nearing its end, a powerful mage of the Kar'Krul, Linaniil, created a safe haven for the few remaining mages of all races. -This place is Angolwen, the City of Magic, and for over two thousands years has taught magic to preserve and expand it. +You have mastered stone magic and can now create new Archmage characters that can learn the #LIGHT_GREEN#Stone talents#WHITE#. -You have uncovered the secrets of the stone magic by killing the earth elemental Harkor'Zun and can now create new characters with the #LIGHT_GREEN#Geomancer class#WHITE#. - -Geomancers are specialized archmagi, attuned to the magical properties of stone. -Class features:#YELLOW# -- Turn your body into stone, making you immovable but providing many benefits. -- Unleash earthquakes on your foes. -- Learn to master the Crystalline Focus, making your physical attacks so powerful they can damage even those resistant to normal physical damage. -- Manipulate the forces of magic themselves#WHITE# - -All mages use mana to cast their spells. -It slowly replenishes over time. +Talents: +- #YELLOW#Earthen Missiles: #WHITE#Fires multiple missiles of stone indepentanly to targets +- #YELLOW#Body of Stone: #WHITE#Turn into stone, reducing the cooldown of many stone/earth talents +- #YELLOW#Earthquake: #WHITE#Create a localized earthquake, stunning all in the area +- #YELLOW#Crystalline Focus: #WHITE#Master the Stone and pierce even through physical immunities ]] diff --git a/game/modules/tome/data/texts/unlock-mage_pyromancer.lua b/game/modules/tome/data/texts/unlock-mage_pyromancer.lua index 0fde790bc2c517f1a31f6b0c4467fc93eecf6b00..e5a2cc90ecbdfe5fcd92291781399d16bb0967c4 100644 --- a/game/modules/tome/data/texts/unlock-mage_pyromancer.lua +++ b/game/modules/tome/data/texts/unlock-mage_pyromancer.lua @@ -17,22 +17,16 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -return "New Class: #LIGHT_GREEN#Pyromancer", -[[ -Magic has not disappeared from Maj'Eyal with the end of the Spellhunt. +return "New Talent Category: #LIGHT_GREEN#Wildfire", +[[Since the dawn of time mages have experimented with the elements. +While most mages are content using the Fire school, a few of them took their research deeper and created Wildfire magic. +At its core lies the Wildfire, a fire so hot it can even damage creatures normaly immune. -During the Age of Dusk, as the Spellhunt was nearing its end, a powerful mage of the Kar'Krul, Linaniil, created a safe haven for the few remaining mages of all races. -This place is Angolwen, the City of Magic, and for over two thousands years has taught magic to preserve and expand it. +You have mastered wildfire magic and can now create new Archmage characters that can learn the #LIGHT_GREEN#Wildfire talents#WHITE#. -You have uncovered the secrets of the fire magic and can now create new characters with the #LIGHT_GREEN#Pyromancer class#WHITE#. - -Pyromancers are specialized archmagi, attuned to the magical properties of fire. -Class features:#YELLOW# -- Cast potent fire spells to burn your foes to ashes. -- Set all your foes ablaze and make the fire consume them. -- Learn to master the Wildfire, a fire so hot it can burn even those resistant to normal fire. -- Manipulate the forces of magic themselves#WHITE# - -All mages use mana to cast their spells. -It slowly replenishes over time. +Talents: +- #YELLOW#Blastwave: #WHITE#Unleash a fire nova around you, damaging and knocking back anything caught inside +- #YELLOW#Dancing Fires: #WHITE#Project your inner fire to all creatures in your line of sight, setting them ablaze +- #YELLOW#Combust: #WHITE#Disrupt normal burning effects and make them combust at once +- #YELLOW#Wildfire: #WHITE#Master the Wildfire and pierce even through fire immunities ]] diff --git a/game/modules/tome/data/texts/unlock-mage_tempest.lua b/game/modules/tome/data/texts/unlock-mage_tempest.lua index 5f67b353738b41a1c613f46e095a086742c89c1f..a533a77571b445aa874be88da2041a7d18bff4b0 100644 --- a/game/modules/tome/data/texts/unlock-mage_tempest.lua +++ b/game/modules/tome/data/texts/unlock-mage_tempest.lua @@ -17,22 +17,16 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -return "New Class: #LIGHT_GREEN#Tempest", -[[ -Magic has not disappeared from Maj'Eyal with the end of the Spellhunt. +return "New Talent Category: #LIGHT_GREEN#Storm", +[[Since the dawn of time mages have experimented with the elements. +While most mages are content using the Air school, a few of them took their research deeper and created Storm magic. +At its core lies the Tempest, a storm so powerful it can even damage creatures normaly immune. -During the Age of Dusk, as the Spellhunt was nearing its end, a powerful mage of the Kar'Krul, Linaniil, created a safe haven for the few remaining mages of all races. -This place is Angolwen, the City of Magic, and for over two thousands years has taught magic to preserve and expand it. +You have mastered storm magic and can now create new Archmage characters that can learn the #LIGHT_GREEN#Storm talents#WHITE#. -You have uncovered the secrets of the storm magic and can now create new characters with the #LIGHT_GREEN#Tempest class#WHITE#. - -Tempests are specialized archmagi, attuned to the magical properties of lightning. -Class features:#YELLOW# -- Cast potent lightning spells to zap your foes to death. -- Unleash hurricanes and novas on your foes, making them all explode. -- Learn to master the Tempest, a lightning so powerful it can damage even those resistant to normal lightning. -- Manipulate the forces of magic themselves#WHITE# - -All mages use mana to cast their spells. -It slowly replenishes over time. +Talents: +- #YELLOW#Nova: #WHITE#Unleash of lightning nova around you, dazing and damaging creatures caught inside +- #YELLOW#Shock: #WHITE#Fire a fast bolt of lightning, dazing the target +- #YELLOW#Hurricane: #WHITE#Call down a Hurricane on any creature you daze, creating a lightning storm around each of them +- #YELLOW#Tempest: #WHITE#Master the Tempest and pierce even through lightning immunities ]]