diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua index 35ac8d5d7af9a79ec50760102092a078373128ff..460e461b21b5a4e35380dc46244811c39f3532ec 100644 --- a/game/modules/tome/data/birth/classes/mage.lua +++ b/game/modules/tome/data/birth/classes/mage.lua @@ -203,7 +203,7 @@ newBirthDescriptor{ talents = { [ActorTalents.T_NECROTIC_AURA] = 1, [ActorTalents.T_CREATE_MINIONS] = 1, - [ActorTalents.T_NECROMANTIC_FANG] = 1, +-- [ActorTalents.T_NECROMANTIC_FANG] = 1, [ActorTalents.T_INVOKE_DARKNESS] = 1, [ActorTalents.T_BLURRED_MORTALITY] = 1, }, diff --git a/game/modules/tome/data/gfx/shockbolt/npc/undead_ghost_will_o__the_wisp.png b/game/modules/tome/data/gfx/shockbolt/npc/undead_ghost_will_o__the_wisp.png new file mode 100644 index 0000000000000000000000000000000000000000..6061b1b5538434ad99fea3fc91854c8b4bea3022 Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/undead_ghost_will_o__the_wisp.png differ diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua index 248079d17cd8f9ad13ab89f2eea4c488c957b4d9..7ce2fab1dec3b49cacdc2dd86cb5f5692724057d 100644 --- a/game/modules/tome/data/talents/misc/npcs.lua +++ b/game/modules/tome/data/talents/misc/npcs.lua @@ -1238,6 +1238,31 @@ newTalent{ end, } +newTalent{ + name = "Will o' the Wisp Explode", + type = {"technique/other", 1}, + points = 5, + message = "@Source@ explodes! @target@ is enveloped in frost.", + cooldown = 1, + range = 1, + requires_target = true, + tactical = { ATTACK = 1 }, + action = function(self, t) + local tg = {type="bolt", range=1} + local x, y, target = self:getTarget(tg) + if not x or not y then return nil end + if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end + self:project(tg, x, y, DamageType.COLD, self.will_o_wisp_dam or 1) + game.level.map:particleEmitter(self.x, self.y, 1, "ball_ice", {radius = 1, r = 1, g = 0, b = 0}) + self:die(self) + game:playSoundNear(self, "talents/ice") + return true + end, + info = function(self, t) + return ([[Explodes.]]) + end, +} + newTalent{ name = "Elemental bolt", type = {"spell/other", 1}, diff --git a/game/modules/tome/data/talents/spells/grave.lua b/game/modules/tome/data/talents/spells/grave.lua index 6556703bd023b1cd0513e09c6d1b45d4ba2082f5..37a824f1b581632f387962f2aaeb5d4503f21619 100644 --- a/game/modules/tome/data/talents/spells/grave.lua +++ b/game/modules/tome/data/talents/spells/grave.lua @@ -20,37 +20,120 @@ local Object = require "mod.class.Object" newTalent{ - name = "Necromantic Fang", + name = "Chill of the Tomb", type = {"spell/grave",1}, require = spells_req1, points = 5, - random_ego = "attack", - mana = 12, - cooldown = 3, - tactical = { ATTACK = 2 }, - range = 10, - reflectable = true, - proj_speed = 20, + mana = 30, + cooldown = 8, + tactical = { ATTACKAREA = 2 }, + range = 7, + radius = function(self, t) + return 1 + self:getTalentLevelRaw(t) + end, + proj_speed = 4, + direct_hit = true, requires_target = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 230) end, + 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, 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.COLD, self:spellCrit(t.getDamage(self, t)), 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) - return ([[Conjures up a bolt of darkness, doing %0.2f darkness damage. - At level 3 it will create a beam of shadows. - At level 5 it will not hurt your minions anymore. + local radius = self:getTalentRadius(t) + return ([[Conjures up a bolt of cold moving toward the target that explodes into a chilly circle of death doing %0.2f cold damage in a radius of %d. The damage will increase with the Magic stat]]): - format(damDesc(self, DamageType.DARKNESS, damage)) + format(damDesc(self, DamageType.COLD, damage), radius) end, } --- Kinda copied from Creeping Darkness newTalent{ - name = "Cold Flames", + name = "Will o' the Wisp", type = {"spell/grave",2}, require = spells_req2, + mode = "sustained", + points = 5, + mana = 60, + cooldown = 30, + tactical = { BUFF = 3 }, + getParams = function(self, t) return util.bound(30 + self:getTalentLevel(t) * 10, 30, 100), 20 + self:combatTalentSpellDamage(t, 25, 300) end, + summon = function(self, t, dam, src, killer) + local minion = require("mod.class.NPC").new{ + name = "will o' the wisp", + type = "undead", subtype = "ghost", + blood_color = colors.GREY, + display = "G", color=colors.WHITE, + combat = { dam=1, atk=1, apr=1 }, + autolevel = "warriormage", + ai = "dumb_talented_simple", ai_state = { talent_in=1, }, + dont_pass_target = true, + movement_speed = 2, + stats = { str=14, dex=18, mag=20, con=12 }, + rank = 2, + size_category = 1, + infravision = 10, + can_pass = {pass_wall=70}, + resists = {all = 35, [DamageType.LIGHT] = -70, [DamageType.DARKNESS] = 65}, + no_breath = 1, + stone_immune = 1, + confusion_immune = 1, + fear_immune = 1, + teleport_immune = 0.5, + disease_immune = 1, + poison_immune = 1, + stun_immune = 1, + blind_immune = 1, + cut_immune = 1, + see_invisible = 80, + undead = 1, + will_o_wisp_dam = dam, + talents = {T_WILL_O__THE_WISP_EXPLODE = 1}, + } + local x, y = util.findFreeGrid(src.x or self.x, src.y or self.y, 5, true, {[Map.ACTOR]=true}) + if minion and x and y then + necroSetupSummon(self, minion, x, y, lev, true) + minion.on_die = nil + minion.on_act = nil + minion:setTarget(killer) + end + + end, + activate = function(self, t) + local chance, dam = t.getParams(self, t) + game:playSoundNear(self, "talents/spell_generic2") + local ret = { + chance = chance, + dam = dam, + } + return ret + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local chance, dam = t.getParams(self, t) + return ([[Surround yourself with undead energies, when one of your minions is destroyed while inside your necrotic aura it has %d%% chances to create a will o' the wisp. + Will o' the wisp will take a random target in sight and home on it, when they reach it they explode for %0.2f cold damage. + The damage will increase with the Magic stat]]): + format(chance, damDesc(self, DamageType.DARKNESS, dam)) + end, +} + +-- Kinda copied from Creeping Darkness +newTalent{ + name = "Cold Flames", + type = {"spell/grave",3}, + require = spells_req3, points = 5, mana = 40, cooldown = 22, @@ -235,45 +318,6 @@ newTalent{ end, } -newTalent{ - name = "Chill of the Tomb", - type = {"spell/grave",3}, - require = spells_req3, - points = 5, - random_ego = "attack", - mana = 40, - cooldown = 8, - tactical = { ATTACKAREA = 2 }, - range = 7, - radius = function(self, t) - return 1 + self:getTalentLevelRaw(t) - 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, - 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.COLD, self:spellCrit(t.getDamage(self, t)), 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 moving toward the target that explodes into a chilly circle of death doing %0.2f cold damage in a radius of %d. - The damage will increase with the Magic stat]]): - format(damDesc(self, DamageType.COLD, damage), radius) - end, -} - newTalent{ name = "Vampiric Gift", type = {"spell/grave",4}, diff --git a/game/modules/tome/data/talents/spells/spells.lua b/game/modules/tome/data/talents/spells/spells.lua index d7c9264e9de4a36469b3d1507041195dd83b82e7..82e9b5417d1d94c017477527c2db32f0d39e1c52 100644 --- a/game/modules/tome/data/talents/spells/spells.lua +++ b/game/modules/tome/data/talents/spells/spells.lua @@ -191,6 +191,17 @@ function necroSetupSummon(self, m, x, y, level, no_control) end end + m.on_die = function(self, killer) + local src = self.summoner + local w = src:isTalentActive(src.T_WILL_O__THE_WISP) + local p = src:isTalentActive(src.T_NECROTIC_AURA) + if w and p and self.x and self.y and src.x and src.y and core.fov.distance(self.x, self.y, src.x, src.y) > self.summoner.necrotic_aura_radius then return end + if not rng.percent(w.chance) then return end + + local t = src:getTalentFromId(src.T_WILL_O__THE_WISP) + t.summon(src, t, w.dam, self, killer) + end + -- Summons never flee m.ai_tactic = m.ai_tactic or {} m.ai_tactic.escape = 0 diff --git a/game/modules/tome/data/talents/techniques/2hweapon.lua b/game/modules/tome/data/talents/techniques/2hweapon.lua index 908a1430d3c662181b5e031859c85dce6855f658..6cca1dfd541d34a6f24ab0373bdef4e18eb23678 100644 --- a/game/modules/tome/data/talents/techniques/2hweapon.lua +++ b/game/modules/tome/data/talents/techniques/2hweapon.lua @@ -30,7 +30,7 @@ newTalent{ range = 0, radius = 1, target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} + return {type="ball", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t)} end, on_pre_use = function(self, t, silent) if not self:hasTwoHandedWeapon() then if not silent then game.logPlayer(self, "You require a two handed weapon to use this talent.") end return false end return true end, action = function(self, t) diff --git a/ideas/spells.ods b/ideas/spells.ods index 44450083aa805627c559c22885bb3417bcfd9250..f2029f33d673dd5f950fdbdcbf5117cfbc26cffd 100644 Binary files a/ideas/spells.ods and b/ideas/spells.ods differ