From 7d959f63db58dcc5321bbbc65ebc0d69b3ad6985 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Thu, 5 Aug 2010 16:34:38 +0000 Subject: [PATCH] Implemented Body of Fire for alchemy git-svn-id: http://svn.net-core.org/repos/t-engine4@986 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engine/Game.lua | 2 + game/modules/tome/class/Actor.lua | 4 + .../tome/data/talents/spells/fire-alchemy.lua | 106 ++++++++++++------ ideas/crafting.ods | Bin 23253 -> 23255 bytes 4 files changed, 78 insertions(+), 34 deletions(-) diff --git a/game/engine/Game.lua b/game/engine/Game.lua index 85a9ae52fd..18b0bc2578 100644 --- a/game/engine/Game.lua +++ b/game/engine/Game.lua @@ -52,6 +52,8 @@ function _M:loaded() self.key = engine.Key.current self.mouse = engine.Mouse.new() self.mouse:setCurrent() + + self.__threads = self.__threads or {} end --- Defines the default fields to be saved by the savefile code diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index d36058be7f..b3fa3ae119 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -178,6 +178,10 @@ function _M:act() local t = self:getTalentFromId(self.T_THUNDERSTORM) t.do_storm(self, t) end + if self:isTalentActive(self.T_BODY_OF_FIRE) then + local t = self:getTalentFromId(self.T_BODY_OF_FIRE) + t.do_fire(self, t) + end if self:isTalentActive(self.T_HYMN_OF_MOONLIGHT) then local t = self:getTalentFromId(self.T_HYMN_OF_MOONLIGHT) t.do_beams(self, t) diff --git a/game/modules/tome/data/talents/spells/fire-alchemy.lua b/game/modules/tome/data/talents/spells/fire-alchemy.lua index fa05788054..2db3bc60c6 100644 --- a/game/modules/tome/data/talents/spells/fire-alchemy.lua +++ b/game/modules/tome/data/talents/spells/fire-alchemy.lua @@ -83,43 +83,11 @@ newTalent{ return ([[Throw a smoke bomb, blocking line of sight. The smoke dissipates after %d turns.]]):format(2 + self:combatSpellpower(0.03) * self:getTalentLevel(t)) end, } -newTalent{ - name = "Body of Fire", - type = {"spell/fire-alchemy",3}, - require = spells_req3, - cooldown = 20, - mana = 20, - points = 5, - range = 1, - action = function(self, t) - local ammo = self:hasAlchemistWeapon() - if not ammo or ammo:getNumber() < 5 then - game.logPlayer(self, "You need to ready 2 alchemist gems in your quiver.") - return - end - - local tg = {type="bolt", range=self:getTalentRange(t), nolock=true, talent=t} - local x, y = self:getTarget(tg) - if not x or not y then return nil end - local _ _, x, y = self:canProject(tg, x, y) - - for i = 1, 5 do self:removeObject(self:getInven("QUIVER"), 1) end - local power = math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t)) - self:probabilityTravel(x, y, power) - game:playSoundNear(self, "talents/arcane") - return true - end, - info = function(self, t) - return ([[Turn your body into pure flame, increasing your fire resistance, burning any creatures attacking you for %0.2f fire damage and projecting randomly fire bolts at targets in sight. - The damage will increase with Magic stat.]]): - format(math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t))) - end, -} newTalent{ name = "Magma Pool", - type = {"spell/fire-alchemy",4}, - require = spells_req4, + type = {"spell/fire-alchemy",3}, + require = spells_req3, points = 5, mana = 80, cooldown = 15, @@ -152,3 +120,73 @@ newTalent{ At level 3 it will become a beam.]]):format(math.floor((3 + self:getTalentLevel(t)) / 1.5)) end, } + +newTalent{ + name = "Body of Fire", + type = {"spell/fire-alchemy",4}, + require = spells_req4, + mode = "sustained", + cooldown = 40, + sustain_mana = 250, + points = 5, + range = 1, + proj_speed = 2, + do_fire = function(self, t) + if self:getMana() <= 0 then + local old = self.energy.value + self.energy.value = 100000 + self:useTalent(self.T_BODY_OF_FIRE) + self.energy.value = old + return + end + + local tgts = {} + local grids = core.fov.circle_grids(self.x, self.y, 5, true) + for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do + local a = game.level.map(x, y, Map.ACTOR) + if a and self:reactionToward(a) < 0 then + tgts[#tgts+1] = a + end + end end + + -- Randomly take targets + local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="bolt_fire"}} + for i = 1, math.floor(self:getTalentLevel(t)) do + if #tgts <= 0 then break end + local a, id = rng.table(tgts) + table.remove(tgts, id) + + self:projectile(tg, a.x, a.y, DamageType.FIRE, self:spellCrit(self:combatTalentSpellDamage(t, 15, 70)), {type="flame"}) + game:playSoundNear(self, "talents/fire") + end + end, + activate = function(self, t) + local res = self:combatTalentSpellDamage(t, 5, 45) + local dam = self:combatTalentSpellDamage(t, 5, 25) + + game:playSoundNear(self, "talents/fireflash") + game.logSeen(self, "#FF8000#%s turns into pure flame!", self.name:capitalize()) + return { + onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.FIRE]=dam}), + res = self:addTemporaryValue("resists", {[DamageType.FIRE] = res}), + drain = self:addTemporaryValue("mana_regen", -0.4 * self:getTalentLevelRaw(t)), + } + end, + deactivate = function(self, t, p) + game.logSeen(self, "#FF8000#The raging fire around %s calms down and disappears.", self.name) + self:removeTemporaryValue("onhit", p.onhit) + self:removeTemporaryValue("resists", p.res) + self:removeTemporaryValue("mana_regen", p.drain) + return true + end, + info = function(self, t) + return ([[Turn your body into pure flame, increasing your fire resistance by %d%%, burning any creatures attacking you for %0.2f fire damage and projecting randomly slow moving fire bolts at targets in sight doing %0.2f fire damage. + This powerful spell drains mana while active. + The damage will increase with Magic stat.]]): + format( + self:combatTalentSpellDamage(t, 5, 45), + self:combatTalentSpellDamage(t, 5, 25), + self:combatTalentSpellDamage(t, 15, 70) + ) + end, +} diff --git a/ideas/crafting.ods b/ideas/crafting.ods index e67c3b641c0a07d7243a60f88a2b59c37f3a0cce..fdce4f767aa8c74e627edf91bcf67f4fc8246c39 100644 GIT binary patch delta 3444 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 delta 3380 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 JM=a0d{1?zVQKA3< -- GitLab