6 #include "game/level/lava/wavy_rect.h"
7 #include "game/level/player/rigid_rect.h"
10 #include "system/error.h"
11 #include "system/lt.h"
13 #define LAVA_BOINGNESS 2500.0f
21 Lava *create_lava_from_stream(FILE *stream)
30 Lava *lava = PUSH_LT(lt, malloc(sizeof(Lava)), free);
32 throw_error(ERROR_TYPE_LIBC);
36 if (fscanf(stream, "%lu", &lava->rects_count) < 0) {
37 throw_error(ERROR_TYPE_LIBC);
41 lava->rects = PUSH_LT(lt, malloc(sizeof(Wavy_rect*) * lava->rects_count), free);
42 if (lava->rects == NULL) {
43 throw_error(ERROR_TYPE_LIBC);
47 for (size_t i = 0; i < lava->rects_count; ++i) {
48 lava->rects[i] = PUSH_LT(lt, create_wavy_rect_from_stream(stream), destroy_wavy_rect);
49 if (lava->rects[i] == NULL) {
59 void destroy_lava(Lava *lava)
65 /* TODO(#449): lava does not render its id in debug mode */
66 int lava_render(const Lava *lava,
72 for (size_t i = 0; i < lava->rects_count; ++i) {
73 if (wavy_rect_render(lava->rects[i], camera) < 0) {
81 int lava_update(Lava *lava, float delta_time)
85 for (size_t i = 0; i < lava->rects_count; ++i) {
86 if (wavy_rect_update(lava->rects[i], delta_time) < 0) {
94 bool lava_overlaps_rect(const Lava *lava,
99 for (size_t i = 0; i < lava->rects_count; ++i) {
100 if (rects_overlap(wavy_rect_hitbox(lava->rects[i]), rect)) {
108 void lava_float_rigid_rect(Lava *lava, Rigid_rect *object)
112 const Rect object_hitbox = rigid_rect_hitbox(object);
113 for (size_t i = 0; i < lava->rects_count; ++i) {
114 const Rect lava_hitbox = wavy_rect_hitbox(lava->rects[i]);
115 if (rects_overlap(object_hitbox, lava_hitbox)) {
116 const Rect overlap_area = rects_overlap_area(object_hitbox, lava_hitbox);
117 const float k = overlap_area.w * overlap_area.h / (object_hitbox.w * object_hitbox.h);
118 rigid_rect_apply_force(
120 vec(0.0f, -k * LAVA_BOINGNESS));
121 rigid_rect_damper(object, vec(0.0f, -0.9f));