|
| | MechanismController (const Level &level) |
| | Construit le contrôleur depuis level : portes fermées (solides) au départ.
|
| void | update (const Aabb &playerBox, float playerMass=1.0f, bool interactPressed=false, const std::vector< TriggerWeight > &weights={}) |
| | Met à jour les mécanismes pour un pas : bascule les interrupteurs touchés (front), ouvre/referme les plaques de pression selon le poids présent, ramasse les clés touchées avec « Interagir », applique l'état des portes/portes verrouillées dans la grille de collision.
|
| bool | crushedPlayer () const noexcept |
| | Une porte s'est-elle refermée sur le personnage au dernier update (EX-GP-021, LOT-65 TACHE-06) ?
|
| const TileMap & | collisionMap () const noexcept |
| const std::vector< Mechanism > & | mechanisms () const noexcept |
| bool | isDoorOpen (std::size_t index) const |
| bool | isContinuous (std::size_t index) const |
| bool | isKey (std::size_t index) const |
|
| TileMap | _collision |
| | Copie mutable : portes Solid (fermées) / Door (ouvertes).
|
| std::vector< Mechanism > | _mechanisms |
| | Liaisons déclencheur↔porte (positions).
|
| std::vector< bool > | _switchOn |
| | État de chaque déclencheur (porte ouverte ?).
|
| std::vector< bool > | _playerOnSwitchPrev |
| | Le personnage était-il sur le déclencheur au pas précédent ?
|
| std::vector< bool > | _continuous |
| | true = plaque de pression (activation continue), figé au chargement ; false = interrupteur à bascule classique.
|
| std::vector< bool > | _isKey |
| | true = déclencheur TileType::Key (ramassage par Interagir, ouverture définitive), figé au chargement comme _continuous.
|
| std::vector< TileType > | _openType |
| | Type de tuile « porte ouverte » de chaque mécanisme (Door ou LockedDoor), capturé avant que le constructeur ne fige la case en Solid — la grille de collision y revient quand le mécanisme s'active.
|
| bool | _crushedPlayer = false |
| | Une porte s'est refermée sur le personnage au dernier pas.
|
Fait vivre les mécanismes interrupteur/plaque ↔ porte d'un niveau (EX-GP-020, EX-GP-021, EX-GP-025).
Logique pure (aucun rendu ni fenêtre). Deux comportements de déclencheur, selon la tuile d'origine (figée au chargement) :
- Interrupteur (TileType::Switch) : quand la boîte du personnage recouvre la case au front (première frame de contact), l'état de la porte liée bascule et persiste.
- Plaque de pression (TileType::PressurePlate, EX-GP-025) : la porte reste ouverte tant qu'un poids suffisant y repose (comparé à MIN_TRIGGER_MASS), et se referme dès que ce n'est plus le cas — activation continue, pas de front. Ce poids peut être celui du personnage ou celui d'un bloc poussable (core::TriggerWeight, EX-GP-022) : c'est ce qui rend possible de poser un poids et de repartir, la porte restant ouverte derrière soi.
Une porte fermée est solide (bloque), ouverte est franchissable. Le contrôleur maintient une copie mutable du TileMap (grille de collision) que la physique consomme, laissant la carte du Level intacte (source de vérité). Déterministe au pas fixe (EX-NFR-002).
Clé/porte verrouillée (TileType::Key/TileType::LockedDoor, EX-GP-023) : troisième comportement de déclencheur, résolu depuis la même liste mechanisms() que interrupteur/plaque↔porte (LevelLoader les y ajoute toutes deux, aucune notion de liaison dupliquée). Une clé se ramasse au contact et à l'action « Interagir » (core::PlayerInput::interactPressed, EX-CTRL-022 — son premier usage) ; le contact seul ne suffit pas, à la différence de l'interrupteur. Une fois ramassée, la porte liée s'ouvre définitivement : contrairement à l'interrupteur, l'état ne bascule plus jamais en arrière.