Da un punto di vista del mondo reale: se tu fossi diretto da A a B e hai trovato una porta D sulla tua strada che era chiusa a chiave, ti renderesti conto che devi trovare la chiave D. Quindi se la tua IA è inconsapevole come il tipico essere umano è , ciò implicherebbe lo scouting della chiave, che è un insieme di minuscoli passi di esplorazione in sé e per sé. D'altra parte potresti desiderare che la tua IA sappia, prima ancora di tentare un percorso, che ci sia una porta chiusa su quel percorso, e in quel caso probabilmente saprà anche dove trovare la chiave.
In entrambi i casi, il problema riguarda la connettività a due livelli. A livello "sul campo", sai che puoi sempre muoverti in sicurezza all'interno di una zona indivisa ... indivisa da porte chiuse, cioè. È qui che puoi usare liberamente la tua attuale implementazione di pathfinding A *. (In un esempio semplicistico, potresti vedere una zona come una stanza singola. Non puoi accedere a nessun'altra stanza senza aprire una porta. In realtà, potrebbe essere un'intera regione del tuo sotterraneo.) Questa è la base del tuo movimento delle entità, ma è un po 'come camminare con gli occhi bassi, invece di sorvegliare l'area intorno a te per primo - è probabile che passi in un lampione. O in questo caso, una porta chiusa a chiave. Quindi le tue mappe a livello del suolo su cui corre A * devono limitare il giocatore al movimento solo all'interno della zona corrente.
Successivamente, c'è una mappa di livello superiore, che è più topologica che di natura topografica. Non si preoccupa davvero dei dettagli sul terreno degli ostacoli e così via, si preoccupa solo della connettività tra le zone. Questa mappa topologica contiene connessioni tra le zone pari che attualmente hanno una porta chiusa tra loro, poiché mostra la connettività ideale di tutte le zone del sotterraneo. Nei suoi bordi - ognuno dei quali rappresenta una porta tra le zone - memorizza quale chiave è ancora necessaria, se presente, per aprire quella porta, altrimenti è considerata aperta. Quindi, cercando questo grafico per il percorso più breve, dovrebbe limitare quel percorso trovato solo ai percorsi che sono già aperti , controllando i dati nei bordi durante l'esecuzione della ricerca. La connettività qui non implica apertura, piuttosto implica potenziale apertura.
Quando vuoi spostarti in un punto che rientra in una zona separata, devi prima cercare nella mappa di livello superiore per trovare un percorso. (A * o qualsiasi altro algoritmo di percorso più breve può essere utilizzato a questo livello.) Una volta trovato un percorso, quella mappa di livello superiore dovrebbe anche fornire informazioni su quale porta è necessario utilizzare per passare dalla zona corrente all'altra zona. Ora, nella zona locale, puoi eseguire l'intelligenza artificiale a livello del suolo per raggiungere quella porta. Una volta raggiunta la porta, il tuo personaggio può passare attraverso quella porta / portale. Ora è nella zona B. Se questa è la zona bersaglio, può usare la navigazione a livello del suolo per andare alla chiave. In caso contrario, è necessario ripetere il passaggio uno fino a raggiungere la zona target.
C'è la possibilità che una chiave venga cercata dietro una porta chiusa ... e che anche la chiave di quella porta sia ... e così via fino alla nausea. Questo è essenzialmente un problema di risoluzione delle dipendenze e ci sono alcuni modi per affrontarlo, uno dei quali è Petri Nets. Vedere questo eccellente documento.
PS. Se stai creando il tuo dungeon in modo procedurale, allora mentre lo fai, puoi archiviare informazioni sull'ordinamento delle dipendenze, a condizione che tu conosca già la posizione iniziale del giocatore.