forked from kdx/jtmm2-old
Modifiers are now "side dependent". Only implemented for floor.
This commit is contained in:
parent
7bce93d092
commit
0ec3cb12f8
|
@ -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
|
||||
|
|
32
src/player.c
32
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue