]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level_picker.c
Merge pull request #1197 from tsoding/cleanup
[nothing.git] / src / game / level_picker.c
index 2131cd631aee7d53ceccf17083eed172d5e5f690..b53b67ab38e35f53a0066593fd10c3cae3e0903e 100644 (file)
 struct LevelPicker
 {
     Lt *lt;
-    Background *background;
+    Background background;
     Vec2f camera_position;
-    LevelFolder *level_folder;
+    LevelFolder level_folder;
     WigglyText wiggly_text;
-    Slider volume_slider;
-    Vec2f volume_slider_scale;
-    ListSelector *list_selector;
+    ListSelector list_selector;
 };
 
-LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dirpath)
+static inline
+const char *list_item_text(void *element)
+{
+    trace_assert(element);
+    return ((LevelMetadata *)element)->title;
+}
+
+LevelPicker *create_level_picker(const char *dirpath)
 {
     trace_assert(dirpath);
 
@@ -43,23 +48,12 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir
     }
     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);
 
-    level_picker->level_folder = PUSH_LT(
-        lt,
-        create_level_folder(dirpath),
-        destroy_level_folder);
-    if (level_picker->level_folder == NULL) {
-        RETURN_LT(lt, NULL);
-    }
+    level_picker->level_folder = create_level_folder();
+    level_folder_read("./assets/levels", &level_picker->level_folder);
 
     level_picker->wiggly_text = (WigglyText) {
         .text = "Select Level",
@@ -67,25 +61,10 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir
         .color = COLOR_WHITE,
     };
 
-    level_picker->volume_slider = (Slider) {
-                                     .drag = 0,
-                                     .value = 80.0f,
-                                     .max_value = 100.0f,
-    };
-    level_picker->volume_slider_scale = vec(0.25f, 0.10f);
-
-    level_picker->list_selector = PUSH_LT(
-        lt,
-        create_list_selector(
-            sprite_font,
-            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);
-    }
+    level_picker->list_selector.items = level_picker->level_folder.metadatas;
+    level_picker->list_selector.font_scale = vec(5.0f, 5.0f);
+    level_picker->list_selector.padding_bottom = 50.0f;
+    level_picker->list_selector.list_item_text = list_item_text;
 
     return level_picker;
 }
@@ -93,6 +72,7 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir
 void destroy_level_picker(LevelPicker *level_picker)
 {
     trace_assert(level_picker);
+    destroy_level_folder(level_picker->level_folder);
     RETURN_LT0(level_picker->lt);
 }
 
@@ -103,22 +83,18 @@ int level_picker_render(const LevelPicker *level_picker,
 
     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 Vec2f title_size = wiggly_text_size(&level_picker->wiggly_text, camera);
+    const Vec2f title_size = wiggly_text_size(&level_picker->wiggly_text);
 
-    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;
-    }
+    wiggly_text_render(
+        &level_picker->wiggly_text,
+        camera,
+        vec(viewport.w * 0.5f - title_size.x * 0.5f, TITLE_MARGIN_TOP));
 
-    if (list_selector_render(level_picker->list_selector, camera->renderer) < 0) {
-        return -1;
-    }
+    list_selector_render(camera, &level_picker->list_selector);
 
     {
         /* CSS */
@@ -127,31 +103,15 @@ int level_picker_render(const LevelPicker *level_picker,
         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;
-        }
+        camera_render_text_screen(
+            camera,
+            "Press 'N' to create new level",
+            size,
+            COLOR_WHITE,
+            vec(position.x + padding,
+                position.y - padding));
     }
 
-    {
-        /* CSS volume */
-        const Rect position = {
-          .w = viewport.w * level_picker->volume_slider_scale.x,
-          .h = viewport.h * level_picker->volume_slider_scale.y,
-          .x = viewport.w - viewport.w * level_picker->volume_slider_scale.x - 5.0f,
-          .y = 5.0f,
-        };
-
-        /* HTML volume */
-        if (slider_render(&level_picker->volume_slider, camera, position) < 0) {
-            return -1;
-        }
-    }
     return 0;
 }
 
