diff --git a/battle.c b/battle.c index 9605ad1..e755471 100644 --- a/battle.c +++ b/battle.c @@ -17,7 +17,6 @@ SDL_Rect mouse_rect; SDL_Rect bot_rect, hand_rect; -SDL_Point mouse_pos; int check_col(int i); int selected_card; @@ -32,7 +31,6 @@ void start_battle(){ dragging = 0; PRINT_M(STARTING GAME LOOP); - //SDL_Texture *maroon = IMG_LoadTexture(renderer, "assets/maroon.png"); SDL_Texture *grid = IMG_LoadTexture(renderer, "assets/battle_grid.png"); SDL_Texture *card = IMG_LoadTexture(renderer, "assets/default_card.png"); SDL_Texture *selected = IMG_LoadTexture(renderer, "assets/selected_card.png"); @@ -164,8 +162,7 @@ void start_battle(){ else { selected_card = -1; } for(i = 0; i < hand.handsize; i++) { - hand.card_rects[i].x = hand_rect.x + BOARDER_THICKNESS + ( spacing * i) - - ((CARD_SIZE - CARD_W)>>1) ; + hand.card_rects[i].x = hand_rect.x + BOARDER_THICKNESS + ( spacing * i); hand.card_rects[i].y = hand_rect.y + BOARDER_THICKNESS; if(check && SDL_PointInRect(&mouse_pos, &(hand.card_rects[i]))) { diff --git a/game.c b/game.c index b230be2..cfc7647 100644 --- a/game.c +++ b/game.c @@ -9,16 +9,20 @@ #include - - -void start_game() +void init_start_game() { + PRINT_M(INIT START GAME) +} + + + +void render_start_game() +{ + state = OVERWORLD; - start_overworld(); + return; } - - diff --git a/host.c b/host.c index 60aa5b9..685b71d 100644 --- a/host.c +++ b/host.c @@ -15,49 +15,116 @@ #define BOARDER_THICKNESS 20 int over_object; - -char player_names[MAX_PLAYERS][MAX_NAMESZ]; -char temp_name[MAX_NAMESZ]; -char lobby_name[MAX_NAMESZ]; -char lobby_name_perm[MAX_NAMESZ]; int num_players = 1; int lobby_has_name = 0; +struct host_ctx +{ + + char player_names[MAX_PLAYERS][MAX_NAMESZ]; + char temp_name[MAX_NAMESZ]; + char lobby_name[MAX_NAMESZ]; + char lobby_name_perm[MAX_NAMESZ]; -SDL_Rect set_name_rect, name_rect, player_name_rect; -SDL_Rect player_rects[MAX_PLAYERS]; -SDL_Rect player_name_rects[MAX_PLAYERS]; -SDL_Rect start_rect; + SDL_Rect set_name_rect, name_rect, player_name_rect; + SDL_Rect player_rects[MAX_PLAYERS]; + SDL_Rect player_name_rects[MAX_PLAYERS]; + SDL_Rect start_rect; -TTF_Font* font; -SDL_Color white = {255, 255, 255, 0}; -SDL_Surface *set_name_surf; -SDL_Surface *start_surf; -SDL_Surface *lobby_name_surf; + TTF_Font* font; + SDL_Surface *set_name_surf; + SDL_Surface *start_surf; + SDL_Surface *lobby_name_surf; -SDL_Texture *set_name_tex; -SDL_Texture *lobby_name_tex; -SDL_Texture *start_tex; + SDL_Texture *set_name_tex; + SDL_Texture *lobby_name_tex; + SDL_Texture *start_tex; -SDL_Surface *player_name_surfs[MAX_PLAYERS]; -SDL_Surface *player_tempname_surf; -SDL_Texture *player_name_texs[MAX_PLAYERS]; -SDL_Texture *player_tempname_tex; + SDL_Surface *player_name_surfs[MAX_PLAYERS]; + SDL_Surface *player_tempname_surf; + SDL_Texture *player_name_texs[MAX_PLAYERS]; + SDL_Texture *player_tempname_tex; +}; +struct host_ctx host; + +void init_host() +{ + int i; + + over_object = NO_OBJECT; + + strcpy(host.player_names[0], "player_1"); + strcpy(host.player_names[1], "no_player_2"); + strcpy(host.player_names[2], "no_player_3"); + strcpy(host.player_names[3], "no_player_4"); + + host.font = TTF_OpenFont("assets/font.ttf", 24); + host.set_name_surf = TTF_RenderText_Solid(host.font, "set name", white); + host.start_surf = TTF_RenderText_Solid(host.font, "start game", white); + host.lobby_name_surf = TTF_RenderText_Solid(host.font, host.lobby_name, white); + + host.set_name_tex = SDL_CreateTextureFromSurface(renderer, host.set_name_surf); + host.start_tex = SDL_CreateTextureFromSurface(renderer, host.start_surf); + + + host.set_name_rect.w = DEF_WINDOW_WIDTH >> 3; + host.set_name_rect.h = DEF_WINDOW_HEIGHT >> 4; + host.set_name_rect.x = DEF_WINDOW_WIDTH - (host.set_name_rect.w << 1); + host.set_name_rect.y = DEF_WINDOW_HEIGHT - (host.set_name_rect.h << 2); + + host.name_rect.w = DEF_WINDOW_WIDTH - (host.set_name_rect.w << 2) - (BOARDER_THICKNESS << 1); + host.name_rect.h = host.set_name_rect.h; + host.name_rect.x = (host.set_name_rect.w << 1) + BOARDER_THICKNESS; + host.name_rect.y = host.set_name_rect.y; + + host.start_rect.w = host.set_name_rect.w; + host.start_rect.h = host.set_name_rect.h; + host.start_rect.x = (DEF_WINDOW_WIDTH >> 1) - (host.start_rect.w >> 1); + host.start_rect.y = host.set_name_rect.y + host.set_name_rect.h + BOARDER_THICKNESS; + + host.player_name_rect.w = DEF_WINDOW_WIDTH - (host.set_name_rect.w << 2) - (BOARDER_THICKNESS << 1); + host.player_name_rect.h = host.set_name_rect.h; + host.player_name_rect.x = (host.set_name_rect.w << 1) + BOARDER_THICKNESS; + host.player_name_rect.y = host.set_name_rect.y; + + host.player_rects[0].w = host.player_rects[1].w = host.player_rects[2].w = host.player_rects[3].w + = DEF_WINDOW_WIDTH - (host.set_name_rect.w << 1); + host.player_rects[0].h = host.player_rects[1].h = host.player_rects[2].h = host.player_rects[3].h + = ((DEF_WINDOW_HEIGHT - (DEF_WINDOW_HEIGHT - host.set_name_rect.y)) + - (BOARDER_THICKNESS << 2) - BOARDER_THICKNESS) >> 2; + host.player_rects[0].x = host.player_rects[1].x = host.player_rects[2].x = host.player_rects[3].x + = host.set_name_rect.w; + + host.player_rects[0].y = BOARDER_THICKNESS; + host.player_rects[1].y = host.player_rects[0].y + host.player_rects[0].h + BOARDER_THICKNESS; + host.player_rects[2].y = host.player_rects[1].y + host.player_rects[1].h + BOARDER_THICKNESS; + host.player_rects[3].y = host.player_rects[2].y + host.player_rects[2].h + BOARDER_THICKNESS; + + for(i = 0; i < MAX_PLAYERS; i++) + { + host.player_name_rects[i].w = host.player_rects[i].w; + host.player_name_rects[i].h = host.player_rects[i].h - (BOARDER_THICKNESS << 1); + host.player_name_rects[i].x = host.player_rects[i].x + BOARDER_THICKNESS; + host.player_name_rects[i].y = host.player_rects[i].y + BOARDER_THICKNESS; + } + + return; +} char *get_this_name(int i) { if(!lobby_has_name) { - if(i == -1){return lobby_name; } - if(i == 0) { return lobby_name_perm; } + if(i == -1){return host.lobby_name; } + if(i == 0) { return host.lobby_name_perm; } } else{ - if(i == -1) { return temp_name; } + if(i == -1) { return host.temp_name; } if(i >= 0 && i < MAX_PLAYERS){ - return player_names[i]; + return host.player_names[i]; } } return NULL; @@ -67,72 +134,72 @@ void render_lobby() { int i; - player_tempname_surf= TTF_RenderText_Solid(font, temp_name, white); - player_tempname_tex = SDL_CreateTextureFromSurface(renderer, player_tempname_surf); + host.player_tempname_surf= TTF_RenderText_Solid(host.font, host.temp_name, white); + host.player_tempname_tex = SDL_CreateTextureFromSurface(renderer, host.player_tempname_surf); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); //set name button SDL_SetRenderDrawColor(renderer, 64, 64, 64,255); - SDL_RenderFillRect(renderer, &set_name_rect); - SDL_RenderCopy(renderer, set_name_tex, NULL, &(set_name_rect)); + SDL_RenderFillRect(renderer, &host.set_name_rect); + SDL_RenderCopy(renderer, host.set_name_tex, NULL, &(host.set_name_rect)); //player fields for(i = 0; i < MAX_PLAYERS; i++) { - player_name_rects[i].w = (player_rects[0].w / MAX_NAMESZ) * strlen(player_names[i]); - player_name_surfs[i] = TTF_RenderText_Solid(font, player_names[i], white); - player_name_texs[i] = SDL_CreateTextureFromSurface(renderer, player_name_surfs[i]); - SDL_RenderFillRect(renderer, &(player_rects[i])); - SDL_RenderCopy(renderer, player_name_texs[i], NULL, &(player_name_rects[i])); + host.player_name_rects[i].w = (host.player_rects[0].w / MAX_NAMESZ) * strlen(host.player_names[i]); + host.player_name_surfs[i] = TTF_RenderText_Solid(host.font, host.player_names[i], white); + host.player_name_texs[i] = SDL_CreateTextureFromSurface(renderer, host.player_name_surfs[i]); + SDL_RenderFillRect(renderer, &(host.player_rects[i])); + SDL_RenderCopy(renderer, host.player_name_texs[i], NULL, &(host.player_name_rects[i])); } //name field - player_name_rect.w = (name_rect.w / MAX_NAMESZ) * strlen(temp_name); - SDL_RenderFillRect(renderer, &name_rect); - SDL_RenderCopy(renderer, player_tempname_tex, NULL, &player_name_rect); + host.player_name_rect.w = (host.name_rect.w / MAX_NAMESZ) * strlen(host.temp_name); + SDL_RenderFillRect(renderer, &host.name_rect); + SDL_RenderCopy(renderer, host.player_tempname_tex, NULL, &host.player_name_rect); //start game button - SDL_RenderFillRect(renderer, &start_rect); - SDL_RenderCopy(renderer, start_tex, NULL, &(start_rect)); + SDL_RenderFillRect(renderer, &host.start_rect); + SDL_RenderCopy(renderer, host.start_tex, NULL, &(host.start_rect)); SDL_RenderPresent(renderer); - player_tempname_surf= TTF_RenderText_Solid(font, temp_name, white); - player_tempname_tex = SDL_CreateTextureFromSurface(renderer, player_tempname_surf); + host.player_tempname_surf= TTF_RenderText_Solid(host.font, host.temp_name, white); + host.player_tempname_tex = SDL_CreateTextureFromSurface(renderer, host.player_tempname_surf); - SDL_FreeSurface(player_tempname_surf); - SDL_DestroyTexture(player_tempname_tex); + SDL_FreeSurface(host.player_tempname_surf); + SDL_DestroyTexture(host.player_tempname_tex); for(i = 0; i < MAX_PLAYERS; i++) { - SDL_FreeSurface(player_name_surfs[i]); - SDL_DestroyTexture(player_name_texs[i]); + SDL_FreeSurface(host.player_name_surfs[i]); + SDL_DestroyTexture(host.player_name_texs[i]); } } void render_lobby_name() { - lobby_name_surf = TTF_RenderText_Solid(font, lobby_name, white); - lobby_name_tex = SDL_CreateTextureFromSurface(renderer, lobby_name_surf); + host.lobby_name_surf = TTF_RenderText_Solid(host.font, host.lobby_name, white); + host.lobby_name_tex = SDL_CreateTextureFromSurface(renderer, host.lobby_name_surf); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); //set lobby name button SDL_SetRenderDrawColor(renderer, 64, 64, 64,255); - SDL_RenderFillRect(renderer, &set_name_rect); - SDL_RenderCopy(renderer, set_name_tex, NULL, &(set_name_rect)); + SDL_RenderFillRect(renderer, &host.set_name_rect); + SDL_RenderCopy(renderer, host.set_name_tex, NULL, &(host.set_name_rect)); //name field - player_name_rect.w = (name_rect.w / MAX_NAMESZ) * strlen(lobby_name); - SDL_RenderFillRect(renderer, &name_rect); - SDL_RenderCopy(renderer, lobby_name_tex, NULL, &player_name_rect); + host.player_name_rect.w = (host.name_rect.w / MAX_NAMESZ) * strlen(host.lobby_name); + SDL_RenderFillRect(renderer, &host.name_rect); + SDL_RenderCopy(renderer, host.lobby_name_tex, NULL, &host.player_name_rect); //start game button - SDL_RenderFillRect(renderer, &start_rect); - SDL_RenderCopy(renderer, start_tex, NULL, &(start_rect)); + SDL_RenderFillRect(renderer, &host.start_rect); + SDL_RenderCopy(renderer, host.start_tex, NULL, &(host.start_rect)); SDL_RenderPresent(renderer); @@ -140,90 +207,25 @@ void render_lobby_name() void render_main() { + SDL_SetTextInputRect(&host.name_rect); + SDL_GetMouseState(&(mouse_pos.x), &(mouse_pos.y)); - - if(SDL_PointInRect(&mouse_pos, &start_rect)){ + + if(SDL_PointInRect(&mouse_pos, &host.start_rect)){ over_object = START_GAME_BUTTON; } - else if(SDL_PointInRect(&mouse_pos, &set_name_rect)){ + else if(SDL_PointInRect(&mouse_pos, &host.set_name_rect)){ over_object = SET_NAME_BUTTON; } - - handle_event(&event); if(lobby_has_name){ render_lobby(); } else{ render_lobby_name(); } + } -void host_game(){ - int i; - PRINT_M(HOST state) - - over_object = NO_OBJECT; +void render_host_game(){ - strcpy(player_names[0], "player_1"); - strcpy(player_names[1], "no_player_2"); - strcpy(player_names[2], "no_player_3"); - strcpy(player_names[3], "no_player_4"); - - font = TTF_OpenFont("assets/font.ttf", 24); - set_name_surf = TTF_RenderText_Solid(font, "set name", white); - start_surf = TTF_RenderText_Solid(font, "start game", white); - lobby_name_surf = TTF_RenderText_Solid(font, lobby_name, white); - - set_name_tex = SDL_CreateTextureFromSurface(renderer, set_name_surf); - start_tex = SDL_CreateTextureFromSurface(renderer, start_surf); - - - set_name_rect.w = DEF_WINDOW_WIDTH >> 3; - set_name_rect.h = DEF_WINDOW_HEIGHT >> 4; - set_name_rect.x = DEF_WINDOW_WIDTH - (set_name_rect.w << 1); - set_name_rect.y = DEF_WINDOW_HEIGHT - (set_name_rect.h << 2); - - name_rect.w = DEF_WINDOW_WIDTH - (set_name_rect.w << 2) - (BOARDER_THICKNESS << 1); - name_rect.h = set_name_rect.h; - name_rect.x = (set_name_rect.w << 1) + BOARDER_THICKNESS; - name_rect.y = set_name_rect.y; - - start_rect.w = set_name_rect.w; - start_rect.h = set_name_rect.h; - start_rect.x = (DEF_WINDOW_WIDTH >> 1) - (start_rect.w >> 1); - start_rect.y = set_name_rect.y + set_name_rect.h + BOARDER_THICKNESS; - - player_name_rect.w = DEF_WINDOW_WIDTH - (set_name_rect.w << 2) - (BOARDER_THICKNESS << 1); - player_name_rect.h = set_name_rect.h; - player_name_rect.x = (set_name_rect.w << 1) + BOARDER_THICKNESS; - player_name_rect.y = set_name_rect.y; - - player_rects[0].w = player_rects[1].w = player_rects[2].w = player_rects[3].w - = DEF_WINDOW_WIDTH - (set_name_rect.w << 1); - player_rects[0].h = player_rects[1].h = player_rects[2].h = player_rects[3].h - = ((DEF_WINDOW_HEIGHT - (DEF_WINDOW_HEIGHT - set_name_rect.y)) - - (BOARDER_THICKNESS << 2) - BOARDER_THICKNESS) >> 2; - player_rects[0].x = player_rects[1].x = player_rects[2].x = player_rects[3].x - = set_name_rect.w; - - player_rects[0].y = BOARDER_THICKNESS; - player_rects[1].y = player_rects[0].y + player_rects[0].h + BOARDER_THICKNESS; - player_rects[2].y = player_rects[1].y + player_rects[1].h + BOARDER_THICKNESS; - player_rects[3].y = player_rects[2].y + player_rects[2].h + BOARDER_THICKNESS; - - for(i = 0; i < MAX_PLAYERS; i++){ - player_name_rects[i].w = player_rects[i].w; - player_name_rects[i].h = player_rects[i].h - (BOARDER_THICKNESS << 1); - player_name_rects[i].x = player_rects[i].x + BOARDER_THICKNESS; - player_name_rects[i].y = player_rects[i].y + BOARDER_THICKNESS; - } - - - - SDL_StartTextInput(); - SDL_SetTextInputRect(&name_rect); - - while(running) - { - render_main(); - } + render_main(); return; } diff --git a/include/game.h b/include/game.h index 33b9ec4..38edf1f 100644 --- a/include/game.h +++ b/include/game.h @@ -3,6 +3,9 @@ #ifndef __game_h__ #define __game_h__ +void init_start_game(); +void render_start_game(); + #include extern SDL_Point mouse_pos; @@ -17,10 +20,7 @@ extern SDL_Point mouse_pos; extern int state; void start_battle(); -void start_game(); void show_options(); -void host_game(); -void join_game(); #define GRAB_NEW 2 #define GRAB_OLD 1 diff --git a/include/host.h b/include/host.h index 194efc0..fc66e05 100644 --- a/include/host.h +++ b/include/host.h @@ -3,17 +3,31 @@ #define __host_h__ #define NO_OBJECT 0 +//host view #define SET_NAME_BUTTON 1 #define START_GAME_BUTTON 2 +//join view +#define JOIN_GAME_BUTTON 1 +#define PLAYER_NAME_BOX 2 +#define LOBBY_NAME_BOX 3 +#define PLAYER_NAME_SEL 0 +#define LOBBY_NAME_SEL 1 +//host +void render_host_game(); +void init_host(); extern int over_object; extern int lobby_has_name; - char *get_this_name(int i); +//join - +char *join_get_name_ptr(); +void render_join_game(); +void init_join(); +int join_over_object(); +void join_set_selected(int); #endif diff --git a/include/main.h b/include/main.h index 8e6a627..ecd1494 100644 --- a/include/main.h +++ b/include/main.h @@ -5,8 +5,8 @@ #include -#define DEF_WINDOW_WIDTH 1920 -#define DEF_WINDOW_HEIGHT 1080 +#define DEF_WINDOW_WIDTH 1024 +#define DEF_WINDOW_HEIGHT 768 @@ -25,5 +25,7 @@ extern int selected_index; extern SDL_Window* window; extern SDL_Renderer* renderer; extern SDL_Event event; +extern SDL_Color white; +extern SDL_Point mouse_pos; #endif diff --git a/include/overworld.h b/include/overworld.h index a8c2d82..3281234 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -5,8 +5,8 @@ #include -void start_overworld(); - +void init_overworld(); +void render_overworld(); #define OW_GRIDSZ 128 diff --git a/input.c b/input.c index b07e132..b86b831 100644 --- a/input.c +++ b/input.c @@ -12,6 +12,7 @@ void handle_input_mainmenu(SDL_Event *e); void handle_input_battle(SDL_Event *e); void handle_input_overworld(SDL_Event *e); void handle_input_host(SDL_Event *e); +void handle_input_join(SDL_Event *e); void mainmenu_selection_state() { @@ -74,11 +75,15 @@ void handle_event(SDL_Event *e){ case HOST: handle_input_host(e); break; + case JOIN: + handle_input_join(e); + break; default: if(e->type == SDL_KEYDOWN && e->key.keysym.sym == SDLK_ESCAPE) { running = 0; - } + } + } return; } @@ -199,3 +204,58 @@ void handle_input_host(SDL_Event *e) } return; } + +void handle_input_join(SDL_Event *e) +{ + int oldlen, inputlen; + char tempname[MAX_NAMESZ], *nameptr; + nameptr = join_get_name_ptr(); + strcpy(tempname, nameptr); + oldlen = strlen(tempname); + + switch(e->type) + { + case SDL_KEYUP: + break; + case SDL_KEYDOWN: + switch(e->key.keysym.sym) + { + case SDLK_ESCAPE: + running = 0; + break; + case SDLK_BACKSPACE: + PRINT_M(got backspace) + if(oldlen == 0){ break; } + tempname[oldlen - 1] = '\0'; + strcpy(nameptr, tempname); + break; + } + break; + case SDL_TEXTINPUT: + inputlen = strlen(e->text.text); + PRINT_M(got text input event) + if(oldlen + inputlen > MAX_NAMESZ -1){ break; } + strcat(tempname, e->text.text); + strcpy(nameptr, tempname); + break; + + case SDL_MOUSEBUTTONDOWN: + switch(join_over_object()) + { + case NO_OBJECT: + break; + case JOIN_GAME_BUTTON: + PRINT_M(JOIN_GAME BUTTON) + //check name field and send it off bb + break; + case LOBBY_NAME_BOX: + join_set_selected(LOBBY_NAME_SEL); + break; + case PLAYER_NAME_BOX: + join_set_selected(PLAYER_NAME_SEL); + break; + } + break; + } + return; +} diff --git a/join.c b/join.c index 8171d73..1d9ada5 100644 --- a/join.c +++ b/join.c @@ -2,19 +2,169 @@ #include #include +#include #include #include +#include #include #include #include -void join_game(){ - running = 0; +#define BOARDER_THICKNESS 20 + +struct join_ctx +{ + int selected; + + int over_object; + + char player_name[MAX_NAMESZ]; + char lobby_name[MAX_NAMESZ]; + + TTF_Font *font; + + SDL_Rect lobby_name_rect, player_name_rect, join_game_rect; + SDL_Rect lobby_name_box, player_name_box, join_game_box; + + SDL_Surface *player_name_surf, *lobby_prompt_surf, *name_promt_surf, + *join_surf, *lobby_name_surf; + SDL_Texture *player_name_tex, *lobby_prompt_tex, *name_prompt_tex, + *lobby_name_tex, *join_tex; + +}; + +struct join_ctx join; + +void join_set_selected(int obj) +{ + join.selected = obj; + return; +} + +int join_over_object() +{ + return join.over_object; +} + +char *join_get_name_ptr() +{ + if(join.selected == PLAYER_NAME_SEL){ + return join.player_name; + } + else if(join.selected == LOBBY_NAME_SEL){ + return join.lobby_name; + } + return NULL; +} + + +void init_join() +{ + + join.over_object = NO_OBJECT; + join.font = TTF_OpenFont("assets/font.ttf", 24); + + strcpy(join.player_name, "PLAYER"); + strcpy(join.lobby_name, "lobby_name"); + + join.player_name_box.x = DEF_WINDOW_WIDTH >> 3; + join.player_name_box.y = DEF_WINDOW_HEIGHT >> 3; + join.player_name_box.w = (DEF_WINDOW_WIDTH >> 1) + (DEF_WINDOW_WIDTH >> 2); + join.player_name_box.h = DEF_WINDOW_HEIGHT >> 3; + + join.player_name_rect.x = join.player_name_box.x + BOARDER_THICKNESS; + join.player_name_rect.y = join.player_name_box.y + BOARDER_THICKNESS; + join.player_name_rect.w = join.player_name_box.w - (BOARDER_THICKNESS<<1); + join.player_name_rect.h = join.player_name_box.h - (BOARDER_THICKNESS<<1); + + join.lobby_name_box.x = join.player_name_box.x; + join.lobby_name_box.y = join.player_name_box.y + join.player_name_box.h + BOARDER_THICKNESS; + join.lobby_name_box.w = join.player_name_box.w; + join.lobby_name_box.h = join.player_name_box.h; + + join.lobby_name_rect.x = join.player_name_rect.x; + join.lobby_name_rect.y = join.lobby_name_box.y + BOARDER_THICKNESS; + join.lobby_name_rect.w = join.player_name_rect.w; + join.lobby_name_rect.h = join.player_name_rect.h; + + join.join_game_box.w = join.lobby_name_box.w >> 1; + join.join_game_box.x = (DEF_WINDOW_WIDTH >> 1) - (join.join_game_box.w >> 1); + join.join_game_box.y = join.lobby_name_box.y + join.lobby_name_box.h + BOARDER_THICKNESS; + join.join_game_box.h = join.lobby_name_box.h; + + join.join_game_rect.x = join.join_game_box.x + BOARDER_THICKNESS; + join.join_game_rect.y = join.join_game_box.y + BOARDER_THICKNESS; + join.join_game_rect.w = join.join_game_box.w - (BOARDER_THICKNESS << 1); + join.join_game_rect.h = join.join_game_box.h - (BOARDER_THICKNESS << 1); + + join.join_surf = TTF_RenderText_Solid(join.font, "JOIN GAME", white); + join.join_tex = SDL_CreateTextureFromSurface(renderer, join.join_surf); + + + PRINT_M(INIT JOIN) +} + +void join_update_hover() +{ + if(SDL_PointInRect(&mouse_pos, &join.join_game_box)){ join.over_object = JOIN_GAME_BUTTON; } + else if(SDL_PointInRect(&mouse_pos, &join.lobby_name_box)){ join.over_object = LOBBY_NAME_BOX; } + else if(SDL_PointInRect(&mouse_pos, &join.player_name_box)){ join.over_object = PLAYER_NAME_BOX; } + else { join.over_object = NO_OBJECT; } + return; +} + +void render_join_game() +{ + join_update_hover(); + + join.player_name_surf = TTF_RenderText_Solid(join.font, join.player_name, white); + join.player_name_tex = SDL_CreateTextureFromSurface(renderer, join.player_name_surf); + join.lobby_name_surf = TTF_RenderText_Solid(join.font, join.lobby_name, white); + join.lobby_name_tex = SDL_CreateTextureFromSurface(renderer, join.lobby_name_surf); + + SDL_SetRenderDrawColor(renderer, 0,0,0,255); + SDL_RenderClear(renderer); + + if(join.selected == PLAYER_NAME_SEL ){ + //player name rect + SDL_SetRenderDrawColor(renderer, 32, 64, 32, 255); + SDL_RenderFillRect(renderer, &join.player_name_box); + //lobby name rect + SDL_SetRenderDrawColor(renderer, 64,64,64,255); + SDL_RenderFillRect(renderer, &join.lobby_name_box); + } + else{ + //lobby name rect + SDL_SetRenderDrawColor(renderer, 32, 64, 32, 255); + SDL_RenderFillRect(renderer, &join.lobby_name_box); + //player name rect + SDL_SetRenderDrawColor(renderer, 64,64,64,255); + SDL_RenderFillRect(renderer, &join.player_name_box); + } + + //player name text + join.player_name_rect.w = (join.player_name_box.w / MAX_NAMESZ) * strlen(join.player_name); + SDL_RenderCopy(renderer, join.player_name_tex, NULL, &join.player_name_rect); + + //lobby name text + join.lobby_name_rect.w = (join.lobby_name_box.w / MAX_NAMESZ) * strlen(join.lobby_name); + SDL_RenderCopy(renderer, join.lobby_name_tex, NULL, &join.lobby_name_rect); + + + SDL_RenderFillRect(renderer, &join.join_game_box); + SDL_RenderCopy(renderer, join.join_tex, NULL, &join.join_game_rect); + + + SDL_RenderPresent(renderer); + + SDL_FreeSurface(join.player_name_surf); + SDL_DestroyTexture(join.player_name_tex); + SDL_FreeSurface(join.lobby_name_surf); + SDL_DestroyTexture(join.lobby_name_tex); + return; } - - diff --git a/main.c b/main.c index 103b36f..649eef2 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -12,170 +13,73 @@ #define SPACING 20 +void render_mainmenu(); +void init_mainmenu(); + +SDL_Point mouse_pos; SDL_Window* window; SDL_Renderer* renderer; SDL_Event event; +SDL_Color white = {255,255,255,0}; +struct mainmenu_ctx { + TTF_Font* font; + SDL_Texture* background; + SDL_Surface *start_surface, *host_surface, *join_surface, *exit_surface, *options_surface; + SDL_Texture *start_text, *host_text, *join_text, *exit_text, *options_text; + SDL_Rect start_rect, host_rect, join_rect, exit_rect, options_rect; + SDL_Rect mainmenu_rects[MAIN_SELECTIONS]; +}; + +struct mainmenu_ctx mainmenu; int state = TITLE; int running; - - int selected_index = START_GAME; -int main(void) { - int x1, x2, y1, y2; - SDL_Point mouse_pos; + +int main(void) +{ SDL_Init(SDL_INIT_VIDEO); TTF_Init(); - window = SDL_CreateWindow("Shufflers", SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, DEF_WINDOW_WIDTH,DEF_WINDOW_HEIGHT, 0); - renderer = SDL_CreateRenderer(window, -1, 0); - IMG_Init(IMG_INIT_PNG); - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); - - SDL_CaptureMouse(SDL_TRUE); + + init_mainmenu(); + init_start_game(); + init_join(); + init_host(); + init_overworld(); - SDL_Texture* background = IMG_LoadTexture(renderer, "assets/mainscreen.png"); - - if (!background) { - printf("IMG_LoadTexture error: %s\n", IMG_GetError()); - } - - - - TTF_Font* font = TTF_OpenFont("assets/font.ttf", 24); - - SDL_Color white = {255, 255, 255, 0}; - SDL_Surface* start_surface = TTF_RenderText_Solid(font, "START", white); - SDL_Texture* start_text = SDL_CreateTextureFromSurface(renderer, - start_surface); - SDL_Surface* host_surface = TTF_RenderText_Solid(font, "HOST", white); - SDL_Texture* host_text = SDL_CreateTextureFromSurface(renderer, - host_surface); - SDL_Surface* join_surface = TTF_RenderText_Solid(font, "JOIN", white); - SDL_Texture* join_text = SDL_CreateTextureFromSurface(renderer, - join_surface); - SDL_Surface* exit_surface = TTF_RenderText_Solid(font, "EXIT", white); - SDL_Texture* exit_text = SDL_CreateTextureFromSurface(renderer, - exit_surface); - SDL_Surface* options_surface = TTF_RenderText_Solid(font, "OPTIONS", white); - SDL_Texture* options_text = SDL_CreateTextureFromSurface(renderer, - options_surface); - - SDL_Rect start_rect, host_rect, join_rect, exit_rect, options_rect; - - start_rect.w = (DEF_WINDOW_WIDTH >> 2) - (DEF_WINDOW_WIDTH >> 3); - start_rect.h = (DEF_WINDOW_HEIGHT >> 3) - (DEF_WINDOW_HEIGHT >> 4); - start_rect.x = (DEF_WINDOW_WIDTH - start_rect.w) >> 1; - start_rect.y = (DEF_WINDOW_HEIGHT - start_rect.h) >> 1; - - host_rect.w = join_rect.w = exit_rect.w = options_rect.w = start_rect.w; - options_rect.w <<= 1; - host_rect.h = join_rect.h = exit_rect.h = options_rect.h = start_rect.h; - host_rect.x = join_rect.x = exit_rect.x = options_rect.x = start_rect.x; - options_rect.x -= join_rect.w >> 1; - - host_rect.y = start_rect.y + start_rect.h + SPACING; - join_rect.y = host_rect.y + host_rect.h + SPACING; - options_rect.y = join_rect.y + join_rect.h + SPACING; - exit_rect.y = options_rect.y + options_rect.h + SPACING; - - SDL_Rect mainmenu_rects[MAIN_SELECTIONS]; - - mainmenu_rects[START_GAME] = start_rect; - mainmenu_rects[HOST_GAME] = host_rect; - mainmenu_rects[JOIN_GAME] = join_rect; - mainmenu_rects[OPTIONS_MENU] = options_rect; - mainmenu_rects[EXIT_GAME] = exit_rect; - running = 1; - - while (running) - { + //main game loop + while (running) + { handle_event(&event); - - SDL_RenderClear(renderer); - - - - SDL_SetRenderDrawColor(renderer, 0,196,0,255); - - SDL_RenderCopy(renderer, background, NULL, NULL); - - SDL_RenderCopy(renderer, start_text, NULL, &start_rect); - SDL_RenderCopy(renderer, host_text, NULL, &host_rect); - SDL_RenderCopy(renderer, join_text, NULL, &join_rect); - SDL_RenderCopy(renderer, options_text, NULL, &options_rect); - SDL_RenderCopy(renderer, exit_text, NULL, &exit_rect); - SDL_GetMouseState(&(mouse_pos.x), &(mouse_pos.y)); - for(int i = 0; i> 2) - (DEF_WINDOW_WIDTH >> 3); + mainmenu.start_rect.h = (DEF_WINDOW_HEIGHT >> 3) - (DEF_WINDOW_HEIGHT >> 4); + mainmenu.start_rect.x = (DEF_WINDOW_WIDTH - mainmenu.start_rect.w) >> 1; + mainmenu.start_rect.y = (DEF_WINDOW_HEIGHT - mainmenu.start_rect.h) >> 1; + + mainmenu.host_rect.w = mainmenu.join_rect.w = mainmenu.exit_rect.w = + mainmenu.options_rect.w = mainmenu.start_rect.w; + mainmenu.options_rect.w <<= 1; + mainmenu.host_rect.h = mainmenu.join_rect.h = mainmenu.exit_rect.h = + mainmenu.options_rect.h = mainmenu.start_rect.h; + mainmenu.host_rect.x = mainmenu.join_rect.x = mainmenu.exit_rect.x = + mainmenu.options_rect.x = mainmenu.start_rect.x; + mainmenu.options_rect.x -= mainmenu.join_rect.w >> 1; + + mainmenu.host_rect.y = mainmenu.start_rect.y + mainmenu.start_rect.h + SPACING; + mainmenu.join_rect.y = mainmenu.host_rect.y + mainmenu.host_rect.h + SPACING; + mainmenu.options_rect.y = mainmenu.join_rect.y + mainmenu.join_rect.h + SPACING; + mainmenu.exit_rect.y = mainmenu.options_rect.y + mainmenu.options_rect.h + SPACING; + + mainmenu.mainmenu_rects[START_GAME] = mainmenu.start_rect; + mainmenu.mainmenu_rects[HOST_GAME] = mainmenu.host_rect; + mainmenu.mainmenu_rects[JOIN_GAME] = mainmenu.join_rect; + mainmenu.mainmenu_rects[OPTIONS_MENU] = mainmenu.options_rect; + mainmenu.mainmenu_rects[EXIT_GAME] = mainmenu.exit_rect; + + return; +} + +void render_mainmenu() +{ + SDL_RenderClear(renderer); + + SDL_SetRenderDrawColor(renderer, 0,196,0,255); + SDL_RenderCopy(renderer, mainmenu.background, NULL, NULL); + + SDL_RenderCopy(renderer, mainmenu.start_text, NULL, &(mainmenu.start_rect)); + SDL_RenderCopy(renderer, mainmenu.host_text, NULL, &mainmenu.host_rect); + SDL_RenderCopy(renderer, mainmenu.join_text, NULL, &mainmenu.join_rect); + SDL_RenderCopy(renderer, mainmenu.options_text, NULL, &mainmenu.options_rect); + SDL_RenderCopy(renderer, mainmenu.exit_text, NULL, &mainmenu.exit_rect); + + for(int i = 0; i + <---------- HOSTS_REQ [ list of names that are open lobbies] + +------------------------------------------------------------------------------------------ + + JOIN_REQ -----------> + [name of lobby, name of player] + <----------- JOIN_REQ [IP info of host with that name] + + +HOST GAME: + + CLIENT | SERVER + + NEW_HOST ------------> + [name of lobby] + <----------- NEW_HOST [ack] + + (ON PLAYER JOIN REQUEST) + <------------ JOIN_REQ [player ip info] + + JOIN_REQ ------------> + [lobby count] + + (ON HOST START GAME) + + S_STATE -----------> + [starting game] + <---------- S_STATE [ack] + + (on timeout for lobbies ie games not started) + + <--------- G_STATE [you alive?] + + G_STATE ---------> + [yup] + + + + + + diff --git a/overworld.c b/overworld.c index 19bf32e..313d062 100644 --- a/overworld.c +++ b/overworld.c @@ -10,37 +10,37 @@ #include #include +#define OW_ROWS ((DEF_WINDOW_WIDTH / OW_GRIDSZ) + 1) +#define OW_COLS ((DEF_WINDOW_HEIGHT / OW_GRIDSZ) + 1) + + PLAYER *myplayer, me; +SDL_Texture *selected_grid, *player_sprite, *grass; + PLAYER *get_this_player() { return &me; } -#define ow_rows ((DEF_WINDOW_WIDTH / OW_GRIDSZ) + 1) -#define ow_cols ((DEF_WINDOW_HEIGHT / OW_GRIDSZ) + 1) +SDL_Rect ow_rects[OW_ROWS][OW_COLS]; -SDL_Rect ow_rects[ow_rows][ow_cols]; - - -void start_overworld() +void init_overworld() { - SDL_Texture *selected_grid, *player_sprite, *grass; + int row, col; + + PRINT_M(INIT OVERWORLD) - PRINT_M(STARTING GAME) - IMG_GETANDCHECK(grass, renderer, "assets/ow_grid_grass.png") IMG_GETANDCHECK(selected_grid, renderer, "assets/ow_selected_grid.png"); IMG_GETANDCHECK(player_sprite, renderer, "assets/player.png"); myplayer = get_this_player(); - int row, col; - //set up rects to render textures into - for(row = 0; row <= ow_rows; row++) + for(row = 0; row <= OW_ROWS; row++) { - for(col = 0; col <= ow_cols; col++) + for(col = 0; col <= OW_COLS; col++) { ow_rects[row][col].x = row * OW_GRIDSZ; ow_rects[row][col].y = col * OW_GRIDSZ; @@ -50,40 +50,31 @@ void start_overworld() } myplayer->texture = player_sprite; - myplayer->pos.x = ow_rows >> 1; - myplayer->pos.y = ow_cols >> 1; - + myplayer->pos.x = OW_ROWS >> 1; + myplayer->pos.y = OW_COLS >> 1; - while(running) + return; +} + +void render_overworld() +{ + int row, col; + SDL_RenderClear(renderer); + //render the ow grid + for(row = 0; row < OW_ROWS; row++) { - handle_event(&event); - - SDL_RenderClear(renderer); - //render the ow grid - for(row = 0; row < ow_rows; row++) + for(col = 0; col < OW_COLS; col++) { - for(col = 0; col < ow_cols; col++) - { - SDL_RenderCopy(renderer, grass, NULL, &(ow_rects[row][col])); - } + SDL_RenderCopy(renderer, grass, NULL, &(ow_rects[row][col])); } - - - - SDL_RenderCopy(renderer, myplayer->texture, NULL, &(ow_rects[myplayer->pos.x][myplayer->pos.y])); - - SDL_RenderPresent(renderer); } - + + SDL_RenderCopy(renderer, myplayer->texture, NULL, &(ow_rects[myplayer->pos.x][myplayer->pos.y])); + SDL_RenderPresent(renderer); - - start_battle(); return; } - - -