From dcce13a9e683c0e862ea67b53cf9c55b6600b88f Mon Sep 17 00:00:00 2001 From: Zacharie Guet Date: Sun, 26 Jul 2026 14:23:20 +0200 Subject: [PATCH] Dev 0.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Ajout de la déblocage des mutation du mode infini dans le mode histoire * Ajout de plus de caverne * Rework de l'emplacement des distributeurs/cavernes * Rework de l'influence, plus de clarté sur les plantes influencées * 4 d'inventaire dans le mode infini * Fix du tuto de mouvement en 3D * Déblocage de toutes le mutations à la fin du jeu * Fix de bug de chargelent de scène multiple --- .../artefacts/talion_soil/talion_soil.gd | 2 +- .../scripts/infinite_progression_data.gd | 10 ++- common/game_data/scripts/progression_data.gd | 2 + .../scripts/run/run_data_plant_info.gd | 2 +- .../scripts/story/infinite_story_step.gd | 8 +- common/game_data/scripts/story/story_step.gd | 50 ++++++----- .../story/story_steps/1_1_start_story_step.gd | 20 +++-- .../story/story_steps/2_aqua_story_step.gd | 20 +++++ .../story_steps/3_subterra_story_step.gd | 20 +++++ .../story/story_steps/4_estia_story_step.gd | 5 +- .../scripts/story_progression_data.gd | 9 +- common/game_info/game_info.gd | 21 +++++ entities/plants/plant_sprite.tscn | 53 ------------ entities/plants/scripts/plant.gd | 18 ++-- .../plants/scripts/plant_influence_zone.gd | 6 +- entities/plants/scripts/plant_sprite.gd | 78 ++++++------------ entities/player_3d/player_3D.tscn | 2 +- entities/player_3d/scripts/player_3d.gd | 6 ++ gui/credits/scripts/credits.gd | 7 ++ gui/game/tutorial/scripts/tutorial.gd | 35 ++------ .../astra_base/scripts/astra_base.gd | 2 - .../assets/3d/astra_end_base.blend | Bin 5116880 -> 5123249 bytes .../assets/3d/astra_end_base.blend1 | Bin 5116560 -> 5123249 bytes .../cockpit_scene/scripts/cockpit.gd | 2 +- .../relay_base/scripts/relay_base.gd | 1 + stages/3d_scenes/ship_garage/ship_garage.tscn | 1 + stages/terrain/region/scripts/plant_grid.gd | 4 +- translation/game/gui.csv | 2 +- 28 files changed, 193 insertions(+), 193 deletions(-) diff --git a/common/game_data/scripts/artefacts/talion_soil/talion_soil.gd b/common/game_data/scripts/artefacts/talion_soil/talion_soil.gd index eb348a4..745ecb2 100644 --- a/common/game_data/scripts/artefacts/talion_soil/talion_soil.gd +++ b/common/game_data/scripts/artefacts/talion_soil/talion_soil.gd @@ -12,4 +12,4 @@ func get_3d_scene() -> PackedScene: return preload("res://common/game_data/scripts/artefacts/talion_soil/talion_soil.blend") func modify_plant_influence_radius(plant_influence_radius : float) -> float: - return plant_influence_radius * 1.5 \ No newline at end of file + return plant_influence_radius + Region.TILE_SIZE \ No newline at end of file diff --git a/common/game_data/scripts/infinite_progression_data.gd b/common/game_data/scripts/infinite_progression_data.gd index fd623a2..969c393 100644 --- a/common/game_data/scripts/infinite_progression_data.gd +++ b/common/game_data/scripts/infinite_progression_data.gd @@ -1,6 +1,8 @@ extends ProgressionData class_name InfiniteProgressionData +@export var mutation_unlocked := StoryProgressionData.START_UNLOCKED_MUTATIONS + func get_story_step() -> StoryStep: return InfiniteStoryStep.new(run_number) @@ -25,8 +27,14 @@ func are_all_mutations_unlocked() -> bool: func unlock_new_mutation() -> PlantMutation: return null +func unlock_all_mutation() -> void: + pass + func get_available_mutations() -> Array[PlantMutation]: - return get_all_mutations() + if GameInfo.story_game_data and GameInfo.story_game_data.progression_data: + mutation_unlocked = max(mutation_unlocked,GameInfo.story_game_data.progression_data.mutations_unlocked) + + return get_all_mutations().slice(0, mutation_unlocked) func set_best_run(v := best_run): if best_run < 10 and v == 10: diff --git a/common/game_data/scripts/progression_data.gd b/common/game_data/scripts/progression_data.gd index d600b73..498f086 100644 --- a/common/game_data/scripts/progression_data.gd +++ b/common/game_data/scripts/progression_data.gd @@ -21,6 +21,8 @@ class_name ProgressionData @abstract func unlock_new_mutation() -> PlantMutation +@abstract func unlock_all_mutation() -> void + func set_best_run(v := best_run): best_run = v diff --git a/common/game_data/scripts/run/run_data_plant_info.gd b/common/game_data/scripts/run/run_data_plant_info.gd index 8ea20ed..9b5fe2a 100644 --- a/common/game_data/scripts/run/run_data_plant_info.gd +++ b/common/game_data/scripts/run/run_data_plant_info.gd @@ -6,7 +6,7 @@ const DEFAULT_LIFETIME = 6 const DEFAULT_BASE_SCORE = 1 const DEFAULT_SEED_NUMBER = 2 const DEFAULT_SEED_RANDOM_LOOSE = 1 -const DEFAULT_PLANT_INFLUENCE_RADIUS = 100 +const DEFAULT_PLANT_INFLUENCE_RADIUS = Region.TILE_SIZE const DEFAULT_MUTATION_PROBABILITY = 0.3 const DEFAULT_MUTATION_MAX_NUMBER = 2 diff --git a/common/game_data/scripts/story/infinite_story_step.gd b/common/game_data/scripts/story/infinite_story_step.gd index 1beada8..246db44 100644 --- a/common/game_data/scripts/story/infinite_story_step.gd +++ b/common/game_data/scripts/story/infinite_story_step.gd @@ -21,13 +21,13 @@ func get_player_max_energy(_difficulty_setting : int) -> int: return 4 func get_player_max_inventory(_difficulty_setting : int) -> int: - return 3 + return 4 func get_objective_for_region(level : int, _difficulty_setting : int) -> int: return basic_objective_for_region(level) -func get_cave_occurence(_level : int, _difficulty_setting : int) -> int: - return 0 +func has_cave_modifier(_level : int, _difficulty_setting : int) -> bool: + return false func is_region_sequence_infinite() -> bool: return true @@ -36,7 +36,7 @@ func get_region_sequence_length(_difficulty_setting) -> int: return 1000 func is_run_point_dangerous(level : int, _difficulty_setting : int) -> bool: - return level%6 == 0 and level != 0 + return level%5 == 0 and level != 0 func get_destination_text() -> String: return "" diff --git a/common/game_data/scripts/story/story_step.gd b/common/game_data/scripts/story/story_step.gd index 4f16cbc..6fca561 100644 --- a/common/game_data/scripts/story/story_step.gd +++ b/common/game_data/scripts/story/story_step.gd @@ -48,19 +48,33 @@ func get_region_sequence_length(difficulty_setting : int) -> int: return 6 return 8 -func get_first_vending_machine_occurence(_level : int, _difficulty_setting : int) -> int: - return 2 +func has_cave_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return false + 2: return false + 3: return true + 4: return false + 5: return true + 6: return true + 7: return false + 8: return true + _: return level % 2 == 0 -func get_vending_machine_occurence(_level : int, _difficulty_setting : int) -> int: - return 3 +func has_vending_machine_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return false + 2: return true + 3: return false + 4: return true + 5: return false + 6: return false + 7: return true + 8: return false + _: return (level + 1) % 3 == 0 -func get_first_cave_occurence(_level : int, _difficulty_setting : int) -> int: - return 1 - -func get_cave_occurence(_level : int, _difficulty_setting : int) -> int: - return 3 - -func get_challenge_chance(_level : int, _difficulty_setting : int) -> float: +func get_challenge_chance(level : int, difficulty_setting : int) -> float: + if is_run_point_dangerous(level, difficulty_setting): + return 0. return 0.15 func get_run_point_number(level : int, difficulty_setting : int) -> int: @@ -120,17 +134,11 @@ func get_gameplay_modifiers_for_region(level : int, difficulty_setting : int) -> var modifiers : Array[RegionModifier] = [] if need_gameplay_modifier(level,difficulty_setting): - var first_vending = get_first_vending_machine_occurence(level, difficulty_setting) - var vending_occurence = get_vending_machine_occurence(level, difficulty_setting) - if vending_occurence > 0 and level >= first_vending: - if (level - first_vending)%vending_occurence == 0: - modifiers.append(VendingMachineModifier.new()) + if has_vending_machine_modifier(level, difficulty_setting): + modifiers.append(VendingMachineModifier.new()) - var first_cave = get_first_cave_occurence(level, difficulty_setting) - var cave_occurence = get_cave_occurence(level, difficulty_setting) - if cave_occurence > 0 and level >= first_cave: - if (level - first_cave)%cave_occurence == 0: - modifiers.append(CaveModifier.new()) + if has_cave_modifier(level, difficulty_setting): + modifiers.append(CaveModifier.new()) return modifiers diff --git a/common/game_data/scripts/story/story_steps/1_1_start_story_step.gd b/common/game_data/scripts/story/story_steps/1_1_start_story_step.gd index cb07725..d61c5c7 100644 --- a/common/game_data/scripts/story/story_steps/1_1_start_story_step.gd +++ b/common/game_data/scripts/story/story_steps/1_1_start_story_step.gd @@ -25,9 +25,6 @@ func get_logs() -> Array[Log]: ) ] -func get_cave_occurence(_level : int, _difficulty_setting : int) -> int: - return 2 - func get_region_sequence_length(_difficulty_setting : int) -> int: return 5 @@ -37,18 +34,23 @@ func get_objective_multiplier() -> float: func is_run_point_dangerous(_level : int, _difficulty_setting : int) -> bool: return false -func get_first_vending_machine_occurence(_level : int, _difficulty_setting : int) -> int: - return 0 +func has_cave_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return false + 2: return true + 3: return false + 4: return false + _: return false -func get_vending_machine_occurence(_level : int, _difficulty_setting : int) -> int: - return 0 +func has_vending_machine_modifier(_level : int, _difficulty_setting : int) -> bool: + return false func get_challenge_chance(_level : int, _difficulty_setting : int) -> float: return 0. func get_ship_dialog_path(level : int, difficulty_setting : int ,ship_in_space := true) -> String: - if ship_in_space and level + 1 == get_cave_occurence(level, difficulty_setting): + if ship_in_space and has_cave_modifier(level + 1, difficulty_setting): return CAVE_DIALOG_PATH if ship_in_space and is_run_finished(level + 1, difficulty_setting): return MERCURY_ARRIVAL_DIALOG_PATH - return "" \ No newline at end of file + return "" diff --git a/common/game_data/scripts/story/story_steps/2_aqua_story_step.gd b/common/game_data/scripts/story/story_steps/2_aqua_story_step.gd index d56467d..dc609ce 100644 --- a/common/game_data/scripts/story/story_steps/2_aqua_story_step.gd +++ b/common/game_data/scripts/story/story_steps/2_aqua_story_step.gd @@ -36,6 +36,26 @@ func get_player_max_inventory(_difficulty_setting) -> int: func get_objective_multiplier() -> float: return 1.2 +func has_cave_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return false + 2: return true + 3: return false + 4: return true + 5: return false + 6: return true + _: return level % 2 == 0 + +func has_vending_machine_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return true + 2: return false + 3: return false + 4: return false + 5: return true + 6: return false + _: return (level + 1) % 3 == 0 + func get_ship_dialog_path(level : int, _difficulty_setting : int, _ship_in_space := true) -> String: if level == 5: return AQUA_TRAVEL_PHONE_CALL_DIALOG_PATH diff --git a/common/game_data/scripts/story/story_steps/3_subterra_story_step.gd b/common/game_data/scripts/story/story_steps/3_subterra_story_step.gd index f45da99..2098a42 100644 --- a/common/game_data/scripts/story/story_steps/3_subterra_story_step.gd +++ b/common/game_data/scripts/story/story_steps/3_subterra_story_step.gd @@ -37,6 +37,26 @@ func get_player_max_inventory(_difficulty_setting : int) -> int: func get_objective_multiplier() -> float: return 1.4 +func has_cave_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return false + 2: return true + 3: return true + 4: return false + 5: return false + 6: return true + _: return level % 2 == 0 + +func has_vending_machine_modifier(level : int, _difficulty_setting : int) -> bool: + match level: + 1: return false + 2: return false + 3: return false + 4: return true + 5: return true + 6: return false + _: return (level + 1) % 3 == 0 + func get_ship_dialog_path(level : int, _difficulty_setting : int, _ship_in_space := true) -> String: if level == 5: return TRAVEL_PHONE_CALL_DIALOG_PATH diff --git a/common/game_data/scripts/story/story_steps/4_estia_story_step.gd b/common/game_data/scripts/story/story_steps/4_estia_story_step.gd index 18cceb6..2446c6b 100644 --- a/common/game_data/scripts/story/story_steps/4_estia_story_step.gd +++ b/common/game_data/scripts/story/story_steps/4_estia_story_step.gd @@ -37,7 +37,10 @@ func get_player_max_inventory(_difficulty_setting : int) -> int: func get_objective_multiplier() -> float: return 1.6 +func get_region_sequence_length(_difficulty_setting : int) -> int: + return 9 + func get_ship_dialog_path(level : int, _difficulty_setting : int, _ship_in_space := true) -> String: - if level == 5: + if level == 6: return TRAVEL_PHONE_CALL_DIALOG_PATH return "" \ No newline at end of file diff --git a/common/game_data/scripts/story_progression_data.gd b/common/game_data/scripts/story_progression_data.gd index 6570b8a..47074b4 100644 --- a/common/game_data/scripts/story_progression_data.gd +++ b/common/game_data/scripts/story_progression_data.gd @@ -1,9 +1,11 @@ extends ProgressionData class_name StoryProgressionData +const START_UNLOCKED_MUTATIONS = 8 + @export var planted_mutation_ids: Array[String] = [] @export var story_step_i := 0 -@export var mutations_unlocked = 8 +@export var mutations_unlocked = START_UNLOCKED_MUTATIONS func get_story_step() -> StoryStep: return get_all_story_steps()[story_step_i] @@ -33,4 +35,7 @@ func are_all_mutations_unlocked() -> bool: func unlock_new_mutation() -> PlantMutation: var new_mutation = get_all_mutations()[mutations_unlocked] mutations_unlocked += 1 - return new_mutation \ No newline at end of file + return new_mutation + +func unlock_all_mutation() -> void: + mutations_unlocked = len(get_all_mutations()) + 1 \ No newline at end of file diff --git a/common/game_info/game_info.gd b/common/game_info/game_info.gd index 9727b7b..ba44d13 100644 --- a/common/game_info/game_info.gd +++ b/common/game_info/game_info.gd @@ -130,3 +130,24 @@ func update_inputs(s : SettingsData = settings_data): func has_unlocked_infinite_mode(): return true + +func get_action_key_name(action_name: String) -> String: + var events: Array[InputEvent] = InputMap.action_get_events(action_name) + + var saved_remapped_input = null + var existing_remapped_id: int = GameInfo.settings_data.action_remapped.find(action_name) + if existing_remapped_id != -1: + saved_remapped_input = GameInfo.settings_data.input_remapped[existing_remapped_id] + + var event: InputEvent = null + if saved_remapped_input: + event = saved_remapped_input + else: + event = null if events.size() == 0 else events[0] + + var input_name: String = "UNASSIGNED" if event == null else event.as_text() + if event is InputEventKey: + var keycode = DisplayServer.keyboard_get_keycode_from_physical(event.physical_keycode) + input_name = OS.get_keycode_string(keycode) + + return input_name \ No newline at end of file diff --git a/entities/plants/plant_sprite.tscn b/entities/plants/plant_sprite.tscn index 6c2b9d5..6b54500 100644 --- a/entities/plants/plant_sprite.tscn +++ b/entities/plants/plant_sprite.tscn @@ -12,35 +12,6 @@ height = 52.0 atlas = ExtResource("3_j6jm5") region = Rect2(76, 75, 124, 135) -[sub_resource type="ViewportTexture" id="ViewportTexture_rbgiq"] -viewport_path = NodePath("LifeTimeSprite/SubViewport") - -[sub_resource type="Gradient" id="Gradient_rbgiq"] -interpolation_mode = 1 -offsets = PackedFloat32Array(0, 0.800905, 1) -colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_rbgiq"] -gradient = SubResource("Gradient_rbgiq") -width = 100 -height = 100 -fill = 1 -fill_from = Vector2(0.5, 0.5) -fill_to = Vector2(1, 0.5) - -[sub_resource type="Gradient" id="Gradient_j6jm5"] -interpolation_mode = 1 -offsets = PackedFloat32Array(0, 0.5248869) -colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_wyuub"] -gradient = SubResource("Gradient_j6jm5") -width = 100 -height = 100 -fill = 1 -fill_from = Vector2(0.5, 0.5) -fill_to = Vector2(1, 0.5) - [sub_resource type="Animation" id="Animation_wyuub"] length = 0.001 tracks/0/type = "value" @@ -184,30 +155,6 @@ position = Vector2(4.444448, 31.11118) scale = Vector2(3.1777775, 3.1777775) texture = ExtResource("3_rbgiq") -[node name="LifeTimeSprite" type="Sprite2D" parent="." unique_id=799762981] -unique_name_in_owner = true -visible = false -scale = Vector2(0.26000002, 0.26000005) -texture = SubResource("ViewportTexture_rbgiq") - -[node name="SubViewport" type="SubViewport" parent="LifeTimeSprite" unique_id=1809354262] -disable_3d = true -transparent_bg = true -size = Vector2i(100, 100) - -[node name="LifetimeProgressBar" type="TextureProgressBar" parent="LifeTimeSprite/SubViewport" unique_id=967185775] -unique_name_in_owner = true -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 6 -size_flags_vertical = 6 -fill_mode = 4 -texture_over = SubResource("GradientTexture2D_rbgiq") -texture_progress = SubResource("GradientTexture2D_wyuub") - [node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1793068152] unique_name_in_owner = true libraries/ = SubResource("AnimationLibrary_8eofq") diff --git a/entities/plants/scripts/plant.gd b/entities/plants/scripts/plant.gd index c0acacd..a4fd16c 100644 --- a/entities/plants/scripts/plant.gd +++ b/entities/plants/scripts/plant.gd @@ -47,22 +47,27 @@ func _ready(): await get_tree().create_timer(0.05).timeout update_nearby_plant() update_decontamination_area_factor() - if data.day == data.get_lifetime() - 1: - plant_sprite.apply_about_to_dye_effect() + plant_sprite.is_about_to_die = data.day == data.get_lifetime() - 1 func pointer_text() -> String: return data.plant_name func inspect(is_inspected: bool = true): - plant_sprite.set_modulate_color(MODULATE_INSPECTED_COLOR if is_inspected else default_modulate, false) - plant_sprite.display_lifetime_sprite = is_inspected + plant_sprite.is_inspected = is_inspected influence_zone.show_influence = is_inspected + for area in influence_zone.get_overlapping_areas(): + if area is Plant and area != self: + area.show_influence(is_inspected) + + +func show_influence(influenced := true): + plant_sprite.is_plant_influenced = influenced + func generate_sprite() -> PlantSprite: var sprite_object: PlantSprite = SPRITE_SCENE.instantiate() add_child(sprite_object) - # sprite_object.generate_mutation_effects(self) return sprite_object @@ -107,8 +112,7 @@ func _pass_day(): for m in data.mutations: m._start_day_effect(self) - if data.day == data.get_lifetime() - 1: - plant_sprite.apply_about_to_dye_effect() + plant_sprite.is_about_to_die = data.day == data.get_lifetime() - 1 func _end_pass_day(): match data.get_state(): diff --git a/entities/plants/scripts/plant_influence_zone.gd b/entities/plants/scripts/plant_influence_zone.gd index cb3ea4a..526f201 100644 --- a/entities/plants/scripts/plant_influence_zone.gd +++ b/entities/plants/scripts/plant_influence_zone.gd @@ -16,10 +16,10 @@ func _init(_radius = 100): func _ready(): sprite = Circle.new() # sprite.z_index = 100 - sprite.radius = radius + sprite.radius = radius + roundi(Plant.PLANT_AREA_RADIUS / 2.) sprite.fill = false - sprite.width = 1 - sprite.opacity = 0.5 + sprite.width = 3 + sprite.opacity = 0.3 sprite.visible = show_influence add_child(sprite) diff --git a/entities/plants/scripts/plant_sprite.gd b/entities/plants/scripts/plant_sprite.gd index b5a28b7..57ed734 100644 --- a/entities/plants/scripts/plant_sprite.gd +++ b/entities/plants/scripts/plant_sprite.gd @@ -4,7 +4,7 @@ class_name PlantSprite const PLANTED_SEED_CROP_WIDTH = 50 const PLANTED_SEED_POS_Y = 0 -const PARTICLES_SCENE: PackedScene = preload("res://common/vfx/particles/effect_particles.tscn") +const MODULATE_PLANT_INFLUENCED_COLOR = Color("c599ffff") const ABOUT_TO_DYE_COLOR := Color("#fca67e") const ABOUT_TO_DYE_PERIOD := 1.0 @@ -14,14 +14,17 @@ signal harvest_animation_finished var last_updated_on_state: PlantData.State = PlantData.State.MATURE var stored_seed_image: Texture = null -var display_lifetime_sprite: bool = false: set = set_display_lifetime_sprite -var sprite_modulate: Color = Color.WHITE: set = set_sprite_modulate +var is_action_affected : bool = false +var is_inspected : bool = false +var is_plant_influenced : bool = false +var is_about_to_die : bool = false var about_to_dye_tween: Tween var target_modulate_color := Color.WHITE +var elapsed_time := 0. + func setup_plant_sprite(plant_data: PlantData): - set_display_lifetime_sprite() %PlantedSeed.texture = PlantTextureBuilder.build_seed_texture(plant_data.plant_name.hash()) update_plant_sprite(plant_data, true) @@ -35,43 +38,13 @@ func update_plant_sprite(plant_data: PlantData, with_animation = false): %PlantedSeed.visible = plant_data.get_state() == PlantData.State.PLANTED - %LifetimeProgressBar.value = 100 * (float(plant_data.day) / plant_data.get_lifetime()) - - # %PlantedSeed.region_rect = Rect2( - # 0, - # PLANTED_SEED_POS_Y, - # %PlantedSeed.texture.get_width(), - # %PlantedSeed.texture.texture.get_height() - PLANTED_SEED_CROP_WIDTH + -1 * PLANTED_SEED_POS_Y, - # ) - -func generate_mutation_effects(plant: Plant): - for m in plant.data.mutations: - var particles_emitter: EffectParticles = PARTICLES_SCENE.instantiate() as EffectParticles - particles_emitter.setup_particles( - EffectParticles.Parameters.new( - m.get_icon(), - PlantMutation.get_rarity_color(m.get_rarity()) - ) - ) - add_child(particles_emitter) - func start_harvest_animation(): $AnimationPlayer.play("harvest") await $AnimationPlayer.animation_finished harvest_animation_finished.emit() -func set_display_lifetime_sprite(d := display_lifetime_sprite): - display_lifetime_sprite = d - # if is_node_ready(): - # %LifeTimeSprite.visible = d - -func set_sprite_modulate(c := sprite_modulate): - sprite_modulate = c - if is_node_ready(): - %Sprite.modulate = c - func affect_preview(is_affected: bool = true): - set_modulate_color(InspectableEntity.MODULATE_AFFECTED_COLOR if is_affected else Color.WHITE, true) + is_action_affected = is_affected func _on_body_entered(body: Node2D) -> void: if body is Player && $AnimationPlayer.current_animation != "player_move": @@ -81,25 +54,20 @@ func play_bump_animation(): %AnimationPlayer.play("bump") await %AnimationPlayer.animation_finished -func set_modulate_color(color: Color, pause_about_to_dye: bool): - target_modulate_color = color - if about_to_dye_tween: - if pause_about_to_dye and about_to_dye_tween.is_running(): - about_to_dye_tween.pause() - modulate = target_modulate_color - elif not pause_about_to_dye and not about_to_dye_tween.is_running(): - about_to_dye_tween.play() - elif is_node_ready(): - %Sprite.modulate = target_modulate_color +func _process(delta): + elapsed_time += delta -func apply_about_to_dye_effect(): - if not about_to_dye_tween: - about_to_dye_tween = create_tween() - about_to_dye_tween.tween_property(%Sprite, "modulate:r", ABOUT_TO_DYE_COLOR.r, ABOUT_TO_DYE_PERIOD).from(target_modulate_color.r) - about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:g", ABOUT_TO_DYE_COLOR.g, ABOUT_TO_DYE_PERIOD).from(target_modulate_color.g) - about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:b", ABOUT_TO_DYE_COLOR.b, ABOUT_TO_DYE_PERIOD).from(target_modulate_color.b) + var target_modulate = Color.WHITE + + if is_action_affected: + target_modulate = InspectableEntity.MODULATE_AFFECTED_COLOR + elif is_inspected: + target_modulate = InspectableEntity.MODULATE_INSPECTED_COLOR + elif is_plant_influenced: + target_modulate = MODULATE_PLANT_INFLUENCED_COLOR + elif is_about_to_die: + var blink_value = (cos((elapsed_time * (2 * PI)) * ABOUT_TO_DYE_PERIOD) + 1)/2 + target_modulate = target_modulate.lerp(ABOUT_TO_DYE_COLOR, blink_value) + + modulate = modulate.lerp(target_modulate, 0.8) - about_to_dye_tween.tween_property(%Sprite, "modulate:r", target_modulate_color.r, ABOUT_TO_DYE_PERIOD).from(ABOUT_TO_DYE_COLOR.r) - about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:g", target_modulate_color.g, ABOUT_TO_DYE_PERIOD).from(ABOUT_TO_DYE_COLOR.g) - about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:b", target_modulate_color.b, ABOUT_TO_DYE_PERIOD).from(ABOUT_TO_DYE_COLOR.b) - about_to_dye_tween.set_loops() diff --git a/entities/player_3d/player_3D.tscn b/entities/player_3d/player_3D.tscn index 65b8c48..cc79f72 100644 --- a/entities/player_3d/player_3D.tscn +++ b/entities/player_3d/player_3D.tscn @@ -106,7 +106,6 @@ theme_override_constants/margin_bottom = 15 [node name="MoveTutorial" type="Label" parent="CanvasLayer/3dTutorial" unique_id=1165378520] unique_name_in_owner = true -visible = false layout_mode = 2 size_flags_vertical = 0 text = "MOVE_WITH_RIGHT_CLICK_OR_WASD" @@ -116,6 +115,7 @@ vertical_alignment = 1 [node name="InteractTutorial" type="Label" parent="CanvasLayer/3dTutorial" unique_id=1117243867] unique_name_in_owner = true +visible = false layout_mode = 2 size_flags_vertical = 0 text = "INTERACT_WITH_LEFT_CLICK" diff --git a/entities/player_3d/scripts/player_3d.gd b/entities/player_3d/scripts/player_3d.gd index f2bd61d..d9fc9cc 100644 --- a/entities/player_3d/scripts/player_3d.gd +++ b/entities/player_3d/scripts/player_3d.gd @@ -33,6 +33,12 @@ func _ready(): %MoveTutorial.visible = not "3d_move" in GameInfo.game_data.tutorials_done %InteractTutorial.visible = false + %MoveTutorial.text = tr("MOVE_WITH_RIGHT_CLICK_OR_WASD").format({ + "W": GameInfo.get_action_key_name("move_up"), + "A": GameInfo.get_action_key_name("move_left"), + "S": GameInfo.get_action_key_name("move_down"), + "D": GameInfo.get_action_key_name("move_right") + }) %Camera3D.fov = GameInfo.settings_data.fov GameInfo.settings_data.fov_changed.connect( func(fov : float): diff --git a/gui/credits/scripts/credits.gd b/gui/credits/scripts/credits.gd index 62221c2..7e461dc 100644 --- a/gui/credits/scripts/credits.gd +++ b/gui/credits/scripts/credits.gd @@ -5,5 +5,12 @@ func appear(): %AnimationPlayer.play("appear") func _on_title_screen_pressed(): + + var progression = GameInfo.game_data.progression_data + + if not progression.are_all_mutations_unlocked(): + progression.unlock_all_mutation() + SteamConnection.unlock_achievement(SteamConnection.ACH_UNLOCK_ALL_MUTATION) + SceneManager.change_to_scene(TitleScene.new(), false) diff --git a/gui/game/tutorial/scripts/tutorial.gd b/gui/game/tutorial/scripts/tutorial.gd index d7b49ad..9dbf27d 100644 --- a/gui/game/tutorial/scripts/tutorial.gd +++ b/gui/game/tutorial/scripts/tutorial.gd @@ -15,18 +15,18 @@ var success = false @onready var steps: Array[Step] = [ Step.new( tr("MOVE_WITH_RIGHT_CLICK_OR_WASD").format({ - "W": get_action_key_name("move_up"), - "A": get_action_key_name("move_left"), - "S": get_action_key_name("move_down"), - "D": get_action_key_name("move_right") + "W": GameInfo.get_action_key_name("move_up"), + "A": GameInfo.get_action_key_name("move_left"), + "S": GameInfo.get_action_key_name("move_down"), + "D": GameInfo.get_action_key_name("move_right") }), (func(): return player.global_position.distance_to(region.data.player_spawn) > 30) ), Step.new( tr("CHANGE_ZOOM_WITH_Z_X").format({ - "Z": get_action_key_name("zoom_in"), - "X": get_action_key_name("zoom_out") + "Z": GameInfo.get_action_key_name("zoom_in"), + "X": GameInfo.get_action_key_name("zoom_out") }), (func(): return GameInfo.settings_data.zoom != 1.), @@ -75,7 +75,7 @@ var success = false ), Step.new( tr("DROP_SEED_WITH_KEY").format({ - "Q": get_action_key_name("drop") + "Q": GameInfo.get_action_key_name("drop") }), (func(): return ( @@ -195,24 +195,3 @@ class Step: if succeeded: on_succeeded.call() return succeeded - -func get_action_key_name(action_name: String) -> String: - var events: Array[InputEvent] = InputMap.action_get_events(action_name) - - var saved_remapped_input = null - var existing_remapped_id: int = GameInfo.settings_data.action_remapped.find(action_name) - if existing_remapped_id != -1: - saved_remapped_input = GameInfo.settings_data.input_remapped[existing_remapped_id] - - var event: InputEvent = null - if saved_remapped_input: - event = saved_remapped_input - else: - event = null if events.size() == 0 else events[0] - - var input_name: String = "UNASSIGNED" if event == null else event.as_text() - if event is InputEventKey: - var keycode = DisplayServer.keyboard_get_keycode_from_physical(event.physical_keycode) - input_name = OS.get_keycode_string(keycode) - - return input_name diff --git a/stages/3d_scenes/astra_base/scripts/astra_base.gd b/stages/3d_scenes/astra_base/scripts/astra_base.gd index a75963a..3d2e35d 100644 --- a/stages/3d_scenes/astra_base/scripts/astra_base.gd +++ b/stages/3d_scenes/astra_base/scripts/astra_base.gd @@ -30,8 +30,6 @@ func _ready(): Input.mouse_mode = Input.MOUSE_MODE_CAPTURED set_room_part_number() - arrive_player() - func spawn_player(): chosen_incubator_id = randi_range(0, len(%Incubators.get_children()) - 1) var new_player_incubator := %Incubators.get_children()[chosen_incubator_id] as Incubator diff --git a/stages/3d_scenes/astra_end_base/assets/3d/astra_end_base.blend b/stages/3d_scenes/astra_end_base/assets/3d/astra_end_base.blend index 7c2de2aa6859d0d3002ce41ef9aba58485354ac0..4f4aa8d0eacaa0d09e26b76111ff85d80a7c3a89 100644 GIT binary patch delta 24436 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 delta 22462 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 |4N ze&@fuS0?FAY}1j3C$?#89&=dxXky!*A&p~eKREa1A8W3K*Sxu1V{P%moBz$ZFJQaI z<37h|DWUGo-nFu-H^0_c`>KJbTjEu35^oXPi5?QUQ`w1=L0CA8wL>wlLti`L2F1PXPrCmF;bKZN*Audtm{Uck--5uI`TTg(08$*9f zbmAM&x+h*Z{N0xej{kn}kkjL1KXUw=pI%w}@q5}9nwopJNRBt&+$ZIFy}MH~-Kl*- zC5!!)e`|Z&_RN3mO{lX-yq)70O=&70pZ<#<_O$=k=hg);k5lvU@2idewXYrjX5)D8 z%j0jz{dfNR`u(S0JO0gIsMfz=<>iU>FEH7-;OWNkw>ExWK-s^qG^kp(ezkFYE5*L} ztKB&M^~UixwooJRZ+heSH?JLkx^dh^3fjf@QgC3cZI^b<0qL)1-#sS%(nx!!hLNNb z`@w$c17mFqsqQOdQ_0Ijd#99TqHQbv=-l=LQqH;UTGFx^k9}dbe#}$~Fz0T8xps*3 z_ZIJJN&n4UJ3!L-#k&Wka-+BQADFIRf4M6gtuRUCXOt3cwU0|X(+|A2{prRzDewR< zJN)PG?3XNUdD946Z3ju?`BBrIUvKpIX0xY;y|$I+uePt**lYjmc1hW>=h&_-4eQ^u zbEADM{b=u-`=wD&ZF9|g@2-92sr~7@(g(kO=a@7U!JjHgrUBdcOOGS?Chol}`Bj}b zC^`K0ovl*y=SO$0oru&PepmYWRlb-9>A!z5|2>7|+{{4x!(-CdrSj>2EY;T5 z_*_a{cyEui@~-QF5QfBA!iX>? zObAoLj5tS_6BfjI;sRkwSP|C5MZ$)#CF}@$!hvukoCs&ag>WU@2zSDR@FctlZ^CD- KwbJ+W&Ho4Ww>R$q diff --git a/stages/3d_scenes/astra_end_base/assets/3d/astra_end_base.blend1 b/stages/3d_scenes/astra_end_base/assets/3d/astra_end_base.blend1 index ce38bb45be8c27e245096a42093a6780c4c7da0f..3d18ec7b001f34894a983429ebbf1a1826ee86a4 100644 GIT binary patch delta 30463 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 A9RL6T delta 28442 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 ZBFPrNl^qt_ZZ5P>LL^%X?NglG{tq}}-V6W$ diff --git a/stages/3d_scenes/cockpit_scene/scripts/cockpit.gd b/stages/3d_scenes/cockpit_scene/scripts/cockpit.gd index f5d7cc4..e13b474 100644 --- a/stages/3d_scenes/cockpit_scene/scripts/cockpit.gd +++ b/stages/3d_scenes/cockpit_scene/scripts/cockpit.gd @@ -67,7 +67,7 @@ func update_dialogs(): phone_dialogs.append(story_dialog) - if len(phone_dialogs): + if len(phone_dialogs) and Dialogic.current_timeline == null: await get_tree().create_timer(randf_range(0.5,3.)).timeout ring_phone() diff --git a/stages/3d_scenes/relay_base/scripts/relay_base.gd b/stages/3d_scenes/relay_base/scripts/relay_base.gd index 6648219..0525f6f 100644 --- a/stages/3d_scenes/relay_base/scripts/relay_base.gd +++ b/stages/3d_scenes/relay_base/scripts/relay_base.gd @@ -46,6 +46,7 @@ func get_incubators() -> Array[Incubator]: return incubators func _on_exit_clicked(): + %Exit.interactable = false if dead_orchid: GameInfo.game_data.dead_orchid_position = dead_orchid.position GameInfo.game_data.dead_orchid_rotation = dead_orchid.rotation diff --git a/stages/3d_scenes/ship_garage/ship_garage.tscn b/stages/3d_scenes/ship_garage/ship_garage.tscn index 0c44fca..037effa 100644 --- a/stages/3d_scenes/ship_garage/ship_garage.tscn +++ b/stages/3d_scenes/ship_garage/ship_garage.tscn @@ -437,6 +437,7 @@ unique_name_in_owner = true custom_maximum_size = Vector2(-1, 1080) layout_mode = 2 stream = ExtResource("8_ovhgo") +volume_db = -10.0 expand = true bus = &"Sfx" diff --git a/stages/terrain/region/scripts/plant_grid.gd b/stages/terrain/region/scripts/plant_grid.gd index 4c81bf0..4f184b8 100644 --- a/stages/terrain/region/scripts/plant_grid.gd +++ b/stages/terrain/region/scripts/plant_grid.gd @@ -1,13 +1,13 @@ extends Sprite2D class_name PlantGrid -const GRID_SHIFT : int = roundi(Region.TILE_SIZE / 3.) +const GRID_SHIFT : int = roundi(Region.TILE_SIZE / 2.) const GRID_SIZE : int = Region.TILE_SIZE const POINT_RADIUS : int = 5 const POINT_COLOR : Color = Color.WHITE const POINT_VISIBILITY_RADIUS : int = 200 const POINT_FULL_OPACITY_RADIUS : int = 100 -const POINT_RANDOM_SHIFT = roundi(Region.TILE_SIZE / 2.) +const POINT_RANDOM_SHIFT = roundi(Region.TILE_SIZE / 3.) const REFRESH_TIME : float = 2. diff --git a/translation/game/gui.csv b/translation/game/gui.csv index 3ba63b1..64562b0 100644 --- a/translation/game/gui.csv +++ b/translation/game/gui.csv @@ -397,7 +397,7 @@ MODEL_HAS_BEEN_UPGRADED,Model has been upgraded,Votre modèle à été amélior UPGRADED_MAX_ENERGY_TO_%d,Max energy set to [b]%d[/b],[b]%d[/b] d'énergie maximale UPGRADED_INVENTORY_SIZE_TO_%d,Inventory size set to [b]%d[/b],[b]%d[/b] de taille d'inventaire NEW_MUTATION,New Mutation,Nouvelle Mutation -THIS_MUTATION_CAN_NOW_APPEAR_ON_SEEDS,"This mutation can now appear on seeds","Cette mutation pourra désormais apparaître sur les graines" +THIS_MUTATION_CAN_NOW_APPEAR_ON_SEEDS,"This mutation can now appear on seeds in all game modes","Cette mutation pourra désormais apparaître sur les graines dans tous les modes de jeu" NEW_ARTEFACT,New Artefact,Nouvel Artefact ADD_A_PASSIVE_EFFECT_FOR_THIS_TRAVEL,"Add a passive effect for this travel, retrieve all your artifacts on the ship","Ajoute un effet passif pour ce voyage, retrouvez tous vos artefacts sur le vaisseau" PILE,Pile,Pile,