]> git.lizzy.rs Git - nothing.git/blob - src/game/level/platforms.c
create_lt() -> {0}
[nothing.git] / src / game / level / platforms.c
1 #include <SDL2/SDL.h>
2 #include "system/stacktrace.h"
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <errno.h>
7
8 #include "platforms.h"
9 #include "system/lt.h"
10 #include "system/lt/lt_adapters.h"
11 #include "system/line_stream.h"
12 #include "system/nth_alloc.h"
13 #include "system/log.h"
14 #include "game/level/level_editor/layer.h"
15
16 struct Platforms {
17     Lt lt;
18
19     Rect *rects;
20     Color *colors;
21     size_t rects_size;
22 };
23
24 Platforms *create_platforms_from_rect_layer(const RectLayer *layer)
25 {
26     trace_assert(layer);
27
28     Lt lt = {0};
29     if (lt == NULL) {
30         return NULL;
31     }
32
33     Platforms *platforms = PUSH_LT(
34         lt,
35         nth_calloc(1, sizeof(Platforms)),
36         free);
37     if (platforms == NULL) {
38         RETURN_LT(lt, NULL);
39     }
40     platforms->lt = lt;
41
42     platforms->rects_size = rect_layer_count(layer);
43
44     platforms->rects = PUSH_LT(lt, nth_calloc(1, sizeof(Rect) * platforms->rects_size), free);
45     if (platforms->rects == NULL) {
46         RETURN_LT(lt, NULL);
47     }
48     memcpy(platforms->rects, rect_layer_rects(layer), sizeof(Rect) * platforms->rects_size);
49
50
51     platforms->colors = PUSH_LT(lt, nth_calloc(1, sizeof(Color) * platforms->rects_size), free);
52     if (platforms->colors == NULL) {
53         RETURN_LT(lt, NULL);
54     }
55     memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size);
56
57     return platforms;
58 }
59
60 void destroy_platforms(Platforms *platforms)
61 {
62     trace_assert(platforms);
63     RETURN_LT0(platforms->lt);
64 }
65
66 /* TODO(#450): platforms do not render their ids in debug mode */
67 int platforms_render(const Platforms *platforms,
68                      Camera *camera)
69 {
70     for (size_t i = 0; i < platforms->rects_size; ++i) {
71         if (camera_fill_rect(
72                 camera,
73                 platforms->rects[i],
74                 platforms->colors[i]) < 0) {
75             return -1;
76         }
77     }
78
79     return 0;
80 }
81
82 void platforms_touches_rect_sides(const Platforms *platforms,
83                                   Rect object,
84                                   int sides[RECT_SIDE_N])
85 {
86     trace_assert(platforms);
87
88     for (size_t i = 0; i < platforms->rects_size; ++i) {
89         rect_object_impact(object, platforms->rects[i], sides);
90     }
91 }
92
93 Vec platforms_snap_rect(const Platforms *platforms,
94                          Rect *object)
95 {
96     trace_assert(platforms);
97
98     Vec result = vec(1.0f, 1.0f);
99     for (size_t i = 0; i < platforms->rects_size; ++i) {
100         if (rects_overlap(platforms->rects[i], *object)) {
101             result = vec_entry_mult(result, rect_snap(platforms->rects[i], object));
102         }
103     }
104
105     return result;
106 }