Skip to content
Snippets Groups Projects
Forked from tome / Tales of MajEyal
1253 commits behind the upstream repository.
grave.lua 7.03 KiB
-- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009 - 2019 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

newTalent{
	name = "Chill of the Tomb",
	type = {"spell/grave",1},
	require = spells_req1,
	points = 5,
	mana = 30,
	cooldown = 8,
	tactical = { ATTACKAREA = { COLD = 2 } },
	range = 7,
	radius = function(self, t)
		return math.floor(self:combatTalentScale(t, 2, 6, 0.5, 0, 0, true))
	end,
	proj_speed = 4,
	direct_hit = true,
	requires_target = true,
	target = function(self, t)
		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t, display={particle="bolt_ice", trail="icetrail"}}
	end,
	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 28, 280) end,
	getFlatResist = function(self, t) return math.floor(self:combatTalentScale(t, 5, 25)) 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:projectile(tg, x, y, DamageType.CHILL_OF_THE_TOMB, {dam=self:spellCrit(t:_getDamage(self)), resist=t:_getFlatResist(self)}, function(self, tg, x, y, grids)
			game.level.map:particleEmitter(x, y, tg.radius, "iceflash", {radius=tg.radius, tx=x, ty=y})
		end)
		game:playSoundNear(self, "talents/ice")
		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t)
		local radius = self:getTalentRadius(t)
		return ([[Conjures up a bolt of cold that moves toward the target and explodes into a chilly circle of death, doing %0.2f cold damage in a radius of %d.
		Necrotic minions caught in the blast do not take damage but are instead coated with a thin layer of ice, reducing all damage they take by %d for 4 turns.
		The damage will increase with your Spellpower.]]):
		tformat(damDesc(self, DamageType.COLD, damage), radius, t:_getFlatResist(self))
	end,
}

newTalent{
	name = "Black Ice",
	type = {"spell/grave",2},
	require = spells_req2,
	points = 5,
	mana = 7,
	cooldown = 4,
	tactical = { ATTACK= { COLD = 2 }, DISABLE = 2 },
	range = 10,
	direct_hit = true,
	requires_target = true,
	target = function(self, t)
		if self:getTalentLevel(t) < 5 then
			return {type="hit", range=self:getTalentRange(t), friendlyfire=false}
		else
			return {type="ball", radius=1, range=self:getTalentRange(t), friendlyfire=false}
		end
	end,
	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 250) end,
	getMinionsInc = function(self,t) return math.floor(self:combatTalentScale(t, 10, 30)) end,
	action = function(self, t)
		local tg = self:getTalentTarget(t)
		local x, y = self:getTarget(tg)
		local _ _, _, _, x, y = self:canProject(tg, x, y)
		if not x or not y then return nil end

		local dam = self:spellCrit(t:_getDamage(self))
		self:projectApply(tg, x, y, Map.ACTOR, function(target, x, y)
			if DamageType:get(DamageType.COLD).projector(self, x, y, DamageType.COLD, dam) > 0 then
				target:setEffect(target.EFF_BLACK_ICE, 3, {apply_power=self:combatSpellpower(), power=t:_getMinionsInc(self)})
			end
			game.level.map:particleEmitter(x, y, 1, "black_ice", {})
		end)

		game:playSoundNear(self, "talents/ice")
		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t)
		return ([[Summon a icy spike directly on a foe, impaling it for %0.2f cold damage.
		At level 5 it hits all foes in range 1 around the target.
		Any creature hit will take %d%% more damage from your necrotic minions for 3 turns.
		The damage will increase with your Spellpower.]]):
		tformat(damDesc(self, DamageType.COLD, damage), t:_getMinionsInc(self))
	end,
}

newTalent{
	name = "Corpselight",
	type = {"spell/grave",3},
	require = spells_req3,
	points = 5,
	mana = 20,
	soul = function(self, t) return self:knowTalent(self.T_GRAVE_MISTAKE) and 2 or 1 end,
	cooldown = 15,
	tactical = { ATTACKAREA={ COLD=4 } }, -- Higher prioriy to make sure it's cast before other spells so taht it can be extended
	radius = 3,
	range = 7,
	getMaxStacks = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7.5)) end,
	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 30, 400) / 7 end,
	target = function(self, t) return {type="ball", radius=self:getTalentRadius(t), range=self:getTalentRange(t), nolock=true, nowarning=true} end,
	action = function(self, t)
		local tg = self:getTalentTarget(t)
		local x, y = self:getTargetLimitedWallStop(tg)
		if not x then return end
		self:setEffect(self.EFF_CORPSELIGHT, 7, {x=x, y=y, radius=self:getTalentRadius(t), dam=t:_getDamage(self), stacks=self.life < 1 and 3 or 0, max_stacks=t:_getMaxStacks(self)})
		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t)
		local radius = self:getTalentRadius(t)
		return ([[You summon a corpselight that radiates cold for 7 turns in radius %d.
		Every turn all foes inside take %0.2f cold damage.
		Anytime you cast a spell inside your corpselight's area it grows by one stack, each stack giving +1 radius and +10%% damage.
		The corpselight can gain at most %d stacks and the radius will never extend beyond 10.
		If cast while under 1 life it spawns with 3 stacks.
		The damage will increase with your Spellpower.]]):
		tformat(radius, damDesc(self, DamageType.COLD, damage), t:_getMaxStacks(self))
	end,
}
newTalent{
	name = "Grave Mistake",
	type = {"spell/grave",4},
	require = spells_req4,
	points = 5,
	mode = "passive",
	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 40, 250) end,
	explode = function(self, t, x, y, radius, stacks)
		local dam = t:_getDamage(self) * (1 + stacks * 0.1)
		local list = table.values(self:projectCollect({type="ball", radius=radius, x=x, y=y, friendlyfire=false}, x, y, Map.ACTOR))
		table.sort(list, "dist")
		for _, l in ipairs(list) do
			if l.target:canBe("knockback") then l.target:pull(x, y, radius) end
			DamageType:get(DamageType.COLD).projector(self, l.target.x, l.target.y, DamageType.COLD, dam)
		end
		game.level.map:particleEmitter(x, y, radius, "iceflash", {radius=radius})
		game.logSeen(self, "#STEEL_BLUE#The corpselight implodes!")
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t)
		return ([[Upon expiring the corpselight implodes, pulling in all foes towards its center and dealing %0.2f cold damage.
		The damage is increased by +10%% per stacks.
		The damage will increase with your Spellpower.

		#PURPLE#Learning this spell will make Corpselight cost two souls to use instead of one.]]):
		tformat(damDesc(self, DamageType.COLD, damage))
	end,
}