mirror of
https://github.com/luksamuk/engine-psx.git
synced 2025-04-28 13:28:02 +03:00
Hurt the player. :)
This commit is contained in:
parent
553773e04a
commit
9dbd104fbc
5 changed files with 56 additions and 6 deletions
BIN
assets/sfx/DEATH.ogg
Normal file
BIN
assets/sfx/DEATH.ogg
Normal file
Binary file not shown.
|
@ -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
|
||||
|
|
3
iso.xml
3
iso.xml
|
@ -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">
|
||||
|
|
|
@ -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;
|
||||
|
|
43
src/player.c
43
src/player.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue