fix infinite check bug
[rofl0r-oopoker.git] / event.cpp
blob9c5dfbe4b3d1d475b5df95ef38eeb022998ce236
1 /*
2 OOPoker
4 Copyright (c) 2010 Lode Vandevenne
5 All rights reserved.
7 This file is part of OOPoker.
9 OOPoker is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 OOPoker is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with OOPoker. If not, see <http://www.gnu.org/licenses/>.
23 #include "event.h"
25 #include "combination.h"
26 #include "player.h"
27 #include "observer.h"
29 #include <sstream>
32 Event::Event(EventType type)
33 : type(type)
37 Event::Event(EventType type, const std::string& player)
38 : type(type)
39 , player(player)
43 Event::Event(EventType type, const std::string& player, int chips)
44 : type(type)
45 , player(player)
46 , chips(chips)
50 Event::Event(EventType type, int position, const std::string& player)
51 : type(type)
52 , player(player)
53 , position(position)
57 Event::Event(EventType type, int position, int chips, const std::string& player)
58 : type(type)
59 , player(player)
60 , chips(chips)
61 , position(position)
65 Event::Event(EventType type, const std::string& player, const std::string& ai)
66 : type(type)
67 , player(player)
68 , ai(ai)
72 Event::Event(EventType type, const Card& card1)
73 : type(type)
74 , card1(card1)
78 Event::Event(EventType type, const Card& card1, const Card& card2)
79 : type(type)
80 , card1(card1)
81 , card2(card2)
85 Event::Event(EventType type, const Card& card1, const Card& card2, const Card& card3)
86 : type(type)
87 , card1(card1)
88 , card2(card2)
89 , card3(card3)
93 Event::Event(EventType type, const Card& card1, const Card& card2, const Card& card3, const Card& card4)
94 : type(type)
95 , card1(card1)
96 , card2(card2)
97 , card3(card3)
98 , card4(card4)
102 Event::Event(EventType type, const Card& card1, const Card& card2, const Card& card3, const Card& card4, const Card& card5)
103 : type(type)
104 , card1(card1)
105 , card2(card2)
106 , card3(card3)
107 , card4(card4)
108 , card5(card5)
112 Event::Event(EventType type, const std::string& player, const Card& card1, const Card& card2, const Card& card3, const Card& card4, const Card& card5)
113 : type(type)
114 , player(player)
115 , card1(card1)
116 , card2(card2)
117 , card3(card3)
118 , card4(card4)
119 , card5(card5)
123 Event::Event(EventType type, const std::string& player, const Card& card1, const Card& card2)
124 : type(type)
125 , player(player)
126 , card1(card1)
127 , card2(card2)
130 Event::Event(const std::string& message, EventType type)
131 : type(type)
132 , message(message)
136 Event::Event(EventType type, int smallBlind, int bigBlind, int ante)
137 : type(type)
138 , smallBlind(smallBlind)
139 , bigBlind(bigBlind)
140 , ante(ante)
144 std::string eventToString(const Event& event)
146 std::stringstream ss;
147 std::string playerName = event.player;
149 switch(event.type)
151 case E_JOIN: ss << "Joins: " << playerName << ", chips: " << event.chips; break;
152 case E_QUIT: ss << "Quits: " << playerName << ", chips: " << event.chips; break;
153 case E_REBUY: ss << "Player " << playerName << " rebuys with " << event.chips << " chips"; break;
154 case E_SMALL_BLIND: ss << "Small Blind: " << playerName << ", chips: " << event.chips; break;
155 case E_BIG_BLIND: ss << "Big Blind: " << playerName << ", chips: " << event.chips; break;
156 case E_ANTE: ss << "Ante: " << playerName << ", chips: " << event.chips; break;
157 case E_FOLD: ss << "Folds: " << playerName ; break;
158 case E_CHECK: ss << "Checks: " << playerName; break;
159 case E_CALL: ss << "Calls: " << playerName; break;
160 case E_RAISE: ss << "Raises: " << playerName << ", chips: " << event.chips; break;
161 case E_NEW_DEAL: ss << "New deal." << " SB: " << event.smallBlind << " BB: " << event.bigBlind << " Ante: " << event.ante; break;
162 case E_RECEIVE_CARDS: ss << "Received cards: " << event.card1.getShortName() << " " << event.card2.getShortName(); break;
163 case E_FLOP: ss << "Flop: " << event.card1.getShortName() << " " << event.card2.getShortName() << " " << event.card3.getShortName(); break;
164 case E_TURN: ss << "Turn: " << event.card4.getShortName(); break;
165 case E_RIVER: ss << "River: " << event.card5.getShortName(); break;
166 case E_SHOWDOWN: ss << "Showdown Reached"; break;
167 case E_POT_DIVISION: ss << "Pot size: " << event.chips; break;
168 case E_WIN: ss << "Wins: " << playerName << ", chips: " << event.chips; break;
169 case E_PLAYER_SHOWDOWN: ss << "Shows: " << playerName << ", " << event.card1.getShortName() << " " << event.card2.getShortName(); break;
170 case E_BOAST: ss << "Boasts: " << playerName << ", " << event.card1.getShortName() << " " << event.card2.getShortName(); break;
171 case E_COMBINATION:
173 Combination combo;
174 getCombo(combo, event.card1, event.card2, event.card3, event.card4, event.card5);
175 ss << "Combination: " << playerName << ", " << combo.getNameWithAllCards();
176 break;
178 case E_DEALER: ss << "Dealer: " << playerName; break;
179 case E_TOURNAMENT_RANK: ss << "Ranking: " << playerName << ", Place: " << event.position << ", Score: " << event.chips; break;
180 case E_REVEAL_AI: ss << "Reveal AI: " << playerName << ", AI: " << event.ai; break;
181 case E_LOG_MESSAGE: ss << event.message; break;
182 case E_DEBUG_MESSAGE: ss << "DEBUG MESSAGE: " << event.message; break;
183 default: ss << "??????";
186 return ss.str();
189 std::string eventToStringVerbose(const Event& event)
191 std::stringstream ss;
192 std::string playerName = event.player;
194 switch(event.type)
196 case E_JOIN: ss << "Player " << playerName << " joins with " << event.chips << " chips"; break;
197 case E_QUIT: ss << "Player " << playerName << " leaves with " << event.chips << " chips"; break;
198 case E_REBUY: ss << "Player " << playerName << " rebuys with " << event.chips << " chips"; break;
199 case E_SMALL_BLIND: ss << "Player " << playerName << " places the small blind (" << event.chips << ")"; break;
200 case E_BIG_BLIND: ss << "Player " << playerName << " places the big blind (" << event.chips << ")"; break;
201 case E_ANTE: ss << "Player " << playerName << " places ante (" << event.chips << ")"; break;
202 case E_FOLD: ss << "Player " << playerName << " folds."; break;
203 case E_CHECK: ss << "Player " << playerName << " checks."; break;
204 case E_CALL: ss << "Player " << playerName << " calls."; break;
205 case E_RAISE: ss << "Player " << playerName << " raises with " << event.chips << "."; break;
206 case E_NEW_DEAL: ss << "New deal." << " Small Blind: " << event.smallBlind << " Big Blind: " << event.bigBlind << " Ante: " << event.ante; break;
207 case E_RECEIVE_CARDS: ss << "Received cards: " << event.card1.getShortName() << " " << event.card2.getShortName(); break;
208 case E_FLOP: ss << "Flop: " << event.card1.getShortName() << " " << event.card2.getShortName() << " " << event.card3.getShortName(); break;
209 case E_TURN: ss << "Turn: " << event.card4.getShortName(); break;
210 case E_RIVER: ss << "River: " << event.card5.getShortName(); break;
211 case E_SHOWDOWN: ss << "Showdown Reached"; break;
212 case E_POT_DIVISION: ss << "Betting finished. Pot size: " << event.chips; break;
213 case E_WIN: ss << "Player " << playerName << " wins " << event.chips; break;
214 case E_PLAYER_SHOWDOWN: ss << "Player " << playerName << " shows " << event.card1.getShortName() << " " << event.card2.getShortName(); break;
215 case E_BOAST: ss << "Player " << playerName << " boasts " << event.card1.getShortName() << " " << event.card2.getShortName(); break;
216 case E_COMBINATION:
218 Combination combo;
219 getCombo(combo, event.card1, event.card2, event.card3, event.card4, event.card5);
220 ss << "Player " << playerName << " has " << combo.getNameWithAllCards();
221 break;
223 case E_DEALER: ss << "Player " << playerName << " is dealer"; break;
224 case E_TOURNAMENT_RANK: ss << "Player " << playerName << " finishes at place " << event.position << ". Score: " << event.chips; break;
225 case E_REVEAL_AI: ss << "The AI of player " << playerName << " was: " << event.ai; break;
226 case E_LOG_MESSAGE: ss << event.message; break;
227 case E_DEBUG_MESSAGE: ss << "DEBUG MESSAGE: " << event.message; break;
228 default: ss << "??????";
231 return ss.str();
234 void sendEventToPlayers(std::vector<Player>& players, const Event& event)
236 for(size_t i = 0; i < players.size(); i++)
238 if(!players[i].isHuman() && (event.type == E_LOG_MESSAGE || event.type == E_DEBUG_MESSAGE)) continue; //AI's are not allowed to get this information.
239 players[i].onEvent(event);
242 void sendEventToObservers(std::vector<Observer*>& observers, const Event& event)
244 for(size_t i = 0; i < observers.size(); i++)
246 observers[i]->onEvent(event);
250 void sendEventsToPlayers(size_t& counter, std::vector<Player>& players, std::vector<Observer*>& observers, const std::vector<Event>& events)
252 for(size_t i = counter; i < events.size(); i++)
254 sendEventToPlayers(players, events[i]);
255 sendEventToObservers(observers, events[i]);
258 counter = events.size();