From 6e6a26b0d2a2059e194339e31947c7ef977fb546 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 23 Oct 2011 13:11:03 +0000
Subject: [PATCH] Rod of Recall and Transmogrification Chest can not be dropped
 Overhauled transmogrification chest:<ul> <li>A new inventory tabs appears for
 the chest</li> <li>All items are automatically pickedup and put in the
 chest</li> <li>Items in the chest are weightless</li> <li>You can still
 transmogrify from the inventory menu</li> <li>When you leave the current
 level all items in the chest are transmogrified automatically</li> <li>In the
 inventory chest tab you can move an item out of the chest, it will then act
 as any other item, with an encumberance and be useable (and will not be
 transmogrified)</li> </ul>

git-svn-id: http://svn.net-core.org/repos/t-engine4@4585 51575b47-30f0-44d4-a5cc-537603b46e54
---
 .../engine/interface/ActorInventory.lua       |   7 +++
 game/modules/tome/class/Actor.lua             |  41 ++++++++++++---
 game/modules/tome/class/Game.lua              |  16 +++++-
 game/modules/tome/class/Object.lua            |   3 ++
 game/modules/tome/class/Player.lua            |  12 ++++-
 .../data/general/objects/quest-artifacts.lua  |   7 +++
 .../data/gfx/metal-ui/inven_tabs/chest.png    | Bin 0 -> 4802 bytes
 .../data/zones/shertul-fortress/objects.lua   |  47 ++++++------------
 game/modules/tome/dialogs/ShowEquipInven.lua  |  27 ++++++----
 game/modules/tome/dialogs/UseItemDialog.lua   |  19 ++++---
 10 files changed, 122 insertions(+), 57 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/metal-ui/inven_tabs/chest.png

diff --git a/game/engines/default/engine/interface/ActorInventory.lua b/game/engines/default/engine/interface/ActorInventory.lua
index f53228efa6..49b92a5a08 100644
--- a/game/engines/default/engine/interface/ActorInventory.lua
+++ b/game/engines/default/engine/interface/ActorInventory.lua
@@ -219,6 +219,10 @@ function _M:onRemoveObject(o)
 	o.carried = nil
 end
 
+--- Called upon dropping an object
+function _M:onDropObject(o)
+end
+
 --- Drop an object on the floor
 -- @param inven the inventory to drop from
 -- @param item the item id to drop
@@ -232,6 +236,9 @@ function _M:dropFloor(inven, item, vocal, all)
 	if o:check("on_drop", self) then return false end
 
 	o = self:removeObject(inven, item, all)
+
+	self:onDropObject(o)
+
 	local ok, idx = game.level.map:addObject(self.x, self.y, o)
 
 	if vocal then game.logSeen(self, "%s drops on the floor: %s.", self.name:capitalize(), o:getName{do_color=true}) end
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index ce38ef4bc0..aeac534524 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -252,7 +252,7 @@ function _M:useEnergy(val)
 			stalk.hit_turns = 0
 		end
 	end
-	
+
 	-- Curse of Shrouds: turn shroud of passing on or off
 	local eff = self:hasEffect(self.EFF_CURSE_OF_SHROUDS)
 	if eff then self.tempeffect_def[self.EFF_CURSE_OF_SHROUDS].doShroudOfPassing(self, eff) end
@@ -631,7 +631,7 @@ function _M:move(x, y, force)
 		if not force and moved and (self.x ~= ox or self.y ~= oy) and not self.did_energy then
 			local eff = self:hasEffect(self.EFF_CURSE_OF_SHROUDS)
 			if eff then eff.moved = true end
-	
+
 			self:useEnergy(game.energy_to_act * self:combatMovementSpeed())
 		end
 	end
@@ -659,7 +659,7 @@ function _M:move(x, y, force)
 			t.chooseCursedAuraTree(self, t)
 		end
 	end
