Ajout de la cinématique de début et refonte du système audio

Et toujours un peu de correction de bug par ci par là
This commit is contained in:
2026-02-11 21:11:32 +01:00
parent 4b8e59ee56
commit c992950789
54 changed files with 1186 additions and 882 deletions

View File

@@ -18,7 +18,7 @@ force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_mode=2
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@@ -3,12 +3,15 @@ extends Node
const MIN_VOLUME = -60.
const MAX_VOLUME = 24.
const DEFAULT_FADE_TIME : float = 0.5
@onready var settings : SettingsData = GameInfo.settings_data
@export var default_fade_time = 0.5
@export var playing_music : AudioStreamPlayer = null
@export var playing_ambiance : AudioStreamPlayer = null
var music_action : AudioAction
var ambiance_action : AudioAction
var playing_music : AudioStreamPlayer = null
var playing_ambiance : AudioStreamPlayer = null
var default_volumes := {}
@@ -23,23 +26,93 @@ func _ready():
)
SceneManager.scene_loaded.connect(_on_change_scene)
Dialogic.timeline_started.connect(_on_timeline_started)
Dialogic.timeline_ended.connect(_on_timeline_ended)
func _process(_d):
if music_action:
playing_music = process_audio_action(
music_action,
%Musics,
playing_music
)
music_action = null
if ambiance_action:
playing_ambiance = process_audio_action(
ambiance_action,
%Ambiance,
playing_ambiance
)
ambiance_action = null
func process_audio_action(
audio_action : AudioAction,
player_search_node: Node,
current_player: AudioStreamPlayer = null
) -> AudioStreamPlayer:
if audio_action is AudioLaunch:
return process_audio_launch(audio_action, player_search_node, current_player)
elif audio_action is AudioStop and current_player and current_player.playing:
stop_player(current_player)
return null
func process_audio_launch(
audio_launch : AudioLaunch,
player_search_node: Node,
current_player: AudioStreamPlayer = null,
) -> AudioStreamPlayer:
var player = player_search_node.find_child(audio_launch.player_name)
if not player:
printerr("Player %s not found in category %s" % [audio_launch.player_name, player_search_node.name])
return null
if current_player and current_player.playing and current_player.name == audio_launch.player_name:
return current_player
elif current_player:
stop_player(current_player)
start_player(player, audio_launch.from_random_time, audio_launch.fade_time)
return player
func _on_change_scene(scene : Scene):
play_ambiance()
stop_ambiance()
match scene.scene_id:
"TITLE":
play_music("Title")
play_music("Title", false, 0.0)
"REGION":
play_music("Region")
play_ambiance("Exterior")
play_music("Region", true)
play_ambiance("Exterior", true)
"COCKPIT":
play_music("Truck")
play_music("Truck", true)
func _on_timeline_started():
var timeline_name = Dialogic.current_timeline.resource_path.split("/")[-1].trim_suffix(".dtl")
# Timeline name et le nom du fichier de timeline, par exemple demeter_intro
# Amuse toi Niels ;)
# Amuse toi Nilou ;)
func _on_timeline_ended():
_on_change_scene(SceneManager.actual_scene)
func play_music(player_name : String = "", from_random_time := false, fade_time := DEFAULT_FADE_TIME):
music_action = AudioLaunch.new(
player_name,
from_random_time,
fade_time
)
func stop_music():
music_action = AudioStop.new()
func play_ambiance(player_name : String = "", from_random_time := false, fade_time := DEFAULT_FADE_TIME):
ambiance_action = AudioLaunch.new(
player_name,
from_random_time,
fade_time
)
func stop_ambiance():
ambiance_action = AudioStop.new()
func fetch_default_volumes():
var all_players := get_all_players()
@@ -79,13 +152,30 @@ func get_players_from_node(node : Node) -> Array[AudioStreamPlayer]:
streams.append(c)
return streams
func set_volume(player : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween:
func set_volume(player : AudioStreamPlayer, to : float, fade_time := 0.0) -> Tween:
var fade_tween : Tween = get_tree().create_tween()
fade_tween.tween_property(player, "volume_db", to, fade_time)
return fade_tween
func start_player(player: AudioStreamPlayer, from_random_time = false, fade_time = DEFAULT_FADE_TIME):
if player and not player.playing:
player.play(
0.0 if not from_random_time
else randf_range(0.0, player.stream.get_length())
)
if fade_time > 0.0:
player.volume_db = MIN_VOLUME
await set_volume(player, get_volume_from_parent(player), fade_time).finished
func stop_player(player : AudioStreamPlayer, fade_time = DEFAULT_FADE_TIME):
if player and player.playing:
if fade_time > 0.0:
await set_volume(player, MIN_VOLUME, fade_time).finished
player.stop()
player.volume_db = get_volume_from_parent(player)
func reset_volume(player : AudioStreamPlayer):
player.volume_db = get_volume_from_parent(player)
@@ -96,36 +186,23 @@ func play_sfx(sfx_name : String):
else:
printerr("Sfx %s not found" % sfx_name)
func play_music(music_name : String = ""):
var old_music = playing_music
playing_music = null
if old_music:
await set_volume(old_music, MIN_VOLUME).finished
if old_music and old_music != playing_music:
old_music.stop()
reset_volume(old_music)
if music_name:
var player := %Musics.find_child(music_name) as AudioStreamPlayer
if player:
playing_music = player
player.play()
set_volume(player, get_volume_from_parent(player))
else:
printerr("Music %s not found" % music_name)
class AudioAction:
pass
func play_ambiance(ambiance_name : String = ""):
var old_ambiance = playing_ambiance
playing_ambiance = null
if old_ambiance:
await set_volume(old_ambiance, MIN_VOLUME).finished
if old_ambiance and old_ambiance != playing_ambiance:
old_ambiance.stop()
reset_volume(old_ambiance)
if ambiance_name:
var player := %Ambiance.find_child(ambiance_name) as AudioStreamPlayer
if player:
playing_ambiance = player
player.play()
set_volume(player, get_volume_from_parent(player))
else:
printerr("Ambiance %s not found" % ambiance_name)
class AudioLaunch extends AudioAction:
var player_name : String
var from_random_time : bool
var fade_time : float
func _init(
_player_name : String,
_from_random_time := false,
_fade_time := DEFAULT_FADE_TIME,
):
player_name = _player_name
from_random_time = _from_random_time
fade_time = _fade_time
class AudioStop extends AudioAction:
pass

View File

@@ -11,9 +11,7 @@ signal current_region_data_updated(p : RegionData)
@export var max_mutations_by_plant : int = 2
@export var dialogs_done : Array[String] = []
@export var actual_scene : Scene = null
@export var last_game_scene : Scene = null
func start_run():
player_data.inventory.clear()

View File

@@ -1,7 +1,7 @@
extends Node
const SAVE_GAME_LOCATION = "res://stw_demo_save.tres"
const SAVE_SETTINGS_LOCATION = "res://stw_settings.tres"
const SAVE_GAME_LOCATION = "user://stw_demo_save.tres"
const SAVE_SETTINGS_LOCATION = "user://stw_settings.tres"
var game_loaded = false

View File

@@ -3,19 +3,20 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://eug5icp6t1h3"
path="res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.ctex"
path.s3tc="res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.s3tc.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://common/icons/arrow-narrow-up.svg"
dest_files=["res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.ctex"]
dest_files=["res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.s3tc.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
detect_3d/compress_to=0
svg/scale=2.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=3 uid="uid://dac5wte80dwj0"]
[gd_scene format=3 uid="uid://dac5wte80dwj0"]
[ext_resource type="Script" uid="uid://bb44144ckt2w7" path="res://common/scene_manager/scripts/scene_manager.gd" id="1_1c0qu"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="2_c1lr7"]
@@ -7,7 +7,8 @@
[ext_resource type="Resource" uid="uid://boqgwjyxyb45r" path="res://common/scene_manager/scenes/region.tres" id="5_ytog4"]
[ext_resource type="Resource" uid="uid://c27wenetitwm" path="res://common/scene_manager/scenes/region_selection.tres" id="6_chs32"]
[ext_resource type="Resource" uid="uid://diro74w272onp" path="res://common/scene_manager/scenes/title.tres" id="7_ol3d5"]
[ext_resource type="Resource" uid="uid://jegdqnd2sqi2" path="res://common/scene_manager/scenes/astra.tres" id="8_e28ni"]
[node name="SceneManager" type="Node"]
[node name="SceneManager" type="Node" unique_id=1630600782]
script = ExtResource("1_1c0qu")
scenes = Array[ExtResource("2_c1lr7")]([ExtResource("3_e28ni"), ExtResource("4_msho1"), ExtResource("5_ytog4"), ExtResource("6_chs32"), ExtResource("7_ol3d5")])
scenes = Array[ExtResource("2_c1lr7")]([ExtResource("3_e28ni"), ExtResource("4_msho1"), ExtResource("5_ytog4"), ExtResource("6_chs32"), ExtResource("7_ol3d5"), ExtResource("8_e28ni")])

View File

@@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="Scene" format=3 uid="uid://jegdqnd2sqi2"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_114vb"]
[resource]
script = ExtResource("1_114vb")
scene_id = "ASTRA"
scene_path = "res://stages/3d_scenes/astra_base/astra_base.tscn"
mouse_captured = true
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -1,4 +1,4 @@
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://diro74w272onp"]
[gd_resource type="Resource" script_class="Scene" format=3 uid="uid://diro74w272onp"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_48g2j"]
@@ -6,4 +6,5 @@
script = ExtResource("1_48g2j")
scene_id = "TITLE"
scene_path = "res://stages/title_screen/title_screen.tscn"
need_to_be_saved = false
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -4,4 +4,5 @@ class_name Scene
@export var scene_id : String
@export_file_path() var scene_path : String
@export var mouse_captured := false
@export var need_terrain_generated := false
@export var need_terrain_generated := false
@export var need_to_be_saved = true

View File

@@ -5,6 +5,7 @@ extends Node
signal scene_loaded(scene : Scene)
signal scene_node_ready(scene : Scene)
var actual_scene = null
var loading_scene = false
var generating_node = false
var next_scene_node : Node
@@ -20,16 +21,21 @@ func search_scenes(scene_id : String) -> Scene:
else :
return scenes[scene_pos]
func change_scene(scene_id : String, with_loading = true):
if loading_scene or generating_node:
await scene_node_ready
func change_to_scene_id(scene_id : String, with_loading = true):
var scene = search_scenes(scene_id)
if not scene:
printerr("Scene %s not found" % scene_id)
return
GameInfo.game_data.actual_scene = scene
change_to_scene(scene, with_loading)
func change_to_scene(scene : Scene, with_loading = true):
if loading_scene or generating_node:
await scene_node_ready
actual_scene = scene
loading_scene = true
var scene_path_to_load = scene.scene_path
ResourceLoader.load_threaded_request(scene_path_to_load)
@@ -64,17 +70,21 @@ func change_scene(scene_id : String, with_loading = true):
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if scene.mouse_captured else Input.MOUSE_MODE_VISIBLE
GameInfo.update_inputs()
if actual_scene.need_to_be_saved:
GameInfo.game_data.last_game_scene = scene
GameInfo.save_game_data()
if with_loading:
LoadingScreen.hide_loading_screen()
func _process(_delta):
if loading_scene:
var progress = []
var load_status := ResourceLoader.load_threaded_get_status(GameInfo.game_data.actual_scene.scene_path, progress)
var load_status := ResourceLoader.load_threaded_get_status(actual_scene.scene_path, progress)
LoadingScreen.loading_value = progress[0]
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
loading_scene = false
scene_loaded.emit(GameInfo.game_data.actual_scene)
scene_loaded.emit(actual_scene)
if load_status == ResourceLoader.THREAD_LOAD_FAILED or load_status == ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
printerr()
elif generating_node:
@@ -85,4 +95,4 @@ func _process(_delta):
scene_node_ready.emit()
elif next_scene_node.is_node_ready():
generating_node = false
scene_node_ready.emit(GameInfo.game_data.actual_scene)
scene_node_ready.emit(actual_scene)