Skip to content

Commit

Permalink
Fix Tux being permanently safe after mix of using door and scripting …
Browse files Browse the repository at this point in the history
…Tux safe (#3187)

* Use a separate timer for temporary safety instead of reusing
m_is_intentionally_safe
* Split timers for post damage safety and temporary safety

Fixes #3186
  • Loading branch information
Brockengespenst authored Feb 2, 2025
1 parent 53af7b2 commit af3b9d4
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 14 deletions.
26 changes: 13 additions & 13 deletions src/object/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,8 @@ Player::Player(PlayerStatus& player_status, const std::string& name_, int player
m_does_buttjump(false),
m_invincible_timer(),
m_skidding_timer(),
m_safe_timer(),
m_post_damage_safety_timer(),
m_temp_safety_timer(),
m_is_intentionally_safe(false),
m_kick_timer(),
m_buttjump_timer(),
Expand Down Expand Up @@ -2256,7 +2257,7 @@ Player::draw(DrawingContext& context)
Vector draw_pos = get_pos() + context.get_time_offset() * m_physic.get_velocity();

/* Draw Tux */
if (!m_visible || (m_safe_timer.started() && !m_is_intentionally_safe && size_t(g_game_time * 40) % 2))
if (!m_visible || (m_post_damage_safety_timer.started() && size_t(g_game_time * 40) % 2))
{
} // don't draw Tux

Expand Down Expand Up @@ -2387,7 +2388,7 @@ Player::collision(MovingObject& other, const CollisionHit& hit)

auto badguy = dynamic_cast<BadGuy*> (&other);
if (badguy != nullptr) {
if (m_is_intentionally_safe || m_safe_timer.started() || m_invincible_timer.started())
if (m_is_intentionally_safe || m_post_damage_safety_timer.started() || m_temp_safety_timer.started() || m_invincible_timer.started())
return FORCE_MOVE;
if (m_stone)
return ABORT_MOVE;
Expand Down Expand Up @@ -2423,8 +2424,7 @@ Player::make_invincible()
void
Player::make_temporarily_safe(float safe_time)
{
m_safe_timer.start(safe_time);
m_is_intentionally_safe = true;
m_temp_safety_timer.start(safe_time);
}

void
Expand All @@ -2433,7 +2433,7 @@ Player::kill(bool completely)
if (m_dying || m_deactivated || is_winning() )
return;

if (!completely && (m_is_intentionally_safe || m_safe_timer.started() || m_invincible_timer.started()))
if (!completely && (m_is_intentionally_safe || m_post_damage_safety_timer.started() || m_temp_safety_timer.started() || m_invincible_timer.started()))
return;

m_growing = false;
Expand All @@ -2451,14 +2451,12 @@ Player::kill(bool completely)

if (get_bonus() > BONUS_GROWUP)
{
m_safe_timer.start(TUX_SAFE_TIME);
m_is_intentionally_safe = false;
m_post_damage_safety_timer.start(TUX_SAFE_TIME);
set_bonus(BONUS_GROWUP, true);
}
else if (get_bonus() == BONUS_GROWUP)
{
m_safe_timer.start(TUX_SAFE_TIME /* + GROWING_TIME */);
m_is_intentionally_safe = false;
m_post_damage_safety_timer.start(TUX_SAFE_TIME /* + GROWING_TIME */);
m_duck = false;
m_crawl = false;
stop_backflipping();
Expand All @@ -2477,7 +2475,8 @@ Player::kill(bool completely)

m_physic.enable_gravity(true);
m_physic.set_gravity_modifier(1.0f); // Undo jump_early_apex
m_safe_timer.stop();
m_post_damage_safety_timer.stop();
m_temp_safety_timer.stop();
m_invincible_timer.stop();
m_physic.set_acceleration(0, 0);
m_physic.set_velocity(0, -700);
Expand Down Expand Up @@ -2571,7 +2570,7 @@ Player::check_bounds()
/* fallen out of the level? */
if ((get_pos().y > Sector::get().get_height())
&& !m_ghost_mode
&& !(m_is_intentionally_safe && m_safe_timer.started())) {
&& !m_temp_safety_timer.started()) {
kill(true);
return;
}
Expand Down Expand Up @@ -2983,7 +2982,8 @@ Player::multiplayer_prepare_spawn()
{
m_physic.enable_gravity(true);
m_physic.set_gravity_modifier(1.0f); // Undo jump_early_apex
m_safe_timer.stop();
m_post_damage_safety_timer.stop();
m_temp_safety_timer.stop();
m_invincible_timer.stop();
m_physic.set_acceleration(0, -9999);
m_physic.set_velocity(0, -9999);
Expand Down
3 changes: 2 additions & 1 deletion src/object/player.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -568,7 +568,8 @@ class Player final : public MovingObject

private:
Timer m_skidding_timer;
Timer m_safe_timer;
Timer m_post_damage_safety_timer;
Timer m_temp_safety_timer;

/**
* @scripting
Expand Down

0 comments on commit af3b9d4

Please sign in to comment.