-	
+
 	if moved and self:knowTalent(self.T_DEFILING_TOUCH) then
 		local t = self:getTalentFromId(self.T_DEFILING_TOUCH)
 		t.curseFloor(self, t, x, y)
@@ -1662,7 +1662,7 @@ function _M:die(src, death_note)
 			end
 		end)
 	end
-	
+
 	-- Curse of Corpses: Corpselight
 	-- Curse of Corpses: Reprieve from Death
 	if src and src.hasEffect and src:hasEffect(src.EFF_CURSE_OF_CORPSES) then
@@ -1672,7 +1672,7 @@ function _M:die(src, death_note)
 			def.doCorpselight(src, eff, self)
 		end
 	end
-	
+
 	-- Curse of Shrouds: Shroud of Death
 	if src and src.hasEffect and src:hasEffect(src.EFF_CURSE_OF_SHROUDS) then
 		local eff = src:hasEffect(src.EFF_CURSE_OF_SHROUDS)
@@ -1917,7 +1917,9 @@ function _M:getEncumbrance()
 	-- Compute encumbrance
 	for inven_id, inven in pairs(self.inven) do
 		for item, o in ipairs(inven) do
-			o:forAllStack(fct)
+			if not o.__transmo then
+				o:forAllStack(fct)
+			end
 		end
 	end
 --	print("Total encumbrance", enc)
@@ -3182,3 +3184,30 @@ function _M:addedToLevel(level, x, y)
 	self:check("on_added_to_level", level, x, y)
 end
 
+--- Called upon dropping an object
+function _M:onDropObject(o)
+	if self:attr("has_transmo") then o.__transmo = false end
+end
+
+function _M:transmoPricemod(o) if o.type == "gem" then return 0.40 else return 0.05 end end
+function _M:transmoFilter(o) if o:getPrice() <= 0 or o.quest then return false end return true end
+function _M:transmoInven(inven, idx, o)
+	local price = math.min(o:getPrice() * self:transmoPricemod(o), 25) * o:getNumber()
+	local price = math.min(o:getPrice() * self:transmoPricemod(o), 25) * o:getNumber()
+	price = math.floor(price * 100) / 100 -- Make sure we get at most 2 digit precision
+	if price ~= price or not tostring(price):find("^[0-9]") then price = 1 end -- NaN is the only value that does not equals itself, this is the way to check it since we do not have a math.isnan method
+	self:removeObject(self:getInven("INVEN"), idx, true)
+	self:sortInven()
+	self:incMoney(price)
+	if self.hasQuest and self:hasQuest("shertul-fortress") then self:hasQuest("shertul-fortress"):gain_energy(price/10) end
+	game.log("You gain %0.2f gold from the transmogrification of %s.", price, o:getName{do_count=true, do_color=true})
+end
+
+function _M:transmo()
+	local d = require("mod.dialogs.ShowInventory").new("Transmogrify", self:getInven("INVEN"), function(o) return self:transmoFilter(o) end, function(o, idx)
+		self:transmoInven(self, inven, idx, o)
+	end, self)
+	game:registerDialog(d)
+
+	return {id=true, used=true}
+end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 83172ce54c..7f86b28b2d 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -563,6 +563,18 @@ function _M:changeLevel(lev, zone, keep_old_lev, force_down, auto_zone_stair)
 		return
 	end
 
+	-- Transmo!
+	local p = self:getPlayer(true)
+	if p:attr("has_transmo") then
+		local inven = p:getInven("INVEN")
+		for i = #inven, 1, -1 do
+			local o = inven[i]
+			if o.__transmo then
+				p:transmoInven(inven, i, o)
+			end
+		end
+	end
+
 	-- Finish stuff registered for the previous level
 	self:onTickEndExecute()
 
@@ -1392,7 +1404,7 @@ function _M:setupCommands()
 		USERCHAT_SHOW_TALK = function()
 			self.show_userchat = not self.show_userchat
 		end,
