]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/player.c
Remove closed TODOs: #118 #119 #110 #109 #151
[nothing.git] / src / game / level / player.c
index 00376a5df6728cfbb4b5f6bca7496e98839e1e8c..f23bdd94e505bc458ccfc56ee4057a996e0cfe8b 100644 (file)
@@ -33,7 +33,6 @@ struct player_t {
     int jump_count;
     color_t color;
 
-    /* TODO(#110): introduce checkpoints */
     vec_t checkpoint;
 
     int play_die_cue;
@@ -103,20 +102,28 @@ void destroy_player(player_t * player)
     RETURN_LT0(player->lt);
 }
 
+solid_ref_t player_as_solid(player_t *player)
+{
+    solid_ref_t ref = {
+        .tag = SOLID_PLAYER,
+        .ptr = (void*) player
+    };
+
+    return ref;
+}
+
 int player_render(const player_t * player,
-                  SDL_Renderer *renderer,
                   const camera_t *camera)
 {
     assert(player);
-    assert(renderer);
     assert(camera);
 
     switch (player->state) {
     case PLAYER_STATE_ALIVE:
-        return rigid_rect_render(player->alive_body, renderer, camera);
+        return rigid_rect_render(player->alive_body, camera);
 
     case PLAYER_STATE_DYING:
-        return dying_rect_render(player->dying_body, renderer, camera);
+        return dying_rect_render(player->dying_body, camera);
 
     default: {}
     }
@@ -125,19 +132,13 @@ int player_render(const player_t * player,
 }
 
 void player_update(player_t *player,
-                   const platforms_t *platforms,
                    float delta_time)
 {
     assert(player);
-    assert(platforms);
 
     switch (player->state) {
     case PLAYER_STATE_ALIVE: {
-        rigid_rect_update(player->alive_body, platforms, delta_time);
-
-        if (rigid_rect_touches_ground(player->alive_body)) {
-            player->jump_count = 0;
-        }
+        rigid_rect_update(player->alive_body, delta_time);
 
         const rect_t hitbox = rigid_rect_hitbox(player->alive_body);
 
@@ -166,6 +167,25 @@ void player_update(player_t *player,
     }
 }
 
+void player_collide_with_solid(player_t *player, solid_ref_t solid)
+{
+    if (player->state == PLAYER_STATE_ALIVE) {
+        rigid_rect_collide_with_solid(player->alive_body, solid);
+
+        if (rigid_rect_touches_ground(player->alive_body)) {
+            player->jump_count = 0;
+        }
+    }
+}
+
+void player_impact_rigid_rect(player_t * player,
+                              rigid_rect_t *rigid_rect)
+{
+    if (player->state == PLAYER_STATE_ALIVE) {
+        rigid_rect_impact_rigid_rect(player->alive_body, rigid_rect);
+    }
+}
+
 void player_move_left(player_t *player)
 {
     assert(player);
@@ -249,15 +269,33 @@ void player_checkpoint(player_t *player, vec_t checkpoint)
 }
 
 int player_sound(player_t *player,
-                 sound_medium_t *sound_medium)
+                 sound_samples_t *sound_samples)
 {
     if (player->play_die_cue) {
         player->play_die_cue = 0;
 
-        if (sound_medium_play_sound(sound_medium, 0, 1) < 0) {
+        if (sound_samples_play_sound(sound_samples, 0, 0) < 0) {
             return -1;
         }
     }
 
     return 0;
 }
+
+rect_t player_hitbox(const player_t *player)
+{
+    if (player->state == PLAYER_STATE_ALIVE) {
+        return rigid_rect_hitbox(player->alive_body);
+    } else {
+        return rect(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+}
+
+void player_rect_object_collide(player_t *player,
+                                rect_t object,
+                                int sides[RECT_SIDE_N])
+{
+    if (player->state == PLAYER_STATE_ALIVE) {
+        rigid_body_object_collide(player->alive_body, object, sides);
+    }
+}