8 #include "./platforms.h"
19 platforms_t *create_platforms(const rect_t *rects, size_t rects_size)
22 assert(rects_size > 0);
24 lt_t *const lt = create_lt();
29 platforms_t *platforms = PUSH_LT(lt, malloc(sizeof(platforms_t)), free);
30 if (platforms == NULL) {
31 throw_error(ERROR_TYPE_LIBC);
35 platforms->rects = PUSH_LT(lt, malloc(sizeof(rect_t) * rects_size), free);
36 if (platforms->rects == NULL) {
37 throw_error(ERROR_TYPE_LIBC);
41 platforms->rects = memcpy(platforms->rects, rects, sizeof(rect_t) * rects_size);
42 platforms->rects_size = rects_size;
48 platforms_t *create_platforms_from_stream(FILE *stream)
52 lt_t *const lt = create_lt();
57 platforms_t *platforms = PUSH_LT(lt, malloc(sizeof(platforms_t)), free);
58 if (platforms == NULL) {
59 throw_error(ERROR_TYPE_LIBC);
63 platforms->rects_size = 0;
64 if (fscanf(stream, "%lu", &platforms->rects_size) == EOF) {
65 throw_error(ERROR_TYPE_LIBC);
69 platforms->rects = PUSH_LT(lt, malloc(sizeof(rect_t) * platforms->rects_size), free);
70 if (platforms->rects == NULL) {
71 throw_error(ERROR_TYPE_LIBC);
75 for (size_t i = 0; i < platforms->rects_size; ++i) {
76 if (fscanf(stream, "%f%f%f%f\n",
77 &platforms->rects[i].x, &platforms->rects[i].y,
78 &platforms->rects[i].w, &platforms->rects[i].h) < 0) {
79 throw_error(ERROR_TYPE_LIBC);
89 platforms_t *create_platforms_from_file(const char *filename)
93 FILE *platforms_file = fopen(filename, "r");
94 if (platforms_file == NULL) {
95 throw_error(ERROR_TYPE_LIBC);
99 platforms_t *platforms = create_platforms_from_stream(platforms_file);
100 if (platforms != NULL) {
101 fclose(platforms_file);
105 fclose(platforms_file);
109 void destroy_platforms(platforms_t *platforms)
112 RETURN_LT0(platforms->lt);
115 int save_platforms_to_file(const platforms_t *platforms,
116 const char *filename)
121 lt_t *const lt = create_lt();
126 FILE *platforms_file = PUSH_LT(lt, fopen(filename, "w"), fclose);
128 if (platforms_file == NULL) {
129 throw_error(ERROR_TYPE_LIBC);
133 for (size_t i = 0; i < platforms->rects_size; ++i) {
134 if (fprintf(platforms_file, "%f %f %f %f\n",
135 platforms->rects[i].x, platforms->rects[i].y,
136 platforms->rects[i].w, platforms->rects[i].h) < 0) {
137 throw_error(ERROR_TYPE_LIBC);
145 int render_platforms(const platforms_t *platforms,
146 SDL_Renderer *renderer,
147 const camera_t *camera)
149 if (SDL_SetRenderDrawColor(renderer, 255, 96, 96, 255) < 0) {
150 throw_error(ERROR_TYPE_SDL2);
154 for (size_t i = 0; i < platforms->rects_size; ++i) {
155 if (camera_fill_rect(camera, renderer, &platforms->rects[i]) < 0) {
156 throw_error(ERROR_TYPE_SDL2);
164 void platforms_rect_object_collide(const platforms_t *platforms,
166 int sides[RECT_SIDE_N])
170 memset(sides, 0, sizeof(int) * RECT_SIDE_N);
172 for (size_t i = 0; i < platforms->rects_size; ++i) {
173 rect_object_impact(&object, &platforms->rects[i], sides);