class_name IslandGenerator extends Node var GameTile = load("res://utils/GameTile.gd") var HexCell = preload("res://addons/gdhexgrid/HexCell.gd") var rng = RandomNumberGenerator.new() func _ready(): rng.randomize() func hex_cell_to_island_tile (hex: HexCell) -> GameTile: var tile = GameTile.new() tile.fromHexCell(hex) return tile func random_walk(walk_size, start_offset = Vector2(0,0)): var hexgrid = preload("res://addons/gdhexgrid/HexGrid.gd").new() var tiles = {} var current_tile = hex_cell_to_island_tile(hexgrid.get_hex_from_offset(start_offset)) tiles[current_tile.offset_coords] = current_tile for i in range(walk_size - 1): var neighbours = current_tile.get_all_adjacent() var tile_exists = true while tile_exists and len(neighbours) > 0: var test_index = rng.randi() % len(neighbours) var test_tile = hex_cell_to_island_tile(neighbours[test_index]) if test_tile.offset_coords in tiles.keys(): neighbours.remove(test_index) else: tile_exists = false current_tile = test_tile if len(neighbours) == 0: break tiles[current_tile.offset_coords] = current_tile return tiles func extrude_tiles(tiles): var old_tiles = tiles tiles = {} for tile in old_tiles.values(): if not tile.offset_coords in tiles.keys(): tiles[tile.offset_coords] = tile var neighbours = tile.get_all_adjacent() for neighbour in neighbours: if neighbour.offset_coords in tiles.keys(): continue neighbour = hex_cell_to_island_tile(neighbour) tiles[neighbour.offset_coords] = neighbour return tiles func mark_sand_tiles(tiles): for tile in tiles.values(): tile.type = GameTile.TileType.Grass if rng.randi() % 2 else GameTile.TileType.DeepGrass var tile_neighbours = tile.get_all_adjacent() for neighbour in tile_neighbours: if not neighbour.offset_coords in tiles.keys(): tile.type = GameTile.TileType.Sand break return tiles