#include "game_states.h" #include #include #include "data_store.h" game_state_t state_server_deal_hand_cards(const socket_list_t *client_socks, const uint8_t round, main_stack_t *m) { data_store_t *d = data_store(); if(round == 1) { // Draw cards for initial stacks and send them to clients d->table_stacks.stacks[0].cards[0] = main_stack_remove_card(m); d->table_stacks.stacks[1].cards[0] = main_stack_remove_card(m); d->table_stacks.stacks[2].cards[0] = main_stack_remove_card(m); d->table_stacks.stacks[3].cards[0] = main_stack_remove_card(m); for(int i = 0; i < d->player_list.count; i++) { net_send(client_socks->sockets[i], msg_type_initial_stacks, NULL); } } int num_dealcards = main_stack_size(m) / d->player_list.count; if(num_dealcards > 10) num_dealcards = 10; // Deal hand cards to clients for(int i = 0; i < d->player_list.count; i++) { hand_t h; memset(h.cards, 0, MAX_HAND_CARDS); for(int j = 0; j < num_dealcards; j++) h.cards[j] = main_stack_remove_card(m); hand_sort(&h); net_send(client_socks->sockets[i], msg_type_deal_hand, &h); } // set own pseudo hand to keep track of number of available hand cards memset(&d->hand.cards, 0, MAX_HAND_CARDS); for(int i=0; ihand.cards[i] = 1; return STATE_SERVER_WAIT_FOR_OPEN_CARDS; } game_state_t state_server_wait_for_open_cards(const socket_list_t *client_socks) { data_store_t *d = data_store(); // Receive open cards from clients for(int i = 0; i < d->player_list.count; i++) { player_list_entry_t *ple = get_player_list_entry_by_player_id(&d->player_list, client_socks->player_ids[i]); assert(ple != NULL); net_recv(client_socks->sockets[i], msg_type_selected_card); ple->open_card = d->selected_card; } for(int i = 0; i < d->player_list.count; i++) net_send(client_socks->sockets[i], msg_type_selected_card_all, NULL); // update local hand for tracking number of cards for(int i=0; ihand.cards[i] == 1) { d->hand.cards[i] = 0; break; } } player_list_sort_by_open_card(&d->player_list, d->player_list.count); // sort in ascending order //return STATE_SERVER_PLAY_CARDS; return STATE_SERVER_WAIT_FOR_OPEN_CARDS; // just for testing } game_state_t state_server_play_cards(const socket_list_t *client_socks, const main_stack_t *m) { data_store_t *d = data_store(); for(int i=0; iplayer_list.count; i++) { card c = d->player_list.players[i].open_card; uint8_t stack_idx = get_stack_idx_for_card(&d->table_stacks, c); if(stack_idx >= NUM_TABLE_STACKS) // card does not fit on any stack { int cur_sock = socket_for_player_id(client_socks, d->player_list.players[i].player_id); net_recv(cur_sock, msg_type_selected_stack_c); for(int j=0; jcount; j++) // send received stack to all clients (including the one who sent it) net_send(client_socks->sockets[i], msg_type_selected_stack_s, NULL); d->player_list.players[i].score += card_stack_get_points(&d->table_stacks.stacks[d->stack_index]); card_stack_clear(&d->table_stacks.stacks[d->stack_index], c); } else // card fits on a stack -> place it { card_stack_t* cs = &d->table_stacks.stacks[stack_idx]; if(cs->cards[MAX_CARD_STACK_SIZE-1] != 0) // stack is full { d->player_list.players[i].score += card_stack_get_points(cs); card_stack_clear(cs, c); } else { // put open card on top of stack for(int j=0; jcards[j] != 0) continue; cs->cards[j] = c; break; } } } } if(hand_count_cards(&d->hand) > 0) // still cards in hand? { return STATE_SERVER_WAIT_FOR_OPEN_CARDS; } else { if(main_stack_size(m) > d->player_list.count) // no more cards -> deal new cards { d->game_finished = false; for(int i=0; icount; i++) net_send(client_socks->sockets[i], msg_type_next_action, NULL); return STATE_SERVER_DEAL_HAND_CARDS; } else // empty main stack -> end game { d->game_finished = false; for(int i=0; icount; i++) net_send(client_socks->sockets[i], msg_type_next_action, NULL); return STATE_SERVER_GAME_FINISHED; } } assert(false); return 1337; }