-		
+
 		TOGGLE_BUMP_ATTACK = function()
 			if (self.bump_attack_disabled) then
 				self.log("Movement Mode: #LIGHT_GREEN#Default#LAST#.")
@@ -1401,7 +1413,7 @@ function _M:setupCommands()
 				self.log("Movement Mode: #LIGHT_RED#Passive#LAST#.")
 				self.bump_attack_disabled = true
 			end
-			
+
 			-- Update tooltip display if we're hovering over the icon.
 			local mx, my = core.mouse.get()
 			if (mx < self.icons.w and my > self.icons.display_y) then
diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index b6718e9a0a..66cabae4ad 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -957,6 +957,9 @@ function _M:getDesc(name_param, compare_with, never_compare)
 	if self.__new_pickup then
 		desc:add({"font","bold"},{"color","LIGHT_BLUE"},"Newly picked up",{"font","normal"},{"color","LAST"},true)
 	end
+	if self.__transmo then
+		desc:add({"font","bold"},{"color","YELLOW"},"This item will automatically be transmogrified when you leave the level.",{"font","normal"},{"color","LAST"},true)
+	end
 
 	name_param = name_param or {}
 	name_param.do_color = true
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index a4c6bdad43..19a499a92b 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -159,7 +159,15 @@ function _M:describeFloor(x, y)
 		local i, nb = 1, 0
 		local obj = game.level.map:getObject(x, y, i)
 		while obj do
-			if not ((obj.auto_pickup and not obj.unique) and self:pickupFloor(i, true)) then
+			local desc = true
+			if (obj.auto_pickup and not obj.unique) and self:pickupFloor(i, true) then desc = false end
+			if self:attr("has_transmo") and obj.__transmo == nil then
+				if self:pickupFloor(i, true) then
+					desc = false
+					obj.__transmo = true
+				end
+			end
+			if desc then
 				if self:attr("auto_id") and obj:getPowerRank() <= self.auto_id then obj:identify(true) end
 				nb = nb + 1
 				i = i + 1
@@ -1048,7 +1056,7 @@ end
 
 function _M:attackOrMoveDir(dir)
 	local tmp = game.bump_attack_disabled
-	
+
 	game.bump_attack_disabled = false
 	self:moveDir(dir)
 	game.bump_attack_disabled = tmp
diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua
index fe8e8808ad..1afa38af9f 100644
--- a/game/modules/tome/data/general/objects/quest-artifacts.lua
+++ b/game/modules/tome/data/general/objects/quest-artifacts.lua
@@ -339,4 +339,11 @@ You have heard of such items before. They are very useful to adventurers, allowi
 			return {id=true, used=true}
 		end
 	},
+
+	on_drop = function(self, who)
+		if who == game.player then
+			game.logPlayer(who, "You cannot bring yourself to drop the %s", self:getName())
+			return true
+		end
+	end,
 }
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/chest.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/chest.png
new file mode 100644
index 0000000000000000000000000000000000000000..570a71d7cfe771049aae7d0a4a8b222110933bb6
GIT binary patch
literal 4802
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/zones/shertul-fortress/objects.lua b/game/modules/tome/data/zones/shertul-fortress/objects.lua
index 737e801a7b..1133bc9bdf 100644
--- a/game/modules/tome/data/zones/shertul-fortress/objects.lua
+++ b/game/modules/tome/data/zones/shertul-fortress/objects.lua
@@ -29,45 +29,30 @@ newEntity{ base = "BASE_WAND",
 	desc = [[This chest is an extension of Yiilkgur, any items dropped inside is transported to the Fortress, processed by the core and destroyed to extract energy.
 The byproduct of this effect is the creation of gold, which is useless to the Fortress, so it is sent back to you.
 
-When activated it will prompt to destroy items on the floor, if there are none it prompts for your inventory.]],
+When you possess the chest all items you walk upon will automatically be put inside and transmogrified when you leave the level.
+Simply go to your inventory to move them out of the chest if you wish to keep them.
+Items in the chest will not encumber you.]],
 	cost = 0, quest=true,
 
