diff --git a/game/area_map/area_map.gd b/game/area_map/area_map.gd index c3afde2..e903885 100644 --- a/game/area_map/area_map.gd +++ b/game/area_map/area_map.gd @@ -2,7 +2,7 @@ class_name AreaMap extends Node2D -signal sector_selected(sector: SectorData) +signal passage_selected(passage: PassageData) const SECTOR_XS = [ @@ -94,8 +94,9 @@ func _input(event: InputEvent) -> void: if event.is_action_pressed("ui_down"): _set_selected_sector(selected_sector.sector_below) if event.is_action_pressed("ui_accept"): - if _is_sector_accessible(current_sector): - sector_selected.emit(current_sector) + var selected_passage := _get_passage_to_sector(selected_sector) + if selected_passage != null: + passage_selected.emit(selected_passage) func _fill_sector_positions() -> void: @@ -224,10 +225,13 @@ func _update_selected_sector_indicator() -> void: func _is_sector_accessible(sector: SectorData) -> bool: - if current_sector == null: return false + return _get_passage_to_sector(sector) != null + + +func _get_passage_to_sector(sector: SectorData) -> PassageData: + if current_sector == null: return null for passage in current_sector.next_passages: if passage.next_sector == sector: - return true - - return false + return passage + return null diff --git a/game/game.gd b/game/game.gd index 3d8565c..d51982c 100644 --- a/game/game.gd +++ b/game/game.gd @@ -1,7 +1,20 @@ +class_name Game extends Node -@onready var passage : Passage = $Passage +const PASSAGE = preload("res://game/passage.tscn") +const AREA_MAP = preload("res://game/area_map/area_map.tscn") + + +var data : WorldData +var current_area : AreaData +var current_stage : StageData +var current_sector : SectorData + +var _current_passage_scene : Passage +var _current_area_map_scene : AreaMap + + @onready var pause_screen : Control = $PauseScreen @onready var game_over_screen : Control = $GameOverScreen @onready var world_generator : WorldGenerator = $WorldGenerator @@ -10,8 +23,8 @@ extends Node func _ready() -> void: pause_screen.hide() game_over_screen.hide() - var world_data := world_generator.generate(randi()) - passage.data = world_data.areas[0].stages[0].sectors[0].next_passages[0] + + start_game(SaveManager.game_data) func _input(event: InputEvent) -> void: @@ -20,11 +33,65 @@ func _input(event: InputEvent) -> void: get_tree().paused = true +func start_game(game_data: GameData) -> void: + if not _fill_data(game_data): + print("Can't process game data") + _show_main_menu() + return + + _create_game_map() + + +func _fill_data(game_data: GameData) -> bool: + data = world_generator.generate(game_data.game_seed.hash()) + + if game_data.current_area_index >= data.areas.size(): return false + current_area = data.areas[game_data.current_area_index] + + if game_data.current_stage_index >= current_area.stages.size(): return false + current_stage = current_area.stages[game_data.current_stage_index] + + if game_data.current_sector_index >= current_stage.sectors.size(): return false + current_sector = current_stage.sectors[game_data.current_sector_index] + + return true + + +func _create_game_map() -> void: + if _current_area_map_scene != null: _current_area_map_scene.queue_free() + + _current_area_map_scene = AREA_MAP.instantiate() + add_child(_current_area_map_scene) + _current_area_map_scene.area_data = current_area + _current_area_map_scene.current_sector = current_sector + _current_area_map_scene.selected_sector = current_sector + _current_area_map_scene.passage_selected.connect(_create_passage) + + +func _show_map() -> void: + if _current_passage_scene != null: _current_passage_scene.queue_free() + _current_area_map_scene.show() + + +func _create_passage(passage_data: PassageData) -> void: + if _current_passage_scene != null: _current_passage_scene.queue_free() + _current_area_map_scene.hide() + + _current_passage_scene = PASSAGE.instantiate() + add_child(_current_passage_scene) + + _current_passage_scene.data = passage_data + _current_passage_scene.completed.connect(_show_map) + + func _on_pause_screen_continue_game() -> void: pause_screen.hide() -func _on_show_main_menu() -> void: +func _show_main_menu() -> void: + if _current_passage_scene: _current_passage_scene.queue_free() + if _current_area_map_scene: _current_area_map_scene.queue_free() + get_tree().paused = false get_tree().change_scene_to_file("res://menu/title_screen.tscn") diff --git a/game/game.tscn b/game/game.tscn index 9aa5103..a2c758b 100644 --- a/game/game.tscn +++ b/game/game.tscn @@ -1,16 +1,13 @@ -[gd_scene load_steps=6 format=3 uid="uid://dl7m4rqyj8mck"] +[gd_scene load_steps=5 format=3 uid="uid://dl7m4rqyj8mck"] [ext_resource type="Script" uid="uid://1wfu4iuddo25" path="res://game/game.gd" id="1_l1rk1"] [ext_resource type="PackedScene" uid="uid://d34nh3lc1gpb" path="res://menu/pause_screen.tscn" id="2_h7iqs"] -[ext_resource type="PackedScene" uid="uid://dgc0087kvarx6" path="res://game/passage.tscn" id="3_4fuuu"] [ext_resource type="PackedScene" uid="uid://duxm8n62j2qt6" path="res://menu/game_over_screen.tscn" id="4_4fuuu"] [ext_resource type="PackedScene" uid="uid://ggf76ayl53bb" path="res://game/world/generators/world_generator.tscn" id="5_dxrkv"] [node name="Game" type="Node2D"] script = ExtResource("1_l1rk1") -[node name="Passage" parent="." instance=ExtResource("3_4fuuu")] - [node name="PauseScreen" parent="." instance=ExtResource("2_h7iqs")] process_mode = 2 z_index = 100 @@ -29,7 +26,6 @@ offset_bottom = 172.0 [node name="WorldGenerator" parent="." instance=ExtResource("5_dxrkv")] -[connection signal="player_died" from="Passage" to="." method="_on_passage_player_died"] [connection signal="continue_game" from="PauseScreen" to="." method="_on_pause_screen_continue_game"] -[connection signal="show_main_menu" from="PauseScreen" to="." method="_on_show_main_menu"] -[connection signal="show_main_menu" from="GameOverScreen" to="." method="_on_show_main_menu"] +[connection signal="show_main_menu" from="PauseScreen" to="." method="_show_main_menu"] +[connection signal="show_main_menu" from="GameOverScreen" to="." method="_show_main_menu"] diff --git a/game/game_data.gd b/game/game_data.gd new file mode 100644 index 0000000..8975d28 --- /dev/null +++ b/game/game_data.gd @@ -0,0 +1,23 @@ +class_name GameData +extends Resource + +const SEED_CHARS := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +const DEFAULT_SEED_LENGTH := 16 + + +@export var game_seed: String +@export var current_area_index: int +@export var current_stage_index: int +@export var current_sector_index: int + + +func randomize() -> void: + var seed_chars_length := SEED_CHARS.length() + + for i in range(DEFAULT_SEED_LENGTH): + var index := randi_range(1, seed_chars_length) - 1 + game_seed += SEED_CHARS[index] + + current_area_index = 0 + current_stage_index = 0 + current_sector_index = 0 diff --git a/game/game_data.gd.uid b/game/game_data.gd.uid new file mode 100644 index 0000000..903b6b6 --- /dev/null +++ b/game/game_data.gd.uid @@ -0,0 +1 @@ +uid://cmqv00wdh1jk5 diff --git a/game/passage.gd b/game/passage.gd index f12fc57..169a560 100644 --- a/game/passage.gd +++ b/game/passage.gd @@ -3,6 +3,7 @@ extends Node2D signal player_died +signal completed @export var data : PassageData: @@ -18,9 +19,10 @@ var _current_progress := 0.0 func _physics_process(delta: float) -> void: - if data: - _current_progress += delta - _update_progress_indicator() + _current_progress += delta + _update_progress_indicator() + if _current_progress >= data.length: + completed.emit() func _set_data(new_data: PassageData) -> void: diff --git a/game/world/data/passage_data.gd b/game/world/data/passage_data.gd index 33bf958..5e92965 100644 --- a/game/world/data/passage_data.gd +++ b/game/world/data/passage_data.gd @@ -13,6 +13,7 @@ enum PassageType { Plus45Grad, } + @export var previous_sector : SectorData @export var next_sector : SectorData diff --git a/managers/save_manager.gd b/managers/save_manager.gd new file mode 100644 index 0000000..e060ca5 --- /dev/null +++ b/managers/save_manager.gd @@ -0,0 +1,4 @@ +extends Node + + +var game_data : GameData diff --git a/managers/save_manager.gd.uid b/managers/save_manager.gd.uid new file mode 100644 index 0000000..6305119 --- /dev/null +++ b/managers/save_manager.gd.uid @@ -0,0 +1 @@ +uid://calwg6oh6lv0r diff --git a/managers/settings_manager.gd b/managers/settings_manager.gd index 8afa493..cd4f6f1 100644 --- a/managers/settings_manager.gd +++ b/managers/settings_manager.gd @@ -1,5 +1,6 @@ extends Node + const CONFIG_FILE = "user://settings.cfg" const BASE_SIZE = Vector2i(640, 360) diff --git a/menu/title_screen.gd b/menu/title_screen.gd index b40ff63..228f039 100644 --- a/menu/title_screen.gd +++ b/menu/title_screen.gd @@ -25,6 +25,10 @@ func _on_main_menu_continue_game() -> void: func _on_main_menu_new_game() -> void: + var game_data := GameData.new() + game_data.randomize() + SaveManager.game_data = game_data + get_tree().change_scene_to_file("res://game/game.tscn") diff --git a/project.godot b/project.godot index e388b50..a9c951c 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,7 @@ config/icon="res://icon.svg" [autoload] SettingsManager="*res://managers/settings_manager.gd" +SaveManager="*res://managers/save_manager.gd" [debug]