GameBoardPlayer.java

package soen6441riskgame.singleton;

import java.util.ArrayList;

import soen6441riskgame.models.Country;
import soen6441riskgame.models.Player;
import soen6441riskgame.utils.ConsolePrinter;
import soen6441riskgame.views.PhaseView;

/**
 * hold player data
 */
public class GameBoardPlayer implements Resettable {
    private ArrayList<Player> players = new ArrayList<Player>();
    private PhaseView phaseView = new PhaseView();

    /**
     * get the list of players
     *
     * @return list of players
     */
    public ArrayList<Player> getPlayers() {
        return players;
    }

    /**
     * get player object from name
     *
     * @param name player name
     * @return null if player name is not in the list
     */
    public Player getPlayerFromName(String name) {
        for (Player player : players) {
            if (player.getName().equals(name)) {
                return player;
            }
        }
        return null;
    }

    /**
     * add a new player and link to next/previous player
     *
     * @param name player name
     */
    public void addPlayer(String name) {
        Player player = getPlayerFromName(name);
        if (player == null) {
            player = new Player(name);
            players.add(player);
            int previousPlayerIndex = 0;
            if (players.size() > 1) {
                previousPlayerIndex = players.size() - 2;
            }
            Player previousPlayer = players.get(previousPlayerIndex);
            Player nextPlayer = players.get(0);
            player.setPreviousPlayer(previousPlayer);
            player.setNextPlayer(nextPlayer);
            player.addObserver(phaseView);
            ConsolePrinter.printFormat("Player %s added", name);
        }
    }

    /**
     * remove a player and destroy link to next/previous player
     *
     * @param name player name
     */
    public void removePlayer(String name) {
        Player player = getPlayerFromName(name);
        if (player != null) {
            // remove player countries
            ArrayList<Country> countries = player.getConqueredCountries();
            for (Country country : countries) {
                country.setConquerer(null);
            }

            players.remove(player);
            Player previousPlayer = player.getPreviousPlayer();
            Player nextPlayer = player.getNextPlayer();
            previousPlayer.setNextPlayer(nextPlayer);
            nextPlayer.setPreviousPlayer(previousPlayer);
            ConsolePrinter.printFormat("Player %s removed", name);
        } else {
            ConsolePrinter.printFormat("Player %s not exist in game", name);
        }
    }

    /**
     * get the Phase View
     * 
     * @return Phase View
     */
    public PhaseView getPhaseView() {
        return phaseView;
    }

    /**
     * reset player list
     */
    @Override
    public void reset() {
        players = new ArrayList<>();
    }
}