#include "game.h" #include "card.h" #include "hand.h" #include #include #include #include #include #include #include #include #include "ui.h" #include "data_store.h" #include "net/comm.h" #include "net/client.h" #include "net/server.h" #include "game_states.h" #include "main_stack.h" static void main_loop_client(int sock) { bool running = true; game_state_t state = STATE_CLIENT_WAIT_FOR_HAND_CARDS; uint8_t round = 0; while(running) { switch(state) { case STATE_CLIENT_WAIT_FOR_HAND_CARDS: round++; state = state_client_wait_for_hand_cards(sock, round); break; case STATE_CLIENT_SELECT_OPEN_CARD: state = state_client_select_open_card(sock); break; case STATE_CLIENT_WAIT_FOR_OPEN_CARDS: state = state_client_wait_for_open_cards(sock); break; case STATE_CLIENT_PLAY_CARDS: state = state_client_play_cards(sock); break; case STATE_CLIENT_GAME_FINISHED: running = false; break; default: printf("main_loop_client: entered unknown state\n"); exit(EXIT_FAILURE); } } } static void main_loop_server(socket_list_t* client_socks) { bool running = true; uint8_t round = 0; game_state_t state = STATE_SERVER_DEAL_HAND_CARDS; main_stack_t m; main_stack_init(&m); while(running) { switch(state) { case STATE_SERVER_DEAL_HAND_CARDS: round++; state = state_server_deal_hand_cards(client_socks, round, &m); break; case STATE_SERVER_WAIT_FOR_OPEN_CARDS: state = state_server_wait_for_open_cards(client_socks); break; case STATE_SERVER_PLAY_CARDS: state = state_server_play_cards(client_socks, &m); break; case STATE_SERVER_GAME_FINISHED: running = false; break; default: printf("main_loop_server: entered unknown state\n"); exit(EXIT_FAILURE); } } } void start_game(const bool servermode, const char* addr, const char* port) { assert(addr != NULL && port != NULL); bool server_process = false; if(servermode) { pid_t child = fork(); server_process = (child > 0); } if(server_process) // Start server and connect to localhost { int server_sock; socket_list_t client_socks; uint8_t num_players = 1; srand(time(0)); // Initialize RNG data_store_t *data = data_store(); server_sock = server_start(port); server_get_players(server_sock, &client_socks, num_players); data->player_list.count = num_players; for(int i = 0; i < num_players; i++) { 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); } for(int i = 0; i < num_players; i++) { net_send(client_socks.sockets[i], msg_type_start_game, NULL); } main_loop_server(&client_socks); } else // Connect to server { int sock; //sleep(1); // TODO make sure server process is listening sock = client_connect_server(addr, port); data_store_t *data = data_store(); strncpy(data->nickname, "nickname", 10); net_send(sock, msg_type_hello_c, NULL); net_recv(sock, msg_type_hello_s); net_recv(sock, msg_type_start_game); ui_init(); // Display all windows ui_display_wnd_table_cards(&data->table_stacks, false, 0); ui_display_wnd_stack_points(&data->table_stacks, false, 0); ui_display_wnd_current_state(&data->player_list, data->player_list.count, false, 0, 0); ui_display_wnd_hand_cards(&data->hand, false, 0); main_loop_client(sock); ui_fini(); } }