]> git.lizzy.rs Git - nothing.git/blob - src/game/level/lava.c
Move error to system "subpackage"
[nothing.git] / src / game / level / lava.c
1 #include <SDL2/SDL.h>
2 #include <stdio.h>
3 #include <assert.h>
4
5 #include "./lt.h"
6 #include "./lava.h"
7 #include "./system/error.h"
8 #include "./color.h"
9 #include "./game/level/lava/wavy_rect.h"
10
11 struct lava_t {
12     lt_t *lt;
13     size_t rects_count;
14     wavy_rect_t **rects;
15 };
16
17 lava_t *create_lava_from_stream(FILE *stream)
18 {
19     assert(stream);
20
21     lt_t *lt = create_lt();
22     if (lt == NULL) {
23         return NULL;
24     }
25
26     lava_t *lava = PUSH_LT(lt, malloc(sizeof(lava_t)), free);
27     if (lava == NULL) {
28         throw_error(ERROR_TYPE_LIBC);
29         RETURN_LT(lt, NULL);
30     }
31
32     if (fscanf(stream, "%lu", &lava->rects_count) < 0) {
33         throw_error(ERROR_TYPE_LIBC);
34         RETURN_LT(lt, NULL);
35     }
36
37     lava->rects = PUSH_LT(lt, malloc(sizeof(wavy_rect_t*) * lava->rects_count), free);
38     if (lava->rects == NULL) {
39         throw_error(ERROR_TYPE_LIBC);
40         RETURN_LT(lt, NULL);
41     }
42
43     for (size_t i = 0; i < lava->rects_count; ++i) {
44         lava->rects[i] = PUSH_LT(lt, create_wavy_rect_from_stream(stream), destroy_wavy_rect);
45         if (lava->rects[i] == NULL) {
46             RETURN_LT(lt, NULL);
47         }
48     }
49
50     lava->lt = lt;
51
52     return lava;
53 }
54
55 void destroy_lava(lava_t *lava)
56 {
57     assert(lava);
58     RETURN_LT0(lava->lt);
59 }
60
61 /* TODO(#119): Lava rendering is too boring */
62 int lava_render(const lava_t   *lava,
63                 SDL_Renderer   *renderer,
64                 const camera_t *camera)
65 {
66     assert(lava);
67     assert(renderer);
68     assert(camera);
69
70     for (size_t i = 0; i < lava->rects_count; ++i) {
71         if (wavy_rect_render(lava->rects[i], renderer, camera) < 0) {
72             return -1;
73         }
74     }
75
76     return 0;
77 }
78
79 int lava_update(lava_t *lava, float delta_time)
80 {
81     assert(lava);
82
83     for (size_t i = 0; i < lava->rects_count; ++i) {
84         if (wavy_rect_update(lava->rects[i], delta_time) < 0) {
85             return -1;
86         }
87     }
88
89     return 0;
90 }
91
92 int lava_overlaps_rect(const lava_t *lava,
93                       rect_t rect)
94 {
95     assert(lava);
96
97     for (size_t i = 0; i < lava->rects_count; ++i) {
98         if (wavy_rect_overlaps(lava->rects[i], rect)) {
99             return 1;
100         }
101     }
102
103     return 0;
104 }