diff options
| -rw-r--r-- | src/card_stack.c | 25 | ||||
| -rw-r--r-- | src/card_stack.h | 2 | ||||
| -rw-r--r-- | src/client_game_states.c | 58 | ||||
| -rw-r--r-- | src/data_store.h | 1 | ||||
| -rw-r--r-- | src/game.c | 8 | ||||
| -rw-r--r-- | src/net/client.c | 13 | ||||
| -rw-r--r-- | src/net/client.h | 1 | ||||
| -rw-r--r-- | src/net/comm.c | 10 | ||||
| -rw-r--r-- | src/net/comm.h | 17 | ||||
| -rw-r--r-- | src/net/server.c | 7 | ||||
| -rw-r--r-- | src/net/server.h | 1 | ||||
| -rw-r--r-- | src/table_stacks.h | 2 |
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; @@ -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 |
