diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 9e678a4c6211a434526a412425ae409651aa09e6..380512a54367166a91f9b0c69b83790ea6c9e591 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -828,7 +828,8 @@ function _M:setupCommands() end end, [{"_g","ctrl"}] = function() if config.settings.cheat then -- self.nicer_tiles:postProcessLevelTiles(self.level) - self:registerDialog(require("mod.dialogs.Donation").new(self.player)) + local m = game.zone:makeEntityByName(game.level, "actor", "NPC_COLD_DRAKE") + game.zone:addEntity(game.level, m, "actor", game.player.x + 1, game.player.y + 1) end end, } diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index c3bf21efbcca93aca124ff6eb6e0beca010c39df..9ce4cd25caca8e18f390c3abb29da9bdd795de98 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -695,6 +695,30 @@ newDamageType{ end, } +-- Inferno: fire and maybe remove suff +newDamageType{ + name = "inferno", type = "INFERNO", + projector = function(src, x, y, type, dam) + local realdam = DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam) + local target = game.level.map(x, y, Map.ACTOR) + if target and src:attr("cleansing_flames") then + local effs = {} + local status = (src:reactionToward(target) >= 0) and "detrimental" or "beneficial" + for eff_id, p in pairs(target.tmp) do + local e = target.tempeffect_def[eff_id] + if e.status == status and (e.type == "magical" or e.type == "physical" or e.type == "curse" or e.type == "hex") then + effs[#effs+1] = {"effect", eff_id} + end + end + if #effs > 0 then + local eff = rng.tableRemove(effs) + target:removeEffect(eff[2]) + end + end + return realdam + end, +} + -- Spydric poison: prevents movement newDamageType{ name = "spydric poison", type = "SPYDRIC_POISON", @@ -1082,6 +1106,7 @@ newDamageType{ projector = function(src, x, y, type, dam) DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam) local target = game.level.map(x, y, Map.ACTOR) + if not target then return end if target:checkHit(src:combatSpellpower(), target:combatPhysicalResist(), 0, 95, 20) and target:canBe("pin") then target:setEffect(target.EFF_PINNED, 2, {}, true) else diff --git a/game/modules/tome/data/general/npcs/bird.lua b/game/modules/tome/data/general/npcs/bird.lua index 2c51b1d26610713db865fd2f786755cadc08701f..6f48f26af98331b8c8cef8b2a119621556672bb1 100644 --- a/game/modules/tome/data/general/npcs/bird.lua +++ b/game/modules/tome/data/general/npcs/bird.lua @@ -73,7 +73,7 @@ newEntity{ base="BASE_NPC_BIRD", define_as = "NPC_PHOENIX", [Talents.T_HEAT]=5, [Talents.T_WILDFIRE]=5, [Talents.T_WING_BUFFET]=5, - [Talents.T_DANCING_FIRES]=5, + [Talents.T_BURNING_WAKE]=5, [Talents.T_FLAME]=5, [Talents.T_INFERNO]=5, [Talents.T_BLASTWAVE]=5, diff --git a/game/modules/tome/data/general/npcs/cold-drake.lua b/game/modules/tome/data/general/npcs/cold-drake.lua index 3c2cd34ad4d8ea1007a2e03ce9c92412cd02febd..40d6a6bbff14881912f9b437017a26b3262f8a82 100644 --- a/game/modules/tome/data/general/npcs/cold-drake.lua +++ b/game/modules/tome/data/general/npcs/cold-drake.lua @@ -60,8 +60,14 @@ newEntity{ base = "BASE_NPC_COLD_DRAKE", }, } -newEntity{ base = "BASE_NPC_COLD_DRAKE", +newEntity{ base = "BASE_NPC_COLD_DRAKE", define_as = "NPC_COLD_DRAKE", name = "cold drake", color=colors.SLATE, display="D", +-- quadrant_image = { +-- [0] = {[0] = "npc/cold_drake7.png",[1] = "npc/cold_drake1.png",}, +-- [1] = {[0] = "npc/cold_drake9.png",[1] = "npc/cold_drake3.png",}, +-- }, +-- msize_w = 2, +-- msize_h = 2, desc = [[A mature cold drake, armed with a deadly breath weapon and nasty claws.]], level_range = {14, nil}, exp_worth = 1, rarity = 3, @@ -77,7 +83,7 @@ newEntity{ base = "BASE_NPC_COLD_DRAKE", }, resolvers.talents{ - [Talents.T_SUMMON]=1, +-- [Talents.T_SUMMON]=1, [Talents.T_ICE_CLAW]=2, [Talents.T_ICE_BREATH]=3, }, diff --git a/game/modules/tome/data/general/npcs/orc-vor.lua b/game/modules/tome/data/general/npcs/orc-vor.lua index 51294e596545ab4baa20f5317804c69ac830f1a6..eb4a5c8b61b6949a965493754ac8b821ab2195b3 100644 --- a/game/modules/tome/data/general/npcs/orc-vor.lua +++ b/game/modules/tome/data/general/npcs/orc-vor.lua @@ -90,8 +90,7 @@ newEntity{ base = "BASE_NPC_ORC_VOR", [Talents.T_FIREFLASH]=5, [Talents.T_INFERNO]=5, [Talents.T_BLASTWAVE]=5, - [Talents.T_DANCING_FIRES]=5, - [Talents.T_COMBUST]=5, + [Talents.T_BURNING_WAKE]=5, [Talents.T_SPELL_SHAPING]=5, [Talents.T_ESSENCE_OF_SPEED]=1, }, diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua index 58fc02b091ffbe8a0ba8437c0b52e520804f4d56..4c937a4cec928b86ef7e7ea0dcec0a40219db817 100644 --- a/game/modules/tome/data/general/objects/boss-artifacts.lua +++ b/game/modules/tome/data/general/objects/boss-artifacts.lua @@ -791,8 +791,8 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS", o.wielder.combat_spellpower = 12 o.wielder.combat_dam = 12 o.wielder.inc_stats = o.wielder.inc_stats or {} - o.wielder.inc_stats[Stats.STAT_WIL] = 3 - o.wielder.inc_stats[Stats.STAT_CON] = 3 + o.wielder.inc_stats[engine.interface.ActorStats.STAT_WIL] = 3 + o.wielder.inc_stats[engine.interface.ActorStats.STAT_CON] = 3 o.wielder.inc_damage = o.wielder.inc_damage or {} o.wielder.inc_damage[engine.DamageType.ARCANE] = 10 who:sortInven() diff --git a/game/modules/tome/data/talents/spells/fire.lua b/game/modules/tome/data/talents/spells/fire.lua index ff42305f9e42563704a34ff303149e6deb561808..c830bd42e9e6814473d84dac0f86f79d6d8ebc34 100644 --- a/game/modules/tome/data/talents/spells/fire.lua +++ b/game/modules/tome/data/talents/spells/fire.lua @@ -36,13 +36,28 @@ newTalent{ if self:getTalentLevel(t) >= 5 then tg.type = "beam" end local x, y = self:getTarget(tg) if not x or not y then return nil end + local grids = nil if self:getTalentLevel(t) < 5 then - self:projectile(tg, x, y, DamageType.FIREBURN, self:spellCrit(t.getDamage(self, t)), {type="flame"}) + grids = self:projectile(tg, x, y, DamageType.FIREBURN, self:spellCrit(t.getDamage(self, t)), function(self, tg, x, y, grids) + game.level.map:particleEmitter(x, y, 1, "flame") + if self:attr("burning_wake") then + game.level.map:addEffect(self, x, y, 4, engine.DamageType.INFERNO, self:attr("burning_wake"), 0, 5, nil, {type="inferno"}, nil, self:spellFriendlyFire()) + end + end) else - self:project(tg, x, y, DamageType.FIREBURN, self:spellCrit(t.getDamage(self, t))) + grids = self:project(tg, x, y, DamageType.FIREBURN, self:spellCrit(t.getDamage(self, t))) local _ _, x, y = self:canProject(tg, x, y) game.level.map:particleEmitter(self.x, self.y, tg.radius, "flamebeam", {tx=x-self.x, ty=y-self.y}) end + + if self:attr("burning_wake") and grids then + for px, ys in pairs(grids) do + for py, _ in pairs(ys) do + game.level.map:addEffect(self, px, py, 4, engine.DamageType.INFERNO, self:attr("burning_wake"), 0, 5, nil, {type="inferno"}, nil, self:spellFriendlyFire()) + end + end + end + game:playSoundNear(self, "talents/fire") return true end, @@ -73,6 +88,21 @@ newTalent{ local x, y = self:getTarget(tg) if not x or not y then return nil end self:project(tg, x, y, DamageType.FLAMESHOCK, {dur=t.getStunDuration(self, t), dam=self:spellCrit(t.getDamage(self, t))}) + + if self:attr("burning_wake") then + local l = line.new(self.x, self.y, x, y) + local lx, ly = l() + local dir = lx and coord_to_dir[lx - self.x][ly - self.y] or 6 + + game.level.map:addEffect(self, + self.x, self.y, 4, + DamageType.INFERNO, self:attr("burning_wake"), + tg.radius, + dir, 55, + {type="inferno"}, + nil, self:spellFriendlyFire() + ) + end game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_fire", {radius=tg.radius, tx=x-self.x, ty=y-self.y}) game:playSoundNear(self, "talents/fire") return true @@ -107,6 +137,16 @@ newTalent{ if not x or not y then return nil end self:projectile(tg, x, y, DamageType.FIRE, self:spellCrit(t.getDamage(self, t)), function(self, tg, x, y, grids) game.level.map:particleEmitter(x, y, tg.radius, "fireflash", {radius=tg.radius, tx=x, ty=y}) + if self:attr("burning_wake") then + game.level.map:addEffect(self, + x, y, 4, + engine.DamageType.INFERNO, self:attr("burning_wake"), + tg.radius, + 5, nil, + {type="inferno"}, + nil, self:spellFriendlyFire() + ) + end end) game:playSoundNear(self, "talents/fireflash") return true @@ -143,7 +183,7 @@ newTalent{ -- Add a lasting map effect game.level.map:addEffect(self, x, y, t.getDuration(self, t), - DamageType.FIRE, t.getDamage(self, t), + DamageType.INFERNO, t.getDamage(self, t), radius, 5, nil, {type="inferno"}, diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua index 50c4c01c6b5cbac8f9368a1989c326ede9ee21f5..0b354783452baf88912963fec7d94a41f5aa3d45 100644 --- a/game/modules/tome/data/talents/spells/wildfire.lua +++ b/game/modules/tome/data/talents/spells/wildfire.lua @@ -33,6 +33,16 @@ newTalent{ local tg = {type="ball", range=0, radius=self:getTalentRange(t), friendlyfire=false, talent=t} local grids = self:project(tg, self.x, self.y, DamageType.FIREKNOCKBACK, {dist=3, dam=self:spellCrit(t.getDamage(self, t))}) game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_fire", {radius=tg.radius}) + if self:attr("burning_wake") then + game.level.map:addEffect(self, + self.x, self.y, 4, + DamageType.INFERNO, self:attr("burning_wake"), + tg.radius, + 5, nil, + {type="inferno"}, + nil, self:spellFriendlyFire() + ) + end game:playSoundNear(self, "talents/fire") return true end, @@ -44,82 +54,46 @@ newTalent{ } newTalent{ - name = "Dancing Fires", + name = "Burning Wake", type = {"spell/wildfire",2}, require = spells_req_high2, + mode = "sustained", points = 5, - mana = 35, - cooldown = 16, - tactical = { ATTACKAREA = 2 }, - range = 10, - requires_target = true, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 240) end, - getTargetCount = function(self, t) return math.ceil(self:getTalentLevel(t) + 2) end, - action = function(self, t) - local max = t.getTargetCount(self, t) - for i, act in ipairs(self.fov.actors_dist) do - if self:reactionToward(act) < 0 then - local tg = {type="hit", friendlyfire=false, talent=t} - local grids = self:project(tg, act.x, act.y, DamageType.FIREBURN, {dur=8, initial=0, dam=self:spellCrit(t.getDamage(self, t))}) - game.level.map:particleEmitter(act.x, act.y, tg.radius, "ball_fire", {radius=1}) - - max = max - 1 - if max <= 0 then break end - end - end + sustain_mana = 40, + cooldown = 30, + tactical = { BUFF=2, ATTACKAREA = 1 }, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 55) end, + activate = function(self, t) game:playSoundNear(self, "talents/fire") + local cft = self:getTalentFromId(self.T_CLEANSING_FLAMES) + return { + bw = self:addTemporaryValue("burning_wake", t.getDamage(self, t)), + cf = self:addTemporaryValue("cleansing_flames", cft.getChance(self, cft)), + } + end, + deactivate = function(self, t, p) + self:removeTemporaryValue("burning_wake", p.bw) + self:removeTemporaryValue("cleansing_flames", p.cf) return true end, info = function(self, t) local damage = t.getDamage(self, t) - local targetcount = t.getTargetCount(self, t) - return ([[Surround yourself in flames, setting all those in your line of sight ablaze and doing %0.2f fire damage over 8 turns. - At most it will affect %d foes. - The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.FIRE, damage), targetcount) + return ([[Your Flame, Flameshock, Fireflash and Blastwave spells leave a burning wake on the ground, burning all for %0.2f fire damage for 4 turns. + The damage will increase with the Magic stat]]):format(damDesc(self, DamageType.FIRE, damage)) end, } newTalent{ - name = "Combust", + name = "Cleansing Flames", type = {"spell/wildfire",3}, require = spells_req_high3, + mode = "passive", points = 5, - mana = 40, - cooldown = 14, - tactical = { ATTACKAREA = 1 }, - range = 7, - requires_target = true, - getMultiplier = function(self, t) return self:combatTalentWeaponDamage(t, 0.5, 1.5) end, - action = function(self, t) - local tg = {type="ball", range=self:getTalentRange(t), radius=2, friendlyfire=self:spellFriendlyFire(), talent=t} - local x, y = self:getTarget(tg) - if not x or not y then return nil end - - local mult = t.getMultiplier(self, t) - - self:project(tg, x, y, function(tx, ty) - local target = game.level.map(tx, ty, Map.ACTOR) - if not target then return end - if not target:hasEffect(target.EFF_BURNING) then return end - local p = target:hasEffect(target.EFF_BURNING) - local dam = p.dur * p.power - target:removeEffect(target.EFF_BURNING) - - -- Kaboom! - dam = dam * mult - DamageType:get(DamageType.FIRE).projector(self, tx, ty, DamageType.FIRE, dam) - end) - - local _ _, x, y = self:canProject(tg, x, y) - game.level.map:particleEmitter(x, y, tg.radius, "fireflash", {radius=tg.radius, tx=x, ty=y}) - - game:playSoundNear(self, "talents/fireflash") - return true - end, + getChance = function(self, t) return self:getTalentLevelRaw(t) * 10 end, info = function(self, t) - local mult = t.getMultiplier(self, t) - return ([[Disrupts all fires in a radius. All targets that were burning will combust, doing all the remaining burn damage instantly. - The combustion effect will deal %d%% of the normal burn damage.]]):format(mult * 100) + return ([[When your Burning Wake talent is active, your inferno and burning wake effects have %d%% chance each turn to remove a status effect(physical, magical, curse or hex) from the targets. + If the target is hostile it will remove a beneficial effect. + If the target is friendly it will remove a detrimental effect (but still burn).]]):format(t.getChance(self, t)) end, } diff --git a/game/modules/tome/data/zones/ancient-elven-ruins/npcs.lua b/game/modules/tome/data/zones/ancient-elven-ruins/npcs.lua index e377e9d44aef7acb3fb4b9ca725ae9de970db31e..e50c5b6d167f9c1ede726fc3785c9ce0268038fa 100644 --- a/game/modules/tome/data/zones/ancient-elven-ruins/npcs.lua +++ b/game/modules/tome/data/zones/ancient-elven-ruins/npcs.lua @@ -106,7 +106,7 @@ newEntity{ base = "BASE_NPC_MUMMY", newEntity{ base = "BASE_NPC_MUMMY", allow_infinite_dungeon = true, - name = "animated mummy wrappings", color=colors.SLATE, display='[', + name = "animated mummy wrappings", color=colors.SLATE, display='[', image="object/mummy_wrappings.png", desc = [[An animated set of mummy wrappings, without a corpse inside... It seems like it cannot move.]], level_range = {7, nil}, exp_worth = 1, rarity = 4, diff --git a/game/modules/tome/data/zones/crypt-kryl-feijan/npcs.lua b/game/modules/tome/data/zones/crypt-kryl-feijan/npcs.lua index e027c1d451cfb41b5320268d3ae276022bb98a96..b2fe96e14924d45e5e771da19471683e4d31ca88 100644 --- a/game/modules/tome/data/zones/crypt-kryl-feijan/npcs.lua +++ b/game/modules/tome/data/zones/crypt-kryl-feijan/npcs.lua @@ -60,7 +60,7 @@ newEntity{ base="BASE_NPC_MAJOR_DEMON", define_as = "KRYL_FEIJAN", [Talents.T_SOUL_ROT]=5, [Talents.T_BLOOD_BOIL]=5, [Talents.T_FLAME]=5, - [Talents.T_DANCING_FIRES]=5, + [Talents.T_BURNING_WAKE]=5, [Talents.T_WILDFIRE]=5, [Talents.T_BLOOD_GRASP]=5, [Talents.T_DARKNESS]=3, diff --git a/game/modules/tome/data/zones/town-angolwen/npcs.lua b/game/modules/tome/data/zones/town-angolwen/npcs.lua index aa808b4f319fa10676f14606e7b9a92c27f54d18..144c74179ef3ad99ec31d53bfeeb3a4ec96e67c5 100644 --- a/game/modules/tome/data/zones/town-angolwen/npcs.lua +++ b/game/modules/tome/data/zones/town-angolwen/npcs.lua @@ -64,8 +64,8 @@ newEntity{ define_as = "SUPREME_ARCHMAGE_LINANIIL", [Talents.T_WILDFIRE]=5, [Talents.T_FLAME]=5, [Talents.T_FLAMESHOCK]=5, - [Talents.T_DANCING_FIRES]=5, - [Talents.T_COMBUST]=5, + [Talents.T_BURNING_WAKE]=5, + [Talents.T_CLEANSING_FLAMES]=5, [Talents.T_MANATHRUST]=5, [Talents.T_ARCANE_POWER]=5, [Talents.T_DISRUPTION_SHIELD]=5, @@ -133,7 +133,7 @@ newEntity{ base = "BASE_NPC_ANGOLWEN_TOWN", {type="armor", subtype="cloth", autoreq=true}, }, combat_armor = 2, combat_def = 0, - resolvers.talents{ [Talents.T_FLAME]=3, [Talents.T_WILDFIRE]=3, [Talents.T_DANCING_FIRES]=3, [Talents.T_BLASTWAVE]=3, }, + resolvers.talents{ [Talents.T_FLAME]=3, [Talents.T_WILDFIRE]=3, [Talents.T_BURNING_WAKE]=3, [Talents.T_BLASTWAVE]=3, }, } newEntity{ base = "BASE_NPC_ANGOLWEN_TOWN", diff --git a/game/modules/tome/data/zones/vor-pride/npcs.lua b/game/modules/tome/data/zones/vor-pride/npcs.lua index 39294307c18223bddab611adc71dfe93bc3d9ef3..3f51177b94f732f6700fe58cee2a8aab7cb86b5e 100644 --- a/game/modules/tome/data/zones/vor-pride/npcs.lua +++ b/game/modules/tome/data/zones/vor-pride/npcs.lua @@ -64,8 +64,8 @@ newEntity{ base="BASE_NPC_ORC_VOR", define_as = "VOR", [Talents.T_FIREFLASH]=5, [Talents.T_INFERNO]=5, [Talents.T_BLASTWAVE]=5, - [Talents.T_DANCING_FIRES]=5, - [Talents.T_COMBUST]=5, + [Talents.T_CLEANSING_FLAMES]=5, + [Talents.T_BURNING_WAKE]=5, [Talents.T_FREEZE]=5, [Talents.T_ICE_STORM]=5, diff --git a/ideas/spells.ods b/ideas/spells.ods index e8cb0c01bd3765f7cb9849fa3422699f409f9529..2d7b17dc5cf60ce4ff2db07244ecb8df85050820 100644 Binary files a/ideas/spells.ods and b/ideas/spells.ods differ