diff options
Diffstat (limited to 'src/server_game_states.c')
| -rw-r--r-- | src/server_game_states.c | 78 |
1 files changed, 58 insertions, 20 deletions
diff --git a/src/server_game_states.c b/src/server_game_states.c index 746b4be..c3314ae 100644 --- a/src/server_game_states.c +++ b/src/server_game_states.c @@ -39,6 +39,11 @@ game_state_t state_server_deal_hand_cards(const socket_list_t *client_socks, con 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; i<num_dealcards; i++) + d->hand.cards[i] = 1; + return STATE_SERVER_WAIT_FOR_OPEN_CARDS; } @@ -58,53 +63,86 @@ game_state_t state_server_wait_for_open_cards(const socket_list_t *client_socks) 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; i<MAX_HAND_CARDS; i++) + { + if(d->hand.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 uint8_t round) +game_state_t state_server_play_cards(const socket_list_t *client_socks, const main_stack_t *m) { -#if 0 data_store_t *d = data_store(); - foreach(open_card) + for(int i=0; i<d->player_list.count; i++) { - play_lowest_open_card + 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 { - determine_stack_for_open_card + 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; j<client_socks->count; 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 { - if (stack_has_to_be_picked) { - receive_stack_from_client(); - send_received_stack_to_other_clients(); - clear_stack(stack_id); - } + d->player_list.players[i].score += card_stack_get_points(cs); + card_stack_clear(cs, c); } - place_card() + else { - if(count_stack_cards == 6) - clear_stack(stack_id); + // put open card on top of stack + for(int j=0; j<MAX_CARD_STACK_SIZE; j++) + { + if(cs->cards[j] != 0) + continue; + cs->cards[j] = c; + break; + } } } } - if (clients_have_hand_cards) + if(hand_count_cards(&d->hand) > 0) // still cards in hand? { return STATE_SERVER_WAIT_FOR_OPEN_CARDS; } else { - if (main_stack_has_enough_cards_for_clients) + if(main_stack_size(m) > d->player_list.count) // no more cards -> deal new cards { - send_action_to_client(DEAL_HAND_CARDS); - round++; + d->game_finished = false; + for(int i=0; i<client_socks->count; i++) + net_send(client_socks->sockets[i], msg_type_next_action, NULL); + return STATE_SERVER_DEAL_HAND_CARDS; } - else + else // empty main stack -> end game { - send_action_to_client(GAME_FINISHED); + d->game_finished = false; + for(int i=0; i<client_socks->count; i++) + net_send(client_socks->sockets[i], msg_type_next_action, NULL); return STATE_SERVER_GAME_FINISHED; } } -#endif + + assert(false); return 1337; } |
