summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2011-01-25 14:36:47 +0100
committerReiner Herrmann <reiner@reiner-h.de>2011-01-25 14:36:47 +0100
commit49a31a58e1b77ed0d88c0271247d4f707cf8b641 (patch)
treef7bd9907b5dbb5fd949a4e74d7a0b46e6fbf0179
parentffef04a78f6985e9fcff5454a608de24bd25388e (diff)
implement part of state_client_play_cards(); added new message type: hello reply from server which notifies clients of their player-ids
-rw-r--r--src/card_stack.c25
-rw-r--r--src/card_stack.h2
-rw-r--r--src/client_game_states.c58
-rw-r--r--src/data_store.h1
-rw-r--r--src/game.c8
-rw-r--r--src/net/client.c13
-rw-r--r--src/net/client.h1
-rw-r--r--src/net/comm.c10
-rw-r--r--src/net/comm.h17
-rw-r--r--src/net/server.c7
-rw-r--r--src/net/server.h1
-rw-r--r--src/table_stacks.h2
12 files changed, 108 insertions, 37 deletions
diff --git a/src/card_stack.c b/src/card_stack.c
index 206a9d8..13b14dd 100644
--- a/src/card_stack.c
+++ b/src/card_stack.c
@@ -16,3 +16,28 @@ uint32_t card_stack_get_points(const card_stack_t *cs)
return points;
}
+
+const card card_stack_upper_card(const card_stack_t *cs)
+{
+ assert(cs != NULL);
+
+ for(int i=0; i<MAX_CARD_STACK_SIZE; i++)
+ {
+ card cur = cs->cards[MAX_CARD_STACK_SIZE-1-i];
+ if(cur != 0)
+ return cur;
+ }
+
+ return 0;
+}
+
+void card_stack_clear(card_stack_t *cs, const card new_card)
+{
+ assert(cs != NULL);
+
+ for(int i=0; i<MAX_CARD_STACK_SIZE; i++)
+ cs->cards[i] = 0;
+
+ cs->cards[0] = new_card;
+}
+
diff --git a/src/card_stack.h b/src/card_stack.h
index 86ec526..61d2bf2 100644
--- a/src/card_stack.h
+++ b/src/card_stack.h
@@ -12,5 +12,7 @@ typedef struct
} card_stack_t;
uint32_t card_stack_get_points(const card_stack_t *cs);
+const card card_stack_upper_card(const card_stack_t *cs);
+void card_stack_clear(card_stack_t *cs, const card new_card);
#endif // OXEN_CARD_STACK_H
diff --git a/src/client_game_states.c b/src/client_game_states.c
index 58e55db..2682d67 100644
--- a/src/client_game_states.c
+++ b/src/client_game_states.c
@@ -56,38 +56,49 @@ game_state_t state_client_wait_for_open_cards(const int sock)
game_state_t state_client_play_cards(const int sock, const uint8_t round)
{
-#if 0
- data_store_t *d = data_store();
- uint8_t stack_idx;
+ data_store_t *ds = data_store();
- foreach(open_card)
+ for(int i=0; i<ds->player_list.count; i++)
{
- play_lowest_open_card
+ card c = ds->player_list.players[i].open_card;
+ uint8_t stack_idx = get_stack_idx_for_card(&ds->table_stacks, c);
+
+ if(stack_idx >= NUM_TABLE_STACKS) // card does not fit on any stack
{
- determine_stack_for_open_card
+ uint32_t stack_points;
+
+ if(ds->player_list.players[i].player_id == ds->own_player_id) // our turn to select stack
{
- 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);
- }
+ ds->stack_index = ui_choose_stack(&ds->table_stacks);
+ net_send(sock, msg_type_selected_stack_c, NULL);
}
- place_card()
+
+ net_recv(sock, msg_type_selected_stack_s);
+ stack_points = card_stack_get_points(&ds->table_stacks.stacks[ds->stack_index]);
+ card_stack_clear(&ds->table_stacks.stacks[ds->stack_index], c);
+ }
+ else // card fits on a stack -> place it
+ {
+ card_stack_t* cs = &ds->table_stacks.stacks[stack_idx];
+ if(cs->cards[MAX_CARD_STACK_SIZE-1] != 0) // stack is full
{
- if(count_stack_cards == 6)
- clear_stack(stack_id);
+ uint32_t stack_points = card_stack_get_points(cs);
+ card_stack_clear(cs, c);
+ }
+ else
+ {
+ // 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 0
if (we_have_hand_cards)
{
return STATE_CLIENT_SELECT_OPEN_CARD;
@@ -104,5 +115,6 @@ game_state_t state_client_play_cards(const int sock, const uint8_t round)
return STATE_CLIENT_GAME_FINISHED;
}
#endif
+
return 1337;
}
diff --git a/src/data_store.h b/src/data_store.h
index afc87bc..71fedae 100644
--- a/src/data_store.h
+++ b/src/data_store.h
@@ -8,6 +8,7 @@
typedef struct
{
char nickname[MAX_PLAYER_NAME_LENGTH+1];
+ player_id_t own_player_id;
player_list_t player_list;
table_stacks_t table_stacks;
hand_t hand;
diff --git a/src/game.c b/src/game.c
index 6addee3..e2d8f88 100644
--- a/src/game.c
+++ b/src/game.c
@@ -110,10 +110,11 @@ void start_game(const bool servermode, const char* addr, const char* port)
for(int i = 0; i < num_players; i++)
{
- net_recv(client_socks.sockets[i], msg_type_hello);
- // assign ids (starting with 1; 0 is invalid)
+ net_recv(client_socks.sockets[i], msg_type_hello_c);
+ // assign ids (starting with 1; 0 is invalid) and notify clients of their ids
client_socks.player_ids[i] = i+1;
data->player_list.players[i].player_id = i+1;
+ net_send(client_socks.sockets[i], msg_type_hello_s, &data->player_list.players[i]);
printf("Player connected: %s\n", data->player_list.players[i].player_name);
}
@@ -133,7 +134,8 @@ void start_game(const bool servermode, const char* addr, const char* port)
data_store_t *data = data_store();
strncpy(data->nickname, "nickname", 10);
- net_send(sock, msg_type_hello, NULL);
+ net_send(sock, msg_type_hello_c, NULL);
+ net_recv(sock, msg_type_hello_s);
net_recv(sock, msg_type_start_game);
ui_init();
diff --git a/src/net/client.c b/src/net/client.c
index ae0c828..1768926 100644
--- a/src/net/client.c
+++ b/src/net/client.c
@@ -140,11 +140,22 @@ bool client_parse_selected_card_all(const msg_t *m)
return true;
}
+bool client_parse_hello(const msg_t *m)
+{
+ assert(m != NULL);
+ assert(m->hdr.payload_length == 1);
+
+ data_store_t *ds = data_store();
+ ds->own_player_id = m->payload[0];
+
+ return true;
+}
+
void client_prep_hello(msg_t *m)
{
data_store_t *ds = data_store();
uint8_t namelen = strlen(ds->nickname);
- m->hdr.type = msg_type_hello;
+ m->hdr.type = msg_type_hello_c;
memcpy(m->payload, ds->nickname, namelen);
m->hdr.payload_length = namelen;
}
diff --git a/src/net/client.h b/src/net/client.h
index 56b9839..b15e329 100644
--- a/src/net/client.h
+++ b/src/net/client.h
@@ -11,6 +11,7 @@ void client_prep_hello(msg_t *m);
void client_prep_selected_card(msg_t *m);
void client_prep_selected_stack(msg_t *m);
+bool client_parse_hello(const msg_t *m);
bool client_parse_player_list(const msg_t *m);
bool client_parse_deal_hand(const msg_t *m);
bool client_parse_selected_stack(const msg_t *m);
diff --git a/src/net/comm.c b/src/net/comm.c
index ab9f34b..000c96f 100644
--- a/src/net/comm.c
+++ b/src/net/comm.c
@@ -29,9 +29,12 @@ bool net_recv(const int sock, const msg_type_t type)
switch(type)
{
- case msg_type_hello:
+ case msg_type_hello_c:
result = server_parse_hello(&m);
break;
+ case msg_type_hello_s:
+ result = client_parse_hello(&m);
+ break;
case msg_type_start_game:
result = client_parse_player_list(&m);
break;
@@ -73,9 +76,12 @@ bool net_send(const int sock, const msg_type_t type, const void *data)
switch(type)
{
- case msg_type_hello:
+ case msg_type_hello_c:
client_prep_hello(&m);
break;
+ case msg_type_hello_s:
+ server_prep_hello(&m, data);
+ break;
case msg_type_selected_card:
client_prep_selected_card(&m);
break;
diff --git a/src/net/comm.h b/src/net/comm.h
index 0cc5cd2..a014c6d 100644
--- a/src/net/comm.h
+++ b/src/net/comm.h
@@ -15,14 +15,15 @@
typedef enum
{
// Specify message type identifiers here
- msg_type_hello = 0x0,
- msg_type_start_game = 0x1,
- msg_type_deal_hand = 0x2,
- msg_type_initial_stacks = 0x3,
- msg_type_selected_card = 0x4,
- msg_type_selected_card_all = 0x5,
- msg_type_selected_stack_c = 0x6,
- msg_type_selected_stack_s = 0x7,
+ msg_type_hello_c = 0x0,
+ msg_type_hello_s = 0x1,
+ msg_type_start_game = 0x2,
+ msg_type_deal_hand = 0x3,
+ msg_type_initial_stacks = 0x4,
+ msg_type_selected_card = 0x5,
+ msg_type_selected_card_all = 0x6,
+ msg_type_selected_stack_c = 0x7,
+ msg_type_selected_stack_s = 0x8,
} msg_type_t;
// Header format
diff --git a/src/net/server.c b/src/net/server.c
index 2e186d0..7e9a111 100644
--- a/src/net/server.c
+++ b/src/net/server.c
@@ -173,6 +173,13 @@ void server_prep_start_game(msg_t *m)
m->hdr.payload_length = pos;
}
+void server_prep_hello(msg_t *m, const player_list_entry_t* player)
+{
+ m->hdr.type = msg_type_hello_s;
+ m->payload[0] = player->player_id;
+ m->hdr.payload_length = 1;
+}
+
void server_prep_selected_stack(msg_t *m)
{
data_store_t *ds = data_store();
diff --git a/src/net/server.h b/src/net/server.h
index 3522e14..625f24f 100644
--- a/src/net/server.h
+++ b/src/net/server.h
@@ -18,6 +18,7 @@ typedef struct
int server_start(const char* port);
void server_get_players(int serversock, socket_list_t* client_socks, const uint8_t count);
+void server_prep_hello(msg_t *m, const player_list_entry_t* player);
void server_prep_start_game(msg_t *m);
void server_prep_deal_hand(msg_t *m, const hand_t *h);
void server_prep_selected_stack(msg_t *m);
diff --git a/src/table_stacks.h b/src/table_stacks.h
index 57fddba..3528012 100644
--- a/src/table_stacks.h
+++ b/src/table_stacks.h
@@ -10,4 +10,6 @@ typedef struct
card_stack_t stacks[NUM_TABLE_STACKS];
} table_stacks_t;
+const uint8_t get_stack_idx_for_card(const table_stacks_t* stack_list, const card c);
+
#endif // OXEN_TABLE_STACKS_H