From b74b472573a14ab50064ce310b5d1d7c402da74b Mon Sep 17 00:00:00 2001 From: 2ManyProjects Date: Tue, 4 Mar 2025 12:05:16 -0600 Subject: [PATCH] allowed path backtracking (Map) --- Systems/Game/Map/MapGenerator.gd | 28 +++++++--------------------- Systems/Game/Map/MapScreen.gd | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/Systems/Game/Map/MapGenerator.gd b/Systems/Game/Map/MapGenerator.gd index 397922b..8fc000f 100644 --- a/Systems/Game/Map/MapGenerator.gd +++ b/Systems/Game/Map/MapGenerator.gd @@ -10,40 +10,34 @@ enum RoomType { SHOP, EVENT } - -# Configuration + var min_levels = 6 -var max_levels = 12 +var max_levels = 15 var min_nodes_per_level = 2 -var max_nodes_per_level = 4 -var positions_per_level = 7 # How many horizontal positions are available (0-6) +var max_nodes_per_level = 6 +var positions_per_level = 6 var starting_elo = 1000 var final_elo = 2100 - -# Internal variables + var _rng = RandomNumberGenerator.new() var _next_id = 0 func _init(seed_value = null): - # Set seed for reproducible maps if needed + # Set seed for reproducible maps if seed_value != null: _rng.seed = seed_value else: _rng.randomize() -# Main function to generate the map func generate_map(): var nodes = [] var connections = [] _next_id = 0 - # Determine the number of 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) - # Create starting node (always at position 3, level 0) var start_node = { "id": _get_next_id(), "type": RoomType.STARTING, @@ -63,25 +57,18 @@ func generate_map(): } nodes.append(final_node) - # Generate intermediate levels var levels_nodes = {0: [start_node], (num_levels - 1): [final_node]} for level in range(1, num_levels - 1): var level_nodes = [] - - # Calculate ELO for this 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) - - # Generate available positions and shuffle them var available_positions = [] for pos in range(positions_per_level): available_positions.append(pos) available_positions.shuffle() - # Create nodes for this level + for i in range(num_nodes): var node_type = _get_random_room_type(level, num_levels) var node = { @@ -186,7 +173,6 @@ func _get_random_room_type(level, total_levels): boss_chance += 0.3 var roll = _rng.randf() - print("_get_random_room_type ", roll, " ", boss_chance, " ", shop_chance, " ", event_chance) if roll < boss_chance: return RoomType.BOSS elif roll < boss_chance + shop_chance: diff --git a/Systems/Game/Map/MapScreen.gd b/Systems/Game/Map/MapScreen.gd index b0d366f..b8c8621 100644 --- a/Systems/Game/Map/MapScreen.gd +++ b/Systems/Game/Map/MapScreen.gd @@ -301,7 +301,7 @@ func highlight_current_node(button): button.add_theme_stylebox_override("normal", style) 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 current_node = node_data traversed_node(node_data) @@ -316,6 +316,19 @@ func _on_node_pressed(node_data): func traversed_node(node_data): 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): if current_node == null: return node_data.type == RoomType.STARTING