#include "game.h" #include #include Game::p Game::create(Player::p player_1, Player::p player_2, Player::p player_3, Player::p player_4) { Game::p p(new Game(player_1, player_2, player_3, player_4)); p->start(); return p; } Game::~Game() { std::cout << "Game destroyed." << std::endl; } Game::Game(Player::p player_1, Player::p player_2, Player::p player_3, Player::p player_4) { players.push_back(player_1); players.push_back(player_2); players.push_back(player_3); players.push_back(player_4); } void Game::handle_ready() { std::cout << "Still waiting for " << waiting_players << "." << std::endl; if(--waiting_players) { return; } std::cout << "All ready!" << std::endl; round_start(); } void Game::round_start() { players[0]->round_start(); players[0]->id = 0; players[1]->round_start(); players[1]->id = 1; players[2]->round_start(); players[2]->id = 2; players[3]->round_start(); players[3]->id = 3; // Sett opp runden sin state game_state = make_shared(); // Simulates drawing 4, 4 ,4 for each player for (int player_num = 0; player_num < 4; player_num++) { for (int i = 0; i < 3; i++) { for (int y = 0; y < 4; y++) { game_state->players[player_num].hand.push_back(wall.take_one()); } } } // Simulates the second part of drawing with only 1 tile for (int player_num = 0; player_num < 4; player_num++) { game_state->players[player_num].hand.push_back(wall.take_one()); } current_player = 0; num_player_actions = 0; draw_phase = true; round_update(); } void Game::round_update() { if ( draw_phase ) { game_state->players[current_player].hand.push_back(wall.take_one()); Action discard_action; discard_action.type = Action::Discard; discard_action.player = current_player; game_state->possible_actions.push_back(discard_action); // TODO // Add code for calculation of possible riichi, tsumo, kan and draw num_player_actions++; draw_phase = false; } else { // Run if we're in the discard phase // Update who the current player is. if ( current_player == 3) { current_player = 0; } else { current_player++; } draw_phase = true; } // Send RoundState, inkl. liste av mulige actions. players[0]->round_state(game_state); players[1]->round_state(game_state); players[2]->round_state(game_state); players[3]->round_state(game_state); // Kall player->get_action(handle_action) for hver spiller som har actions, om ingen kan gjøre noe så blir // det neste spiller sin tur. if(num_player_actions) { players[0]->get_action(boost::bind(&Game::handle_action, shared_from_this(), _1)); } else { round_update(); } } void Game::handle_action(Action action) { switch ( action.type ) { case Action::Pass: { } break; case Action::Discard: { game_state->players[current_player].pond.push_back(game_state->players[current_player].hand[action.target]); game_state->players[current_player].hand.erase(game_state->players[current_player].hand.begin() + action.target); } break; case Action::Riichi: { } break; case Action::Chi: { if(most_value_action.type != Action::Pon && most_value_action.type != Action::Kan && most_value_action.type != Action::Ron) { most_value_action = action; } } break; case Action::Pon: { if(most_value_action.type != Action::Ron) { most_value_action = action; } } break; case Action::Kan: { } break; case Action::Ron: { } break; case Action::Tsumo: { } break; case Action::Draw: { } break; default: break; } num_player_actions--; // Sjekk action, sjekk om endelig action er avgjort // Oppdater state // Evt. round_end() if (num_player_actions == 0) { round_update(); } } void Game::round_end() { // Flere runder? round_start() // Ferdig? game_end() } void Game::start() { std::cout << "Started a game with " << players[0]->nick() << ", " << players[1]->nick() << ", " << players[2]->nick() << " and " << players[3]->nick() << "." << std::endl; waiting_players = 4; players[0]->game_start(boost::bind(&Game::handle_ready, shared_from_this()), players); players[1]->game_start(boost::bind(&Game::handle_ready, shared_from_this()), players); players[2]->game_start(boost::bind(&Game::handle_ready, shared_from_this()), players); players[3]->game_start(boost::bind(&Game::handle_ready, shared_from_this()), players); }