Add D2K random map generator

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.
This commit is contained in:
Ashley Newson
2025-07-09 21:27:17 +01:00
committed by Gustas Kažukauskas
parent 484784bd4d
commit 5f407211ac
9 changed files with 1554 additions and 17 deletions

View File

@@ -26,6 +26,36 @@ ScrollPanel@LABEL_DROPDOWN_TEMPLATE:
Width: PARENT_WIDTH - 20
Height: 25
ScrollPanel@LABEL_DROPDOWN_WITH_TOOLTIP_TEMPLATE:
Width: DROPDOWN_WIDTH
Children:
ScrollItem@HEADER:
Background: scrollheader
Width: PARENT_WIDTH - 27
Height: 13
X: 2
Y: 0
Visible: false
Children:
Label@LABEL:
Font: TinyBold
Width: PARENT_WIDTH
Height: 13
Align: Center
ScrollItem@TEMPLATE:
Width: PARENT_WIDTH - 27
Height: 25
X: 2
Y: 0
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: BUTTON_TOOLTIP
Visible: false
Children:
Label@LABEL:
X: 10
Width: PARENT_WIDTH - 20
Height: 25
ScrollPanel@PLAYERACTION_DROPDOWN_TEMPLATE:
Width: DROPDOWN_WIDTH
Children:

View File

@@ -103,6 +103,9 @@ faction-smugglers =
faction-fremen =
.name = Fremen
map-generator-d2k = D2K RMG
map-generator-clear = Clear Terrain
## defaults.yaml
notification-unit-lost = Unit lost.
notification-unit-promoted = Unit promoted.
@@ -665,3 +668,95 @@ bot-vidius =
bot-gladius =
.name = Gladius
## map-generators.yaml
label-random-map = Random Map
label-clear-map-generator-option-tile = Tile
label-clear-map-generator-choice-tile-sand =
.label = Sand
label-clear-map-generator-choice-tile-concrete =
.label = Concrete
label-clear-map-generator-choice-tile-dune =
.label = Dune
label-clear-map-generator-choice-tile-rock =
.label = Rock
label-clear-map-generator-choice-tile-platform =
.label = Platform
label-d2k-map-generator-option-seed = Seed
label-d2k-map-generator-option-terrain-type = Terrain Type
label-d2k-map-generator-choice-terrain-type-rocky =
.label = Rocky
label-d2k-map-generator-choice-terrain-type-rough =
.label = Rough
label-d2k-map-generator-choice-terrain-type-flat =
.label = Flat
label-d2k-map-generator-choice-terrain-type-pockets =
.label = Pockets
label-d2k-map-generator-option-players = Players
label-d2k-map-generator-option-symmetry = Symmetry
label-d2k-map-generator-choice-mirror-none =
.label = None
label-d2k-map-generator-choice-symmetry-mirror-horizontal =
.label = Mirror Horizontal
label-d2k-map-generator-choice-symmetry-mirror-vertical =
.label = Mirror Vertical
label-d2k-map-generator-choice-symmetry-mirror-diagonal-tl =
.label = Mirror Diagonal (Top-Left)
label-d2k-map-generator-choice-symmetry-mirror-diagonal-tr =
.label = Mirror Diagonal (Top-Right)
label-d2k-map-generator-choice-symmetry-mirror-2-rotations =
.label = 2 Rotations
label-d2k-map-generator-choice-symmetry-mirror-3-rotations =
.label = 3 Rotations
label-d2k-map-generator-choice-symmetry-mirror-4-rotations =
.label = 4 Rotations
label-d2k-map-generator-choice-symmetry-mirror-5-rotations =
.label = 5 Rotations
label-d2k-map-generator-choice-symmetry-mirror-6-rotations =
.label = 6 Rotations
label-d2k-map-generator-choice-symmetry-mirror-7-rotations =
.label = 7 Rotations
label-d2k-map-generator-choice-symmetry-mirror-8-rotations =
.label = 8 Rotations
label-d2k-map-generator-option-resources = Resources
label-d2k-map-generator-choice-resources-none =
.label = None
label-d2k-map-generator-choice-resources-low =
.label = Low
label-d2k-map-generator-choice-resources-medium =
.label = Medium
label-d2k-map-generator-choice-resources-high =
.label = High
label-d2k-map-generator-choice-resources-very-high =
.label = Very High
label-d2k-map-generator-choice-resources-full =
.label = Full
label-d2k-map-generator-option-worms = Worms
label-d2k-map-generator-choice-worms-none =
.label = None
label-d2k-map-generator-choice-worms-low =
.label = Low
label-d2k-map-generator-choice-worms-medium =
.label = Medium
label-d2k-map-generator-choice-worms-high =
.label = High
label-d2k-map-generator-option-density = Density
label-d2k-map-generator-choice-density-players =
.label = Scale with players
label-d2k-map-generator-choice-density-area-and-players =
.label = Scale with size and players
label-d2k-map-generator-choice-density-area-very-low =
.label = Very Low
label-d2k-map-generator-choice-density-area-low =
.label = Low
label-d2k-map-generator-choice-density-area-medium =
.label = Medium
label-d2k-map-generator-choice-density-area-high =
.label = High
label-d2k-map-generator-choice-density-area-very-high =
.label = Very High

