]> 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 ca328b48c5b9cedc06fac8df8e76e2c8caefa226..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,17 +46,17 @@ 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();
 
-    if (lt == NULL) {
-        return NULL;
-    }
-
-    Player *player = PUSH_LT(lt, nth_alloc(sizeof(Player)), free);
+    Player *player = PUSH_LT(lt, nth_calloc(1, sizeof(Player)), free);
     if (player == NULL) {
         RETURN_LT(lt, NULL);
     }
@@ -63,36 +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),
-        color);
+        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) {
@@ -100,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;
 
@@ -130,7 +113,11 @@ int player_render(const Player * player,
             return -1;
         }
 
-        return rigid_bodies_render(player->rigid_bodies, player->alive_body_id, camera);
+        return rigid_bodies_render(
+            player->rigid_bodies,
+            player->alive_body_id,
+            player->color,
+            camera);
     }
 
     case PLAYER_STATE_DYING:
@@ -163,6 +150,7 @@ void player_update(Player *player,
         explosion_update(player->dying_body, delta_time);
 
         if (explosion_is_done(player->dying_body)) {
+            rigid_bodies_disable(player->rigid_bodies, player->alive_body_id, false);
             rigid_bodies_transform_velocity(
                 player->rigid_bodies,
                 player->alive_body_id,
@@ -201,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;
@@ -222,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"));
         }
     }
 }
@@ -241,6 +231,7 @@ void player_die(Player *player)
         player->play_die_cue = 1;
         explosion_start(player->dying_body, vec(hitbox.x, hitbox.y));
         player->state = PLAYER_STATE_DYING;
+        rigid_bodies_disable(player->rigid_bodies, player->alive_body_id, true);
     }
 }
 
@@ -296,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;
         }
     }