This fixes incorrect check in AllowResourceAt(), which previously looked at terrain type of the given cell *before* resource was created. Hence the check did not work as expected.
Adds a random map generator tailored for the Dune 2000 mod,
D2kMapGenerator.
This map generator has some limitations compared to the RA/CnC
map generator (ExperimentalMapGenerator):
- Symmetry is far less accurate for non-trivial rotations.
- No circular map shapes.
- Unplayable regions are not obstructed and no symmetry corrections
are applied. This is partly due to mod limitations (e.g., no
decorative actors), but I've also considered it less important.
- Somewhat higher map generation failure rates, due to more extreme
play-space requirements.
In order to support the map generator, some additional features are
added to common map generation utilties:
- A "FromTemplates" MultiBrush collection shorthand.
- Path partitioning logic in Terraformer, use to split paths into
multiple TilingPaths with different segment types.
In early iterations of the lobby map generation logic, a for loop was
used to retry map generation with alternative seeds in case it
failed. This seed randomization logic didn't exist in the final merged
version, but the for loop wasn't cleanup up, and ends up repeating any
map generation failures 5 times deterministically.
Additionally, the logic caught Exception instead of the more specific
MapGenerationException, which is the only exception that is expected
to arise in healthy builds/configurations (due to bad luck rather than
bugs).
This change:
- removes the for loop;
- only catches MapGenerationException;
- adjusts the user-visible failure message to reflect that trying
again (without adjusting settings) is a valid course of action (now
that it's not done internally);
This change lifts large portions of ExperimentalMapGenerator's logic
into a new "Terraformer" class with highly documented methods that can
theoretically be used by alternative map generator classes. Some
additional refactoring may occur in future, subject to the practical
needs of additional map generators. ClearMapGenerator is also
simplified.
This is not a pure refactor and contains some algorithmic and
behavioral changes, as well as few minor bug fixes. Notably:
- The logic for obstructing unreachable water has been somewhat
replaced.
- In CnC, where water is already unplayable, EMG no longer obstructs
water. (RA still does, as water is playable there.)
- Mountain (cliff) generation is now somewhat more effective. This
increases the number of cliffs seen on many presets. Settings should
no longer use "Mountains: 1000".
- PlayableSpace logic has been consolidated into Terraformer.
- PlayableSpace.Playability no longer exists as PartiallyPlayable
became redundant. Its uses have been replaced with a simple
boolean. Consequently, some defunct code and configuration has been
removed.
- Adjust MultiBrush replaceability contract painting behavior to be
more intuitive.
- Fix off-by-one error in map bounds computation.
- Fix some usages of mixed up MersenneTwisters.