+	carrier = {
+		has_transmo = 1,
+	},
+--[[
 	max_power = 1000, power_regen = 1,
-	pricemod = function(o) if o.type == "gem" then return 0.40 else return 0.05 end end,
-	transmo_filter = function(o) if o:getPrice() <= 0 or o.quest then return false end return true end,
-	transmo_inven = function(self, who, inven, idx, o)
-		local price = math.min(o:getPrice() * self.pricemod(o), 25) * o:getNumber()
-		local price = math.min(o:getPrice() * self.pricemod(o), 25) * o:getNumber()
-		price = math.floor(price * 100) / 100 -- Make sure we get at most 2 digit precision
-		if price ~= price or not tostring(price):find("^[0-9]") then price = 1 end -- NaN is the only value that does not equals itself, this is the way to check it since we do not have a math.isnan method
-		who:removeObject(who:getInven("INVEN"), idx, true)
-		who:sortInven()
-		who:incMoney(price)
-		who:hasQuest("shertul-fortress"):gain_energy(price/10)
-		game.log("You gain %0.2f gold from the transmogrification of %s.", price, o:getName{do_count=true, do_color=true})
-	end,
 	use_power = { name = "open a portal to send items to the Fortress core, extracting energies from it for the Fortress and sending back useless gold.", power = 0,
 		use = function(self, who)
-			-- On the floor or inventory
-			if game.level.map:getObjectTotal(who.x, who.y) > 0 then
-				local x, y = who.x, who.y
-				local d = require("mod.dialogs.ShowPickupFloor").new("Transmogrify", x, y, self.transmo_filter, function(o, idx)
-					local price = math.min(o:getPrice() * self.pricemod(o), 25) * o:getNumber()
-					game.level.map:removeObject(x, y, idx)
-					who:incMoney(price)
-					who:hasQuest("shertul-fortress"):gain_energy(price/10)
-					game.log("You gain %0.2f gold from the transmogrification of %s.", price, o:getName{do_count=true, do_color=true})
-				end, "Transmogrify all", who)
-				game:registerDialog(d)
-			else
-				local d = require("mod.dialogs.ShowInventory").new("Transmogrify", who:getInven("INVEN"), self.transmo_filter, function(o, idx)
-					self:transmo_inven(who, inven, idx, o)
-				end, who)
-				game:registerDialog(d)
-			end
+			who:transmo()
 			return {id=true, used=true}
 		end
 	},
+]]
+
+	on_drop = function(self, who)
+		if who == game.player then
+			game.logPlayer(who, "You cannot bring yourself to drop the %s", self:getName())
+			return true
+		end
+	end,
 }
 
 newEntity{ base = "BASE_CLOTH_ARMOR",
diff --git a/game/modules/tome/dialogs/ShowEquipInven.lua b/game/modules/tome/dialogs/ShowEquipInven.lua
index bee368ee98..6514e06326 100644
--- a/game/modules/tome/dialogs/ShowEquipInven.lua
+++ b/game/modules/tome/dialogs/ShowEquipInven.lua
@@ -50,7 +50,7 @@ function _M:init(title, actor, filter, action, on_select)
 		end
 	}
 
