diff --git a/src/alien.cpp b/src/alien.cpp index 14ac4e2..7f18683 100644 --- a/src/alien.cpp +++ b/src/alien.cpp @@ -1726,7 +1726,7 @@ void alien_move(Object *alien) { if (alien->classDef == CD_ASTEROID) { - player_damage(alien->shield); + player_damage(alien->shield, 0); alien->shield = 0; audio_playSound(SFX_EXPLOSION, alien->x, alien->y); audio_playSound(SFX_HIT, player.x, player.y); @@ -1734,7 +1734,7 @@ void alien_move(Object *alien) if (alien->classDef == CD_ASTEROID2) { - player_damage(alien->shield); + player_damage(alien->shield, 0); alien->shield = 0; audio_playSound(SFX_EXPLOSION, alien->x, alien->y); audio_playSound(SFX_HIT, player.x, player.y); @@ -1742,7 +1742,7 @@ void alien_move(Object *alien) if (alien->classDef == CD_BARRIER) { - player_damage(1); + player_damage(1, 0); audio_playSound(SFX_HIT, player.x, player.y); } } diff --git a/src/defs.h b/src/defs.h index 6fbe540..6e9e891 100644 --- a/src/defs.h +++ b/src/defs.h @@ -764,4 +764,6 @@ const int maxHoming = 20; const int maxDoubleHoming = 15; const int maxMicroHoming = 10; +const int rayDamageDelay = 10; + #endif diff --git a/src/game.cpp b/src/game.cpp index 5ff3114..4f1db55 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -784,7 +784,7 @@ static void game_doBullets() { old_shield = player.shield; - player_damage(bullet->damage); + player_damage(bullet->damage, 0); if (player.shield > 0) { @@ -2451,6 +2451,16 @@ int game_mainLoop() game_doExplosions(); game_doHud(); + // Start delaying damage again gradually + if (player_resetDamageDelay) + { + LIMIT_ADD(player_damageDelay, -1, 0, 100); + } + else + { + player_resetDamageDelay = 1; + } + WRAP_ADD(engine.eventTimer, -1, 0, 60); if (engine.paused) diff --git a/src/player.cpp b/src/player.cpp index 585f5fc..95fe52e 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -34,6 +34,8 @@ along with this program. If not, see . Object player; int player_chargerFired = 0; +int player_damageDelay = 0; +int player_resetDamageDelay = 0; /* Initialises the player for a new game. @@ -81,13 +83,26 @@ void player_setTarget(int index) engine.targetShield /= aliens[index].shield; } -void player_damage(int amount) +void player_damage(int amount, int delay) { int oldshield = player.shield; + + player_resetDamageDelay = 0; + if ((!engine.cheatShield) && (engine.missionCompleteTimer == 0) && - ((!player.hit) || (game.difficulty == DIFFICULTY_ORIGINAL))) + ((!player.hit) || + (game.difficulty == DIFFICULTY_ORIGINAL) || + ((player.shield != engine.lowShield) && + (player.shield != 1)))) { - player.shield -= amount; + if ((game.difficulty == DIFFICULTY_ORIGINAL) || + (player_damageDelay >= delay)) + { + player.shield -= amount; + } + else + player_damageDelay += amount; + LIMIT(player.shield, 0, player.maxShield); player.hit = 5; // Damage flash timer diff --git a/src/player.h b/src/player.h index 831a39a..b191d0e 100644 --- a/src/player.h +++ b/src/player.h @@ -25,10 +25,12 @@ along with this program. If not, see . extern Object player; extern int player_chargerFired; +extern int player_damageDelay; +extern int player_resetDamageDelay; void player_init(); void player_setTarget(int index); -void player_damage(int amount); +void player_damage(int amount, int delay); void player_checkShockDamage(float x, float y); void player_exit(); void player_flushInput(); diff --git a/src/ship.cpp b/src/ship.cpp index 76991c3..1d9d5f7 100644 --- a/src/ship.cpp +++ b/src/ship.cpp @@ -176,7 +176,7 @@ void ship_fireRay(Object *ship) player.image[0]->h, ray.x, ray.y, ray.w, ray.h) && (!engine.cheatShield) && (engine.missionCompleteTimer == 0)) { - player_damage(1); + player_damage(1, rayDamageDelay); explosion_add(player.x, player.y, SP_SMALL_EXPLOSION); audio_playSound(SFX_HIT, player.x, player.y);