Skip to content
Snippets Groups Projects
mag.lua 19.9 KiB
Newer Older
dg's avatar
dg committed
-- ToME - Tales of Maj'Eyal
DarkGod's avatar
DarkGod committed
-- Copyright (C) 2009 - 2019 Nicolas Casalini
dg's avatar
dg committed
--
-- 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
dg's avatar
dg committed

local Dialog = require "engine.ui.Dialog"

dg's avatar
dg committed
uberTalent{
	name = "Spectral Shield",
Chris Davidson's avatar
Chris Davidson committed
	not_listed = true,  -- Functionality was baselined on shields
dg's avatar
dg committed
	mode = "passive",
	require = { special={desc=_t"Know the Block talent, have cast 100 spells, and have a block value over 200", fct=function(self)
		return self:knowTalent(self.T_BLOCK) and self:getTalentFromId(self.T_BLOCK).getBlockValue(self) >= 200 and self.talent_kind_log and self.talent_kind_log.spell and self.talent_kind_log.spell >= 100
dg's avatar
dg committed
	end} },
	on_learn = function(self, t)
		self:attr("spectral_shield", 1)
	end,
	on_unlearn = function(self, t)
		self:attr("spectral_shield", -1)
	end,
	info = function(self, t)
DarkGod's avatar
DarkGod committed
		return ([[By infusing your shield with raw magic, your block can now block any damage type.]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat()
dg's avatar
dg committed
	end,
}
dg's avatar
dg committed

Chris Davidson's avatar
Chris Davidson committed
-- Re-used icon
uberTalent{
	name = "Ethereal Form", image = "talents/displace_damage.png",
	mode = "passive",
	require = { special={desc=_t"Have an effective defense of at least 40", fct=function(self)
Chris Davidson's avatar
Chris Davidson committed
		if self:combatDefense() >= 40 then return true end
	end} },
	passives = function(self, t, tmptable)
		self:talentTemporaryValue(tmptable, "resists_pen", {all = 25})
		self:talentTemporaryValue(tmptable, "resists", {absolute = 25})
Tawny Harte's avatar
Tawny Harte committed
		self:talentTemporaryValue(tmptable, "combat_def", math.max(self:getMag(), self:getDex()) * 0.7)
Chris Davidson's avatar
Chris Davidson committed
	end,
	callbackOnStatChange = function(self, t, stat, v)
		if (stat == self.STAT_MAG) or (stat == self.STAT_DEX) then
Chris Davidson's avatar
Chris Davidson committed
			self:updateTalentPassives(t)
		end
	end,
	callbackOnMeleeHit = function(self, t, src, dam)
		self:setEffect(self.EFF_ETHEREAL_FORM, 8, {})
	end,
	callbackOnArcheryHit = function(self, t, src, dam)
		self:setEffect(self.EFF_ETHEREAL_FORM, 8, {})
	end,
	info = function(self, t)
		return ([[You gain 25%% absolute damage resistance and 25%% all damage penetration.  Each time you are struck by a weapon these bonuses are reduced by 5%% but fully recovered after 8 turns.
			Additionally, you gain 70%% of the highest of your Magic or Dexterity stat as defense (%d)]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat(math.max(self:getMag(), self:getDex()) * 0.7)
Chris Davidson's avatar
Chris Davidson committed
	end,
}

dg's avatar
dg committed
uberTalent{
	name = "Aether Permeation",
	mode = "passive",
	require = { special={desc=_t"Have at least 25% arcane damage reduction and have been exposed to the void of space", fct=function(self)
		return (game.state.birth.ignore_prodigies_special_reqs or self:attr("planetary_orbit")) and self:combatGetResist(DamageType.ARCANE) >= 25
dg's avatar
dg committed
	end} },
	cant_steal = true,
dg's avatar
dg committed
	on_learn = function(self, t)
dg's avatar
dg committed
		local ret = {}
		self:talentTemporaryValue(ret, "force_use_resist", DamageType.ARCANE)
dg's avatar
dg committed
		self:talentTemporaryValue(ret, "force_use_resist_percent", 66)
Alex Ksandra's avatar
Alex Ksandra committed
		self:talentTemporaryValue(ret, "resists", {[DamageType.ARCANE] = 20})
		self:talentTemporaryValue(ret, "resists_cap", {[DamageType.ARCANE] = 10})
dg's avatar
dg committed
		return ret
dg's avatar
dg committed
	end,
	on_unlearn = function(self, t)
	end,
	info = function(self, t)
DarkGod's avatar
DarkGod committed
		return ([[You manifest a thin layer of aether all around you. Any attack passing through it will check arcane resistance instead of the incoming damage resistance.
		In effect, all of your resistances are equal to 66%% of your arcane resistance, which is increased by 20%% (and cap increased by 10%%).]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat()
dg's avatar
dg committed
	end,
}
dg's avatar
dg committed

uberTalent{
	name = "Mystical Cunning", image = "talents/vulnerability_poison.png",
	mode = "passive",
	require = { special={desc=_t"Know how to either prepare traps or apply poisons", fct=function(self)
razakai's avatar
razakai committed
		return self:knowTalent(self.T_APPLY_POISON) or self:knowTalent(self.T_TRAP_MASTERY)
dg's avatar
dg committed
	end} },
	autolearn_talent = {Talents.T_VULNERABILITY_POISON, Talents.T_GRAVITIC_TRAP}, -- requires uber.lua loaded last
Chris Davidson's avatar
Chris Davidson committed
	passives = function(self, t, tmptable)
		self:talentTemporaryValue(tmptable, "talents_types_mastery", {["cunning/trapping"] = 1})
		self:talentTemporaryValue(tmptable, "talents_types_mastery", {["cunning/poisons"] = 1})
		self:talentTemporaryValue(tmptable, "talent_cd_reduction", {[Talents.T_VENOMOUS_STRIKE] = 3})
		self:talentTemporaryValue(tmptable, "talent_cd_reduction", {[Talents.T_LURE] = 5})
dg's avatar
dg committed
	end,
	info = function(self, t)
		local descs = ""
		for i, tid in pairs(t.autolearn_talent) do
			local bonus_t = self:getTalentFromId(tid)
			if bonus_t then
Otowa Kotori's avatar
Otowa Kotori committed
				descs = ("%s\n#YELLOW#%s#LAST#\n%s\n"):tformat(descs, bonus_t.name, self:callTalent(bonus_t.id, "info"))
Chris Davidson's avatar
Chris Davidson committed
		return ([[Your study of arcane forces has let you develop a new way of applying your aptitude for trapping and poisons.

		You gain 1.0 mastery in the Cunning/Poisons and Cunning/Trapping talent trees.
		Your Venomous Strike talent cooldown is reduced by 3.
		Your Lure talent cooldown is reduced by 5.

		You learn the following talents:
Chris Davidson's avatar
Chris Davidson committed
%s]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat(descs)
dg's avatar
dg committed
	end,
}
dg's avatar
dg committed

uberTalent{
	name = "Arcane Might",
	mode = "passive",
	info = function(self, t)
DarkGod's avatar
DarkGod committed
		return ([[You have learned to harness your latent arcane powers, channeling them through your weapon.
Alex Ksandra's avatar
Alex Ksandra committed
		This has the following effects:
		Equipped weapons are treated as having an additional 50%% Magic modifier;
Alex Ksandra's avatar
Alex Ksandra committed
		Your raw Physical Power is increased by 100%% of your raw Spellpower;
DarkGod's avatar
DarkGod committed
		Your physical critical chance is increased by 25%% of your bonus spell critical chance.]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat()
dg's avatar
dg committed
	end,
}
dg's avatar
dg committed

uberTalent{
	name = "Temporal Form",
	cooldown = 30,
	require = { special={desc=_t"Have cast over 1000 spells and visited a zone outside of time", fct=function(self) return
		self.talent_kind_log and self.talent_kind_log.spell and self.talent_kind_log.spell >= 1000 and (game.state.birth.ignore_prodigies_special_reqs or self:attr("temporal_touched"))
dg's avatar
dg committed
	end} },
	no_energy = true,
dg's avatar
dg committed
	is_spell = true,
dg's avatar
dg committed
	requires_target = true,
	range = 10,
	tactical = { DEFEND = 2, BUFF = 2 },
dg's avatar
dg committed
	action = function(self, t)
		self:setEffect(self.EFF_TEMPORAL_FORM, 10, {})
dg's avatar
dg committed
		return true
	end,
	info = function(self, t)
		return ([[You can wrap temporal threads around you, assuming the form of a telugoroth for 10 turns.
DarkGod's avatar
DarkGod committed
		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 anomalies: Anomaly Rearrange, Anomaly Temporal Storm, Anomaly Flawed Design, Anomaly Gravity Pull and Anomaly Wormhole.]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat()
dg's avatar
dg committed
	end,
dg's avatar
dg committed
}

uberTalent{
	name = "Blighted Summoning",
	mode = "passive",
	require = { special={desc=_t"Have summoned at least 100 creatures. More permanent summons may count as more than 1.", fct=function(self)
dg's avatar
dg committed
		return self:attr("summoned_times") and self:attr("summoned_times") >= 100
dg's avatar
dg committed
	end} },
	cant_steal = true,
	-- Give the bonus to all summons immediately
	on_learn = function(self, t)
		if game.party and game.party:hasMember(self) and game.party.members then
			for act, def in pairs(game.party.members) do
				if act ~= self and act.summoner == self and not act.escort_quest then
					self:callTalent(self.T_BLIGHTED_SUMMONING, "doBlightedSummon", act)
Tawny Harte's avatar
Tawny Harte committed
	-- Called by addedToLevel Actor.lua
	doBlightedSummon = function(self, t, who)
		if who.is_blighted_summon or not self:knowTalent(self.T_BLIGHTED_SUMMONING) then return false end
		who:learnTalent(who.T_BONE_SHIELD, true, 3, {no_unlearn=true})
		who:forceUseTalent(who.T_BONE_SHIELD, {ignore_energy=true})
		if who.necrotic_minion then
			if who.subtype == "giant" then
				who:learnTalent(who.T_BONE_SPIKE, true, 3, {no_unlearn=true})
				who:learnTalent(who.T_RUIN, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_RUIN, {ignore_energy=true})
			elseif who.subtype == "vampire" or who.subtype == "lich" then
				who:learnTalent(who.T_BLOOD_GRASP, true, 3, {no_unlearn=true})
				who:learnTalent(who.T_BLOOD_BOIL, true, 3, {no_unlearn=true})
			elseif who.subtype == "ghost" or who.subtype == "wight" then
Tawny Harte's avatar
Tawny Harte committed
				who:learnTalent(who.T_BLOOD_FURY, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_BLOOD_FURY, {ignore_energy=true})
				who:learnTalent(who.T_CURSE_OF_DEATH, true, 3, {no_unlearn=true})
			elseif who.subtype == "ghoul" then
				who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
			elseif who.name == "skeleton archer" or who.name == "skeleton master archer" then
				who:learnTalent(who.T_BONE_SPIKE, true, 3, {no_unlearn=true})
			elseif who.name == "skeleton mage" then
				who:learnTalent(who.T_BONE_SPEAR, true, 3, {no_unlearn=true})
			elseif who.name == "degenerated skeleton warrior" or who.name == "skeleton warrior" or who.name == "armoured skeleton warrior" then
				who:learnTalent(who.T_RUIN, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_RUIN, {ignore_energy=true})
			else
				who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
				who:addTemporaryValue("all_damage_convert_percent", 10)
				who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
			end
		elseif who.is_nature_summon then
			if who.subtype == "canine" then
				who:learnTalent(who.T_GNAW, true, 3, {no_unlearn=true})
			elseif who.subtype == "jelly" then
				who:learnTalent(who.T_CURSE_OF_DEFENSELESSNESS, true, 3, {no_unlearn=true})
			elseif who.subtype == "minotaur" then
				who:learnTalent(who.T_RUIN, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_RUIN, {ignore_energy=true})
			elseif who.subtype == "stone" then
				who:learnTalent(who.T_ACID_BLOOD, true, 3, {no_unlearn=true})
			elseif who.subtype == "ritch" then
				who:learnTalent(who.T_LIFE_TAP, true, 3, {no_unlearn=true})
			elseif who.type == "hydra" then
				who:learnTalent(who.T_BLOOD_SPRAY, true, 3, {no_unlearn=true})
			elseif who.subtype == "plants" then
				who:learnTalent(who.T_POISON_STORM, true, 3, {no_unlearn=true})
Otowa Kotori's avatar
Otowa Kotori committed
			-- I18N this line of code should be fixed.
			elseif who.name == "fire drake" or who.name == "fire drake (wild summon)" then
Tawny Harte's avatar
Tawny Harte committed
				who:learnTalent(who.T_FLAME_OF_URH_ROK, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_FLAME_OF_URH_ROK, {ignore_energy=true})
			elseif who.subtype == "turtle" then
				who:learnTalent(who.T_ELEMENTAL_DISCORD, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_ELEMENTAL_DISCORD, {ignore_energy=true})
			elseif who.subtype == "spider" then
				who:learnTalent(who.T_BLOOD_GRASP, true, 3, {no_unlearn=true})
			else
				who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
				who:addTemporaryValue("all_damage_convert_percent", 10)
				who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
			end
		else
			who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
			who:addTemporaryValue("all_damage_convert_percent", 10)
			who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
		end
		who:incVim(who:getMaxVim())
		who.is_blighted_summon = true
dg's avatar
dg committed
	info = function(self, t)
		return ([[You infuse blighted energies into all of your summons, granting them Bone Shield (level 3) and a bonus to Spellpower equal to your Magic.
		Your Wilder Summons and Necrotic Minions will gain special corrupted talents (level 3), other summons will gain 10%% Blight damage conversion and Virulent Disease (level 3).
		#GREEN#Wilder Summons:#LAST#
Tawny Harte's avatar
Tawny Harte committed
		- War Hound: Gnaw
		- Jelly: Curse of Defencelessness
		- Minotaur: Ruin
		- Golem: Acid Blood
		- Ritch: Life Tap
		- Hydra: Blood Spray
		- Rimebark: Poison Storm
		- Fire Drake: Flame of Urh’Rok
		- Turtle: Elemental Discord
		- Spider: Blood Grasp
		#GREY#Necrotic Minions:#LAST#
Tawny Harte's avatar
Tawny Harte committed
		- Skeleton Mages: Bone Spear
		- Skeleton Archers: Bone Spike
		- Skeleton Warriors: Ruin
		- Bone Giants: Bone Spike and Ruin
		- Ghouls: Virulent Disease
		- Vampires / Liches: Blood Grasp and Blood Boil
		- Ghosts / Wights: Blood Fury and Curse of Death
Otowa Kotori's avatar
Otowa Kotori committed
		]]):tformat()
dg's avatar
dg committed
	end,
}
dg's avatar
dg committed

uberTalent{
	name = "Revisionist History",
dg's avatar
dg committed
	no_energy = true,
	is_spell = true,
dg's avatar
dg committed
	no_npc_use = true,
	require = { special={desc=_t"Have time-travelled at least once", fct=function(self) return game.state.birth.ignore_prodigies_special_reqs or (self:attr("time_travel_times") and self:attr("time_travel_times") >= 1) end} },
dg's avatar
dg committed
	action = function(self, t)
		if game._chronoworlds and game._chronoworlds.revisionist_history then
			self:hasEffect(self.EFF_REVISIONIST_HISTORY).back_in_time = true
			self:removeEffect(self.EFF_REVISIONIST_HISTORY)
			return nil -- the effect removal starts the cooldown
		end

		if checkTimeline(self) == true then return end

		game:onTickEnd(function()
			game:chronoClone("revisionist_history")
			self:setEffect(self.EFF_REVISIONIST_HISTORY, 19, {})
dg's avatar
dg committed
		end)
		return nil -- We do not start the cooldown!
	end,
	info = function(self, t)
DarkGod's avatar
DarkGod committed
		return ([[You can now control the recent past. Upon using this prodigy you gain a temporal effect for 20 turns.
		While this effect holds you can use the prodigy again to rewrite history.
dg's avatar
dg committed
		This prodigy splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat()
dg's avatar
dg committed
	end,
}
newTalent{
	name = "Unfold History", short_name = "REVISIONIST_HISTORY_BACK",
	type = {"uber/other",1},
	cooldown = 30,
	no_energy = true,
	is_spell = true,
	no_npc_use = true,
	action = function(self, t)
		if game._chronoworlds and game._chronoworlds.revisionist_history then
			self:hasEffect(self.EFF_REVISIONIST_HISTORY).back_in_time = true
			self:removeEffect(self.EFF_REVISIONIST_HISTORY)
			return nil -- the effect removal starts the cooldown
		end
		return nil -- We do not start the cooldown!
	end,
	info = function(self, t)
DarkGod's avatar
DarkGod committed
		return ([[Rewrite the recent past to go back to when you cast Revisionist History.]])
Otowa Kotori's avatar
Otowa Kotori committed
		:tformat()

uberTalent{
	name = "Cauterize",
	mode = "passive",
	cooldown = 12,
	require = { special={desc=_t"Have received at least 3500 fire damage and have cast at least 1000 spells", fct=function(self) return
		self.talent_kind_log and self.talent_kind_log.spell and self.talent_kind_log.spell >= 1000 and self.damage_intake_log and self.damage_intake_log[DamageType.FIRE] and self.damage_intake_log[DamageType.FIRE] >= 3500
	end} },
	trigger = function(self, t, value)
		self:startTalentCooldown(t)

		if self.player then world:gainAchievement("AVOID_DEATH", self) end
		self:setEffect(self.EFF_CAUTERIZE, 8, {dam=value/10})
		return true
	end,
	info = function(self, t)
DarkGod's avatar
DarkGod committed
		return ([[Your inner flame is strong. Each time that you receive a blow that would kill you, your body is wreathed in flames.
dg's avatar
dg committed
		The flames will cauterize the wound, fully absorbing all damage done this turn, but they will continue to burn for 8 turns.
Otowa Kotori's avatar
Otowa Kotori committed
		Each turn 10%% of the damage absorbed will be dealt by the flames. This will bypass resistance and affinity.
Otowa Kotori's avatar
Otowa Kotori committed
		Warning: this has a cooldown.]]):tformat()

uberTalent{
	name = "Lich",
	require = {
		special={desc="Is a living creature that knows necromancy", fct=function(self)
			local nb = 0
			for tid, lvl in pairs(self.talents) do local t = self:getTalentFromId(tid) if t.is_necromancy then nb = nb + lvl end end
			return not self:attr("true_undead") and nb > 0
		end},
		special2={desc="Have completed the ritual", fct=function(self)
			if not game.state.birth.supports_lich_transform then return true else return self:isQuestStatus(game.state.birth.supports_lich_transform, engine.Quest.DONE) end
		end},
		stat = {wil=25},
	},
	is_race_evolution = function(self, t)
		if self:attr("necromancy_immune") then return false end
DarkGod's avatar
DarkGod committed
		if self:attr("greater_undead") then return false end
		local nb = 0
		for tid, lvl in pairs(self.talents) do local t = self:getTalentFromId(tid) if t.is_necromancy then nb = nb + lvl end end
		return not self:attr("true_undead") and nb > 0
	end,
	cant_steal = true,
	is_spell = true,
	is_necromancy = true,
	mode = "passive",
	no_npc_use = true,
	becomeLich = function(self, t)
		self.descriptor.race = "Undead"
		self.descriptor.subrace = "Lich"
		if not self.has_custom_tile then
			self.moddable_tile = "skeleton"
			self.moddable_tile_nude = 1
			self.moddable_tile_base = "base_lich_01.png"
			self.moddable_tile_ornament = nil
			self.moddable_tile_hair = nil
			self.moddable_tile_facial_features = nil
			self.moddable_tile_tatoo = nil
			self.moddable_tile_horn = nil
			self.attachement_spots = "race_skeleton"
		end
		self.blood_color = colors.GREY
		self:attr("poison_immune", 1)
		self:attr("disease_immune", 1)
		self:attr("stun_immune", 1)
		self:attr("cut_immune", 1)
		self:attr("fear_immune", 1)
		self:attr("no_breath", 1)
DarkGod's avatar
DarkGod committed
		self:attr("mana_regen", 7)
		self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 20
		self.resists[DamageType.DARKNESS] = (self.resists[DamageType.DARKNESS] or 0) + 20
		self.inscription_forbids = self.inscription_forbids or {}
		self.inscription_forbids["inscriptions/infusions"] = true

		self:incIncStat("mag", 12) self:incIncStat("wil", 12) self:incIncStat("cun", 12)
		self:attr("combat_spellresist", 35) self:attr("combat_mentalresist", 35)
		self.life_rating = self.life_rating + 4
		self:attr("ignore_direct_crits", 60)

		self:attr("undead", 1)
		self:attr("true_undead", 1)
DarkGod's avatar
DarkGod committed
		self:attr("greater_undead", 1)

		self:learnTalentType("undead/lich", true)

		if self:attr("blood_life") then
			self.blood_life = nil
			game.log("#GREY#As you turn into a powerful undead you feel your body violently rejecting the Blood of Life.")
		end

		if not self.has_custom_tile then
			self:removeAllMOs()
			self:updateModdableTile()
			Dialog:yesnoLongPopup("Lichform", "#GREY#You feel your life slip away, only to be replaced by pure arcane forces! Your flesh starts to rot on your bones, and your eyes fall apart as you are reborn into a Lich!\n\n#{italic}#You may now choose to customize the appearance of your Lich, this can not be changed afterwards.", 600, function(ret) if ret then
				require("mod.dialogs.Birther"):showCosmeticCustomizer(self, "Lich Cosmetic Options")
			end end, "Customize Appearance", "Use Default", true)
		else
			Dialog:simplePopup("Lichform", "#GREY#You feel your life slip away, only to be replaced by pure arcane forces! Your flesh starts to rot on your bones, and your eyes fall apart as you are reborn into a Lich!")
		end

		game.level.map:particleEmitter(self.x, self.y, 1, "demon_teleport")
	end,
	on_learn = function(self, t)
		self:learnTalent(self.T_NEVERENDING_UNLIFE, true, 1)
		game.bignews:say(120, "#DARK_ORCHID#You are on your way to Lichdom. #{bold}#Your next death will finish the ritual.#{normal}#")
	end,
	on_unlearn = function(self, t)
	end,
	info = function(self, t)
		return ([[This is your true goal and the purpose of all necromancy - to become a powerful and everliving Lich!
		Once learnt, the next time you are killed, the arcane forces you unleash will be able to rebuild your body into the desired Lichform.
		Liches are immune to poisons, diseases, fear, cuts, stuns, do not need to breath and are 20%% resistant to cold and darkness.
DarkGod's avatar
DarkGod committed
		Liches also gain +12 Magic, Willpower and Cunning, 60%% chance to ignore critical hits, +4 life rating (not retroactive), +35 spell and mental saves, all resistance caps raised by 15%% and 7 mana regeneration.

		Liches gain a new racial tree with the following talents:
		- Neverending Unlife: A Lich body is extremely resilient, being able to go into negative life and when destroyed it can regenerate itself.
		- Frightening Presence: Your mere presence is enough to shatter the resolve of most, reducing their saves, damage and movement speed.
		- Doomed for Eternity: As a creature of doom and despair you now constantly spawn undead shadows around you.
		- Commander of the Dead: You are able to infuse all undead party members (including yourself) with un-natural power, increasing your physical and spellpower.
		]]):format()
	end,
}