diff --git a/game/engine/Entity.lua b/game/engine/Entity.lua index c2e0418d5383380a3116e60c76b55474eae549f2..187bf033c228111e5b8cc860cfe4d8de25f10dc8 100644 --- a/game/engine/Entity.lua +++ b/game/engine/Entity.lua @@ -37,7 +37,7 @@ function _M:init(t, no_default) for k, e in pairs(t) do local ee = e - if type(e) == "table" then ee = table.clone(e, true) end + if type(e) == "table" and not e.__CLASSNAME then ee = table.clone(e, true) end self[k] = ee end diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index 208918d29a4b8682110cc5af9e08c61b5d906414..9d217dc9614da6f262bddbcf2427939ab56a82cb 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -222,8 +222,10 @@ newDamageType{ local feat = game.level.map(x, y, Map.TERRAIN) if feat then if feat.dig then - game.level.map(x, y, Map.TERRAIN, game.zone.grid_list[feat.dig]) - game.logSeen({x=x,y=y}, "%s turns into %s.", feat.name:capitalize(), game.zone.grid_list[feat.dig].name) + local newfeat_name = feat.dig + if type(feat.dig) == "function" then newfeat_name = feat.dig(self, x, y, feat) end + game.level.map(x, y, Map.TERRAIN, game.zone.grid_list[newfeat_name]) + game.logSeen({x=x,y=y}, "%s turns into %s.", feat.name:capitalize(), game.zone.grid_list[newfeat_name].name) end end end, diff --git a/game/modules/tome/data/talents/spells/earth.lua b/game/modules/tome/data/talents/spells/earth.lua index 5ee1e967d6463c6f8235e82de194e232a643bb0a..e21e2a29a5349d5af09a63d584b3d5913151627b 100644 --- a/game/modules/tome/data/talents/spells/earth.lua +++ b/game/modules/tome/data/talents/spells/earth.lua @@ -1,3 +1,5 @@ +local Object = require "engine.Object" + newTalent{ name = "Stone Skin", type = {"spell/earth", 1}, @@ -69,3 +71,62 @@ newTalent{ The damage will increase with the Magic stat]]):format(8 + self:combatSpellpower(0.15) * self:getTalentLevel(t)) end, } + +newTalent{ + name = "Stone Wall", + type = {"spell/earth",4}, + points = 5, + cooldown = 12, + mana = 70, + range = 20, + action = function(self, t) + local x, y = self.x, self.y + if self:getTalentLevel(t) >= 4 then +-- local tg = {type="bolt", range=self:getTalentRange(t), nolock=true} +-- local x, y = self:getTarget(tg) +-- if not x or not y then return nil end +-- for i = 1, self:getTalentLevelRaw(t) do +-- self:project(tg, x, y, DamageType.DIG, 1) +-- end + end + + for i = -1, 1 do for j = -1, 1 do if game.level.map:isBound(x + i, y + j) then + if not game.level.map:checkAllEntities(x + i, y + j, "block_move") then + -- Ok some explanation, we make a new *OBJECT* because objects can have energy and act + -- it stores the current terrain in "old_feat" and restores it when it expires + -- We CAN set an object as a terrain because they are all entities + + local e = Object.new{ + old_feat = game.level.map(x + i, y + j, Map.TERRAIN), + name = "summoned wall", image = "terrain/granite_wall1.png", + display = '#', color_r=255, color_g=255, color_b=255, + always_remember = true, + block_move = true, + block_sight = true, + temporary = 2 + self:combatSpellpower(0.03) * self:getTalentLevel(t), + x = x + i, y = y + j, + canAct = function() return true end, + act = function(self) + self:useEnergy() + self.temporary = self.temporary - 1 + if self.temporary <= 0 then + print("reseting", self.x, self.y, "to", self.old_feat, self.old_feat.name) + game.level.map(self.x, self.y, Map.TERRAIN, self.old_feat) + game:removeEntity(self) + game.level.map:redisplay() + end + end + } + game:addEntity(e) + print("setting", x+i, y+j, "to", game.level.map(x + i, y + j, Map.TERRAIN), game.level.map(x + i, y + j, Map.TERRAIN).name) + game.level.map(x + i, y + j, Map.TERRAIN, e) + end + end end end + + return true + end, + require = { stat = { mag=34 } }, + info = function(self, t) + return ([[Entombs yourself in a wall of stone for %d turns.]]):format(2 + self:combatSpellpower(0.03) * self:getTalentLevel(t)) + end, +}