From 89c7205347f8a6e7821f4123135853e766f27833 Mon Sep 17 00:00:00 2001 From: Ishaan Bhardwaj Date: Wed, 8 Dec 2021 21:23:00 -0500 Subject: [PATCH] Replay system v3 + `love.math.random` migration --- scene/replay.lua | 28 ++++++++++---- scene/settings.lua | 2 +- scene/title.lua | 2 +- tetris/modes/gamemode.lua | 42 +++++++++------------ tetris/randomizers/bag.lua | 2 +- tetris/randomizers/bag7.lua | 2 +- tetris/randomizers/bag7noSZOstart.lua | 2 +- tetris/randomizers/history_4rolls.lua | 4 +- tetris/randomizers/history_6rolls.lua | 4 +- tetris/randomizers/history_6rolls_35bag.lua | 4 +- tetris/randomizers/randomizer.lua | 2 +- 11 files changed, 50 insertions(+), 44 deletions(-) diff --git a/scene/replay.lua b/scene/replay.lua index 2829d70..8507ec2 100644 --- a/scene/replay.lua +++ b/scene/replay.lua @@ -6,13 +6,15 @@ ReplayScene.title = "Replay" function ReplayScene:new(replay, game_mode, ruleset, inputs) config.gamesettings = replay["gamesettings"] + love.math.setRandomSeed(replay["random_low"], replay["random_high"]) + love.math.setRandomState(replay["random_state"]) + self.retry_replay = replay + self.retry_mode = game_mode + self.retry_ruleset = ruleset self.secret_inputs = inputs self.game = game_mode(self.secret_inputs) self.ruleset = ruleset(self.game) - -- Replace piece randomizer with replay piece sequence - local randomizer = Sequence() - randomizer.sequence = replay["pieces"] - self.game:initializeReplay(self.ruleset, randomizer) + self.game:initialize(self.ruleset, true) self.inputs = { left=false, right=false, @@ -26,7 +28,7 @@ function ReplayScene:new(replay, game_mode, ruleset, inputs) hold=false, } self.paused = false - self.replay = replay + self.replay = deepcopy(replay) self.replay_index = 1 DiscordRPC:update({ details = "Viewing a replay", @@ -56,15 +58,27 @@ end function ReplayScene:render() self.game:draw(self.paused) + love.graphics.setColor(1, 1, 1, 1) love.graphics.setFont(font_3x5_3) love.graphics.printf("REPLAY", 0, 0, 635, "right") end function ReplayScene:onInputPress(e) - if (e.input == "menu_back") then + if ( + e.input == "menu_back" or + e.input == "menu_decide" or + e.input == "retry" + ) then self.game:onExit() loadSave() - scene = ReplaySelectScene() + love.math.setRandomSeed(os.time()) + scene = ( + (e.input == "retry") and + ReplayScene( + self.retry_replay, self.retry_mode, + self.retry_ruleset, self.secret_inputs + ) or ReplaySelectScene() + ) elseif e.input == "pause" and not (self.game.game_over or self.game.completed) then self.paused = not self.paused if self.paused then pauseBGM() diff --git a/scene/settings.lua b/scene/settings.lua index c9663aa..eaa7361 100644 --- a/scene/settings.lua +++ b/scene/settings.lua @@ -20,7 +20,7 @@ function SettingsScene:new() self.menu_state = 1 DiscordRPC:update({ details = "In settings", - state = settingsidle[math.random(#settingsidle)], + state = settingsidle[love.math.random(#settingsidle)], largeImageKey = "settings", }) end diff --git a/scene/title.lua b/scene/title.lua index 6f111dc..3b06a92 100644 --- a/scene/title.lua +++ b/scene/title.lua @@ -44,7 +44,7 @@ function TitleScene:new() self.text_flag = false DiscordRPC:update({ details = "In menus", - state = mainmenuidle[math.random(#mainmenuidle)], + state = mainmenuidle[love.math.random(#mainmenuidle)], largeImageKey = "1year", largeImageText = version.." | Thanks for 1 year!" }) diff --git a/tetris/modes/gamemode.lua b/tetris/modes/gamemode.lua index 538877d..6cb49aa 100644 --- a/tetris/modes/gamemode.lua +++ b/tetris/modes/gamemode.lua @@ -17,6 +17,12 @@ GameMode.tagline = "" GameMode.rollOpacityFunction = function(age) return 0 end function GameMode:new(secret_inputs) + self.replay_inputs = {} + self.random_low, self.random_high = love.math.getRandomSeed() + self.random_state = love.math.getRandomState() + self.secret_inputs = secret_inputs + self.save_replay = true + self.grid = Grid(10, 24) self.randomizer = Randomizer() self.piece = nil @@ -73,10 +79,6 @@ function GameMode:new(secret_inputs) self.section_start_time = 0 self.section_times = { [0] = 0 } self.secondary_section_times = { [0] = 0 } - self.replay_inputs = {} - self.secret_inputs = secret_inputs - self.replay_pieces = {} - self.save_replay = true end function GameMode:getARR() return 1 end @@ -91,9 +93,6 @@ function GameMode:getGravity() return 1/64 end function GameMode:getNextPiece(ruleset) local shape = self.used_randomizer:nextPiece() - if self.save_replay then - self.replay_pieces[#self.replay_pieces + 1] = shape - end return { skin = self:getSkin(), shape = shape, @@ -105,16 +104,7 @@ function GameMode:getSkin() return "2tie" end -function GameMode:sharedInitialize(ruleset) - self.ruleset = ruleset - for i = 1, math.max(self.next_queue_length, 1) do - table.insert(self.next_queue, self:getNextPiece(ruleset)) - end - self.lock_on_soft_drop = ({ruleset.softdrop_lock, self.instant_soft_drop, false, true})[config.gamesettings.manlock] - self.lock_on_hard_drop = ({ruleset.harddrop_lock, self.instant_hard_drop, true, false})[config.gamesettings.manlock] -end - -function GameMode:initialize(ruleset) +function GameMode:initialize(ruleset, replay) -- generate next queue self.used_randomizer = ( table.equalvalues( @@ -123,20 +113,22 @@ function GameMode:initialize(ruleset) ) and self.randomizer or BagRandomizer(table.keys(ruleset.colourscheme)) ) - self:sharedInitialize(ruleset) -end - -function GameMode:initializeReplay(ruleset, randomizer) - self.used_randomizer = randomizer - self.save_replay = false - self:sharedInitialize(ruleset) + self.ruleset = ruleset + self.save_replay = not replay + for i = 1, math.max(self.next_queue_length, 1) do + table.insert(self.next_queue, self:getNextPiece(ruleset)) + end + self.lock_on_soft_drop = ({ruleset.softdrop_lock, self.instant_soft_drop, false, true})[config.gamesettings.manlock] + self.lock_on_hard_drop = ({ruleset.harddrop_lock, self.instant_hard_drop, true, false})[config.gamesettings.manlock] end function GameMode:saveReplay() -- Save replay. local replay = {} replay["inputs"] = self.replay_inputs - replay["pieces"] = self.replay_pieces + replay["random_low"] = self.random_low + replay["random_high"] = self.random_high + replay["random_state"] = self.random_state replay["mode"] = self.name replay["ruleset"] = self.ruleset.name replay["timer"] = self.frames diff --git a/tetris/randomizers/bag.lua b/tetris/randomizers/bag.lua index e7a60bc..670ea90 100644 --- a/tetris/randomizers/bag.lua +++ b/tetris/randomizers/bag.lua @@ -13,7 +13,7 @@ function BagRandomizer:generatePiece() table.insert(self.bag, v) end end - local x = math.random(table.getn(self.bag)) + local x = love.math.random(table.getn(self.bag)) return table.remove(self.bag, x) end diff --git a/tetris/randomizers/bag7.lua b/tetris/randomizers/bag7.lua index e758a63..5797c8b 100644 --- a/tetris/randomizers/bag7.lua +++ b/tetris/randomizers/bag7.lua @@ -10,7 +10,7 @@ function Bag7Randomizer:generatePiece() if next(self.bag) == nil then self.bag = {"I", "J", "L", "O", "S", "T", "Z"} end - local x = math.random(table.getn(self.bag)) + local x = love.math.random(table.getn(self.bag)) return table.remove(self.bag, x) end diff --git a/tetris/randomizers/bag7noSZOstart.lua b/tetris/randomizers/bag7noSZOstart.lua index 266a371..26fd8aa 100644 --- a/tetris/randomizers/bag7noSZOstart.lua +++ b/tetris/randomizers/bag7noSZOstart.lua @@ -6,7 +6,7 @@ function Bag7NoSZOStartRandomizer:shuffleBag() local b = self.bag local ln = #b for i = 1, ln do - local j = math.random(i, ln) + local j = love.math.random(i, ln) b[i], b[j] = b[j], b[i] end end diff --git a/tetris/randomizers/history_4rolls.lua b/tetris/randomizers/history_4rolls.lua index e598358..a562910 100644 --- a/tetris/randomizers/history_4rolls.lua +++ b/tetris/randomizers/history_4rolls.lua @@ -10,11 +10,11 @@ end function History4RollsRandomizer:generatePiece() if self.first then self.first = false - return self:updateHistory(({"L", "J", "I", "T"})[math.random(4)]) + return self:updateHistory(({"L", "J", "I", "T"})[love.math.random(4)]) else local shapes = {"I", "J", "L", "O", "S", "T", "Z"} for i = 1, 4 do - local x = math.random(7) + local x = love.math.random(7) if not inHistory(shapes[x], self.history) or i == 4 then return self:updateHistory(shapes[x]) end diff --git a/tetris/randomizers/history_6rolls.lua b/tetris/randomizers/history_6rolls.lua index 44c2d41..b20bfb8 100644 --- a/tetris/randomizers/history_6rolls.lua +++ b/tetris/randomizers/history_6rolls.lua @@ -10,11 +10,11 @@ end function History6RollsRandomizer:generatePiece() if self.first then self.first = false - return self:updateHistory(({"L", "J", "I", "T"})[math.random(4)]) + return self:updateHistory(({"L", "J", "I", "T"})[love.math.random(4)]) else local shapes = {"I", "J", "L", "O", "S", "T", "Z"} for i = 1, 6 do - local x = math.random(7) + local x = love.math.random(7) if not inHistory(shapes[x], self.history) or i == 6 then return self:updateHistory(shapes[x]) end diff --git a/tetris/randomizers/history_6rolls_35bag.lua b/tetris/randomizers/history_6rolls_35bag.lua index 123cc3b..c07f1ce 100644 --- a/tetris/randomizers/history_6rolls_35bag.lua +++ b/tetris/randomizers/history_6rolls_35bag.lua @@ -28,12 +28,12 @@ end function History6Rolls35PoolRandomizer:generatePiece() local index, x if self.first then - index = math.random(20) + index = love.math.random(20) x = self.pool[index] self.first = false else for i = 1, 6 do - index = math.random(#self.pool) + index = love.math.random(#self.pool) x = self.pool[index] if not inHistory(x, self.history) or i == 6 then break diff --git a/tetris/randomizers/randomizer.lua b/tetris/randomizers/randomizer.lua index aa0931f..d8dc9c0 100644 --- a/tetris/randomizers/randomizer.lua +++ b/tetris/randomizers/randomizer.lua @@ -16,7 +16,7 @@ function Randomizer:initialize() end function Randomizer:generatePiece() - return self.possible_pieces[math.random(7)] + return self.possible_pieces[love.math.random(7)] end return Randomizer