]> 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 7ecc473252a8eb5614880edda5b011bf461c0e50..d36637590fd6f6dff29c5380f1bd4562e1c8f272 100644 (file)
@@ -1,10 +1,9 @@
-#include <SDL2/SDL.h>
-#include "system/stacktrace.h"
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "game/level/player/dying_rect.h"
-#include "game/level/player/rigid_rect.h"
+#include <SDL.h>
+
+#include "game/level/explosion.h"
 #include "game/level/script.h"
 #include "game/level/rigid_bodies.h"
 #include "goals.h"
@@ -15,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
@@ -28,7 +29,6 @@ typedef enum Player_state {
     PLAYER_STATE_DYING
 } Player_state;
 
-/* TODO(#633): Player's alive_body should be a body from RigidBodies */
 struct Player {
     Lt *lt;
     Player_state state;
@@ -36,8 +36,7 @@ struct Player {
     RigidBodies *rigid_bodies;
 
     RigidBodyId alive_body_id;
-    Dying_rect *dying_body;
-    Script *script;
+    Explosion *dying_body;
 
     int jump_threshold;
     Color color;
@@ -47,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);
     }
@@ -65,45 +64,27 @@ 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_dying_rect(
-            color,
+        create_explosion(
+            player_layer->color_picker.color,
             PLAYER_DEATH_DURATION),
-        destroy_dying_rect);
+        destroy_explosion);
     if (player->dying_body == NULL) {
         RETURN_LT(lt, NULL);
     }
 
     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;
 
@@ -132,11 +113,15 @@ 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:
-        return dying_rect_render(player->dying_body, camera);
+        return explosion_render(player->dying_body, camera);
 
     default: {}
     }
@@ -162,9 +147,10 @@ void player_update(Player *player,
     } break;
 
     case PLAYER_STATE_DYING: {
-        dying_rect_update(player->dying_body, delta_time);
+        explosion_update(player->dying_body, delta_time);
 
-        if (dying_rect_is_dead(player->dying_body)) {
+        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,
@@ -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"));
         }
     }
 }
@@ -241,8 +229,9 @@ void player_die(Player *player)
                 player->alive_body_id);
 
         player->play_die_cue = 1;
-        dying_rect_start_dying(player->dying_body, vec(hitbox.x, hitbox.y));
+        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);
     }
 }
 
@@ -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;
         }
     }
@@ -317,3 +306,10 @@ bool player_overlaps_rect(const Player *player,
                 player->rigid_bodies,
                 player->alive_body_id));
 }
+
+Rect player_hitbox(const Player *player)
+{
+    return rigid_bodies_hitbox(
+        player->rigid_bodies,
+        player->alive_body_id);
+}