Skip to content

Commit

Permalink
Fix smart badguy might_fall behaviour (SuperTux#2683)
Browse files Browse the repository at this point in the history
Co-authored-by: Aiden Isik <[email protected]>
  • Loading branch information
AidenIsik and Aiden Isik authored Nov 25, 2023
1 parent 4f25f0a commit 9b05a8f
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/badguy/badguy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,9 @@ BadGuy::might_fall(int height) const
x1 = m_col.m_bbox.get_right();
x2 = m_col.m_bbox.get_right() + 1;
}
return Sector::get().is_free_of_statics(Rectf(x1, y1, x2, y2));
const Rectf rect = Rectf(x1, y1, x2, y2);

return Sector::get().is_free_of_statics(rect) && Sector::get().is_free_of_specifically_movingstatics(rect);
}

Player*
Expand Down
16 changes: 16 additions & 0 deletions src/collision/collision_system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,22 @@ CollisionSystem::is_free_of_movingstatics(const Rectf& rect, const CollisionObje
return true;
}

bool
CollisionSystem::is_free_of_specifically_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const
{
using namespace collision;

for (const auto& object : m_objects) {
if (object == ignore_object) continue;
if (!object->is_valid()) continue;
if ((object->get_group() == COLGROUP_MOVING_STATIC)
&& (intersects(rect, object->get_bbox())))
return false;
}

return true;
}

CollisionSystem::RaycastResult
CollisionSystem::get_first_line_intersection(const Vector& line_start,
const Vector& line_end,
Expand Down
1 change: 1 addition & 0 deletions src/collision/collision_system.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class CollisionSystem final
bool is_free_of_tiles(const Rectf& rect, const bool ignoreUnisolid = false, uint32_t tiletype = Tile::SOLID) const;
bool is_free_of_statics(const Rectf& rect, const CollisionObject* ignore_object, const bool ignoreUnisolid) const;
bool is_free_of_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const;
bool is_free_of_specifically_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const;


RaycastResult get_first_line_intersection(const Vector& line_start,
Expand Down
7 changes: 7 additions & 0 deletions src/supertux/sector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,13 @@ Sector::is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_o
ignore_object ? ignore_object->get_collision_object() : nullptr);
}

bool
Sector::is_free_of_specifically_movingstatics(const Rectf& rect, const MovingObject* ignore_object) const
{
return m_collision_system->is_free_of_specifically_movingstatics(rect,
ignore_object ? ignore_object->get_collision_object() : nullptr);
}

CollisionSystem::RaycastResult
Sector::get_first_line_intersection(const Vector& line_start,
const Vector& line_end,
Expand Down
4 changes: 4 additions & 0 deletions src/supertux/sector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ class Sector final : public Base::Sector
This includes badguys and players. */
bool is_free_of_movingstatics(const Rectf& rect, const MovingObject* ignore_object = nullptr) const;

/** Checks if the specified rectangle is free of MovingObjects in COLGROUP_MOVINGSTATIC.
Note that this does not include moving badguys, or players */
bool is_free_of_specifically_movingstatics(const Rectf& rect, const MovingObject* ignore_object = nullptr) const;

CollisionSystem::RaycastResult get_first_line_intersection(const Vector& line_start,
const Vector& line_end,
bool ignore_objects,
Expand Down

0 comments on commit 9b05a8f

Please sign in to comment.