From ccf5d4c93b30beba8e7885f039f40028ff746a4f Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sun, 14 Dec 2025 17:10:29 +0300 Subject: [PATCH] Added player weapon generation from seed --- game/entities/ships/player/player_ship.gd | 8 ++++---- game/entities/ships/player/player_ship.tscn | 4 ++-- game/game.gd | 9 +++++++++ game/world/data/player_data.gd | 12 ++++++++++-- game/world/data/world_data.gd | 2 ++ game/world/generators/world_generator.gd | 18 ++++++++++++++++++ managers/save_manager.gd | 13 ++++--------- menu/title_screen.gd | 4 +--- 8 files changed, 50 insertions(+), 20 deletions(-) diff --git a/game/entities/ships/player/player_ship.gd b/game/entities/ships/player/player_ship.gd index 90c995c..a8ecb9d 100644 --- a/game/entities/ships/player/player_ship.gd +++ b/game/entities/ships/player/player_ship.gd @@ -67,11 +67,11 @@ func _set_player_data(new_data: PlayerData) -> void: player_data = new_data _weapons.clear() - _add_weapon_by_id(player_data.first_weapon_id, weapon_positions[0]) - _add_weapon_by_id(player_data.second_weapon_id, weapon_positions[1]) + for i in range(min(player_data.weapon_ids.size(), weapon_positions.size())): + _add_weapon_by_id(player_data.weapon_ids[i], weapon_positions[i]) - if player_data.hull > 0: - health.hull = mini(player_data.hull, health.max_hull) + if player_data.is_new_game: + health.hull = health.max_hull func _add_weapon_by_id(weapon_id: String, weapon_position: Vector2) -> void: diff --git a/game/entities/ships/player/player_ship.tscn b/game/entities/ships/player/player_ship.tscn index 005b9b8..bb0b57c 100644 --- a/game/entities/ships/player/player_ship.tscn +++ b/game/entities/ships/player/player_ship.tscn @@ -93,10 +93,10 @@ offset_top = 19.0 offset_bottom = 19.0 [node name="First" type="Node2D" parent="WeaponSlots" index="0"] -position = Vector2(-2, 8) +position = Vector2(-2, -8) [node name="Second" type="Node2D" parent="WeaponSlots" index="1"] -position = Vector2(-2, -8) +position = Vector2(-2, 8) [node name="BlinkChargeIndicator" parent="." index="10" instance=ExtResource("5_uf2n1")] position = Vector2(-11, 0) diff --git a/game/game.gd b/game/game.gd index 82ff4e3..e17403d 100644 --- a/game/game.gd +++ b/game/game.gd @@ -35,14 +35,23 @@ func _input(event: InputEvent) -> void: func start_game(game_data: GameData) -> void: + if not _fill_data(game_data): print("Can't process game data") _show_main_menu() return + if SaveManager.player_data.is_new_game: + _initialize_new_game() + _create_game_map() +func _initialize_new_game() -> void: + for i in range(data.player_start_weapon_ids.size()): + SaveManager.player_data.weapon_ids.append(data.player_start_weapon_ids[i]) + + func _fill_data(game_data: GameData) -> bool: data = world_generator.generate(game_data.game_seed.hash()) diff --git a/game/world/data/player_data.gd b/game/world/data/player_data.gd index c8caa9a..c8e2c19 100644 --- a/game/world/data/player_data.gd +++ b/game/world/data/player_data.gd @@ -2,7 +2,15 @@ class_name PlayerData extends Resource -@export var first_weapon_id: String -@export var second_weapon_id: String +@export var weapon_ids: Array[String] @export var hull: int + + +var is_new_game: bool = false + + +func reset() -> void: + weapon_ids.clear() + hull = 0 + is_new_game = true diff --git a/game/world/data/world_data.gd b/game/world/data/world_data.gd index 99cf8f1..5478d90 100644 --- a/game/world/data/world_data.gd +++ b/game/world/data/world_data.gd @@ -5,3 +5,5 @@ extends Resource @export var areas : Array[AreaData] = [] @export var seed_value : int = 0 + +@export var player_start_weapon_ids: Array[String] diff --git a/game/world/generators/world_generator.gd b/game/world/generators/world_generator.gd index 3ad0704..b080ef6 100644 --- a/game/world/generators/world_generator.gd +++ b/game/world/generators/world_generator.gd @@ -4,9 +4,16 @@ extends Node const AREA_COUNT = 3 +const WEAPON_GROUPS : Array[Array] = [ + [ "gatling", "railgun", "shrapnel", ], + [ "laser", "plasma", "tesla", ], + [ "minelayer", "launcher", "cannon", ], +] + var local_seed_rng : RandomNumberGenerator = RandomNumberGenerator.new() var area_seed_rng : RandomNumberGenerator = RandomNumberGenerator.new() +var weapon_rng : RandomNumberGenerator = RandomNumberGenerator.new() @onready var area_generator : AreaGenerator = $AreaGenerator @@ -15,11 +22,13 @@ var area_seed_rng : RandomNumberGenerator = RandomNumberGenerator.new() func generate(seed_value: int) -> WorldData: local_seed_rng.seed = seed_value area_seed_rng.seed = local_seed_rng.randi() + weapon_rng.seed = local_seed_rng.randi() var data : WorldData = WorldData.new() data.seed_value = seed_value _fill_areas(data) + _fill_weapons(data) return data @@ -29,3 +38,12 @@ func _fill_areas(data : WorldData) -> void: var seed_value := area_seed_rng.randi() var area := area_generator.generate(seed_value) data.areas.append(area) + + +func _fill_weapons(data : WorldData) -> void: + for i in range(WEAPON_GROUPS.size()): + var group := WEAPON_GROUPS[i] + if group.size() == 0: continue + + var index := weapon_rng.randi_range(1, group.size()) - 1 + data.player_start_weapon_ids.append(group[index]) diff --git a/managers/save_manager.gd b/managers/save_manager.gd index cb0dca1..a32742a 100644 --- a/managers/save_manager.gd +++ b/managers/save_manager.gd @@ -11,8 +11,7 @@ const GAME_STAGE_INDEX = "current_stage_index" const GAME_SECTOR_INDEX = "current_sector_index" const CATEGORY_PLAYER = "player" -const PLAYER_FIRST_WEAPON = "first_weapon_id" -const PLAYER_SECOND_WEAPON = "second_weapon_id" +const PLAYER_WEAPONS = "weapon_ids" const PLAYER_HULL = "hull" @@ -66,8 +65,7 @@ func _set_game_values() -> void: func _set_player_values() -> void: - _save_file.set_value(CATEGORY_PLAYER, PLAYER_FIRST_WEAPON, player_data.first_weapon_id) - _save_file.set_value(CATEGORY_PLAYER, PLAYER_SECOND_WEAPON, player_data.second_weapon_id) + _save_file.set_value(CATEGORY_PLAYER, PLAYER_WEAPONS, player_data.weapon_ids) _save_file.set_value(CATEGORY_PLAYER, PLAYER_HULL, player_data.hull) @@ -87,11 +85,8 @@ func _get_game_values() -> void: func _get_player_values() -> void: - player_data.first_weapon_id = _save_file.get_value( - CATEGORY_PLAYER, PLAYER_FIRST_WEAPON, player_data.first_weapon_id - ) - player_data.second_weapon_id = _save_file.get_value( - CATEGORY_PLAYER, PLAYER_SECOND_WEAPON, player_data.second_weapon_id + player_data.weapon_ids = _save_file.get_value( + CATEGORY_PLAYER, PLAYER_WEAPONS, player_data.weapon_ids ) player_data.hull = _save_file.get_value( CATEGORY_PLAYER, PLAYER_HULL, player_data.hull diff --git a/menu/title_screen.gd b/menu/title_screen.gd index 0214c5b..724ac26 100644 --- a/menu/title_screen.gd +++ b/menu/title_screen.gd @@ -27,9 +27,7 @@ func _on_main_menu_continue_game() -> void: func _on_main_menu_new_game() -> void: SaveManager.new_game() - SaveManager.player_data.first_weapon_id = _get_random_weapon_id() - SaveManager.player_data.second_weapon_id = _get_random_weapon_id() - SaveManager.player_data.hull = 0 + SaveManager.player_data.reset() get_tree().change_scene_to_file("res://game/game.tscn")