From e70ca10f7944bf4c8fec48c0e3e3e014dcd38dee Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Tue, 5 Jan 2010 18:53:53 +0000 Subject: [PATCH] better FOV scrolls git-svn-id: http://svn.net-core.org/repos/t-engine4@201 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engine/DamageType.lua | 2 +- game/engine/Map.lua | 10 +-- game/engine/Tiles.lua | 2 +- game/modules/tome/class/Actor.lua | 10 +++ game/modules/tome/class/Game.lua | 10 ++- game/modules/tome/data/damage_types.lua | 42 ++++++++- .../modules/tome/data/general/grids/basic.lua | 7 ++ .../data/general/objects/egos/potions.lua | 15 ++++ .../data/general/objects/egos/scrolls.lua | 7 ++ .../tome/data/general/objects/objects.lua | 1 + .../tome/data/general/objects/potions.lua | 5 +- .../tome/data/general/objects/scrolls.lua | 89 +++++++++++++++++++ .../data/general/objects/world-artifacts.lua | 2 +- .../tome/data/talents/physical/2hweapon.lua | 9 +- .../modules/tome/data/talents/spells/fire.lua | 4 +- .../tome/data/zones/tower-amon-sul/zone.lua | 2 +- 16 files changed, 196 insertions(+), 21 deletions(-) create mode 100644 game/modules/tome/data/general/objects/egos/potions.lua create mode 100644 game/modules/tome/data/general/objects/egos/scrolls.lua create mode 100644 game/modules/tome/data/general/objects/scrolls.lua diff --git a/game/engine/DamageType.lua b/game/engine/DamageType.lua index af074e0f04..b88df71f8d 100644 --- a/game/engine/DamageType.lua +++ b/game/engine/DamageType.lua @@ -17,7 +17,7 @@ function _M:loadDefinition(file) setfenv(f, setmetatable({ DamageType = _M, Map = require("engine.Map"), - defaultProjector = function(fct) self.defaultProjector = fct end, + setDefaultProjector = function(fct) self.defaultProjector = fct end, newDamageType = function(t) self:newDamageType(t) end, }, {__index=_G})) f() diff --git a/game/engine/Map.lua b/game/engine/Map.lua index f61807c6ad..5a91ecca79 100644 --- a/game/engine/Map.lua +++ b/game/engine/Map.lua @@ -289,8 +289,8 @@ function _M:apply(x, y) if x < 0 or x >= self.w or y < 0 or y >= self.h then return end if self.lites[x + y * self.w] then self.seens[x + y * self.w] = true - self.remembers[x + y * self.w] = true self._map:setSeen(x, y, true) + self.remembers[x + y * self.w] = true self._map:setRemember(x, y, true) end end @@ -299,12 +299,12 @@ end -- Used by FOV code function _M:applyLite(x, y) if x < 0 or x >= self.w or y < 0 or y >= self.h then return end - self.lites[x + y * self.w] = true + if self.lites[x + y * self.w] or self:checkAllEntities(x, y, "always_remember") then + self.remembers[x + y * self.w] = true + self._map:setRemember(x, y, true) + end self.seens[x + y * self.w] = true - self.remembers[x + y * self.w] = true self._map:setSeen(x, y, true) - self._map:setRemember(x, y, true) - self._map:setLite(x, y, true) end --- Check all entities of the grid for a property diff --git a/game/engine/Tiles.lua b/game/engine/Tiles.lua index 4796499044..53b8d6185e 100644 --- a/game/engine/Tiles.lua +++ b/game/engine/Tiles.lua @@ -50,7 +50,7 @@ function _M:get(char, fr, fg, fb, br, bg, bb, image, alpha) if br < 0 then br = nil end if bg < 0 then bg = nil end if bb < 0 then bb = nil end - s = core.display.newTile(self.w, self.h, self.font, dochar, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb, br or 0, bg or 0, bb or 0, alpha) + s = core.display.newTile(self.w, self.h, self.font, dochar, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb, br or 0, bg or 0, bb or 0, alpha, self.use_images) -- s = core.display.drawStringNewSurface(self.font, char, fr, fg, fb) end diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 4cbc048f0e..8a0f363366 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -109,6 +109,7 @@ function _M:move(x, y, force) return moved end +--- Blink through walls function _M:probabilityTravel(x, y) local dirx, diry = x - self.x, y - self.y local tx, ty = x, y @@ -122,6 +123,15 @@ function _M:probabilityTravel(x, y) return true end +--- Reveals location surrounding the actor +function _M:magicMap(radius) + for i = self.x - radius, self.x + radius do for j = self.y - radius, self.y + radius do + if game.level.map:isBound(i, j) and core.fov.distance(self.x, self.y, i, j) < radius then + game.level.map.remembers(i, j, true) + end + end end +end + function _M:tooltip() return ("%s\n#00ffff#Level: %d\nExp: %d/%d\n#ff0000#HP: %d"):format(self.name, self.level, self.exp, self:getExpChart(self.level+1) or "---", self.life) end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 2637fb2807..be0e2c5e22 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -388,9 +388,13 @@ function _M:setupCommands() function(o, item) local ret = o:use(self.player) if ret and ret == "destroy" then - self.player:removeObject(self.player:getInven(self.player.INVEN_INVEN), item) - self.log("You have no more "..o:getName()) - self.player:sortInven() + if o.multicharge and o.multicharge > 1 then + o.multicharge = o.multicharge - 1 + else + self.player:removeObject(self.player:getInven(self.player.INVEN_INVEN), item) + self.log("You have no more "..o:getName()) + self.player:sortInven() + end end end ) diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index 8e8e607ad4..8822751e2c 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -1,5 +1,5 @@ -- The basic stuff used to damage a grid -defaultProjector(function(src, x, y, type, dam) +setDefaultProjector(function(src, x, y, type, dam) local target = game.level.map(x, y, Map.ACTOR) if target then -- Reduce damage with resistance @@ -22,6 +22,17 @@ defaultProjector(function(src, x, y, type, dam) end end) +local function tryDestroy(who, inven, destroy_prop, proof_prop, msg) + for i = #inven, 1, -1 do + local o = inven[i] + print(who, inven, destroy_prop, proof_prop, msg, "::", i) + if o[destroy_prop] and rng.percent(o[destroy_prop]) and not o[proof_prop] then + game.logPlayer(who, msg, o:getName()) + who:removeObject(inven, i) + end + end +end + newDamageType{ name = "physical", type = "PHYSICAL", } @@ -33,18 +44,47 @@ newDamageType{ -- The four elemental damges newDamageType{ name = "fire", type = "FIRE", + projector = function(src, x, y, type, dam) + DamageType.defaultProjector(src, x, y, type, dam) + local target = game.level.map(x, y, Map.ACTOR) + if target and not target:attr("fire_proof") then + tryDestroy(target, target:getInven("INVEN"), "fire_destroy", "fire_proof", "The burst of heat destroys your %s!") + end + end, } newDamageType{ name = "cold", type = "COLD", + projector = function(src, x, y, type, dam) + DamageType.defaultProjector(src, x, y, type, dam) + local target = game.level.map(x, y, Map.ACTOR) + if target and not target:attr("cold_proof") then + tryDestroy(target, target:getInven("INVEN"), "cold_destroy", "cold_proof", "The intense cold destroys your %s!") + end + end, } newDamageType{ name = "nature", type = "NATURE", } newDamageType{ name = "lightning", type = "LIGHTNING", + projector = function(src, x, y, type, dam) + DamageType.defaultProjector(src, x, y, type, dam) + local target = game.level.map(x, y, Map.ACTOR) + if target and not target:attr("elec_proof") then + tryDestroy(target, target:getInven("INVEN"), "elec_destroy", "elec_proof", "The burst of lightning destroys your %s!") + end + end, } +-- Acid detroys potions newDamageType{ name = "acid", type = "ACID", + projector = function(src, x, y, type, dam) + DamageType.defaultProjector(src, x, y, type, dam) + local target = game.level.map(x, y, Map.ACTOR) + if target and not target:attr("acid_proof") then + tryDestroy(target, target:getInven("INVEN"), "acid_destroy", "acid_proof", "The splash of acid destroys your %s!") + end + end, } -- Light up the room diff --git a/game/modules/tome/data/general/grids/basic.lua b/game/modules/tome/data/general/grids/basic.lua index c4e09bca89..aba80f915d 100644 --- a/game/modules/tome/data/general/grids/basic.lua +++ b/game/modules/tome/data/general/grids/basic.lua @@ -2,6 +2,7 @@ newEntity{ define_as = "UP_WILDERNESS", name = "exit to the wilds", display = '<', color_r=255, color_g=0, color_b=255, + always_remember = true, change_level = 1, change_zone = "wilderness", } @@ -10,6 +11,7 @@ newEntity{ define_as = "UP", name = "previous level", display = '<', color_r=255, color_g=255, color_b=0, + always_remember = true, change_level = -1, } @@ -17,6 +19,7 @@ newEntity{ define_as = "DOWN", name = "next level", display = '>', color_r=255, color_g=255, color_b=0, + always_remember = true, change_level = 1, } @@ -30,6 +33,7 @@ newEntity{ define_as = "WALL", name = "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, } @@ -38,6 +42,7 @@ newEntity{ define_as = "DOOR", name = "door", image = "terrain/granite_door1.png", display = '+', color_r=238, color_g=154, color_b=77, + always_remember = true, block_sight = true, door_opened = "DOOR_OPEN", } @@ -46,6 +51,7 @@ newEntity{ define_as = "DOOR_OPEN", name = "open door", image = "terrain/granite_door1_open.png", display = "'", color_r=238, color_g=154, color_b=77, + always_remember = true, block_move = false, block_sight = false, door_closed = "DOOR", @@ -67,6 +73,7 @@ newEntity{ define_as = "TREE", name = "tree", image = "terrain/tree.png", display = '#', color=colors.LIGHT_GREEN, + always_remember = true, block_move = true, block_sight = true, } diff --git a/game/modules/tome/data/general/objects/egos/potions.lua b/game/modules/tome/data/general/objects/egos/potions.lua new file mode 100644 index 0000000000..2d1dd0322e --- /dev/null +++ b/game/modules/tome/data/general/objects/egos/potions.lua @@ -0,0 +1,15 @@ +newEntity{ + name = "acid-proof ", prefix=true, + level_range = {1, 50}, + rarity = 4, + cost = 0.5, + acid_proof = true, +} + +newEntity{ + name = "giant ", prefix=true, + level_range = {1, 50}, + rarity = 5, + cost = 0.5, + multicharge = resolvers.mbonus(4, 2), +} diff --git a/game/modules/tome/data/general/objects/egos/scrolls.lua b/game/modules/tome/data/general/objects/egos/scrolls.lua new file mode 100644 index 0000000000..cf5d87cc3c --- /dev/null +++ b/game/modules/tome/data/general/objects/egos/scrolls.lua @@ -0,0 +1,7 @@ +newEntity{ + name = "fire-proof ", prefix=true, + level_range = {1, 50}, + rarity = 4, + cost = 0.5, + acid_proof = true, +} diff --git a/game/modules/tome/data/general/objects/objects.lua b/game/modules/tome/data/general/objects/objects.lua index f0b9326166..7309971e47 100644 --- a/game/modules/tome/data/general/objects/objects.lua +++ b/game/modules/tome/data/general/objects/objects.lua @@ -1,5 +1,6 @@ -- Usable stuff load("/data/general/objects/potions.lua") +load("/data/general/objects/scrolls.lua") -- Jewelry stuff load("/data/general/objects/jewelry.lua") diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua index 9824a4afdb..ad2670d63b 100644 --- a/game/modules/tome/data/general/objects/potions.lua +++ b/game/modules/tome/data/general/objects/potions.lua @@ -4,7 +4,9 @@ newEntity{ display = "!", color=colors.WHITE, image="object/potion-0x0.png", encumber = 0.2, stacking = true, + acid_destroy = 20, desc = [[Magical potions can have wildly different effects, from healing to killing you, beware! Most of them function better with a high Magic score]], + egos = "/data/general/objects/egos/potions.lua", egos_chance = resolvers.mbonus(10, 5), } ------------------------------------------------------- @@ -138,7 +140,7 @@ newEntity{ base = "BASE_POTION", use_simple = { name="cures poison", use = function(self, who) if who:hasEffect(who.EFF_POISONED) then who:removeEffect(who.EFF_POISONED) - game.logSeen(who, "%s cures %s from poisoning!", self:getName():capitalize(), who.name) + game.logSeen(who, "%s cure %s from poisoning!", self:getName():capitalize(), who.name) return "destroy", true end return "destroy", false @@ -206,4 +208,3 @@ newEntity{ base = "BASE_POTION", return "destroy", true end} } - diff --git a/game/modules/tome/data/general/objects/scrolls.lua b/game/modules/tome/data/general/objects/scrolls.lua new file mode 100644 index 0000000000..78ae66c791 --- /dev/null +++ b/game/modules/tome/data/general/objects/scrolls.lua @@ -0,0 +1,89 @@ +newEntity{ + define_as = "BASE_SCROLL", + type = "scroll", subtype="scroll", + display = "?", color=colors.WHITE, image="object/scroll-0x0.png", + encumber = 0.1, + stacking = true, + fire_destroy = 20, + desc = [[Magical scrolls can have wildly different effects! Most of them function better with a high Magic score]], + egos = "/data/general/objects/egos/scrolls.lua", egos_chance = resolvers.mbonus(10, 5), +} + +newEntity{ base = "BASE_SCROLL", + name = "scroll of light", + level_range = {1, 40}, + rarity = 3, + cost = 1, + + use_simple = { name="light up the surrounding area", use = function(self, who) + self:project({type="ball", range=0, friendlyfire=false, radius=15}, self.x, self.y, DamageType.LIGHT, 1) + game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) + return "destroy", true + end} +} + +newEntity{ base = "BASE_SCROLL", + name = "scroll of phase door", + level_range = {1, 30}, + rarity = 4, + cost = 3, + + use_simple = { name="teleport you randomly over a short distance", use = function(self, who) + who:teleportRandom(x, y, 15) + game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) + return "destroy", true + end} +} + +newEntity{ base = "BASE_SCROLL", + name = "scroll of teleportation", + level_range = {10, 40}, + rarity = 8, + cost = 4, + + use_simple = { name="teleport you anywhere and the level, randomly", use = function(self, who) + who:teleportRandom(x, y, 200) + game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) + return "destroy", true + end} +} + +newEntity{ base = "BASE_SCROLL", + name = "scroll of recall", + level_range = {10, 50}, + rarity = 8, + cost = 2, + + use_simple = { name="recall to your base town.", use = function(self, who) + error("****************** IMPLEMENT SCROLL OF RECALL ****************") + who:recall() + game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) + return "destroy", true + end} +} + +newEntity{ base = "BASE_SCROLL", + name = "scroll of magic mapping", + level_range = {1, 50}, + rarity = 5, + cost = 3, + + use_simple = { name="map the area directly around you", use = function(self, who) + who:magicMap(20) + game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) + return "destroy", true + end} +} + +newEntity{ base = "BASE_SCROLL", + name = "scroll of enemies detection", + level_range = {15, 35}, + rarity = 4, + cost = 5, + + use_simple = { name="detect enemies within a certain range", use = function(self, who) + who:detect(game.level.map.ACTOR, 20) + game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) + return "destroy", true + end} +} diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index ca6a7bf6c2..04d9ca15fb 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -9,7 +9,7 @@ newEntity{ encumber = 6, rarity = 100, desc = [[This unique looking staff is carved with runes of destruction.]], - cost = 10000, + cost = 5000, require = { stat = { mag=24 }, }, combat = { diff --git a/game/modules/tome/data/talents/physical/2hweapon.lua b/game/modules/tome/data/talents/physical/2hweapon.lua index af089e3b83..c2993bc1e1 100644 --- a/game/modules/tome/data/talents/physical/2hweapon.lua +++ b/game/modules/tome/data/talents/physical/2hweapon.lua @@ -39,7 +39,7 @@ newTalent{ type = {"physical/2hweapon", 2}, points = 5, cooldown = 30, - stamina = 15, + stamina = 30, require = { stat = { str=22 }, }, action = function(self, t) local weapon = self:getInven("MAINHAND")[1] @@ -81,12 +81,13 @@ newTalent{ return true end, info = function(self) - return ([[Hits the target with your weapon, if the atatck hits, the target is stunned.]]) + return ([[Tries to perform a killing blow, granting automatic critical hit. If the target ends up with low enough life it might be instantly killed. + At level 4 it drains all remaining stamina and uses it to increase the blow damage.]]) end, } newTalent{ - name = "Death Danse", + name = "Death Dance", type = {"physical/2hweapon", 3}, points = 5, cooldown = 10, @@ -95,7 +96,7 @@ newTalent{ action = function(self, t) local weapon = self:getInven("MAINHAND")[1] if not weapon or not weapon.twohanded then - game.logPlayer(self, "You cannot use Death Danse without a two handed weapon!") + game.logPlayer(self, "You cannot use Death Dance without a two handed weapon!") return nil end diff --git a/game/modules/tome/data/talents/spells/fire.lua b/game/modules/tome/data/talents/spells/fire.lua index e8f4b8b516..d97844066c 100644 --- a/game/modules/tome/data/talents/spells/fire.lua +++ b/game/modules/tome/data/talents/spells/fire.lua @@ -12,13 +12,13 @@ newTalent{ local tg = {type="bolt", range=self:getTalentRange(t)} local x, y = self:getTarget(tg) if not x or not y then return nil end - self:project(tg, x, y, DamageType.FIREBURN, self:spellCrit(15 + self:combatSpellpower(0.4) * self:getTalentLevel(t))) + self:project(tg, x, y, DamageType.ACID, self:spellCrit(15 + self:combatSpellpower(0.8) * self:getTalentLevel(t))) return true end, require = { stat = { mag=10 }, }, info = function(self, t) return ([[Conjures up a bolt of fire setting the target ablaze and doing %0.2f fire damage over 3 turns. - The damage will increase with the Magic stat]]):format(15 + self:combatSpellpower(0.4) * self:getTalentLevel(t)) + The damage will increase with the Magic stat]]):format(15 + self:combatSpellpower(0.8) * self:getTalentLevel(t)) end, } diff --git a/game/modules/tome/data/zones/tower-amon-sul/zone.lua b/game/modules/tome/data/zones/tower-amon-sul/zone.lua index b182ee1f15..a73f3476d6 100644 --- a/game/modules/tome/data/zones/tower-amon-sul/zone.lua +++ b/game/modules/tome/data/zones/tower-amon-sul/zone.lua @@ -4,7 +4,7 @@ return { level_scheme = "player", max_level = 5, width = 50, height = 50, - all_remembered = true, +-- all_remembered = true, -- all_lited = true, -- persistant = true, generator = { -- GitLab