diff --git a/tetris/modes/gamemode.lua b/tetris/modes/gamemode.lua index 790d854..97a8a4d 100644 --- a/tetris/modes/gamemode.lua +++ b/tetris/modes/gamemode.lua @@ -72,14 +72,21 @@ function GameMode:getLineClearDelay() return 40 end function GameMode:getDasLimit() return 15 end function GameMode:getNextPiece(ruleset) - return { - skin = "2tie", - shape = self.randomizer:nextPiece(), + skin = self:getSkin(), + shape = ( + ruleset.pieces == self.randomizer.possible_pieces and + self.randomizer:nextPiece() or + ruleset.fallback_randomizer:nextPiece() + ), orientation = ruleset:getDefaultOrientation(), } end +function GameMode:getSkin() + return "2tie" +end + function GameMode:initialize(ruleset, secret_inputs) -- generate next queue self:new(secret_inputs) @@ -445,11 +452,11 @@ function GameMode:initializeNextPiece(inputs, ruleset, piece_data, generate_next table.remove(self.next_queue, 1) table.insert(self.next_queue, self:getNextPiece(ruleset)) end - self:playNextSound() + self:playNextSound(ruleset) end -function GameMode:playNextSound() - playSE("blocks", self.next_queue[1].shape) +function GameMode:playNextSound(ruleset) + playSE("blocks", ruleset.next_sounds[self.next_queue[1].shape]) end function GameMode:getHighScoreData() diff --git a/tetris/modes/phantom_mania2.lua b/tetris/modes/phantom_mania2.lua index fed310c..e26b44a 100644 --- a/tetris/modes/phantom_mania2.lua +++ b/tetris/modes/phantom_mania2.lua @@ -86,12 +86,8 @@ function PhantomMania2Game:getGarbageLimit() else return 8 end end -function PhantomMania2Game:getNextPiece(ruleset) - return { - skin = self.level >= 1000 and "bone" or "2tie", - shape = self.randomizer:nextPiece(), - orientation = ruleset:getDefaultOrientation(), - } +function PhantomMania2Game:getSkin() + return self.level >= 1000 and "bone" or "2tie" end function PhantomMania2Game:hitTorikan(old_level, new_level) diff --git a/tetris/randomizers/bag.lua b/tetris/randomizers/bag.lua new file mode 100644 index 0000000..58bef77 --- /dev/null +++ b/tetris/randomizers/bag.lua @@ -0,0 +1,23 @@ +local Randomizer = require 'tetris.randomizers.randomizer' + +local BagRandomizer = Randomizer:extend() + +function BagRandomizer:new(pieces) + self.bag = {} + self.pieces = pieces + for i = 1, self.pieces do + table.insert(self.bag, i) + end +end + +function BagRandomizer:generatePiece() + if next(self.bag) == nil then + for i = 1, self.pieces do + table.insert(self.bag, i) + end + end + local x = math.random(table.getn(self.bag)) + return table.remove(self.bag, x) +end + +return BagRandomizer diff --git a/tetris/randomizers/randomizer.lua b/tetris/randomizers/randomizer.lua index 48c274b..fe4472e 100644 --- a/tetris/randomizers/randomizer.lua +++ b/tetris/randomizers/randomizer.lua @@ -3,6 +3,7 @@ local Object = require 'libs.classic' local Randomizer = Object:extend() function Randomizer:new() + self.possible_pieces = 7 self:initialize() end diff --git a/tetris/rulesets/ruleset.lua b/tetris/rulesets/ruleset.lua index 562c482..022d8b7 100644 --- a/tetris/rulesets/ruleset.lua +++ b/tetris/rulesets/ruleset.lua @@ -1,5 +1,6 @@ local Object = require 'libs.classic' local Piece = require 'tetris.components.piece' +local Bag7Randomizer = require "tetris.randomizers.bag7" local Ruleset = Object:extend() @@ -22,10 +23,24 @@ Ruleset.harddrop_lock = false Ruleset.enable_IRS_wallkicks = false Ruleset.are_cancel = false +Ruleset.fallback_randomizer = Bag7Randomizer() + +Ruleset.next_sounds = { + I = "I", + L = "L", + J = "J", + S = "S", + Z = "Z", + O = "O", + T = "T" +} + +Ruleset.pieces = 7 -- Component functions. function Ruleset:new() + if config.gamesettings.piece_colour == 1 then blocks["bone"] = (not self.world) and {