package game.tournament;
import com.biotools.meerkat.GameObserver;
import game.*;
import game.deck.DeckFactory;
import game.stats.BankrollObserver;
import game.tournament.blinds.Level;
import org.apache.log4j.Logger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* GameRunner running a Tournament<br>
*/
public class TournamentGameRunner implements GameRunner {
private static final Logger log = Logger.getLogger(TournmentTableSeater.class);
private TournamentGameDescription gameDescription;
private Map<PublicGameInfo, Dealer> dealers;
private int totalHands = 0;
public TournamentGameRunner(TournamentGameDescription gameDescription) {
this.gameDescription = gameDescription;
}
@Override
public void runGame(DeckFactory deckFactory, TableSeater tableSeater, GameIDGenerator gameIDGenerator, List<? extends GameObserver> gameObservers) {
PublicGameInfo gameInfos[] = initTables(deckFactory, tableSeater, gameObservers);
while (gameInfos[0].getNumPlayers() > 1) {
totalHands++;
log.debug("------------ Hand: " + totalHands);
Level blindsLevel = gameDescription.getBlindsStructure().getCurrentLevel(totalHands);
for (PublicGameInfo gameInfo : gameInfos) {
runHand(gameIDGenerator, gameInfo, blindsLevel);
}
gameInfos = ((TournmentTableSeater) tableSeater).rearrangeTables(gameInfos);
}
}
private PublicGameInfo[] initTables(DeckFactory deckFactory, TableSeater tableSeater, List<? extends GameObserver> gameObservers) {
PublicGameInfo gameInfos[] = tableSeater.createTables(gameDescription);
dealers = new HashMap<PublicGameInfo, Dealer>(gameInfos.length, 1);
for (PublicGameInfo gameInfo : gameInfos) {
for (GameObserver gameObserver : gameObservers) {
gameInfo.addGameObserver(gameObserver);
}
gameInfo.setLimit(gameDescription.isNolimit() ? PublicGameInfo.NO_LIMIT : PublicGameInfo.FIXED_LIMIT);
Dealer dealer = new Dealer(deckFactory.createDeck(), gameInfo);
dealers.put(gameInfo, dealer);
}
return gameInfos;
}
private void runHand(GameIDGenerator gameIDGenerator, PublicGameInfo gameInfo, Level blindsLevel) {
gameInfo.setBlinds(blindsLevel.getSmallBlindAmount(), blindsLevel.getBigBlindAmount());
gameInfo.setGameID(gameIDGenerator.getNextGameID());
Dealer dealer = dealers.get(gameInfo);
dealer.playHand();
removeSittingOutPlayers(gameInfo);
dealer.moveButton();
}
private void removeSittingOutPlayers(PublicGameInfo gameInfo) {
for (int seat = 0; seat < gameInfo.getNumSeats(); seat++) {
PublicPlayerInfo player = gameInfo.getPlayer(seat);
if (player != null && player.isSittingOut()) {
gameInfo.removePlayer(player);
}
}
}
@Override
public PublicGameInfo asyncRunGame(DeckFactory deckFactory, TableSeater tableSeater, GameIDGenerator gameIDGenerator, List<? extends GameObserver> gameObservers) {
return null;
}
@Override
public void addBankrollObserver(BankrollObserver bankrollgraph) {
// TODO
}
}