diff options
Diffstat (limited to 'src/game.c')
| -rw-r--r-- | src/game.c | 259 |
1 files changed, 163 insertions, 96 deletions
@@ -7,9 +7,12 @@ #include <unistd.h> #include <assert.h> #include <curses.h> +#include <sys/types.h> #include "ui.h" +#include "global.h" +#include "net.h" -void init_mainstack(card *stack, const uint32_t size) +static void init_mainstack(card *stack, const uint32_t size) { assert(stack != NULL); @@ -28,56 +31,11 @@ void init_mainstack(card *stack, const uint32_t size) } } -void start_game(const bool servermode, const char *addr, const uint16_t port) +static void main_loop_client() { - assert(addr != NULL); - bool running = true; - int cards = MAX_CARD - MIN_CARD + 1; - card mainstack[cards]; - enum gamestate state = STATE_DEALCARDS; - - srand(time(0)); - - init_mainstack(mainstack, cards); - - // Example data set for table cards window - const card_stack_t _cs1 = { { 1, 2, 3, 4, 101 } }; - const card_stack_t _cs2 = { { 6, 7, 53, 0, 0 } }; - const card_stack_t _cs3 = { { 11, 55, 0, 0, 0 } }; - const card_stack_t _cs4 = { { 17, 29, 36, 42, 0 } }; - const table_stacks_t ts = { { _cs1, _cs2, _cs3, _cs4 } }; - - // The stack points window uses ts, too, so there is no separate data set - - // Example data set for current state window - pnoc_t pnoc[10] = { - {"$you", 10}, - {"1234567890", 23}, - {"baz", 38}, - {"foo_bar", 14}, - {"lolcat", 60}, - {"blablub123", 15}, - {"abcdefg", 103}, - {"hello", 98}, - {"hornoxe", 33}, - {"1337nick", 74} - }; - pnoc_sort(pnoc, 10); - const uint8_t num_players = 10; - const uint32_t score = 10; - - // Example data set for hand cards window - hand_t h = { {22, 0, 12, 85, 27, 69, 78, 0, 77, 0} }; - hand_sort(&h); - - // Display all windows - ui_display_wnd_table_cards(&ts, false, 0); - ui_display_wnd_stack_points(&ts, false, 0); - ui_display_wnd_current_state(pnoc, num_players, 2, score); - ui_display_wnd_hand_cards(&h, false, 0); + gamestate state = STATE_CLIENT_WAIT_CARDS; - // main game loop while(running) { /* @@ -90,41 +48,36 @@ void start_game(const bool servermode, const char *addr, const uint16_t port) state = STATE_CLIENT_SELECT_OPEN_CARD; break; - case STATE_SERVER_DEAL_CARDS: - if(round == 1) - send_and_place_table_stacks(); - deal_cards_to_clients(); - state = STATE_SERVER_WAIT_OPEN_CARDS; - break; - case STATE_CLIENT_SELECT_OPEN_CARD: select_open_card(); send_open_card_to_server(); state = STATE_CLIENT_WAIT_FOR_OPEN_CARDS; break; - case STATE_SERVER_WAIT_FOR_OPEN_CARDS: - receive_open_cards_from_clients(); - sort_open_card_list(); // in ascending order - send_open_card_list_to_clients(); - state = STATE_SERVER_PLAY_CARDS; - break; - case STATE_CLIENT_WAIT_FOR_OPEN_CARDS: receive_sorted_list_of_open_cards(); state = STATE_CLIENT_PLAY_CARDS; break; - case STATE_SERVER_PLAY_CARDS: + case STATE_CLIENT_PLAY_CARDS: foreach(open_card) { play_lowest_open_card { determine_stack_for_open_card { - if (stack_has_to_be_picked) { - receive_stack_from_client(); - send_received_stack_to_other_clients(); + if (stack_has_to_be_picked) + { + if (we_have_to_pick) + { + pick_stack(); + send_stack_to_server(); + } + else // another client has to pick + { + receive_stack(); + } + clear_stack(stack_id); } } @@ -136,44 +89,64 @@ void start_game(const bool servermode, const char *addr, const uint16_t port) } } - if (clients_have_hand_cards) + if (we_have_hand_cards) { - state = STATE_SERVER_WAIT_FOR_OPEN_CARDS; + state = STATE_CLIENT_SELECT_OPEN_CARD; } else { - if (main_stack_has_enough_cards_for_clients) - { - send_action_to_client(DEAL_CARDS); - state = STATE_SERVER_DEAL_CARDS; - } - else + receive_next_server_action(); + if (server_action == DEAL_CARDS) { - send_action_to_client(GAME_FINISHED); - state = STATE_SERVER_GAME_FINISHED; + state = STATE_CLIENT_WAIT_CARDS; } + else if (server_action == GAME_FINISHED) + state = STATE_CLIENT_GAME_FINISHED; } break; - case STATE_CLIENT_PLAY_CARDS: + default: + assert(false); // should never happen + } + */ + } + +} + +static void main_loop_server() +{ + bool running = true; + gamestate state = STATE_SERVER_DEAL_CARDS; + + while(running) + { + /* + switch(state) + { + case STATE_SERVER_DEAL_CARDS: + if(round == 1) + send_and_place_table_stacks(); + deal_cards_to_clients(); + state = STATE_SERVER_WAIT_OPEN_CARDS; + break; + + case STATE_SERVER_WAIT_FOR_OPEN_CARDS: + receive_open_cards_from_clients(); + sort_open_card_list(); // in ascending order + send_open_card_list_to_clients(); + state = STATE_SERVER_PLAY_CARDS; + break; + + case STATE_SERVER_PLAY_CARDS: foreach(open_card) { play_lowest_open_card { determine_stack_for_open_card { - if (stack_has_to_be_picked) - { - if (we_have_to_pick) - { - pick_stack(); - send_stack_to_server(); - } - else // another client has to pick - { - receive_stack(); - } - + if (stack_has_to_be_picked) { + receive_stack_from_client(); + send_received_stack_to_other_clients(); clear_stack(stack_id); } } @@ -185,19 +158,22 @@ void start_game(const bool servermode, const char *addr, const uint16_t port) } } - if (we_have_hand_cards) + if (clients_have_hand_cards) { - state = STATE_CLIENT_SELECT_OPEN_CARD; + state = STATE_SERVER_WAIT_FOR_OPEN_CARDS; } else { - receive_next_server_action(); - if (server_action == DEAL_CARDS) + if (main_stack_has_enough_cards_for_clients) { - state = STATE_CLIENT_WAIT_CARDS; + send_action_to_client(DEAL_CARDS); + state = STATE_SERVER_DEAL_CARDS; + } + else + { + send_action_to_client(GAME_FINISHED); + state = STATE_SERVER_GAME_FINISHED; } - else if (server_action == GAME_FINISHED) - state = STATE_CLIENT_GAME_FINISHED; } break; @@ -206,4 +182,95 @@ void start_game(const bool servermode, const char *addr, const uint16_t port) } */ } + } + +void start_game(const bool servermode, const char* addr, const char* port) +{ + assert(addr != NULL && port != NULL); + + bool server_process = false; + int cards = MAX_CARD - MIN_CARD + 1; + card mainstack[cards]; + data_store* data = datamodel(); + + srand(time(0)); + + init_mainstack(mainstack, cards); + + // Example data set for table cards window + const card_stack_t _cs1 = { { 1, 2, 3, 4, 101 } }; + const card_stack_t _cs2 = { { 6, 7, 53, 0, 0 } }; + const card_stack_t _cs3 = { { 11, 55, 0, 0, 0 } }; + const card_stack_t _cs4 = { { 17, 29, 36, 42, 0 } }; + //data->table_stacks = { { _cs1, _cs2, _cs3, _cs4 } }; + data->table_stacks.stacks[0] = _cs1; + data->table_stacks.stacks[1] = _cs2; + data->table_stacks.stacks[2] = _cs3; + data->table_stacks.stacks[3] = _cs4; + //const table_stacks_t ts = { { _cs1, _cs2, _cs3, _cs4 } }; + + // The stack points window uses ts, too, so there is no separate data set + + // Example data set for current state window + pnoc_t pnoc[10] = { + {0, "$you", 10}, + {1, "1234567890", 23}, + {2, "baz", 38}, + {3, "foo_bar", 14}, + {4, "lolcat", 60}, + {5, "blablub123", 15}, + {6, "abcdefg", 103}, + {7, "hello", 98}, + {8, "hornoxe", 33}, + {9, "1337nick", 74} + }; + pnoc_sort(pnoc, 10); + const uint8_t num_players = 10; + const uint32_t score = 10; + + // Example data set for hand cards window + const hand_t h = { {22, 0, 12, 85, 27, 69, 78, 0, 77, 0} }; + data->hand = h; + hand_sort(&data->hand); + + if(servermode) + { + pid_t child = fork(); + server_process = (child > 0); + } + + if(server_process) // Start server and connect to localhost + { + int ssock; + uint8_t num_opponents = 1; + + ssock = server_start(port); + server_get_players(ssock, num_opponents); + + main_loop_server(); + } + else // Connect to server + { + int sock; + + sleep(1); // TODO make sure server process is listening + sock = client_connect_server(addr, port); + client_hello(sock, "nickname_client"); + net_recv(sock, msg_type_start_game); + net_recv(sock, msg_type_deal_cards); + + ui_init(); + + // Display all windows + ui_display_wnd_table_cards(&data->table_stacks, false, 0); + ui_display_wnd_stack_points(&data->table_stacks, false, 0); + ui_display_wnd_current_state(pnoc, num_players, 2, score); + ui_display_wnd_hand_cards(&data->hand, false, 0); + + main_loop_client(); + + ui_fini(); + } +} + |
