void FixedUpdate()
    {
        if (Game.State == GameState.InMinigame && Game.Mode == GameMode.Survival)
        {
            if (isForcingRaise)
            {
                raiseRate = ManualRaiseRate.Value;
            }
            else
            {
                // Scale raise rate based on remaining time
                raiseRate = Mathf.Lerp(MinimumRaiseRate.Value, MaximumRaiseRate.Value, ((GameConfiguration.InMinigameDuration / 1000) - Game.SecondsRemaining) / (GameConfiguration.InMinigameDuration / 1000));
            }

            for (int column = 0; column < BlockManager.Columns; column++)
            {
                for (int row = 0; row < BlockManager.Rows; row++)
                {
                    if (BlockManager.Blocks[column, row].State != BlockState.Empty &&
                        BlockManager.Blocks[column, row].State != BlockState.Idle &&
                        BlockManager.Blocks[column, row].State != BlockState.Sliding)
                    {
                        raiseRate = 0;
                    }

                    if (row == BlockManager.Rows - 2)
                    {
                        if (BlockManager.Blocks[column, row].State != BlockState.Empty)
                        {
                            isLossIncoming = true;
                        }
                    }
                }
            }

            if (isLossIncoming)
            {
                LossElapsed += raiseRate * Time.deltaTime;

                if (LossElapsed >= RaiseLossCountdownDuration.Value)
                {
                    OnPlayerEliminated.Raise();
                }
            }
            else
            {
                Elapsed += raiseRate * Time.deltaTime;

                if (Elapsed >= RaiseDuration.Value)
                {
                    Elapsed = 0f;

                    for (int column = 0; column < BlockManager.Columns; column++)
                    {
                        for (int row = BlockManager.Rows - 2; row >= 1; row--)
                        {
                            BlockManager.Blocks[column, row].Garbage.Width      = BlockManager.Blocks[column, row - 1].Garbage.Width;
                            BlockManager.Blocks[column, row].Garbage.Height     = BlockManager.Blocks[column, row - 1].Garbage.Height;
                            BlockManager.Blocks[column, row].Garbage.IsNeighbor = BlockManager.Blocks[column, row - 1].Garbage.IsNeighbor;
                            BlockManager.Blocks[column, row].State = BlockManager.Blocks[column, row - 1].State;
                            BlockManager.Blocks[column, row].Type  = BlockManager.Blocks[column, row - 1].Type;
                        }

                        BlockManager.Blocks[column, 0].State = BlockManager.NewRowBlocks[column].State;
                        BlockManager.Blocks[column, 0].Type  = BlockManager.NewRowBlocks[column].Type;

                        MatchDetector.RequestMatchDetection(BlockManager.Blocks[column, 0]);
                    }

                    BlockManager.CreateNewRowBlocks();

                    if (isForcingRaise)
                    {
                        Score.ScoreRaise();

                        isForcingRaise = false;
                    }

                    if (Controller.Row < BlockManager.Rows - 2)
                    {
                        Controller.Row++;
                    }
                }

                LossElapsed = 0;
            }

            isLossIncoming = false;
        }
    }
    void Update()
    {
        if (MinigameManager.Mode == BlockPartyModes.Survival)
        {
            float raiseRate;
            if (isForcingRaise)
            {
                raiseRate = forcedRaiseRate;
            }
            else
            {
                raiseRate = defaultRaiseRate;
            }

            for (int column = 0; column < BlockManager.Columns; column++)
            {
                for (int row = 0; row < BlockManager.Rows; row++)
                {
                    if (BlockManager.Blocks[column, row].State != BlockState.Empty &&
                        BlockManager.Blocks[column, row].State != BlockState.Idle &&
                        BlockManager.Blocks[column, row].State != BlockState.Sliding)
                    {
                        raiseRate = 0;
                    }

                    if (row == BlockManager.Rows - 2)
                    {
                        if (BlockManager.Blocks[column, row].State != BlockState.Empty)
                        {
                            isLossIncoming = true;
                        }
                    }
                }
            }

            if (isLossIncoming)
            {
                LossElapsed += raiseRate * Time.deltaTime;

                if (LossElapsed >= LossDuration)
                {
                    MinigameManager.EndGame();
                }
            }
            else
            {
                Elapsed += raiseRate * Time.deltaTime;

                if (Elapsed >= Duration)
                {
                    Elapsed = 0f;

                    for (int column = 0; column < BlockManager.Columns; column++)
                    {
                        for (int row = BlockManager.Rows - 2; row >= 1; row--)
                        {
                            BlockManager.Blocks[column, row].Garbage.Width      = BlockManager.Blocks[column, row - 1].Garbage.Width;
                            BlockManager.Blocks[column, row].Garbage.Height     = BlockManager.Blocks[column, row - 1].Garbage.Height;
                            BlockManager.Blocks[column, row].Garbage.IsNeighbor = BlockManager.Blocks[column, row - 1].Garbage.IsNeighbor;
                            BlockManager.Blocks[column, row].State = BlockManager.Blocks[column, row - 1].State;
                            BlockManager.Blocks[column, row].Type  = BlockManager.Blocks[column, row - 1].Type;
                        }

                        BlockManager.Blocks[column, 0].State = BlockManager.NewRowBlocks[column].State;
                        BlockManager.Blocks[column, 0].Type  = BlockManager.NewRowBlocks[column].Type;

                        MatchDetector.RequestMatchDetection(BlockManager.Blocks[column, 0]);
                    }

                    BlockManager.CreateNewRowBlocks();

                    if (isForcingRaise)
                    {
                        Score.ScoreRaise();

                        isForcingRaise = false;
                    }
                }

                LossElapsed = 0;
            }

            isLossIncoming = false;
        }
    }