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/log.h"
10 #include "system/lt.h"
11 #include "system/nth_alloc.h"
12 #include "system/str.h"
18 RigidBodies *rigid_bodies;
24 Boxes *create_boxes_from_rect_layer(const RectLayer *layer, RigidBodies *rigid_bodies)
27 trace_assert(rigid_bodies);
31 Boxes *boxes = PUSH_LT(lt, nth_calloc(1, sizeof(Boxes)), free);
37 boxes->boxes_ids = create_dynarray_malloc(ENTITY_MAX_ID_SIZE);
38 boxes->body_ids = create_dynarray_malloc(sizeof(RigidBodyId));
39 boxes->body_colors = create_dynarray_malloc(sizeof(Color));
41 boxes->rigid_bodies = rigid_bodies;
43 const size_t count = rect_layer_count(layer);
44 Rect const *rects = rect_layer_rects(layer);
45 Color const *colors = rect_layer_colors(layer);
46 const char *ids = rect_layer_ids(layer);
48 for (size_t i = 0; i < count; ++i) {
49 RigidBodyId body_id = rigid_bodies_add(rigid_bodies, rects[i]);
50 dynarray_push(&boxes->body_ids, &body_id);
51 dynarray_push(&boxes->body_colors, &colors[i]);
52 dynarray_push(&boxes->boxes_ids, ids + i * ENTITY_MAX_ID_SIZE);
58 void destroy_boxes(Boxes *boxes)
62 RigidBodyId *body_ids = (RigidBodyId *)boxes->body_ids.data;
63 for (size_t i = 0; i < boxes->body_ids.count; ++i) {
64 rigid_bodies_remove(boxes->rigid_bodies, body_ids[i]);
67 free(boxes->boxes_ids.data);
68 free(boxes->body_ids.data);
69 free(boxes->body_colors.data);
71 RETURN_LT0(boxes->lt);
74 int boxes_render(Boxes *boxes, const Camera *camera)
79 const size_t count = boxes->body_ids.count;
80 RigidBodyId *body_ids = (RigidBodyId *)boxes->body_ids.data;
81 Color *body_colors = (Color *)boxes->body_colors.data;
83 for (size_t i = 0; i < count; ++i) {
84 if (rigid_bodies_render(
96 int boxes_update(Boxes *boxes,
101 const size_t count = boxes->body_ids.count;
102 RigidBodyId *body_ids = (RigidBodyId *)boxes->body_ids.data;
104 for (size_t i = 0; i < count; ++i) {
105 if (rigid_bodies_update(boxes->rigid_bodies, body_ids[i], delta_time) < 0) {
113 void boxes_float_in_lava(Boxes *boxes, Lava *lava)
118 const size_t count = boxes->body_ids.count;
119 RigidBodyId *body_ids = (RigidBodyId*)boxes->body_ids.data;
121 for (size_t i = 0; i < count; ++i) {
122 lava_float_rigid_body(lava, boxes->rigid_bodies, body_ids[i]);
126 int boxes_add_box(Boxes *boxes, Rect rect, Color color)
130 RigidBodyId body_id = rigid_bodies_add(boxes->rigid_bodies, rect);
131 dynarray_push(&boxes->body_ids, &body_id);
132 dynarray_push(&boxes->body_colors, &color);
137 int boxes_delete_at(Boxes *boxes, Vec2f position)
141 const size_t count = boxes->body_ids.count;
142 RigidBodyId *body_ids = (RigidBodyId*)boxes->body_ids.data;
144 for (size_t i = 0; i < count; ++i) {
145 const Rect hitbox = rigid_bodies_hitbox(
148 if (rect_contains_point(hitbox, position)) {
149 rigid_bodies_remove(boxes->rigid_bodies, body_ids[i]);
150 dynarray_delete_at(&boxes->body_ids, i);
151 dynarray_delete_at(&boxes->body_colors, i);