diff --git a/game/engine/Object.lua b/game/engine/Object.lua index 71d34262376d0fcb53f2b18e47694a7cacf20292..b82c591b3ec0a65689dab9895af3a42b91645733 100644 --- a/game/engine/Object.lua +++ b/game/engine/Object.lua @@ -147,7 +147,7 @@ function _M:forAllStack(fct) fct(self) if not self.stacked then return end for i, so in ipairs(self.stacked) do - fct(so) + if fct(so, i) then break end end end diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua index ef09b8be1ddff7dbeb83bb6add6dd022ffa829ad..a3935c645f0e73023ddb0aa5ad541e2644ffdf7e 100644 --- a/game/engine/Zone.lua +++ b/game/engine/Zone.lua @@ -485,6 +485,8 @@ function _M:getLevel(game, lev, old_lev, no_close) end function _M:getGenerator(what, level, spots) + assert(level.data.generator[what], "requested zone generator of type "..tostring(what).." but it is not defined") + assert(level.data.generator[what].class, "requested zone generator of type "..tostring(what).." but it has no class field") print("[GENERATOR] requiring", what, level.data.generator and level.data.generator[what] and level.data.generator[what].class) return require(level.data.generator[what].class).new( self, diff --git a/game/engine/interface/ActorInventory.lua b/game/engine/interface/ActorInventory.lua index 7dc5a1b940f8596315aae5330b2ff3951d0cb68b..cd93501518efc87638a757229785c71ff5229d94 100644 --- a/game/engine/interface/ActorInventory.lua +++ b/game/engine/interface/ActorInventory.lua @@ -109,16 +109,33 @@ end function _M:onAddObject(o) end +--- Rerturns the position of an item in the given inventory, or nil +function _M:itemPosition(inven, o) + inven = self:getInven(inven) + for i, p in ipairs(inven) do + local found = nil + o:forAllStack(function(so) + if p.name == so.name then found = i return true end + end) + if found then return found end + end + return nil +end + --- Picks an object from the floor -function _M:pickupFloor(i, vocal) +function _M:pickupFloor(i, vocal, no_sort) local o = game.level.map:getObject(self.x, self.y, i) if o then local prepickup = o:check("on_prepickup", self, i) if not prepickup and self:addObject(self.INVEN_INVEN, o) then game.level.map:removeObject(self.x, self.y, i) + if not no_sort then self:sortInven(self.INVEN_INVEN) end + o:check("on_pickup", self) + self:check("on_pickup_object", o) - if vocal then game.logSeen(self, "%s picks up: %s.", self.name:capitalize(), o:getName{do_color=true}) end + local letter = string.char(string.byte('a') + (self:itemPosition(self.INVEN_INVEN, o) - 1 or 0)) + if vocal then game.logSeen(self, "%s picks up (%s.): %s.", self.name:capitalize(), letter, o:getName{do_color=true}) end elseif not prepickup then if vocal then game.logSeen(self, "%s has no room for: %s.", self.name:capitalize(), o:getName{do_color=true}) end end @@ -337,6 +354,7 @@ end --- Re-order inventory, sorting and stacking it function _M:sortInven(inven) if not inven then inven = self.inven[self.INVEN_INVEN] end + inven = self:getInven(inven) -- Stack objects first, from bottom for i = #inven, 1, -1 do diff --git a/game/engine/interface/ControlCursorSupport.lua b/game/engine/interface/ControlCursorSupport.lua index e913e8f38aa5395478d5e6eb6cc3c7c6a21295ee..bc24dadf0fe19cc721add6b94e095923beff47e7 100644 --- a/game/engine/interface/ControlCursorSupport.lua +++ b/game/engine/interface/ControlCursorSupport.lua @@ -24,8 +24,8 @@ local Dialog = require "engine.Dialog" tiles = engine.Tiles.new(16, 16) ---- Handles player running --- This should work for running inside tunnel, alongside walls, in open spaces.<br/> +--- Handles control Cursor +-- This should work for anything that has a surface and x,y,w,h,font properties. module(..., package.seeall, class.make) function _M:startCursor() diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index 77a08cadb3728d913496d4b0fd377a5ba44cf5d6..7eb5b1bc63f27959300d2dee2c6877297b036a08 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -84,7 +84,6 @@ function _M:move(x, y, force) while obj do if obj.auto_pickup then self:pickupFloor(i, true) - self:sortInven() else nb = nb + 1 i = i + 1 @@ -428,7 +427,6 @@ function _M:playerPickup() local titleupdator = self:getEncumberTitleUpdator("Pickup") local d d = self:showPickupFloor(titleupdator(), nil, function(o, item) self:pickupFloor(item, true) - self:sortInven() self.changed = true d.title = titleupdator() d:used() diff --git a/game/special/mainmenu/class/Game.lua b/game/special/mainmenu/class/Game.lua index 2e669a19261f88773187844814dd05d9965d96a8..508ea16e7c21aaa3ebbad1658ec0274b4be6a356 100644 --- a/game/special/mainmenu/class/Game.lua +++ b/game/special/mainmenu/class/Game.lua @@ -234,10 +234,15 @@ function _M:selectStepNew() end self:registerDialog(display_module) - self.step = ButtonList.new(self.mod_list, 10, 10, self.w * 0.24, (5 + 35) * #self.mod_list, nil, 5) + self.step = ButtonList.new(self.mod_list, 10, 10, self.w * 0.24, (5 + 35) * #self.mod_list, nil, 5) + self.step.dialog = display_module + self:bindKeysToStep() +end + +function _M:bindKeysToStep() self.step:setKeyHandling() self.step:setMouseHandling() - self.step.key:addBind("EXIT", function() self:unregisterDialog(display_module) self:selectStepMain() end) + self.step.key:addBind("EXIT", function() self:unregisterDialog(self.step.dialog) self:selectStepMain() end) end function _M:selectStepLoad() diff --git a/game/special/mainmenu/dialogs/EnterName.lua b/game/special/mainmenu/dialogs/EnterName.lua index 0ccbdc8f0cc17066f91fb16c2474af3c96eacd54..3129b7c0f43a18dd7ac73ceac9b29bb1b26815f1 100644 --- a/game/special/mainmenu/dialogs/EnterName.lua +++ b/game/special/mainmenu/dialogs/EnterName.lua @@ -75,6 +75,7 @@ function _M:init(runmod) },{ EXIT = function() game:unregisterDialog(self) + game:bindKeysToStep() end }) end