Files
tromi_mobile/scene/replay.lua
SweetSea-ButImNotSweet f5584b5df7 .
2024-05-13 17:27:51 +07:00

157 lines
5.9 KiB
Lua

local ReplaySelectScene = SCENE:extend()
ReplaySelectScene.title = "Replay"
function ReplaySelectScene:new()
self:initList()
PENTO_MODE = false
end
function ReplaySelectScene:initList()
self.replays = {}
replay_list = love.filesystem.getDirectoryItems('saves/replays/')
table.sort(replay_list, function(a,b) return a > b end)
self.replay_text = {}
self.page_flip = 16
self.page = 1
gradeNames = {
"19k", "18k", "17k", "16k", "15k", "14k", "13k", "12k", "11k",
"10k", "9k", "8k", "7k", "6k", "5k", "4k", "3k", "2k", "1k",
"1D", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D"
}
for i=1, #replay_list do
replay_found = string.find(replay_list[i], "_replay.sav")
if replay_found ~= nil then
table.insert(self.replays, replay_list[i])
line_components = {}
for str in string.gmatch(replay_list[i], "([^".."_".."]+)") do
table.insert(line_components, str)
end
player_name = line_components[2]
player_grade = gradeNames[tonumber(line_components[3])]
player_score = line_components[4]
if #player_grade == 2 then player_grade = ' '..player_grade end
table.insert(self.replay_text, player_name..' - '..player_grade..' - '..string.format('%6d',player_score))
end
end
self.dialog = false
self.dialog_select = 1
self.replay_select = 1
self.direction = nil
self.repeat_limit = 10
self.repeat_counter = self.repeat_limit-1
end
function ReplaySelectScene:render()
MainBackground()
love.graphics.setColor(0.4, 1, 1, 0.5)
love.graphics.rectangle("fill", 0, 20 + 20 * self.replay_select, 640, 22)
drawText('Name - Grade - Score', 40, 20, 1000, "left")
drawText(string.format('Page %s', self.page), 20, 440, 1000, "left")
local i, j = 1, 1
while i <= #self.replay_text do
if j > self.page_flip then j = 1
elseif j < 1 then j = self.page_flip
end
if i > (self.page-1) * self.page_flip and i <= self.page * self.page_flip then
drawText(self.replay_text[i], 40, 20 + 20 * j, 1000, "left")
end
j = j + 1
i = i + 1
end
if self.dialog then
love.graphics.setColor(0, 0, 0, 0.5)
love.graphics.rectangle("fill", 23, 43 + 20 * self.replay_select, 65, 40, 5, 5)
love.graphics.setColor(0.3, 0.8, 0.8, 1)
love.graphics.rectangle("fill", 20, 40 + 20 * self.replay_select, 65, 40, 5, 5)
drawText("Play", 30, 40 + 20 * self.replay_select, 1000, "left")
drawText("Delete", 30, 60 + 20 * self.replay_select, 1000, "left")
drawText("o", 20, 40+((self.dialog_select-1) * 20) + (20 * self.replay_select), 1000, "left")
end
if self.replays[1] == nil then
drawText('No replays yet!', 40, 40, 1000, "left")
end
end
function ReplaySelectScene:update()
if self.direction == "up" then
if self.repeat_counter >= self.repeat_limit then
self:changeOption(-1)
self.repeat_counter = 0
end
self.repeat_counter = self.repeat_counter + 1
elseif self.direction == "down" then
if self.repeat_counter >= self.repeat_limit then
self:changeOption(1)
self.repeat_counter = 0
end
self.repeat_counter = self.repeat_counter + 1
end
end
function ReplaySelectScene:changeOption(rel)
local len = #self.replays
self.replay_select = self.replay_select + rel
if self.replay_select + ((self.page-1) * self.page_flip) > len then
self.page = 1
self.replay_select = 1
elseif self.replay_select < 1 and self.page == 1 then
self.page = 1+(math.floor(len / self.page_flip))
self.replay_select = len - ((self.page-1) * self.page_flip)
end
if self.replay_select > self.page_flip then
self.page = self.page + 1
self.replay_select = 1
elseif self.replay_select < 1 then
self.page = self.page - 1
self.replay_select = self.page_flip
end
end
function ReplaySelectScene:changeDialog(rel)
self.dialog_select = self.dialog_select + rel
if self.dialog_select > 2 then self.dialog_select = 1
elseif self.dialog_select < 1 then self.dialog_select = 2
end
end
function ReplaySelectScene:onInputPress(e)
selected_replay = self.replays[self.replay_select + ((self.page-1) * self.page_flip)]
selected_replay_text = self.replay_text[self.replay_select + ((self.page-1) * self.page_flip)]
if e.input == "menu_decide" or e.input == "rotate_left" or e.scancode == "return" then
if self.replays[1] == nil then
SCENE = TitleScene()
else
line_components = {}
for str in string.gmatch(selected_replay_text, "([^".."-".."]+)") do
table.insert(line_components, str)
end
player_name = line_components[1]
player_grade = string.gsub(line_components[2], " ", "")
SCENE = GameScene(player_name, selected_replay, player_grade)
end
elseif e.input == "rotate_right" then
love.system.setClipboardText(love.data.encode("string", "base64", love.filesystem.read('saves/replays/'..selected_replay)))
elseif e.input == "up" or e.scancode == "up" then
if self.replays[1] == nil then scene = TitleScene() end
self.direction = 'up'
elseif e.input == "down" or e.scancode == "down" then
if self.replays[1] == nil then scene = TitleScene() end
self.direction = 'down'
elseif e.input == "menu_back" or e.input == "rotate_right" or e.scancode == "backspace" or e.scancode == "delete" then
SCENE = TitleScene()
end
end
function ReplaySelectScene:onInputRelease(e)
if e.input == "up" or e.scancode == "up" or e.input == "down" or e.scancode == "down" then
self.direction = nil
self.repeat_counter = self.repeat_limit-1
end
end
return ReplaySelectScene