diff --git a/src/draw.c b/src/draw.c index 09cd2de..08ebcfb 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1,4 +1,5 @@ #include "draw.h" +#include "environment.h" #include "game.h" #include "types.h" #include @@ -652,6 +653,97 @@ void draw_level_time(SDL_Renderer *ren, const struct environment * e) { position.y += 40; draw_text_default(ren, position, colour, time_string); +} +void draw_mute_button(SDL_Renderer *ren) { + + struct colour c = get_scene_watch()->colours.fg1; + struct colour i = get_scene_watch()->colours.bg; + + if (mute_button.held) { + struct colour t = c; + c = i; + i = t; + } + + + SDL_Rect rect; + + rect.x = mute_button.x; + rect.y = mute_button.y; + rect.w = mute_button.w; + rect.h = mute_button.h; + + + SDL_SetRenderDrawColor(ren, c.r, c.g, c.b, 255); + SDL_RenderFillRect(ren, &rect); + + rect.x += mute_button.w / 6; + rect.y += mute_button.w / 4; + rect.w = mute_button.w / 5; + rect.h = mute_button.h / 2; + + SDL_SetRenderDrawColor(ren, i.r, i.g, i.b, 255); + SDL_RenderFillRect(ren, &rect); + + int j = 0; + for (int i = rect.x + rect.w; i < rect.x + rect.w + mute_button.w / 5; i++) { + SDL_RenderDrawLine(ren, i, rect.y + j + rect.h, i, rect.y - j); + j++; + } + + j -= 8; + if (!mute_button.state) { + for (int i = rect.x + rect.w + mute_button.w / 5; + i < mute_button.x + mute_button.w - 5; i++) { + if ((i) % 8 < 4) { + SDL_RenderDrawLine(ren, i, rect.y + j + rect.h, i, rect.y - j); + } + if (i % 8 == 0) j += 4; + + } + } else { + int w = mute_button.w / 5; + int i = rect.x + rect.w + mute_button.w / 5 + w/2; + int j = rect.y + w / 2; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + i += 1; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + i -= 1; + + j += 1; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + j -= 1; + + j += 1; + i += 1; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + j -= 1; + i -= 1; + + i -= 1; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + i += 1; + + j -= 1; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + j += 1; + + j -= 1; + i -= 1; + SDL_RenderDrawLine(ren, i, j + w, i + w, j); + SDL_RenderDrawLine(ren, i + w, j + w, i, j); + j += 1; + i += 1; + + } + + } void draw_pause_screen(SDL_Renderer *ren, struct environment *e) { @@ -802,6 +894,7 @@ void redraw_buffer(SDL_Renderer * ren) { lplayer.colliding); draw_collision_poly(ren, &lplayer); draw_forces(ren, &lplayer); + draw_mute_button(ren); if (gameui.currently_bound_textbox) { draw_level_chooser_tbox(ren); diff --git a/src/game.c b/src/game.c index aa90971..89215ab 100644 --- a/src/game.c +++ b/src/game.c @@ -50,11 +50,13 @@ long level_time; int get_floor_ceiling(); + struct sg_times_list save_times_lst; /* object that draw.c watches */ struct draw_watcher draw_watch = {}; /* object that handles ui interactions in game.c and which draw watches */ struct textbox_info textboxes[1]; +struct button mute_button; struct ui_state gameui = {}; @@ -1752,12 +1754,23 @@ void startgame(SDL_Renderer * ren) { game_paused = 0; viewport_pos.x = player.physics->position.x - width / 2; viewport_pos.y = player.physics->position.y - height / 2; + + mute_button.x = 90.0/100 * width; + mute_button.y = 90.0/100 * height; + mute_button.w = 50; + mute_button.h = 50; + mute_button.state = mute; + mute_button.held = false; } double get_abs(double x,double y) { return (sqrt(x*x + y*y)); } +bool aabb_check(float x, float y, float rx, float ry, float w, float h) { + return x > rx && x < rx + w && y > ry && y < ry + h; +} + /* * * Make a player walk along the ground. Only enabled in debug mode. @@ -1824,6 +1837,7 @@ void handle_input_event(SDL_Event event) { pull_rope(900); } if (sc == input_map.mute) { mute = !mute; + mute_button.state = mute; } if (sc == input_map.pause) { if (in_game) game_paused = !game_paused; @@ -1860,6 +1874,14 @@ void handle_input_event(SDL_Event event) { break; case SDL_MOUSEBUTTONDOWN: + + if (aabb_check(event.button.x, event.button.y, + mute_button.x, mute_button.y, mute_button.w, + mute_button.h)) { + mute_button.held = true; + break; + } + add_rope(event.button.x, event.button.y); if (event.button.button == input_map.mouse_attach_rope) mouse_down = true; @@ -1867,7 +1889,21 @@ void handle_input_event(SDL_Event event) { pull_rope(900); break; case SDL_MOUSEBUTTONUP: + + mute_button.held = false; + if (aabb_check(event.button.x, event.button.y, + mute_button.x, mute_button.y, mute_button.w, + mute_button.y)) { + mute = !mute; + mute_button.state = mute; + + break; + } + + if (event.button.button == input_map.mouse_attach_rope) { + + mouse_down = false; delete_rope(); } diff --git a/src/types.h b/src/types.h index 2a1da39..7a23d65 100644 --- a/src/types.h +++ b/src/types.h @@ -226,4 +226,13 @@ enum { E_ROOM_TILES = E_ROOM_WIDTH / E_ROOM_RES, }; +struct button { + char *name; + bool state; + bool held; + int x, y, w, h; +}; + +extern struct button mute_button; + #endif