From 8ccd070c5efa969769eb10ae6a9f319f5bcb9fbb Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Sun, 24 Oct 2010 02:42:39 +0000 Subject: [PATCH] Artifacts found will now be added to the known lore git-svn-id: http://svn.net-core.org/repos/t-engine4@1612 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engines/default/engine/Game.lua | 1 - game/engines/default/engine/class.lua | 4 +++ .../engine/interface/ObjectIdentify.lua | 1 + game/modules/tome/class/Game.lua | 24 +++++++++++++++--- game/modules/tome/class/Object.lua | 15 ++++++++++- game/modules/tome/class/Player.lua | 2 ++ .../tome/class/interface/PlayerLore.lua | 18 ++++++++++--- game/modules/tome/data/general/npcs/molds.lua | 2 +- .../data/general/objects/quest-artifacts.lua | 6 ++--- .../data/general/objects/world-artifacts.lua | 1 + .../modules/tome/data/maps/vaults/diggers.lua | 2 +- game/modules/tome/data/talents/gifts/call.lua | 2 +- .../tome/data/zones/ardhungol/objects.lua | 1 + .../tome/data/zones/briagh-lair/objects.lua | 2 +- .../data/zones/grushnak-pride/objects.lua | 1 + .../tome/data/zones/high-peak/objects.lua | 2 +- .../modules/tome/data/zones/moria/objects.lua | 6 ++--- .../tome/data/zones/slime-tunnels/objects.lua | 17 ------------- .../tome/data/zones/tannen-tower/objects.lua | 6 ++--- .../tome/data/zones/tempest-peak/objects.lua | 3 ++- .../zones/valley-moon-caverns/objects.lua | 17 ------------- .../tome/data/zones/vor-armoury/objects.lua | 2 +- .../tome/data/zones/vor-pride/objects.lua | 4 +-- game/modules/tome/dialogs/ShowLore.lua | 3 ++- ideas/gifts.ods | Bin 29270 -> 29279 bytes 25 files changed, 80 insertions(+), 62 deletions(-) diff --git a/game/engines/default/engine/Game.lua b/game/engines/default/engine/Game.lua index e45c11fde4..23017b43fe 100644 --- a/game/engines/default/engine/Game.lua +++ b/game/engines/default/engine/Game.lua @@ -193,7 +193,6 @@ function _M:replaceDialog(src, dest) if dest.mouse then dest.mouse:setCurrent() end end if dest.on_register then dest:on_register(src) end - if self.onRegisterDialog then self:onRegisterDialog(dest, src) end end --- Undisplay a dialog, removing its own keyhandler if needed diff --git a/game/engines/default/engine/class.lua b/game/engines/default/engine/class.lua index bb01ed372b..ba02bfc002 100644 --- a/game/engines/default/engine/class.lua +++ b/game/engines/default/engine/class.lua @@ -64,6 +64,10 @@ function inherit(base, ...) if obj.init then obj:init(...) end return obj end + c.castAs = function(o) + o.__CLASSNAME = c._NAME + setmetatable(o, {__index=c}) + end return c end end diff --git a/game/engines/default/engine/interface/ObjectIdentify.lua b/game/engines/default/engine/interface/ObjectIdentify.lua index 82b0f31d6b..805f4b00b8 100644 --- a/game/engines/default/engine/interface/ObjectIdentify.lua +++ b/game/engines/default/engine/interface/ObjectIdentify.lua @@ -69,6 +69,7 @@ function _M:identify(id) game.object_known_types[so.type][so.subtype][so.name] = id end end) + self:check("on_identify") end --- Get the unided name diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 36fc6d13bb..96697e7750 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -560,10 +560,14 @@ function _M:display() self:targetDisplayTooltip(self.w, self.h) end ---- Caleld when a dialog is registered to appear on screen +--- Called when a dialog is registered to appear on screen function _M:onRegisterDialog(d) -- Clean up tooltip self.tooltip_x, self.tooltip_y = nil, nil + if self.player then self.player:updateMainShader() end +end +function _M:onUnregisterDialog(d) + if self.player then self.player:updateMainShader() end end function _M:setupCommands() @@ -634,9 +638,21 @@ function _M:setupCommands() end, [{"_g","ctrl"}] = function() if config.settings.tome.cheat then - self:changeLevel(1, "tannen-tower") --- self:changeLevel(1, "town-minas-tirith") --- self.player:grantQuest("east-portal") + local a = mod.class.NPC.new{} + a:replaceWith(self.player:cloneFull()) + mod.class.NPC.castAs(a) + engine.interface.ActorAI.init(a, a) + a.no_drops = true + a.energy.value = 0 + a.player = nil + a.rank = 4 + a.name = "Shadow of "..a.name + a.color_r = 150 a.color_g = 150 a.color_b = 150 + a._mo:invalidate() + a.ai = "dumb_talented_simple" + a.ai_state = {talent_in=1} + a.faction = "enemies" + self.zone:addEntity(self.level, a, "actor", self.player.x+1, self.player.y) end end, } diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua index 848581bd93..10afc8d47a 100644 --- a/game/modules/tome/class/Object.lua +++ b/game/modules/tome/class/Object.lua @@ -415,7 +415,12 @@ function _M:getDesc(name_param) desc:add({"color", unpack(c)}, self:getName(name_param), {"color", "WHITE"}, true) else desc:add({"color", unpack(c)}, self:getName(name_param), {"color", "WHITE"}, true) - desc:merge(self.desc) + desc:add(true) + desc:add({"color", "ANTIQUE_WHITE"}) + desc:merge(self.desc:toTString()) + desc:add(true) + desc:add(true) + desc:add({"color", "WHITE"}) end local reqs = self:getRequirementDesc(game.player) @@ -478,3 +483,11 @@ function _M:canStack(o) if not self:isIdentified() or not o:isIdentified() then return false end return engine.Object.canStack(self, o) end + +--- On identification, add to lore +function _M:on_identify() + if self.unique and self.desc and not self.no_unique_lore then + game.player:additionalLore(self:getName(), "artifacts", self.desc) + game.player:learnLore(self:getName()) + end +end diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index dc94731d53..1b16a19b8a 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -202,11 +202,13 @@ function _M:updateMainShader() elseif self:attr("invisible") then game.fbo_shader:setUniform("colorize", {0.4,0.5,0.7}) elseif self:attr("unstoppable") then game.fbo_shader:setUniform("colorize", {1,0.2,0}) elseif self:attr("lightning_speed") then game.fbo_shader:setUniform("colorize", {0.2,0.3,1}) +-- elseif game:hasDialogUp() then game.fbo_shader:setUniform("colorize", {0.9,0.9,0.9}) else game.fbo_shader:setUniform("colorize", {0,0,0}) -- Disable end -- Blur shader if self:attr("confused") then game.fbo_shader:setUniform("blur", 2) +-- elseif game:hasDialogUp() then game.fbo_shader:setUniform("blur", 3) else game.fbo_shader:setUniform("blur", 0) -- Disable end diff --git a/game/modules/tome/class/interface/PlayerLore.lua b/game/modules/tome/class/interface/PlayerLore.lua index ea43793388..92ae8b8a68 100644 --- a/game/modules/tome/class/interface/PlayerLore.lua +++ b/game/modules/tome/class/interface/PlayerLore.lua @@ -50,16 +50,28 @@ function _M:newLore(t) end function _M:init(t) + self.additional_lore = {} + self.additional_lore_nb = 0 self.lore_known = self.lore_known or {} end +function _M:knownLore(lore) + return self.lore_known[lore] and true or false +end + function _M:getLore(lore) - assert(self.lore_defs[lore], "bad lore id "..lore) - return self.lore_defs[lore] + assert(self.lore_defs[lore] or self.additional_lore[lore], "bad lore id "..lore) + return self.lore_defs[lore] or self.additional_lore[lore] +end + +function _M:additionalLore(name, category, lore) + if self.additional_lore[name] then return end + self.additional_lore_nb = self.additional_lore_nb + 1 + self.additional_lore[name] = {id=name, name=name, category=category, lore=lore, order=self.additional_lore_nb + #self.lore_defs} end function _M:learnLore(lore) - if not self.lore_known[lore] then + if not self:knownLore(lore) then local l = self:getLore(lore) Dialog:simpleLongPopup("Lore found: #0080FF#"..l.name, "#ANTIQUE_WHITE#"..l.lore, 400) game.logPlayer(self, "Lore found: #0080FF#%s", l.name) diff --git a/game/modules/tome/data/general/npcs/molds.lua b/game/modules/tome/data/general/npcs/molds.lua index 2b3dbb6560..367a5d6f86 100644 --- a/game/modules/tome/data/general/npcs/molds.lua +++ b/game/modules/tome/data/general/npcs/molds.lua @@ -85,7 +85,7 @@ newEntity{ base = "BASE_NPC_MOLD", desc = [[Steeped in fungal malevolance, this mold refused to die. How a mold becomes a skeleton, though, is beyond you. Are those its own bones, or the bones of hapless adventurers?]], level_range = {10, nil}, exp_worth = 5, - rarity = 1, + rarity = 50, max_life = resolvers.rngavg(120,150), combat = { dam=resolvers.mbonus(30, 20), atk=25, apr=15 }, diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua index c8113f7a66..a5a16c1eca 100644 --- a/game/modules/tome/data/general/objects/quest-artifacts.lua +++ b/game/modules/tome/data/general/objects/quest-artifacts.lua @@ -100,7 +100,7 @@ If used near a portal it could probably activate it.]], -- The orb of many ways, allows usage of Farportals newEntity{ define_as = "ORB_MANY_WAYS_DEMON", - unique = "Orb of Many Ways Demon", quest=true, + unique = "Orb of Many Ways Demon", quest=true, no_unique_lore=true, type = "jewelry", subtype="orb", unided_name = "swirling orb", identified=true, name = "Orb of Many Ways", @@ -255,7 +255,7 @@ newEntity{ define_as = "ORB_DESTRUCTION", ---------------------------- Various quest starters -- This one starts a quest it has a level and rarity so it can drop randomly, but there are palces where it is more likely to appear -newEntity{ base = "BASE_SCROLL", define_as = "JEWELER_TOME", subtype="tome", +newEntity{ base = "BASE_SCROLL", define_as = "JEWELER_TOME", subtype="tome", no_unique_lore=true, unique = true, quest=true, unided_name = "ancient tome", name = "Ancient Tome titled 'Gems and their uses'", @@ -273,7 +273,7 @@ newEntity{ base = "BASE_SCROLL", define_as = "JEWELER_TOME", subtype="tome", end, } -newEntity{ base = "BASE_SCROLL", define_as = "JEWELER_SUMMON", subtype="tome", +newEntity{ base = "BASE_SCROLL", define_as = "JEWELER_SUMMON", subtype="tome", no_unique_lore=true, unique = true, quest=true, identified=true, name = "Scroll of Summoning (Limmir the Jeweler)", color = colors.VIOLET, diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index 261dcce27a..e4b2bd1302 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -37,6 +37,7 @@ newEntity{ base = "BASE_STAFF", dam = 15, apr = 4, dammod = {mag=1.5}, + damtype = DamageType.ARCANE, }, wielder = { combat_spellpower = 10, diff --git a/game/modules/tome/data/maps/vaults/diggers.lua b/game/modules/tome/data/maps/vaults/diggers.lua index 47031cf01c..1d1a0c9808 100644 --- a/game/modules/tome/data/maps/vaults/diggers.lua +++ b/game/modules/tome/data/maps/vaults/diggers.lua @@ -23,7 +23,7 @@ defineTile(';', "FLOOR", nil, nil, nil, {room_map={special=false, room=false, ca defineTile('.', "FLOOR") defineTile('^', "FLOOR", nil, nil, {random_filter={}}) defineTile('X', "HARDWALL") -defineTile('#', "HARDWALL") +defineTile('#', "WALL") defineTile('!', "DOOR_VAULT") defineTile('+', "DOOR") defineTile('o', "FLOOR", nil, {random_filter={add_levels=5}}) diff --git a/game/modules/tome/data/talents/gifts/call.lua b/game/modules/tome/data/talents/gifts/call.lua index 0047f9f175..1dd54bef0b 100644 --- a/game/modules/tome/data/talents/gifts/call.lua +++ b/game/modules/tome/data/talents/gifts/call.lua @@ -34,7 +34,7 @@ newTalent{ if actor and actor ~= self then seen = true end end, nil) if seen then - game.log("There's too much going on for you to use Meditation right now!") + game.logPlayer(self, "There's too much going on for you to use Meditation right now!") return end self:setEffect(self.EFF_STUNNED, 17 - self:getTalentLevel(t), {}) diff --git a/game/modules/tome/data/zones/ardhungol/objects.lua b/game/modules/tome/data/zones/ardhungol/objects.lua index e0fc072990..0c1dad3ba1 100644 --- a/game/modules/tome/data/zones/ardhungol/objects.lua +++ b/game/modules/tome/data/zones/ardhungol/objects.lua @@ -23,6 +23,7 @@ load("/data/general/objects/lore-sunwall.lua") newEntity{ base = "BASE_WAND", define_as = "ROD_SPYDRIC_POISON", name = "Rod of Spydric Poison", color=colors.LIGHT_GREEN, unique=true, + desc = [[This rod carved out of a giant spider fang continuously drips venom.]], cost = 50, elec_proof = true, diff --git a/game/modules/tome/data/zones/briagh-lair/objects.lua b/game/modules/tome/data/zones/briagh-lair/objects.lua index 491b1617da..5ac4a7e3d2 100644 --- a/game/modules/tome/data/zones/briagh-lair/objects.lua +++ b/game/modules/tome/data/zones/briagh-lair/objects.lua @@ -20,7 +20,7 @@ load("/data/general/objects/objects.lua") newEntity{ base = "BASE_GEM", - define_as = "RESONATING_DIAMOND", + define_as = "RESONATING_DIAMOND", no_unique_lore=true, name = "Resonating Diamond", color=colors.VIOLET, quest=true, unique=true, identified=true, on_pickup = function(self, who) diff --git a/game/modules/tome/data/zones/grushnak-pride/objects.lua b/game/modules/tome/data/zones/grushnak-pride/objects.lua index 4d040ff5d5..c71465138c 100644 --- a/game/modules/tome/data/zones/grushnak-pride/objects.lua +++ b/game/modules/tome/data/zones/grushnak-pride/objects.lua @@ -26,6 +26,7 @@ local Stats = require"engine.interface.ActorStats" newEntity{ base = "BASE_RING", define_as = "PRIDE_GLORY", rarity=false, name = "Glory of the Pride", unique=true, + desc = [[The most prized treasure of the Battlemaster of the Pride, Grushnak. This gold ring is incribed in the orc tongue, the black speech.]], unided_name = "deep black ring", cost = 500, material_level = 5, diff --git a/game/modules/tome/data/zones/high-peak/objects.lua b/game/modules/tome/data/zones/high-peak/objects.lua index d1853ba589..b56f8e2a03 100644 --- a/game/modules/tome/data/zones/high-peak/objects.lua +++ b/game/modules/tome/data/zones/high-peak/objects.lua @@ -23,7 +23,7 @@ load("/data/general/objects/lore-sunwall.lua") local Stats = require "engine.interface.ActorStats" -- The staff of absorption, the reason the game exists! -newEntity{ define_as = "STAFF_ABSORPTION_AWAKENED", base="BASE_STAFF", +newEntity{ define_as = "STAFF_ABSORPTION_AWAKENED", base="BASE_STAFF", no_unique_lore=true, unique = true, name = "Awakened Staff of Absorption", identified=true, display = "\\", color=colors.VIOLET, image = "object/staff_dragonbone.png", diff --git a/game/modules/tome/data/zones/moria/objects.lua b/game/modules/tome/data/zones/moria/objects.lua index 738a99a84b..2499c0802e 100644 --- a/game/modules/tome/data/zones/moria/objects.lua +++ b/game/modules/tome/data/zones/moria/objects.lua @@ -20,7 +20,7 @@ load("/data/general/objects/objects.lua") newEntity{ base = "BASE_SCROLL", define_as = "NOTE_FROM_MINAS_TIRITH", - name = "Sealed Scroll of Minas Tirith", identified=true, unique=true, + name = "Sealed Scroll of Minas Tirith", identified=true, unique=true, no_unique_lore=true, fire_proof = true, use_simple = { name="open the seal and read the message", use = function(self, who) @@ -51,7 +51,7 @@ newEntity{ base = "BASE_WARAXE", newEntity{ base = "BASE_GEM", define_as = "RESONATING_DIAMOND_WEST", - name = "Resonating Diamond", color=colors.VIOLET, quest=true, unique="Resonating Diamond West", identified=true, + name = "Resonating Diamond", color=colors.VIOLET, quest=true, unique="Resonating Diamond West", identified=true, no_unique_lore=true, on_drop = function(self, who) if who == game.player then @@ -62,7 +62,7 @@ newEntity{ base = "BASE_GEM", } newEntity{ define_as = "ATHAME_WEST", - quest=true, unique="Blood-Runed Athame West", identified=true, + quest=true, unique="Blood-Runed Athame West", identified=true, no_unique_lore=true, type = "misc", subtype="misc", unided_name = "athame", name = "Blood-Runed Athame", diff --git a/game/modules/tome/data/zones/slime-tunnels/objects.lua b/game/modules/tome/data/zones/slime-tunnels/objects.lua index cea7eb148c..b5facd63f5 100644 --- a/game/modules/tome/data/zones/slime-tunnels/objects.lua +++ b/game/modules/tome/data/zones/slime-tunnels/objects.lua @@ -18,20 +18,3 @@ -- darkgod@te4.org load("/data/general/objects/objects.lua") - -newEntity{ base = "BASE_WAND", - define_as = "ROD_SPYDRIC_POISON", - name = "Rod of Spydric Poison", color=colors.LIGHT_GREEN, unique=true, - cost = 50, - elec_proof = true, - - max_power = 75, power_regen = 1, - use_power = { name = "shoot a bolt of spyric poison", power = 25, - use = function(self, who) - local tg = {type="bolt", range=12, talent=t} - local x, y = who:getTarget(tg) - if not x or not y then return nil end - who:project(tg, x, y, engine.DamageType.SPYDRIC_POISON, {dam=200 + who:getMag() * 4, dur=6}, {type="slime"}) - end - }, -} diff --git a/game/modules/tome/data/zones/tannen-tower/objects.lua b/game/modules/tome/data/zones/tannen-tower/objects.lua index a34e44e0cf..4e8af8cba3 100644 --- a/game/modules/tome/data/zones/tannen-tower/objects.lua +++ b/game/modules/tome/data/zones/tannen-tower/objects.lua @@ -23,7 +23,7 @@ local Stats = require "engine.interface.ActorStats" newEntity{ base = "BASE_GEM", define_as = "RESONATING_DIAMOND_WEST2", - name = "Resonating Diamond", color=colors.VIOLET, quest=true, unique="Resonating Diamond West2", identified=true, + name = "Resonating Diamond", color=colors.VIOLET, quest=true, unique="Resonating Diamond West2", identified=true, no_unique_lore=true, on_drop = function(self, who) if who == game.player then @@ -39,7 +39,7 @@ newEntity{ base = "BASE_GEM", } newEntity{ define_as = "ATHAME_WEST2", - quest=true, unique="Blood-Runed Athame West2", identified=true, + quest=true, unique="Blood-Runed Athame West2", identified=true, no_unique_lore=true, type = "misc", subtype="misc", unided_name = "athame", name = "Blood-Runed Athame", @@ -63,7 +63,7 @@ newEntity{ define_as = "ATHAME_WEST2", -- The orb of many ways, allows usage of Farportals newEntity{ define_as = "ORB_MANY_WAYS2", - unique = "Orb of Many Ways2", quest=true, + unique = "Orb of Many Ways2", quest=true, no_unique_lore=true, type = "jewelry", subtype="orb", unided_name = "swirling orb", name = "Orb of Many Ways", diff --git a/game/modules/tome/data/zones/tempest-peak/objects.lua b/game/modules/tome/data/zones/tempest-peak/objects.lua index 6162629f53..62a947f35a 100644 --- a/game/modules/tome/data/zones/tempest-peak/objects.lua +++ b/game/modules/tome/data/zones/tempest-peak/objects.lua @@ -22,7 +22,8 @@ load("/data/general/objects/objects.lua") newEntity{ base = "BASE_WAND", define_as = "ROD_OF_RECALL", name = "Rod of Recall", color=colors.LIGHT_BLUE, unique=true, - cost = 50, + desc = "This rod is made entirely of mithril, infused with raw magical energies it can bend space itself.", + cost = 100, elec_proof = true, max_power = 1000, power_regen = 1, diff --git a/game/modules/tome/data/zones/valley-moon-caverns/objects.lua b/game/modules/tome/data/zones/valley-moon-caverns/objects.lua index e0fc072990..83e657a837 100644 --- a/game/modules/tome/data/zones/valley-moon-caverns/objects.lua +++ b/game/modules/tome/data/zones/valley-moon-caverns/objects.lua @@ -19,20 +19,3 @@ load("/data/general/objects/objects.lua") load("/data/general/objects/lore-sunwall.lua") - -newEntity{ base = "BASE_WAND", - define_as = "ROD_SPYDRIC_POISON", - name = "Rod of Spydric Poison", color=colors.LIGHT_GREEN, unique=true, - cost = 50, - elec_proof = true, - - max_power = 75, power_regen = 1, - use_power = { name = "shoot a bolt of spyric poison", power = 25, - use = function(self, who) - local tg = {type="bolt", range=12, talent=t} - local x, y = who:getTarget(tg) - if not x or not y then return nil end - who:project(tg, x, y, engine.DamageType.SPYDRIC_POISON, {dam=200 + who:getMag() * 4, dur=6}, {type="slime"}) - end - }, -} diff --git a/game/modules/tome/data/zones/vor-armoury/objects.lua b/game/modules/tome/data/zones/vor-armoury/objects.lua index 488ac2c090..bcfe846390 100644 --- a/game/modules/tome/data/zones/vor-armoury/objects.lua +++ b/game/modules/tome/data/zones/vor-armoury/objects.lua @@ -47,7 +47,7 @@ newEntity{ base = "BASE_GREATSWORD", } newEntity{ define_as = "ATHAME", - quest=true, unique=true, identified=true, + quest=true, unique=true, identified=true, no_unique_lore=true, type = "misc", subtype="misc", unided_name = "athame", name = "Blood-Runed Athame", diff --git a/game/modules/tome/data/zones/vor-pride/objects.lua b/game/modules/tome/data/zones/vor-pride/objects.lua index fdac5d58c0..9fa51cd5b2 100644 --- a/game/modules/tome/data/zones/vor-pride/objects.lua +++ b/game/modules/tome/data/zones/vor-pride/objects.lua @@ -51,7 +51,7 @@ newEntity{ base = "BASE_LEATHER_CAP", -- Artifact, randomly dropped in Vor Pride, and only there newEntity{ base = "BASE_SCROLL", subtype="tome", - name = "Tome of Wildfire", unided_name = "burning book", unique=true, + name = "Tome of Wildfire", unided_name = "burning book", unique=true, no_unique_lore=true, color = colors.VIOLET, level_range = {35, 45}, rarity = 200, @@ -73,7 +73,7 @@ newEntity{ base = "BASE_SCROLL", subtype="tome", -- Artifact, randomly dropped in Vor Pride, and only there newEntity{ base = "BASE_SCROLL", subtype="tome", - name = "Tome of Uttercold", unided_name = "frozen book", unique=true, + name = "Tome of Uttercold", unided_name = "frozen book", unique=true, no_unique_lore=true, color = colors.VIOLET, level_range = {35, 45}, rarity = 200, diff --git a/game/modules/tome/dialogs/ShowLore.lua b/game/modules/tome/dialogs/ShowLore.lua index fc9e0b0708..4184638f9d 100644 --- a/game/modules/tome/dialogs/ShowLore.lua +++ b/game/modules/tome/dialogs/ShowLore.lua @@ -27,7 +27,7 @@ module(..., package.seeall, class.inherit(Dialog)) function _M:init(title, actor) self.actor = actor - local total = #actor.lore_defs + local total = #actor.lore_defs + actor.additional_lore_nb local nb = 0 for id, data in pairs(actor.lore_known) do nb = nb + 1 end @@ -66,6 +66,7 @@ function _M:generateList() list[#list+1] = { name=l.name, desc=l.lore, cat=l.category, order=l.order } i = i + 1 end + -- Add known artifacts table.sort(list, function(a, b) return a.order < b.order end) self.list = list end diff --git a/ideas/gifts.ods b/ideas/gifts.ods index 9ccfeeda9d1c03b951144efedfc465d8703a0563..dda424ad2b63212f47bfb6f43c4b1d961a1039f1 100644 GIT binary patch delta 8553 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 R+Zq=n;)n*LZTr{ke*j&5EkOVP delta 8584 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 -- GitLab