-	self.c_tabs = ImageList.new{width=self.iw - 20 - self.c_doll.w, height=36, tile_w=32, tile_h=32, padding=5, force_size=true, selection="ctrl-multiple", list={
+	local tabslist = {
 		{image="metal-ui/inven_tabs/weapons.png", 	kind="weapons", desc="All kinds of weapons"},
 		{image="metal-ui/inven_tabs/armors.png", 	kind="armors", desc="All kinds of armours"},
 		{image="metal-ui/inven_tabs/jewelry.png", 	kind="jewelry", desc="Rings and Amulets"},
@@ -58,7 +58,10 @@ function _M:init(title, actor, filter, action, on_select)
 		{image="metal-ui/inven_tabs/inscriptions.png", 	kind="inscriptions", desc="Infusions, Runes, ..."},
 		{image="metal-ui/inven_tabs/misc.png", 		kind="misc", desc="Miscellaneous"},
 		{image="metal-ui/inven_tabs/quests.png", 	kind="quests", desc="Quest and plot related items"},
-	}, fct=function() self:generateList() end, on_select=function(item) self:select(item) end}
+	}
+	if actor:attr("has_transmo") then tabslist[#tabslist+1] = {image="metal-ui/inven_tabs/chest.png", kind="transmo", desc="Transmogrification Chest"} end
+
+	self.c_tabs = ImageList.new{width=self.iw - 20 - self.c_doll.w, height=36, tile_w=32, tile_h=32, padding=5, force_size=true, selection="ctrl-multiple", list=tabslist, fct=function() self:generateList() end, on_select=function(item) self:select(item) end}
 	self.c_tabs.dlist[1][1].selected = true
 	self.c_tabs.no_keyboard_focus = true
 
@@ -91,8 +94,8 @@ function _M:init(title, actor, filter, action, on_select)
 				self:use(list[list.chars[c]])
 			end
 		end,
-		_TAB = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i+1, 1, 7) self.c_tabs:onUse("left") end,
-		[{"_TAB","ctrl"}] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i-1, 1, 7) self.c_tabs:onUse("left", false) end,
+		_TAB = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i+1, 1, 8) self.c_tabs:onUse("left") end,
+		[{"_TAB","ctrl"}] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i-1, 1, 8) self.c_tabs:onUse("left", false) end,
 	}
 	self.key:addBinds{
 		HOTKEY_1 = function() self:defineHotkey(1) end,
@@ -157,6 +160,7 @@ function _M:init(title, actor, filter, action, on_select)
 		SWITCH_PARTY_5 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 5 self.c_tabs:onUse("left") end,
 		SWITCH_PARTY_6 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 6 self.c_tabs:onUse("left") end,
 		SWITCH_PARTY_7 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 7 self.c_tabs:onUse("left") end,
+		SWITCH_PARTY_8 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 8 self.c_tabs:onUse("left") end,
 		ORDER_PARTY_1 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 1 self.c_tabs:onUse("left", true) end,
 		ORDER_PARTY_2 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 2 self.c_tabs:onUse("left", true) end,
 		ORDER_PARTY_3 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 3 self.c_tabs:onUse("left", true) end,
@@ -164,6 +168,7 @@ function _M:init(title, actor, filter, action, on_select)
 		ORDER_PARTY_5 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 5 self.c_tabs:onUse("left", true) end,
 		ORDER_PARTY_6 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 6 self.c_tabs:onUse("left", true) end,
 		ORDER_PARTY_7 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 7 self.c_tabs:onUse("left", true) end,
+		ORDER_PARTY_8 = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = 87 self.c_tabs:onUse("left", true) end,
 	}
 
 	-- Add tooltips
@@ -226,12 +231,13 @@ function _M:use(item, button, event)
 end
 
 local tab_filters = {
-	weapons = function(o) return o.type == "weapon" end,
-	armors = function(o) return o.type == "armor" end,
-	gems = function(o) return o.type == "gem" or o.type == "alchemist-gem" end,
-	jewelry = function(o) return o.type == "jewelry" end,
-	inscriptions = function(o) return o.type == "scroll" end,
-	quests = function(o) return o.plot or o.quest end,
+	weapons = function(o) return not o.__transmo and (o.type == "weapon") end,
+	armors = function(o) return not o.__transmo and (o.type == "armor") end,
+	gems = function(o) return not o.__transmo and (o.type == "gem" or o.type == "alchemist-gem") end,
+	jewelry = function(o) return not o.__transmo and (o.type == "jewelry") end,
+	inscriptions = function(o) return not o.__transmo and (o.type == "scroll") end,
+	quests = function(o) return not o.__transmo and (o.plot or o.quest) end,
+	transmo = function(o) return o.__transmo end,
 }
 
 function _M:updateTabFilter()
