Dwarf Fortress non è open source, e mentre ci sono molte congetture e ingegneria inversa che possono andare su come tutto funzioni, mi concentrerò invece su alcune tecniche di base per ottimizzare un roguelike 3D (non grafica 3D, mondo 3D) del stesso tipo.
Come in tutti i videogiochi, ci sono molti fumi e specchi che creano l'illusione della complessità da semplici regole e sistemi. Questi vanno dall'uso di semplici numeri casuali per movimenti senza scopo fino alla pre-cottura di una maglia di nodi di alto livello per l'individuazione del percorso.
Movimento
Parlando di pathfinding, questo può spesso essere un problema molto difficile da risolvere per grandi spazi come può essere una mappa DF (fino a 768x768x64 IIRC), tuttavia il problema può essere semplificato e accelerato in questi modi:
- Rete di nodi precotta: quando viene creata la mappa, il mondo può essere suddiviso in blocchi e ogni blocco può essere mappato per le sue uscite e entrate. Quando viene aggiornato un blocco, ad esempio quando viene costruito un muro, è necessario aggiornare solo la rete di quel blocco.
- Path stinding: l'esecuzione di un percorso sull'intera mappa, cella per cella, richiederebbe molto tempo, invece il percorso su una rete di blocchi più grande, che mappa tutte le connessioni tra blocchi, quindi esegue un percorso all'interno del blocco solo quando passando da un pezzo all'altro. Questo fa 2 cose per te. Accelera l'individuazione del percorso suddividendolo su molti pezzi più piccoli e consente inoltre all'unità di cambiare direzione a metà del percorso quando un pezzo si aggiorna. Ripercorrerebbe il percorso attraverso la rete di grandi dimensioni se uno dei nodi necessari per l'aggiornamento incrociato.
- Sterzo casuale: quando non ci si sposta verso un obiettivo, l'unità deve solo camminare senza meta. Molti roguelike muovono semplicemente l'unità in una direzione casuale, che sembra innaturale. Possono essere utilizzate varie tecniche di sterzo, quelle semplici stanno favorendo lo spostamento in linea retta e hanno sempre meno possibilità di spostarsi nelle direzioni che si irradiano verso la parte posteriore, il che avrebbe solo una probabilità dell'1% circa. Quindi l'unità a volte inverte completamente la direzione, ma solo raramente.
Non tratterò le basi del pathfinding. La maggior parte dei roguelike usa A *, ma ci sono altri metodi per scuoiare il gatto. Mmmm Cat leather ..
Compiti personali
Una delle cose principali che fa apparire e sentire in vita le unità DF è il loro elenco di obiettivi personali. In verità molti giochi roguelike hanno questo a un livello base. Essenzialmente ogni unità ha un elenco di desideri (e per i tuoi dorf, compiti che potrebbero raccogliere che stai chiedendo di fare) e sceglieranno da loro in base alla loro personalità (statistiche).
Alcune attività hanno dei requisiti. Realizzare una gonna di pelle richiede che il Dorf si trovi in un negozio del genere con articoli X. Quindi quelli tutti vengono controllati e aggiunti come attività al loro elenco. Semplice come quella.
Poiché la maggior parte delle volte un'unità sarà in transito, i controlli su ciò che le unità stanno facendo possono essere molto veloci, solo poche unità faranno una scelta in un dato momento, quindi nel complesso non c'è rallentamento nemmeno per centinaia o migliaia di unità. E ricorda, in DF tutto è dalle api ai trogloditi agli alberi.
Nel fare qualche ricerca aggiuntiva è chiaro che, esilarante, DF sta facendo un terribile lavoro di ricerca di percorsi in generale. Non sta suddividendo la mappa in blocchi, ma sta suddividendo la mappa in segmenti o aree collegate (che è meglio di niente di sicuro), quindi la mia valutazione sopra è ancora meno un esempio di come DF funziona. :) Il che non significa che DF sia niente di meno che sorprendente per un milione di altre ragioni.
Ciò dimostra che ciò che è importante in un gioco è il gioco. Non grafica, non programmazione eccezionale, scrittura eccezionale, musica eccezionale, nemmeno l'interfaccia; nient'altro è nemmeno dell'1% importante quanto il gioco stesso.