]> git.lizzy.rs Git - nothing.git/blob - src/glitchy_rect.c
(#122) use wavy_rect for lava
[nothing.git] / src / glitchy_rect.c
1 #include <assert.h>
2 #include <time.h>
3 #include <SDL2/SDL.h>
4 #include "./glitchy_rect.h"
5 #include "./lt.h"
6 #include "./camera.h"
7 #include "./error.h"
8
9 #define GLITCHY_RECTS_COUNT 10
10 #define GLITCHY_RECTS_X_BUFFER 0.0f
11 #define GLITCHY_RECTS_Y_BUFFER 40.0f
12 #define GLITCHY_RECTS_INTERVAL 1500
13
14 struct glitchy_rect_t
15 {
16     lt_t *lt;
17     rect_t rect;
18     color_t color;
19     int glitchy;
20     Uint32 timer;
21     Uint32 interval;
22     unsigned int seed;
23 };
24
25 glitchy_rect_t *create_glitchy_rect(rect_t rect, color_t color)
26 {
27     lt_t *lt = create_lt();
28
29     if (lt == NULL) {
30         return NULL;
31     }
32
33     glitchy_rect_t * const glitchy_rect = PUSH_LT(
34         lt,
35         malloc(sizeof(glitchy_rect_t)),
36         free);
37
38     glitchy_rect->rect = rect;
39     glitchy_rect->color = color;
40     glitchy_rect->glitchy = 0;
41     glitchy_rect->timer = 0;
42     glitchy_rect->interval = (Uint32) (rand() % GLITCHY_RECTS_INTERVAL);
43     glitchy_rect->seed = 0;
44     glitchy_rect->lt = lt;
45
46     return glitchy_rect;
47 }
48
49 glitchy_rect_t *create_glitchy_rect_from_stream(FILE *stream)
50 {
51     char color_name[7];
52     rect_t rect;
53
54     if (fscanf(stream, "%f%f%f%f%6s\n",
55                &rect.x, &rect.y,
56                &rect.w, &rect.h,
57                color_name) < 0) {
58         throw_error(ERROR_TYPE_LIBC);
59         return NULL;
60     }
61
62     color_t color = color_from_hexstr(color_name);
63
64     return create_glitchy_rect(rect, color);
65 }
66
67 void destroy_glitchy_rect(glitchy_rect_t *glitchy_rect)
68 {
69     assert(glitchy_rect);
70     RETURN_LT0(glitchy_rect->lt);
71 }
72
73 int glitchy_rect_render(const glitchy_rect_t *glitchy_rect,
74                         SDL_Renderer *renderer,
75                         const camera_t *camera)
76 {
77     assert(glitchy_rect);
78     assert(renderer);
79     assert(camera);
80
81     if (glitchy_rect->glitchy) {
82         srand(glitchy_rect->seed);
83
84         const float x_range = glitchy_rect->rect.w + GLITCHY_RECTS_X_BUFFER;
85         const float y_range = glitchy_rect->rect.h + GLITCHY_RECTS_Y_BUFFER;
86
87         for (int i = 0; i < GLITCHY_RECTS_COUNT; i++) {
88             const float x = fmodf((float) rand(), x_range) - GLITCHY_RECTS_X_BUFFER * 0.5f;
89             const float y = fmodf((float) rand(), y_range) - GLITCHY_RECTS_Y_BUFFER * 0.5f;
90             const float w = fmodf((float) rand(), (x_range - x)) - GLITCHY_RECTS_X_BUFFER * 0.5f;
91             const float h = fmodf((float) rand(), (y_range - y)) - GLITCHY_RECTS_Y_BUFFER * 0.5f;
92
93             if (camera_fill_rect(
94                     camera,
95                     renderer,
96                     rect(
97                         glitchy_rect->rect.x + x,
98                         glitchy_rect->rect.y + y,
99                         w,
100                         h),
101                     glitchy_rect->color) < 0) {
102                 return -1;
103             }
104         }
105
106         srand((unsigned int) time(NULL));
107
108     } else {
109         return camera_fill_rect(
110             camera,
111             renderer,
112             glitchy_rect->rect,
113             glitchy_rect->color);
114     }
115
116     return 0;
117 }
118
119 int glitchy_rect_update(glitchy_rect_t *glitchy_rect,
120                         Uint32 delta_time)
121 {
122     assert(glitchy_rect);
123     assert(delta_time > 0);
124
125     glitchy_rect->timer += delta_time;
126
127     if (!glitchy_rect->glitchy) {
128         if (glitchy_rect->timer >= glitchy_rect->interval) {
129             glitchy_rect->glitchy = 1;
130             glitchy_rect->timer = 0;
131             glitchy_rect->seed = (unsigned int) time(NULL) + (unsigned int) rand();
132         }
133     } else {
134         if (glitchy_rect->timer >= 100) {
135             glitchy_rect->glitchy = 0;
136             glitchy_rect->timer = 0;
137             glitchy_rect->interval = (Uint32) (rand() % GLITCHY_RECTS_INTERVAL);
138         }
139     }
140
141     return 0;
142 }
143
144 int glitchy_rect_overlaps(const glitchy_rect_t *glitchy_rect,
145                           rect_t rect)
146 {
147     return rects_overlap(glitchy_rect->rect, rect);
148 }