2 #include "system/stacktrace.h"
6 #include "game/level/lava/wavy_rect.h"
10 #include "system/line_stream.h"
11 #include "system/nth_alloc.h"
12 #include "system/log.h"
13 #include "game/level/level_editor/rect_layer.h"
15 #define LAVA_BOINGNESS 2500.0f
23 Lava *create_lava_from_line_stream(LineStream *line_stream)
25 trace_assert(line_stream);
29 Lava *lava = PUSH_LT(lt, nth_calloc(1, sizeof(Lava)), free);
35 line_stream_next(line_stream),
37 &lava->rects_count) < 0) {
38 log_fail("Could not read amount of lava\n");
42 lava->rects = PUSH_LT(lt, nth_calloc(1, sizeof(Wavy_rect*) * lava->rects_count), free);
43 if (lava->rects == NULL) {
47 for (size_t i = 0; i < lava->rects_count; ++i) {
48 lava->rects[i] = PUSH_LT(lt, create_wavy_rect_from_line_stream(line_stream), destroy_wavy_rect);
49 if (lava->rects[i] == NULL) {
59 Lava *create_lava_from_rect_layer(const RectLayer *rect_layer)
63 Lava *lava = PUSH_LT(lt, nth_calloc(1, sizeof(Lava)), free);
69 lava->rects_count = rect_layer_count(rect_layer);
70 lava->rects = PUSH_LT(lt, nth_calloc(lava->rects_count, sizeof(Wavy_rect*)), free);
71 if (lava->rects == NULL) {
75 const Rect *rects = rect_layer_rects(rect_layer);
76 const Color *colors = rect_layer_colors(rect_layer);
77 for (size_t i = 0; i < lava->rects_count; ++i) {
78 lava->rects[i] = PUSH_LT(lt, create_wavy_rect(rects[i], colors[i]), destroy_wavy_rect);
79 if (lava->rects[i] == NULL) {
87 void destroy_lava(Lava *lava)
93 /* TODO(#449): lava does not render its id in debug mode */
94 int lava_render(const Lava *lava,
100 for (size_t i = 0; i < lava->rects_count; ++i) {
101 if (wavy_rect_render(lava->rects[i], camera) < 0) {
109 int lava_update(Lava *lava, float delta_time)
113 for (size_t i = 0; i < lava->rects_count; ++i) {
114 if (wavy_rect_update(lava->rects[i], delta_time) < 0) {
122 bool lava_overlaps_rect(const Lava *lava,
127 for (size_t i = 0; i < lava->rects_count; ++i) {
128 if (rects_overlap(wavy_rect_hitbox(lava->rects[i]), rect)) {
136 void lava_float_rigid_body(Lava *lava, RigidBodies *rigid_bodies, RigidBodyId id)
140 const Rect object_hitbox = rigid_bodies_hitbox(rigid_bodies, id);
141 for (size_t i = 0; i < lava->rects_count; ++i) {
142 const Rect lava_hitbox = wavy_rect_hitbox(lava->rects[i]);
143 if (rects_overlap(object_hitbox, lava_hitbox)) {
144 const Rect overlap_area = rects_overlap_area(object_hitbox, lava_hitbox);
145 const float k = overlap_area.w * overlap_area.h / (object_hitbox.w * object_hitbox.h);
146 rigid_bodies_apply_force(
149 vec(0.0f, -k * LAVA_BOINGNESS));
150 rigid_bodies_damper(rigid_bodies, id, vec(0.0f, -0.9f));