8 #include "./platforms.h"
20 platforms_t *create_platforms_from_stream(FILE *stream)
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_size = 0;
36 if (fscanf(stream, "%lu", &platforms->rects_size) == EOF) {
37 throw_error(ERROR_TYPE_LIBC);
41 platforms->rects = PUSH_LT(lt, malloc(sizeof(rect_t) * platforms->rects_size), free);
42 if (platforms->rects == NULL) {
43 throw_error(ERROR_TYPE_LIBC);
47 platforms->colors = PUSH_LT(lt, malloc(sizeof(color_t) * platforms->rects_size), free);
48 if (platforms->colors == NULL) {
49 throw_error(ERROR_TYPE_LIBC);
54 for (size_t i = 0; i < platforms->rects_size; ++i) {
55 if (fscanf(stream, "%f%f%f%f%6s\n",
56 &platforms->rects[i].x, &platforms->rects[i].y,
57 &platforms->rects[i].w, &platforms->rects[i].h,
59 throw_error(ERROR_TYPE_LIBC);
62 platforms->colors[i] = color_from_hexstr(color);
70 platforms_t *create_platforms_from_file(const char *filename)
74 FILE *platforms_file = fopen(filename, "r");
75 if (platforms_file == NULL) {
76 throw_error(ERROR_TYPE_LIBC);
80 platforms_t *platforms = create_platforms_from_stream(platforms_file);
81 if (platforms != NULL) {
82 fclose(platforms_file);
86 fclose(platforms_file);
90 void destroy_platforms(platforms_t *platforms)
93 RETURN_LT0(platforms->lt);
96 int platforms_save_to_file(const platforms_t *platforms,
102 lt_t *const lt = create_lt();
107 FILE *platforms_file = PUSH_LT(lt, fopen(filename, "w"), fclose);
109 if (platforms_file == NULL) {
110 throw_error(ERROR_TYPE_LIBC);
114 for (size_t i = 0; i < platforms->rects_size; ++i) {
115 if (fprintf(platforms_file, "%f %f %f %f\n",
116 platforms->rects[i].x, platforms->rects[i].y,
117 platforms->rects[i].w, platforms->rects[i].h) < 0) {
118 throw_error(ERROR_TYPE_LIBC);
126 int platforms_render(const platforms_t *platforms,
127 SDL_Renderer *renderer,
128 const camera_t *camera)
130 for (size_t i = 0; i < platforms->rects_size; ++i) {
131 if (camera_fill_rect(
135 platforms->colors[i]) < 0) {
136 throw_error(ERROR_TYPE_SDL2);
144 void platforms_rect_object_collide(const platforms_t *platforms,
146 int sides[RECT_SIDE_N])
150 memset(sides, 0, sizeof(int) * RECT_SIDE_N);
152 for (size_t i = 0; i < platforms->rects_size; ++i) {
153 rect_object_impact(&object, &platforms->rects[i], sides);