Skip to content

Commit af3b9d4

Browse files
Fix Tux being permanently safe after mix of using door and scripting 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
1 parent 53af7b2 commit af3b9d4

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

src/object/player.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ Player::Player(PlayerStatus& player_status, const std::string& name_, int player
209209
m_does_buttjump(false),
210210
m_invincible_timer(),
211211
m_skidding_timer(),
212-
m_safe_timer(),
212+
m_post_damage_safety_timer(),
213+
m_temp_safety_timer(),
213214
m_is_intentionally_safe(false),
214215
m_kick_timer(),
215216
m_buttjump_timer(),
@@ -2256,7 +2257,7 @@ Player::draw(DrawingContext& context)
22562257
Vector draw_pos = get_pos() + context.get_time_offset() * m_physic.get_velocity();
22572258

22582259
/* Draw Tux */
2259-
if (!m_visible || (m_safe_timer.started() && !m_is_intentionally_safe && size_t(g_game_time * 40) % 2))
2260+
if (!m_visible || (m_post_damage_safety_timer.started() && size_t(g_game_time * 40) % 2))
22602261
{
22612262
} // don't draw Tux
22622263

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

23882389
auto badguy = dynamic_cast<BadGuy*> (&other);
23892390
if (badguy != nullptr) {
2390-
if (m_is_intentionally_safe || m_safe_timer.started() || m_invincible_timer.started())
2391+
if (m_is_intentionally_safe || m_post_damage_safety_timer.started() || m_temp_safety_timer.started() || m_invincible_timer.started())
23912392
return FORCE_MOVE;
23922393
if (m_stone)
23932394
return ABORT_MOVE;
@@ -2423,8 +2424,7 @@ Player::make_invincible()
24232424
void
24242425
Player::make_temporarily_safe(float safe_time)
24252426
{
2426-
m_safe_timer.start(safe_time);
2427-
m_is_intentionally_safe = true;
2427+
m_temp_safety_timer.start(safe_time);
24282428
}
24292429

24302430
void
@@ -2433,7 +2433,7 @@ Player::kill(bool completely)
24332433
if (m_dying || m_deactivated || is_winning() )
24342434
return;
24352435

2436-
if (!completely && (m_is_intentionally_safe || m_safe_timer.started() || m_invincible_timer.started()))
2436+
if (!completely && (m_is_intentionally_safe || m_post_damage_safety_timer.started() || m_temp_safety_timer.started() || m_invincible_timer.started()))
24372437
return;
24382438

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

24522452
if (get_bonus() > BONUS_GROWUP)
24532453
{
2454-
m_safe_timer.start(TUX_SAFE_TIME);
2455-
m_is_intentionally_safe = false;
2454+
m_post_damage_safety_timer.start(TUX_SAFE_TIME);
24562455
set_bonus(BONUS_GROWUP, true);
24572456
}
24582457
else if (get_bonus() == BONUS_GROWUP)
24592458
{
2460-
m_safe_timer.start(TUX_SAFE_TIME /* + GROWING_TIME */);
2461-
m_is_intentionally_safe = false;
2459+
m_post_damage_safety_timer.start(TUX_SAFE_TIME /* + GROWING_TIME */);
24622460
m_duck = false;
24632461
m_crawl = false;
24642462
stop_backflipping();
@@ -2477,7 +2475,8 @@ Player::kill(bool completely)
24772475

24782476
m_physic.enable_gravity(true);
24792477
m_physic.set_gravity_modifier(1.0f); // Undo jump_early_apex
2480-
m_safe_timer.stop();
2478+
m_post_damage_safety_timer.stop();
2479+
m_temp_safety_timer.stop();
24812480
m_invincible_timer.stop();
24822481
m_physic.set_acceleration(0, 0);
24832482
m_physic.set_velocity(0, -700);
@@ -2571,7 +2570,7 @@ Player::check_bounds()
25712570
/* fallen out of the level? */
25722571
if ((get_pos().y > Sector::get().get_height())
25732572
&& !m_ghost_mode
2574-
&& !(m_is_intentionally_safe && m_safe_timer.started())) {
2573+
&& !m_temp_safety_timer.started()) {
25752574
kill(true);
25762575
return;
25772576
}
@@ -2983,7 +2982,8 @@ Player::multiplayer_prepare_spawn()
29832982
{
29842983
m_physic.enable_gravity(true);
29852984
m_physic.set_gravity_modifier(1.0f); // Undo jump_early_apex
2986-
m_safe_timer.stop();
2985+
m_post_damage_safety_timer.stop();
2986+
m_temp_safety_timer.stop();
29872987
m_invincible_timer.stop();
29882988
m_physic.set_acceleration(0, -9999);
29892989
m_physic.set_velocity(0, -9999);

src/object/player.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,8 @@ class Player final : public MovingObject
568568

569569
private:
570570
Timer m_skidding_timer;
571-
Timer m_safe_timer;
571+
Timer m_post_damage_safety_timer;
572+
Timer m_temp_safety_timer;
572573

573574
/**
574575
* @scripting

0 commit comments

Comments
 (0)