Skip to content

Commit a42ea46

Browse files
Fix issues with unisolid tiles and frozen enemies (#2933)
* Do not let unisolid tiles prevent Tux from stand up * Consider Tux being on ground if standing on frozen enemy * Do not change direction of bouncing snowballs due to unisolid tile * Change PushButton collision goup to static * Do not change vicious ivy's floating animation when passing a unisolid from below
1 parent 76ea201 commit a42ea46

File tree

8 files changed

+17
-10
lines changed

8 files changed

+17
-10
lines changed

src/badguy/bouncing_snowball.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ BouncingSnowball::active_update(float dt_sec)
8282
Rectf side_look_box = get_bbox().grown(-1.f);
8383
side_look_box.set_left(get_bbox().get_left() + (m_dir == Direction::LEFT ? -1.f : 1.f));
8484
side_look_box.set_right(get_bbox().get_right() + (m_dir == Direction::LEFT ? -1.f : 1.f));
85-
if (!Sector::get().is_free_of_statics(side_look_box))
85+
if (!Sector::get().is_free_of_statics(side_look_box, nullptr, true))
8686
{
8787
m_dir = m_dir == Direction::LEFT ? Direction::RIGHT : Direction::LEFT;
8888
set_action(m_dir);

src/badguy/viciousivy.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ ViciousIvy::active_update(float dt_sec)
9292
{
9393
Rectf floatbox = get_bbox();
9494
floatbox.set_bottom(get_bbox().get_bottom() + 8.f);
95-
bool float_here = (Sector::get().is_free_of_statics(floatbox));
95+
96+
const bool ignore_unisolid = m_physic.get_velocity_y() < 0.0f;
97+
bool float_here = (Sector::get().is_free_of_statics(floatbox, nullptr, ignore_unisolid));
9698

9799
bool in_water = !Sector::get().is_free_of_tiles(get_bbox(), true, Tile::WATER);
98100

src/collision/collision_system.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,11 +726,11 @@ CollisionSystem::is_free_of_statics(const Rectf& rect, const CollisionObject* ig
726726
}
727727

728728
bool
729-
CollisionSystem::is_free_of_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const
729+
CollisionSystem::is_free_of_movingstatics(const Rectf& rect, const CollisionObject* ignore_object, const bool ignore_unisolid) const
730730
{
731731
using namespace collision;
732732

733-
if (!is_free_of_tiles(rect)) return false;
733+
if (!is_free_of_tiles(rect, ignore_unisolid)) return false;
734734

735735
for (const auto& object : m_objects) {
736736
if (object == ignore_object) continue;

src/collision/collision_system.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class CollisionSystem final
6464

6565
bool is_free_of_tiles(const Rectf& rect, const bool ignoreUnisolid = false, uint32_t tiletype = Tile::SOLID) const;
6666
bool is_free_of_statics(const Rectf& rect, const CollisionObject* ignore_object, const bool ignoreUnisolid, uint32_t tiletype = Tile::SOLID) const;
67-
bool is_free_of_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const;
67+
bool is_free_of_movingstatics(const Rectf& rect, const CollisionObject* ignore_object, const bool ignore_unisolid = false) const;
6868
bool is_free_of_specifically_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const;
6969

7070
enum RaycastIgnore {

src/object/player.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1353,7 +1353,7 @@ Player::do_standup(bool force_standup)
13531353
float new_height = m_swimming ? TUX_WIDTH : BIG_TUX_HEIGHT;
13541354
new_bbox.move(Vector(0, m_col.m_bbox.get_height() - new_height));
13551355
new_bbox.set_height(new_height);
1356-
if (!Sector::get().is_free_of_movingstatics(new_bbox, this) && !force_standup)
1356+
if (!Sector::get().is_free_of_movingstatics(new_bbox, this, true) && !force_standup)
13571357
{
13581358
m_crawl = true;
13591359
return;
@@ -2392,6 +2392,9 @@ Player::collision(MovingObject& other, const CollisionHit& hit)
23922392
return FORCE_MOVE;
23932393
if (m_stone)
23942394
return ABORT_MOVE;
2395+
2396+
if (hit.bottom && badguy->is_frozen())
2397+
m_on_ground_flag = true;
23952398
}
23962399

23972400
return CONTINUE;

src/object/pushbutton.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const std::string BUTTON_SOUND = "sounds/switch.ogg";
3131
}
3232

3333
PushButton::PushButton(const ReaderMapping& mapping) :
34-
StickyObject(mapping, "images/objects/pushbutton/pushbutton.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_MOVING),
34+
StickyObject(mapping, "images/objects/pushbutton/pushbutton.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_STATIC),
3535
m_script(),
3636
m_state(OFF),
3737
m_dir(Direction::UP)

src/supertux/sector.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,11 @@ Sector::is_free_of_statics(float left, float top, float right, float bottom,
551551
}
552552

553553
bool
554-
Sector::is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_object) const
554+
Sector::is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_object, bool ignore_unisolid) const
555555
{
556556
return m_collision_system->is_free_of_movingstatics(rect,
557-
ignore_object ? ignore_object->get_collision_object() : nullptr);
557+
ignore_object ? ignore_object->get_collision_object() : nullptr,
558+
ignore_unisolid);
558559
}
559560

560561
bool

src/supertux/sector.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ class Sector final : public Base::Sector
149149
1.) solid tiles and
150150
2.) MovingObjects in COLGROUP_STATIC, COLGROUP_MOVINGSTATIC or COLGROUP_MOVING.
151151
This includes badguys and players. */
152-
bool is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_object = nullptr) const;
152+
bool is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_object = nullptr,
153+
bool ignore_unisolid = false) const;
153154
/**
154155
* @scripting
155156
* @description Checks if the specified sector-relative rectangle is free of both:

0 commit comments

Comments
 (0)