From d55047239a3fec5a4043f2cb8a455b28c5153591 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Wed, 17 Dec 2025 22:02:54 +0300 Subject: [PATCH] PlayerData and EnemyData reworked for WeaponData --- .../ships/enemies/abstract_enemy_ship.gd | 4 +- game/entities/ships/player/player_ship.gd | 14 ++---- game/entities/weapons/cannon/cannon_data.tres | 1 + .../weapons/gatling/gatling_data.tres | 1 + game/entities/weapons/laser/laser_data.tres | 1 + .../weapons/launcher/launcher_data.tres | 1 + .../weapons/minelayer/minelayer_data.tres | 1 + game/entities/weapons/plasma/plasma_data.tres | 1 + .../weapons/railgun/railgun_data.tres | 1 + .../weapons/shrapnel/shrapnel_data.tres | 1 + game/entities/weapons/tesla/tesla_data.tres | 1 + game/game.gd | 4 +- game/world/data/enemy_data.gd | 2 +- game/world/data/player_data.gd | 4 +- game/world/data/weapon_data.gd | 1 + game/world/data/world_data.gd | 2 +- game/world/generators/passage_generator.gd | 16 +++---- game/world/generators/world_generator.gd | 23 +++++----- managers/save_manager.gd | 46 +++++++++++++++---- 19 files changed, 80 insertions(+), 45 deletions(-) diff --git a/game/entities/ships/enemies/abstract_enemy_ship.gd b/game/entities/ships/enemies/abstract_enemy_ship.gd index 1669dc2..fff5e33 100644 --- a/game/entities/ships/enemies/abstract_enemy_ship.gd +++ b/game/entities/ships/enemies/abstract_enemy_ship.gd @@ -35,8 +35,8 @@ func _set_enemy_data(data: EnemyData) -> void: positions.remove_at(0) for i in range(min(enemy_data.weapon_count, positions.size())): - var weapon := _create_weapon(enemy_data.weapon_id) - _add_weapon(weapon, positions[i]) + var weapon : AbstractWeapon = enemy_data.weapon.scene.instantiate() + _add_weapon(weapon, weapon_positions[i]) func _create_weapon(weapon_id : String) -> AbstractWeapon: diff --git a/game/entities/ships/player/player_ship.gd b/game/entities/ships/player/player_ship.gd index 732a6f9..c9b0906 100644 --- a/game/entities/ships/player/player_ship.gd +++ b/game/entities/ships/player/player_ship.gd @@ -67,21 +67,15 @@ func _set_player_data(new_data: PlayerData) -> void: player_data = new_data _weapons.clear() - 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]) + for i in range(min(player_data.weapons.size(), weapon_positions.size())): + var weapon_scene := player_data.weapons[i].scene + var weapon : AbstractWeapon = weapon_scene.instantiate() + _add_weapon(weapon, weapon_positions[i]) if player_data.hull > 0: health.hull = min(player_data.hull, health.max_hull) -func _add_weapon_by_id(weapon_id: String, weapon_position: Vector2) -> void: - if weapon_id.is_empty() or not weapon_id in WEAPON_SCENES: return - - var weapon_scene : PackedScene = load(WEAPON_SCENES[weapon_id]) - var weapon : AbstractWeapon = weapon_scene.instantiate() - _add_weapon(weapon, weapon_position) - - func _on_hull_updated(value: int, max_value: int) -> void: super._on_hull_updated(value, max_value) diff --git a/game/entities/weapons/cannon/cannon_data.tres b/game/entities/weapons/cannon/cannon_data.tres index 22a2cbe..7b57409 100644 --- a/game/entities/weapons/cannon/cannon_data.tres +++ b/game/entities/weapons/cannon/cannon_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_c34y3") id = "cannon" name = "Cannon" +group = "explosion" scene = ExtResource("3_2dgua") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/gatling/gatling_data.tres b/game/entities/weapons/gatling/gatling_data.tres index f748ac8..2984b3f 100644 --- a/game/entities/weapons/gatling/gatling_data.tres +++ b/game/entities/weapons/gatling/gatling_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_bt4k8") id = "gatling" name = "Gatling" +group = "kinetic" scene = ExtResource("3_2rwg6") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/laser/laser_data.tres b/game/entities/weapons/laser/laser_data.tres index f6eda64..1921e88 100644 --- a/game/entities/weapons/laser/laser_data.tres +++ b/game/entities/weapons/laser/laser_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_ipxhy") id = "laser" name = "Laser" +group = "energy" scene = ExtResource("1_aey1r") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/launcher/launcher_data.tres b/game/entities/weapons/launcher/launcher_data.tres index 784ac38..0c93576 100644 --- a/game/entities/weapons/launcher/launcher_data.tres +++ b/game/entities/weapons/launcher/launcher_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_tcis2") id = "launcher" name = "launcher" +group = "explosion" scene = ExtResource("1_3oqtq") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/minelayer/minelayer_data.tres b/game/entities/weapons/minelayer/minelayer_data.tres index a967733..183be1d 100644 --- a/game/entities/weapons/minelayer/minelayer_data.tres +++ b/game/entities/weapons/minelayer/minelayer_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_152qt") id = "minelayer" name = "Minelayer" +group = "explosion" scene = ExtResource("1_fh5qv") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/plasma/plasma_data.tres b/game/entities/weapons/plasma/plasma_data.tres index 6ca86a6..5a25211 100644 --- a/game/entities/weapons/plasma/plasma_data.tres +++ b/game/entities/weapons/plasma/plasma_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_3fasx") id = "plasma" name = "Plasma" +group = "energy" scene = ExtResource("1_rcvob") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/railgun/railgun_data.tres b/game/entities/weapons/railgun/railgun_data.tres index 08edaa8..2b02374 100644 --- a/game/entities/weapons/railgun/railgun_data.tres +++ b/game/entities/weapons/railgun/railgun_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_6lcn5") id = "railgun" name = "Railgun" +group = "kinetic" scene = ExtResource("1_cbt0i") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/shrapnel/shrapnel_data.tres b/game/entities/weapons/shrapnel/shrapnel_data.tres index 8ccc977..74a721d 100644 --- a/game/entities/weapons/shrapnel/shrapnel_data.tres +++ b/game/entities/weapons/shrapnel/shrapnel_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_xds2o") id = "shrapnel" name = "Shrapnel" +group = "kinetic" scene = ExtResource("1_8lpql") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/entities/weapons/tesla/tesla_data.tres b/game/entities/weapons/tesla/tesla_data.tres index 3439f4a..9cd3b08 100644 --- a/game/entities/weapons/tesla/tesla_data.tres +++ b/game/entities/weapons/tesla/tesla_data.tres @@ -7,5 +7,6 @@ script = ExtResource("1_a16gw") id = "tesla" name = "Tesla" +group = "energy" scene = ExtResource("1_uxb6m") metadata/_custom_type_script = "uid://870r1efinhqd" diff --git a/game/game.gd b/game/game.gd index 3e9dbc5..622359a 100644 --- a/game/game.gd +++ b/game/game.gd @@ -50,8 +50,8 @@ func start_game(game_data: GameData) -> void: 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]) + 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 diff --git a/game/world/data/enemy_data.gd b/game/world/data/enemy_data.gd index 11e7bdb..16694e3 100644 --- a/game/world/data/enemy_data.gd +++ b/game/world/data/enemy_data.gd @@ -9,6 +9,6 @@ extends Resource @export var enemy_scene: String -@export var weapon_id: String +@export var weapon: WeaponData @export var weapon_count: int diff --git a/game/world/data/player_data.gd b/game/world/data/player_data.gd index c8e2c19..6e478ea 100644 --- a/game/world/data/player_data.gd +++ b/game/world/data/player_data.gd @@ -2,7 +2,7 @@ class_name PlayerData extends Resource -@export var weapon_ids: Array[String] +@export var weapons: Array[WeaponData] @export var hull: int @@ -11,6 +11,6 @@ var is_new_game: bool = false func reset() -> void: - weapon_ids.clear() + weapons.clear() hull = 0 is_new_game = true diff --git a/game/world/data/weapon_data.gd b/game/world/data/weapon_data.gd index 97d4154..a3f92e9 100644 --- a/game/world/data/weapon_data.gd +++ b/game/world/data/weapon_data.gd @@ -4,5 +4,6 @@ extends Resource @export var id: String @export var name: String +@export var group: String @export var scene: PackedScene diff --git a/game/world/data/world_data.gd b/game/world/data/world_data.gd index 5478d90..31ded86 100644 --- a/game/world/data/world_data.gd +++ b/game/world/data/world_data.gd @@ -6,4 +6,4 @@ extends Resource @export var seed_value : int = 0 -@export var player_start_weapon_ids: Array[String] +@export var player_start_weapons: Array[WeaponData] diff --git a/game/world/generators/passage_generator.gd b/game/world/generators/passage_generator.gd index 38bf996..7a72a0c 100644 --- a/game/world/generators/passage_generator.gd +++ b/game/world/generators/passage_generator.gd @@ -21,7 +21,7 @@ var enemy_seed_rng : RandomNumberGenerator = RandomNumberGenerator.new() var enemy_delay_rng : RandomNumberGenerator = RandomNumberGenerator.new() var enemy_weapon_rng : RandomNumberGenerator = RandomNumberGenerator.new() -var weapon_ids : Array[String] +var weapons : Array[WeaponData] @onready var enemy_generator : EnemyGenerator = $EnemyGenerator @@ -35,7 +35,7 @@ func generate(seed_value: int) -> PassageData: enemy_delay_rng.seed = local_seed_rng.randi() enemy_weapon_rng.seed = local_seed_rng.randi() - weapon_ids = _get_weapon_ids() + weapons = _get_weapons() var data : PassageData = PassageData.new() data.seed_value = seed_value @@ -46,8 +46,8 @@ func generate(seed_value: int) -> PassageData: return data -func _get_weapon_ids() -> Array[String]: - var array : Array[String] = AbstractShip.WEAPON_SCENES.keys().duplicate() +func _get_weapons() -> Array[WeaponData]: + var array : Array[WeaponData] = SaveManager.WEAPONS.duplicate() for i in range(array.size() - 1, 0, -1): var j := weapon_ids_rng.randi_range(0, i) @@ -76,7 +76,7 @@ func _fill_enemies(data: PassageData) -> void: var enemy := enemy_generator.generate(seed_value) enemy.spawn_time = time - enemy.weapon_id = _get_weapon_id() + enemy.weapon = _get_weapon() data.enemies.append(enemy) @@ -85,13 +85,13 @@ func _fill_enemies(data: PassageData) -> void: data.enemies.sort_custom(enemy_spawn_time_compare) -func _get_weapon_id() -> String: +func _get_weapon() -> WeaponData: var index := 0 - while index < weapon_ids.size() - 1: + while index < weapons.size() - 1: if enemy_weapon_rng.randi_range(1, 100) <= USE_NEXT_WEAPON_CHANCE: index += 1 else: break - return weapon_ids[index] + return weapons[index] diff --git a/game/world/generators/world_generator.gd b/game/world/generators/world_generator.gd index b080ef6..3e256f4 100644 --- a/game/world/generators/world_generator.gd +++ b/game/world/generators/world_generator.gd @@ -4,12 +4,6 @@ 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() @@ -41,9 +35,16 @@ func _fill_areas(data : WorldData) -> void: func _fill_weapons(data : WorldData) -> void: - for i in range(WEAPON_GROUPS.size()): - var group := WEAPON_GROUPS[i] - if group.size() == 0: continue + var weapon_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) + + for group in weapon_by_group: + var array : Array[WeaponData] = weapon_by_group[group] + if array.size() == 0: continue - var index := weapon_rng.randi_range(1, group.size()) - 1 - data.player_start_weapon_ids.append(group[index]) + var index := weapon_rng.randi_range(1, array.size()) - 1 + data.player_start_weapons.append(array[index]) diff --git a/managers/save_manager.gd b/managers/save_manager.gd index 3bd3ae5..2327149 100644 --- a/managers/save_manager.gd +++ b/managers/save_manager.gd @@ -1,6 +1,18 @@ extends Node +const WEAPONS : Array[WeaponData] = [ + preload("res://game/entities/weapons/cannon/cannon_data.tres"), + preload("res://game/entities/weapons/gatling/gatling_data.tres"), + preload("res://game/entities/weapons/laser/laser_data.tres"), + preload("res://game/entities/weapons/launcher/launcher_data.tres"), + preload("res://game/entities/weapons/minelayer/minelayer_data.tres"), + preload("res://game/entities/weapons/plasma/plasma_data.tres"), + preload("res://game/entities/weapons/railgun/railgun_data.tres"), + preload("res://game/entities/weapons/shrapnel/shrapnel_data.tres"), + preload("res://game/entities/weapons/tesla/tesla_data.tres"), +] + const SAVE_FILE = "user://save.bin" const SAVE_FILE_PASS = "save_file_data" @@ -29,6 +41,14 @@ func _ready() -> void: _load() +static func get_weapon_data(weapon_id: String) -> WeaponData: + for weapon in WEAPONS: + if weapon.id == weapon_id: + return weapon + + return null + + func save() -> void: _set_game_values() _set_player_values() @@ -67,29 +87,39 @@ func _set_game_values() -> void: func _set_player_values() -> void: - _save_file.set_value(CATEGORY_PLAYER, PLAYER_WEAPONS, player_data.weapon_ids) + var weapon_ids : Array[String] = [] + for weapon in player_data.weapons: + weapon_ids.append(weapon.id) + + + _save_file.set_value(CATEGORY_PLAYER, PLAYER_WEAPONS, weapon_ids) _save_file.set_value(CATEGORY_PLAYER, PLAYER_HULL, player_data.hull) func _get_game_values() -> void: - game_data.game_seed = _save_file.get_value( + game_data.game_seed = _save_file.get_value( CATEGORY_GAME, GAME_SEED, game_data.game_seed ) - game_data.current_area_index = _save_file.get_value( + game_data.current_area_index = _save_file.get_value( CATEGORY_GAME, GAME_AREA_INDEX, game_data.current_area_index ) - game_data.current_stage_index = _save_file.get_value( + game_data.current_stage_index = _save_file.get_value( CATEGORY_GAME, GAME_STAGE_INDEX, game_data.current_stage_index ) - game_data.current_sector_index = _save_file.get_value( + game_data.current_sector_index = _save_file.get_value( CATEGORY_GAME, GAME_SECTOR_INDEX, game_data.current_sector_index ) func _get_player_values() -> void: - player_data.weapon_ids = _save_file.get_value( - CATEGORY_PLAYER, PLAYER_WEAPONS, player_data.weapon_ids + var weapon_ids : Array[String] = _save_file.get_value( + CATEGORY_PLAYER, PLAYER_WEAPONS, [] ) - player_data.hull = _save_file.get_value( + for weapon_id in weapon_ids: + var weapon := get_weapon_data(weapon_id) + if weapon != null: + player_data.weapons.append(weapon) + + player_data.hull = _save_file.get_value( CATEGORY_PLAYER, PLAYER_HULL, player_data.hull )