GameplayScreen.java

package com.vikingz.campustycoon.UI.Screens;

import com.vikingz.campustycoon.UI.Components.BankruptMenu;
import com.vikingz.campustycoon.UI.Components.PauseMenu;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.utils.ScreenUtils;

import com.vikingz.campustycoon.Game.GameLogic.Event;
import com.vikingz.campustycoon.Game.GameLogic.MoneyHandler;
import com.vikingz.campustycoon.Game.GameLogic.Timer;
import com.vikingz.campustycoon.UI.Window;
import com.vikingz.campustycoon.Util.Drawer;
import com.vikingz.campustycoon.Util.GameUtils;

import java.util.concurrent.ThreadLocalRandom;

/**
 * This class is used to create the gameplay screen.
 */
public class GameplayScreen implements Screen{
    private Timer timer;
    private boolean stateChanged;
    private float elapsedTime;
    private ThreadLocalRandom rand;
    private float eventCounter;
    private Skin skin;
    private PauseMenu pauseMenu;
    private boolean paused;
    private BankruptMenu bankruptMenu;
    private boolean bankrupt;


    /**
     * Shows the gameplay screen.
     */
    @Override
    public void show() {
        if (!com.vikingz.campustycoon.Util.ScreenUtils.GameActive) {
            timer = new Timer(5); // Sets a countdown for 300 seconds (5 minutes)
            timer.start();
            GameUtils.startGame();
            GameUtils.createGameplayUI();
            stateChanged = false;  // Reset stateChanged when the screen is shown
            elapsedTime = 0;
            rand = ThreadLocalRandom.current();
            eventCounter = 0f;
            this.skin = new Skin(Gdx.files.internal("glassy-ui/skin/glassy-ui.json"));
            pauseMenu = new PauseMenu(skin);
            bankruptMenu = new BankruptMenu(skin);
            paused = false;
            bankrupt = false;
            com.vikingz.campustycoon.Util.ScreenUtils.GameActive = true;
        }
    }

    /**
     * Render the gameplay screen.
     */
    @Override
    public void render(float delta) {
        // Clear screen
        Gdx.gl.glClearColor(0.1f, 0.1f, 0.4f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        ScreenUtils.clear(Color.BLACK);

        if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) {
            pause();
        }

        if (!paused) {
            timer.update(delta); // Update the timer every frame
            MoneyHandler.update(delta); // Update the balance of the player
            // Check if the timer has ended and stateChanged is false
            if (timer.hasEnded() && !stateChanged) {
                stateChanged = true; // Set the flag to true to prevent re-execution
            }

            //times when next event is
            eventCounter += rand.nextInt(0, 1000) * delta;
            if (eventCounter >= 12000 && GameUtils.currentEvent == null) {
                eventCounter = 0;
                //Pop event
                GameUtils.currentEvent = new Event();
                System.out.println("Event opened");
            }


            elapsedTime += delta; // delta is the time elapsed since the last frame
            if (elapsedTime >= 1) { // Increment counter every second

                System.out.println("second");

            }

            elapsedTime = 0; // Reset elapsed time

        }
        Drawer.drawAll();
    }

    /**
     * Set the paused state of the game.
     * @param paused
     */
    public void setPaused(boolean paused) {
        this.paused = paused;
    }

    /**
     * Resize the gameplay screen.
     */
    @Override
    public void resize(int width, int height) {
        Window.updateResolution(width, height);
        Drawer.updateAll();
        Drawer.stage.getViewport().update(width, height, true);

    }

    /**
     * Pause the game.
     * -> Opens the pause menu
     */
    @Override
    public void pause() {
        if (!bankrupt) {
            if (!paused) {
                Drawer.stage.addActor(pauseMenu);
                pauseMenu.toFront();
                pauseMenu.setPosition((Drawer.stage.getWidth() - pauseMenu.getWidth()) / 2, ((Drawer.stage.getHeight() - pauseMenu.getHeight()) / 2)-50);
                Gdx.input.setInputProcessor(Drawer.stage);
                paused = true;
            } else {
                com.vikingz.campustycoon.Util.ScreenUtils.resetInputProcessor();
                pauseMenu.remove();
                paused = false;
            }
        }
    }

    @Override
    public void resume() {
    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        // Destroy screen's assets here.
    }

    /**
     * Display the bankrupt warning.
     */
    public void displayBankruptWarning() {
        this.bankrupt = true;
        this.paused = true;
        Drawer.stage.addActor(bankruptMenu);
        bankruptMenu.setPosition((Drawer.stage.getWidth() - pauseMenu.getWidth()) / 2, ((Drawer.stage.getHeight() - pauseMenu.getHeight()) / 2)-50);
        Gdx.input.setInputProcessor(Drawer.stage);
    }

    public void setBankrupt(boolean bankrupt) {
        this.bankrupt = bankrupt;
    }
}