View File

@@ -53,6 +53,7 @@ Rules:
d2k|rules/starport.yaml
d2k|rules/husks.yaml
d2k|rules/arrakis.yaml
d2k|rules/map-generators.yaml
Sequences:
d2k|sequences/aircraft.yaml

View File

@@ -0,0 +1,328 @@
^MapGenerators:
D2kMapGenerator@d2k:
Type: d2k
Name: map-generator-d2k
Tilesets: ARRAKIS
Settings:
MultiChoiceOption@hidden_defaults:
Choice@hidden_defaults:
Settings:
Rotations: 1
Mirror: None
TerrainFeatureSize: 10240
SandDetailFeatureSize: 10240
DuneFeatureSize: 10240
ResourceFeatureSize: 20480
TerrainSmoothing: 4
DuneSmoothing: 2
SmoothingThreshold: 833
RockRoughness: 350
SandRoughness: 500
RoughnessRadius: 5
Rock: 350
SandCliffs: 500
Dunes: 200
MinimumRockStraight: 3
MinimumSandCliffStraight: 1
MinimumRockSandThickness: 6
MinimumSandCliffThickness: 5
MinimumDuneThickness: 2
MinimumRockSmoothLength: 6
MinimumSandRockCliffLength: 6
MinimumSandSandCliffLength: 6
MinimumSandLength: 2
SandContourSpacing: 5
DuneContourSpacing: 2
SandDetail: 200
SandDetailClumpiness: 1
SandDetailCutout: 2
MaximumSandDetailCutoutSpacing: 12
CreateEntities: True
AreaEntityBonus: 0
PlayerCountEntityBonus: 1000000
MinimumSpawnRockArea: 150
CentralSpawnReservationFraction: 250
SpawnRegionSize: 12
MinimumSpawnRadius: 3
SpawnReservation: 16
BiasedResourceSpawns: 2
ResourceSpawnSpacing: 2
UnbiasedResourceSpawns: 5
ResourceSpawnReservation: 8
ResourcesPerPlayer: 125000
ResourceUniformity: 250
ResourceClumpiness: 2
ResourceSpawn: spicebloom.spawnpoint
Resource: Spice
WormSpawn: wormspawner
WormSpawns: 1
WormSpawnReservation: 12
SandTile: 0
RockTile: 266
PlayableTerrain: Clear,Concrete,Dune,Rock,Rough,Sand,Spice,SpiceSand,Transition
RockZoneableTerrain: Rock
SandZoneableTerrain: SpiceSand
RockSmoothSegmentType: RockSmooth
SandRockCliffSegmentType: SandRockCliff
SandSandCliffSegmentType: SandSandCliff
SandSegmentType: Sand
DuneSegmentType: Dune
SandDetailBrushes: Rough-Sand-Detail
DuneBrushes: Dune
IntegerOption@Seed:
Label: label-d2k-map-generator-option-seed
Parameter: Seed
Default: 0
MultiChoiceOption@TerrainType:
Label: label-d2k-map-generator-option-terrain-type
Priority: 2
Default: Rocky
Choice@Rocky:
Label: label-d2k-map-generator-choice-terrain-type-rocky
Settings:
TerrainFeatureSize: 10240
SandDetailFeatureSize: 10240
DuneFeatureSize: 10240
RockRoughness: 350
SandRoughness: 500
Rock: 350
SandCliffs: 500
Dunes: 200
SandDetail: 200
Choice@Rough:
Label: label-d2k-map-generator-choice-terrain-type-rough
Settings:
TerrainFeatureSize: 10240
SandDetailFeatureSize: 10240
DuneFeatureSize: 10240
RockRoughness: 300
SandRoughness: 300
Rock: 300
SandCliffs: 500
Dunes: 200
SandDetail: 200
Choice@Flat:
Label: label-d2k-map-generator-choice-terrain-type-flat
Settings:
TerrainFeatureSize: 10240
SandDetailFeatureSize: 10240
DuneFeatureSize: 10240
RockRoughness: 0
SandRoughness: 0
Rock: 250
SandCliffs: 0
Dunes: 200
SandDetail: 50
Choice@Pockets:
Label: label-d2k-map-generator-choice-terrain-type-pockets
Settings:
TerrainFeatureSize: 10240
SandDetailFeatureSize: 10240
DuneFeatureSize: 10240
RockRoughness: 300
SandRoughness: 250
Rock: 650
SandCliffs: 500
Dunes: 0
SandDetail: 50
MultiIntegerChoiceOption@Players:
Label: label-d2k-map-generator-option-players
Parameter: Players
Choices: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Default: 2
Priority: 1
MultiChoiceOption@Symmetry:
Label: label-d2k-map-generator-option-symmetry
Default: 2Rotations
Priority: 1
Choice@None:
Label: label-d2k-map-generator-choice-mirror-none
Settings:
Mirror: None
Choice@LeftMatchesRight:
Label: label-d2k-map-generator-choice-symmetry-mirror-horizontal
Players: 2, 4, 6, 8, 10, 12, 14, 16
Settings:
Mirror: LeftMatchesRight
Choice@TopLeftMatchesBottomRight:
Label: label-d2k-map-generator-choice-symmetry-mirror-diagonal-tl
Players: 2, 4, 6, 8, 10, 12, 14, 16
Settings:
Mirror: TopLeftMatchesBottomRight
Choice@TopMatchesBottom:
Label: label-d2k-map-generator-choice-symmetry-mirror-vertical
Players: 2, 4, 6, 8, 10, 12, 14, 16
Settings:
Mirror: TopMatchesBottom
Choice@TopRightMatchesBottomLeft:
Label: label-d2k-map-generator-choice-symmetry-mirror-diagonal-tr
Players: 2, 4, 6, 8, 10, 12, 14, 16
Settings:
Mirror: TopRightMatchesBottomLeft
Choice@2Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-2-rotations
Players: 2, 4, 6, 8, 10, 12, 14, 16
Settings:
Rotations: 2
Choice@3Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-3-rotations
Players: 3, 6, 9, 12, 15
Settings:
Rotations: 3
Choice@4Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-4-rotations
Players: 4, 8, 12, 16
Settings:
Rotations: 4
Choice@5Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-5-rotations
Players: 5, 10, 15
Settings:
Rotations: 5
Choice@6Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-6-rotations
Players: 6, 12
Settings:
Rotations: 6
Choice@7Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-7-rotations
Players: 7, 14
Settings:
Rotations: 7
Choice@8Rotations:
Label: label-d2k-map-generator-choice-symmetry-mirror-8-rotations
Players: 8, 16
Settings:
Rotations: 8
MultiChoiceOption@Resources:
Label: label-d2k-map-generator-option-resources
Default: Medium
Choice@None:
Label: label-d2k-map-generator-choice-resources-none
Settings:
BiasedResourceSpawns: 0
UnbiasedResourceSpawns: 0
ResourcesPerPlayer: 0
Choice@Low:
Label: label-d2k-map-generator-choice-resources-low
Settings:
BiasedResourceSpawns: 1
UnbiasedResourceSpawns: 2
ResourcesPerPlayer: 75000
Choice@Medium:
Label: label-d2k-map-generator-choice-resources-medium
Settings:
BiasedResourceSpawns: 2
UnbiasedResourceSpawns: 4
ResourcesPerPlayer: 125000
Choice@High:
Label: label-d2k-map-generator-choice-resources-high
Settings:
BiasedResourceSpawns: 3
UnbiasedResourceSpawns: 6
ResourcesPerPlayer: 150000
Choice@VeryHigh:
Label: label-d2k-map-generator-choice-resources-very-high
Settings:
BiasedResourceSpawns: 4
UnbiasedResourceSpawns: 8
ResourcesPerPlayer: 200000
Choice@Full:
Label: label-d2k-map-generator-choice-resources-full
Settings:
BiasedResourceSpawns: 1
UnbiasedResourceSpawns: 1000000
ResourcesPerPlayer: 1000000000
MultiChoiceOption@Worms:
Label: label-d2k-map-generator-option-worms
Default: Low
Choice@None:
Label: label-d2k-map-generator-choice-worms-none
Settings:
WormSpawns: 0
Choice@Low:
Label: label-d2k-map-generator-choice-worms-low
Settings:
WormSpawns: 1
Choice@Medium:
Label: label-d2k-map-generator-choice-worms-medium
Settings:
WormSpawns: 2
Choice@High:
Label: label-d2k-map-generator-choice-worms-high
Settings:
WormSpawns: 4
MultiChoiceOption@Density:
Label: label-d2k-map-generator-option-density
Default: Players
Priority: 1
Choice@Players:
Label: label-d2k-map-generator-choice-density-players
Settings:
AreaEntityBonus: 0
PlayerCountEntityBonus: 1000000
Choice@AreaAndPlayers:
Label: label-d2k-map-generator-choice-density-area-and-players
Settings:
AreaEntityBonus: 200
PlayerCountEntityBonus: 500000
Choice@AreaVeryLow:
Label: label-d2k-map-generator-choice-density-area-very-low
Settings:
AreaEntityBonus: 100
PlayerCountEntityBonus: 0
Choice@AreaLow:
Label: label-d2k-map-generator-choice-density-area-low
Settings:
AreaEntityBonus: 200
PlayerCountEntityBonus: 0
Choice@AreaMedium:
Label: label-d2k-map-generator-choice-density-area-medium
Settings:
AreaEntityBonus: 400
PlayerCountEntityBonus: 0
Choice@AreaHigh:
Label: label-d2k-map-generator-choice-density-area-high
Settings:
AreaEntityBonus: 600
PlayerCountEntityBonus: 0
Choice@AreaVeryHigh:
Label: label-d2k-map-generator-choice-density-area-very-high
Settings:
AreaEntityBonus: 800
PlayerCountEntityBonus: 0
ClearMapGenerator@clear:
Type: clear
Name: map-generator-clear
Tilesets: ARRAKIS
Settings:
MultiChoiceOption@Tile:
Label: label-clear-map-generator-option-tile
Choice@Sand:
Label: label-clear-map-generator-choice-tile-sand
Tileset: ARRAKIS
Settings:
Tile: 0
Choice@Concrete:
Label: label-clear-map-generator-choice-tile-concrete
Tileset: ARRAKIS
Settings:
Tile: 88
Choice@Dune:
Label: label-clear-map-generator-choice-tile-dune
Tileset: ARRAKIS
Settings:
Tile: 241
Choice@Rock:
Label: label-clear-map-generator-choice-tile-rock
Tileset: ARRAKIS
Settings:
Tile: 266
Choice@Platform:
Label: label-clear-map-generator-choice-tile-platform
Tileset: ARRAKIS
Settings:
Tile: 1017

