Right now I made a script that can currently generate an array with one main-path that extends to the end that contains some branches along the way. But the only way to view it right now is by printing it out since it is an array. I'm somewhat new to godot so I don't know how to do this, but here is the kind of values that it spits out.
[1][C][C][C]
[C][C][3][C][C]
[C]
[C][C] [2]
[C][C][C]
S = Start, the numbers is the branches and the C's is the "critical path" pr the "main path"
How to Transferring 2D dungeon Generation from an Array to actual in-game rooms
It would be really helpful is someone helps me since I've been looking through godot docs and tutorials on youtube for a few days and can;t find the solution
-Dijion Mustard Cat
ask again, i dont understand what you want
So basically I want to turn this array,
[1][C][C][C]
[C][C][3][C][C]
[C]
[C][C] [2]
[C][C][C]
into real rooms inside of the game that uses a tilemap.
DijionMustardCat still an open ended question.. put the tiles in the array and you done?
DijionMustardCat
[1][C][C][C]
[C][C][3][C][C]
[C]
[C][C] [2]
[C][C][C]
In what way is this representing an array?
Yea, basically what kuligs2 just said
I mean how do I make each room have certain characteristics since right now it only is 1 integer so I don't know how to give it attributes like which side has a door or what type of room it is.
DijionMustardCat Yea, basically what kuligs2 just said
Arrays in GDScript don't have rows and columns. An array is a linear list of items. What you posted doesn't look like an array. If you have an array - print it directly and post that, so we can know what we're dealing with here.
- Edited
Manually make a [1] room, a [2] room, a [3] room and a [C] room.
Observe what they have in common and how they differ, and generalize the procedure so that you can automate it based on what's inside the array.
when I print it out I get this image of in my editor
(there are no values for the [thing printed out] on the left of the place where it is cut off
DijionMustardCat Who wrote this code?
i followed a tutorial by Thomas Yanzuella (idk if I wrote it right)
here's the code:
extends Node2D
@export var _dimensions : Vector2i = Vector2i(7, 5)
@export var _start : Vector2i = Vector2i(-1, 0)
@export var _critical_path_length : int = 13
@export var _branches : int = 3
@export var _branch_length : Vector2i = Vector2i(1, 4)
var _branch_candidates : Array[Vector2i]
var dungeon : Array
func _ready() -> void:
_initialize_dungeon()
_place_entrance()
generate_path(start, _critical_path_length, "C")
_generate_branches()
_print_dungeon()
func _initialize_dungeon() -> void:
for x in _dimensions.x:
dungeon.append([])
for y in _dimensions.y:
dungeon[x].append(0)
func _place_entrance() -> void:
if _start.x < 0 or _start.x >= _dimensions.x:
_start.x = randi_range(0, _dimensions.x - 1)
if _start.y < 0 or _start.y >= _dimensions.y:
_start.y = randi_range(0, dimensions.y - 1)
dungeon[start.x][_start.y] = "S"
func _generate_path(from : Vector2i, length : int, marker : String) -> bool:
if length == 0:
return true
var current : Vector2i = from
var direction : Vector2i
match randi_range(0, 3):
0:
direction = Vector2i.UP
1:
direction = Vector2i.RIGHT
2:
direction = Vector2i.DOWN
3:
direction = Vector2i.LEFT
for i in 4:
if (current.x + direction.x >= 0 and current.x + direction.x < _dimensions.x and
current.y + direction.y >= 0 and current.y + direction.y < _dimensions.y and
not dungeon[current.x + direction.x][current.y + direction.y]):
current += direction
dungeon[current.x][current.y] = marker
if length > 1:
_branch_candidates.append(current)
if _generate_path(current, length - 1, marker):
return true
else:
_branch_candidates.erase(current)
dungeon[current.x][current.y] = 0
current -= direction
direction = Vector2(direction.y, -direction.x)
return false
func _generate_branches() -> void:
var branches_created : int = 0
var candidate : Vector2i
while branches_created < _branches and _branch_candidates.size():
candidate = _branch_candidates[randi_range(0, _branch_candidates.size() - 1)]
if generate_path(candidate, randi_range(branch_length.x, _branch_length.y), str(branches_created + 1)):
branches_created += 1
else:
_branch_candidates.erase(candidate)
func print_dungeon() -> void:
var dungeon_as_string : String = ""
for y in range(dimensions.y - 1, -1, -1):
for x in _dimensions.x:
if dungeon[x][y]:
dungeon_as_string += "[" + str(dungeon[x][y]) + "]"
else:
dungeon_as_string += " "
dungeon_as_string += '\n'
print(dungeon_as_string)