summaryrefslogtreecommitdiff
path: root/src/server_game_states.c
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2011-01-25 16:12:34 +0100
committerReiner Herrmann <reiner@reiner-h.de>2011-01-25 16:12:34 +0100
commitc7181ee943069bde7f5d468d11ee63c3a535980d (patch)
tree56d8dd1128faa734fd0c63f78e1963d9640128d2 /src/server_game_states.c
parent72504b3fa304c1bf0731fec80d3b85c5481ee0a2 (diff)
finished implementing play_cards function for client/server; added new message type next_action which indicates whether the game is finished or the server will deal new cards
Diffstat (limited to 'src/server_game_states.c')
-rw-r--r--src/server_game_states.c78
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;
}