1 #include "system/stacktrace.h"
4 #include "game/level/boxes.h"
5 #include "game/level/level_editor/rect_layer.h"
6 #include "game/level/player.h"
7 #include "game/level/rigid_bodies.h"
9 #include "system/line_stream.h"
10 #include "system/log.h"
11 #include "system/lt.h"
12 #include "system/nth_alloc.h"
13 #include "system/str.h"
19 RigidBodies *rigid_bodies;
25 Boxes *create_boxes_from_rect_layer(const RectLayer *layer, RigidBodies *rigid_bodies)
28 trace_assert(rigid_bodies);
32 Boxes *boxes = PUSH_LT(lt, nth_calloc(1, sizeof(Boxes)), free);
38 boxes->boxes_ids = create_dynarray(ENTITY_MAX_ID_SIZE);
39 boxes->body_ids = create_dynarray(sizeof(RigidBodyId));
40 boxes->body_colors = create_dynarray(sizeof(Color));
42 boxes->rigid_bodies = rigid_bodies;
44 const size_t count = rect_layer_count(layer);
45 Rect const *rects = rect_layer_rects(layer);
46 Color const *colors = rect_layer_colors(layer);
47 const char *ids = rect_layer_ids(layer);
49 for (size_t i = 0; i < count; ++i) {
50 RigidBodyId body_id = rigid_bodies_add(rigid_bodies, rects[i]);
51 dynarray_push(&boxes->body_ids, &body_id);
52 dynarray_push(&boxes->body_colors, &colors[i]);
53 dynarray_push(&boxes->boxes_ids, ids + i * ENTITY_MAX_ID_SIZE);
59 void destroy_boxes(Boxes *boxes)
63 RigidBodyId *body_ids = (RigidBodyId *)boxes->body_ids.data;
64 for (size_t i = 0; i < boxes->body_ids.count; ++i) {
65 rigid_bodies_remove(boxes->rigid_bodies, body_ids[i]);
68 free(boxes->boxes_ids.data);
69 free(boxes->body_ids.data);
70 free(boxes->body_colors.data);
72 RETURN_LT0(boxes->lt);
75 int boxes_render(Boxes *boxes, const Camera *camera)
80 const size_t count = boxes->body_ids.count;
81 RigidBodyId *body_ids = (RigidBodyId *)boxes->body_ids.data;
82 Color *body_colors = (Color *)boxes->body_colors.data;
84 for (size_t i = 0; i < count; ++i) {
85 if (rigid_bodies_render(
97 int boxes_update(Boxes *boxes,
102 const size_t count = boxes->body_ids.count;
103 RigidBodyId *body_ids = (RigidBodyId *)boxes->body_ids.data;
105 for (size_t i = 0; i < count; ++i) {
106 if (rigid_bodies_update(boxes->rigid_bodies, body_ids[i], delta_time) < 0) {
114 void boxes_float_in_lava(Boxes *boxes, Lava *lava)
119 const size_t count = boxes->body_ids.count;
120 RigidBodyId *body_ids = (RigidBodyId*)boxes->body_ids.data;
122 for (size_t i = 0; i < count; ++i) {
123 lava_float_rigid_body(lava, boxes->rigid_bodies, body_ids[i]);
127 int boxes_add_box(Boxes *boxes, Rect rect, Color color)
131 RigidBodyId body_id = rigid_bodies_add(boxes->rigid_bodies, rect);
132 dynarray_push(&boxes->body_ids, &body_id);
133 dynarray_push(&boxes->body_colors, &color);
138 int boxes_delete_at(Boxes *boxes, Vec2f position)
142 const size_t count = boxes->body_ids.count;
143 RigidBodyId *body_ids = (RigidBodyId*)boxes->body_ids.data;
145 for (size_t i = 0; i < count; ++i) {
146 const Rect hitbox = rigid_bodies_hitbox(
149 if (rect_contains_point(hitbox, position)) {
150 rigid_bodies_remove(boxes->rigid_bodies, body_ids[i]);
151 dynarray_delete_at(&boxes->body_ids, i);
152 dynarray_delete_at(&boxes->body_colors, i);