diff options
| -rw-r--r-- | src/game.c | 25 | ||||
| -rw-r--r-- | src/net/client.c | 16 | ||||
| -rw-r--r-- | src/net/client.h | 1 | ||||
| -rw-r--r-- | src/net/comm.c | 6 | ||||
| -rw-r--r-- | src/net/comm.h | 5 | ||||
| -rw-r--r-- | src/net/server.c | 20 | ||||
| -rw-r--r-- | src/net/server.h | 1 | ||||
| -rw-r--r-- | src/ui.c | 16 |
8 files changed, 72 insertions, 18 deletions
@@ -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); @@ -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); |
