3 #include "game/level/boxes.h"
4 #include "game/level/physical_world.h"
5 #include "game/level/player.h"
6 #include "game/level/player/rigid_rect.h"
7 #include "system/line_stream.h"
9 #include "system/nth_alloc.h"
10 #include "system/log.h"
19 Boxes *create_boxes_from_line_stream(LineStream *line_stream)
29 Boxes *boxes = PUSH_LT(lt, nth_alloc(sizeof(Boxes)), free);
35 line_stream_next(line_stream),
37 &boxes->count) == EOF) {
38 log_fail("Could not read amount of boxes\n");
42 boxes->bodies = PUSH_LT(lt, nth_alloc(sizeof(Rigid_rect*) * boxes->count), free);
43 if (boxes->bodies == NULL) {
47 for (size_t i = 0; i < boxes->count; ++i) {
48 boxes->bodies[i] = PUSH_LT(
50 create_rigid_rect_from_line_stream(line_stream),
52 if (boxes->bodies[i] == NULL) {
62 void destroy_boxes(Boxes *boxes)
65 RETURN_LT0(boxes->lt);
68 int boxes_render(Boxes *boxes, Camera *camera)
73 for (size_t i = 0; i < boxes->count; ++i) {
74 if (rigid_rect_render(boxes->bodies[i], camera) < 0) {
82 int boxes_update(Boxes *boxes,
88 for (size_t i = 0; i < boxes->count; ++i) {
89 if (rigid_rect_update(boxes->bodies[i], delta_time) < 0) {
97 int boxes_add_to_physical_world(const Boxes *boxes,
98 Physical_world *physical_world)
101 assert(physical_world);
103 for (size_t i = 0; i < boxes->count; ++i) {
104 if (physical_world_add_solid(
106 rigid_rect_as_solid(boxes->bodies[i])) < 0) {
114 void boxes_float_in_lava(Boxes *boxes, Lava *lava)
119 for (size_t i = 0; i < boxes->count; ++i) {
120 lava_float_rigid_rect(lava, boxes->bodies[i]);
124 Rigid_rect *boxes_rigid_rect(Boxes *boxes, const char *id)
129 for (size_t i = 0; i < boxes->count; ++i) {
130 if (rigid_rect_has_id(boxes->bodies[i], id)) {
131 return boxes->bodies[i];