summaryrefslogtreecommitdiff
path: root/src/server_game_states.c
diff options
context:
space:
mode:
authorMario Kilies <MarioKilies@GMX.net>2011-01-25 11:11:47 +0100
committerMario Kilies <MarioKilies@GMX.net>2011-01-25 11:11:47 +0100
commit3fc586325f8fc8fb4f1990bf87ad4c37e722f381 (patch)
treec6e5dfcb251eddc3cc7a413c562849cb14fccedc /src/server_game_states.c
parent6dad43a768646ef0d8f06958446761eb8a1b3f93 (diff)
Created a mainstack datatype. Refactored server game states into separate functions.
Diffstat (limited to 'src/server_game_states.c')
-rw-r--r--src/server_game_states.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/server_game_states.c b/src/server_game_states.c
new file mode 100644
index 0000000..c00fc26
--- /dev/null
+++ b/src/server_game_states.c
@@ -0,0 +1,110 @@
+#include "game_states.h"
+#include <stdlib.h>
+#include <string.h>
+#include "global.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 *d = datamodel();
+
+ 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->players.count; i++)
+ {
+ net_send(client_socks->sockets[i], msg_type_initial_stacks, NULL);
+ }
+ }
+
+ int num_dealcards = main_stack_size(m) / d->players.count;
+ if(num_dealcards > 10)
+ num_dealcards = 10;
+
+ // Deal hand cards to clients
+ for(int i = 0; i < d->players.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);
+ }
+
+ return STATE_SERVER_WAIT_FOR_OPEN_CARDS;
+}
+
+game_state_t state_server_wait_for_open_cards(const socket_list_t *client_socks)
+{
+ data_store *d = datamodel();
+
+ // Receive open cards from clients
+ for(int i = 0; i < d->players.count; i++)
+ {
+ pnoc_t* pl = get_pnoc_from_playerid(&d->players, client_socks->player_ids[i]);
+ assert(pl != NULL);
+ net_recv(client_socks->sockets[i], msg_type_selected_card);
+ pl->open_card = d->selected_card;
+ }
+
+ for(int i = 0; i < d->players.count; i++)
+ net_send(client_socks->sockets[i], msg_type_selected_card_all, NULL);
+
+ //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)
+{
+#if 0
+ data_store *d = datamodel();
+
+ 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();
+ clear_stack(stack_id);
+ }
+ }
+ place_card()
+ {
+ if(count_stack_cards == 6)
+ clear_stack(stack_id);
+ }
+ }
+ }
+
+ if (clients_have_hand_cards)
+ {
+ return STATE_SERVER_WAIT_FOR_OPEN_CARDS;
+ }
+ else
+ {
+ if (main_stack_has_enough_cards_for_clients)
+ {
+ send_action_to_client(DEAL_HAND_CARDS);
+ round++;
+ return STATE_SERVER_DEAL_HAND_CARDS;
+ }
+ else
+ {
+ send_action_to_client(GAME_FINISHED);
+ return STATE_SERVER_GAME_FINISHED;
+ }
+ }
+#endif
+ return 1337;
+}