/** * @file utils/walk_path_speech.hpp * * Walk-path helpers, PosOk variants, and BFS pathfinding for accessibility speech. */ #pragma once #include #include #include #include #include "engine/displacement.hpp" #include "engine/point.hpp" namespace devilution { struct Player; // Walk direction helpers Point NextPositionForWalkDirection(Point position, int8_t walkDir); Point PositionAfterWalkPathSteps(Point start, const int8_t *path, int steps); int8_t OppositeWalkDirection(int8_t walkDir); // PosOk variants for pathfinding bool PosOkPlayerIgnoreDoors(const Player &player, Point position); bool IsTileWalkableForTrackerPath(Point position, bool ignoreDoors, bool ignoreBreakables); bool PosOkPlayerIgnoreMonsters(const Player &player, Point position); bool PosOkPlayerIgnoreDoorsAndMonsters(const Player &player, Point position); bool PosOkPlayerIgnoreDoorsMonstersAndBreakables(const Player &player, Point position); // BFS pathfinding for speech std::optional> FindKeyboardWalkPathForSpeech(const Player &player, Point startPosition, Point destinationPosition, bool allowDestinationNonWalkable = false); std::optional> FindKeyboardWalkPathForSpeechRespectingDoors(const Player &player, Point startPosition, Point destinationPosition, bool allowDestinationNonWalkable = false); std::optional> FindKeyboardWalkPathForSpeechIgnoringMonsters(const Player &player, Point startPosition, Point destinationPosition, bool allowDestinationNonWalkable = false); std::optional> FindKeyboardWalkPathForSpeechRespectingDoorsIgnoringMonsters(const Player &player, Point startPosition, Point destinationPosition, bool allowDestinationNonWalkable = false); std::optional> FindKeyboardWalkPathForSpeechLenient(const Player &player, Point startPosition, Point destinationPosition, bool allowDestinationNonWalkable = false); std::optional> FindKeyboardWalkPathToClosestReachableForSpeech(const Player &player, Point startPosition, Point destinationPosition, Point &closestPosition); // Speech formatting void AppendKeyboardWalkPathForSpeech(std::string &message, const std::vector &path); void AppendDirectionalFallback(std::string &message, const Displacement &delta); } // namespace devilution