С точки зрения реального мира: если вы направлялись из А в В и обнаружили на своем пути дверь D, которая была заперта, вы бы поняли, что должны найти ключ D. Поэтому, если ваш ИИ так же неосведомлен, как и типичный человек. , это будет включать поиск ключа, который представляет собой набор крошечных шагов поиска пути сам по себе. С другой стороны, вы, возможно, хотите, чтобы ваш AI знать, даже прежде, чем попытаться путем, что есть запертая дверь на этом маршрут, и в этом случае он, вероятно, также знает, где найти ключ.
В любом случае, проблема заключается в возможности подключения на двух уровнях. На уровне «на земле» вы знаете, что вы всегда можете безопасно передвигаться в пределах одной неделимой зоны ... то есть без запертых дверей, то есть. Здесь вы можете свободно использовать текущую реализацию поиска пути A *. (В упрощенном примере вы можете видеть зону как отдельную комнату. Вы не можете попасть в любую другую комнату, не открыв дверь. В действительности это может быть целый регион вашего подземелья.) Это основа вашей движение сущностей, но это немного похоже на ходьбу с опущенными глазами, вместо того, чтобы сначала осмотреть область вокруг себя - вы, вероятно, попадете в фонарный столб. Или в этом случае запертая дверь. Таким образом, ваши карты уровня земли, на которых работает ваш A *, должны ограничивать движение игрока только в пределах текущей зоны.
Далее, есть карта более высокого уровня, которая более топологическая, чем топографическая по своей природе. На самом деле он не заботится о деталях препятствий на земле и так далее, он только заботится о связи между зонами. Эта топологическая карта содержит связи между четными зонами, в которых в настоящее время между ними есть запертая дверь, поскольку она показывает идеальное соединение всех зон в вашем подземелье. По краям - каждая представляет дверь между зонами - в ней хранится ключ, который еще нужен, если он есть, чтобы открыть эту дверь, иначе он считается открытым. Таким образом, при поиске на этом графике кратчайшего пути он должен ограничивать этот найденный путь только теми маршрутами, которые уже открыты , проверяя данные по краям в процессе поиска. Связность здесь не подразумевает открытости, скорее, она подразумевает потенциальную открытость.
Если вы хотите перейти к точке, которая попадает в отдельную зону, вы сначала ищете карту более высокого уровня, чтобы найти путь. (На этом уровне можно использовать * или любой другой алгоритм кратчайшего пути.) Как только вы найдете путь, карта более высокого уровня также должна предоставить информацию о том, какую дверь вам нужно использовать, чтобы попасть из вашей текущей зоны в другую зону. Теперь в локальной зоне вы можете использовать AI на уровне земли, чтобы перейти к этой двери. Как только дверь достигнута, ваш персонаж может пройти через эту дверь / портал. Теперь он находится в зоне B. Если это целевая зона, он может использовать навигацию на уровне земли, чтобы перейти к клавише. Если это не так, то вам нужно повторять первый шаг, пока не достигнете целевой зоны.
Существует вероятность того, что разыскиваемый ключ сам находится за запертой дверью ... и что ключ от этой двери также ... и так далее до тошноты. По сути, это проблема разрешения зависимостей, и есть несколько способов решения этой проблемы, одним из которых является сеть Петри. Смотрите эту отличную статью.
PS. Если вы создаете свое подземелье процедурно, то при этом вы можете хранить информацию об упорядочении зависимостей при условии, что вы уже знаете начальную позицию игрока.