]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/player.c
(#819) Integrate LevelEditor Regions with Level
[nothing.git] / src / game / level / player.c
index 516953141a49d0bd8ac80418b3dc6288fc62e36b..d36637590fd6f6dff29c5380f1bd4562e1c8f272 100644 (file)
@@ -15,6 +15,7 @@
 #include "system/lt.h"
 #include "system/nth_alloc.h"
 #include "system/stacktrace.h"
+#include "ebisp/builtins.h"
 
 #define PLAYER_WIDTH 25.0f
 #define PLAYER_HEIGHT 25.0f
@@ -36,7 +37,6 @@ struct Player {
 
     RigidBodyId alive_body_id;
     Explosion *dying_body;
-    Script *script;
 
     int jump_threshold;
     Color color;
@@ -46,13 +46,16 @@ struct Player {
     int play_die_cue;
 };
 
-Player *create_player_from_line_stream(LineStream *line_stream, RigidBodies *rigid_bodies, Broadcast *broadcast)
+Player *create_player_from_player_layer(const PlayerLayer *player_layer,
+                                        RigidBodies *rigid_bodies,
+                                        Broadcast *broadcast)
 {
-    trace_assert(line_stream);
+    trace_assert(player_layer);
+    trace_assert(rigid_bodies);
+    trace_assert(broadcast);
 
     Lt *lt = create_lt();
 
-
     Player *player = PUSH_LT(lt, nth_calloc(1, sizeof(Player)), free);
     if (player == NULL) {
         RETURN_LT(lt, NULL);
@@ -61,35 +64,18 @@ Player *create_player_from_line_stream(LineStream *line_stream, RigidBodies *rig
 
     player->rigid_bodies = rigid_bodies;
 
-    float x = 0.0f, y = 0.0f;
-    char colorstr[7];
-
-    if (sscanf(
-            line_stream_next(line_stream),
-            "%f%f%6s",
-            &x, &y, colorstr) == EOF) {
-        log_fail("Could not read player\n");
-        RETURN_LT(lt, NULL);
-    }
-
-    player->script = PUSH_LT(
-        lt,
-        create_script_from_line_stream(line_stream, broadcast),
-        destroy_script);
-    if (player->script == NULL) {
-        RETURN_LT(lt, NULL);
-    }
-
-    const Color color = hexstr(colorstr);
-
     player->alive_body_id = rigid_bodies_add(
         rigid_bodies,
-        rect(x, y, PLAYER_WIDTH, PLAYER_HEIGHT));
+        rect(
+            player_layer->position.x,
+            player_layer->position.y,
+            PLAYER_WIDTH,
+            PLAYER_HEIGHT));
 
     player->dying_body = PUSH_LT(
         lt,
         create_explosion(
-            color,
+            player_layer->color_picker.color,
             PLAYER_DEATH_DURATION),
         destroy_explosion);
     if (player->dying_body == NULL) {
@@ -97,8 +83,8 @@ Player *create_player_from_line_stream(LineStream *line_stream, RigidBodies *rig
     }
 
     player->jump_threshold = 0;
-    player->color = color;
-    player->checkpoint = vec(x, y);
+    player->color = player_layer->color_picker.color;
+    player->checkpoint = player_layer->position;
     player->play_die_cue = 0;
     player->state = PLAYER_STATE_ALIVE;
 
@@ -203,9 +189,10 @@ void player_stop(Player *player)
     rigid_bodies_move(player->rigid_bodies, player->alive_body_id, vec(0.0f, 0.0f));
 }
 
-void player_jump(Player *player)
+void player_jump(Player *player, Script *supa_script)
 {
     trace_assert(player);
+    trace_assert(supa_script);
 
     if (rigid_bodies_touches_ground(player->rigid_bodies, player->alive_body_id)) {
         player->jump_threshold = 0;
@@ -224,8 +211,9 @@ void player_jump(Player *player)
             vec(0.0f, -PLAYER_JUMP));
         player->jump_threshold++;
 
-        if (script_has_scope_value(player->script, "on-jump")) {
-            script_eval(player->script, "(on-jump)");
+        if (script_has_scope_value(supa_script, "on-player-jump")) {
+            Gc *gc = script_gc(supa_script);
+            script_eval(supa_script, list(gc, "q", "on-player-jump"));
         }
     }
 }