allowed path backtracking (Map)

This commit is contained in:
2ManyProjects 2025-03-04 12:05:16 -06:00
parent 104e607cc7
commit b74b472573
2 changed files with 21 additions and 22 deletions

View file

@ -11,39 +11,33 @@ enum RoomType {
EVENT EVENT
} }
# Configuration
var min_levels = 6 var min_levels = 6
var max_levels = 12 var max_levels = 15
var min_nodes_per_level = 2 var min_nodes_per_level = 2
var max_nodes_per_level = 4 var max_nodes_per_level = 6
var positions_per_level = 7 # How many horizontal positions are available (0-6) var positions_per_level = 6
var starting_elo = 1000 var starting_elo = 1000
var final_elo = 2100 var final_elo = 2100
# Internal variables
var _rng = RandomNumberGenerator.new() var _rng = RandomNumberGenerator.new()
var _next_id = 0 var _next_id = 0
func _init(seed_value = null): func _init(seed_value = null):
# Set seed for reproducible maps if needed # Set seed for reproducible maps
if seed_value != null: if seed_value != null:
_rng.seed = seed_value _rng.seed = seed_value
else: else:
_rng.randomize() _rng.randomize()
# Main function to generate the map
func generate_map(): func generate_map():
var nodes = [] var nodes = []
var connections = [] var connections = []
_next_id = 0 _next_id = 0
# Determine the number of levels
var num_levels = _rng.randi_range(min_levels, max_levels) var num_levels = _rng.randi_range(min_levels, max_levels)
# Calculate ELO for each level
var elo_step = float(final_elo - starting_elo) / (num_levels - 1) var elo_step = float(final_elo - starting_elo) / (num_levels - 1)
# Create starting node (always at position 3, level 0)
var start_node = { var start_node = {
"id": _get_next_id(), "id": _get_next_id(),
"type": RoomType.STARTING, "type": RoomType.STARTING,
@ -63,25 +57,18 @@ func generate_map():
} }
nodes.append(final_node) nodes.append(final_node)
# Generate intermediate levels
var levels_nodes = {0: [start_node], (num_levels - 1): [final_node]} var levels_nodes = {0: [start_node], (num_levels - 1): [final_node]}
for level in range(1, num_levels - 1): for level in range(1, num_levels - 1):
var level_nodes = [] var level_nodes = []
# Calculate ELO for this level
var level_elo = starting_elo + (elo_step * level) var level_elo = starting_elo + (elo_step * level)
# Determine number of nodes for this level
var num_nodes = _rng.randi_range(min_nodes_per_level, max_nodes_per_level) var num_nodes = _rng.randi_range(min_nodes_per_level, max_nodes_per_level)
# Generate available positions and shuffle them
var available_positions = [] var available_positions = []
for pos in range(positions_per_level): for pos in range(positions_per_level):
available_positions.append(pos) available_positions.append(pos)
available_positions.shuffle() available_positions.shuffle()
# Create nodes for this level
for i in range(num_nodes): for i in range(num_nodes):
var node_type = _get_random_room_type(level, num_levels) var node_type = _get_random_room_type(level, num_levels)
var node = { var node = {
@ -186,7 +173,6 @@ func _get_random_room_type(level, total_levels):
boss_chance += 0.3 boss_chance += 0.3
var roll = _rng.randf() var roll = _rng.randf()
print("_get_random_room_type ", roll, " ", boss_chance, " ", shop_chance, " ", event_chance)
if roll < boss_chance: if roll < boss_chance:
return RoomType.BOSS return RoomType.BOSS
elif roll < boss_chance + shop_chance: elif roll < boss_chance + shop_chance:

View file

@ -301,7 +301,7 @@ func highlight_current_node(button):
button.add_theme_stylebox_override("normal", style) button.add_theme_stylebox_override("normal", style)
func _on_node_pressed(node_data): func _on_node_pressed(node_data):
if is_node_accessible(node_data): if is_node_accessible(node_data) || is_node_path_accessible(node_data):
# Update current node # Update current node
current_node = node_data current_node = node_data
traversed_node(node_data) traversed_node(node_data)
@ -316,6 +316,19 @@ func _on_node_pressed(node_data):
func traversed_node(node_data): func traversed_node(node_data):
traversed_map.append(node_data.id) traversed_map.append(node_data.id)
func is_node_path_accessible(node_data):
if current_node == null:
return node_data.type == RoomType.STARTING
# Check if there's a direct connection from current node to the path travelled
for id in traversed_map:
var cur = get_node_by_id(id)
for connection in map_connections:
if connection.from == cur.id and connection.to == node_data.id:
return true
return false
func is_node_accessible(node_data): func is_node_accessible(node_data):
if current_node == null: if current_node == null:
return node_data.type == RoomType.STARTING return node_data.type == RoomType.STARTING