View File

@@ -271,3 +271,4 @@ EditorWorld:
DefaultStart: RockSmooth
DefaultInner: RockSmooth
DefaultEnd: RockSmooth
Inherits@MapGenerators: ^MapGenerators

View File

@@ -8529,56 +8529,48 @@ MultiBrushCollections:
Template: 181
Segment:
Start: SandRockCliff.R
Inner: SandRockCliff
End: RockSmooth.D
Points: 0,1, 1,1, 1,2
MultiBrush@245:
Template: 189
Segment:
Start: RockSmooth.U
Inner: SandRockCliff
End: SandRockCliff.R
Points: 2,1, 1,1, 2,1
Points: 1,2, 1,1, 2,1
MultiBrush@246:
Template: 190
Segment:
Start: SandRockCliff.D
Inner: SandRockCliff
End: RockSmooth.L
Points: 1,0, 1,1, 0,1
MultiBrush@247:
Template: 199
Segment:
Start: RockSmooth.R
Inner: SandRockCliff
End: SandRockCliff.D
Points: 0,1, 1,1
MultiBrush@248:
Template: 193
Segment:
Start: SandRockCliff.U
Inner: SandRockCliff
End: RockSmooth.R
Points: 1,2, 1,1, 2,1
MultiBrush@249:
Template: 222
Segment:
Start: RockSmooth.L
Inner: SandRockCliff
End: SandRockCliff.U
Points: 2,1, 1,1, 1,0
MultiBrush@250:
Template: 195
Segment:
Start: SandRockCliff.L
Inner: SandRockCliff
End: RockSmooth.U
Points: 2,1, 1,1, 1,0
MultiBrush@251:
Template: 198
Segment:
Start: RockSmooth.D
Inner: SandRockCliff
End: SandRockCliff.L
Points: 1,0, 1,1, 0,1
MultiBrush@252: # RockRockCliff transition SandRockCliff
@@ -8693,5 +8685,7 @@ MultiBrushCollections:
Inner: RockRockCliff
End: RockRockCliff.L
Points: 2,1, 1,1, 0,1
Rough-Sand-Detail:
FromTemplates: 118,119,120,121,122,124,125,214,249,274,283,287,288,289,332,337,338,354,355,356,357,358,385,403,404,405,406,407,408,409,429,431,434,436,477,482,1021,1024,1025,1026,1027,1028,1029,1030,1046,1047,1048,1049,1050,1051,1052,1053,1054,1059,1061,1062,1063,1064,1069,1070,1078,1079
Dune:
FromTemplates: 224,230,231,241