summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2011-01-24 22:05:57 +0100
committerReiner Herrmann <reiner@reiner-h.de>2011-01-24 22:05:57 +0100
commitafe777a3cfa06fbdf391a338ba8506cf9cbcbb47 (patch)
tree92eef4d2fd4e90b2149e39b5b4d7523205b3476e
parent6f0d8cbe42c1097eb540bcd83b9be2b16c31a923 (diff)
server: send open cards to clients
client: receive open cards from clients, sort and display them
-rw-r--r--src/game.c25
-rw-r--r--src/net/client.c16
-rw-r--r--src/net/client.h1
-rw-r--r--src/net/comm.c6
-rw-r--r--src/net/comm.h5
-rw-r--r--src/net/server.c20
-rw-r--r--src/net/server.h1
-rw-r--r--src/ui.c16
8 files changed, 72 insertions, 18 deletions
diff --git a/src/game.c b/src/game.c
index d9e7bdd..21675d9 100644
--- a/src/game.c
+++ b/src/game.c
@@ -98,15 +98,20 @@ static void main_loop_client(int sock)
net_send(sock, msg_type_selected_card, NULL);
state = STATE_CLIENT_WAIT_FOR_OPEN_CARDS;
- sleep(2);
- return;
break;
-#if 0
+
case STATE_CLIENT_WAIT_FOR_OPEN_CARDS:
- receive_sorted_list_of_open_cards();
+ net_recv(sock, msg_type_selected_card_all);
+ pnoc_sort(data->players.players, MAX_PLAYERS); // sort in ascending order
+
+ ui_display_wnd_current_state(data->players.players, MAX_PLAYERS, 0, 0); // TODO fix parameters
+
state = STATE_CLIENT_PLAY_CARDS;
+ sleep(2);
+ return;
break;
+#if 0
case STATE_CLIENT_PLAY_CARDS:
foreach(open_card)
{
@@ -219,12 +224,10 @@ static void main_loop_server(socket_list_t* client_socks)
assert(pl != NULL);
net_recv(client_socks->sockets[i], msg_type_selected_card);
pl->open_card = data->selected_card;
- printf("[Server] received open card: %d\n", pl->open_card);
}
- //sort_open_card_list(); // in ascending order
-
- //send_open_card_list_to_clients();
+ for(int i=0; i<data->players.count; i++)
+ net_send(client_socks->sockets[i], msg_type_selected_card_all, NULL);
state = STATE_SERVER_PLAY_CARDS;
return;
@@ -323,9 +326,9 @@ 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
- client_socks.player_ids[i] = i;
- data->players.players[i].player_id = i;
+ // assign ids (starting with 1; 0 is invalid)
+ client_socks.player_ids[i] = i+1;
+ data->players.players[i].player_id = i+1;
printf("Player connected: %s\n", data->players.players[i].player_name);
}
diff --git a/src/net/client.c b/src/net/client.c
index bcbaf9a..73d889a 100644
--- a/src/net/client.c
+++ b/src/net/client.c
@@ -124,6 +124,22 @@ bool client_parse_initial_stacks(const msg_t *m)
return true;
}
+bool client_parse_selected_card_all(const msg_t *m)
+{
+ assert(m != NULL);
+ assert(m->hdr.payload_length % 2 == 0); // payload: n times id+card
+
+ data_store* ds = datamodel();
+ for(int i=0; i<m->hdr.payload_length; i+=2)
+ {
+ uint8_t pid = m->payload[i];
+ pnoc_t* pnoc = get_pnoc_from_playerid(&ds->players, pid);
+ pnoc->open_card = m->payload[i+1];
+ }
+
+ return true;
+}
+
void client_prep_hello(msg_t *m)
{
data_store* ds = datamodel();
diff --git a/src/net/client.h b/src/net/client.h
index 918b98f..56b9839 100644
--- a/src/net/client.h
+++ b/src/net/client.h
@@ -15,5 +15,6 @@ 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);
bool client_parse_initial_stacks(const msg_t *m);
+bool client_parse_selected_card_all(const msg_t *m);
#endif // OXEN_CLIENT_H
diff --git a/src/net/comm.c b/src/net/comm.c
index 042cb00..ab9f34b 100644
--- a/src/net/comm.c
+++ b/src/net/comm.c
@@ -44,6 +44,9 @@ bool net_recv(const int sock, const msg_type_t type)
case msg_type_selected_card:
result = server_parse_selected_card(&m);
break;
+ case msg_type_selected_card_all:
+ result = client_parse_selected_card_all(&m);
+ break;
case msg_type_selected_stack_c:
result = server_parse_selected_stack(&m);
break;
@@ -91,6 +94,9 @@ bool net_send(const int sock, const msg_type_t type, const void *data)
case msg_type_initial_stacks:
server_prep_initial_stacks(&m);
break;
+ case msg_type_selected_card_all:
+ server_prep_selected_card_all(&m);
+ break;
default:
printf("net_send: Unknown message type %d given\n", type);
exit(EXIT_FAILURE);
diff --git a/src/net/comm.h b/src/net/comm.h
index c7174ff..0cc5cd2 100644
--- a/src/net/comm.h
+++ b/src/net/comm.h
@@ -20,8 +20,9 @@ typedef enum
msg_type_deal_hand = 0x2,
msg_type_initial_stacks = 0x3,
msg_type_selected_card = 0x4,
- msg_type_selected_stack_c = 0x5,
- msg_type_selected_stack_s = 0x6,
+ msg_type_selected_card_all = 0x5,
+ msg_type_selected_stack_c = 0x6,
+ msg_type_selected_stack_s = 0x7,
} msg_type_t;
// Header format
diff --git a/src/net/server.c b/src/net/server.c
index b0cd5e2..c5a0cc1 100644
--- a/src/net/server.c
+++ b/src/net/server.c
@@ -205,3 +205,23 @@ void server_prep_initial_stacks(msg_t *m)
m->hdr.payload_length = NUM_TABLE_STACKS;
}
+
+void server_prep_selected_card_all(msg_t *m)
+{
+ uint8_t pos = 0;
+ data_store* ds = datamodel();
+
+ m->hdr.type = msg_type_selected_card_all;
+
+ for(int i=0; i<MAX_PLAYERS; i++)
+ {
+ pnoc_t* pnoc = &ds->players.players[i];
+ if(pnoc->player_id == 0) // invalid player
+ continue;
+ m->payload[pos++] = pnoc->player_id;
+ m->payload[pos++] = pnoc->open_card;
+ }
+
+ m->hdr.payload_length = pos;
+}
+
diff --git a/src/net/server.h b/src/net/server.h
index 196700c..8c2d195 100644
--- a/src/net/server.h
+++ b/src/net/server.h
@@ -22,6 +22,7 @@ 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);
void server_prep_initial_stacks(msg_t *m);
+void server_prep_selected_card_all(msg_t *m);
bool server_parse_hello(const msg_t *m);
bool server_parse_selected_card(const msg_t *m);
diff --git a/src/ui.c b/src/ui.c
index 406ecb3..d416d37 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -215,6 +215,7 @@ void ui_display_wnd_stack_points(const table_stacks_t *ts, const bool highlight,
void ui_display_wnd_current_state(const pnoc_t pnoc[], const uint8_t num_players, const uint8_t active_player, const uint32_t score)
{
assert(pnoc != NULL);
+ uint8_t pos = 0;
wattron(w_current_state, A_BOLD);
mvwprintw(w_current_state, 0, 0, "Current state:");
@@ -226,22 +227,27 @@ void ui_display_wnd_current_state(const pnoc_t pnoc[], const uint8_t num_players
for (uint8_t i = 0; i < num_players; i++)
{
+ if (pnoc[i].player_id == 0) // invalid player
+ continue;
+
if (i == active_player)
wattron(w_current_state, COLOR_PAIR(CP_YELLOW_ON_BLACK));
- if (i < 5)
+ if (pos < 5)
{
- mvwprintw(w_current_state, 2+i, 1, "%-s", pnoc[i].player_name);
- mvwprintw(w_current_state, 2+i, 13, "%3d", pnoc[i].open_card);
+ mvwprintw(w_current_state, 2+pos, 1, "%-s", pnoc[i].player_name);
+ mvwprintw(w_current_state, 2+pos, 13, "%3d", pnoc[i].open_card);
}
else
{
- mvwprintw(w_current_state, 2+(i-5), 22, "%-s", pnoc[i].player_name);
- mvwprintw(w_current_state, 2+(i-5), 34, "%3d", pnoc[i].open_card);
+ mvwprintw(w_current_state, 2+(pos-5), 22, "%-s", pnoc[i].player_name);
+ mvwprintw(w_current_state, 2+(pos-5), 34, "%3d", pnoc[i].open_card);
}
if (i == active_player)
wattroff(w_current_state, COLOR_PAIR(CP_YELLOW_ON_BLACK));
+
+ pos++;
}
wrefresh(w_current_state);