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