From b635637749b91afd0fe07a3850a49855db7f5f7e Mon Sep 17 00:00:00 2001
From: Pascal Engeler <engelerp@phys.ethz.ch>
Date: Tue, 24 May 2022 18:23:48 +0200
Subject: [PATCH] skip broke players, no broke ready or betting

---
 source/general/game_state/game_state.cpp | 36 ++++++++++++++++--------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/source/general/game_state/game_state.cpp b/source/general/game_state/game_state.cpp
index 144e15a..abd2e52 100644
--- a/source/general/game_state/game_state.cpp
+++ b/source/general/game_state/game_state.cpp
@@ -122,16 +122,19 @@ hand* game_state::get_dealers_hand() const {
 bool game_state::everyone_finished() const {
     unsigned int s = _players.size();
     for(unsigned int i = 0; i < s; ++i) {
-        if(!(_players[i]->has_finished_turn()))
+        if(!(_players[i]->has_finished_turn()) && !(_players[i]->is_broke())){
+            std::cout << "Player " << i << " not finished!" << std::endl << std::flush;
             return false;
+        }
     }
+    std::cout << "Everyone finished" << std::endl << std::flush;
     return true;
 }
 
 bool game_state::round_begin() const {
     unsigned int s = _players.size();
     for(unsigned int i = 0; i < s; ++i) {
-        if(!(_players[i]->get_bet_size() == 0))
+        if(!(_players[i]->get_bet_size() == 0) && !(_players[i]->is_broke()))
             return false;
     }
     return true;
@@ -152,8 +155,10 @@ void game_state::setup_round(std::string& err) {
     //setup players
     for (auto player : _players) {
         player->setup_round(err);
-        _shoe->draw_card(player->get_hand(), err);
-        _shoe->draw_card(player->get_hand(), err);
+        if(!player->is_broke()){
+            _shoe->draw_card(player->get_hand(), err);
+            _shoe->draw_card(player->get_hand(), err);
+        }
     }
 
     //initialize the dealer
@@ -295,11 +300,14 @@ bool game_state::make_bet(player* player, int bet_size, std::string& err) {
 
 // functions from our SDS
 void game_state::update_current_player(std::string& err) {
-    int current_player_idx = _current_player_idx->get_value();
-    if(current_player_idx + 1 >= _players.size()) {
+    int current_player_idx = _current_player_idx->get_value() + 1;
+    //skip broke players
+    while(current_player_idx < _players.size() && _players[current_player_idx]->is_broke()){
+      current_player_idx++;
+    }
+    if(current_player_idx >= _players.size()) {
         wrap_up_round(err);
     } else {
-        ++current_player_idx;
         _current_player_idx->set_value(current_player_idx);
     }
 }
@@ -311,15 +319,17 @@ void game_state::wrap_up_round(std::string& err) {
     int dealer_points = _dealers_hand->get_points(err);
 
     for(auto player : _players) {
-        player->wrap_up_round(dealer_points, err);
+        if(!player->is_broke()){
+            player->wrap_up_round(dealer_points, err);
+        }
     }
 
     //Check if we end on too many broke players
     int num_broke_players = 0;
     for(auto player : _players){
-      if(player->is_broke()){
-        ++num_broke_players;
-      }
+        if(player->get_money() <= 0){
+            ++num_broke_players;
+        }
     }
     bool finish_on_broke = (num_broke_players > _players.size() - 2);
 
@@ -328,6 +338,10 @@ void game_state::wrap_up_round(std::string& err) {
     } else {
         // decide which player starts in the next round
         _starting_player_idx->set_value(0);
+        //don't start on a broke player
+        while(_starting_player_idx->get_value() < _players.size() && _players[_starting_player_idx->get_value()]->get_money() <= 0){
+            _starting_player_idx->set_value(_starting_player_idx->get_value()+1);
+        }
         //Flag that setup is required, so game_instance can perform it
         needs_setup = true;
     }
-- 
GitLab