X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame%2Flevel_picker.c;h=ac3c78ed369f347096760869942d90eeb391400d;hb=016bee583aa3145b41d4b9718f017d64eb5d37fa;hp=f40b4fa86df4e9f2c93f085ce0e5fc588cf04dd9;hpb=aa5a51f17463e42ac8439be8728aaebfedc9ac08;p=nothing.git diff --git a/src/game/level_picker.c b/src/game/level_picker.c index f40b4fa8..ac3c78ed 100644 --- a/src/game/level_picker.c +++ b/src/game/level_picker.c @@ -10,15 +10,19 @@ #include "ui/list_selector.h" #include "system/log.h" #include "game/level_folder.h" -#include "ui/menu_title.h" +#include "ui/wiggly_text.h" +#include "ui/slider.h" + +#define TITLE_MARGIN_TOP 100.0f +#define TITLE_MARGIN_BOTTOM 100.0f struct LevelPicker { Lt *lt; - Background *background; - Vec camera_position; + Background background; + Vec2f camera_position; LevelFolder *level_folder; - MenuTitle *menu_title; + WigglyText wiggly_text; ListSelector *list_selector; }; @@ -27,26 +31,17 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir trace_assert(dirpath); Lt *lt = create_lt(); - if (lt == NULL) { - return NULL; - } LevelPicker *level_picker = PUSH_LT( lt, - nth_alloc(sizeof(LevelPicker)), + nth_calloc(1, sizeof(LevelPicker)), free); if (level_picker == NULL) { RETURN_LT(lt, NULL); } level_picker->lt = lt; - level_picker->background = PUSH_LT( - lt, - create_background(hexstr("073642")), - destroy_background); - if (level_picker->background == NULL) { - RETURN_LT(lt, NULL); - } + level_picker->background = create_background(hexstr("073642")); level_picker->camera_position = vec(0.0f, 0.0f); @@ -58,12 +53,20 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir RETURN_LT(lt, NULL); } + level_picker->wiggly_text = (WigglyText) { + .text = "Select Level", + .scale = {10.0f, 10.0f}, + .color = COLOR_WHITE, + }; + level_picker->list_selector = PUSH_LT( lt, create_list_selector( sprite_font, - level_folder_files(level_picker->level_folder), - level_folder_count(level_picker->level_folder)), + level_folder_titles(level_picker->level_folder), + level_folder_count(level_picker->level_folder), + vec(5.0f, 5.0f), + 50.0f), destroy_list_selector); if (level_picker->list_selector == NULL) { RETURN_LT(lt, NULL); @@ -79,38 +82,47 @@ void destroy_level_picker(LevelPicker *level_picker) } int level_picker_render(const LevelPicker *level_picker, - Camera *camera, - SDL_Renderer *renderer) + const Camera *camera) { trace_assert(level_picker); - trace_assert(renderer); - // TODO(#719): LevelPicker does not have a "Select Level" title + const Rect viewport = camera_view_port_screen(camera); - if (background_render(level_picker->background, camera) < 0) { + if (background_render(&level_picker->background, camera) < 0) { return -1; } - const Vec font_scale = vec(5.0f, 5.0f); - const float padding_bottom = 50.0f; - - Vec selector_size = list_selector_size( - level_picker->list_selector, - font_scale, - padding_bottom); + const Vec2f title_size = wiggly_text_size(&level_picker->wiggly_text, camera); - SDL_Rect view_port; - SDL_RenderGetViewport(renderer, &view_port); + if (wiggly_text_render( + &level_picker->wiggly_text, + camera, + vec(viewport.w * 0.5f - title_size.x * 0.5f, TITLE_MARGIN_TOP)) < 0) { + return -1; + } - if (list_selector_render( - level_picker->list_selector, - renderer, - vec((float) view_port.w * 0.5f - selector_size.x * 0.5f, 100.0f), - font_scale, - padding_bottom) < 0) { + if (list_selector_render(level_picker->list_selector, camera->renderer) < 0) { return -1; } + { + /* CSS */ + const float padding = 20.0f; + const Vec2f size = vec(3.0f, 3.0f); + const Vec2f position = vec(0.0f, viewport.h - size.y * FONT_CHAR_HEIGHT); + + /* HTML */ + if (camera_render_text_screen( + camera, + "Press 'N' to create new level", + size, + COLOR_WHITE, + vec(position.x + padding, + position.y - padding)) < 0) { + return -1; + } + } + return 0; } @@ -122,15 +134,48 @@ int level_picker_update(LevelPicker *level_picker, vec_add(&level_picker->camera_position, vec(50.0f * delta_time, 0.0f)); + if (wiggly_text_update(&level_picker->wiggly_text, delta_time) < 0) { + return -1; + } + return 0; } -int level_picker_event(LevelPicker *level_picker, const SDL_Event *event) +int level_picker_event(LevelPicker *level_picker, + const SDL_Event *event, + const Camera *camera) { trace_assert(level_picker); trace_assert(event); - list_selector_event(level_picker->list_selector, event); - return 0; + + switch (event->type) { + case SDL_WINDOWEVENT: { + switch (event->window.event) { + case SDL_WINDOWEVENT_SHOWN: + case SDL_WINDOWEVENT_RESIZED: { + const Vec2f font_scale = vec(5.0f, 5.0f); + const float padding_bottom = 50.0f; + + int width; + SDL_GetWindowSize(SDL_GetWindowFromID(event->window.windowID), &width, NULL); + + const Vec2f title_size = wiggly_text_size(&level_picker->wiggly_text, camera); + + const Vec2f selector_size = list_selector_size( + level_picker->list_selector, + font_scale, + padding_bottom); + + list_selector_move( + level_picker->list_selector, + vec((float)width * 0.5f - selector_size.x * 0.5f, + TITLE_MARGIN_TOP + title_size.y + TITLE_MARGIN_BOTTOM)); + } break; + } + } break; + } + + return list_selector_event(level_picker->list_selector, event); } int level_picker_input(LevelPicker *level_picker, @@ -146,7 +191,15 @@ int level_picker_input(LevelPicker *level_picker, const char *level_picker_selected_level(const LevelPicker *level_picker) { trace_assert(level_picker); - return list_selector_selected(level_picker->list_selector); + + const int selected_index = list_selector_selected(level_picker->list_selector); + if (selected_index < 0) { + return NULL; + } + + const char **filenames = level_folder_filenames(level_picker->level_folder); + + return filenames[selected_index]; } void level_picker_clean_selection(LevelPicker *level_picker)