Fancy water, but can't jump out of it.

Accurate I guess, people can't just "jump out" of water IRL.
This commit is contained in:
KikooDX 2021-01-16 12:36:20 +01:00
parent 318a4e3626
commit 0509023d76
6 changed files with 31 additions and 6 deletions

View File

@ -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

View File

@ -6,6 +6,7 @@ typedef struct Player_vars {
int acceleration;
int jump_spd;
int gravity;
int gravity_scalar;
} Player_vars;
#endif /* _DEF_PLAYER_VARS */

View File

@ -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),

View File

@ -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. */

View File

@ -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) {

View File

@ -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: