package com.lyndir.omicron.api;
import com.google.common.collect.*;
import com.lyndir.lhunath.opal.math.Size;
import java.util.*;
/**
* <i>10 07, 2012</i>
*
* @author lhunath
*/
public interface IGame {
/**
* @param levelType The type of level to find in the game.
*
* @return Find the game level of the given type. Assumes it exists.
*
* @throws NoSuchElementException If the game has no level of the given type.
*/
default ILevel getLevel(final LevelType levelType) {
return getLevels().stream().filter( level -> level.getType() == levelType ).findFirst().get();
}
/**
* @return The turns that have so-far occurred in this game. The final entry is the currently active turn.
*/
Deque<Turn> getTurns();
/**
* @return The maximum dimensions to create the levels of this game in.
*/
Size getLevelSize();
/**
* @return The levels in this game.
*/
ImmutableList<? extends ILevel> getLevels();
/**
* @return The players in this game, in order of sequence when simultaneous turns are not enabled.
*/
ImmutableList<? extends IPlayer> getPlayers();
/**
* @return The set of players that have marked themselves as ready to advance to the next turn.
*/
ImmutableSet<? extends IPlayer> getReadyPlayers();
/**
* @return Determines whether this game is currently ongoing or not.
*/
boolean isRunning();
IGameController getController();
interface IBuilder {
IGame build();
Size getLevelSize();
IBuilder setLevelSize(Size levelSize);
Collection<? extends IPlayer> getPlayers();
IBuilder setPlayer(PlayerKey playerKey, String name, Color primaryColor, Color secondaryColor);
IPlayer addPlayer(PlayerKey playerKey, String name, Color primaryColor, Color secondaryColor);
List<PublicVictoryConditionType> getVictoryConditions();
IBuilder addVictoryCondition(PublicVictoryConditionType victoryCondition);
Integer getTotalPlayers();
IBuilder setTotalPlayers(Integer totalPlayers);
IBuilder addGameListener(GameListener gameListener);
GameResourceConfig getResourceConfig();
IBuilder setResourceConfig(GameResourceConfig resourceConfig);
PublicGameUnitConfig getUnitConfig();
IBuilder setUnitConfig(PublicGameUnitConfig unitConfig);
int nextPlayerID();
}
interface GameResourceConfig {
int quantity(ResourceType resourceType);
int quantityPerTile(ResourceType resourceType);
int puddleSize(ResourceType resourceType);
}
enum GameResourceConfigs implements GameResourceConfig {
NONE( 0, 0, 0 ),
SCARCE( 1500, 20, 1 ),
PLENTY( 5000, 30, 2 ),
LOTS( 20000, 40, 5 ),
EXCESSIVE( 1000000, 100, 5 );
private final int quantity;
private final int quantityPerTile;
private final int puddleSize;
GameResourceConfigs(final int quantity, final int quantityPerTile, final int puddleSize) {
this.quantity = quantity;
this.quantityPerTile = quantityPerTile;
this.puddleSize = puddleSize;
}
@Override
public int quantity(final ResourceType resourceType) {
return quantity;
}
@Override
public int quantityPerTile(final ResourceType resourceType) {
return quantityPerTile;
}
@Override
public int puddleSize(final ResourceType resourceType) {
return puddleSize;
}
}
enum PublicGameUnitConfig {
NONE,
BASIC
}
}