6 #include "./platforms.h"
16 platforms_t *platforms;
21 level_t *create_level_from_file(const char *file_name)
25 lt_t *const lt = create_lt();
30 level_t *const level = PUSH_LT(lt, malloc(sizeof(level_t)), free);
32 throw_error(ERROR_TYPE_LIBC);
36 FILE *level_file = PUSH_LT(lt, fopen(file_name, "r"), fclose);
37 if (level_file == NULL) {
38 throw_error(ERROR_TYPE_LIBC);
42 level->player = PUSH_LT(lt, create_player_from_stream(level_file), destroy_player);
43 if (level->player == NULL) {
47 level->platforms = PUSH_LT(lt, create_platforms_from_stream(level_file), destroy_platforms);
48 if (level->platforms == NULL) {
52 level->goals = PUSH_LT(lt, create_goals_from_stream(level_file), destroy_goals);
53 if (level->goals == NULL) {
57 level->camera = PUSH_LT(lt, create_camera(vec(0.0f, 0.0f)), destroy_camera);
58 if (level->camera == NULL) {
64 fclose(RELEASE_LT(lt, level_file));
69 void destroy_level(level_t *level)
72 RETURN_LT0(level->lt);
75 int level_render(const level_t *level, SDL_Renderer *renderer)
80 if (player_render(level->player, renderer, level->camera) < 0) {
84 if (platforms_render(level->platforms, renderer, level->camera) < 0) {
88 if (goals_render(level->goals, renderer, level->camera) < 0) {
95 int level_update(level_t *level, Uint32 delta_time)
98 assert(delta_time > 0);
100 player_update(level->player, level->platforms, delta_time);
101 goals_update(level->goals, delta_time);
102 player_focus_camera(level->player, level->camera);
103 player_hide_goals(level->player, level->goals);
108 int level_event(level_t *level, const SDL_Event *event)
113 switch (event->type) {
115 switch (event->key.keysym.sym) {
117 player_jump(level->player);
122 case SDL_JOYBUTTONDOWN:
123 if (event->jbutton.button == 1) {
124 player_jump(level->player);
132 int level_input(level_t *level,
133 const Uint8 *const keyboard_state,
134 SDL_Joystick *the_stick_of_joy)
137 assert(keyboard_state);
138 (void) the_stick_of_joy;
140 if (keyboard_state[SDL_SCANCODE_A]) {
141 player_move_left(level->player);
142 } else if (keyboard_state[SDL_SCANCODE_D]) {
143 player_move_right(level->player);
144 } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
145 player_move_left(level->player);
146 } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
147 player_move_right(level->player);
149 player_stop(level->player);
155 void level_toggle_debug_mode(level_t *level)
157 camera_toggle_debug_mode(level->camera);
160 int level_reload_preserve_player(level_t *level, const char *file_name)
162 lt_t *lt = create_lt();
167 FILE *level_file = PUSH_LT(lt, fopen(file_name, "r"), fclose);
168 if (level_file == NULL) {
169 throw_error(ERROR_TYPE_LIBC);
173 player_t *skipped_player = create_player_from_stream(level_file);
174 if (skipped_player == NULL) {
177 destroy_player(skipped_player);
179 platforms_t *platforms = create_platforms_from_stream(level_file);
180 if (platforms == NULL) {
183 level->platforms = RESET_LT(level->lt, level->platforms, platforms);
185 goals_t *goals = create_goals_from_stream(level_file);
189 level->goals = RESET_LT(level->lt, level->goals, goals);