menuuser.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. local g = love.graphics
  2. MenuUser = class()
  3. function MenuUser:init()
  4. self.geometry = setmetatable({}, {__index = function(t, k)
  5. return rawset(t, k, self.geometryFunctions[k]())[k]
  6. end})
  7. self.geometryFunctions = {
  8. slot1 = function()
  9. local u, v = ctx.u, ctx.v
  10. local w = u * .45
  11. local h = v * .15
  12. return {u * .5 - w / 2, v * .5 - (h * 1.5), w, h}
  13. end,
  14. remove1 = function()
  15. local slot1 = self.geometry.slot1
  16. local u, v = ctx.u, ctx.v
  17. local w = u * .04
  18. local h = v * .06
  19. return {slot1[1] + slot1[3] + 5, slot1[2], w, h}
  20. end,
  21. slot2 = function()
  22. local u, v = ctx.u, ctx.v
  23. local sx, sy, sw, sh = unpack(self.geometry.slot1)
  24. local w = u * .45
  25. local h = v * .15
  26. return {u * .5 - w / 2, sy + sh + 5, w, h}
  27. end,
  28. remove2 = function()
  29. local slot2 = self.geometry.slot2
  30. local u, v = ctx.u, ctx.v
  31. local w = u * .04
  32. local h = v * .06
  33. return {slot2[1] + slot2[3] + 5, slot2[2], w, h}
  34. end,
  35. slot3 = function()
  36. local u, v = ctx.u, ctx.v
  37. local sx, sy, sw, sh = unpack(self.geometry.slot2)
  38. local w = u * .45
  39. local h = v * .15
  40. return {u * .5 - w /2, sy + sh + 5, w, h}
  41. end,
  42. remove3 = function()
  43. local slot3 = self.geometry.slot3
  44. local u, v = ctx.u, ctx.v
  45. local w = u * .04
  46. local h = v * .06
  47. return {slot3[1] + slot3[3] + 5, slot3[2], w, h}
  48. end
  49. }
  50. self.active = false
  51. self:activate()
  52. end
  53. function MenuUser:activate(destination)
  54. -- Gather existing user saves
  55. self.users = {}
  56. if love.filesystem.exists('save') then
  57. love.filesystem.getDirectoryItems('save', function(file)
  58. if love.filesystem.isDirectory('save/' .. file) then
  59. local file = love.filesystem.read('save/' .. file .. '/user.json')
  60. local user = json.decode(file)
  61. self.users[user.slot] = user
  62. for _, list in pairs(user.runes) do
  63. for k in pairs(list) do
  64. if type(k) == 'string' and k:match('%d+') then
  65. list[tonumber(k)] = list[k]
  66. list[k] = nil
  67. end
  68. end
  69. end
  70. end
  71. end)
  72. end
  73. -- Initialize slots and their states
  74. self.slots = {}
  75. self.remove = {}
  76. for i = 1, 3 do
  77. self.slots[i] = ctx.gooey:add(Button, 'menu.user.slot' .. i)
  78. self.slots[i].geometry = function() return self.geometry['slot' .. i] end
  79. self.slots[i].text = self.users[i] and self.users[i].name or 'Empty Slot'
  80. self.slots[i].empty = not self.users[i]
  81. self.slots[i]:on('click', function() self:slotPicked(i) end)
  82. if self.users[i] then
  83. self.remove[i] = ctx.gooey:add(Button, 'menu.user.remove' .. i)
  84. self.remove[i].geometry = function() return self.geometry['remove' .. i] end
  85. self.remove[i].text = 'X'
  86. self.remove[i]:on('click', function() self:removeSlot(i) end)
  87. end
  88. end
  89. self.destination = destination
  90. end
  91. function MenuUser:update()
  92. if not self.active then return end
  93. end
  94. function MenuUser:draw()
  95. if not self.active then return end
  96. local u, v = ctx.u, ctx.v
  97. g.setColor(255, 255, 255)
  98. g.setFont('mesmerize', v * .05)
  99. g.printCenter('Choose a game slot', u * .5, v * .18)
  100. for i = 1, #self.slots do
  101. self.slots[i]:draw()
  102. if self.remove[i] then self.remove[i]:draw() end
  103. end
  104. end
  105. function MenuUser:keyreleased(key)
  106. if not self.active then return end
  107. if key == 'escape' then
  108. ctx:setPage('start')
  109. return true
  110. end
  111. end
  112. function MenuUser:resize()
  113. table.clear(self.geometry)
  114. end
  115. function MenuUser:slotPicked(slot)
  116. if not self.slots[slot].empty then
  117. ctx.user = self.users[slot]
  118. ctx:setPage(self.destination or 'campaign')
  119. else
  120. ctx.choose.user.slot = slot
  121. ctx:setPage('choose', self.destination)
  122. end
  123. end
  124. function MenuUser:removeSlot(slot)
  125. if not self.slots[slot].empty then
  126. love.filesystem.remove('save/' .. self.users[slot].name .. '/user.json')
  127. love.filesystem.remove('save/' .. self.users[slot].name .. '/achievements.json')
  128. love.filesystem.remove('save/' .. self.users[slot].name)
  129. ctx:setPage('select', self.destination)
  130. end
  131. end