From 0ec3cb12f814a4c3d054bc6febef33931101b65a Mon Sep 17 00:00:00 2001 From: KikooDX Date: Fri, 15 Jan 2021 18:37:43 +0100 Subject: [PATCH] Modifiers are now "side dependent". Only implemented for floor. --- include/player_modifiers.h | 11 +++++++++-- src/player.c | 32 ++++++++++++++++++-------------- src/player_modifiers.c | 20 ++++++++++++++------ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/include/player_modifiers.h b/include/player_modifiers.h index d94023c..043c0b5 100644 --- a/include/player_modifiers.h +++ b/include/player_modifiers.h @@ -1,8 +1,15 @@ /* tile modifiers on player vars */ #ifndef _DEF_PLAYER_MODIFIERS #define _DEF_PLAYER_MODIFIERS + +#define D_LEFT 0b1 +#define D_RIGHT 0b10 +#define D_FLOOR 0b100 +#define D_CEIL 0b1000 +#define D_WALL (D_LEFT | D_RIGHT) +#define D_ANY (D_LEFT | D_RIGHT | D_FLOOR | D_CEIL) #include "player.h" -void player_mod_ice(Player *player); -void player_mod_glue(Player *player); +void player_mod_ice(Player *player, uint8_t sides); +void player_mod_glue(Player *player, uint8_t sides); #endif diff --git a/src/player.c b/src/player.c index dff5fce..30e4ce7 100644 --- a/src/player.c +++ b/src/player.c @@ -45,35 +45,39 @@ void player_set_vars(Player *player, const Level *level) { player->vars.acceleration = ACCELERATION; player->vars.jump_spd = JUMP_SPD; player->vars.gravity = GRAVITY; - /* apply modifiers */ - Vec pos = { player->pos.x, player->pos.y + 1 }; - Tile_flags flags = player_collide_or(player, pos, level); - pos.y -= 2; - flags |= player_collide_or(player, pos, level); + /* collide on all sides */ + Vec pos = { player->pos.x - 1, player->pos.y }; + Tile_flags flags_left; + Tile_flags flags_right; + Tile_flags flags_floor; + Tile_flags flags_ceil; + flags_left = player_collide_or(player, pos, level); + pos.x += 2; + flags_right = player_collide_or(player, pos, level); + pos.x -= 1; pos.y += 1; - pos.x += 1; - flags |= player_collide_or(player, pos, level); - pos.x -= 2; - flags |= player_collide_or(player, pos, level); + flags_floor = player_collide_or(player, pos, level); + pos.y -= 2; + flags_ceil = player_collide_or(player, pos, level); /* test for each flag */ for (uint i = 0; i < sizeof(Tile_flags) * 8; i++) { - if (flags & 1) { + if (flags_floor & 1) { switch (1 << i) { case F_ICE: - player_mod_ice(player); + player_mod_ice(player, D_FLOOR); break; case F_GLUE: - player_mod_glue(player); + player_mod_glue(player, D_FLOOR); break; default: break; } } - flags >>= 1; + flags_floor >>= 1; } } void player_move(Player *player, const Level *level) { - /* TODO: Take into account player's hitbox */ + /* TODO: Take into account player's hitbox */ const int sgn_spd_x = SGN(player->spd.x); const int sgn_spd_y = SGN(player->spd.y); Vec destination; diff --git a/src/player_modifiers.c b/src/player_modifiers.c index 6e49e0a..1afa6b5 100644 --- a/src/player_modifiers.c +++ b/src/player_modifiers.c @@ -1,12 +1,20 @@ #include "player_modifiers.h" #include "player.h" -void player_mod_ice(Player *player) { - player->vars.acceleration /= 4; - player->vars.friction /= 4; +void player_mod_ice(Player *player, uint8_t sides) { + if (sides & D_FLOOR) { + player->vars.acceleration /= 4; + player->vars.friction /= 4; + } } -void player_mod_glue(Player *player) { - player->vars.acceleration = 1; - player->vars.friction = 1; +void player_mod_glue(Player *player, uint8_t sides) { + if (sides & D_FLOOR) { + player->vars.acceleration = 1; + player->vars.friction = 1; + } + if (sides & (D_LEFT | D_RIGHT | D_CEIL)) { + player->vars.gravity = 0; + player->vars.acceleration = 0; + } }