]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level.c
Merge pull request #646 from tsoding/639
[nothing.git] / src / game / level.c
index e7a74766f1483d2d13c4bf8cce92c67ba0355c61..799ffd360ffbfec441ca115957c2b4fd524b2797 100644 (file)
@@ -1,7 +1,10 @@
 #include <SDL2/SDL.h>
 #include "system/stacktrace.h"
 
+#include "broadcast.h"
 #include "color.h"
+#include "ebisp/builtins.h"
+#include "ebisp/interpreter.h"
 #include "game/camera.h"
 #include "game/level.h"
 #include "game/level/background.h"
 #include "game/level/platforms.h"
 #include "game/level/player.h"
 #include "game/level/regions.h"
+#include "game/level/rigid_bodies.h"
 #include "system/line_stream.h"
 #include "system/lt.h"
 #include "system/lt/lt_adapters.h"
 #include "system/nth_alloc.h"
-#include "ebisp/interpreter.h"
-#include "ebisp/builtins.h"
-#include "broadcast.h"
 
 #define LEVEL_LINE_MAX_LENGTH 512
+#define LEVEL_GRAVITY 1500.0f
 
 struct Level
 {
@@ -37,6 +39,7 @@ struct Level
     Labels *labels;
     Regions *regions;
     Physical_world *physical_world;
+    RigidBodies *rigid_bodies;
 };
 
 Level *create_level_from_file(const char *file_name, Broadcast *broadcast)
@@ -146,6 +149,21 @@ Level *create_level_from_file(const char *file_name, Broadcast *broadcast)
             level->boxes,
             level->physical_world) < 0) { RETURN_LT(lt, NULL); }
 
+    level->rigid_bodies = PUSH_LT(lt, create_rigid_bodies(1024), destroy_rigid_bodies);
+    if (level->rigid_bodies == NULL) {
+        RETURN_LT(lt, NULL);
+    }
+    rigid_bodies_add(
+        level->rigid_bodies,
+        rect(0.0, -1000.0, 100.0, 100.0),
+        rgba(1.0f, 0.0f, 0.0f, 1.0f));
+
+    rigid_bodies_add(
+        level->rigid_bodies,
+        rect(150.0, -1000.0, 100.0, 100.0),
+        rgba(0.0f, 1.0f, 0.0f, 1.0f));
+
+
     level->lt = lt;
 
     destroy_line_stream(RELEASE_LT(lt, level_stream));
@@ -199,6 +217,10 @@ int level_render(const Level *level, Camera *camera)
         return -1;
     }
 
+    if (rigid_bodies_render(level->rigid_bodies, camera) < 0) {
+        return -1;
+    }
+
     return 0;
 }
 
@@ -209,10 +231,14 @@ int level_update(Level *level, float delta_time)
 
     physical_world_apply_gravity(level->physical_world);
     boxes_float_in_lava(level->boxes, level->lava);
+    rigid_bodies_apply_omniforce(level->rigid_bodies, vec(0.0f, LEVEL_GRAVITY));
 
+    rigid_bodies_update(level->rigid_bodies, delta_time);
     boxes_update(level->boxes, delta_time);
     player_update(level->player, delta_time);
 
+    rigid_bodies_collide_with_itself(level->rigid_bodies);
+    rigid_bodies_collide_with_platforms(level->rigid_bodies, level->platforms);
     physical_world_collide_solids(level->physical_world, level->platforms);
 
     player_hide_goals(level->player, level->goals);