From 515e1e3759a1c286775386bc0b704cddd81d260e Mon Sep 17 00:00:00 2001 From: KikooDX Date: Sun, 19 Dec 2021 11:48:17 +0100 Subject: [PATCH] water & swimming in it --- inc/conf.h | 3 +++ inc/player.h | 2 +- inc/tile.h | 1 + inc/util.h | 2 ++ res/tileset.png | Bin 8578 -> 8899 bytes src/player.c | 13 ++++++++++++- src/util.c | 12 ++++++++++++ 7 files changed, 31 insertions(+), 2 deletions(-) diff --git a/inc/conf.h b/inc/conf.h index f11e2b7..5e57133 100644 --- a/inc/conf.h +++ b/inc/conf.h @@ -10,8 +10,11 @@ #define AIR_FRICTION (AIR_ACCELERATION / MAX_WALK_SPEED) #define GROUND_FRICTION (GROUND_ACCELERATION / MAX_WALK_SPEED) #define AIR_RESISTANCE 0.01f +#define WATER_RESISTANCE 0.15f #define GRAVITY 0.3f #define JUMP_SPEED -6.0f +#define SWIM_SPEED -1.6f +#define SWIM_OUT_SPEED -4.8f #define JUMP_BREAK 3 #define JUMP_BUFFER 12 #define JUMP_GRACE 6 diff --git a/inc/player.h b/inc/player.h index 1cd8de2..ecb4f57 100644 --- a/inc/player.h +++ b/inc/player.h @@ -7,7 +7,7 @@ struct Player { struct Vec pos, gravity; struct VecF spd, rem; enum AirState air_state; - int jump_buffer, jump_grace, burn, bouncing; + int jump_buffer, jump_grace, burn, bouncing, was_in_water; }; void player_spawn(struct Player *); diff --git a/inc/tile.h b/inc/tile.h index 82c77fa..5f52320 100644 --- a/inc/tile.h +++ b/inc/tile.h @@ -13,6 +13,7 @@ enum Tile { TILE_GRAV_U, TILE_GRAV_R, TILE_GRAV_L, + TILE_WATER, TILE_COUNT, TILE_OOB, }; diff --git a/inc/util.h b/inc/util.h index 4b9f878..436b465 100644 --- a/inc/util.h +++ b/inc/util.h @@ -2,3 +2,5 @@ int sign(int); float absf(float); +float minf(float, float); +float maxf(float, float); diff --git a/res/tileset.png b/res/tileset.png index 4e32e11a39acd5a4ba4f23f7b7d2935845bcc68b..003c597978b99f59b762bae3b5696ed7a3b1816a 100644 GIT binary patch delta 5215 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 diff --git a/src/player.c b/src/player.c index ac4a817..2f90d24 100644 --- a/src/player.c +++ b/src/player.c @@ -26,6 +26,7 @@ player_spawn(struct Player *p) p->jump_buffer = 0; p->jump_grace = 0; p->burn = 0; + p->was_in_water = 0; } void @@ -33,6 +34,7 @@ player_update(struct Player *p) { const int on_ground = collide_solid(p->pos.x + p->gravity.x, p->pos.y + p->gravity.y); + const int in_water = collide(p->pos.x, p->pos.y, TILE_WATER); const int k_left = input_down(K_LEFT); const int k_right = input_down(K_RIGHT); // const int k_up = input_down(K_UP); @@ -60,7 +62,7 @@ player_update(struct Player *p) spd_x += dir_x * (on_ground ? GROUND_ACCELERATION : AIR_ACCELERATION); /* air resistance & gravity */ - spd_y *= (1 - AIR_RESISTANCE); + spd_y *= 1 - (in_water ? WATER_RESISTANCE : AIR_RESISTANCE); spd_y += (p->air_state == AS_BREAKING) ? (GRAVITY * JUMP_BREAK) : (GRAVITY); @@ -96,6 +98,13 @@ player_update(struct Player *p) p->jump_grace = 0; } + /* swim */ + if (k_jump && (p->was_in_water || in_water)) { + spd_y = + minf(spd_y, (in_water) ? (SWIM_SPEED) : (SWIM_OUT_SPEED)); + p->air_state = AS_RISING; + } + /* bounce */ if (collide(p->pos.x, p->pos.y, TILE_BOUNCER)) { if (!p->bouncing) { @@ -151,6 +160,8 @@ player_update(struct Player *p) p->gravity.x = -1; p->gravity.y = 0; } + + p->was_in_water = in_water; } void diff --git a/src/util.c b/src/util.c index 9088538..ec6b526 100644 --- a/src/util.c +++ b/src/util.c @@ -11,3 +11,15 @@ absf(float x) { return x * (-1 + 2 * (x > 0)); } + +float +minf(float x, float y) +{ + return (x < y) ? (x) : (y); +} + +float +maxf(float x, float y) +{ + return (x > y) ? (x) : (y); +}