Hurt the player. :)

This commit is contained in:
Lucas S. Vieira 2024-11-03 17:23:11 -03:00
parent 553773e04a
commit 9dbd104fbc
5 changed files with 56 additions and 6 deletions

BIN
assets/sfx/DEATH.ogg Normal file

Binary file not shown.

View file

@ -14,6 +14,7 @@
#define X_DECEL 0x00800
#define X_TOP_SPD 0x06000
#define Y_GRAVITY 0x00380
#define Y_HURT_GRAVITY 0x00300
#define Y_MIN_JUMP 0x04000
#define Y_JUMP_STRENGTH 0x06800
#define X_MIN_ROLL_SPD 0x01000
@ -28,6 +29,8 @@
#define X_MAX_SLIP_SPD 0x02800
#define X_DRPSPD 0x08000
#define X_DRPMAX 0x0c000
#define Y_HURT_FORCE 0x04000
#define X_HURT_FORCE 0x02000
// Constants for adjusting hitbox and sensors
#define WIDTH_RADIUS_NORMAL 8
@ -36,6 +39,8 @@
#define HEIGHT_RADIUS_ROLLING 14
#define PUSH_RADIUS 14
#define PLAYER_HURT_IFRAMES 120
typedef enum {
ACTION_NONE,
ACTION_SKIDDING,
@ -46,6 +51,7 @@ typedef enum {
ACTION_SPINDASH,
ACTION_DROPDASH,
ACTION_SPRING,
ACTION_HURT,
} PlayerAction;
typedef struct {
@ -68,6 +74,7 @@ typedef struct {
uint8_t airdirlock;
uint8_t framecount;
uint8_t holding_jump;
uint16_t iframes;
PlayerAction action;
@ -95,4 +102,6 @@ CharaAnim *player_get_animation_by_name(Player *player, const char *name);
void player_update(Player *player);
void player_draw(Player *player, VECTOR *screen_pos);
void player_set_hurt(Player *player, int32_t hazard_x);
#endif

View file

@ -238,6 +238,9 @@
<file name="CHEK.VAG"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/sfx/CHEK.VAG" />
<file name="DEATH.VAG"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/sfx/DEATH.VAG" />
</dir>
<dir name="BGM">

View file

@ -21,6 +21,7 @@ extern SoundEffect sfx_ring;
extern SoundEffect sfx_pop;
extern SoundEffect sfx_sprn;
extern SoundEffect sfx_chek;
extern SoundEffect sfx_death;
extern int debug_mode;
extern uint8_t level_ring_count;
@ -404,6 +405,12 @@ _spikes_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos)
if(((player_vy + 8) - solidity_vy < 16) &&
((player_vx >= solidity_vx - 4) && ((player_vx + 8) <= solidity_vx + 32 - 4)))
{
if(player.action != ACTION_HURT && player.iframes == 0) {
player_set_hurt(&player, (solidity_vx + 16) << 12);
sound_play_vag(sfx_death, 0); // TODO: SFX changes depending on situation
return;
}
player.ev_grnd1.collided = player.ev_grnd2.collided = 1;
player.ev_grnd1.angle = player.ev_grnd2.angle = 0;
player.ev_grnd1.coord = player.ev_grnd2.coord = solidity_vy;

View file

@ -40,6 +40,7 @@ SoundEffect sfx_ring = { 0 };
SoundEffect sfx_pop = { 0 };
SoundEffect sfx_sprn = { 0 };
SoundEffect sfx_chek = { 0 };
SoundEffect sfx_death = { 0 };
// TODO: Maybe shouldn't be extern?
extern TileMap16 map16;
@ -61,6 +62,7 @@ load_player(Player *player,
player->ctrllock = 0;
player->airdirlock = 0;
player->framecount = 0;
player->iframes = 0;
player_set_animation_direct(player, ANIM_STOPPED);
player->anim_frame = player->anim_timer = 0;
@ -87,6 +89,7 @@ load_player(Player *player,
if(sfx_pop.addr == 0) sfx_pop = sound_load_vag("\\SFX\\POP.VAG;1");
if(sfx_sprn.addr == 0) sfx_sprn = sound_load_vag("\\SFX\\SPRN.VAG;1");
if(sfx_chek.addr == 0) sfx_chek = sound_load_vag("\\SFX\\CHEK.VAG;1");
if(sfx_death.addr == 0) sfx_death = sound_load_vag("\\SFX\\DEATH.VAG;1");
}
void
@ -314,7 +317,12 @@ _player_update_collision_tb(Player *player)
if(player->action == ACTION_JUMPING
|| player->action == ACTION_ROLLING
|| player->action == ACTION_SPRING) {
|| player->action == ACTION_SPRING
|| player->action == ACTION_HURT) {
if(player->action == ACTION_HURT) {
player->iframes = PLAYER_HURT_IFRAMES;
player->ctrllock = 0;
}
player->action = ACTION_NONE;
player->airdirlock = 0;
}
@ -390,10 +398,15 @@ player_update(Player *player)
{
_player_update_collision_lr(player);
// Iframes
if(player->iframes > 0) player->iframes--;
// X movement
/* Ground movement */
if(player->grnd) {
if(player->ctrllock > 0) player->ctrllock--;
if(player->ctrllock > 0) {
player->ctrllock--;
}
if(player->action == ACTION_ROLLING) {
// Rolling physics.
@ -502,12 +515,12 @@ player_update(Player *player)
player->vel.vy = (player->vel.vz * -rsin(player->angle)) >> 12;
} else {
// Air X movement
if(pad_pressing(PAD_RIGHT)) {
if(pad_pressing(PAD_RIGHT) && (player->ctrllock == 0)) {
if(player->vel.vx < X_TOP_SPD)
player->vel.vx += X_AIR_ACCEL;
if(!player->airdirlock)
player->anim_dir = 1;
} else if(pad_pressing(PAD_LEFT)) {
} else if(pad_pressing(PAD_LEFT) && (player->ctrllock == 0)) {
if(player->vel.vx > -X_TOP_SPD)
player->vel.vx -= X_AIR_ACCEL;
if(!player->airdirlock)
@ -551,7 +564,9 @@ player_update(Player *player)
}
}
}
player->vel.vy += Y_GRAVITY;
player->vel.vy += (player->action == ACTION_HURT)
? Y_HURT_GRAVITY
: Y_GRAVITY;
} else {
if(pad_pressed(PAD_CROSS) && player->action != ACTION_SPINDASH) {
player->vel.vx -= (Y_JUMP_STRENGTH * rsin(player->angle)) >> 12;
@ -621,6 +636,8 @@ player_update(Player *player)
player_set_animation_direct(player, ANIM_RUNNING);
} else player_set_animation_direct(player, ANIM_WALKING);
}
} else if(player->action == ACTION_HURT) {
player_set_animation_direct(player, ANIM_HURT);
}
}
@ -680,15 +697,29 @@ player_update(Player *player)
player->ev_grnd2 = (CollisionEvent){ 0 };
player->ev_ceil1 = (CollisionEvent){ 0 };
player->ev_ceil2 = (CollisionEvent){ 0 };
}
void
player_draw(Player *player, VECTOR *pos)
{
if(player->cur_anim)
// if iframes, do not show for every 4 frames
if(player->cur_anim && ((player->iframes >> 2) % 2) == 0)
chara_render_frame(&player->chara,
player->anim_frame,
(int16_t)(pos->vx >> 12),
(int16_t)(pos->vy >> 12) - 8,
player->anim_dir < 0);
}
void
player_set_hurt(Player *player, int32_t hazard_x)
{
player->action = ACTION_HURT;
player->grnd = 0;
player->vel.vy = -Y_HURT_FORCE;
int32_t a = SIGNUM(player->pos.vx - hazard_x);
player->vel.vx = X_HURT_FORCE * ((a == 0) ? 1 : a);
player->ctrllock = 2;
}