@@ -135,15 +135,9 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
135
135
for (int x = 0 ; x < width; ++x) {
136
136
for (int y = 0 ; y < height; ++y) {
137
137
// Godot GridMap Tile Rotation
138
- //
139
- // North = 0; // No rotation
140
- // South = 16;
141
- // East = 10;
142
- // West = 22;
143
- //
144
- int tilesRotation = 0 ;
138
+ int tilesRotation = NORTH;
145
139
146
- //
140
+ // Neighbor's of Data Grid Map
147
141
// +----+----+
148
142
// | n1 | n2 |
149
143
// +----+----+
@@ -156,22 +150,21 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
156
150
int n3 = elevationMap[y + 1 ][x];
157
151
int n4 = elevationMap[y + 1 ][x + 1 ];
158
152
159
- // Determine Elevation Changes
153
+ // Determine the Elevation Value
154
+ //
155
+ // Elevation of tile is the max of the neighbors elevation,
156
+ // assuming that the random noise is consistent in its spread
157
+ //
158
+ int elevation = max ({ n1, n2, n3, n4 });
159
+
160
+ // Determine Elevation Changes & Rotations & Tile Choice
160
161
//
161
162
// Elevation change needs to be known in Left, Right, Up, & Down
162
- // due to the determination of a tiles type and rotation
163
+ // due to the determination of a tiles type and rotation.
163
164
//
164
- // ! Unneeded due to the simpler way of just using neighbor values
165
+ // The tiles determine their type in relation to elevation due to
166
+ // their characteristics & setting water to elevation 0.
165
167
//
166
- // bool change1right = n1 < n2; // n1 -> n2
167
- // bool change3down = n1 < n3; // n1 -> n3
168
- // bool change3right = n3 < n4; // n3 -> n4
169
- // bool change4down = n2 < n4; // n2 -> n4
170
-
171
- // bool change1left = n1 > n2; // n1 -> n2
172
- // bool change2up = n1 > n3; // n1 -> n3
173
- // bool change3left = n3 > n4; // n3 -> n4
174
- // bool change4up = n2 > n4; // n2 -> n4
175
168
176
169
// -------------------------//
177
170
// Basic Tiles
@@ -195,7 +188,7 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
195
188
// | n3 | n4 | | 1 | 1 | | 2 | 2 |
196
189
// +----+----+ +---+---+ +---+---+
197
190
//
198
- if (n1 == n2 && n2 == n3 && n3 == 4 && n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 ) {
191
+ if (n1 == n2 && n2 == n3 && n3 == n4 && n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 ) {
199
192
tileMap[x][y] = GROUND;
200
193
}
201
194
@@ -216,7 +209,7 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
216
209
}
217
210
// Water's Edge North
218
211
// +----+----+ +---+---+
219
- // | n1 | n2 | | 1 |1 |
212
+ // | n1 | n2 | | 1 | 1 |
220
213
// +----+----+ +---+---+
221
214
// | n3 | n4 | | 0 | 0 |
222
215
// +----+----+ +---+---+
@@ -311,6 +304,7 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
311
304
// | n3 | n4 | | 1 | 2 |
312
305
// +----+----+ +---+---+
313
306
//
307
+ // TODO : Determine the way of choosing between cliffs and ramps
314
308
if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n4 > n1 && n4 > n2 && n4 > n3) {
315
309
tileMap[x][y] = CLIFF_CORNER;
316
310
tilesRotation = NORTH;
@@ -322,6 +316,7 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
322
316
// | n3 | n4 | | 1 | 1 |
323
317
// +----+----+ +---+---+
324
318
//
319
+ // TODO : Determine the way of choosing between cliffs and ramps
325
320
else if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n1 > n2 && n1 > n3 && n1 > n4) {
326
321
tileMap[x][y] = CLIFF_CORNER;
327
322
tilesRotation = SOUTH;
@@ -333,6 +328,7 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
333
328
// | n3 | n4 | | 1 | 1 |
334
329
// +----+----+ +---+---+
335
330
//
331
+ // TODO : Determine the way of choosing between cliffs and ramps
336
332
else if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n2 > n1 && n2 > n3 && n2 > n4) {
337
333
tileMap[x][y] = CLIFF_CORNER;
338
334
tilesRotation = EAST;
@@ -344,6 +340,7 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
344
340
// | n3 | n4 | | 1 | 0 |
345
341
// +----+----+ +---+---+
346
342
//
343
+ // TODO : Determine the way of choosing between cliffs and ramps
347
344
else if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n3 > n1 && n3 > n2 && n3 > n4) {
348
345
tileMap[x][y] = CLIFF_CORNER;
349
346
tilesRotation = WEST;
@@ -353,211 +350,68 @@ void TerrainGen::generate(GridMap *myGridMap, int height, int width, int depth,
353
350
// Cliff's & Ramp's Edges
354
351
// -------------------------//
355
352
356
- // Cliff's Edge
353
+ // Cliff or Ramp Edge North
357
354
// +----+----+ +---+---+
358
- // | n1 | n2 | | 2 | 1 |
355
+ // | n1 | n2 | | 1 | 1 |
359
356
// +----+----+ +---+---+
360
- // | n3 | n4 | | 2 | 1 |
357
+ // | n3 | n4 | | 2 | 2 |
361
358
// +----+----+ +---+---+
362
359
//
363
360
// TODO : Determine the way of choosing between cliffs and ramps
364
- if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 ) {
361
+ if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n1 < n3 && n1 < n4 && n2 < n4 && n2 < n3 ) {
365
362
tileMap[x][y] = CLIFF;
363
+ tilesRotation = NORTH;
366
364
}
367
-
368
- // Cliff's Edge
365
+ // Cliff's Edge South
366
+ // +----+----+ +---+---+
367
+ // | n1 | n2 | | 2 | 2 |
368
+ // +----+----+ +---+---+
369
+ // | n3 | n4 | | 1 | 1 |
370
+ // +----+----+ +---+---+
371
+ //
372
+ // TODO : Determine the way of choosing between cliffs and ramps
373
+ else if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n1 > n3 && n1 > n4 && n2 > n4 && n2 > n3) {
374
+ tileMap[x][y] = CLIFF;
375
+ tilesRotation = SOUTH;
376
+ }
377
+ // Cliff's Edge East
369
378
// +----+----+ +---+---+
370
379
// | n1 | n2 | | 2 | 1 |
371
380
// +----+----+ +---+---+
372
381
// | n3 | n4 | | 2 | 1 |
373
382
// +----+----+ +---+---+
374
383
//
375
384
// TODO : Determine the way of choosing between cliffs and ramps
376
- if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n1 > n2 && n3 > n4) {
385
+ else if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n1 < n2 && n1 < n4 && n3 < n2 && n3 < n4) {
377
386
tileMap[x][y] = CLIFF;
387
+ tilesRotation = EAST;
378
388
}
379
-
380
- // TODO : Add rest of the logic for all tile types
381
-
382
- // TODO : Remove unneeded Code below
383
-
384
- // Setup booleans & Ints
385
- bool needsRamp = false , needsCliff = false , adjacentToWater = false ;
386
-
387
- int rotationOrientation = 0 ;
388
- int numElevationChanges = 0 ;
389
- int numDirectionChanges = 0 ;
390
- int maxElevationChange = 0 ;
391
- int waterEdgeNeighbors = 0 ;
392
- int waterNeighbors[4 ] = { 0 , 0 , 0 , 0 };
393
-
394
- // If Elevation is 0, we get water tiles
395
- if (elevation == 0 ) {
396
- myGridMap->set_cell_item (Vector3i (x, elevation, y), WATER, 0 );
397
- continue ;
398
- }
399
-
400
- // Get the cardinal neighbors
401
- int neighborElevations[4 ] = { elevation, elevation, elevation, elevation };
402
-
403
- // Loop through and assign value to the cardinal neighbors
404
- for (int d = 0 ; d < 4 ; ++d) {
405
- int nx = x + dx[d];
406
- int ny = y + dy[d];
407
-
408
- if (nx >= 0 && ny >= 0 && nx < width && ny < height) {
409
- // Get Neighbors Elevation
410
- neighborElevations[d] = elevationMap[nx][ny];
411
- if (neighborElevations[d] == 0 ) {
412
- // If neighbor is water, store that info
413
- adjacentToWater = true ;
414
- waterNeighbors[d] = 1 ;
415
- }
416
- }
417
- }
418
-
419
- // Loop through the grid cells cardinal neighbors again
420
- for (int d = 0 ; d < 4 ; ++d) {
421
- // Find the Elevation diff between neighbors
422
- int diff = neighborElevations[d] - elevation;
423
-
424
- // If not 0, then there is a change
425
- if (diff != 0 )
426
- numDirectionChanges++;
427
-
428
- // If an elevation diff of 1
429
- if (diff == 1 || diff == -1 ) {
430
- // We have elevation change
431
-
432
- numElevationChanges++;
433
- maxElevationChange = max (maxElevationChange, abs (diff));
434
-
435
- float randomFactor = (float )rand () / RAND_MAX;
436
-
437
- // Set Cliffs or Ramps since Elevation has changed
438
- if (rawNoise[x][y] < 0.4 ) {
439
- tileMap[x][y] = CLIFF;
440
- } else {
441
- tileMap[x][y] = RAMP;
442
- }
443
- }
444
- }
445
-
446
- // If grid cell is adjacent to water
447
- if (adjacentToWater) {
448
- // Get the cardinal neighbors
449
- waterEdgeNeighbors = waterNeighbors[0 ] + waterNeighbors[1 ] + waterNeighbors[2 ] + waterNeighbors[3 ];
450
-
451
- // Decide if it needs to be a water edge or a water corner
452
- if (waterEdgeNeighbors == 1 ) {
453
- tileMap[x][y] = WATER_EDGE;
454
- } else if (
455
- (waterNeighbors[0 ] && waterNeighbors[1 ]) ||
456
- (waterNeighbors[1 ] && waterNeighbors[2 ]) ||
457
- (waterNeighbors[2 ] && waterNeighbors[3 ]) ||
458
- (waterNeighbors[3 ] && waterNeighbors[0 ])) {
459
- tileMap[x][y] = WATER_CORNER; // Two adjacent water edges form a corner
460
- }
461
- }
462
-
463
- if (tileMap[x][y] == RAMP || tileMap[x][y] == CLIFF || tileMap[x][y] == RAMP_CORNER || tileMap[x][y] == CLIFF_CORNER) {
464
- int highestNeighborIndex = -1 ;
465
- int secondaryNeighborIndex = -1 ;
466
- int highestNeighborElevation = elevation;
467
- int secondaryNeighborElevation = elevation;
468
-
469
- for (int d = 0 ; d < 4 ; ++d) {
470
- int diff = neighborElevations[d] - elevation;
471
- if (diff > 0 ) {
472
- if (diff > highestNeighborElevation - elevation) {
473
- secondaryNeighborIndex = highestNeighborIndex;
474
- secondaryNeighborElevation = highestNeighborElevation;
475
- highestNeighborElevation = neighborElevations[d];
476
- highestNeighborIndex = d;
477
- } else if (diff > secondaryNeighborElevation - elevation) {
478
- secondaryNeighborElevation = neighborElevations[d];
479
- secondaryNeighborIndex = d;
480
- }
481
- }
482
- }
483
-
484
- // Determine if we have a corner case (two adjacent neighbors at higher elevation)
485
- bool isCorner = (secondaryNeighborIndex != -1 && abs (neighborElevations[secondaryNeighborIndex] - elevation) > 0 );
486
-
487
- // Apply rotation based on elevation direction
488
- if (highestNeighborIndex != -1 ) {
489
- if (!isCorner) {
490
- switch (highestNeighborIndex) {
491
- case 0 :
492
- rotationOrientation = 0 ;
493
- break ; // North
494
- case 1 :
495
- rotationOrientation = 10 ;
496
- break ; // East
497
- case 2 :
498
- rotationOrientation = 16 ;
499
- break ; // South
500
- case 3 :
501
- rotationOrientation = 22 ;
502
- break ; // West
503
- }
504
- } else {
505
- // Handle corner rotation logic
506
- if ((highestNeighborIndex == 0 && secondaryNeighborIndex == 1 ) ||
507
- (highestNeighborIndex == 1 && secondaryNeighborIndex == 0 )) {
508
- rotationOrientation = 0 ; // Top-right corner
509
- } else if ((highestNeighborIndex == 2 && secondaryNeighborIndex == 3 ) ||
510
- (highestNeighborIndex == 3 && secondaryNeighborIndex == 2 )) {
511
- rotationOrientation = 10 ; // Bottom-left corner
512
- } else if ((highestNeighborIndex == 0 && secondaryNeighborIndex == 3 ) ||
513
- (highestNeighborIndex == 3 && secondaryNeighborIndex == 0 )) {
514
- rotationOrientation = 16 ; // Top-left corner
515
- } else if ((highestNeighborIndex == 1 && secondaryNeighborIndex == 2 ) ||
516
- (highestNeighborIndex == 2 && secondaryNeighborIndex == 1 )) {
517
- rotationOrientation = 22 ; // Bottom-right corner
518
- }
519
- }
520
- }
389
+ // Cliff's Edge West
390
+ // +----+----+ +---+---+
391
+ // | n1 | n2 | | 1 | 2 |
392
+ // +----+----+ +---+---+
393
+ // | n3 | n4 | | 1 | 2 |
394
+ // +----+----+ +---+---+
395
+ //
396
+ // TODO : Determine the way of choosing between cliffs and ramps
397
+ else if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0 && n1 > n2 && n1 > n4 && n3 > n2 && n3 > n4) {
398
+ tileMap[x][y] = CLIFF;
399
+ tilesRotation = WEST;
521
400
}
522
401
523
402
/* ****************************************************
524
403
525
- Grid Map Cell Setter
404
+ Grid Map Cell Setter
526
405
527
- *****************************************************/
406
+ *****************************************************/
528
407
529
- myGridMap->set_cell_item (Vector3i (x, elevation, y), tileMap[x][y], rotationOrientation );
408
+ myGridMap->set_cell_item (Vector3i (x, elevation, y), tileMap[x][y], tilesRotation );
530
409
}
531
410
}
532
411
533
412
// TODO : Another run through required to check adjacent tiles, especially tiles touching corner tiles. TO ensure a cliff corner connects to cliffs
534
413
}
535
414
536
- TerrainGen::TileType TerrainGen::isCornerTile (int x, int y, vector<vector<TileType>> &tileMap) {
537
- if (x < 1 || y < 1 || x >= tileMap.size () - 1 || y >= tileMap[0 ].size () - 1 )
538
- return GROUND; // Bounds check
539
-
540
- TileType TL = tileMap[x - 1 ][y - 1 ];
541
- TileType TR = tileMap[x + 1 ][y - 1 ];
542
- TileType BL = tileMap[x - 1 ][y + 1 ];
543
- TileType BR = tileMap[x + 1 ][y + 1 ];
544
-
545
- // Check diagonal patterns for L-shapes
546
- if ((TL == WATER && BR == WATER) || (TR == WATER && BL == WATER)) {
547
- return WATER_CORNER; // Water Corner
548
- }
549
-
550
- if ((TL == CLIFF && BR == CLIFF) || (TR == CLIFF && BL == CLIFF)) {
551
- return CLIFF_CORNER; // Cliff Corner
552
- }
553
-
554
- if ((TL == RAMP && BR == RAMP) || (TR == RAMP && BL == RAMP)) {
555
- return RAMP_CORNER; // Ramp Corner
556
- }
557
-
558
- return GROUND;
559
- }
560
-
561
415
void TerrainGen::_bind_methods () {
562
416
ClassDB::bind_method (D_METHOD (" generate" , " GridMap" , " height" , " width" , " depth" , " seed" , " noiseType" , " waterRemoval" , " noiseFreq" ), &TerrainGen::generate);
563
417
}
0 commit comments