From 43795c605d04430921e6f9c758087a14e168238d Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Tue, 15 Nov 2011 10:45:48 +0000 Subject: [PATCH] "all" tab git-svn-id: http://svn.net-core.org/repos/t-engine4@4649 51575b47-30f0-44d4-a5cc-537603b46e54 --- .../engine/interface/GameTargeting.lua | 5 ++- game/engines/default/engine/ui/Dialog.lua | 4 +-- game/engines/default/engine/ui/ImageList.lua | 4 +-- game/engines/default/engine/ui/Inventory.lua | 29 ++++++++++++------ .../engines/default/engine/ui/ListColumns.lua | 2 +- game/modules/tome/class/GameState.lua | 2 +- .../data/general/objects/quest-artifacts.lua | 14 ++++----- .../tome/data/gfx/metal-ui/inven_tabs/all.png | Bin 0 -> 6896 bytes .../shockbolt/npc/animal_feline_snow_cat.png | Bin 0 -> 13095 bytes .../data/zones/infinite-dungeon/objects.lua | 2 +- game/modules/tome/dialogs/CharacterSheet.lua | 22 +++++++------ game/modules/tome/dialogs/ShowEquipInven.lua | 26 ++++++++++------ game/modules/tome/load.lua | 1 + 13 files changed, 68 insertions(+), 43 deletions(-) create mode 100644 game/modules/tome/data/gfx/metal-ui/inven_tabs/all.png create mode 100644 game/modules/tome/data/gfx/shockbolt/npc/animal_feline_snow_cat.png diff --git a/game/engines/default/engine/interface/GameTargeting.lua b/game/engines/default/engine/interface/GameTargeting.lua index 3a5f4c9979..77f32bec0e 100644 --- a/game/engines/default/engine/interface/GameTargeting.lua +++ b/game/engines/default/engine/interface/GameTargeting.lua @@ -73,8 +73,11 @@ function _M:targetDisplayTooltip(dx, dy) end --- Forces the tooltip to pop with the given text -function _M:tooltipDisplayAtMap(x, y, text) +function _M:tooltipDisplayAtMap(x, y, text, extra) self.tooltip:displayAtMap(nil, nil, x, y, text) + if extra then + if extra.up then self.tooltip.last_display_y = self.tooltip.last_display_y - self.tooltip.h end + end self.tooltip_x = {} end diff --git a/game/engines/default/engine/ui/Dialog.lua b/game/engines/default/engine/ui/Dialog.lua index e09e1d094c..0a232cdbc0 100644 --- a/game/engines/default/engine/ui/Dialog.lua +++ b/game/engines/default/engine/ui/Dialog.lua @@ -570,8 +570,6 @@ end function _M:toScreen(x, y, nb_keyframes) if self.__hidden then return end - if self.first_display then self:firstDisplay() end - local zoom = 1 if self.__showup then local eff = self.__showup_effect or "pop" @@ -618,6 +616,8 @@ function _M:toScreen(x, y, nb_keyframes) self:innerDisplay(x, y, nb_keyframes, tx, ty) + if self.first_display then self:firstDisplay() self.first_display = false end + -- Restiore normal opengl matrix if zoom < 1 then core.display.glScale() end core.display.glTranslate(-tx, -ty, 0) diff --git a/game/engines/default/engine/ui/ImageList.lua b/game/engines/default/engine/ui/ImageList.lua index cbde72f542..b52efc7cd5 100644 --- a/game/engines/default/engine/ui/ImageList.lua +++ b/game/engines/default/engine/ui/ImageList.lua @@ -178,9 +178,9 @@ function _M:onUse(button, forcectrl) end end -function _M:onSelect() +function _M:onSelect(how) local item = self.dlist[self.sel_j] and self.dlist[self.sel_j][self.sel_i] - if self.on_select and item then self.on_select(item) end + if self.on_select and item then self.on_select(item, how) end end function _M:display(x, y, nb_keyframes, screen_x, screen_y) diff --git a/game/engines/default/engine/ui/Inventory.lua b/game/engines/default/engine/ui/Inventory.lua index 241b0ddd81..45945f23cd 100644 --- a/game/engines/default/engine/ui/Inventory.lua +++ b/game/engines/default/engine/ui/Inventory.lua @@ -57,7 +57,7 @@ function _M:generate() self.uis = {} if self.tabslist then - self.c_tabs = ImageList.new{width=self.w, height=36, tile_w=32, tile_h=32, padding=5, force_size=true, selection="ctrl-multiple", list=self.tabslist, fct=function() self:generateList() end, on_select=function(item) self:selectTab(item) end} + self.c_tabs = ImageList.new{width=self.w, height=36, tile_w=32, tile_h=32, padding=5, force_size=true, selection="ctrl-multiple", list=self.tabslist, fct=function() self:generateList() end, on_select=function(item, how) self:selectTab(item, how) end} self.c_tabs.no_keyboard_focus = true if _M._last_tabs then for _, l in ipairs(_M._last_tabs) do self.c_tabs.dlist[l[1]][l[2]].selected = true end @@ -100,14 +100,14 @@ function _M:generate() 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, #self.tabslist) self.c_tabs:onUse("left") self.c_tabs:onSelect() end, - [{"_TAB","ctrl"}] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i-1, 1, self.tabslist) self.c_tabs:onUse("left", false) self.c_tabs:onSelect() end, + _TAB = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i+1, 1, #self.tabslist) self.c_tabs:onUse("left") self.c_tabs:onSelect("key") end, + [{"_TAB","ctrl"}] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = util.boundWrap(self.c_tabs.sel_i-1, 1, #self.tabslist) self.c_tabs:onUse("left", false) self.c_tabs:onSelect("key") end, } if self.tabslist then for i = 1, #self.tabslist do self.key:addCommands{ - ['_F'..i] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = i self.c_tabs:onUse("left") self.c_tabs:onSelect() end, - [{'_F'..i,"ctrl"}] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = i self.c_tabs:onUse("left", true) self.c_tabs:onSelect() end, + ['_F'..i] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = i self.c_tabs:onUse("left") self.c_tabs:onSelect("key") end, + [{'_F'..i,"ctrl"}] = function() self.c_tabs.sel_j = 1 self.c_tabs.sel_i = i self.c_tabs:onUse("left", true) self.c_tabs:onSelect("key") end, } end end @@ -122,15 +122,15 @@ function _M:switchTab(filter) for k, e in pairs(filter) do if d[k] == e then self.c_tabs.sel_j = 1 self.c_tabs.sel_i = i self.c_tabs:onUse("left", false) - self.c_tabs:onSelect() + self.c_tabs:onSelect("key") return end end end end -function _M:selectTab(item) +function _M:selectTab(item, how) if self.on_select_tab then self.on_select_tab(item) end - self.c_inven:onSelect() + if how == "key" then self.c_inven:onSelect() end end function _M:setInnerFocus(id) @@ -199,6 +199,14 @@ function _M:updateTabFilter() local list = self.c_tabs:getAllSelected() local checks = {} + -- Check if we selected all tabs + for i, item in ipairs(list) do + if item.data.filter == "all" then + for i, row in ipairs(self.c_tabs.dlist) do for j, item in ipairs(row) do item.selected = item.data.filter ~= "all" end end + list = self.c_tabs:getAllSelected() + end + end + for i, item in ipairs(list) do if item.data.filter == "others" then local misc @@ -210,7 +218,7 @@ function _M:updateTabFilter() return true end checks[#checks+1] = misc - else + elseif type(item.data.filter) == "function" then checks[#checks+1] = item.data.filter end end @@ -248,10 +256,13 @@ function _M:generateList(no_update) if not no_update then self.c_inven:setList(self.inven_list) + if self._last_x then self:display(self._last_x, _last_y, 0, self._last_ox, self._last_oy) end end end function _M:display(x, y, nb_keyframes, ox, oy) + self._last_x, _last_y, self._last_ox, self._last_oy = x, y, ox, oy + -- UI elements for i = 1, #self.uis do local ui = self.uis[i] diff --git a/game/engines/default/engine/ui/ListColumns.lua b/game/engines/default/engine/ui/ListColumns.lua index b5a1000b3d..576c7de887 100644 --- a/game/engines/default/engine/ui/ListColumns.lua +++ b/game/engines/default/engine/ui/ListColumns.lua @@ -247,7 +247,7 @@ end function _M:onSelect(force_refresh) local item = self.list[self.sel] - if not item or not force_refresh and self.previtem and self.previtem==item then return end + if not item or (not force_refresh and self.previtem and self.previtem==item) then return end if rawget(self, "select") then self.select(item, self.sel) end -- self.previtem = item diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua index f254a80aeb..657c88ac2a 100644 --- a/game/modules/tome/class/GameState.lua +++ b/game/modules/tome/class/GameState.lua @@ -538,7 +538,7 @@ function _M:playAmbientSounds(level, s, nb_keyframes) pos.x = math.cos(a) * r pos.y = math.sin(a) * r end - print("===playing", data.name, f, data._sound) +-- print("===playing", data.name, f, data._sound) if data._sound then if data.volume_mod then data._sound:volume(data._sound:volume() * data.volume_mod) end if data.pitch then data._sound:pitch(data.pitch) end diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua index 1b8c805e3c..64b920a7e0 100644 --- a/game/modules/tome/data/general/objects/quest-artifacts.lua +++ b/game/modules/tome/data/general/objects/quest-artifacts.lua @@ -73,7 +73,7 @@ Light around it seems to dim and you can feel its tremendous power simply by tou newEntity{ define_as = "ORB_MANY_WAYS", power_source = {unknown=true}, unique = true, quest=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "swirling orb", name = "Orb of Many Ways", level_range = {30, 30}, @@ -109,7 +109,7 @@ If used near a portal it could probably activate it.]], newEntity{ define_as = "ORB_MANY_WAYS_DEMON", power_source = {unknown=true}, unique = "Orb of Many Ways Demon", quest=true, no_unique_lore=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "swirling orb", identified=true, name = "Orb of Many Ways", level_range = {30, 30}, @@ -156,7 +156,7 @@ If used near a portal it could probably activate it.]], newEntity{ define_as = "ORB_UNDEATH", power_source = {unknown=true}, unique = true, quest=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "orb of command", name = "Orb of Undeath (Orb of Command)", level_range = {50, 50}, @@ -185,7 +185,7 @@ newEntity{ define_as = "ORB_UNDEATH", newEntity{ define_as = "ORB_DRAGON", power_source = {unknown=true}, unique = true, quest=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "orb of command", name = "Dragon Orb (Orb of Command)", level_range = {50, 50}, @@ -214,7 +214,7 @@ newEntity{ define_as = "ORB_DRAGON", newEntity{ define_as = "ORB_ELEMENTS", power_source = {unknown=true}, unique = true, quest=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "orb of command", name = "Elemental Orb (Orb of Command)", level_range = {50, 50}, @@ -243,7 +243,7 @@ newEntity{ define_as = "ORB_ELEMENTS", newEntity{ define_as = "ORB_DESTRUCTION", power_source = {unknown=true}, unique = true, quest=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "orb of command", name = "Orb of Destruction (Orb of Command)", level_range = {50, 50}, @@ -272,7 +272,7 @@ newEntity{ define_as = "ORB_DESTRUCTION", newEntity{ define_as = "ORB_SCRYING", power_source = {unknown=true}, unique = true, quest=true, no_unique_lore=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "orb of scrying", name = "Orb of Scrying", display = "*", color=colors.VIOLET, image = "object/artifact/orb_scrying.png", diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/all.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/all.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a2921f6e6b9db94ee85c722b725258b0bdfafa GIT binary patch literal 6896 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/npc/animal_feline_snow_cat.png b/game/modules/tome/data/gfx/shockbolt/npc/animal_feline_snow_cat.png new file mode 100644 index 0000000000000000000000000000000000000000..218791f4e508d8f8d60bdb1e64723163bdd3502f GIT binary patch literal 13095 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/zones/infinite-dungeon/objects.lua b/game/modules/tome/data/zones/infinite-dungeon/objects.lua index 18a146c159..22225bc013 100644 --- a/game/modules/tome/data/zones/infinite-dungeon/objects.lua +++ b/game/modules/tome/data/zones/infinite-dungeon/objects.lua @@ -23,7 +23,7 @@ load("/data/general/objects/objects.lua") newEntity{ define_as = "ORB_KNOWLEDGE", power_source = {unknown=true}, unique = true, quest=true, - type = "jewelry", subtype="orb", + type = "orb", subtype="orb", unided_name = "orb", no_unique_lore = true, name = "Orb of Knowledge", identified = true, display = "*", color=colors.VIOLET, image = "object/ruby.png", diff --git a/game/modules/tome/dialogs/CharacterSheet.lua b/game/modules/tome/dialogs/CharacterSheet.lua index 2315c5b2c4..e7d7f4f6b8 100644 --- a/game/modules/tome/dialogs/CharacterSheet.lua +++ b/game/modules/tome/dialogs/CharacterSheet.lua @@ -33,6 +33,8 @@ module(..., package.seeall, class.inherit(Dialog, mod.class.interface.TooltipsDa cs_player_dup = nil function _M:init(actor) + if _M.cs_player_dup and _M.cs_player_dup.name ~= actor.name then _M.cs_player_dup = nil end + self.actor = actor Dialog.init(self, "Character Sheet: "..self.actor.name, math.max(game.w * 0.7, 950), 500) @@ -101,7 +103,7 @@ function _M:innerDisplay(x, y, nb_keyframes) end function _M:switchTo(kind) - self:drawDialog(kind, cs_player_dup) + self:drawDialog(kind, _M.cs_player_dup) if kind == "general" then self.c_attack.selected = false self.c_defence.selected = false elseif kind == "attack" then self.c_general.selected = false self.c_defence.selected = false elseif kind == "defence" then self.c_attack.selected = false self.c_general.selected = false @@ -124,7 +126,7 @@ function _M:updateKeys() } self.key:addBinds{ - EXIT = function() cs_player_dup = game.player:clone() game:unregisterDialog(self) end, + EXIT = function() _M.cs_player_dup = game.player:clone() game:unregisterDialog(self) end, } end @@ -552,7 +554,7 @@ function _M:drawDialog(kind, actor_to_compare) s:drawColorStringBlended(self.font, WeaponTxt, w, h, 255, 255, 255, true) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return math.floor(actor:combatAttack(...)) end, "%3d", "%+.0f", 1, false, false, mean) dur_text = ("%d"):format(math.floor(player:combatAttack(o.combat)/5)) - self:mouseTooltip(self.TOOLTIP_COMBAT_ATTACK, s:drawColorStringBlended(self.font, ("Accuracy : #00ff00#%s [+%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_COMBAT_ATTACK, s:drawColorStringBlended(self.font, ("Accuracy : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatDamage(...) end, "%3d", "%+.0f", 1, false, false, dam) self:mouseTooltip(self.TOOLTIP_COMBAT_DAMAGE, s:drawColorStringBlended(self.font, ("Damage : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatAPR(...) end, "%3d", "%+.0f", 1, false, false, dam) @@ -573,7 +575,7 @@ function _M:drawDialog(kind, actor_to_compare) if mean and dam then text = compare_fields(player, actor_to_compare, function(actor, ...) return math.floor(actor:combatAttack(...)) end, "%3d", "%+.0f", 1, false, false, mean) dur_text = ("%d"):format(math.floor(player:combatAttack(player.combat)/5)) - self:mouseTooltip(self.TOOLTIP_COMBAT_ATTACK, s:drawColorStringBlended(self.font, ("Accuracy : #00ff00#%s [+%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_COMBAT_ATTACK, s:drawColorStringBlended(self.font, ("Accuracy : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatDamage(...) end, "%3d", "%+.0f", 1, false, false, dam) self:mouseTooltip(self.TOOLTIP_COMBAT_DAMAGE, s:drawColorStringBlended(self.font, ("Damage : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatAPR(...) end, "%3d", "%+.0f", 1, false, false, dam) @@ -602,7 +604,7 @@ function _M:drawDialog(kind, actor_to_compare) s:drawColorStringBlended(self.font, "#LIGHT_BLUE#Off Hand:", w, h, 255, 255, 255, true) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return math.floor(actor:combatAttack(...)) end, "%3d", "%+.0f", 1, false, false, mean) dur_text = ("%d"):format(math.floor(player:combatAttack(o.combat)/5)) - self:mouseTooltip(self.TOOLTIP_COMBAT_ATTACK, s:drawColorStringBlended(self.font, ("Accuracy : #00ff00#%s [+%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_COMBAT_ATTACK, s:drawColorStringBlended(self.font, ("Accuracy : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatDamage(...) end, "%3d", "%+.0f", offmult, false, false, dam) self:mouseTooltip(self.TOOLTIP_COMBAT_DAMAGE, s:drawColorStringBlended(self.font, ("Damage : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatAPR(...) end, "%3d", "%+.0f", 1, false, false, dam) @@ -625,7 +627,7 @@ function _M:drawDialog(kind, actor_to_compare) s:drawColorStringBlended(self.font, "#LIGHT_BLUE#Magical:", w, h, 255, 255, 255, true) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatSpellpower() end, "%3d", "%+.0f") dur_text = ("%d"):format(math.floor(player:combatSpellpower()/5)) - self:mouseTooltip(self.TOOLTIP_SPELL_POWER, s:drawColorStringBlended(self.font, ("Spellpower : #00ff00#%s [+%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_SPELL_POWER, s:drawColorStringBlended(self.font, ("Spellpower : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatSpellCrit() end, "%d%%", "%+.0f%%") self:mouseTooltip(self.TOOLTIP_SPELL_CRIT, s:drawColorStringBlended(self.font, ("Crit. chance: #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatSpellSpeed() end, "%.2f%%", "%+.2f%%", 100) @@ -633,7 +635,7 @@ function _M:drawDialog(kind, actor_to_compare) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return actor:combatMindpower() end, "%3d", "%+.0f") dur_text = ("%d"):format(math.floor(player:combatMindpower()/5)) - self:mouseTooltip(self.TOOLTIP_MINDPOWER, s:drawColorStringBlended(self.font, ("Mindpower: #00ff00#%s [+%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_MINDPOWER, s:drawColorStringBlended(self.font, ("Mindpower: #00ff00#%s"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h h = 0 w = self.w * 0.5 @@ -771,13 +773,13 @@ function _M:drawDialog(kind, actor_to_compare) s:drawColorStringBlended(self.font, "#LIGHT_BLUE#Saves:", w, h, 255, 255, 255, true) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return math.floor(actor:combatPhysicalResist(true)) end, "%3d", "%+.0f") dur_text = ("%d"):format(math.floor(player:combatPhysicalResist(true)/5)) - self:mouseTooltip(self.TOOLTIP_PHYS_SAVE, s:drawColorStringBlended(self.font, ("Physical: #00ff00#%s [-%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_PHYS_SAVE, s:drawColorStringBlended(self.font, ("Physical: #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return math.floor(actor:combatSpellResist(true)) end, "%3d", "%+.0f") dur_text = ("%d"):format(math.floor(player:combatSpellResist(true)/5)) - self:mouseTooltip(self.TOOLTIP_SPELL_SAVE, s:drawColorStringBlended(self.font, ("Spell : #00ff00#%s [-%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_SPELL_SAVE, s:drawColorStringBlended(self.font, ("Spell : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h text = compare_fields(player, actor_to_compare, function(actor, ...) return math.floor(actor:combatMentalResist(true)) end, "%3d", "%+.0f") dur_text = ("%d"):format(math.floor(player:combatMentalResist(true)/5)) - self:mouseTooltip(self.TOOLTIP_MENTAL_SAVE, s:drawColorStringBlended(self.font, ("Mental : #00ff00#%s [-%s effect duration]"):format(text, dur_text), w, h, 255, 255, 255, true)) h = h + self.font_h + self:mouseTooltip(self.TOOLTIP_MENTAL_SAVE, s:drawColorStringBlended(self.font, ("Mental : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h h = 0 w = self.w * 0.25 diff --git a/game/modules/tome/dialogs/ShowEquipInven.lua b/game/modules/tome/dialogs/ShowEquipInven.lua index c6fb97c066..5ef0c73d12 100644 --- a/game/modules/tome/dialogs/ShowEquipInven.lua +++ b/game/modules/tome/dialogs/ShowEquipInven.lua @@ -34,6 +34,15 @@ function _M:init(title, actor, filter, action, on_select) Dialog.init(self, title or "Inventory", math.max(800, game.w * 0.8), math.max(600, game.h * 0.8)) + -- Add tooltips + self.on_select = function(item) + if item.last_display_x and item.object then + game:tooltipDisplayAtMap(item.last_display_x, item.last_display_y, item.object:getDesc({do_color=true})) + elseif item.last_display_x and item.data and item.data.desc then + game:tooltipDisplayAtMap(item.last_display_x, item.last_display_y, item.data.desc, {up=true}) + end + end + self.c_doll = EquipDoll.new{actor=actor, drag_enable=true, fct = function(item, button, event) self:use(item, button, event) end, on_select = function(ui, inven, item, o) if ui.ui.last_display_x then self:select{last_display_x=ui.ui.last_display_x+ui.ui.w, last_display_y=ui.ui.last_display_y, object=o} end end, @@ -46,7 +55,8 @@ function _M:init(title, actor, filter, action, on_select) self.c_inven = Inventory.new{actor=actor, inven=actor:getInven("INVEN"), width=self.iw - 20 - self.c_doll.w, height=self.ih - 10, fct=function(item, sel, button, event) self:use(item, button, event) end, - on_select=function(item, sel) self:select(item) end, + select=function(item, sel) self:select(item) end, + select_tab=function(item) self:select(item) end, on_drag=function(item) self:onDrag(item) end, on_drag_end=function() self:onDragTakeoff() end, } @@ -70,18 +80,16 @@ function _M:init(title, actor, filter, action, on_select) EXIT = function() game:unregisterDialog(self) end, } - -- Add tooltips - self.on_select = function(item) - if item.last_display_x and item.object then - game:tooltipDisplayAtMap(item.last_display_x, item.last_display_y, item.object:getDesc({do_color=true})) - elseif item.last_display_x and item.data and item.data.desc then - game:tooltipDisplayAtMap(item.last_display_x, item.last_display_y + self.c_tabs.h, item.data.desc) - end - end self.key.any_key = function(sym) -- Control resets the tooltip if sym == self.key._LCTRL or sym == self.key._RCTRL then local i = self.cur_item self.cur_item = nil self:select(i) end end + +end + +function _M:firstDisplay() + self.cur_item = nil + self.c_inven.c_inven:onSelect(true) end function _M:on_register() diff --git a/game/modules/tome/load.lua b/game/modules/tome/load.lua index 704f9d8ff1..20183caa2d 100644 --- a/game/modules/tome/load.lua +++ b/game/modules/tome/load.lua @@ -273,6 +273,7 @@ InventoryUI.default_tabslist = function(self) {image="metal-ui/inven_tabs/quests.png", kind="quests", desc="Quest and plot related items", filter=function(o) return not o.__transmo and (o.plot or o.quest) end}, } if self.actor:attr("has_transmo") then tabslist[#tabslist+1] = {image="metal-ui/inven_tabs/chest.png", kind="transmo", desc="Transmogrification Chest", filter=function(o) return o.__transmo end} end + tabslist[#tabslist+1] = {image="metal-ui/inven_tabs/all.png", kind="all", desc="All", filter="all"} return tabslist end -- GitLab