feat(player): cabla flag players.collide_with_each_other

A `collidesWithWorld` saltem la branca actor↔actor quan el flag està
desactivat: els jugadors travessen els altres lliurement però segueixen
topant amb murs i sarcs. A `tryPushSnapBlockers` retornem early per la
mateixa raó: si no hi ha col·lisió entre jugadors, no hi ha ningú a
empentar quan el snap del corredor s'aplica.
This commit is contained in:
JailDesigner committed 2026-05-08 13:26:47 +02:00
1 parent cfbcdc236b
commit 3635cebf25
1 file changed
+9
+9
View File
@@ -22,6 +22,7 @@
#include "game/entities/entity.hpp" #include "game/entities/entity.hpp"
#include "game/entities/entity_manager.hpp" #include "game/entities/entity_manager.hpp"
#include "game/entities/event_bus.hpp" #include "game/entities/event_bus.hpp"
#include "game/gameplay_config.hpp"
#include "game/options.hpp" #include "game/options.hpp"
#include "utils/defaults.hpp" #include "utils/defaults.hpp"
@@ -414,6 +415,10 @@ auto Player::collidesWithWorld(const SDL_FRect& box) const -> bool {
// al check actor↔actor més avall via el predicat `isOutOfPlay`. // al check actor↔actor més avall via el predicat `isOutOfPlay`.
if (isOutOfPlay()) { return false; } if (isOutOfPlay()) { return false; }
if (map_.collides(box)) { return true; } if (map_.collides(box)) { return true; }
// Tweak `players.collide_with_each_other`: si està desactivat, els
// jugadors es travessen lliurement. La col·lisió contra el món
// (murs/sarcs) ja s'ha avaluat dalt; saltem només la part actor↔actor.
if (!GameplayConfig::get().playersCollide()) { return false; }
if (all_players_ == nullptr) { return false; } if (all_players_ == nullptr) { return false; }
// Per al contacte actor-actor usem la hit-box petita a banda i banda: // Per al contacte actor-actor usem la hit-box petita a banda i banda:
// projectem la hit-box des de la posició base proposada i la comparem // projectem la hit-box des de la posició base proposada i la comparem
@@ -1737,6 +1742,10 @@ auto Player::tryPushSnapBlockers(
float (Player::*get_pos)() const, float (Player::*get_pos)() const,
void (Player::*set_pos)(float)) -> bool { void (Player::*set_pos)(float)) -> bool {
if (all_players_ == nullptr) { return false; } if (all_players_ == nullptr) { return false; }
// Si el tweak de col·lisió entre jugadors està desactivat, mai hi
// ha res a empentar — els jugadors són intangibles entre si i el
// snap pot procedir lliurement sense desplaçar ningú.
if (!GameplayConfig::get().playersCollide()) { return false; }
// Blockers = jugadors que ara mateix solapen la nostra hit-box (ja // Blockers = jugadors que ara mateix solapen la nostra hit-box (ja
// amb el snap aplicat). Mateix criteri actor-actor que `collidesWithWorld`. // amb el snap aplicat). Mateix criteri actor-actor que `collidesWithWorld`.