@@ -245,6 +251,7 @@ function _M:updateTabFilter()
 		elseif item.data.kind == "jewelry" then checks[#checks+1] = tab_filters.jewelry
 		elseif item.data.kind == "inscriptions" then checks[#checks+1] = tab_filters.inscriptions
 		elseif item.data.kind == "quests" then checks[#checks+1] = tab_filters.quests
+		elseif item.data.kind == "transmo" then checks[#checks+1] = tab_filters.transmo
 		elseif item.data.kind == "misc" then
 			local misc
 			misc = function(o)
diff --git a/game/modules/tome/dialogs/UseItemDialog.lua b/game/modules/tome/dialogs/UseItemDialog.lua
index b2de7bea0a..f5e8041c5c 100644
--- a/game/modules/tome/dialogs/UseItemDialog.lua
+++ b/game/modules/tome/dialogs/UseItemDialog.lua
@@ -77,9 +77,12 @@ function _M:use(item)
 	elseif act == "transmo" then
 		self:yesnoPopup("Transmogrify", "Really transmogrify "..self.object:getName{}, function(ret)
 			if not ret then return end
-			item.transmo:transmo_inven(self.actor, self.inven, self.item, self.object)
+			self.actor:transmoInven(self.inven, self.item, self.object)
 			self.onuse(self.inven, self.item, self.object, false)
 		end)
+	elseif act == "toinven" then
+		self.object.__transmo = false
+		self.onuse(self.inven, self.item, self.object, false)
 	elseif act == "chat-link" then
 		profile.chat.uc_ext:sendObjectLink(self.object)
 	end
@@ -88,13 +91,17 @@ end
 function _M:generateList()
 	local list = {}
 
-	local transmo_chest = self.actor:findInAllInventoriesBy("define_as", "TRANSMO_CHEST")
+	local transmo_chest = self.actor:attr("has_transmo")
 
-	if self.object:canUseObject() then list[#list+1] = {name="Use", action="use"} end
-	if self.inven == self.actor.INVEN_INVEN and self.object:wornInven() and self.actor:getInven(self.object:wornInven()) then list[#list+1] = {name="Wield/Wear", action="wear"} end
-	if self.inven ~= self.actor.INVEN_INVEN and self.object:wornInven() then list[#list+1] = {name="Take off", action="takeoff"} end
+	if not self.object.__transmo then
+		if self.object:canUseObject() then list[#list+1] = {name="Use", action="use"} end
+		if self.inven == self.actor.INVEN_INVEN and self.object:wornInven() and self.actor:getInven(self.object:wornInven()) then list[#list+1] = {name="Wield/Wear", action="wear"} end
+		if self.inven ~= self.actor.INVEN_INVEN and self.object:wornInven() then list[#list+1] = {name="Take off", action="takeoff"} end
+	else
+		list[#list+1] = {name="Move to normal inventory", action="toinven"}
+	end
 	if self.inven == self.actor.INVEN_INVEN then list[#list+1] = {name="Drop", action="drop"} end
-	if self.inven == self.actor.INVEN_INVEN and transmo_chest and transmo_chest.transmo_filter(self.object) then list[#list+1] = {name="Transmogrify", action="transmo", transmo=transmo_chest} end
+	if self.inven == self.actor.INVEN_INVEN and transmo_chest and self.actor:transmoFilter(self.object) then list[#list+1] = {name="Transmogrify now", action="transmo"} end
 	if profile.auth and profile.hash_valid then list[#list+1] = {name="Link item in chat", action="chat-link"} end
 
 	self.max = 0
-- 
GitLab