Ci sono 2 problemi difficili nell'informatica. Nominare cose, invalidare la cache ed errori off-by-one.
Questo è un problema di invalidazione della cache.
Se hai un record di "is this inside", ogni volta che un blocco viene inserito o rimosso è abbastanza facile aggiornarlo e la sua regione tramite un riempimento.
Per ottimizzare questo, potresti voler avere una serie di livelli di "insidia".
Una "cella" è una regione circondata da blocchi posizionati dal giocatore (fino a una certa dimensione).
Una "stanza" è una cella con tessere di sfondo.
"Inside" è una stanza con una porta, una luce e una sedia.
Quando si posiziona un blocco in primo piano posizionato dal giocatore, fare una passeggiata in senso orario / antiorario per vedere se si forma una nuova cella. Quando rimuovi un blocco in primo piano posizionato dal giocatore, esamina se si rompe qualche cella - in tal caso, vedi se si forma una nuova cella unendo le due.
Quando una nuova cella viene formata o non formata, controlla che sia una stanza o un interno.
Le celle possono tenere traccia di quante tessere di sfondo hanno bisogno di essere una stanza. Quindi un semplice conteggio quando si forma una cella, una tessera di sfondo viene aggiunta o rimossa dalla cella, può determinare se si tratta di una stanza.
Allo stesso modo, le celle possono tenere traccia di quante sedie e fonti di luce (e in effetti oggetti di ogni tipo) sono al loro interno. Quindi il controllo interno è banale.
È inoltre possibile eseguire un conteggio degli ingressi.
Quindi aumentiamo la mappa con "celle". Quando le tessere vengono aggiunte o rimosse, controlliamo la cella della posizione e incrementiamo / diminuiamo il conteggio nella cella.
Utilizzare la camminata in senso orario / antiorario per definire l'interno e l'esterno di una cella quando viene aggiunto o rimosso un blocco di primo piano. Poiché le dimensioni delle celle sono limitate, questa camminata richiederà un numero limitato di passaggi.
Come bonus, ora hai un modo economico per parlare di stanze "opulanti", o "la stanza è benedetta da una fontana santa", o qualsiasi altra cosa su una stanza, poiché le stanze hanno un conteggio di ogni tipo di oggetto al loro interno. (Oppure, poiché le stanze hanno dimensioni limitate, basta eseguire un'iterazione; questo rimuove una cache).
Ogni posizione si trova al massimo in una cella, quindi puoi memorizzare l'id cella di ogni posizione sulla mappa principale.