diff options
| author | Mario Kilies <MarioKilies@GMX.net> | 2011-01-16 07:57:28 +0100 |
|---|---|---|
| committer | Mario Kilies <MarioKilies@GMX.net> | 2011-01-16 07:57:28 +0100 |
| commit | fac5e3de0929c3abb73da552efbda6d641136588 (patch) | |
| tree | 2d1c20909525e657237389a9825e3c3a73dad726 /src | |
| parent | 08a3c0b9979857e708865d2756ba057bb1c664ee (diff) | |
Simplified net_recv(). Refactored 'hand' from array definition to hand_t struct definition.
Diffstat (limited to 'src')
| -rw-r--r-- | src/game.c | 9 | ||||
| -rw-r--r-- | src/hand.c | 6 | ||||
| -rw-r--r-- | src/hand.h | 7 | ||||
| -rw-r--r-- | src/main.c | 12 | ||||
| -rw-r--r-- | src/net.c | 34 | ||||
| -rw-r--r-- | src/net.h | 6 | ||||
| -rw-r--r-- | src/net_client.c | 8 | ||||
| -rw-r--r-- | src/net_server.c | 4 | ||||
| -rw-r--r-- | src/ui.c | 25 | ||||
| -rw-r--r-- | src/ui.h | 4 |
10 files changed, 64 insertions, 51 deletions
@@ -1,5 +1,6 @@ #include "game.h" #include "card.h" +#include "hand.h" #include <stdlib.h> #include <stdbool.h> #include <time.h> @@ -59,14 +60,14 @@ void start_game(const bool servermode, const char *addr, const uint16_t port) const uint32_t score = 10; // Example data set for hand cards window - hand h = {22, 0, 12, 85, 27, 69, 78, 0, 77, 0}; - hand_sort(h); + hand_t h = { {22, 0, 12, 85, 27, 69, 78, 0, 77, 0} }; + hand_sort(&h); // Display all windows ui_display_wnd_table_cards(ts, false, 0); ui_display_wnd_stack_points(ts, false, 0); ui_display_wnd_current_state(pnoc, num_players, 2, score); - ui_display_wnd_hand_cards(h, false, 0); + ui_display_wnd_hand_cards(&h, false, 0); // main game loop while(running) @@ -80,7 +81,7 @@ void start_game(const bool servermode, const char *addr, const uint16_t port) case STATE_WAIT_CARDS: // wait on client until host has dealt cards break; case STATE_SELECTCARD: // player has to select own card, if done, set state to STATE_WAIT_OPPONENTCARDS - ui_choose_card(h); + ui_choose_card(&h); running = false; break; case STATE_WAIT_OPPONENTCARDS: // wait until all opponents have selected their open card. Then check if we have the lowest open card. If so, set state to STATE_SELECTSTACK, otherwise to STATE_WAIT_OPPONENTSTACK @@ -1,5 +1,6 @@ #include "hand.h" #include <stdlib.h> +#include <assert.h> #include "card.h" static int hand_comparator(const void *a, const void *b) @@ -10,7 +11,8 @@ static int hand_comparator(const void *a, const void *b) return c1 - c2; } -void hand_sort(hand h) +void hand_sort(hand_t *h) { - qsort(h, MAX_HAND_CARDS, sizeof(card), hand_comparator); + assert(h != NULL); + qsort(h->cards, MAX_HAND_CARDS, sizeof(card), hand_comparator); } @@ -5,8 +5,11 @@ #define MAX_HAND_CARDS 10 -typedef card hand[MAX_HAND_CARDS]; +typedef struct +{ + card cards[MAX_HAND_CARDS]; +} hand_t; -void hand_sort(hand h); +void hand_sort(hand_t *h); #endif // OXEN_HAND_H @@ -1,5 +1,7 @@ #include <stdlib.h> #include <curses.h> +#include <string.h> +#include <unistd.h> #include "ui.h" #include "game.h" #include "net.h" @@ -22,9 +24,9 @@ int main(int argc, char **argv) int ssock; int* csocks; player_list players; - int opponents = 3; + int opponents = 1; const char* nickname = "deki"; - const hand testhand = { 12, 23, 35, 42, 55, 57, 70, 81, 103, 0 }; + const hand_t testhand = { { 12, 23, 35, 42, 55, 57, 70, 81, 103, 0 } }; servermode = true; port = argv[1]; @@ -51,7 +53,7 @@ int main(int argc, char **argv) // send test hand for(int i=0; i<opponents; i++) - server_deal_cards(csocks[i], testhand); + server_deal_cards(csocks[i], &testhand); // cleanup for(int i=0; i<players.count; i++) @@ -64,7 +66,7 @@ int main(int argc, char **argv) int sock; player_list* players; const char* nickname = "schnippi"; - hand* testhand; + hand_t *testhand; addr = argv[1]; port = argv[2]; @@ -83,7 +85,7 @@ int main(int argc, char **argv) testhand = net_recv(sock, msg_type_deal_cards); printf("received cards: "); for(int i=0; i<MAX_HAND_CARDS; i++) - printf("%d, ", *testhand[i]); + printf("%d, ", testhand->cards[i]); printf("\n"); // cleanup @@ -5,40 +5,42 @@ #include <assert.h> #include "net.h" -void* net_recv(int sock, msg_type_t wanted) +void* net_recv(int sock, msg_type_t type) { - void* result = NULL; - uint8_t peekbuf[2], type, payload_len, *packet, *payload; - ssize_t len = recv(sock, peekbuf, 2, MSG_PEEK); // just peek into packet to determine type + msg_t m; + void *result; + ssize_t len = recv(sock, &m.hdr, sizeof(msg_header_t), MSG_PEEK); // just peek into packet to determine message header assert(len != -1); - type = peekbuf[NET_MSG_OFFSET_TYPE]; - payload_len = peekbuf[NET_MSG_OFFSET_PAYLOAD_LENGTH]; - - if(type != wanted) + if(m.hdr.type != type) { - printf("client_recv: received type %d instead of %d", type, wanted); + printf("net_recv: received message type %d instead of %d", m.hdr.type, type); return NULL; } - packet = malloc(payload_len+NET_MSG_OFFSET_PAYLOAD); - recv(sock, packet, payload_len+NET_MSG_OFFSET_PAYLOAD, 0); - payload = &packet[NET_MSG_OFFSET_PAYLOAD]; + m.payload = malloc(m.hdr.payload_length); // Allocate space for message payload + recv(sock, &m.hdr, sizeof(msg_header_t), 0); // Remove message header from socket + recv(sock, m.payload, m.hdr.payload_length, 0);// And then receive the payload switch(type) { case msg_type_hello: - result = server_recv_hello(payload, payload_len); + result = server_recv_hello(m.payload, m.hdr.payload_length); break; case msg_type_start_game: - result = client_recv_player_list(payload, payload_len); + result = client_recv_player_list(m.payload, m.hdr.payload_length); break; case msg_type_deal_cards: - result = client_recv_deal_cards(payload, payload_len); + result = client_recv_deal_cards(m.payload, m.hdr.payload_length); + break; + default: + printf("net_recv: Unknown message type %d received!\n", type); + exit(EXIT_FAILURE); break; } - free(packet); + + free(m.payload); return result; } @@ -29,7 +29,7 @@ typedef struct typedef struct { msg_header_t hdr; - uint8_t payload[]; + uint8_t *payload; } msg_t; // generic receive function @@ -39,13 +39,13 @@ void* net_recv(int sock, msg_type_t wanted); int server_start(const char* port); int* server_get_players(int serversock, const uint8_t count); void server_start_game(int* clients, const uint8_t clientcount, const player_list* players); -void server_deal_cards(int sock, const hand h); +void server_deal_cards(int sock, const hand_t *h); char* server_recv_hello(const uint8_t* payload, const uint8_t payload_len); // Client side functions int client_connect_server(const char* host, const char* port); void client_hello(int sock, const char* username); player_list* client_recv_player_list(const uint8_t* payload, const uint8_t data_len); -hand* client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len); +hand_t *client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len); #endif // OXEN_NET_H diff --git a/src/net_client.c b/src/net_client.c index 9134cf7..a225529 100644 --- a/src/net_client.c +++ b/src/net_client.c @@ -110,14 +110,16 @@ player_list* client_recv_player_list(const uint8_t* payload, const uint8_t data_ return players; } -hand* client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len) +hand_t *client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len) { - hand* h = malloc(sizeof(hand)); + hand_t *h = malloc(sizeof(hand_t)); assert(payload_len == MAX_HAND_CARDS); // deal_cards packet have fixed size for(int i=0; i<MAX_HAND_CARDS; i++) - *h[i] = payload[i]; + { + h->cards[i] = payload[i]; + } return h; } diff --git a/src/net_server.c b/src/net_server.c index da9d33d..1b60eec 100644 --- a/src/net_server.c +++ b/src/net_server.c @@ -180,14 +180,14 @@ char* server_recv_hello(const uint8_t* payload, const uint8_t payload_len) * @param[in] sock Socket to use * @param[in] h Hand to send */ -void server_deal_cards(int sock, const hand h) +void server_deal_cards(int sock, const hand_t *h) { uint8_t buf[2+MAX_HAND_CARDS]; buf[NET_MSG_OFFSET_TYPE] = msg_type_deal_cards; buf[NET_MSG_OFFSET_PAYLOAD_LENGTH] = MAX_HAND_CARDS; for(int i=0; i<MAX_HAND_CARDS; i++) - buf[NET_MSG_OFFSET_PAYLOAD+i] = h[i]; + buf[NET_MSG_OFFSET_PAYLOAD+i] = h->cards[i]; send(sock, buf, 2+MAX_HAND_CARDS, 0); } @@ -241,7 +241,7 @@ void ui_display_wnd_current_state(const pnoc_t pnoc[], const uint8_t num_players * @param[in] highlight If true, a card will be highlighted * @param[in] highlighted_card The card to highlight. Only used, if highlight is true */ -void ui_display_wnd_hand_cards(const hand h, const bool highlight, const uint8_t highlighted_card) +void ui_display_wnd_hand_cards(const hand_t *h, const bool highlight, const uint8_t highlighted_card) { uint8_t num_zero_cards = 0; @@ -249,7 +249,7 @@ void ui_display_wnd_hand_cards(const hand h, const bool highlight, const uint8_t mvwprintw(w_hand_cards, 0, 0, "Hand Cards:"); wattroff(w_hand_cards, A_BOLD); - // Clear old cards from screen first + // Clear old cards from screen first by drawing emtpy card placeholders over them for (uint8_t i = 0; i < MAX_HAND_CARDS; i++) { if (i - num_zero_cards < 5) // Start with the first row of cards @@ -261,7 +261,7 @@ void ui_display_wnd_hand_cards(const hand h, const bool highlight, const uint8_t for (uint8_t i = 0; i < MAX_HAND_CARDS; i++) { // Cound all 0 cards and don't draw them - if (0 == h[i]) + if (0 == h->cards[i]) { num_zero_cards++; continue; @@ -270,22 +270,22 @@ void ui_display_wnd_hand_cards(const hand h, const bool highlight, const uint8_t if (highlight && i == highlighted_card) { if (i - num_zero_cards < 5) // Start with the first row of cards - draw_card(w_hand_cards, 1, (i - num_zero_cards) * 8, true, h[i]); + draw_card(w_hand_cards, 1, (i - num_zero_cards) * 8, true, h->cards[i]); else // And then draw the second row - draw_card(w_hand_cards, 6, (i - num_zero_cards - 5) * 8, true, h[i]); + draw_card(w_hand_cards, 6, (i - num_zero_cards - 5) * 8, true, h->cards[i]); continue; } if (i - num_zero_cards < 5) // Start with the first row of cards - draw_card(w_hand_cards, 1, (i - num_zero_cards) * 8, false, h[i]); + draw_card(w_hand_cards, 1, (i - num_zero_cards) * 8, false, h->cards[i]); else // And then draw the second row - draw_card(w_hand_cards, 6, (i - num_zero_cards - 5) * 8, false, h[i]); + draw_card(w_hand_cards, 6, (i - num_zero_cards - 5) * 8, false, h->cards[i]); } wrefresh(w_hand_cards); } -uint8_t ui_choose_card(hand h) +uint8_t ui_choose_card(hand_t *h) { int key; uint8_t chosen_card_idx = 0; @@ -294,10 +294,10 @@ uint8_t ui_choose_card(hand h) hand_sort(h); // Select card with lowest index as default - if (0 == h[chosen_card_idx]) + if (0 == h->cards[chosen_card_idx]) { i = (chosen_card_idx + 1) % MAX_HAND_CARDS; - while(0 == h[i]) + while(0 == h->cards[i]) i = (i + 1) % MAX_HAND_CARDS; chosen_card_idx = i; } @@ -311,8 +311,9 @@ uint8_t ui_choose_card(hand h) case KEY_VI_LEFT: // Fall through case KEY_LEFT: + // Add MAX_HAND_CARDS to prevent calculating the modulus of negative values i = (chosen_card_idx - 1 + MAX_HAND_CARDS) % MAX_HAND_CARDS; - while(0 == h[i]) + while(0 == h->cards[i]) i = (i - 1 + MAX_HAND_CARDS) % MAX_HAND_CARDS; chosen_card_idx = i; break; @@ -321,7 +322,7 @@ uint8_t ui_choose_card(hand h) // Fall through case KEY_RIGHT: i = (chosen_card_idx + 1) % MAX_HAND_CARDS; - while(0 == h[i]) + while(0 == h->cards[i]) i = (i + 1) % MAX_HAND_CARDS; chosen_card_idx = i; break; @@ -11,8 +11,8 @@ void ui_display_wnd_table_cards(const tablestacks ts, const bool highlight, const uint8_t highlighted_stack); void ui_display_wnd_stack_points(const tablestacks ts, const bool highlight, const uint8_t highlighted_points); void ui_display_wnd_current_state(const pnoc_t pnoc[], const uint8_t num_players, const uint8_t active_player, const uint32_t score); -void ui_display_wnd_hand_cards(const hand h, const bool highlight, const uint8_t highlighted_card); -uint8_t ui_choose_card(hand h); +void ui_display_wnd_hand_cards(const hand_t *h, const bool highlight, const uint8_t highlighted_card); +uint8_t ui_choose_card(hand_t *h); uint8_t ui_choose_stack(const tablestacks ts); void ui_init(void); void ui_fini(void); |