@@ -171,60 +131,38 @@ int level_picker_update(LevelPicker *level_picker,
 }
 
 int level_picker_event(LevelPicker *level_picker,
-                       const SDL_Event *event,
-                       const Camera *camera)
+                       const SDL_Event *event)
 {
     trace_assert(level_picker);
     trace_assert(event);
 
-    {
-      const Rect viewport = camera_view_port_screen(camera);
-      const Rect position = {
-                             .w = viewport.w * level_picker->volume_slider_scale.x,
-                             .h = viewport.h * level_picker->volume_slider_scale.y,
-                             .x = viewport.w - viewport.w * level_picker->volume_slider_scale.x - 5.0f,
-                             .y = 5.0f,
-      };
-      int selected = 0;
-      if (slider_event(
-                &level_picker->volume_slider,
-                event,
-                position,
-                &selected) < 0) {
-        return -1;
-      }
-      if(selected){
-        return 0;
-      }
-    }
     switch (event->type) {
     case SDL_WINDOWEVENT: {
         switch (event->window.event) {
         case SDL_WINDOWEVENT_SHOWN:
-        case SDL_WINDOWEVENT_RESIZED: {
+        case SDL_WINDOWEVENT_SIZE_CHANGED: {
             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);
+            SDL_GetRendererOutputSize(SDL_GetRenderer(SDL_GetWindowFromID(event->window.windowID)), &width, NULL);
 
-            const Vec2f title_size = wiggly_text_size(&level_picker->wiggly_text, camera);
+            const Vec2f title_size = wiggly_text_size(&level_picker->wiggly_text);
 
             const Vec2f selector_size = list_selector_size(
-                level_picker->list_selector,
+                &level_picker->list_selector,
                 font_scale,
                 padding_bottom);
 
-            list_selector_move(
-                level_picker->list_selector,
+            level_picker->list_selector.position =
                 vec((float)width * 0.5f - selector_size.x * 0.5f,
-                    TITLE_MARGIN_TOP + title_size.y + TITLE_MARGIN_BOTTOM));
+                    TITLE_MARGIN_TOP + title_size.y + TITLE_MARGIN_BOTTOM);
         } break;
         }
     } break;
     }
 
-    return list_selector_event(level_picker->list_selector, event);
+    return list_selector_event(&level_picker->list_selector, event);
 }
 
 int level_picker_input(LevelPicker *level_picker,
@@ -241,20 +179,21 @@ const char *level_picker_selected_level(const LevelPicker *level_picker)
 {
     trace_assert(level_picker);
 
-    const int selected_index = list_selector_selected(level_picker->list_selector);
-    if (selected_index < 0) {
+    if (level_picker->list_selector.selected_item < 0) {
         return NULL;
     }
 
-    const char **filenames = level_folder_filenames(level_picker->level_folder);
+    LevelMetadata *metadata = dynarray_pointer_at(
+        &level_picker->level_folder.metadatas,
+        (size_t)level_picker->list_selector.selected_item);
 
-    return filenames[selected_index];
+    return metadata->filepath;
 }
 
 void level_picker_clean_selection(LevelPicker *level_picker)
 {
     trace_assert(level_picker);
-    list_selector_clean_selection(level_picker->list_selector);
+    level_picker->list_selector.selected_item = -1;
 }
 
 int level_picker_enter_camera_event(LevelPicker *level_picker,
@@ -263,9 +202,3 @@ int level_picker_enter_camera_event(LevelPicker *level_picker,
     camera_center_at(camera, level_picker->camera_position);
     return 0;
 }
-
-float level_picker_get_volume(LevelPicker *level_picker)
-{
-  trace_assert(level_picker);
-  return level_picker->volume_slider.value;
-}