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);
31 LevelPicker *level_picker = PUSH_LT(
33 nth_calloc(1, sizeof(LevelPicker)),
35 if (level_picker == NULL) {
38 level_picker->lt = lt;
40 level_picker->background = PUSH_LT(
42 create_background(hexstr("073642")),
44 if (level_picker->background == NULL) {
48 level_picker->camera_position = vec(0.0f, 0.0f);
50 level_picker->level_folder = PUSH_LT(
52 create_level_folder(dirpath),
53 destroy_level_folder);
54 if (level_picker->level_folder == NULL) {
58 level_picker->menu_title = PUSH_LT(
60 create_menu_title("Select Level", vec(10.0f, 10.0f), sprite_font),
62 if (level_picker->menu_title == NULL) {
66 level_picker->list_selector = PUSH_LT(
70 level_folder_titles(level_picker->level_folder),
71 level_folder_count(level_picker->level_folder),
74 destroy_list_selector);
75 if (level_picker->list_selector == NULL) {
82 void destroy_level_picker(LevelPicker *level_picker)
84 trace_assert(level_picker);
85 RETURN_LT0(level_picker->lt);
88 int level_picker_render(const LevelPicker *level_picker,
90 SDL_Renderer *renderer)
92 trace_assert(level_picker);
93 trace_assert(renderer);
95 const Rect viewport = camera_view_port_screen(camera);
97 if (background_render(level_picker->background, camera) < 0) {
101 if (menu_title_render(level_picker->menu_title, renderer) < 0) {
105 if (list_selector_render(level_picker->list_selector, renderer) < 0) {
111 const float padding = 20.0f;
112 const Point size = vec(3.0f, 3.0f);
113 const Point position = vec(0.0f, viewport.h - size.y * FONT_CHAR_HEIGHT);
116 if (camera_render_text_screen(
118 "Press 'N' to create new level",
121 vec(position.x + padding,
122 position.y - padding)) < 0) {
130 int level_picker_update(LevelPicker *level_picker,
133 trace_assert(level_picker);
135 vec_add(&level_picker->camera_position,
136 vec(50.0f * delta_time, 0.0f));
138 if (menu_title_update(level_picker->menu_title, delta_time) < 0) {
145 int level_picker_event(LevelPicker *level_picker, const SDL_Event *event)
147 trace_assert(level_picker);
150 switch (event->type) {
151 case SDL_WINDOWEVENT: {
152 switch (event->window.event) {
153 case SDL_WINDOWEVENT_SHOWN:
154 case SDL_WINDOWEVENT_RESIZED: {
155 const Vec font_scale = vec(5.0f, 5.0f);
156 const float padding_bottom = 50.0f;
159 SDL_GetWindowSize(SDL_GetWindowFromID(event->window.windowID), &width, NULL);
161 const Vec title_size = menu_title_size(level_picker->menu_title);
162 const float title_margin_top = 100.0f;
163 const float title_margin_bottom = 100.0f;
166 level_picker->menu_title,
167 vec((float)width * 0.5f - title_size.x * 0.5f, title_margin_top));
169 const Vec selector_size = list_selector_size(
170 level_picker->list_selector,
175 level_picker->list_selector,
176 vec((float)width * 0.5f - selector_size.x * 0.5f,
177 title_margin_top + title_size.y + title_margin_bottom));
183 return list_selector_event(level_picker->list_selector, event);
186 int level_picker_input(LevelPicker *level_picker,
187 const Uint8 *const keyboard_state,
188 SDL_Joystick *the_stick_of_joy)
190 trace_assert(level_picker);
191 trace_assert(keyboard_state);
192 (void) the_stick_of_joy;
196 const char *level_picker_selected_level(const LevelPicker *level_picker)
198 trace_assert(level_picker);
200 const int selected_index = list_selector_selected(level_picker->list_selector);
201 if (selected_index < 0) {
205 const char **filenames = level_folder_filenames(level_picker->level_folder);
207 return filenames[selected_index];
210 void level_picker_clean_selection(LevelPicker *level_picker)
212 trace_assert(level_picker);
213 list_selector_clean_selection(level_picker->list_selector);
216 int level_picker_enter_camera_event(LevelPicker *level_picker,
219 camera_center_at(camera, level_picker->camera_position);