diff --git a/game/engine/Object.lua b/game/engine/Object.lua index 7a5f942eb102938b2332d2d142600d03b04c4f8e..1e2ae81b584694cb0225f8323b1bbbb9528454f6 100644 --- a/game/engine/Object.lua +++ b/game/engine/Object.lua @@ -16,6 +16,13 @@ end --- Resolves the object -- This will call the entities resolver and then add to the game entities list function _M:resolve(t) + if not t then + -- Handle ided if possible + if self.resolveIdentify then + self:resolveIdentify() + end + end + engine.Entity.resolve(self, t) if not t then diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua index bf7a4a8e6ca5ace50bd359c32d795b7b7e08325c..f4f1d0eb2fc22531c3506e7c111411bd3d818b91 100644 --- a/game/engine/Zone.lua +++ b/game/engine/Zone.lua @@ -187,6 +187,7 @@ function _M:finishEntity(level, type, e, ego_chance) newname = e.name .. ego.name end print("applying ego", ego.name, "to ", e.name, "::", newname) + ego.unided_name = nil table.merge(e, ego, true) e.name = newname e.egoed = true diff --git a/game/engine/interface/ObjectIdentify.lua b/game/engine/interface/ObjectIdentify.lua new file mode 100644 index 0000000000000000000000000000000000000000..173905ba6e719455c9db0ec942d91234076c3f55 --- /dev/null +++ b/game/engine/interface/ObjectIdentify.lua @@ -0,0 +1,50 @@ +require "engine.class" + +--- Handles unidentified objects, and their identification +module(..., package.seeall, class.make) + +function _M:init(t) + if t.identified ~= nil then + self.identified = t.identified + else + self.identified = false + end +end + +--- Defines the default ided status +function _M:resolveIdentify() + if not self.unided_name then + self.unided_name = self.name + end +end + +--- Can this object be identified at all ? +-- Defaults to true, you can overload it +function _M:canIdentify() + return true +end + +--- Is the object identified ? +function _M:isIdentified() + -- Auto id by type ? + if game.object_known_types and game.object_known_types[self.type] and game.object_known_types[self.type][self.subtype] then + self.identified = game.object_known_types[self.type][self.subtype] + end + + return self.identified +end + +--- Identify the object +function _M:identify(id) + self.identified = id + if self.id_by_type then + game.object_known_types = game.object_known_types or {} + game.object_known_types[self.type] = game.object_known_types[self.type] or {} + game.object_known_types[self.type][self.subtype] = id + end +end + +--- Get the unided name +function _M:getUnidentifiedName() + return self.unided_name +end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index d2fd92178aa19b4e51707be9139ae890efc035d3..d350399c7b0e435578678d6671559a16aa8d8e19 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -217,7 +217,6 @@ function _M:display() if game.level.map:checkEntity(lx, ly, engine.Map.TERRAIN, "block_sense") then return true end end, function(map, lx, ly) local ok = false - print(game.player:attr("detect_actor"), game.level.map(lx, ly, game.level.map.ACTOR), "::", lx, ly) if game.player:attr("detect_actor") and game.level.map(lx, ly, game.level.map.ACTOR) then ok = true end if game.player:attr("detect_object") and game.level.map(lx, ly, game.level.map.OBJECT) then ok = true end -- if game.player:attr("detect_trap") and game.level.map(lx, ly, game.level.map.ACTOR) then ok = true end diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua index bcc4d5e40e817db85f3216ae256dc68b36f39c08..6ad547040561bc050acbaf043d7637fa9c7c9535 100644 --- a/game/modules/tome/class/Object.lua +++ b/game/modules/tome/class/Object.lua @@ -1,16 +1,22 @@ require "engine.class" require "engine.Object" require "engine.interface.ObjectActivable" +require "engine.interface.ObjectIdentify" local Stats = require("engine.interface.ActorStats") local Talents = require("engine.interface.ActorTalents") local DamageType = require("engine.DamageType") -module(..., package.seeall, class.inherit(engine.Object, engine.interface.ObjectActivable)) +module(..., package.seeall, class.inherit( + engine.Object, + engine.interface.ObjectActivable, + engine.interface.ObjectIdentify +)) function _M:init(t, no_default) engine.Object.init(self, t, no_default) engine.interface.ObjectActivable.init(self, t) + engine.interface.ObjectIdentify.init(self, t) end --- Can this object act at all @@ -46,12 +52,32 @@ function _M:tooltip() return self:getDesc() end +--- Describes an attribute, to expand object name +function _M:descAttribute(attr) + if attr == "MASTERY" then + local tms = {} + for ttn, i in pairs(self.wielder.talents_types_mastery) do + local tt = Talents.talents_types_def[ttn] + local cat = tt.type:gsub("/.*", "") + local name = cat:capitalize().." / "..tt.name:capitalize() + tms[#tms+1] = ("%0.2f %s"):format(i, name) + end + return table.concat(tms, ",") + elseif attr == "COMBAT" then + end +end + --- Gets the full name of the object function _M:getName() local qty = 1 local name = self.name + + if not self:isIdentified() and self:getUnidentifiedName() then name = self:getUnidentifiedName() end + -- To extend later - name = name:gsub("~", ""):gsub("#[1-9]#", ""):gsub("&", "a") + name = name:gsub("~", ""):gsub("&", "a"):gsub("#([^#]+)#", function(attr) + return self:descAttribute(attr) + end) return name end @@ -72,6 +98,10 @@ function _M:getDesc() desc[#desc+1] = ("#67AD00#%0.2f Encumberance."):format(self.encumber) end + -- Stop here if unided + if not self:isIdentified() then return table.concat(desc, "\n") end + + if self.combat then local dm = {} for stat, i in pairs(self.combat.dammod or {}) do diff --git a/game/modules/tome/data/general/objects/egos/amulets.lua b/game/modules/tome/data/general/objects/egos/amulets.lua index 9cbcde650dd68abca624945d52c6ace89bf7b444..ee15f45f5ddaf5bb91c70915cebf87f3c8de24b0 100644 --- a/game/modules/tome/data/general/objects/egos/amulets.lua +++ b/game/modules/tome/data/general/objects/egos/amulets.lua @@ -20,7 +20,7 @@ newEntity{ }, } newEntity{ - name = " of mastery", + name = " of mastery (#MASTERY#)", level_range = {1, 50}, rarity = 3, cost = 2, diff --git a/game/modules/tome/data/general/objects/jewelry.lua b/game/modules/tome/data/general/objects/jewelry.lua index 37be932e93dd679c4e875e7ef2c15d8d0a0487c4..7ed46610a016a3c9c4b029b79c654f4c605f50f6 100644 --- a/game/modules/tome/data/general/objects/jewelry.lua +++ b/game/modules/tome/data/general/objects/jewelry.lua @@ -22,52 +22,62 @@ newEntity{ newEntity{ base = "BASE_RING", name = "copper ring", color = colors.UMBER, + unided_name = "copper ring", level_range = {1, 10}, cost = 1, } newEntity{ base = "BASE_RING", name = "steel ring", color = colors.SLATE, + unided_name = "steel ring", level_range = {10, 20}, cost = 1, } newEntity{ base = "BASE_RING", name = "gold ring", color = colors.YELLOW, + unided_name = "gold ring", level_range = {20, 30}, cost = 1, } newEntity{ base = "BASE_RING", name = "galvorn ring", color = {r=50, g=50, b=50}, + unided_name = "galvorn ring", level_range = {30, 40}, cost = 1, } newEntity{ base = "BASE_RING", name = "mithril ring", color = colors.WHITE, + unided_name = "mithril ring", level_range = {40, 50}, cost = 1, } newEntity{ base = "BASE_AMULET", name = "copper amulet", color = colors.UMBER, + unided_name = "copper amulet", level_range = {1, 10}, cost = 1, } newEntity{ base = "BASE_AMULET", name = "steel amulet", color = colors.SLATE, + unided_name = "steel amulet", level_range = {10, 20}, cost = 1, } newEntity{ base = "BASE_AMULET", name = "gold amulet", color = colors.YELLOW, + unided_name = "gold amulet", level_range = {20, 30}, cost = 1, } newEntity{ base = "BASE_AMULET", name = "galvorn amulet", color = {r=50, g=50, b=50}, + unided_name = "galvorn amulet", level_range = {30, 40}, cost = 1, } newEntity{ base = "BASE_AMULET", name = "mithril amulet", color = colors.WHITE, + unided_name = "mithril amulet", level_range = {40, 50}, cost = 1, } diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua index 254eaf90a29195d2675980df2242d563e59db7e6..df5b880c9490cfa9c42cc67a964f74419776a2e6 100644 --- a/game/modules/tome/data/general/objects/potions.lua +++ b/game/modules/tome/data/general/objects/potions.lua @@ -1,6 +1,7 @@ newEntity{ define_as = "BASE_POTION", type = "potion", subtype="potion", + unided_name = "potion", id_by_type = true, display = "!", color=colors.WHITE, image="object/potion-0x0.png", encumber = 0.2, stacking = true, diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua index 514d7ff8458ef05bb92a783b3e86371e5a185366..afd6f45bb4651559f6f9bcd8d4c6ecfb955baa14 100644 --- a/game/modules/tome/data/general/objects/quest-artifacts.lua +++ b/game/modules/tome/data/general/objects/quest-artifacts.lua @@ -4,6 +4,7 @@ newEntity{ unique = true, quest=true, slot = "MAINHAND", type = "weapon", subtype="staff", + unided_name = "dark runed staff", name = "Staff of Absorption", level_range = {30, 30}, display = "\\", color=colors.VIOLET, diff --git a/game/modules/tome/data/general/objects/scrolls.lua b/game/modules/tome/data/general/objects/scrolls.lua index fb20d000b547d2482f89f9713680cfd741561825..aed384c9c69c17c3739b1754a36f933c3fec082b 100644 --- a/game/modules/tome/data/general/objects/scrolls.lua +++ b/game/modules/tome/data/general/objects/scrolls.lua @@ -1,6 +1,7 @@ newEntity{ define_as = "BASE_SCROLL", type = "scroll", subtype="scroll", + unided_name = "potion", display = "?", color=colors.WHITE, image="object/scroll-0x0.png", encumber = 0.1, stacking = true, diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index 7983052843e3dc57532297c0b0f407aa077a56c9..7dd82e0ee00c3edfd5f02d924cc766159511641c 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -4,6 +4,7 @@ newEntity{ slot = "MAINHAND", type = "weapon", subtype="staff", name = "Staff of Destruction", + unided_name = "ash staff", level_range = {20, 25}, display = "\\", color=colors.VIOLET, encumber = 6, @@ -28,6 +29,7 @@ newEntity{ slot = "LITE", type = "jewelry", subtype="lite", name = "Phial of Galadriel", + unided_name = "glowing phial", level_range = {1, 10}, display = "~", color=colors.YELLOW, encumber = 1, @@ -45,6 +47,7 @@ newEntity{ slot = "LITE", type = "jewlery", subtype="lite", name = "Arkenstone of Thrain", + unided_name = "great jewel", level_range = {20, 30}, display = "~", color=colors.YELLOW, encumber = 1, @@ -61,6 +64,7 @@ newEntity{ unique = true, type = "potion", subtype="potion", name = "Ever Refilling Potion of Healing", + unided_name = "strange potion", level_range = {35, 40}, display = '!', color=colors.VIOLET, encumber = 0.4, diff --git a/game/modules/tome/data/talents/spells/divination.lua b/game/modules/tome/data/talents/spells/divination.lua index d88efd61c5e1d13b99c3180615326fa9cc8fb355..195e9b3f1436a5d63512357051ce268c9069bf90 100644 --- a/game/modules/tome/data/talents/spells/divination.lua +++ b/game/modules/tome/data/talents/spells/divination.lua @@ -32,9 +32,30 @@ newTalent{ require = spells_req2, points = 5, mana = 20, - cooldown = 20, action = function(self, t) local rad = math.floor(0 + (self:getTalentLevel(t) - 4)) + + if self:getTalentLevel(t) < 3 then + self:showInventory("Identify object", self:getInven(self.INVEN_INVEN), nil, function(o, item) + o:identify(true) + end) + return true + end + + if self:getTalentLevel(t) >= 3 then + for i, o in ipairs(self:getInven("INVEN")) do + o:identify(true) + end + end + + if self:getTalentLevel(t) >= 4 then + while true do + local o = game.level.map:getObject(self.x, self.y, idx) + if not o then break end + o:identify(true) + end + end + return true end, info = function(self, t) diff --git a/game/modules/tome/data/zones/trollshaws/zone.lua b/game/modules/tome/data/zones/trollshaws/zone.lua index 1e64bfae787e5929de86d8a8425b0b0c9d054bf0..77297d9281196d41778eda18b8aa2d22919b6946 100644 --- a/game/modules/tome/data/zones/trollshaws/zone.lua +++ b/game/modules/tome/data/zones/trollshaws/zone.lua @@ -27,10 +27,10 @@ return { }, object = { class = "engine.generator.object.Random", - nb_object = {4, 6}, - filters = { {type="potion" }, {type="potion" }, {type="potion" }, {type="scroll" }, {}, {} } --- nb_object = {400, 600}, --- filters = { {type="jewelry", subtype="amulet" }, } +-- nb_object = {4, 6}, + filters = { {type="potion" }, {type="potion" }, {type="potion" }, {type="scroll" }, {}, {} }, + nb_object = {400, 600}, +-- filters = { {type="jewelry", subtype="amulet" }, }, }, }, levels = diff --git a/ideas/spells.ods b/ideas/spells.ods index 089b68acf359356577742b9661584516879e9727..8279b4933e879a4eb461636a55bfafe052a81904 100644 Binary files a/ideas/spells.ods and b/ideas/spells.ods differ