From 0509023d76b33825dbefb214a6b41258a4eec15f Mon Sep 17 00:00:00 2001 From: KikooDX Date: Sat, 16 Jan 2021 12:36:20 +0100 Subject: [PATCH] Fancy water, but can't jump out of it. Accurate I guess, people can't just "jump out" of water IRL. --- include/player_modifiers.h | 1 + include/player_vars.h | 1 + include/tiles.h | 7 +++++-- src/player.c | 10 +++++++--- src/player_modifiers.c | 14 ++++++++++++++ src/tiles.c | 4 +++- 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/include/player_modifiers.h b/include/player_modifiers.h index 8d2acb1..68e690c 100644 --- a/include/player_modifiers.h +++ b/include/player_modifiers.h @@ -11,6 +11,7 @@ #include "player.h" +void player_mod_water(Player *player, uint8_t sides); void player_mod_ice(Player *player, uint8_t sides); void player_mod_glue(Player *player, uint8_t sides); #endif diff --git a/include/player_vars.h b/include/player_vars.h index 1f8235d..f73da52 100644 --- a/include/player_vars.h +++ b/include/player_vars.h @@ -6,6 +6,7 @@ typedef struct Player_vars { int acceleration; int jump_spd; int gravity; + int gravity_scalar; } Player_vars; #endif /* _DEF_PLAYER_VARS */ diff --git a/include/tiles.h b/include/tiles.h index 1245820..3f39af5 100644 --- a/include/tiles.h +++ b/include/tiles.h @@ -10,11 +10,13 @@ typedef unsigned char Tile_flags; /* the tile properties (bitmask) */ enum { I_SOLID, I_SPIKY, + I_WATER, I_ICE, I_GLUE }; #define F_SOLID (1 << I_SOLID) #define F_SPIKY (1 << I_SPIKY) +#define F_WATER (1 << I_WATER) #define F_ICE (1 << I_ICE) #define F_GLUE (1 << I_GLUE) @@ -22,6 +24,7 @@ enum { #define P_AIR (0) #define P_BASE (F_SOLID) #define P_SPIKE (F_SPIKY) +#define P_WATER (F_WATER) #define P_ICE (F_SOLID | F_ICE) #define P_GLUE (F_SOLID | F_GLUE) #define P_UNKNOWN (0) @@ -29,14 +32,14 @@ enum { enum { ID_AIR = TILE_AT(0, 0), ID_SPIKE = TILE_AT(1, 0), - ID_CHAIN = TILE_AT(0, 4), ID_ICE_0 = TILE_AT(0, 1), ID_ICE_1 = TILE_AT(0, 2), ID_ICE_2 = TILE_AT(1, 2), ID_ICE_3 = TILE_AT(0, 3), ID_ICE_4 = TILE_AT(1, 3), + ID_WATER = TILE_AT(2, 1), ID_GLUE = TILE_AT(1, 1), - ID_SLIME = TILE_AT(2, 1), + ID_SLIME = TILE_AT(3, 1), ID_BASE_0 = TILE_AT(0, 12), ID_BASE_1 = TILE_AT(1, 12), ID_BASE_2 = TILE_AT(2, 12), diff --git a/src/player.c b/src/player.c index 5ed99bf..2c197f6 100644 --- a/src/player.c +++ b/src/player.c @@ -15,7 +15,8 @@ #define MAX_SPD (128 * PXS) #define FRICTION 0.01 #define ACCELERATION (int)(MAX_SPD * FRICTION) -#define GRAVITY PXS +#define GRAVITY_SCALAR 16 +#define GRAVITY (PXS / GRAVITY_SCALAR) #define FAST_FALL_FACTOR 3 #define JUMP_SPD (-128 * PXS) #define GRACE_UNITS (int)(UPS / 10) @@ -45,6 +46,7 @@ void player_set_vars(Player *player, const Level *level) { player->vars.acceleration = ACCELERATION; player->vars.jump_spd = JUMP_SPD; player->vars.gravity = GRAVITY; + player->vars.gravity_scalar = GRAVITY_SCALAR; /* collide on all sides */ Vec pos = { player->pos.x - 1, player->pos.y }; Tile_flags flags_left; @@ -74,6 +76,7 @@ void player_set_vars(Player *player, const Level *level) { side_flags[i] |= D_CEIL; } /* apply modifiers */ + player_mod_water(player, side_flags[I_WATER]); player_mod_ice(player, side_flags[I_ICE]); player_mod_glue(player, side_flags[I_GLUE]); /* fix wrong values */ @@ -146,9 +149,10 @@ void player_step(Player *player, Input *input, const Level *level, uint step) { if (player->spd.y < 0 && !player->jump_held) { /* The player is rising and let go the jump key, * accelerate gravity until they reach 0. */ - player->spd.y += player->vars.gravity * FAST_FALL_FACTOR; + player->spd.y += player->vars.gravity * FAST_FALL_FACTOR * + player->vars.gravity_scalar; } else { - player->spd.y += player->vars.gravity; + player->spd.y += player->vars.gravity * player->vars.gravity_scalar; } /* Grace frames allow the player to jump a short * time after leaving a platform. */ diff --git a/src/player_modifiers.c b/src/player_modifiers.c index 71e341b..09109d4 100644 --- a/src/player_modifiers.c +++ b/src/player_modifiers.c @@ -1,5 +1,19 @@ #include "player_modifiers.h" #include "player.h" +#include "conf.h" + +void player_mod_water(Player *player, uint8_t sides) { + if (sides & D_ANY) { + /* precise and slow movement */ + player->vars.acceleration *= 4; + player->vars.friction *= 16; + /* low jump and super slow fall */ + player->vars.jump_spd /= 4; + player->vars.gravity_scalar /= 8; + /* allow the player to jump midair */ + player->grace = 1; + } +} void player_mod_ice(Player *player, uint8_t sides) { if (sides & D_FLOOR) { diff --git a/src/tiles.c b/src/tiles.c index c85dd52..f461654 100644 --- a/src/tiles.c +++ b/src/tiles.c @@ -3,12 +3,14 @@ Tile_flags tile_get_flags(Tile tile) { switch (tile) { case ID_AIR: - case ID_CHAIN: return P_AIR; break; case ID_SPIKE: return P_SPIKE; break; + case ID_WATER: + return P_WATER; + break; case ID_ICE_0: case ID_ICE_1: case ID_ICE_2: