From 1366451a3d8fdd044b316b10268be4b52af4dff0 Mon Sep 17 00:00:00 2001 From: Oshisaure Date: Fri, 9 Oct 2020 04:34:11 +0100 Subject: [PATCH] Fixed randomisers in A1-A4 modes: - History 4-rolls, history 6-rolls and history 6-rolls 35-bag no longer deal S, Z or O as their first piece - Added a 7-bag randomiser with the same behaviour (bag7noSZOstart) - Tweaked the "35-bag" part of the history 6-rolls 35-bag randomiser to work closer to what it's supposed to be - Switched Marathon AX4's randomiser from history 6-rolls to 7-bag no SZO start --- tetris/modes/marathon_ax4.lua | 4 +- tetris/randomizers/bag7noSZOstart.lua | 31 ++++++++ tetris/randomizers/history_4rolls.lua | 22 ++++-- tetris/randomizers/history_6rolls.lua | 20 +++-- tetris/randomizers/history_6rolls_35bag.lua | 84 ++++++++++++++------- 5 files changed, 118 insertions(+), 43 deletions(-) create mode 100644 tetris/randomizers/bag7noSZOstart.lua diff --git a/tetris/modes/marathon_ax4.lua b/tetris/modes/marathon_ax4.lua index 3fcda94..5495c41 100644 --- a/tetris/modes/marathon_ax4.lua +++ b/tetris/modes/marathon_ax4.lua @@ -3,7 +3,7 @@ require 'funcs' local GameMode = require 'tetris.modes.gamemode' local Piece = require 'tetris.components.piece' -local History6RollsRandomizer = require 'tetris.randomizers.history_6rolls' +local Bag7NoSZOStartRandomizer = require 'tetris.randomizers.bag7noSZOstart' local MarathonAX4Game = GameMode:extend() @@ -16,7 +16,7 @@ function MarathonAX4Game:new() MarathonAX4Game.super:new() self.roll_frames = 0 - self.randomizer = History6RollsRandomizer() + self.randomizer = Bag7NoSZOStartRandomizer() self.section_time_limit = 3600 self.section_start_time = 0 diff --git a/tetris/randomizers/bag7noSZOstart.lua b/tetris/randomizers/bag7noSZOstart.lua new file mode 100644 index 0000000..30ec8f3 --- /dev/null +++ b/tetris/randomizers/bag7noSZOstart.lua @@ -0,0 +1,31 @@ +local Randomizer = require 'tetris.randomizers.randomizer' + +local Bag7NoSZOStartRandomizer = Randomizer:extend() + +function Bag7NoSZOStartRandomizer:shuffleBag() + local b = self.bag + local ln = #b + for i = 1, ln do + local j = math.random(i, ln) + b[i], b[j] = b[j], b[i] + end +end + +local function isnotSZO(x) return not(x == "S" or x == "Z" or x == "O") end + +function Bag7NoSZOStartRandomizer:initialize() + self.bag = {"I", "J", "L", "O", "S", "T", "Z"} + repeat + self:shuffleBag() + until isnotSZO(self.bag[7]) +end + +function Bag7NoSZOStartRandomizer:generatePiece() + if #self.bag == 0 then + self.bag = {"I", "J", "L", "O", "S", "T", "Z"} + self:shuffleBag() + end + return table.remove(self.bag) +end + +return Bag7NoSZOStartRandomizer diff --git a/tetris/randomizers/history_4rolls.lua b/tetris/randomizers/history_4rolls.lua index fc57ee0..c1e8f33 100644 --- a/tetris/randomizers/history_4rolls.lua +++ b/tetris/randomizers/history_4rolls.lua @@ -3,17 +3,23 @@ local Randomizer = require 'tetris.randomizers.randomizer' local History4RollsRandomizer = Randomizer:extend() function History4RollsRandomizer:initialize() - self.history = {"Z", "S", "Z", "S"} + self.history = {"Z", "Z", "Z", "Z"} + self.first = true end function History4RollsRandomizer:generatePiece() - local shapes = {"I", "J", "L", "O", "S", "T", "Z"} - for i = 1, 4 do - local x = math.random(7) - if not inHistory(shapes[x], self.history) or i == 4 then - return self:updateHistory(shapes[x]) - end - end + if self.first then + self.first = false + return self:updateHistory(({"L", "J", "I", "T"})[math.random(4)]) + else + local shapes = {"I", "J", "L", "O", "S", "T", "Z"} + for i = 1, 4 do + local x = math.random(7) + if not inHistory(shapes[x], self.history) or i == 4 then + return self:updateHistory(shapes[x]) + end + end + end end function History4RollsRandomizer:updateHistory(shape) diff --git a/tetris/randomizers/history_6rolls.lua b/tetris/randomizers/history_6rolls.lua index 95b2c6e..f48543c 100644 --- a/tetris/randomizers/history_6rolls.lua +++ b/tetris/randomizers/history_6rolls.lua @@ -4,16 +4,22 @@ local History6RollsRandomizer = Randomizer:extend() function History6RollsRandomizer:initialize() self.history = {"Z", "S", "Z", "S"} + self.first = true end function History6RollsRandomizer:generatePiece() - local shapes = {"I", "J", "L", "O", "S", "T", "Z"} - for i = 1, 6 do - local x = math.random(7) - if not inHistory(shapes[x], self.history) or i == 6 then - return self:updateHistory(shapes[x]) - end - end + if self.first then + self.first = false + return self:updateHistory(({"L", "J", "I", "T"})[math.random(4)]) + else + local shapes = {"I", "J", "L", "O", "S", "T", "Z"} + for i = 1, 6 do + local x = math.random(7) + if not inHistory(shapes[x], self.history) or i == 6 then + return self:updateHistory(shapes[x]) + end + end + end end function History6RollsRandomizer:updateHistory(shape) diff --git a/tetris/randomizers/history_6rolls_35bag.lua b/tetris/randomizers/history_6rolls_35bag.lua index 6385902..190d396 100644 --- a/tetris/randomizers/history_6rolls_35bag.lua +++ b/tetris/randomizers/history_6rolls_35bag.lua @@ -1,38 +1,70 @@ local Randomizer = require 'tetris.randomizers.randomizer' -local History6RollsRandomizer = Randomizer:extend() +local History6Rolls35PoolRandomizer = Randomizer:extend() -function History6RollsRandomizer:initialize() +function History6Rolls35PoolRandomizer:initialize() + self.first = true self.history = {"Z", "S", "Z", "S"} - self.bag_counts = { - I = 5, J = 5, L = 5, O = 5, S = 3, T = 5, Z = 3 + self.pool = { + "I", "I", "I", "I", "I", + "T", "T", "T", "T", "T", + "L", "L", "L", "L", "L", + "J", "J", "J", "J", "J", + "S", "S", "S", "S", "S", + "Z", "Z", "Z", "Z", "Z", + "O", "O", "O", "O", "O", } + self.droughts = { + I = 0, + T = 0, + L = 0, + J = 0, + S = 0, + Z = 0, + O = 0, + } end -function History6RollsRandomizer:getBagPiece(n) - for shape, count in pairs(self.bag_counts) do - n = n - count - if n <= 0 then - return shape - end - end +function History6Rolls35PoolRandomizer:generatePiece() + local index, x + if self.first then + local prevent = {"S", "Z", "O"} + repeat + index = math.random(#self.pool) + x = self.pool[index] + until not inHistory(x, prevent) + self.first = false + else + for i = 1, 6 do + index = math.random(#self.pool) + x = self.pool[index] + if not inHistory(x, self.history) or i == 6 then + break + end + end + end + self.pool[index] = self:updateHistory(x) + return x end -function History6RollsRandomizer:generatePiece() - for i = 1, 6 do - local x = self:getBagPiece(math.random(31)) - if not inHistory(x, self.history) or i == 6 then - return self:updateHistory(x) - end - end -end - -function History6RollsRandomizer:updateHistory(shape) - self.bag_counts[shape] = self.bag_counts[shape] - 1 - local replaced_piece = table.remove(self.history, 1) +function History6Rolls35PoolRandomizer:updateHistory(shape) + table.remove(self.history, 1) table.insert(self.history, shape) - self.bag_counts[replaced_piece] = self.bag_counts[replaced_piece] + 1 - return shape + + local highdrought + local highdroughtcount = 0 + for k, v in pairs(self.droughts) do + if k == shape then + self.droughts[k] = 0 + else + self.droughts[k] = v + 1 + if v >= highdroughtcount then + highdrought = k + highdroughtcount = v + end + end + end + return highdrought end function inHistory(piece, history) @@ -44,4 +76,4 @@ function inHistory(piece, history) return false end -return History6RollsRandomizer +return History6Rolls35PoolRandomizer