Fix downward dash not damaging enemies and add post-dash invincibility
Some checks failed
CI / build (pull_request) Successful in 32s
Deploy / deploy (push) Failing after 1m17s

Stomping was guarded by the invincibility check, so during a downward
dash the player could never deal stomp damage. Move the invincibility
guard to only protect against taking damage, not dealing it.

Extend dash invincibility by PLAYER_DASH_INV_GRACE (0.15s) past the
dash duration so the player is briefly protected after landing.

Closes #15
This commit was merged in pull request #26.
This commit is contained in:
2026-03-16 20:10:04 +00:00
committed by tas
parent 59f76d6aa7
commit 66a7b9e7e6
3 changed files with 5 additions and 5 deletions

View File

@@ -306,8 +306,7 @@ static void handle_collisions(EntityManager *em) {
}
/* ── Enemy contact damage to player ──── */
if (player && !(player->flags & ENTITY_INVINCIBLE) &&
entity_is_enemy(a) && !(a->flags & ENTITY_DEAD)) {
if (player && entity_is_enemy(a) && !(a->flags & ENTITY_DEAD)) {
if (physics_overlap(&a->body, &player->body)) {
/* Check if player is stomping (falling onto enemy from above) */
bool stomping = (player->body.vel.y > 0) &&
@@ -319,7 +318,7 @@ static void handle_collisions(EntityManager *em) {
damage_entity(a, 2);
if (a->flags & ENTITY_DEAD) stats_record_kill();
player->body.vel.y = -PLAYER_JUMP_FORCE * 0.7f;
} else {
} else if (!(player->flags & ENTITY_INVINCIBLE)) {
/* Charger deals extra damage and knockback while charging */
int dmg = a->damage;
if (a->type == ENT_ENEMY_CHARGER) {

View File

@@ -308,8 +308,8 @@ void player_update(Entity *self, float dt, const Tilemap *map) {
pd->dash_timer = PLAYER_DASH_DURATION;
pd->dash_dir = vec2(0.0f, 1.0f);
/* Brief invincibility during dash */
pd->inv_timer = PLAYER_DASH_DURATION;
/* Invincibility during dash + short grace period after */
pd->inv_timer = PLAYER_DASH_DURATION + PLAYER_DASH_INV_GRACE;
self->flags |= ENTITY_INVINCIBLE;
/* Jetpack burst downward */

View File

@@ -39,6 +39,7 @@
/* Invincibility after taking damage */
#define PLAYER_INV_TIME 1.5f /* seconds of invincibility */
#define PLAYER_DASH_INV_GRACE 0.15f /* extra invincibility after dash */
/* Aim direction (for shooting) */
typedef enum AimDir {