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