8 #include "system/error.h"
19 // A wrapper for fclose to pass like lt_destroy_t
20 static void fclose_lt(void* file)
25 platforms_t *create_platforms_from_stream(FILE *stream)
29 lt_t *const lt = create_lt();
34 platforms_t *platforms = PUSH_LT(lt, malloc(sizeof(platforms_t)), free);
35 if (platforms == NULL) {
36 throw_error(ERROR_TYPE_LIBC);
40 platforms->rects_size = 0;
41 if (fscanf(stream, "%lu", &platforms->rects_size) == EOF) {
42 throw_error(ERROR_TYPE_LIBC);
46 platforms->rects = PUSH_LT(lt, malloc(sizeof(rect_t) * platforms->rects_size), free);
47 if (platforms->rects == NULL) {
48 throw_error(ERROR_TYPE_LIBC);
52 platforms->colors = PUSH_LT(lt, malloc(sizeof(color_t) * platforms->rects_size), free);
53 if (platforms->colors == NULL) {
54 throw_error(ERROR_TYPE_LIBC);
59 for (size_t i = 0; i < platforms->rects_size; ++i) {
60 if (fscanf(stream, "%f%f%f%f%6s\n",
61 &platforms->rects[i].x, &platforms->rects[i].y,
62 &platforms->rects[i].w, &platforms->rects[i].h,
64 throw_error(ERROR_TYPE_LIBC);
67 platforms->colors[i] = color_from_hexstr(color);
75 platforms_t *create_platforms_from_file(const char *filename)
79 FILE *platforms_file = fopen(filename, "r");
80 if (platforms_file == NULL) {
81 throw_error(ERROR_TYPE_LIBC);
85 platforms_t *platforms = create_platforms_from_stream(platforms_file);
86 if (platforms != NULL) {
87 fclose(platforms_file);
91 fclose(platforms_file);
95 void destroy_platforms(platforms_t *platforms)
98 RETURN_LT0(platforms->lt);
101 int platforms_save_to_file(const platforms_t *platforms,
102 const char *filename)
107 lt_t *const lt = create_lt();
112 FILE *platforms_file = PUSH_LT(lt, fopen(filename, "w"), fclose_lt);
114 if (platforms_file == NULL) {
115 throw_error(ERROR_TYPE_LIBC);
119 for (size_t i = 0; i < platforms->rects_size; ++i) {
120 if (fprintf(platforms_file, "%f %f %f %f\n",
121 platforms->rects[i].x, platforms->rects[i].y,
122 platforms->rects[i].w, platforms->rects[i].h) < 0) {
123 throw_error(ERROR_TYPE_LIBC);
131 solid_ref_t platforms_as_solid(platforms_t *platforms)
134 .tag = SOLID_PLATFORMS,
135 .ptr = (void*)platforms
141 int platforms_render(const platforms_t *platforms,
142 const camera_t *camera)
144 for (size_t i = 0; i < platforms->rects_size; ++i) {
145 if (camera_fill_rect(
148 platforms->colors[i]) < 0) {
149 throw_error(ERROR_TYPE_SDL2);
157 void platforms_touches_rect_sides(const platforms_t *platforms,
159 int sides[RECT_SIDE_N])
163 for (size_t i = 0; i < platforms->rects_size; ++i) {
164 rect_object_impact(object, platforms->rects[i], sides);
168 void platforms_apply_force(platforms_t *platforms,
173 /* Platforms have infinite mass and a fixed position in the