/**
*
* Copyright 2008 DAI-Labor, Deutsche Telekom Laboratories
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package bots.mctsbot.client.common.gamestate;
import java.util.ArrayList;
import java.util.List;
import bots.mctsbot.client.common.playerstate.PlayerState;
import bots.mctsbot.client.common.playerstate.SeatedPlayerState;
import bots.mctsbot.common.api.lobby.holdemtable.event.HoldemTableTreeEvent;
import bots.mctsbot.common.elements.chips.Pots;
import bots.mctsbot.common.elements.player.PlayerId;
import bots.mctsbot.common.elements.player.SeatedPlayer;
import bots.mctsbot.common.elements.table.DetailedHoldemTable;
import bots.mctsbot.common.elements.table.Round;
import bots.mctsbot.common.elements.table.SeatId;
import bots.mctsbot.common.elements.table.TableConfiguration;
import com.biotools.meerkat.Hand;
import com.google.common.collect.ImmutableBiMap;
/**
* @author stephans
*/
public class DetailedHoldemTableState extends AbstractGameState {
private final DetailedHoldemTable table;
private final ImmutableBiMap<SeatId, PlayerId> seatMap;
/**
* @param tableConfiguration
*/
public DetailedHoldemTableState(DetailedHoldemTable table) {
this.table = table;
ImmutableBiMap.Builder<SeatId, PlayerId> seatMapBuilder = new ImmutableBiMap.Builder<SeatId, PlayerId>();
for (SeatedPlayer player : table.getPlayers()) {
seatMapBuilder.put(player.getSeatId(), player.getId());
}
this.seatMap = seatMapBuilder.build();
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getCommunityCards()
*/
@Override
public Hand getCommunityCards() {
Hand communityCards = table.getCommunityCards();
return new Hand(communityCards);
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getDealer()
*/
@Override
public PlayerId getDealer() {
return table.getDealer().getId();
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getLargestBet()
*/
@Override
public int getLargestBet() {
int result = 0;
for (SeatedPlayer player : table.getPlayers()) {
result = Math.max(result, player.getBetChipsValue());
}
return result;
}
/**
* TODO Horribly complicated hack
*
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getLastBettor()
*/
@Override
public PlayerId getLastBettor() {
int maxBet = getLargestBet();
int dealerSeatId = getPlayer(getDealer()).getSeatId().getId();
List<SeatedPlayer> candidates = new ArrayList<SeatedPlayer>();
for (SeatedPlayer player : table.getPlayers()) {
if (player.getBetChipsValue() == maxBet) {
candidates.add(player);
}
}
for (int i = 0; i < table.getTableConfiguration().getMaxNbPlayers(); i++) {
for (SeatedPlayer player : candidates) {
if (player.getSeatId().getId() == dealerSeatId) {
return player.getId();
}
}
dealerSeatId--;
if (dealerSeatId < 0) {
dealerSeatId += table.getTableConfiguration().getMaxNbPlayers();
}
}
return null;
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getLastEvent()
*/
@Override
public HoldemTableTreeEvent getLastEvent() {
throw new UnsupportedOperationException("Implement this");
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getMinNextRaise()
*/
@Override
public int getMinNextRaise() {
throw new UnsupportedOperationException("Implement this");
}
/**
* @return Unknown after initialization, return 0
* @see bots.mctsbot.client.common.gamestate.GameState#getNbRaises()
*/
@Override
public int getNbRaises() {
return 0;
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getNextToAct()
*/
@Override
public PlayerId getNextToAct() {
throw new UnsupportedOperationException("Implement this");
}
/**
* @param playerId
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getPlayer(bots.mctsbot.common.elements.player.PlayerId)
*/
@Override
public PlayerState getPlayer(PlayerId playerId) {
SeatedPlayer selected = null;
for (SeatedPlayer seated : table.getPlayers()) {
if (seated.getId().equals(playerId)) {
selected = seated;
}
}
if (selected == null || !selected.isSittingIn()) {
return null;
}
return new SeatedPlayerState(selected);
}
@Override
public ImmutableBiMap<SeatId, PlayerId> getSeatMap() {
return seatMap;
}
/**
* @return Point to yourself ...
* @see bots.mctsbot.client.common.gamestate.GameState#getPreviousGameState()
*/
@Override
public GameState getPreviousGameState() {
return this;
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getPreviousRoundsPotSize()
*/
@Override
public int getPreviousRoundsPotSize() {
Pots pots = table.getPots();
if (pots == null) {
//TODO check why pots can be null?
return 0;
}
return pots.getTotalValue();
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getRound()
*/
@Override
public Round getRound() {
return table.getRound();
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getRoundPotSize()
*/
@Override
public int getRoundPotSize() {
int result = 0;
for (SeatedPlayer player : table.getPlayers()) {
result += player.getBetChipsValue();
}
return result;
}
/**
* @return
* @see bots.mctsbot.client.common.gamestate.GameState#getTableConfiguration()
*/
@Override
public TableConfiguration getTableConfiguration() {
return table.getTableConfiguration();
}
@Override
public PlayerId getBigBlind() {
return null;
}
@Override
public PlayerId getSmallBlind() {
return null;
}
@Override
public void acceptHistoryVisitor(GameStateVisitor visitor, GameState start) {
if (start != this) {
acceptVisitor(visitor);
}
}
@Override
public void acceptVisitor(GameStateVisitor visitor) {
visitor.visitInitialGameState(this);
}
@Override
public String toString() {
return table.toString();
}
}