diff --git a/main.lua b/main.lua index fd68cdc..6718b3b 100644 --- a/main.lua +++ b/main.lua @@ -1,8 +1,25 @@ -- Imports local util = require("util") local window = require("window") +local entity = require("entity") local button = require("button") +function min(a, b) + if a < b then + return a + else + return b + end +end + +function max(a, b) + if a > b then + return a + else + return b + end +end + -- entities that has update method active_entities = {} @@ -38,7 +55,6 @@ screen = { } screen.mousepressed = window.mousepressed(function (self, x, y, button) - log:log(string.format("%d, %d", x, y)) current_room:mousepressed(x, y, button) end) @@ -53,11 +69,85 @@ inventory = { height = 60, selected_item = nil, items = {}, + item_idx = 1, } +local cells = math.floor((inventory.width - 60) / 60) + +function inventory:setpos(idx, item) + local x = 30 + (idx - 1) * 60 + (60 - item.width) / 2 + local y = (60 - item.height) / 2 + + item:setpos(x, y) +end + +function inventory:move(d) + self.item_idx = self.item_idx + d + + if self.item_idx < 1 then + self.item_idx = 1 + elseif self.item_idx + cells - 1 > #self.items then + self.item_idx = max(1, #self.items - cells + 1) + end + + for i = 1, min(#self.items, cells) do + local idx = self.item_idx + i - 1 + self:setpos(i, self.items[idx]) + end +end + +function inventory:pickup(item) + util.add_entity(self.items, item) + self:move(#self.items) +end + +function inventory:drop(item) + util.del_entity(self.items, item) + self:move(0) +end + +function inventory:use() + self:drop(self.selected_item) + self.selected_item = nil +end + +local move_left = entity:from{ + x = 0, y = 0, + width = 20, + height = 60, +} + +move_left.draw = window.draw(function (self) + love.graphics.polygon('line', 15, 5, 5, 30, 15, 55) +end) + +move_left.mousepressed = window.mousepressed(function (self, x, y, button) + inventory:move(-1) +end) + +local move_right = entity:from{ + x = inventory.width - 20, + y = 0, + width = 20, + height = 60, +} + +move_right.draw = window.draw(function (self) + love.graphics.polygon('line', 5, 5, 15, 30, 5, 55) +end) + +move_right.mousepressed = window.mousepressed(function (self, x, y, button) + inventory:move(1) +end) + inventory.mousepressed = window.mousepressed(function (self, x, y, button) - for i, v in ipairs(self.items) do - if v:mousepressed(x, y, button) then + move_left:mousepressed(x, y, button) + move_right:mousepressed(x, y, button) + + for i = 1, min(cells, #self.items) do + local item = self.items[self.item_idx + i - 1] + + if item:mousepressed(x, y, button) then return true end end @@ -66,9 +156,15 @@ inventory.mousepressed = window.mousepressed(function (self, x, y, button) end) inventory.draw = window.draw(function (self) - for i, item in pairs(self.items) do + move_left:draw() + move_right:draw() + + for i = 1, min(#self.items, cells) do + local idx = i + self.item_idx - 1 + local item = self.items[idx] + if self.selected_item and self.selected_item == item then - love.graphics.circle('line', 60*i - 30, 30, 25) + love.graphics.circle('line', 60*i, 30, 25) end item:draw() @@ -77,31 +173,6 @@ inventory.draw = window.draw(function (self) window.draw_border(self.width, self.height) end) -function inventory:set_pos(idx, item) - local x = (idx - 1) * 60 + (60 - item.width) / 2 - local y = (60 - item.height) / 2 - - item:setpos(x, y) -end - -function inventory:pickup(item) - util.add_entity(self.items, item) - self:set_pos(item.idx[self.items], item) -end - -function inventory:drop(item) - util.del_entity(self.items, item) - - for i, v in ipairs(self.items) do - self:set_pos(i, v) - end -end - -function inventory:use() - self:drop(self.selected_item) - self.selected_item = nil -end - log = { x = inventory.width , y = 0, width = WIDTH - screen.width,