]> git.lizzy.rs Git - nothing.git/blob - src/game/level_picker.c
Merge pull request #605 from tsoding/418
[nothing.git] / src / game / level_picker.c
1 #include <stdio.h>
2
3 #include "./level_picker.h"
4 #include "system/stacktrace.h"
5 #include "system/lt.h"
6 #include "system/nth_alloc.h"
7 #include "str.h"
8 #include "game/level/background.h"
9
10 /* TODO(#606): LevelPicker doesn't allow to select any levels */
11
12 struct LevelPicker
13 {
14     Lt *lt;
15     const char *dirpath;
16     Background *background;
17     Vec camera_position;
18 };
19
20 LevelPicker *create_level_picker(const char *dirpath)
21 {
22     trace_assert(dirpath);
23
24     Lt *lt = create_lt();
25     if (lt == NULL) {
26         return NULL;
27     }
28
29     LevelPicker *level_picker = PUSH_LT(
30         lt,
31         nth_alloc(sizeof(LevelPicker)),
32         free);
33     if (level_picker == NULL) {
34         RETURN_LT(lt, NULL);
35     }
36     level_picker->lt = lt;
37
38     level_picker->dirpath = PUSH_LT(
39         lt,
40         string_duplicate(dirpath, NULL),
41         free);
42     if (level_picker->dirpath == NULL) {
43         RETURN_LT(lt, NULL);
44     }
45
46     level_picker->background = PUSH_LT(
47         lt,
48         create_background(hexstr("073642")),
49         destroy_background);
50     if (level_picker->background == NULL) {
51         RETURN_LT(lt, NULL);
52     }
53
54     level_picker->camera_position = vec(0.0f, 0.0f);
55
56     return level_picker;
57 }
58
59 void destroy_level_picker(LevelPicker *level_picker)
60 {
61     trace_assert(level_picker);
62     RETURN_LT0(level_picker->lt);
63 }
64
65 int level_picker_render(const LevelPicker *level_picker,
66                         Camera *camera,
67                         SDL_Renderer *renderer)
68 {
69     trace_assert(level_picker);
70     trace_assert(renderer);
71
72     if (background_render(level_picker->background, camera) < 0) {
73         return -1;
74     }
75
76     return 0;
77 }
78
79 int level_picker_update(LevelPicker *level_picker,
80                         float delta_time)
81 {
82     trace_assert(level_picker);
83
84     vec_add(&level_picker->camera_position,
85             vec(50.0f * delta_time, 0.0f));
86
87     return 0;
88 }
89
90 int level_picker_event(LevelPicker *level_picker, const SDL_Event *event)
91 {
92     trace_assert(level_picker);
93     trace_assert(event);
94     return 0;
95 }
96
97 int level_picker_input(LevelPicker *level_picker,
98                        const Uint8 *const keyboard_state,
99                        SDL_Joystick *the_stick_of_joy)
100 {
101     trace_assert(level_picker);
102     trace_assert(keyboard_state);
103     trace_assert(the_stick_of_joy);
104     return 0;
105 }
106
107 const char *level_picker_selected_level(const LevelPicker *level_picker)
108 {
109     trace_assert(level_picker);
110     return level_picker->dirpath;
111 }
112
113 void level_picker_clean_selection(LevelPicker *level_picker)
114 {
115     trace_assert(level_picker);
116 }
117
118 int level_picker_enter_camera_event(LevelPicker *level_picker,
119                                     Camera *camera)
120 {
121     camera_center_at(camera, level_picker->camera_position);
122     return 0;
123 }