package bots.mctsbot.ai.opponentmodels.weka;
import java.io.IOException;
import org.apache.log4j.Logger;
import bots.mctsbot.client.common.gamestate.DetailedHoldemTableState;
import bots.mctsbot.client.common.gamestate.modifiers.AllInState;
import bots.mctsbot.client.common.gamestate.modifiers.BetState;
import bots.mctsbot.client.common.gamestate.modifiers.BlindState;
import bots.mctsbot.client.common.gamestate.modifiers.CallState;
import bots.mctsbot.client.common.gamestate.modifiers.CheckState;
import bots.mctsbot.client.common.gamestate.modifiers.ConfigChangeState;
import bots.mctsbot.client.common.gamestate.modifiers.FoldState;
import bots.mctsbot.client.common.gamestate.modifiers.JoinTableState;
import bots.mctsbot.client.common.gamestate.modifiers.LeaveTableState;
import bots.mctsbot.client.common.gamestate.modifiers.NewCommunityCardsState;
import bots.mctsbot.client.common.gamestate.modifiers.NewDealState;
import bots.mctsbot.client.common.gamestate.modifiers.NewPocketCardsState;
import bots.mctsbot.client.common.gamestate.modifiers.NewRoundState;
import bots.mctsbot.client.common.gamestate.modifiers.NextPlayerState;
import bots.mctsbot.client.common.gamestate.modifiers.RaiseState;
import bots.mctsbot.client.common.gamestate.modifiers.ShowHandState;
import bots.mctsbot.client.common.gamestate.modifiers.SitInState;
import bots.mctsbot.client.common.gamestate.modifiers.SitOutState;
import bots.mctsbot.client.common.gamestate.modifiers.WinnerState;
import bots.mctsbot.client.common.playerstate.PlayerState;
import bots.mctsbot.common.elements.table.Round;
import com.biotools.meerkat.Hand;
/**
* The ActionTrackingVisitor currently is used to observe the game
* and delegate important states to an {@link ARFFPropositionalizer}<br>
* <br>
* TODO: this classes extend {@link PlayerTrackingVisitor} though I think it doesn't
* really uses much of its functions (anymore). We should directly
* implement GameVisitor ?
*
*/
public class ActionTrackingVisitor extends PlayerTrackingVisitor {
private final static Logger logger = Logger.getLogger(ActionTrackingVisitor.class);
public ActionTrackingVisitor() {
try {
this.propz = new ARFFPropositionalizer();
} catch (IOException e) {
e.printStackTrace();
}
}
public ARFFPropositionalizer getPropz() {
return (ARFFPropositionalizer) this.propz;
}
@Override
public void visitAllInState(AllInState allInState) {
logger.trace("(" + allInState.getPlayer(allInState.getNextToAct()).getName() + ") AllInState: " + allInState.getRound());
propz.signalAllIn(allInState.getEvent().getPlayerId(), allInState.getEvent().getMovedAmount());
}
@Override
public void visitBetState(BetState betState) {
logger.trace("(" + betState.getPlayer(betState.getNextToAct()).getName() + ") BetState: " + betState.getEvent().getAmount());
propz.signalBet(false, betState.getEvent().getPlayerId(), betState.getEvent().getAmount());
}
@Override
public void visitCallState(CallState callState) {
logger.trace("(" + callState.getPlayer(callState.getNextToAct()).getName() + ") CallState");
propz.signalCall(false, callState.getEvent().getPlayerId());
}
@Override
public void visitCheckState(CheckState checkState) {
logger.trace("(" + checkState.getPlayer(checkState.getNextToAct()).getName() + ") CheckState");
propz.signalCheck(checkState.getEvent().getPlayerId());
}
@Override
public void visitFoldState(FoldState foldState) {
logger.trace("(" + foldState.getPlayer(foldState.getNextToAct()).getName() + ") FoldState");
propz.signalFold(foldState.getEvent().getPlayerId());
}
@Override
public void visitInitialGameState(DetailedHoldemTableState initialGameState) {
}
@Override
public void visitJoinTableState(JoinTableState joinTableState) {
}
@Override
public void visitLeaveTableState(LeaveTableState leaveTableState) {
}
@Override
public void visitNewCommunityCardsState(NewCommunityCardsState newCommunityCardsState) {
logger.trace("NewCommunityCardsState: " + newCommunityCardsState.getRound() + " ");
logger.trace(" " + newCommunityCardsState.getCommunityCards());
propz.signalCommunityCards(newCommunityCardsState.getCommunityCards());
}
@Override
public void visitNewDealState(NewDealState newDealState) {
logger.trace("(" + newDealState.getPlayer(newDealState.getDealer()).getName() + ") NewDealState");
propz.signalBBAmount(newDealState.getTableConfiguration().getBigBlind());
propz.signalNewGame();
for (PlayerState player : newDealState.getAllSeatedPlayers()) {
propz.signalSeatedPlayer(player.getStack(), player.getPlayerId());
}
}
@Override
public void visitNewPocketCardsState(NewPocketCardsState newPocketCardsState) {
}
@Override
public void visitNewRoundState(NewRoundState newRoundState) {
logger.trace("NewRoundState: " + newRoundState.getRound());
if (newRoundState.getRound() == Round.FLOP) {
propz.signalFlop();
} else if (newRoundState.getRound() == Round.TURN) {
propz.signalTurn();
} else if (newRoundState.getRound() == Round.FINAL) {
propz.signalRiver();
}
}
@Override
public void visitNextPlayerState(NextPlayerState nextPlayerState) {
}
@Override
public void visitRaiseState(RaiseState raiseState) {
logger.trace("(" + raiseState.getPlayer(raiseState.getNextToAct()).getName() + ") RaiseState: " + raiseState.getLargestBet());
propz.signalRaise(false, raiseState.getLastEvent().getPlayerId(), raiseState.getLargestBet());
}
@Override
public void visitShowHandState(ShowHandState showHandState) {
Hand cardset = showHandState.getLastEvent().getShowdownPlayer().getHandCards();
logger.trace("(" + showHandState.getPlayer(showHandState.getLastEvent().getShowdownPlayer().getPlayerId()).getName() + ") ShowHandState: "
+ cardset.getFirstCard() + ", " + cardset.getSecondCard());
propz.signalCardShowdown(showHandState.getLastEvent().getShowdownPlayer().getPlayerId(), cardset.getFirstCard(), cardset.getSecondCard());
}
@Override
public void visitSitInState(SitInState sitInState) {
}
@Override
public void visitSitOutState(SitOutState sitOutState) {
}
@Override
public void visitBlindState(BlindState blindState) {
logger.trace("(" + blindState.getPlayer(blindState.getLastEvent().getPlayerId()).getName() + ") BlindState: " + blindState.getRound());
propz.signalBlind(false, blindState.getLastEvent().getPlayerId(), blindState.getLastEvent().getAmount());
}
@Override
public void visitWinnerState(WinnerState winnerState) {
logger.trace("(" + winnerState.getLastEvent().getWinners().toArray()[0] + ") WinnerState: " + winnerState.getRound());
}
@Override
public void visitConfigChangeState(ConfigChangeState configChangeState) {
propz.signalBBAmount(configChangeState.getLastEvent().getTableConfig().getBigBlind());
}
}