Code: Select all
soul_rend = function(self, target, duration, x, y)
local m = mod.class.NPC.new{
type = "undead", subtype = "ghost",
display = "w", color=colors.BLACK, image = "npc/shadow-stalker.png",
name = "soul fragment", faction = target.faction,
desc = [[]],
autolevel = "none",
ai = "summoned", ai_real = "tactical", ai_state = { ai_move="move_complex", talent_in=3 },
stats = { str=1, dex=1, mag=1, con=1 },
level_range = {self.level, self.level}, exp_worth = 0,
global_speed_base = 1.0,
never_move = 1,
max_life = 1,
life_rating = 0,
size_category = 1,
cut_immune = 1,
blind_immune = 1,
disease_immune = 1,
dont_act = 1,
negative_status_effect_immune = 1,
combat_armor = 0, combat_def = 0,
summoner = self, summoner_gain_exp=true,
summon_time = duration,
ai_target = {actor=target}
}
m.unused_stats = 0
m.unused_talents = 0
m.unused_generics = 0
m.unused_talents_types = 0
m.no_inventory_access = true
m.no_points_on_levelup = true
m.save_hotkeys = true
m.ai_state = m.ai_state or {}
m.ai_state.tactic_leash = 100
m.soul_fragment = true
m.faction = "enemies"
m.summoner = nil
-- Try to use stored AI talents to preserve tweaking over multiple summons
m.ai_talents = self.stored_ai_talents and self.stored_ai_talents[m.name] or {}
m.on_die = function(self, src)
local t = self:getTalentFromId(self.T_SOUL_REND)
local tg = {type="hit", range=10, selffire=true, talent=t}
local damage = t.getDamage(self,t)
self:project(tg, target.x, target.y, DamageType.SHADOWFROST, t.getDamage(self,t))
end
m:resolve() m:resolve(nil, true)
game.zone:addEntity(game.level, m, "actor", x, y)
game.level.map:particleEmitter(x, y, 1, "summon")
-- Summons never flee
m.ai_tactic = m.ai_tactic or {}
m.ai_tactic.escape = 0
m.summon_time = duration
mod.class.NPC.castAs(m)
engine.interface.ActorAI.init(m, m)
return m
end
newTalent{
name = "Soul Rend",
type = {"spell/spirit", 1},
require = mag_req1,
points = 5,
mode = "passive",
hotkey=true,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 100) end,
activate = function(self, t)
return true
end,
deactivate = function(self, t, p)
return true
end,
callbackOnMeleeAttack = function(self, t, target, hitted)
if not hitted then return end
local tg = {type="hit", range=10, talent=t}
if rng.percent(100) and not target.soul_fragment then
if not target:hasEffect(target.EFF_SOUL_REND) then
target:setEffect(target.EFF_STUNNED, t.getDuration(self,t), {src=self, apply_power=self:combatSpellpower()})
target:setEffect(target.EFF_SOUL_REND, 6, {src=self})
local x, y = util.findFreeGrid(target.x, target.y, 10, true, {[Map.ACTOR]=true})
if not x then return nil end
local m = soul_rend(self, target, t.getDuration(self,t), x, y)
else
local tg = {type="hit", range=10, selffire=true, talent=t}
local damage = t.getDamage(self,t)
self:project(tg, target.x, target.y, DamageType.SHADOWFROST, damage)
end
else return end
return
end,
info = function(self, t)
local dam = t.getDamage(self,t)
local dur = t.getDuration(self,t)
return ([[ Your melee attacks have a 25%% chance to rend the target's soul for 6 turns, stunning them for %d turns.
If they are already affected by Soul Rend, this instead deals %0.2f cold damage and %0.2f darkness damage.
The damage will increase with your Spellpower.]]):
format(
dur, damDesc(self, DamageType.COLD, dam/2), damDesc(self, DamageType.DARKNESS, dam/2)
)
end,
}