diff --git a/game/entities/weapons/launcher/launcher_data.tres b/game/entities/weapons/launcher/launcher_data.tres index 0c93576..836d752 100644 --- a/game/entities/weapons/launcher/launcher_data.tres +++ b/game/entities/weapons/launcher/launcher_data.tres @@ -6,7 +6,7 @@ [resource] script = ExtResource("1_tcis2") id = "launcher" -name = "launcher" +name = "Launcher" group = "explosion" scene = ExtResource("1_3oqtq") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/game.gd b/game/game.gd index a68a760..c49bd04 100644 --- a/game/game.gd +++ b/game/game.gd @@ -4,9 +4,10 @@ extends Node const PASSAGE = preload("res://game/passage.tscn") const AREA_MAP = preload("res://game/area_map/area_map.tscn") +const WEAPON_SELECTION_SCREEN = preload("res://menu/ingame/weapon_selection_screen.tscn") -var data : WorldData +var world_data : WorldData var current_area : AreaData var current_stage : StageData var current_sector : SectorData @@ -14,6 +15,7 @@ var current_passage : PassageData var _current_passage_scene : Passage var _current_area_map_scene : AreaMap +var weapon_selection_screen : WeaponSelectionScreen @onready var pause_screen : Control = $PauseScreen @@ -44,26 +46,28 @@ func start_game(game_data: GameData) -> void: return if SaveManager.player_data.is_new_game: - _initialize_new_game() - - _create_game_map() + _show_weapon_selection_screen() + else: + _create_game_map() -func _initialize_new_game() -> void: - for i in range(data.player_start_weapons.size()): - SaveManager.player_data.weapons.append(data.player_start_weapons[i]) - SaveManager.player_data.is_new_game = false +func _show_weapon_selection_screen() -> void: + if weapon_selection_screen != null: weapon_selection_screen.queue_free() + weapon_selection_screen = WEAPON_SELECTION_SCREEN.instantiate() + add_child(weapon_selection_screen) + weapon_selection_screen.world_data = world_data + weapon_selection_screen.weapon_selected.connect(_on_weapon_selected) func _fill_data(game_data: GameData) -> bool: - data = world_generator.generate(game_data.game_seed.hash()) + world_data = world_generator.generate(game_data.game_seed.hash()) return _set_currents(game_data) func _set_currents(game_data: GameData) -> bool: - if game_data.current_area_index >= data.areas.size(): return false - current_area = data.areas[game_data.current_area_index] + if game_data.current_area_index >= world_data.areas.size(): return false + current_area = world_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] @@ -81,7 +85,7 @@ func _process_to_next_area() -> void: print(SaveManager.game_data.current_area_index) - if SaveManager.game_data.current_area_index >= data.areas.size(): + if SaveManager.game_data.current_area_index >= world_data.areas.size(): SaveManager.delete_game_data() victory_screen.show() else: @@ -123,6 +127,15 @@ func _create_passage(passage_data: PassageData) -> void: _current_passage_scene.player_died.connect(_on_passage_player_died) +func _on_weapon_selected(weapon_data: WeaponData) -> void: + if weapon_selection_screen != null: weapon_selection_screen.queue_free() + + SaveManager.player_data.weapons.append(weapon_data) + SaveManager.player_data.is_new_game = false + SaveManager.save() + _create_game_map() + + func _on_pause_screen_continue_game() -> void: pause_screen.hide() @@ -157,8 +170,8 @@ func _on_passage_completion() -> void: func _update_data_indexes() -> void: - for area_index in range(data.areas.size()): - var area := data.areas[area_index] + for area_index in range(world_data.areas.size()): + var area := world_data.areas[area_index] for stage_index in range(area.stages.size()): var stage := area.stages[stage_index] for sector_index in range(stage.sectors.size()): diff --git a/game/world/generators/world_generator.gd b/game/world/generators/world_generator.gd index 3e256f4..a961cc9 100644 --- a/game/world/generators/world_generator.gd +++ b/game/world/generators/world_generator.gd @@ -35,16 +35,18 @@ func _fill_areas(data : WorldData) -> void: func _fill_weapons(data : WorldData) -> void: - var weapon_by_group : Dictionary[String, Array] = {} + var weapons_by_group : Dictionary[String, Array] = {} for weapon in SaveManager.WEAPONS: - if not weapon.group in weapon_by_group: - weapon_by_group[weapon.group] = [] as Array[WeaponData] - weapon_by_group[weapon.group].append(weapon) + if not weapon.group in weapons_by_group: + weapons_by_group[weapon.group] = [] as Array[WeaponData] + weapons_by_group[weapon.group].append(weapon) - for group in weapon_by_group: - var array : Array[WeaponData] = weapon_by_group[group] + for group in weapons_by_group: + var array : Array[WeaponData] = weapons_by_group[group] if array.size() == 0: continue var index := weapon_rng.randi_range(1, array.size()) - 1 data.player_start_weapons.append(array[index]) + + data.player_start_weapons.shuffle() diff --git a/menu/ingame/weapon_selection_screen.gd b/menu/ingame/weapon_selection_screen.gd new file mode 100644 index 0000000..38f3f62 --- /dev/null +++ b/menu/ingame/weapon_selection_screen.gd @@ -0,0 +1,39 @@ +class_name WeaponSelectionScreen +extends Control + + +signal weapon_selected(weapon_data: WeaponData) + + +const WEAPON_SELECTOR = preload("res://menu/ingame/weapon_selector.tscn") + + +@export var world_data : WorldData: + set = _set_world_data + + +@onready var weapon_selectors : Control = $%WeaponSelectors + + +func _set_world_data(data: WorldData) -> void: + world_data = data + + for child in weapon_selectors.get_children(): + child.queue_free() + + if world_data == null: return + + var selectors : Array[WeaponSelector] = [] + for weapon_data in world_data.player_start_weapons: + var selector : WeaponSelector = WEAPON_SELECTOR.instantiate() + weapon_selectors.add_child(selector) + selector.weapon_data = weapon_data + selectors.append(selector) + selector.weapon_selected.connect(_on_weapon_selected) + + if selectors.size() > 0: + selectors[0].button.grab_focus() + + +func _on_weapon_selected(weapon_data: WeaponData) -> void: + weapon_selected.emit(weapon_data) diff --git a/menu/ingame/weapon_selection_screen.gd.uid b/menu/ingame/weapon_selection_screen.gd.uid new file mode 100644 index 0000000..afd46fd --- /dev/null +++ b/menu/ingame/weapon_selection_screen.gd.uid @@ -0,0 +1 @@ +uid://6isk1tmc2ik1 diff --git a/menu/ingame/weapon_selection_screen.tscn b/menu/ingame/weapon_selection_screen.tscn new file mode 100644 index 0000000..1f5bd71 --- /dev/null +++ b/menu/ingame/weapon_selection_screen.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=3 uid="uid://cv122gw47cnun"] + +[ext_resource type="Script" uid="uid://6isk1tmc2ik1" path="res://menu/ingame/weapon_selection_screen.gd" id="1_hl2ql"] + +[node name="WeaponSelectionScreen" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_hl2ql") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 0 +offset_right = 640.0 +offset_bottom = 360.0 +theme_override_constants/margin_left = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_bottom = 16 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Select your first weapon" + +[node name="WeaponSelectors" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +alignment = 1 diff --git a/menu/ingame/weapon_selector.gd b/menu/ingame/weapon_selector.gd new file mode 100644 index 0000000..417d827 --- /dev/null +++ b/menu/ingame/weapon_selector.gd @@ -0,0 +1,25 @@ +class_name WeaponSelector +extends Control + + +signal weapon_selected(weapon_data: WeaponData) + + +@export var weapon_data: WeaponData: + set = _set_weapon_data + + +@onready var name_label : Label = $%NameLabel +@onready var button : Button = $%Button + + +func _set_weapon_data(data: WeaponData) -> void: + weapon_data = data + + if weapon_data == null: return + + name_label.text = weapon_data.name + + +func _on_button_pressed() -> void: + weapon_selected.emit(weapon_data) diff --git a/menu/ingame/weapon_selector.gd.uid b/menu/ingame/weapon_selector.gd.uid new file mode 100644 index 0000000..1a0e247 --- /dev/null +++ b/menu/ingame/weapon_selector.gd.uid @@ -0,0 +1 @@ +uid://beiydi6w6gqqc diff --git a/menu/ingame/weapon_selector.tscn b/menu/ingame/weapon_selector.tscn new file mode 100644 index 0000000..f3a5ff7 --- /dev/null +++ b/menu/ingame/weapon_selector.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=3 format=3 uid="uid://1o3idp54lil2"] + +[ext_resource type="Script" uid="uid://beiydi6w6gqqc" path="res://menu/ingame/weapon_selector.gd" id="1_4acia"] +[ext_resource type="Theme" uid="uid://dtnd3tqllufey" path="res://images/menu_button.tres" id="2_g83h6"] + +[node name="WeaponSelector" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_4acia") + +[node name="Button" type="Button" parent="."] +unique_name_in_owner = true +layout_mode = 2 +theme = ExtResource("2_g83h6") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="NameLabel" type="Label" parent="MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme = ExtResource("2_g83h6") +horizontal_alignment = 1 + +[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]