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:
parent
318a4e3626
commit
0509023d76
|
@ -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
|
||||
|
|
|
@ -6,6 +6,7 @@ typedef struct Player_vars {
|
|||
int acceleration;
|
||||
int jump_spd;
|
||||
int gravity;
|
||||
int gravity_scalar;
|
||||
} Player_vars;
|
||||
|
||||
#endif /* _DEF_PLAYER_VARS */
|
||||
|
|
|
@ -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),
|
||||
|
|
10
src/player.c
10
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. */
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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:
|
||||
|
|
Reference in New Issue