]> 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 f112080a7c36037193ab4971f25b18ba0c1b713d..d36637590fd6f6dff29c5380f1bd4562e1c8f272 100644 (file)
@@ -1,8 +1,8 @@
-#include <SDL2/SDL.h>
-#include "system/stacktrace.h"
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <SDL.h>
+
 #include "game/level/explosion.h"
 #include "game/level/script.h"
 #include "game/level/rigid_bodies.h"
@@ -14,6 +14,8 @@
 #include "system/log.h"
 #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
@@ -35,7 +37,6 @@ struct Player {
 
     RigidBodyId alive_body_id;
     Explosion *dying_body;
-    Script *script;
 
     int jump_threshold;
     Color color;
@@ -45,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);
@@ -60,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) {
@@ -96,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;
 
@@ -202,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;
@@ -223,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"));
         }
     }
 }
@@ -298,7 +287,7 @@ int player_sound(Player *player,
     if (player->play_die_cue) {
         player->play_die_cue = 0;
 
-        if (sound_samples_play_sound(sound_samples, 0, 0) < 0) {
+        if (sound_samples_play_sound(sound_samples, 0) < 0) {
             return -1;
         }
     }