3 #include "./level_picker.h"
4 #include "game/level/background.h"
5 #include "game/sprite_font.h"
7 #include "system/nth_alloc.h"
8 #include "system/stacktrace.h"
9 #include "system/str.h"
10 #include "ui/list_selector.h"
11 #include "system/log.h"
12 #include "game/level_folder.h"
13 #include "ui/menu_title.h"
18 Background *background;
20 LevelFolder *level_folder;
21 MenuTitle *menu_title;
22 ListSelector *list_selector;
25 LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dirpath)
27 trace_assert(dirpath);
34 LevelPicker *level_picker = PUSH_LT(
36 nth_alloc(sizeof(LevelPicker)),
38 if (level_picker == NULL) {
41 level_picker->lt = lt;
43 level_picker->background = PUSH_LT(
45 create_background(hexstr("073642")),
47 if (level_picker->background == NULL) {
51 level_picker->camera_position = vec(0.0f, 0.0f);
53 level_picker->level_folder = PUSH_LT(
55 create_level_folder(dirpath),
56 destroy_level_folder);
57 if (level_picker->level_folder == NULL) {
61 level_picker->list_selector = PUSH_LT(
65 level_folder_files(level_picker->level_folder),
66 level_folder_count(level_picker->level_folder)),
67 destroy_list_selector);
68 if (level_picker->list_selector == NULL) {
75 void destroy_level_picker(LevelPicker *level_picker)
77 trace_assert(level_picker);
78 RETURN_LT0(level_picker->lt);
81 int level_picker_render(const LevelPicker *level_picker,
83 SDL_Renderer *renderer)
85 trace_assert(level_picker);
86 trace_assert(renderer);
88 // TODO(#719): LevelPicker does not have a "Select Level" title
90 if (background_render(level_picker->background, camera) < 0) {
94 const Vec font_scale = vec(5.0f, 5.0f);
95 const float padding_bottom = 50.0f;
97 Vec selector_size = list_selector_size(
98 level_picker->list_selector,
103 SDL_RenderGetViewport(renderer, &view_port);
105 if (list_selector_render(
106 level_picker->list_selector,
108 vec((float) view_port.w * 0.5f - selector_size.x * 0.5f, 100.0f),
110 padding_bottom) < 0) {
117 int level_picker_update(LevelPicker *level_picker,
120 trace_assert(level_picker);
122 vec_add(&level_picker->camera_position,
123 vec(50.0f * delta_time, 0.0f));
128 int level_picker_event(LevelPicker *level_picker, const SDL_Event *event)
130 trace_assert(level_picker);
132 list_selector_event(level_picker->list_selector, event);
136 int level_picker_input(LevelPicker *level_picker,
137 const Uint8 *const keyboard_state,
138 SDL_Joystick *the_stick_of_joy)
140 trace_assert(level_picker);
141 trace_assert(keyboard_state);
142 (void) the_stick_of_joy;
146 const char *level_picker_selected_level(const LevelPicker *level_picker)
148 trace_assert(level_picker);
149 return list_selector_selected(level_picker->list_selector);
152 void level_picker_clean_selection(LevelPicker *level_picker)
154 trace_assert(level_picker);
155 list_selector_clean_selection(level_picker->list_selector);
158 int level_picker_enter_camera_event(LevelPicker *level_picker,
161 camera_center_at(camera, level_picker->camera_position);