From 579faa06dfb296519d652b402f7da2e12dc4a134 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 8 Apr 2023 01:52:42 +0200 Subject: [PATCH] Implementing Tileset for Map Generation --- Scenes/Cave.tscn | 5 +- Scripts/MapGenerator.gd | 114 ++++++++++++++++++++++++++-------------- 2 files changed, 79 insertions(+), 40 deletions(-) diff --git a/Scenes/Cave.tscn b/Scenes/Cave.tscn index ff0ce79..d3e9115 100644 --- a/Scenes/Cave.tscn +++ b/Scenes/Cave.tscn @@ -1,13 +1,14 @@ [gd_scene load_steps=3 format=3 uid="uid://chfp8mm3vwh2e"] -[ext_resource type="TileSet" uid="uid://b7cqbf6xdbeal" path="res://Assets/Test_Tileset.tres" id="1_8lepy"] +[ext_resource type="TileSet" uid="uid://bj7uu2180mie3" path="res://Assets/Tileset.tres" id="1_a2htf"] [ext_resource type="Script" path="res://Scripts/MapGenerator.gd" id="2_qvwn8"] [node name="Node2D" type="Node2D"] [node name="TileMap" type="TileMap" parent="."] -tile_set = ExtResource("1_8lepy") +tile_set = ExtResource("1_a2htf") cell_quadrant_size = 8 collision_visibility_mode = 1 format = 2 script = ExtResource("2_qvwn8") +height = 33 diff --git a/Scripts/MapGenerator.gd b/Scripts/MapGenerator.gd index 9b066e6..d93c357 100644 --- a/Scripts/MapGenerator.gd +++ b/Scripts/MapGenerator.gd @@ -1,12 +1,9 @@ extends TileMap -@export var width := 128 -@export var height := 75 +@export var width := 60 +@export var height := 32 @export var fill_percentage := 0.65 -@export var solid_id := 0 -@export var non_solid_id := 1 - @export var solid_threshold := 7 @export var nonsolid_threshold := 4 @@ -16,6 +13,8 @@ extends TileMap @export var cave_gen_iterations := 3 @export var cave_mine_size_threshold := 80 +var tile_array : Array + func _ready(): var time = generate() print("time for generation: " + str(time)) @@ -25,40 +24,47 @@ func _ready(): func generate() -> float: var start_time = Time.get_unix_time_from_system() - + randomize() + setup_tile_data_array() fill_random_noise() - + for i in cave_gen_iterations: change_cells_by_neighbor_thresholds() - set_borders_solid() prepare_player_start_area() connect_caves(get_caves()) - for i in cave_gen_iterations: change_cells_by_neighbor_thresholds() - set_borders_solid() - + + tile_array_to_terrain() return Time.get_unix_time_from_system() - start_time +func setup_tile_data_array(): + tile_array.clear() + tile_array = [] + for x in width: + tile_array.append([]) + for y in height: + tile_array[x].append([]) + func fill_random_noise(): for x in width: for y in height: if randf() < fill_percentage: - self.set_cell(0, Vector2i(x,y),solid_id, Vector2i(0, 0)) + set_tile_solid(x,y) else: - self.set_cell(0, Vector2i(x,y),non_solid_id, Vector2i(0, 0)) + set_tile_non_solid(x,y) pass func set_borders_solid(): for x in width: - self.set_cell(0, Vector2i(x,0),solid_id, Vector2i(0, 0)) - self.set_cell(0, Vector2i(x,height-1),solid_id, Vector2i(0, 0)) + set_tile_solid(x,0) + set_tile_solid(x,height-1) for y in height: - self.set_cell(0, Vector2i(0,y),solid_id, Vector2i(0, 0)) - self.set_cell(0, Vector2i(width-1,y),solid_id, Vector2i(0, 0)) + set_tile_solid(0,y) + set_tile_solid(width-1,y) pass func prepare_player_start_area(): @@ -76,32 +82,32 @@ func prepare_player_start_area(): for y in range(center.y - start_area_size, center.y + start_area_size): # Decide if the tile is part of the Corner or not if !(p2 > 0 or p2 <= - (start_area_size*2 - p*2)): - self.set_cell(0, Vector2i(x,y),non_solid_id, Vector2i(0, 0)) + set_tile_non_solid(x,y) p2 -= 1 pass func change_cells_by_neighbor_thresholds(): - for x in range(1, width): - for y in range(1, height): + for x in range(1, width-1): + for y in range(1, height-1): # Count Solid Neighbor Cells var count := 0 #y-1 - if self.get_cell_source_id(0, Vector2i(x-1, y-1)) == solid_id: count +=1 - if self.get_cell_source_id(0, Vector2i(x, y-1)) == solid_id: count +=1 - if self.get_cell_source_id(0, Vector2i(x+1, y-1)) == solid_id: count +=1 + if get_tile_solid(x-1, y-1): count +=1 + if get_tile_solid(x, y-1): count +=1 + if get_tile_solid(x+1, y-1): count +=1 #y - if self.get_cell_source_id(0, Vector2i(x-1, y)) == solid_id: count +=1 - if self.get_cell_source_id(0, Vector2i(x+1, y)) == solid_id: count +=1 + if get_tile_solid(x-1, y): count +=1 + if get_tile_solid(x+1, y): count +=1 #y+1 - if self.get_cell_source_id(0, Vector2i(x-1, y+1)) == solid_id: count +=1 - if self.get_cell_source_id(0, Vector2i(x, y+1)) == solid_id: count +=1 - if self.get_cell_source_id(0, Vector2i(x+1, y+1)) == solid_id: count +=1 + if get_tile_solid(x-1, y+1): count +=1 + if get_tile_solid(x, y+1): count +=1 + if get_tile_solid(x+1, y+1): count +=1 # Check Threshold if count < nonsolid_threshold: - self.set_cell(0, Vector2i(x,y),non_solid_id, Vector2i(0, 0)) + set_tile_non_solid(x,y) if count >= solid_threshold: - self.set_cell(0, Vector2i(x,y),solid_id, Vector2i(0, 0)) + set_tile_solid(x,y) pass func get_caves() -> Array: @@ -110,12 +116,12 @@ func get_caves() -> Array: for x in range (2, width-2): for y in range (2, height-2): - if self.get_cell_source_id(0, Vector2i(x, y)) == non_solid_id: + if get_tile_non_solid(x, y): flood_fill(x,y, caves) for cave in caves: for tile in cave: - self.set_cell(0, Vector2i(tile.x,tile.y),non_solid_id, Vector2i(0, 0)) + set_tile_non_solid(tile.x,tile.y) return caves func flood_fill(tilex, tiley, caves) -> Array: @@ -126,7 +132,7 @@ func flood_fill(tilex, tiley, caves) -> Array: if !cave.has(tile): cave.append(tile) - self.set_cell(0, Vector2i(tile.x,tile.y),solid_id, Vector2i(0, 0)) + set_tile_solid(tile.x,tile.y) #check adjacent cells var north = Vector2i(tile.x, tile.y+1) @@ -135,7 +141,7 @@ func flood_fill(tilex, tiley, caves) -> Array: var west = Vector2i(tile.x-1, tile.y) for dir in [north,south,east,west]: - if self.get_cell_source_id(0, dir) == non_solid_id: + if get_tile_non_solid(dir.x, dir.y): if !to_fill.has(dir) and !cave.has(dir): to_fill.append(dir) if cave.size() >= cave_mine_size_threshold: @@ -223,9 +229,41 @@ func create_tunnel(point1, point2, cave): drunk_x += dx drunk_y += dy - if self.get_cell_source_id(0, Vector2i(drunk_x, drunk_y)) == solid_id: - self.set_cell(0, Vector2i(drunk_x, drunk_y),non_solid_id, Vector2i(0, 0)) + if get_tile_solid(drunk_x, drunk_y): + set_tile_non_solid(drunk_x, drunk_y) #make tunnel wider - self.set_cell(0, Vector2i(drunk_x+1, drunk_y),non_solid_id, Vector2i(0, 0)) - self.set_cell(0, Vector2i(drunk_x+1, drunk_y+1),non_solid_id, Vector2i(0, 0)) + set_tile_non_solid(drunk_x+1, drunk_y) + set_tile_non_solid(drunk_x+1, drunk_y+1) + pass + +func tile_array_to_terrain(): + for x in width: + for y in height: + match tile_array[x][y]: + 0: set_terrain_tile_non_solid(x,y) + 1: set_terrain_tile_solid(x,y) + pass + +# Getter +func get_tile_solid(x : int, y : int) -> bool: + return tile_array[x][y] == 1 + +func get_tile_non_solid(x : int, y : int) -> bool: + return tile_array[x][y] == 0 + +# Setter +func set_tile_solid(x : int, y : int): + tile_array[x][y] = 1 + pass + +func set_tile_non_solid(x : int, y : int): + tile_array[x][y] = 0 + pass + +func set_terrain_tile_solid(x : int, y : int): + self.set_cells_terrain_connect(0, [Vector2i(x,y)], 0, 0, false) + pass + +func set_terrain_tile_non_solid(x : int, y : int): + self.set_cell(0, Vector2i(x,y), -1) pass