/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package bots.mctsbot.client.common.gamestate.modifiers;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import bots.mctsbot.client.common.gamestate.AbstractGameState;
import bots.mctsbot.client.common.gamestate.GameState;
import bots.mctsbot.client.common.gamestate.GameStateVisitor;
import bots.mctsbot.client.common.playerstate.AbstractPlayerState;
import bots.mctsbot.client.common.playerstate.ForwardingPlayerState;
import bots.mctsbot.client.common.playerstate.PlayerState;
import bots.mctsbot.common.api.lobby.holdemtable.event.HoldemTableTreeEvent;
import bots.mctsbot.common.api.lobby.holdemtable.event.NewDealEvent;
import bots.mctsbot.common.elements.player.PlayerId;
import bots.mctsbot.common.elements.player.SeatedPlayer;
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;
import com.google.common.collect.ImmutableMap;
public class NewDealState extends AbstractGameState {
private final TableConfiguration tableConfiguration;
private final NewDealEvent event;
//TODO make weak reference? clean up memory?
private final GameState previousGame;
private final ImmutableBiMap<SeatId, PlayerId> seatMap;
private final ImmutableMap<PlayerId, PlayerState> playerStates;
public NewDealState(NewDealEvent newDealEvent, GameState previousGame) {
this.previousGame = previousGame;
this.event = newDealEvent;
this.tableConfiguration = previousGame.getTableConfiguration();
this.seatMap = previousGame.getSeatMap();
ImmutableMap.Builder<PlayerId, PlayerState> playerStateBuilder = ImmutableMap.builder();
for (final SeatedPlayer player : newDealEvent.getPlayers()) {
if (player.isSittingIn()) {
AbstractPlayerState playerState = new AbstractPlayerState() {
@Override
public String getName() {
return player.getName();
}
public int getBet() {
return 0;
}
@Override
public int getTotalInvestment() {
return 0;
}
public Hand getCards() {
return new Hand();
}
public int getStack() {
return player.getStackValue();
}
public boolean hasFolded() {
return false;
}
public PlayerId getPlayerId() {
return player.getId();
}
public SeatId getSeatId() {
return player.getSeatId();
}
@Override
public boolean hasChecked() {
return false;
}
@Override
public boolean hasBeenDealt() {
return true;
}
@Override
public List<Integer> getBetProgression() {
return new ArrayList<Integer>();
}
};
playerStateBuilder.put(player.getId(), playerState);
}
}
//also add players that are not being dealt a card.
ImmutableMap<PlayerId, PlayerState> playerStatesInEvent = playerStateBuilder.build();
for (PlayerState p : previousGame.getAllSeatedPlayers()) {
if (!playerStatesInEvent.containsKey(p.getPlayerId())) {
playerStateBuilder.put(p.getPlayerId(), new ForwardingPlayerState(p) {
@Override
public boolean hasBeenDealt() {
return false;
}
});
}
}
playerStates = playerStateBuilder.build();
}
public TableConfiguration getTableConfiguration() {
return tableConfiguration;
}
public Set<PlayerId> getAllSeatedPlayerIds() {
return playerStates.keySet();
}
public Hand getCommunityCards() {
return new Hand();
}
public PlayerId getDealer() {
return event.getDealer();
}
public int getLargestBet() {
return 0;
}
public PlayerId getLastBettor() {
return null;
}
public HoldemTableTreeEvent getLastEvent() {
return event;
}
public int getMinNextRaise() {
return tableConfiguration.getSmallBet();
}
public PlayerId getNextToAct() {
return null;
}
public PlayerState getPlayer(PlayerId playerId) {
try {
return playerStates.get(playerId);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public ImmutableBiMap<SeatId, PlayerId> getSeatMap() {
return seatMap;
}
public GameState getPreviousGameState() {
return previousGame;
}
public int getPreviousRoundsPotSize() {
return 0;
}
public Round getRound() {
return Round.PREFLOP;
}
public int getRoundPotSize() {
return 0;
}
@Override
public int getNbRaises() {
return 0;
}
@Override
public PlayerId getBigBlind() {
return null;
}
@Override
public PlayerId getSmallBlind() {
return null;
}
@Override
public void acceptVisitor(GameStateVisitor visitor) {
visitor.visitNewDealState(this);
}
@Override
public String toString() {
return getLastEvent().toString();
}
}