| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- local g = love.graphics
- MenuUser = class()
- function MenuUser:init()
- self.geometry = setmetatable({}, {__index = function(t, k)
- return rawset(t, k, self.geometryFunctions[k]())[k]
- end})
- self.geometryFunctions = {
- slot1 = function()
- local u, v = ctx.u, ctx.v
- local w = u * .45
- local h = v * .15
- return {u * .5 - w / 2, v * .5 - (h * 1.5), w, h}
- end,
- remove1 = function()
- local slot1 = self.geometry.slot1
- local u, v = ctx.u, ctx.v
- local w = u * .04
- local h = v * .06
- return {slot1[1] + slot1[3] + 5, slot1[2], w, h}
- end,
- slot2 = function()
- local u, v = ctx.u, ctx.v
- local sx, sy, sw, sh = unpack(self.geometry.slot1)
- local w = u * .45
- local h = v * .15
- return {u * .5 - w / 2, sy + sh + 5, w, h}
- end,
- remove2 = function()
- local slot2 = self.geometry.slot2
- local u, v = ctx.u, ctx.v
- local w = u * .04
- local h = v * .06
- return {slot2[1] + slot2[3] + 5, slot2[2], w, h}
- end,
- slot3 = function()
- local u, v = ctx.u, ctx.v
- local sx, sy, sw, sh = unpack(self.geometry.slot2)
- local w = u * .45
- local h = v * .15
- return {u * .5 - w /2, sy + sh + 5, w, h}
- end,
- remove3 = function()
- local slot3 = self.geometry.slot3
- local u, v = ctx.u, ctx.v
- local w = u * .04
- local h = v * .06
- return {slot3[1] + slot3[3] + 5, slot3[2], w, h}
- end
- }
- self.active = false
- self:activate()
- end
- function MenuUser:activate(destination)
- -- Gather existing user saves
- self.users = {}
- if love.filesystem.exists('save') then
- love.filesystem.getDirectoryItems('save', function(file)
- if love.filesystem.isDirectory('save/' .. file) then
- local file = love.filesystem.read('save/' .. file .. '/user.json')
- local user = json.decode(file)
- self.users[user.slot] = user
- for _, list in pairs(user.runes) do
- for k in pairs(list) do
- if type(k) == 'string' and k:match('%d+') then
- list[tonumber(k)] = list[k]
- list[k] = nil
- end
- end
- end
- end
- end)
- end
- -- Initialize slots and their states
- self.slots = {}
- self.remove = {}
- for i = 1, 3 do
- self.slots[i] = ctx.gooey:add(Button, 'menu.user.slot' .. i)
- self.slots[i].geometry = function() return self.geometry['slot' .. i] end
- self.slots[i].text = self.users[i] and self.users[i].name or 'Empty Slot'
- self.slots[i].empty = not self.users[i]
- self.slots[i]:on('click', function() self:slotPicked(i) end)
- if self.users[i] then
- self.remove[i] = ctx.gooey:add(Button, 'menu.user.remove' .. i)
- self.remove[i].geometry = function() return self.geometry['remove' .. i] end
- self.remove[i].text = 'X'
- self.remove[i]:on('click', function() self:removeSlot(i) end)
- end
- end
- self.destination = destination
- end
- function MenuUser:update()
- if not self.active then return end
- end
- function MenuUser:draw()
- if not self.active then return end
- local u, v = ctx.u, ctx.v
- g.setColor(255, 255, 255)
- g.setFont('mesmerize', v * .05)
- g.printCenter('Choose a game slot', u * .5, v * .18)
- for i = 1, #self.slots do
- self.slots[i]:draw()
- if self.remove[i] then self.remove[i]:draw() end
- end
- end
- function MenuUser:keyreleased(key)
- if not self.active then return end
- if key == 'escape' then
- ctx:setPage('start')
- return true
- end
- end
- function MenuUser:resize()
- table.clear(self.geometry)
- end
- function MenuUser:slotPicked(slot)
- if not self.slots[slot].empty then
- ctx.user = self.users[slot]
- ctx:setPage(self.destination or 'campaign')
- else
- ctx.choose.user.slot = slot
- ctx:setPage('choose', self.destination)
- end
- end
- function MenuUser:removeSlot(slot)
- if not self.slots[slot].empty then
- love.filesystem.remove('save/' .. self.users[slot].name .. '/user.json')
- love.filesystem.remove('save/' .. self.users[slot].name .. '/achievements.json')
- love.filesystem.remove('save/' .. self.users[slot].name)
- ctx:setPage('select', self.destination)
- end
- end
|