#include "system/stacktrace.h"
#include "broadcast.h"
+#include "dynarray.h"
#include "ebisp/builtins.h"
#include "ebisp/interpreter.h"
#include "game/level/boxes.h"
+#include "game/level/level_editor/rect_layer.h"
#include "game/level/player.h"
#include "game/level/rigid_bodies.h"
#include "math/rand.h"
#include "system/nth_alloc.h"
#include "system/str.h"
-#define BOXES_CAPACITY 1000
-#define BOXES_MAX_ID_SIZE 36
-
struct Boxes
{
Lt *lt;
RigidBodies *rigid_bodies;
- RigidBodyId *body_ids;
- Color *body_colors;
- size_t count;
+ Dynarray *body_ids;
+ Dynarray *body_colors;
};
-Boxes *create_boxes_from_line_stream(LineStream *line_stream, RigidBodies *rigid_bodies)
+Boxes *create_boxes_from_rect_layer(const RectLayer *layer, RigidBodies *rigid_bodies)
{
- trace_assert(line_stream);
+ trace_assert(layer);
+ trace_assert(rigid_bodies);
Lt *lt = create_lt();
- if (lt == NULL) {
- return NULL;
- }
-
- Boxes *boxes = PUSH_LT(lt, nth_alloc(sizeof(Boxes)), free);
+ Boxes *boxes = PUSH_LT(lt, nth_calloc(1, sizeof(Boxes)), free);
if (boxes == NULL) {
RETURN_LT(lt, NULL);
}
boxes->rigid_bodies = rigid_bodies;
- if (sscanf(
- line_stream_next(line_stream),
- "%lu",
- &boxes->count) == EOF) {
- log_fail("Could not read amount of boxes\n");
- RETURN_LT(lt, NULL);
- }
- log_info("Boxes count: %d\n", boxes->count);
-
- trace_assert(boxes->count < BOXES_CAPACITY);
-
- boxes->body_ids = PUSH_LT(lt, nth_alloc(sizeof(RigidBodyId) * BOXES_CAPACITY), free);
+ boxes->body_ids = PUSH_LT(lt, create_dynarray(sizeof(RigidBodyId)), destroy_dynarray);
if (boxes->body_ids == NULL) {
RETURN_LT(lt, NULL);
}
- boxes->body_colors = PUSH_LT(lt, nth_alloc(sizeof(Color) * BOXES_CAPACITY), free);
+ boxes->body_colors = PUSH_LT(lt, create_dynarray(sizeof(Color)), destroy_dynarray);
if (boxes->body_colors == NULL) {
RETURN_LT(lt, NULL);
}
- for (size_t i = 0; i < boxes->count; ++i) {
- char color[7];
- Rect rect;
- // TODO: box id is ignored
- char id[BOXES_MAX_ID_SIZE];
-
- if (sscanf(line_stream_next(line_stream),
- "%" STRINGIFY(BOXES_MAX_ID_SIZE) "s%f%f%f%f%6s\n",
- id,
- &rect.x, &rect.y,
- &rect.w, &rect.h,
- color) < 0) {
- log_fail("Could not read rigid rect\n");
- RETURN_LT(lt, NULL);
- }
+ const size_t count = rect_layer_count(layer);
+ Rect const *rects = rect_layer_rects(layer);
+ Color const *colors = rect_layer_colors(layer);
- boxes->body_colors[i] = hexstr(color);
- boxes->body_ids[i] = rigid_bodies_add(rigid_bodies, rect);
+ for (size_t i = 0; i < count; ++i) {
+ RigidBodyId body_id = rigid_bodies_add(rigid_bodies, rects[i]);
+ dynarray_push(boxes->body_ids, &body_id);
+ dynarray_push(boxes->body_colors, &colors[i]);
}
return boxes;
{
trace_assert(boxes);
- for (size_t i = 0; i < boxes->count; ++i) {
- rigid_bodies_remove(boxes->rigid_bodies, boxes->body_ids[i]);
+ const size_t count = dynarray_count(boxes->body_ids);
+ RigidBodyId *body_ids = dynarray_data(boxes->body_ids);
+
+ for (size_t i = 0; i < count; ++i) {
+ rigid_bodies_remove(boxes->rigid_bodies, body_ids[i]);
}
RETURN_LT0(boxes->lt);
trace_assert(boxes);
trace_assert(camera);
- for (size_t i = 0; i < boxes->count; ++i) {
+ const size_t count = dynarray_count(boxes->body_ids);
+ RigidBodyId *body_ids = dynarray_data(boxes->body_ids);
+ Color *body_colors = dynarray_data(boxes->body_colors);
+
+ for (size_t i = 0; i < count; ++i) {
if (rigid_bodies_render(
boxes->rigid_bodies,
- boxes->body_ids[i],
- boxes->body_colors[i],
+ body_ids[i],
+ body_colors[i],
camera) < 0) {
return -1;
}
trace_assert(boxes);
trace_assert(delta_time);
- for (size_t i = 0; i < boxes->count; ++i) {
- if (rigid_bodies_update(boxes->rigid_bodies, boxes->body_ids[i], delta_time) < 0) {
+ const size_t count = dynarray_count(boxes->body_ids);
+ RigidBodyId *body_ids = dynarray_data(boxes->body_ids);
+
+ for (size_t i = 0; i < count; ++i) {
+ if (rigid_bodies_update(boxes->rigid_bodies, body_ids[i], delta_time) < 0) {
return -1;
}
}
trace_assert(boxes);
trace_assert(lava);
- for (size_t i = 0; i < boxes->count; ++i) {
- lava_float_rigid_body(lava, boxes->rigid_bodies, boxes->body_ids[i]);
+ const size_t count = dynarray_count(boxes->body_ids);
+ RigidBodyId *body_ids = dynarray_data(boxes->body_ids);
+
+ for (size_t i = 0; i < count; ++i) {
+ lava_float_rigid_body(lava, boxes->rigid_bodies, body_ids[i]);
}
}
int boxes_add_box(Boxes *boxes, Rect rect, Color color)
{
trace_assert(boxes);
- trace_assert(boxes->count < BOXES_CAPACITY);
- boxes->body_ids[boxes->count] = rigid_bodies_add(boxes->rigid_bodies, rect);
- boxes->body_colors[boxes->count] = color;
- boxes->count++;
+ RigidBodyId body_id = rigid_bodies_add(boxes->rigid_bodies, rect);
+ dynarray_push(boxes->body_ids, &body_id);
+ dynarray_push(boxes->body_colors, &color);
return 0;
}
{
trace_assert(boxes);
- for (size_t i = 0; i < boxes->count; ++i) {
+ const size_t count = dynarray_count(boxes->body_ids);
+ RigidBodyId *body_ids = dynarray_data(boxes->body_ids);
+
+ for (size_t i = 0; i < count; ++i) {
const Rect hitbox = rigid_bodies_hitbox(
boxes->rigid_bodies,
- boxes->body_ids[i]);
+ body_ids[i]);
if (rect_contains_point(hitbox, position)) {
- rigid_bodies_remove(boxes->rigid_bodies, boxes->body_ids[i]);
- for (size_t j = i; j < boxes->count - 1; ++j) {
- boxes->body_ids[j] = boxes->body_ids[j + 1];
- }
- boxes->count--;
+ rigid_bodies_remove(boxes->rigid_bodies, body_ids[i]);
+ dynarray_delete_at(boxes->body_ids, i);
+ dynarray_delete_at(boxes->body_colors, i);
return 0;
}
}