The Problem
We’d like to incrementally generate interconnected, chaotic, indefinite worlds.
- Indefinite: Generate as much as the player wants to explore
- Incremental: Generate content piece-by-piece on-demand
- Player exploration controls order of generation
- Interconnected: Structures connect or interact at large scales
- For example, rivers, roads or geologic features
- Chaotic: We can get many diverse worlds by altering a seed
Rivers
- Hard to generate incrementally, because the flow at any point depends on the entire watershed
- Watersheds cannot overlap each other: every drop of water takes a unique path to the ocean
- Two approaches:
- Generate and store rivers separately in big chunks
- Talk to your neighbors when generating rivers to pass information around
Big-chunk generation
- With large chunks, seams will be rare
- E.g., continents on an ocean with separate river systems
- Chunks are large, so seams are hard to notice
But: Large chunks may require lots of data, erasing the benefit of incremental generation
Local communication
- What if each small chunk simply negotiates with neighbors?
- E.g., Ask your upstream chunk how much flow to have
- Interconnection constraints satisfied through local information?
But: This can defeat incremental generation through regress: as each chunk asks upstream, we end up needing to generate the whole watershed
Approach
- Generate chunks that are almost completely separated
- Allows incremental, indefinite generation
- Communicate limited information between chunks to blur seams
- Maintains some interconnectedness
- Limit regress of dependencies by regressing towards a common root