From 40696b6bd9a8b100c335091f87a084c85add4d28 Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 9 Aug 2026 11:22:35 -0400 Subject: [PATCH] Add character calls, settings controls, and gameplay fixes --- CREDITS.md | 4 + default_bus_layout.tres | 6 + docs/ASSET-PROVENANCE.md | 36 ++++ fishing/fishing_spot.gd | 50 +++++- fishing/fishing_surface_resolver.gd | 34 ++++ main/main.gd | 7 + main/main.tscn | 2 +- network/network_chat_service.gd | 152 ++++++++++++++++ network/network_profile_preferences.gd | 13 +- network/network_profile_service.gd | 20 +++ network/network_session.gd | 18 +- player/animalese_voice_profiles.gd | 24 +++ player/player.gd | 75 ++++++-- project.godot | 5 + scripts/portmaster/licenses/CREDITS.md | 4 + settings/player_settings.gd | 24 +++ settings/player_settings_manager.gd | 73 ++++++++ sound/dialogue/calls/bark.wav | Bin 0 -> 78856 bytes sound/dialogue/calls/bark.wav.import | 24 +++ sound/dialogue/calls/meow.wav | Bin 0 -> 106840 bytes sound/dialogue/calls/meow.wav.import | 24 +++ tests/shoreline_ambience_validation.gd | 2 +- ui/animalese_voice.gd | 1 + ui/chat_ui.gd | 21 ++- ui/fishing_shop.gd | 43 ++++- ui/fishing_shop.tscn | 9 +- ui/game_ui.gd | 88 ++++++++++ ui/profile_page.gd | 83 +++++++-- ui/settings/settings_bubble_page.gd | 18 +- ui/settings_panel.gd | 106 ++++++++++++ ui/settings_panel.tscn | 229 +++++++++++++++++++++++-- world/rain_ambience.gd | 2 +- world/shoreline_ambience.gd | 1 + 33 files changed, 1120 insertions(+), 78 deletions(-) create mode 100644 sound/dialogue/calls/bark.wav create mode 100644 sound/dialogue/calls/bark.wav.import create mode 100644 sound/dialogue/calls/meow.wav create mode 100644 sound/dialogue/calls/meow.wav.import diff --git a/CREDITS.md b/CREDITS.md index 4f8b351..ea0a6f5 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -39,6 +39,10 @@ written with or without assistance. https://freesound.org/s/852826/ - Rain Loop Ontario by Ayton -- https://freesound.org/s/212799/ -- License: Attribution 3.0 +- Dog_Bark.wav by ivolipa -- https://freesound.org/s/328729/ -- License: + Creative Commons 0 +- Cat meow.m4a by Christyboy100 -- https://freesound.org/s/495694/ -- License: + Attribution 3.0 - “Quick Water Droplet” by qubodup, used for the bobber water-impact sound. Freesound sound 792931, Creative Commons Zero (CC0): https://freesound.org/s/792931/ diff --git a/default_bus_layout.tres b/default_bus_layout.tres index 665b0e9..d780a19 100644 --- a/default_bus_layout.tres +++ b/default_bus_layout.tres @@ -19,3 +19,9 @@ bus/2/mute = false bus/2/bypass_fx = false bus/2/volume_db = 0.0 bus/2/send = &"Master" +bus/3/name = &"Environment" +bus/3/solo = false +bus/3/mute = false +bus/3/bypass_fx = false +bus/3/volume_db = 0.0 +bus/3/send = &"Master" diff --git a/docs/ASSET-PROVENANCE.md b/docs/ASSET-PROVENANCE.md index 9c3bc76..3d3907a 100644 --- a/docs/ASSET-PROVENANCE.md +++ b/docs/ASSET-PROVENANCE.md @@ -36,6 +36,8 @@ locations only and must never appear in scenes or resources. | Manual-reeling loop | `audio/sfx/fishing/reeling.wav` | Edited from the same CC0 “Spinning reel.wav” source. | | Saltwater wave ambience | `audio/ambience/waves.wav` | “Gentle Ocean Waves Loop” by Freesound user kkenny101, sound 852826, CC0. | | Bobber water impact | `audio/sfx/fishing/bobber.wav` | “Quick Water Droplet” by Freesound user qubodup, sound 792931, CC0. | +| Character bark call | `sound/dialogue/calls/bark.wav` | Edited from `Dog_Bark.wav` by Freesound user ivolipa, sound 328729, CC0. | +| Character meow call | `sound/dialogue/calls/meow.wav` | Edited from `Cat meow.m4a` by Freesound user Christyboy100, sound 495694, Attribution 3.0. | ### Fishing fight loop source record @@ -91,6 +93,40 @@ locations only and must never appear in scenes or resources. - The downloaded source remains in the project owner's source-work archive; only the finished runtime sound ships in the game. +### Character-call source records + +#### Bark + +- Source page: https://freesound.org/s/328729/ +- Creator: ivolipa +- Source title: `Dog_Bark.wav` +- License: Creative Commons Zero (CC0) +- Downloaded source filename: `328729__ivolipa__dog_bark.wav` +- Downloaded source SHA-256: + `c3d542dee7bfcc1901428e0c1408c0bd522d778d8e5e1dbca156cab008f3d712` +- Runtime edit source/destination SHA-256: + `5ac2f32f33724a2fc232d725c5c37d4cfe3e93b3c1f19aa4177d2c8e3009ec78` +- Runtime format: 44.1 kHz, 16-bit, stereo PCM WAV; 0.446780 seconds; + one-shot. + +#### Meow + +- Source page: https://freesound.org/s/495694/ +- Creator: Christyboy100 +- Source title: `Cat meow.m4a` +- License: Attribution 3.0 +- Downloaded source filename: `495694__christyboy100__cat-meow.m4a` +- Downloaded source SHA-256: + `afa3f6ef7afa2f7fee1e634d5505d2101cbba4421f8d8ff9adf562939c7a18f8` +- Converted working WAV SHA-256: + `a505e6e230e7d9d76b65c46270d97a35a1acc510b43aa5e7343d7b04f424cade` +- Runtime edit source/destination SHA-256: + `cce22ce1fbbc9325126a153aedc4526fde1aacf78780574fb432197dd44eb6b3` +- Runtime format: 44.1 kHz, 16-bit, stereo PCM WAV; 0.605420 seconds; + one-shot. +- The downloaded sources and working edits remain in the project owner's + source-work archive; only the finished runtime sounds ship in the game. + ## Generated resources Godot `.import` sidecars and deterministic shoreline `.tres` meshes are derived diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index cadd214..988c88c 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -153,6 +153,7 @@ var _cast_charge: float = 0.0 var _cast_direction: Vector3 = Vector3.FORWARD var _cast_origin_position: Vector3 var _cast_target: Vector3 +var _preferred_cast_arc_height: float = -1.0 var _withdrawal_endpoint: Vector3 var _withdrawal_progress: float = 0.0 var _withdrawal_input_held: bool = false @@ -402,6 +403,11 @@ func begin_water_recovery() -> void: FishingState.FIGHTING, ]: _cancel_attempt() + # Recovery replaces the normal rod-return presentation. Finish the local + # cleanup now so its temporary movement lock is not captured and restored + # after the player respawns. + if state != FishingState.READY: + _finalize_attempt_cleanup("") elif state == FishingState.SHOWING_CATCH: _secure_showcase_catch_for_recovery() @@ -622,7 +628,10 @@ func _begin_aiming(player: PlayerType) -> void: _cast_target = _calculate_cast_target(minimum_cast_distance) state = FishingState.AIMING_CAST status_changed.emit("") - _cast_path_is_clear = is_cast_path_clear(_cast_origin_position, _cast_target) + _cast_path_is_clear = is_cast_path_clear( + _get_cast_launch_position(), + _cast_target, + ) var target_is_fishable: bool = ( _aim_surface_sample.is_fishable() and _cast_path_is_clear ) @@ -750,7 +759,10 @@ func _update_cast_charge(delta: float) -> void: var maximum_distance: float = maxf(minimum_cast_distance, maximum_cast_distance) var distance: float = lerpf(minimum_cast_distance, maximum_distance, _cast_charge) _cast_target = _calculate_cast_target(distance) - _cast_path_is_clear = is_cast_path_clear(_cast_origin_position, _cast_target) + _cast_path_is_clear = is_cast_path_clear( + _get_cast_launch_position(), + _cast_target, + ) var target_is_fishable: bool = ( _aim_surface_sample.is_fishable() and _cast_path_is_clear ) @@ -770,8 +782,9 @@ func _confirm_cast() -> void: if state != FishingState.AIMING_CAST: return + var cast_launch_position := _get_cast_launch_position() _cast_path_is_clear = is_cast_path_clear( - _cast_origin_position, + cast_launch_position, _cast_target, ) var cast_is_invalid: bool = ( @@ -780,7 +793,7 @@ func _confirm_cast() -> void: var arrival_position: Vector3 = _cast_target if not _cast_path_is_clear: arrival_position = _resolve_cast_impact_position( - _cast_origin_position, + cast_launch_position, _cast_target, ) if _active_player != null: @@ -1344,6 +1357,14 @@ func _capture_cast_direction(player: PlayerType) -> Vector3: return direction.normalized() +func _get_cast_launch_position() -> Vector3: + if _active_player != null: + var rod_tip: Marker3D = _active_player.get_fishing_rod_tip() + if rod_tip != null and is_instance_valid(rod_tip): + return rod_tip.global_position + return _cast_origin_position + + func _calculate_cast_target(distance: float) -> Vector3: var query_position := Vector3( _cast_origin_position.x + _cast_direction.x * distance, @@ -1399,17 +1420,25 @@ func is_target_fishable(target: Vector3) -> bool: func _is_cast_target_valid(target: Vector3) -> bool: return ( is_target_fishable(target) - and is_cast_path_clear(_cast_origin_position, target) + and is_cast_path_clear(_get_cast_launch_position(), target) ) func is_cast_path_clear(origin: Vector3, target: Vector3) -> bool: - return _surface_resolver.find_first_cast_collision( + if _preferred_cast_arc_height < 0.0: + _preferred_cast_arc_height = maxf( + _presentation.cast_arc_height, + 0.0, + ) + var resolved_arc: Dictionary = _surface_resolver.resolve_cast_arc( get_world_3d().direct_space_state, origin, target, - _presentation.cast_arc_height, - ).is_empty() + _preferred_cast_arc_height, + ) + _presentation.cast_arc_height = float(resolved_arc["arc_height"]) + var collision: Dictionary = resolved_arc["collision"] + return collision.is_empty() func _resolve_cast_impact_position(origin: Vector3, target: Vector3) -> Vector3: @@ -1540,6 +1569,11 @@ func _on_network_cast_accepted( target: Vector3, ) -> void: if state != FishingState.CASTING: + # A cast response can arrive after water recovery has already cancelled + # its local presentation. Do not leave that late authoritative attempt + # alive with its movement lock still applied. + if _network_fishing != null and _network_fishing.has_local_attempt(): + _network_fishing.cancel_local_attempt("") return _cast_target = target _bobber_water_position = target diff --git a/fishing/fishing_surface_resolver.gd b/fishing/fishing_surface_resolver.gd index 08818ce..a764c58 100644 --- a/fishing/fishing_surface_resolver.gd +++ b/fishing/fishing_surface_resolver.gd @@ -101,6 +101,40 @@ func find_first_cast_collision( return {} +func resolve_cast_arc( + space_state: PhysicsDirectSpaceState3D, + origin: Vector3, + target: Vector3, + preferred_arc_height: float, +) -> Dictionary: + var raised_arc_height: float = maxf(preferred_arc_height, 0.0) + var raised_collision := find_first_cast_collision( + space_state, + origin, + target, + raised_arc_height, + ) + if raised_collision.is_empty() or is_zero_approx(raised_arc_height): + return { + "arc_height": raised_arc_height, + "collision": raised_collision, + } + + # A canopy or pier roof can intersect the decorative raised arc even when + # the direct path out toward the water is unobstructed. Prefer that low cast + # instead of visibly sending the bobber and line upward into the ceiling. + var direct_collision := find_first_cast_collision( + space_state, + origin, + target, + 0.0, + ) + return { + "arc_height": 0.0, + "collision": direct_collision, + } + + func resolve_withdrawal_surface( space_state: PhysicsDirectSpaceState3D, current_position: Vector3, diff --git a/main/main.gd b/main/main.gd index e62acfb..c4a6089 100644 --- a/main/main.gd +++ b/main/main.gd @@ -1123,6 +1123,13 @@ func _process(_delta: float) -> void: func _apply_runtime_settings(settings: PlayerSettingsType) -> void: if settings == null: return + var requested_window_mode: DisplayServer.WindowMode = ( + DisplayServer.WINDOW_MODE_FULLSCREEN + if settings.fullscreen_enabled + else DisplayServer.WINDOW_MODE_WINDOWED + ) + if DisplayServer.window_get_mode() != requested_window_mode: + DisplayServer.window_set_mode(requested_window_mode) _apply_world_pixelation(settings.world_pixel_size) _ui_pixelation.set_pixel_size(settings.ui_pixel_size) _ui_pixelation.set_on_screen_keyboard_enabled( diff --git a/main/main.tscn b/main/main.tscn index af6f663..6f52273 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -405,7 +405,7 @@ script = ExtResource("54_shoreline_ambience") [node name="WavesAudio" type="AudioStreamPlayer" parent="ShorelineAmbience" unique_id=193530658] unique_name_in_owner = true stream = ExtResource("55_waves") -bus = &"SFX" +bus = &"Environment" [node name="WorldPixelationPostprocess" parent="." unique_id=344378000 instance=ExtResource("16_world_pixelation")] unique_name_in_owner = true diff --git a/network/network_chat_service.gd b/network/network_chat_service.gd index bed0d01..368c529 100644 --- a/network/network_chat_service.gd +++ b/network/network_chat_service.gd @@ -4,17 +4,37 @@ extends Node const BURST_COUNT: int = 3 const WINDOW_COUNT: int = 5 const WINDOW_SECONDS: float = 10.0 +const CALL_COOLDOWN_MILLISECONDS: int = 180 +const CALL_PITCH_VARIANTS: Array[float] = [ + 0.96, + 1.03, + 0.985, + 1.055, + 1.0, + 0.975, + 1.04, +] +const VoiceProfilesType = preload( + "res://player/animalese_voice_profiles.gd" +) signal message_received(message: Dictionary) signal local_message_confirmed(message: Dictionary) signal send_rejected(message: String) signal history_replaced(messages: Array[Dictionary]) +signal character_call_received( + peer_id: int, + call_id: String, + pitch_scale: float, +) var _session: NetworkSession var _history: Array[Dictionary] = [] var _seen_messages: Dictionary[String, bool] = {} var _request_ledgers: Dictionary[int, Dictionary] = {} var _rate_times: Dictionary[int, Array] = {} +var _last_call_msec: Dictionary[int, int] = {} +var _call_variant_indices: Dictionary[int, int] = {} var _sequence: int = 0 var _peer_names: Dictionary[int, String] = {} var _relationships: PlayerRelationshipStore @@ -79,6 +99,134 @@ func send_local_message(body: String) -> bool: return true +func send_local_character_call(call_id: String) -> bool: + if ( + _session == null + or not _session.is_gameplay_session_active() + or not VoiceProfilesType.is_valid_call(call_id) + or ( + not _session.is_host() + and not _session.supports_server_capability( + NetworkChatProtocol.CAPABILITY + ) + ) + ): + return false + var request := { + "request_id": _new_id("character_call"), + "session_id": _session.get_session_id(), + "call_id": call_id, + "sender_fingerprint": _session.get_local_identity_fingerprint(), + } + request["sender_signature"] = _session.sign_local_action( + "character_call", _character_call_signature_fields(request) + ) + if _session.is_host(): + _handle_character_call(_session.get_local_peer_id(), request) + else: + submit_character_call.rpc_id(1, request) + return true + + +@rpc("any_peer", "call_remote", "reliable", NetworkChatProtocol.RELIABLE_CHANNEL) +func submit_character_call(data: Dictionary) -> void: + var sender_id := multiplayer.get_remote_sender_id() + if _session.is_host() and _session.is_authenticated_peer(sender_id): + _handle_character_call(sender_id, data) + + +func _handle_character_call(peer_id: int, data: Dictionary) -> void: + if ( + typeof(data.get("request_id")) != TYPE_STRING + or str(data["request_id"]).is_empty() + or str(data["request_id"]).length() > 64 + or typeof(data.get("session_id")) != TYPE_STRING + or str(data["session_id"]) != _session.get_session_id() + or typeof(data.get("call_id")) != TYPE_STRING + or not VoiceProfilesType.is_valid_call(str(data["call_id"])) + or typeof(data.get("sender_fingerprint")) != TYPE_STRING + or typeof(data.get("sender_signature")) != TYPE_PACKED_BYTE_ARRAY + ): + return + var record := _session.get_peer_record(peer_id) + if ( + record == null + or record.identity_fingerprint != str(data["sender_fingerprint"]) + or not _session.verify_peer_action( + peer_id, + "character_call", + _character_call_signature_fields(data), + data["sender_signature"], + ) + or not _consume_character_call_rate(peer_id) + ): + return + var pitch_scale: float = _next_character_call_pitch(peer_id) + _apply_character_call(peer_id, str(data["call_id"]), pitch_scale) + receive_character_call.rpc( + peer_id, + str(data["call_id"]), + pitch_scale, + ) + + +@rpc("authority", "call_remote", "reliable", NetworkChatProtocol.RELIABLE_CHANNEL) +func receive_character_call( + peer_id: int, + call_id: String, + pitch_scale: float, +) -> void: + _apply_character_call(peer_id, call_id, pitch_scale) + + +func _apply_character_call( + peer_id: int, + call_id: String, + pitch_scale: float, +) -> void: + if ( + not VoiceProfilesType.is_valid_call(call_id) + or pitch_scale < 0.9 + or pitch_scale > 1.1 + or _session == null + or not _session.is_gameplay_session_active() + ): + return + var record := _session.get_peer_record(peer_id) + if record == null or is_sender_filtered(record.identity_fingerprint): + return + character_call_received.emit(peer_id, call_id, pitch_scale) + + +func _next_character_call_pitch(peer_id: int) -> float: + var variant_index: int = _call_variant_indices.get(peer_id, 0) + var pitch_scale: float = CALL_PITCH_VARIANTS[ + variant_index % CALL_PITCH_VARIANTS.size() + ] + _call_variant_indices[peer_id] = variant_index + 1 + return pitch_scale + + +func _consume_character_call_rate(peer_id: int) -> bool: + var now_msec: int = Time.get_ticks_msec() + var last_msec: int = _last_call_msec.get( + peer_id, now_msec - CALL_COOLDOWN_MILLISECONDS + ) + if now_msec - last_msec < CALL_COOLDOWN_MILLISECONDS: + return false + _last_call_msec[peer_id] = now_msec + return true + + +func _character_call_signature_fields(data: Dictionary) -> Array: + return [ + str(data.get("session_id", "")), + str(data.get("request_id", "")), + str(data.get("sender_fingerprint", "")), + str(data.get("call_id", "")), + ] + + func broadcast_system_message(body: String) -> bool: if _session == null or not _session.is_host(): return false @@ -272,6 +420,8 @@ func _on_peer_authenticated(peer_id: int, display_name: String) -> void: func _on_peer_removed(peer_id: int) -> void: _request_ledgers.erase(peer_id) _rate_times.erase(peer_id) + _last_call_msec.erase(peer_id) + _call_variant_indices.erase(peer_id) if not _session.is_host(): return var display_name: String = _peer_names.get(peer_id, "Player") @@ -329,6 +479,8 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _seen_messages.clear() _request_ledgers.clear() _rate_times.clear() + _last_call_msec.clear() + _call_variant_indices.clear() _peer_names.clear() _sequence = 0 history_replaced.emit([]) diff --git a/network/network_profile_preferences.gd b/network/network_profile_preferences.gd index 2c3924e..5ecb6fd 100644 --- a/network/network_profile_preferences.gd +++ b/network/network_profile_preferences.gd @@ -9,6 +9,7 @@ var profile_id: String = "" var display_name: String = "Player" var voice_id: String = VoiceProfilesType.DEFAULT_ID var speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID +var call_id: String = VoiceProfilesType.DEFAULT_CALL_ID var created_at_unix: int = 0 var _profile_path := "" var _expected_hash := "" @@ -55,37 +56,43 @@ func load_or_create() -> bool: display_name = "Player" voice_id = VoiceProfilesType.DEFAULT_ID speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID + call_id = VoiceProfilesType.DEFAULT_CALL_ID created_at_unix = int(Time.get_unix_time_from_system()) return _save_atomic() func set_display_name(value: String) -> bool: - return set_profile_identity(value, voice_id, speech_speed_id) + return set_profile_identity(value, voice_id, speech_speed_id, call_id) func set_profile_identity( value: String, selected_voice_id: String, selected_speech_speed_id: String, + selected_call_id: String, ) -> bool: var clean_name: String = value.strip_edges() if ( not is_valid_display_name(clean_name) or not VoiceProfilesType.is_valid(selected_voice_id) or not VoiceProfilesType.is_valid_speed(selected_speech_speed_id) + or not VoiceProfilesType.is_valid_call(selected_call_id) ): return false var previous_name: String = display_name var previous_voice_id: String = voice_id var previous_speech_speed_id: String = speech_speed_id + var previous_call_id: String = call_id display_name = clean_name voice_id = selected_voice_id speech_speed_id = selected_speech_speed_id + call_id = selected_call_id if _save_atomic(): return true display_name = previous_name voice_id = previous_voice_id speech_speed_id = previous_speech_speed_id + call_id = previous_call_id return false @@ -140,6 +147,9 @@ func _load_existing() -> bool: speech_speed_id = VoiceProfilesType.sanitized_speed_id( str(data.get("speech_speed_id", VoiceProfilesType.DEFAULT_SPEED_ID)) ) + call_id = VoiceProfilesType.sanitized_call_id( + str(data.get("call_id", VoiceProfilesType.DEFAULT_CALL_ID)) + ) created_at_unix = int(data["created_at_unix"]) return true @@ -151,6 +161,7 @@ func _save_atomic() -> bool: "display_name": display_name, "voice_id": voice_id, "speech_speed_id": speech_speed_id, + "call_id": call_id, "created_at_unix": created_at_unix, } var result := PortableFileGuard.write_guarded( diff --git a/network/network_profile_service.gd b/network/network_profile_service.gd index 4a0a5bd..86b1be1 100644 --- a/network/network_profile_service.gd +++ b/network/network_profile_service.gd @@ -24,6 +24,7 @@ var _spawn_service: PlayerSpawnService var _pending_apply: Dictionary[String, Dictionary] = {} var _pending_voice_ids: Dictionary[String, String] = {} var _pending_speech_speed_ids: Dictionary[String, String] = {} +var _pending_call_ids: Dictionary[String, String] = {} var _host_pending_apply: Dictionary[String, Dictionary] = {} var _latest_check_id: String = "" var _latest_check_name: String = "" @@ -65,6 +66,10 @@ func get_persisted_speech_speed_id() -> String: return _preferences.speech_speed_id +func get_persisted_call_id() -> String: + return _preferences.call_id + + func get_identity_fingerprint() -> String: return ( _session.get_local_identity_fingerprint() @@ -104,6 +109,7 @@ func apply_profile( use_anyway: bool, voice_id: String = VoiceProfilesType.DEFAULT_ID, speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID, + call_id: String = VoiceProfilesType.DEFAULT_CALL_ID, ) -> bool: var clean_name := display_name.strip_edges() if ( @@ -111,6 +117,7 @@ func apply_profile( or not CharacterCustomizationCatalog.validate_snapshot(appearance) or not VoiceProfilesType.is_valid(voice_id) or not VoiceProfilesType.is_valid_speed(speech_speed_id) + or not VoiceProfilesType.is_valid_call(call_id) ): apply_finished.emit(false, "Check the player name and appearance choices.") return false @@ -129,6 +136,7 @@ func apply_profile( _pending_apply[request_id] = request _pending_voice_ids[request_id] = voice_id _pending_speech_speed_ids[request_id] = speech_speed_id + _pending_call_ids[request_id] = call_id if _session == null or not _session.is_gameplay_session_active(): _apply_local_result(request_id, true, "", false, PackedStringArray()) elif _session.is_host(): @@ -287,12 +295,14 @@ func _apply_local_result( _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) + _pending_call_ids.erase(request_id) conflict_result.emit(request_id, conflict, suggestions) apply_finished.emit(false, message) return var previous_name := _preferences.display_name var previous_voice_id := _preferences.voice_id var previous_speech_speed_id := _preferences.speech_speed_id + var previous_call_id := _preferences.call_id var requested_voice_id: String = _pending_voice_ids.get( request_id, VoiceProfilesType.DEFAULT_ID, @@ -301,14 +311,20 @@ func _apply_local_result( request_id, VoiceProfilesType.DEFAULT_SPEED_ID, ) + var requested_call_id: String = _pending_call_ids.get( + request_id, + VoiceProfilesType.DEFAULT_CALL_ID, + ) if not _preferences.set_profile_identity( str(request["display_name"]), requested_voice_id, requested_speech_speed_id, + requested_call_id, ): _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) + _pending_call_ids.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return if not _appearance_store.save_snapshot(request["appearance"]): @@ -316,15 +332,18 @@ func _apply_local_result( previous_name, previous_voice_id, previous_speech_speed_id, + previous_call_id, ) _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) + _pending_call_ids.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) + _pending_call_ids.erase(request_id) if _session != null and _session.is_gameplay_session_active(): if _session.is_host(): _session.apply_canonical_profile( @@ -451,6 +470,7 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _pending_apply.clear() _pending_voice_ids.clear() _pending_speech_speed_ids.clear() + _pending_call_ids.clear() _host_pending_apply.clear() _latest_check_id = "" _latest_check_name = "" diff --git a/network/network_session.gd b/network/network_session.gd index 27b599f..b747a32 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -8,7 +8,7 @@ const DEFAULT_TRANSPORT_MAX_CLIENTS: int = 31 const CONNECTION_TIMEOUT_SECONDS: float = 10.0 const AUTHENTICATION_TIMEOUT_SECONDS: float = 60.0 const INPUT_INTERVAL: float = 1.0 / 30.0 -const SNAPSHOT_INTERVAL: float = 1.0 / 20.0 +const SNAPSHOT_INTERVAL: float = 1.0 / 30.0 signal state_changed(state: State) signal status_message_changed(message: String) @@ -574,9 +574,13 @@ func apply_canonical_profile( var appearance_changed := _registry.update_appearance(peer_id, appearance) if name_changed: peer_display_name_changed.emit(peer_id, display_name) - if name_changed and appearance_changed: + if appearance_changed: + var avatar: Player = _spawn_service.get_avatar(peer_id) + if avatar != null: + avatar.apply_appearance_snapshot(appearance) + if name_changed or appearance_changed: peer_profile_changed.emit(peer_id, display_name, appearance.duplicate(true)) - return name_changed and appearance_changed + return name_changed or appearance_changed @rpc("any_peer", "call_remote", "reliable", 0) @@ -1018,6 +1022,14 @@ func submit_client_hello(data: Dictionary) -> void: _spawn_service.get_spawn_transform_for_index(spawn_index) ) _spawn_service.spawn_remote_player(sender_id, spawn_transform, true) + var spawned_avatar: Player = _spawn_service.get_avatar(sender_id) + if spawned_avatar != null: + spawned_avatar.apply_appearance_snapshot(submitted_appearance) + peer_profile_changed.emit( + sender_id, + display_name, + submitted_appearance.duplicate(true), + ) receive_server_hello.rpc_id( sender_id, NetworkProtocol.make_server_hello( diff --git a/player/animalese_voice_profiles.gd b/player/animalese_voice_profiles.gd index aa135c1..2ea6cab 100644 --- a/player/animalese_voice_profiles.gd +++ b/player/animalese_voice_profiles.gd @@ -3,6 +3,8 @@ extends RefCounted const DEFAULT_ID: String = "natural" const DEFAULT_SPEED_ID: String = "normal" +const DEFAULT_CALL_ID: String = "meow" +const CALL_AUDIO_DIRECTORY: String = "res://sound/dialogue/calls" const OPTIONS: Array[Dictionary] = [ {"id": "tiny", "label": "tiny", "pitch": 1.24}, {"id": "bright", "label": "bright", "pitch": 1.10}, @@ -17,6 +19,10 @@ const SPEED_OPTIONS: Array[Dictionary] = [ {"id": "quick", "label": "quick", "characters_per_second": 34.0}, {"id": "rapid", "label": "rapid", "characters_per_second": 40.0}, ] +const CALL_OPTIONS: Array[Dictionary] = [ + {"id": "meow", "label": "meow"}, + {"id": "bark", "label": "bark"}, +] static func is_valid(voice_id: String) -> bool: @@ -55,3 +61,21 @@ static func speed_for(speed_id: String) -> float: if str(option.get("id", "")) == resolved_id: return float(option.get("characters_per_second", 28.0)) return 28.0 + + +static func is_valid_call(call_id: String) -> bool: + for option: Dictionary in CALL_OPTIONS: + if str(option.get("id", "")) == call_id: + return true + return false + + +static func sanitized_call_id(call_id: String) -> String: + return call_id if is_valid_call(call_id) else DEFAULT_CALL_ID + + +static func call_audio_path(call_id: String) -> String: + return "%s/%s.wav" % [ + CALL_AUDIO_DIRECTORY, + sanitized_call_id(call_id), + ] diff --git a/player/player.gd b/player/player.gd index 8413be3..301d82c 100644 --- a/player/player.gd +++ b/player/player.gd @@ -237,6 +237,7 @@ var _catch_attachment_offset: Vector3 = Vector3(0.0, 0.08, 0.04) var _gravity: float = float(ProjectSettings.get_setting("physics/3d/default_gravity")) var _camera_dragging: bool = false var _camera_input_enabled: bool = true +var _camera_drag_prior_mouse_mode: Input.MouseMode = Input.MOUSE_MODE_VISIBLE var _free_camera_active: bool = false var _free_camera_body: CharacterBody3D var _free_camera: Camera3D @@ -272,8 +273,10 @@ var _network_target_position: Vector3 var _network_target_velocity: Vector3 var _network_target_visual_yaw: float = 0.0 var _network_snapshot_ready: bool = false +var _network_snapshot_age: float = 0.0 var _character_animation_name: StringName = &"" var _sitting: bool = false +var _sit_after_landing: bool = false var _sitting_intent_pending: bool = false var _sitting_intent_sequence: int = -1 var _held_fish_visible: bool = false @@ -380,6 +383,9 @@ func _physics_process(delta: float) -> void: or (_network_authoritative_simulation and _network_jump_pending) ) ) + if _sit_after_landing and is_on_floor(): + _sit_after_landing = false + _set_sitting(true, local_control_enabled) if _sitting: if jump_requested: _set_sitting(false, local_control_enabled) @@ -479,12 +485,8 @@ func _process(delta: float) -> void: if _free_camera_active: return - if ( - _camera_input_enabled - and _camera_dragging - and not Input.is_action_pressed("camera_drag") - ): - _camera_dragging = false + if _camera_dragging and not Input.is_action_pressed("camera_drag"): + _set_camera_dragging(false) if _camera_input_enabled: var stick: Vector2 = _get_controller_camera_stick() @@ -639,6 +641,9 @@ func _update_character_animation() -> void: func toggle_sitting() -> void: + if _sit_after_landing: + _sit_after_landing = false + return var should_sit: bool = not _sitting if should_sit: if ( @@ -651,6 +656,9 @@ func toggle_sitting() -> void: ]) ): return + if not is_on_floor(): + _sit_after_landing = true + return _set_sitting(should_sit, local_control_enabled) @@ -692,7 +700,7 @@ func _unhandled_input(event: InputEvent) -> void: return if event.is_action("camera_drag"): - _camera_dragging = event.is_pressed() + _set_camera_dragging(event.is_pressed()) get_viewport().set_input_as_handled() return @@ -742,6 +750,17 @@ func _get_current_speed() -> float: return walk_speed +func _set_camera_dragging(active: bool) -> void: + if _camera_dragging == active: + return + _camera_dragging = active + if active: + _camera_drag_prior_mouse_mode = Input.mouse_mode + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + elif Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + Input.mouse_mode = _camera_drag_prior_mouse_mode + + func _get_network_aware_speed() -> float: if local_control_enabled: return _get_current_speed() @@ -801,7 +820,7 @@ func _set_free_camera_active(active: bool) -> void: _free_camera_active = true return _free_camera_active = false - _camera_dragging = false + _set_camera_dragging(false) if _free_camera != null: _free_camera.current = false _free_camera = null @@ -878,7 +897,7 @@ func set_local_control(enabled: bool) -> void: if is_node_ready(): _camera.current = enabled if not enabled: - _camera_dragging = false + _set_camera_dragging(false) func set_network_peer_id(peer_id: int) -> void: @@ -894,6 +913,7 @@ func configure_network_remote(authoritative_simulation: bool) -> void: _network_authoritative_simulation = authoritative_simulation _network_interpolation_enabled = not authoritative_simulation _network_snapshot_ready = false + _network_snapshot_age = 0.0 _camera.current = false @@ -943,7 +963,13 @@ func apply_authoritative_network_input(data: Dictionary) -> void: _network_sprint = bool(data.get("sprint", false)) _network_sneak = bool(data.get("sneak", false)) _network_slow_walk = bool(data.get("slow_walk", false)) - _set_sitting(bool(data.get("sitting", false))) + var sitting_requested: bool = bool(data.get("sitting", false)) + if sitting_requested and not is_on_floor(): + _sit_after_landing = true + _set_sitting(false) + else: + _sit_after_landing = false + _set_sitting(sitting_requested) func make_network_snapshot(peer_id: int) -> Dictionary: @@ -965,6 +991,7 @@ func push_network_snapshot(snapshot: Dictionary) -> void: _network_target_position = parsed["position"] _network_target_velocity = parsed["velocity"] _network_target_visual_yaw = parsed["visual_yaw"] + _network_snapshot_age = 0.0 _set_sitting(bool(parsed["sitting"])) if not _network_snapshot_ready: global_position = _network_target_position @@ -1009,6 +1036,7 @@ func apply_network_teleport(snapshot: Dictionary) -> void: _network_target_position = global_position _network_target_velocity = velocity _network_target_visual_yaw = _visuals.rotation.y + _network_snapshot_age = 0.0 _network_snapshot_ready = true @@ -1065,11 +1093,21 @@ func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: func _update_network_interpolation(delta: float) -> void: if not _network_snapshot_ready: return - var position_weight: float = 1.0 - exp(-12.0 * delta) - global_position = global_position.lerp( - _network_target_position, - position_weight + _network_snapshot_age = minf(_network_snapshot_age + delta, 0.1) + var predicted_position: Vector3 = ( + _network_target_position + + _network_target_velocity * _network_snapshot_age ) + var projected_position: Vector3 = ( + global_position + _network_target_velocity * delta + ) + if projected_position.distance_to(predicted_position) > 2.0: + global_position = predicted_position + else: + global_position = projected_position.lerp( + predicted_position, + 1.0 - exp(-10.0 * delta) + ) velocity = _network_target_velocity _visuals.rotation.y = lerp_angle( _visuals.rotation.y, @@ -1096,7 +1134,7 @@ func is_movement_enabled() -> bool: func set_camera_input_enabled(enabled: bool) -> void: _camera_input_enabled = enabled if not enabled: - _camera_dragging = false + _set_camera_dragging(false) func set_camera_active(active: bool) -> void: @@ -1469,7 +1507,10 @@ func _complete_showcase_restore( _camera_input_enabled = ( _showcase_camera_snapshot.camera_input_enabled ) - _camera_dragging = _showcase_camera_snapshot.camera_dragging + _set_camera_dragging( + _showcase_camera_snapshot.camera_dragging + and Input.is_action_pressed("camera_drag") + ) _showcase_camera_snapshot = null if restored_callback.is_valid(): restored_callback.call() @@ -1487,7 +1528,7 @@ func _capture_showcase_camera_snapshot() -> void: _showcase_camera_snapshot.camera_input_enabled = _camera_input_enabled _showcase_camera_snapshot.camera_dragging = _camera_dragging _camera_input_enabled = false - _camera_dragging = false + _set_camera_dragging(false) func _begin_showcase_camera_transition() -> Vector3: diff --git a/project.godot b/project.godot index 9ddaa7f..3c43ed2 100644 --- a/project.godot +++ b/project.godot @@ -185,6 +185,11 @@ open_emotes={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) ] } +character_call={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} open_quick_actions={ "deadzone": 0.2, "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) diff --git a/scripts/portmaster/licenses/CREDITS.md b/scripts/portmaster/licenses/CREDITS.md index 8edbd4f..5b78a80 100755 --- a/scripts/portmaster/licenses/CREDITS.md +++ b/scripts/portmaster/licenses/CREDITS.md @@ -37,6 +37,10 @@ written with or without assistance. - “Gentle Ocean Waves Loop” by kkenny101, used for the saltwater shoreline ambience. Freesound sound 852826, Creative Commons Zero (CC0): https://freesound.org/s/852826/ +- Dog_Bark.wav by ivolipa -- https://freesound.org/s/328729/ -- License: + Creative Commons 0 +- Cat meow.m4a by Christyboy100 -- https://freesound.org/s/495694/ -- License: + Attribution 3.0 - “Quick Water Droplet” by qubodup, used for the bobber water-impact sound. Freesound sound 792931, Creative Commons Zero (CC0): https://freesound.org/s/792931/ diff --git a/settings/player_settings.gd b/settings/player_settings.gd index 8979e57..a20a3e1 100644 --- a/settings/player_settings.gd +++ b/settings/player_settings.gd @@ -7,6 +7,8 @@ const MIN_MOUSE_SENSITIVITY: float = 0.001 const MAX_MOUSE_SENSITIVITY: float = 0.012 const MIN_CONTROLLER_SENSITIVITY: float = 0.5 const MAX_CONTROLLER_SENSITIVITY: float = 5.0 +const MIN_AUDIO_VOLUME: float = 0.0 +const MAX_AUDIO_VOLUME: float = 1.0 const MIN_WORLD_PIXEL_SIZE: int = 1 const MAX_WORLD_PIXEL_SIZE: int = 5 const DEFAULT_WORLD_PIXEL_SIZE: int = 3 @@ -33,6 +35,11 @@ const UI_COMPACT_RENDER_HEIGHTS: Array[int] = [0, 408, 336, 264, 192] @export var chat_dock_right: bool = false @export var chat_mobile_mode: bool = false @export var paint_dock_right: bool = true +@export var fullscreen_enabled: bool = false +@export_range(0.0, 1.0, 0.01) var master_volume: float = 1.0 +@export_range(0.0, 1.0, 0.01) var music_volume: float = 1.0 +@export_range(0.0, 1.0, 0.01) var effects_volume: float = 1.0 +@export_range(0.0, 1.0, 0.01) var environment_volume: float = 1.0 @export_range(1, 5, 1) var world_pixel_size: int = DEFAULT_WORLD_PIXEL_SIZE @export_range(1, 5, 1) var ui_pixel_size: int = DEFAULT_UI_PIXEL_SIZE @@ -48,6 +55,10 @@ func is_valid() -> bool: and is_finite(controller_camera_sensitivity) and controller_camera_sensitivity >= MIN_CONTROLLER_SENSITIVITY and controller_camera_sensitivity <= MAX_CONTROLLER_SENSITIVITY + and _is_valid_audio_volume(master_volume) + and _is_valid_audio_volume(music_volume) + and _is_valid_audio_volume(effects_volume) + and _is_valid_audio_volume(environment_volume) and chat_draft.length() <= MAX_CHAT_DRAFT_CHARACTERS and world_pixel_size >= MIN_WORLD_PIXEL_SIZE and world_pixel_size <= MAX_WORLD_PIXEL_SIZE @@ -70,11 +81,24 @@ func copy() -> PlayerSettings: result.chat_dock_right = chat_dock_right result.chat_mobile_mode = chat_mobile_mode result.paint_dock_right = paint_dock_right + result.fullscreen_enabled = fullscreen_enabled + result.master_volume = master_volume + result.music_volume = music_volume + result.effects_volume = effects_volume + result.environment_volume = environment_volume result.world_pixel_size = world_pixel_size result.ui_pixel_size = ui_pixel_size return result +static func _is_valid_audio_volume(value: float) -> bool: + return ( + is_finite(value) + and value >= MIN_AUDIO_VOLUME + and value <= MAX_AUDIO_VOLUME + ) + + static func get_world_grid_height( pixel_size: int, displayed_height: int, diff --git a/settings/player_settings_manager.gd b/settings/player_settings_manager.gd index a983ca3..84b3f44 100644 --- a/settings/player_settings_manager.gd +++ b/settings/player_settings_manager.gd @@ -5,6 +5,7 @@ const SETTINGS_VERSION: int = 1 const SETTINGS_PATH: String = "user://player_settings.json" const TEMP_PATH: String = "user://player_settings.json.tmp" const BACKUP_PATH: String = "user://player_settings.json.backup" +const SILENT_VOLUME_DB: float = -80.0 signal settings_changed(settings: PlayerSettings) @@ -16,12 +17,14 @@ func load_settings() -> bool: _recover_interrupted_write() if not FileAccess.file_exists(SETTINGS_PATH): current_settings = PlayerSettings.new() + _apply_audio_settings(current_settings) emit_signal("settings_changed", current_settings) return true var file := FileAccess.open(SETTINGS_PATH, FileAccess.READ) if file == null: push_warning("Unable to open player settings; using defaults.") current_settings = PlayerSettings.new() + _apply_audio_settings(current_settings) emit_signal("settings_changed", current_settings) return false var json := JSON.new() @@ -42,6 +45,9 @@ func load_settings() -> bool: var presentation: Dictionary = {} if typeof(data.get("presentation")) == TYPE_DICTIONARY: presentation = data["presentation"] + var audio: Dictionary = {} + if typeof(data.get("audio")) == TYPE_DICTIONARY: + audio = data["audio"] if ( typeof(accessibility.get("auto_click_enabled")) != TYPE_BOOL or typeof(camera.get("invert_vertical")) != TYPE_BOOL @@ -73,6 +79,10 @@ func load_settings() -> bool: presentation.has("paint_dock_right") and typeof(presentation["paint_dock_right"]) != TYPE_BOOL ) + or ( + presentation.has("fullscreen_enabled") + and typeof(presentation["fullscreen_enabled"]) != TYPE_BOOL + ) ): return _use_defaults_after_corruption("Player settings values are invalid.") var loaded := PlayerSettings.new() @@ -122,10 +132,20 @@ func load_settings() -> bool: presentation.get("chat_mobile_mode", false) ) loaded.paint_dock_right = bool(presentation.get("paint_dock_right", true)) + loaded.fullscreen_enabled = bool( + presentation.get("fullscreen_enabled", false) + ) + loaded.master_volume = _read_float(audio.get("master", 1.0), 1.0) + loaded.music_volume = _read_float(audio.get("music", 1.0), 1.0) + loaded.effects_volume = _read_float(audio.get("effects", 1.0), 1.0) + loaded.environment_volume = _read_float( + audio.get("environment", 1.0), 1.0 + ) if not loaded.is_valid(): return _use_defaults_after_corruption("Player settings values are invalid.") current_settings = loaded _is_dirty = false + _apply_audio_settings(current_settings) emit_signal("settings_changed", current_settings) return true @@ -138,7 +158,9 @@ func apply_settings(settings: PlayerSettings) -> bool: _is_dirty = true if not save_now(): current_settings = previous + _apply_audio_settings(current_settings) return false + _apply_audio_settings(current_settings) emit_signal("settings_changed", current_settings) return true @@ -192,6 +214,12 @@ func save_now() -> bool: "controller_sensitivity": current_settings.controller_camera_sensitivity, "invert_vertical": current_settings.invert_camera_y, }, + "audio": { + "master": current_settings.master_volume, + "music": current_settings.music_volume, + "effects": current_settings.effects_volume, + "environment": current_settings.environment_volume, + }, "presentation": { "world_pixel_size": current_settings.world_pixel_size, "ui_pixel_size": current_settings.ui_pixel_size, @@ -200,6 +228,7 @@ func save_now() -> bool: "chat_dock_right": current_settings.chat_dock_right, "chat_mobile_mode": current_settings.chat_mobile_mode, "paint_dock_right": current_settings.paint_dock_right, + "fullscreen_enabled": current_settings.fullscreen_enabled, }, } if current_settings.chat_draft.is_empty(): @@ -232,6 +261,22 @@ func save_if_dirty() -> bool: return not _is_dirty or save_now() +func preview_audio_levels( + master: float, + music: float, + effects: float, + environment: float, +) -> void: + _set_bus_volume(&"Master", master) + _set_bus_volume(&"Music", music) + _set_bus_volume(&"SFX", effects) + _set_bus_volume(&"Environment", environment) + + +func restore_audio_levels() -> void: + _apply_audio_settings(current_settings) + + func _exit_tree() -> void: save_if_dirty() @@ -240,10 +285,38 @@ func _use_defaults_after_corruption(message: String) -> bool: push_warning(message) current_settings = PlayerSettings.new() _is_dirty = false + _apply_audio_settings(current_settings) emit_signal("settings_changed", current_settings) return false +func _apply_audio_settings(settings: PlayerSettings) -> void: + preview_audio_levels( + settings.master_volume, + settings.music_volume, + settings.effects_volume, + settings.environment_volume, + ) + + +func _set_bus_volume(bus_name: StringName, linear_volume: float) -> void: + var bus_index: int = AudioServer.get_bus_index(bus_name) + if bus_index < 0: + return + var resolved_volume: float = clampf( + linear_volume, + PlayerSettings.MIN_AUDIO_VOLUME, + PlayerSettings.MAX_AUDIO_VOLUME, + ) + AudioServer.set_bus_mute(bus_index, resolved_volume <= 0.0) + AudioServer.set_bus_volume_db( + bus_index, + SILENT_VOLUME_DB + if resolved_volume <= 0.0 + else linear_to_db(resolved_volume), + ) + + func _recover_interrupted_write() -> void: if FileAccess.file_exists(SETTINGS_PATH): _remove_if_present(TEMP_PATH) diff --git a/sound/dialogue/calls/bark.wav b/sound/dialogue/calls/bark.wav new file mode 100644 index 0000000000000000000000000000000000000000..2629fe7e340c809b2c499393ebca8d19e882c903 GIT binary patch literal 78856 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�J4RiPz2b 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ⅇ#sVS&wl6|<&@*7`r7w$F+jWeTtY(4zaD7?THp6D%n;V0^2OVyXyMxgF; zmKcAYs`Dltx_kJQyZD|vXrx?%ZF>ZNxP?k}9y_QH+|N4pDD~1=V(xu?kZfn1$z&R_ zK1uM2m&kdR>+?jH&zy0X%BCPY|KKWb@4Cv`Q?9}&{&}MO7iW&RuA0lPE#|Rn5R>f* zClJOF*^d#~C$Z~lqcodV&(il%|Jvi)qZhia=;^L!I>_}_k92+3<6Q|l$3OH|*Duz^ zpqgdS%`xN(zjQtF1ApyKCXtoqisS%c<8 z-%O?mvn0994lT%(<8(XyQs;;7nM7a4*3an}*D-z8bx>b(Me2WD5&9k1A3jcx=cz!B z(}FWnhU;w_OTxn}CGVcEtzH1De+K6zOw_(+xE{prpTW~zZhBJVw9)IBuU`YhbTub5 zuHoOyxaOf57Rs55fpEP2*{^*~tnOu!n$Fa7-KjL%k%zQoCcu|y(E_Bij_JY~nqxsB z!eHFaWna*>)03!>$kuf;c)w*iAuKr>_V>*YR9Z)3^+Vvbj?opU2J%r^r!rSy>wn>H zlNmSEtCFxDsmYG{X`J$~oBa41Sz%uVT0^C z-5m9BGdarA| zzUu0%pSsGUqn7FK-YKKMyV|nO!}LejBK^~KNGH;-m@7g$T84=Xwa_WL%ym~4F) z_0P4xrx>&(-Ukx*7a14#F386nykTN$c@LWzo5;zPAN%ma)08Ccl%R$#L}xcAe%F(Z zZyG9{l+^PM6SbOX^qw5?J{ine*lS0L+uMyIyLpN3#YND7z2p%KQQR0o71-JYuvX}L zku7R+;~#p5c}%3`L@#rJ?CgU6j)zQS_v-Z2uzAra%4+rEwRBz9t2(Nh zJ}5?&wtLxk;q1FWR}$O9^&e;4yyPs!>zsRY(zJJNGJdWVoW4AlbzErf;X&N7naZ5( z6o{Q2(EYfFE>xwR$z@xhdQt~_Df>67_9RydCbG`A_t8{7try!3oNzf$Ps2t=p%c>4 zw%1i`Q=Q8;#^co^FKCKq=%sgK#Vg6%C-Y7M%y)i6Q9MT%qUKWe(k=32%W4#d_1B3U zWC~e(1R2{EG+bisGw{Jr<~J+)2Ofu^Li+{QmC#Rq$5Z$~w0&vIQMpyJcbFT9;qx(6 zEElb?*XTVyZDsSKwWaY`%w^Ph;GP*h3$2Qx8EU_cr*B9^G5!|yc71t;H;S=iK}vg(-8BT|t7t~qf@IE~WXieB zXFStE^4CeG0ToFHG@%Akw~sUT^is1IE!ovPo#{jkG8#@%ML|gCw?o+VLAsHhqI;2j zjDmMR6`Px9ck9*mAo%4ORD#avi}n=iYe)5CqRlhT`gn&<;TyY3zqX6@13QzoozBF- zIK9&P>p=9fe7Q=YCL`=5eba>Fw>InH=7esFZbLaxkBr=DVr=dg2*YC0w-rIrh}S_U{{ z?(m!5uxb~uhfS<2T~6$5G4?hAm4q(l5q0@4lbyO;pvMub>l4#hH>#&Cc=W~Oi8J*d zazMkAPJ&K#W;AW8;sHA`_c4+9zs0Oz8fy*lFM|DflE{0Bop6^4idTApeXrM(UF@<} z!yV0Lg z^Z&!gsp&mrU>A5{?L~=R-uR`4ymsKVKg_~lu>NUebaSW}7toUk1BsbH?K+6B?|=4x?kS=vWkjA|`EICeg8?R-4D0@OG~ zKxrzl9!+?+ow0)eaE*!Vkp=cGs77+S^?A6;g2I)97f=Coq9nLk3A#JkK`S%CMv5m- zylW?t^Z5N$vK#fc@@&BqXwGVPHou8yugnZ=aXU5sbyny%I?DOzRW!9x?6w1Z*CBI= z{NRc`4m;{7d-)K4Yp=PFA3H~t7(qq1gpSM%+nze5HV9m4o^f7&Lk{q=6g*?WTK&*D z$V9W)XJq|%bVd3FEkURU@V=)rp}LZ5ul=c`v88)tXR%BH{zt@iS?E2?VkBnzM4%w` zgY|yJ&%Mg-j{+H44dyb|*2K12&=Km%@A4-KO*Nmu4VXYO+%X@;#f_OR@Rx=*U~o7^?6N*gWi13o7X0MU3;{?`dUBc zh643|?Cb&dCQ*;1d&d0G2OTPMFgaKo{#g(+3_F-Ad2W6PPuS2cKsCbP=bZ(yws0Y; z(SsZU?!FWR;}rGV6S#BVsaqYUj8Nu)AJBl#d3HEamj1zG6G;bX0eratbe+301(PlN^qI_h29S4;!e0lNh4}7Zo=6`sq_*_#Di9e8;sHE}6mH-Mab^?M_-XT)r*wzs zb`JYbusc+>sMB{*!@su+K(xa64b$j3g)x({%xn^C&2hRJm$`1jow>}+&Pk>^j-sr& zSuBK0GuwoSsi**i!tNUjem|1wrGbV{f$`$!l;rD5^1ao>G1C~HUVHd9ed%ir1??FF zN;VN4jB!-r!Bppi=q~%gu&PUCS(I)?a`~jFVOxP8QjzY2i?M)Sv_IX=Zm@t8Gzp6S?PMQewU6@CqR^OGFAl@S+6J1t z8pL=x-LQEe+abjHKV<{TZN`=IS#@fv@4%I-WblfLlB@5}LZ>Mj692D#dteodyVede~(3TJe)>;zSeCc6h zWrAsu0}g%;`P62Fk(UwHR#MouLhfdrc7Ts;h0(R1KE!SqYWvZWyUg_jrq_4Y*`2O< zX6(`ne4!j&qPolwwczhg^oYB|E$aYJxeJ}4E+_`|1X1tF?(77j-X7jqYq|%Gc~6Z+ zg0eVSt;oPMj2me94|=n)AXN83r!L@APN1iM)V#L)%p?5T6VRtS;4P2sd9FM7oA>6M zbpzAP3`$)Ebh;}%xiAp-;Cu>VOL3F$S zk$LESd&uGNuY%~Q1kqs~A-BNfm;#f%AKENUVKY_X%FE=q z&`ZG*D$VDL%cRUVB&=&vc)5s%^ZJ3Ed88iCZe1nuz!ukFD) z_5;@)#5DUTe8(iZGmALwc{fk-6goT)v7v8tz>>j7%Efes4{W*StjhqbVG>q>$DxDt z6VAX#dVVjt_lLZf>%7k^e;F`6m?MQfw{^R#w2@ zpYsV`<2iozVm!eZ_8!{bOoaP0na~WK(R_FZhivl&p63*q$R_M%mK|rukeiO73p3Jw z1+DUA)v96-oj^TDv$MnTkh{3+6YS9|yqlY>6KV$HF07tgtlVw*6Axhq6Pvh>Vhg9? z*gV88p1=_N0-G-3>~OS!WE}SM6V_rpHuW2u`UA7x@cJ7b;CCi-e!x@ujx`y6&Tp87 zZZM2fv9~KR#*HOen` zq7oA+-C3ibHVn2HN+R@g_n>#VlG%hg^dYB_3ncX2hFTx&%M+Ae;ca4VCo=V}_5>PJ zdsv^nV7U9}RdGTsy`)Fre1>d26WqKCJmFSEmLYInroaKaE~HHHKu8D!*5N@nCEA3 z>AUpZPQj!*iALCdCi$W`M}7}er3aYsK0;UgFgfOVdQPYL+&LoYMflTaL@E4GOJ+Jo zqhr4gX6YT6BZ5d#O3ePt+@FM{?<8v6;q^C+udH%DJgd!gppWxj=rZ%n7s(V%kmZM& zQW>^cORmmLmUZQGoq3-vxa)c_bG+f26_KOhtn`J~+fzP+>wSSWiNK34!Gliayq6%@ zcEhoygei=v@L87f&UV5uxXT|Hfx?qHj>><3dpNAGDfkX=wlHV54!fDj=f=Sr>n;Bg9c2$#ja_*nzWgR;9pMv8uCMfoUc(M}4tMPt82P{C z4>9cNbF9Tht}|SxnQ}OZO&rIQ91|6ZsVK^@J66G73x}6G7e?H4_QZ5N{Ve90=EGN; z1vhd&%$^N!a1X*^x+WgTx9Bb;L-nR0S_BO^yL5o8t>!ZIb&$!(M=&;j$d#ODvR!3S zhg2SQUgcI7Q4_m?lFLaZdZW}A*qxkvfbQs6rck>w0ajggL5q}AW8wWBfYCJpFH#eJ zr^CLx07qjAO8j+sk7@AcPw}<8$Q)+DwjE%z$u=-=o7loks~3|snIUgx3(2lr<84vc zR|Ux|vJ=-*5$iPhLM&Y17@o>e7<`*qsbwOLpPn2~pO(0h8Bd=EPoEg|G9gRw9eLU9 zUhH=-zO%Tv&t7^2Bkw8GB22__XA9UTJMj;fMKRW;0kL=l7QRr{hu77ObJ>W&SWQ;6 zmx`&yocpkw(|>lrXpKN2VJFubxXTMrwVBKs_Ln7K-sM&aibAECuPg$KDhI4r57>_B z_*ow8rX2DN(fusz6fGOUAA=hNA2tTI)eY1Q{)HcVmH#~fpKmYUxk`RRf#Dk}5pn3e zyk^HfL3{DEWO5L;=Ok2Ke6gWYvLY*x8()})Oi{8Pzv%Vo3$hch3AYF{joHy!s~Lmp?U^ePO)hrHY8@Dd-xNsN(s)eTumoq+wF zu!^(L&k5q+?cvK-fv=d0RZ4-M`A%$l1*haTKKK^-%O#%Z9iH-QJb)Yj%Kuk?<_HIvkIFgf3fjpxcvg2Mr}D{+>I~+k*4bp?-9;O+@#5rd8OZOGuttfXSwIwQqhn+V(RlqkbhRGf+1|k#vvl{e!5a6*6ZjD^W^nI^P{E1i zzO$f4)eybjkxT||l>HCm?>Ue2U-eF2Q|sj()r}pTk4fKGqC2`ejhGrLuL4-1KIj#7Mq96=FtV5UEJuiE z_^=rK*$o*@OnU&A^f!!RRL5c9&mkWTX8N`-e!nf+OqJm`=78@f;A%b+y}0*oOszG8 z1KWuAQ;+Caji~5NR4gMi;ZHrtJTl;`Gs4ZzO14Ue8{6qj#OOm5?Th^kzzYtNefW0( z%Btg7mryd?xl9YMCc;FL=^lV_7LAqP=X%NaI?_*ivPZqy7wvd@qnMaqMhx4Ht=(g< z{^Hr9qm8Co8z!KJs~|N^g>xRxE>xS&@RdYksAikMch}<5LxiE=n7@3k#dCK8Qi;6i;m~s`g#P8}fnu?2NI@ zGS-yu@N19B!EO=D9#APhA`grOefthlo0{y*i_g}@E_zTo&%&N|vQuwjUGYS`EU@b8 z;>(81_3WjaWM=W=1(TtvRAX73S&26A%>A+H1!xmRs)zET`ii|IRlk)7?;?*X?37cb zovNGz+fY?;I;tAZ0JI^8au(M(RCK2BHS^RTbRi$ARh+rKjybVS>K|68CLbq9zwH61 zGH*mlItVqMChV9(axfhB?&?3$UfpH({R;2-wD3_U;rvH(MR6+5dH#J*Bup4IQid}N zQlM_aNtG%)Ua<%o59N3*CmW()P?^_Ks-n!JD)Wwf;3rp+U*LT|C05*pO?pE%gAdN6 zBv%B}-<$BhYl+({@s2BCh%YCWhx4z6#PwOcPUV^o2X!j(eJYj;lUYub{jrR0eB1&1 zZ71hbQLW+QNIrjp|G&Z4$HF)__}%pEmm(^qs;0`Id)OL%NPpE|%}^uJS!c?H*UK3<2u(`NNVtykAs%e|;Pt>e!${=Yx}U!OHD%=e{Hvp6+3 zgr_x$C=sOmn08?rTuIr2^=!bLNIeydLTMY;u(+tGQlW+vXN#&wwxGJiIRod>@4IDl zspqzk`i*9jCn}63MQ+txq*X&W?|L@+M@N}R06kz<=8^Q`{Z+&BcEyhlLdRt)?{pFC z7(paCzzUvVJZPWr&T1p7R%h8^?-i$wqV`wJX{zdT(rGuRo*L~`SF@eUY6&NUt#Qh#Rp`Kl zJK0r;lUWT%AFhLw9P4!0Yw^rNf0tL)EB4iG*61R3bClnTmK@PG70PTs$V@--JfEQ( z@JN;;{uPz?(Z={B6LZJknLl|g(qn(Q)os@1mMEdFamvJbUQe->$3;Qx6kSE3)MoLC zZ1^6$^JuPJWXN;zdt>>y8yRv7JWWmFY9%tHN+`pXhgG4nQSlMU!Qawe9?7FTK+Fc7I0djYE~R= z7B_iPJwf682ucxTzr+U*eA#C*sA%%nEodrE;dLN+tuHxlW9q;f)QmoG#OuinF!pQk zRE7{0mSH!?*pu(^!KtzILd4jbDi&Y$jnkps*;OgHGGHs7oCV{76{S{%R3fw^C4a~B zB){=w-?5TU*!g!@)qly|W7zSJ+3_E+TA`N6TxbTCCueA*rpS>h7=_GX@*LME)kkJ= zd^vfrIq%a4&6Bcng;P}Sa%>ZTCl!9bymH|aEKl(()*i$Jua)CG z!KdC;pP99dRj0_6Bk>1o@dfkH`3yqgv$rb7E=i~As1LG?y2Z}g!}|%BnaNOca{pOX jJ93~J%;#3*J(fmysW>@O2{bkd{cdWY@3;w*&vTa+|v?-D+-Cx3>GG zJD%UR0V~~A?p&UypWENP>Rxu=y6@erQfA5L2Hi4J38^R_uX)CLQhliz_)!`p?McU8 z=}&2`^jLZ-<&?9_K`A6vm#fR8Ky$f;yhvUkZC4Bx_E+iM0bI93bagA5N3F(;hMtU!$NFSy9;2mG@ zmUc<;a)LYrB*^iyDOplpIggxK&LYRkF>(XBq1+ub27`bh>wI|SALL&0*Zi&#A8|Y~ zBH29ed+8{z@{e>@x+dL_9!U43mC|bIH))}?Upgd(rJz)eF{%q%$t~r{@)Y?Gd5t_k z9>_>-mj41@$Tj5FavQlGNCGdVm(nuOU+O1iWM1+~d8IB=XQ{YUQpzpmloD8zCM)g^ z5G$~e)JSSAeIxzOE6e{d9PeatGCM_`VonFJ-`VFZbQU?=z&q!yv)cK?S>Vib z9ypKr{d7#A|%utHN%6Hz|&!|p(LfIE}# z&w(}UtHbUwJ`T8>+^y`=W$s1yk}DAp-muF~xhLIS?C1GBLksrhGIuFIJDt84#oxy; zF0y31pGg%#IVp#fi|?%TzY)*9$KCJh#Gn)I88=Rfk$QuQQf1cj4rX*GEAW(*CIwh~ zi=+|KNU4?7QmP?+A^lJKLF&n42T22@Rjkc9V3IVEzu7LG0ms=RH&`JbKuuO-dHHjB zB$zADkw36+s>oI3a;%3WIU{?zt^Ac-U#`iT7JJMid*n0HX{kD|^9Rq}6vVSWU%JoS zQN+3NeAFWPG$O*)<^Q&BN1|P4qEH9szDN4likS4Z+ra(I{nRbs7IwEgo1MkZGG~@E z-5KHxbH+HMonOH&XE$r(Cub5fciFkbe5!6G)=oJf;#)>HgR8l^8v|0Dk4^P zE9@Z>k6}cbG79Z@=Z#nuJKYz=+&I=iVX27pmJD*my~e97Vdhu68^99K3-kkLz)6r% z%8{|q?>M{njg#u6IF2JRTS?4dHRd%j zeOukatYz8C1Jmyp6%`9$a{%_|#AR>tI?!~j*b?!S=SZ%r7JjALr zNBm#V{e-pLgXoZxk325vn0Il*Y09%^b+fU;YPx;Nu}6srm&mhX4EFH4qrqCPcs--q zjx4vtmu!#vOkGS$xaqVCz){)>pufu z#}dVAu?I@H#oQupQTK)O!Z`yT5!1xgRbt(Xz15ue`_g&kyyW*exNe{0b3SKRRAQG1 z?$M6@nUgr|<@xRtCvQ0aIfsd;dx?jOKqs((y|{{)`y2oJoe0nN)QMxR>bqa1@2|G( z@>b06KH}9q#``ikAeWS#6_=BBmx0I?&swcTmikWW1jb0C`A)3f+N{jHk}j#zryz;P z)+DZI{Nx?^qbjkk0K221RF5dril}p(4E9F)o5&|}XCv};SGkM46l?>3!y|6U*W`cY zOY(X7EF58_d_+Dd--TKDN#fWxeu;(oY$rOjo8VSAqE54@xhkzS2Os$1|P;LqTs?LPg?d0@3n+d{Qi}ywj94LfT0bz2>@G6FN%Fus@C;l6e(;=FeHxZ>U%E}c*voJK=C{wK zOyqaL;l%iL1wFt}0)tquZexD#GlEK>WeGd68Yp0l8oU4o?&%KwPFh*~r*Nn;w={h(G z4uExVUJG8d26P94n~Cer%M8|K^gD6gVlL9SwhUbTQ{wDX_X)iJwmX}c*q8n)tf4R@=v-MQeLXP@R`AIA{e8j=(0^B2AN_&z;19%5Y-Q6;GYoUaRc|2H!EQRyIS?5cEG$|rxqyUYQr%_R3^4oAqtn8!_g z9tN}s#hc`%@V8;v6xoBB#5?7jbP6&*$B29} zZaf*Gt$WM44MPnP1^4pP!_G|D$pmLSKMOl0iMnFnK4q;Ils-x4{|n&VuYjmCO3S6> zen8Yo$K?}LD!;Kl=g1S~Npe|!TV1Y2-I8B!A~#E4n=Rnmcjenu9%7!R$)%K1%5v(b zx6D&BrG-*Ssi5>B8jVy&DBpnZly1sUHck9Ed6mkgnw;;m_ z4&=D5D{ADnU>Mj4_JOQ&R(4;0;{RuIF}Xx~?I-4ZD7$YYJ5l6{X6aRPb0I9qVaa3` z{OP-(AhAtwFrgh3A-)#{l|VyK6669F(Z44V^;?jKxv2)ze*|m&0M`?>;bV5oHg`L$ z>@?it64|3KY@`-^qA8iaD)r7Y<|YyT6(X0fgjY{wUMf;$Wr1Ojclxt)D9)Ylo$gL+ z=NqSvQ`afwl;meB`>3dsYNy#{oll(vCy}{)XWO=8AGQzKSL~~d{Ll75zB|JAw;9o$ zpey5>;3PRUnUyMbHTysNrrixp0^iuJ?BdK$FT1DRADjfc!Fo{Bsp*)uWk0bW+3~zq zE+;2DdJwyBHtgiK^EYwR)~7Xm3w?V zP#UR?)UoOqb&vX&x>#ML&H#hep=xWjrCL?3p;l2VssSaW+*R%D2x`(sxXlsb@=`d%4=6Lu(09(l zZI;4gj;Axb!?j8GMhr{%kSnRw>NfE;qW4->;QSG9g4yTM9o@`F$=Mt?@|+;g1;Xm<1A#x@AG{w zH!r)lv1^j+Tq>lGJjV>+qaGPUv@)n`bMly1?Cqh{GlSqAb6I1e{u)g+F6u~8Cndrn z1b68I1OJOv|1)YpMIzO&@Ai)ih5i-rrDaS710an zmGsK`as7mTUjJLauHVvaJ)*}NaYjZXlkr}Et4ABLMiwKpQ55Xdcj;^N)p{*(UAwM% z^(cLUHeMT{jn)cl1+)}3P3^DtQ=5Tq>i6mm<(krkuU09)!?njMvzSYhx%!NG?9Uw4 zmFvLb+Q_fTTqB6PGssZ~(6kl;!7;_&JHhT298Tz8Tj9m|iO3c??+^H#;3(DM7$VjR zyoPBW1QpXOrSi;AD(vjN(-#TVI#ryE#Iys%xqt0* z?5_fL4>HL_d#b(4Ue2yrWG@6W?HP6l^3x^zqTR{<)?RI|w5vH^IK7Cig8SWLwiDb0 zqL!C^ULKBEoeHv9ddwEuu&8fM>i7^4b0)OL8nD_X@bfBiRXMMcTZvbal#EJ(l3mTM zc2+y7!_{GYi~_^eVp<6;r5YE+y>LWFxhSk5p6i@`zQ|qg5 zmDfr{v6R|sP4yo8@rrVZnHaAuQ07xHwPtlRf_Z$8s+(P@&3;l2 zVkYyjK$@4%@q3Z4nghYx52HYqL_eI*@4h4!3$09WTT$~ip-LS(<_vdw zkcrkio1DTQV1Kf+n= zEOqv{Fe~tKk ziaP8dtj{G+3w^&M+_fbvwmFrl(0@Bq6|^VA)F(eQqh7!q-N&_6o#%S48_q0T(p&y@Uc%&1paW=pq$P}4ZYxu1R}>Y z0{`;;hIHk09kKiicZ%~1%ImiCF!*0R%V!f|m?O(NT zkkN~gb+XukfBCFbYpONfYGBp3I$K?>OXk1kOY@ESn$Q24x6Joom$}n?#ZNR#wQ^f| zt&&!8tFhI@Y6>2i56%2m0V_WUnnAOl)z7L3c3ZpPcQJNntCMxyI%&xWrXAU1Z|&DG zh`-opRbVdloNVx#1?0^&u$`Mk-foP>OZ2M=U>Oh^=}$z$=hQNz<#8wlzo*y2T^aR^ z)Qqp;$C=~|bO&PP=RE3n@CWtaB{;L6>gX^PkEr{
V8j857SuDwS}w8WY^qX4FmoNs^X$l8W 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%0A?L*r2)T^mkec60J1;+=+;_5p_ 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⪻LQHaF+h-f7TGI1-#Bd>HsyXnw_191+>!a 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Ð!99iCh9BQ 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 literal 0 HcmV?d00001 diff --git a/sound/dialogue/calls/meow.wav.import b/sound/dialogue/calls/meow.wav.import new file mode 100644 index 0000000..058b09a --- /dev/null +++ b/sound/dialogue/calls/meow.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://y86nskf7ewrg" +path="res://.godot/imported/meow.wav-eb7bd4377946745ae1566c72ca026fae.sample" + +[deps] + +source_file="res://sound/dialogue/calls/meow.wav" +dest_files=["res://.godot/imported/meow.wav-eb7bd4377946745ae1566c72ca026fae.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/tests/shoreline_ambience_validation.gd b/tests/shoreline_ambience_validation.gd index 505452a..4297d72 100644 --- a/tests/shoreline_ambience_validation.gd +++ b/tests/shoreline_ambience_validation.gd @@ -34,7 +34,7 @@ func _run() -> void: runtime_audio.owner = controller root.add_child(controller) await process_frame - assert(runtime_audio.bus == &"SFX") + assert(runtime_audio.bus == &"Environment") assert(controller.near_distance < controller.far_distance) assert(controller.near_volume_db > controller.far_volume_db) var runtime_waves := runtime_audio.stream as AudioStreamWAV diff --git a/ui/animalese_voice.gd b/ui/animalese_voice.gd index b963a47..c6372ee 100644 --- a/ui/animalese_voice.gd +++ b/ui/animalese_voice.gd @@ -24,6 +24,7 @@ func _ready() -> void: polyphonic_stream.polyphony = POLYPHONY _player = AudioStreamPlayer.new() _player.name = "AnimaleseAudio" + _player.bus = &"SFX" _player.stream = polyphonic_stream add_child(_player) _player.play() diff --git a/ui/chat_ui.gd b/ui/chat_ui.gd index 69d35e9..3a18f25 100644 --- a/ui/chat_ui.gd +++ b/ui/chat_ui.gd @@ -215,9 +215,9 @@ func open_chat() -> void: _session.submit_neutral_local_movement() _entry.show() _entry.virtual_keyboard_enabled = false - _entry.grab_focus() _hint.hide() _refresh_input_ownership() + call_deferred("_focus_entry_after_open") _update_panel_opacity(true) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE @@ -304,6 +304,13 @@ func request_virtual_keyboard() -> bool: return true +func _focus_entry_after_open() -> void: + if not _opened or not _entry.visible: + return + _entry.grab_focus() + _refresh_input_ownership() + + func is_open() -> bool: return _opened @@ -314,7 +321,13 @@ func is_collapsed() -> bool: func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("open_chat"): - toggle_chat() + if event is InputEventKey: + if _opened: + _focus_entry_after_open() + else: + open_chat() + else: + toggle_chat() get_viewport().set_input_as_handled() return if event is InputEventKey and event.pressed and not event.echo: @@ -796,7 +809,7 @@ func _handle_time_command(parts: PackedStringArray) -> void: "World time set to %s (%s)." % [phase_name, _world_time.get_clock_text()] ) - close_chat() + call_deferred("close_chat") func _on_local_message_confirmed(message: Dictionary) -> void: @@ -811,7 +824,7 @@ func _on_local_message_confirmed(message: Dictionary) -> void: _entry.clear() _set_status("") _flush_draft() - close_chat() + call_deferred("close_chat") func _on_message(message: Dictionary) -> void: diff --git a/ui/fishing_shop.gd b/ui/fishing_shop.gd index 03fdf16..12234c6 100644 --- a/ui/fishing_shop.gd +++ b/ui/fishing_shop.gd @@ -50,7 +50,7 @@ enum ShopSection { const SHOP_SECTION_LABELS: Array[String] = [ "Upgrades", - "Bait", + "Bait and Lures", "Snacks", "Equipment", "Art Supplies", @@ -143,13 +143,19 @@ func _focus_buy_page() -> void: func _build_shop_tabs() -> void: + _shop_tab_bar.custom_minimum_size.y = 44.0 + _shop_tab_bar.show() for section_index: int in range(ShopSection.size()): var tab: OrganizerTab = OrganizerTabType.new() tab.text = SHOP_SECTION_LABELS[section_index] tab.palette_index = section_index + tab.custom_minimum_size = Vector2(132.0, 42.0) tab.size_flags_horizontal = Control.SIZE_EXPAND_FILL + tab.focus_mode = Control.FOCUS_ALL + tab.mouse_filter = Control.MOUSE_FILTER_STOP tab.pressed.connect(_select_shop_section.bind(section_index, true)) _shop_tab_bar.add_child(tab) + tab.show() _shop_tabs.append(tab) _select_shop_section(ShopSection.UPGRADES, false) @@ -287,6 +293,7 @@ func open_shop() -> bool: _feedback.text = "" deactivate_shop_cooler_page() show() + _shop_tab_bar.show() _select_shop_section(ShopSection.UPGRADES, false) _refresh_all() _buy_mode_button.grab_focus() @@ -312,6 +319,7 @@ func get_shop_cooler_mount() -> Control: func activate_shop_cooler_page() -> void: + _shop_tab_bar.hide() _cooler_page_active = true _shop_panel.hide() _shop_cooler_page.show() @@ -319,6 +327,8 @@ func activate_shop_cooler_page() -> void: func deactivate_shop_cooler_page() -> void: + if visible: + _shop_tab_bar.show() _cooler_page_active = false _cooler_modal_open = false _back_to_shop_button.disabled = false @@ -468,10 +478,32 @@ func _refresh_supplies() -> void: if _shop_section == ShopSection.UPGRADES: return _stock_title.text = SHOP_SECTION_LABELS[int(_shop_section)] - for item_id: StringName in FishingShopStockType.get_stock_item_ids(): + var stock_item_ids: Array[StringName] = ( + FishingShopStockType.get_stock_item_ids() + ) + if _shop_section == ShopSection.BAIT: + var grouped_item_ids: Array[StringName] = [] + for item_id: StringName in stock_item_ids: + var bait_item: ItemDataType = _item_catalog.get_item_by_id(item_id) + if bait_item != null and bait_item.is_bait(): + grouped_item_ids.append(item_id) + for item_id: StringName in stock_item_ids: + var lure_item: ItemDataType = _item_catalog.get_item_by_id(item_id) + if lure_item != null and lure_item.is_lure(): + grouped_item_ids.append(item_id) + stock_item_ids = grouped_item_ids + var current_stock_group: StringName = StringName() + for item_id: StringName in stock_item_ids: var item: ItemDataType = _item_catalog.get_item_by_id(item_id) if item == null or not _item_belongs_in_current_section(item): continue + if _shop_section == ShopSection.BAIT: + var stock_group: StringName = ( + &"bait" if item.is_bait() else &"lures" + ) + if stock_group != current_stock_group: + _add_stock_section(str(stock_group)) + current_stock_group = stock_group var button := Button.new() button.custom_minimum_size = Vector2(195, 54) button.icon = item.icon @@ -563,14 +595,11 @@ func _refresh_supplies() -> void: func _item_belongs_in_current_section(item: ItemDataType) -> bool: match _shop_section: ShopSection.BAIT: - return item.is_bait() + return item.is_bait() or item.is_lure() ShopSection.SNACKS: return item.category == ItemDataType.Category.CONSUMABLE ShopSection.EQUIPMENT: - return item.category in [ - ItemDataType.Category.TOOL, - ItemDataType.Category.LURE, - ] + return item.category == ItemDataType.Category.TOOL return false diff --git a/ui/fishing_shop.tscn b/ui/fishing_shop.tscn index 5732baf..ef10a3c 100644 --- a/ui/fishing_shop.tscn +++ b/ui/fishing_shop.tscn @@ -64,6 +64,7 @@ offset_bottom = 104.0 text = "back to shop" [node name="ShopPanel" type="PanelContainer" parent="."] +z_index = 2 unique_name_in_owner = true layout_mode = 1 anchors_preset = 8 @@ -143,9 +144,13 @@ text = "" horizontal_alignment = 1 theme_override_colors/font_color = Color(1, 0.82, 0.4, 1) -[node name="ShopTabBar" type="HBoxContainer" parent="ShopPanel/Margin/Layout"] +[node name="ShopTabBar" type="HBoxContainer" parent="."] unique_name_in_owner = true -layout_mode = 2 +z_index = 1 +offset_left = 298.0 +offset_top = 26.0 +offset_right = 982.0 +offset_bottom = 70.0 alignment = 1 theme_override_constants/separation = 6 diff --git a/ui/game_ui.gd b/ui/game_ui.gd index c2dfca2..5e1c19a 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -93,6 +93,7 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _status_label: Label = %StatusLabel @onready var _bite_prompt_button: Button = %BitePromptButton @onready var _gameplay_transient_hud: Control = %GameplayTransientHUD +@onready var _active_bait_indicator: Control = %ActiveBaitIndicator @onready var _active_bait_button: Button = %ActiveBaitButton @onready var _active_bait_quantity_badge: Panel = %ActiveBaitQuantityBadge @onready var _active_bait_quantity: Label = %ActiveBaitQuantity @@ -114,9 +115,13 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _experience_bubble_label: Label = %ExperienceBubbleLabel const TypewriterRevealType = preload("res://ui/typewriter_reveal.gd") const AnimaleseVoiceType = preload("res://ui/animalese_voice.gd") +const VoiceProfilesType = preload( + "res://player/animalese_voice_profiles.gd" +) const SHOP_ANIMALESE_VOICE_ID: String = "natural" const SHOP_ANIMALESE_BASE_PITCH: float = 1.08 const SHOP_SPEECH_CHARACTERS_PER_SECOND: float = 28.0 +const SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS: int = 5000 @onready var _canonical_stage: Control = %CanonicalStage @@ -136,6 +141,7 @@ const SHOP_SPEECH_CHARACTERS_PER_SECOND: float = 28.0 var _shop_animalese_voice: AnimaleseVoiceType var _shop_npc_player_in_range: bool = false var _shop_npc_spoken_for_current_visit: bool = false +var _shop_npc_next_speech_msec: int = 0 @onready var _effect_status: Label = %EffectStatus @onready var _chat_ui: ChatUIType = %ChatUI @onready var _emote_radial_menu: EmoteRadialMenuType = %EmoteRadialMenu @@ -155,6 +161,9 @@ var _shop_npc_spoken_for_current_visit: bool = false var _showcase_active: bool = false var _player: PlayerType +var _network_chat_service: NetworkChatService +var _network_profile: NetworkProfilePreferences +var _spawn_service: PlayerSpawnService var _bag: PlayerBagType var _item_catalog: ItemCatalogType var _player_menu_open: bool = false @@ -279,6 +288,9 @@ func setup( world_sun: DirectionalLight3D, ) -> void: _player = player + _network_chat_service = network_chat_service + _network_profile = network_profile + _spawn_service = spawn_service _bag = bag _item_catalog = item_catalog _settings_manager = settings_manager @@ -300,6 +312,15 @@ func setup( ): _bag.contents_changed.connect(_on_hud_bait_inventory_changed) _refresh_active_bait_indicator() + if ( + _network_chat_service != null + and not _network_chat_service.character_call_received.is_connected( + _on_character_call_received + ) + ): + _network_chat_service.character_call_received.connect( + _on_character_call_received + ) if ( _experience != null and not _experience.experience_awarded.is_connected( @@ -411,6 +432,12 @@ func _input(event: InputEvent) -> void: and _surface_drawing_toolbar.owns_pointer_event(event) ): return + if event.is_action_pressed("character_call") and _can_use_character_call(): + _network_chat_service.send_local_character_call( + _network_profile.call_id + ) + get_viewport().set_input_as_handled() + return var drawing_can_open: bool = ( _gameplay_ui_enabled and not _system_menu_open @@ -479,6 +506,49 @@ func _input(event: InputEvent) -> void: get_viewport().set_input_as_handled() +func _can_use_character_call() -> bool: + return ( + _gameplay_ui_enabled + and not _system_menu_open + and not _player_menu_open + and not _shop_open + and not _chat_input_open + and not _showcase_active + and not _virtual_mouse_active + and _network_chat_service != null + and _network_profile != null + ) + + +func _on_character_call_received( + peer_id: int, + call_id: String, + pitch_scale: float, +) -> void: + if _spawn_service == null: + return + var avatar: PlayerType = _spawn_service.get_avatar(peer_id) + var audio_path: String = VoiceProfilesType.call_audio_path(call_id) + if avatar == null or not ResourceLoader.exists(audio_path, "AudioStream"): + return + var stream: AudioStream = load(audio_path) as AudioStream + if stream == null: + return + var call_player := AudioStreamPlayer3D.new() + call_player.name = "CharacterCall" + call_player.bus = &"SFX" + call_player.stream = stream + call_player.pitch_scale = pitch_scale + call_player.max_distance = 28.0 + call_player.unit_size = 4.0 + call_player.position = ( + Vector3.UP * 1.25 * avatar.get_character_visual_scale() + ) + avatar.add_child(call_player) + call_player.finished.connect(call_player.queue_free) + call_player.play() + + func _handle_controller_chat_controls(event: InputEvent) -> bool: var button_event: InputEventJoypadButton = event as InputEventJoypadButton if ( @@ -1274,6 +1344,7 @@ func _apply_active_bait_indicator_style() -> void: func _refresh_active_bait_indicator() -> void: + _refresh_active_bait_indicator_visibility() if not is_node_ready(): return var item: ItemDataType @@ -1313,12 +1384,22 @@ func _on_hud_active_bait_changed(_item_id: StringName) -> void: _refresh_active_bait_indicator() +func _refresh_active_bait_indicator_visibility() -> void: + _active_bait_indicator.visible = ( + _gameplay_ui_enabled + and not _system_menu_open + and not _player_menu_open + and not _shop_open + ) + + func _on_hud_bait_inventory_changed() -> void: _refresh_active_bait_indicator() func set_gameplay_ui_enabled(enabled: bool) -> void: _gameplay_ui_enabled = enabled + _refresh_active_bait_indicator_visibility() if enabled: _try_start_shop_npc_speech() _gameplay_transient_hud.visible = enabled and not _player_menu_open @@ -1411,6 +1492,12 @@ func _try_start_shop_npc_speech() -> void: ): return _shop_npc_spoken_for_current_visit = true + var now_msec: int = Time.get_ticks_msec() + if now_msec < _shop_npc_next_speech_msec: + return + _shop_npc_next_speech_msec = ( + now_msec + SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS + ) _ensure_shop_animalese_voice() TypewriterRevealType.start( _shop_prompt_message, @@ -2132,6 +2219,7 @@ func _refresh_hotbar_visibility() -> void: func _emit_interactive_pointer_ui_changed() -> void: + _refresh_active_bait_indicator_visibility() interactive_pointer_ui_changed.emit( _system_menu_open or _player_menu_open or _shop_open or _chat_input_open ) diff --git a/ui/profile_page.gd b/ui/profile_page.gd index 4a9f074..fe3e719 100644 --- a/ui/profile_page.gd +++ b/ui/profile_page.gd @@ -24,6 +24,8 @@ var _draft_voice_id: String = VoiceProfilesType.DEFAULT_ID var _persisted_voice_id: String = VoiceProfilesType.DEFAULT_ID var _draft_speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID var _persisted_speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID +var _draft_call_id: String = VoiceProfilesType.DEFAULT_CALL_ID +var _persisted_call_id: String = VoiceProfilesType.DEFAULT_CALL_ID var _category_id: String = "species" var _dirty: bool = false var _allow_duplicate: bool = false @@ -478,45 +480,54 @@ func _category_label(category_id: String) -> String: func _build_voice_options() -> void: var description := Label.new() description.text = "Choose how your character sounds in chat." + description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + description.size_flags_horizontal = Control.SIZE_EXPAND_FILL + description.add_theme_font_size_override("font_size", 12) description.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY ) _option_list.add_child(description) var grid := GridContainer.new() - grid.columns = 2 - grid.add_theme_constant_override("h_separation", 8) - grid.add_theme_constant_override("v_separation", 8) + grid.columns = 3 + grid.add_theme_constant_override("h_separation", 6) + grid.add_theme_constant_override("v_separation", 4) + grid.size_flags_horizontal = Control.SIZE_EXPAND_FILL _option_list.add_child(grid) for option: Dictionary in VoiceProfilesType.OPTIONS: var option_id := str(option.get("id", "")) var button := Button.new() button.text = str(option.get("label", option_id)) button.toggle_mode = true - button.custom_minimum_size = Vector2(170.0, 42.0) + button.custom_minimum_size = Vector2(108.0, 32.0) + button.size_flags_horizontal = Control.SIZE_EXPAND_FILL button.button_pressed = _draft_voice_id == option_id button.pressed.connect(_select_voice_option.bind(option_id)) UtilityPageStyle.apply_compact_ocean_button(button) grid.add_child(button) var divider := HSeparator.new() - divider.custom_minimum_size.y = 8.0 + divider.custom_minimum_size.y = 2.0 _option_list.add_child(divider) var speed_title := Label.new() speed_title.text = "speech speed" - speed_title.add_theme_font_size_override("font_size", 16) + speed_title.add_theme_font_size_override("font_size", 13) speed_title.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY ) _option_list.add_child(speed_title) var speed_description := Label.new() - speed_description.text = "Controls player chat speech on this device only." + speed_description.text = "Controls chat speech on this device only." + speed_description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + speed_description.size_flags_horizontal = Control.SIZE_EXPAND_FILL + speed_description.add_theme_font_size_override("font_size", 12) speed_description.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY ) _option_list.add_child(speed_description) var speed_grid := GridContainer.new() - speed_grid.columns = 2 - speed_grid.add_theme_constant_override("h_separation", 8) - speed_grid.add_theme_constant_override("v_separation", 8) + speed_grid.columns = 3 + speed_grid.add_theme_constant_override("h_separation", 6) + speed_grid.add_theme_constant_override("v_separation", 4) + speed_grid.size_flags_horizontal = Control.SIZE_EXPAND_FILL _option_list.add_child(speed_grid) for option: Dictionary in VoiceProfilesType.SPEED_OPTIONS: var speed_id := str(option.get("id", "")) @@ -526,13 +537,49 @@ func _build_voice_options() -> void: float(option.get("characters_per_second", 28.0)) ) speed_button.toggle_mode = true - speed_button.custom_minimum_size = Vector2(170.0, 38.0) + speed_button.custom_minimum_size = Vector2(108.0, 32.0) + speed_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL speed_button.button_pressed = _draft_speech_speed_id == speed_id speed_button.pressed.connect( _select_speech_speed_option.bind(speed_id) ) UtilityPageStyle.apply_compact_ocean_button(speed_button) speed_grid.add_child(speed_button) + var call_divider := HSeparator.new() + call_divider.custom_minimum_size.y = 2.0 + _option_list.add_child(call_divider) + var call_title := Label.new() + call_title.text = "call" + call_title.add_theme_font_size_override("font_size", 13) + call_title.add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY + ) + _option_list.add_child(call_title) + var call_description := Label.new() + call_description.text = "Press G to make this sound." + call_description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + call_description.size_flags_horizontal = Control.SIZE_EXPAND_FILL + call_description.add_theme_font_size_override("font_size", 12) + call_description.add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY + ) + _option_list.add_child(call_description) + var call_grid := GridContainer.new() + call_grid.columns = 2 + call_grid.add_theme_constant_override("h_separation", 8) + call_grid.add_theme_constant_override("v_separation", 8) + _option_list.add_child(call_grid) + for option: Dictionary in VoiceProfilesType.CALL_OPTIONS: + var call_id := str(option.get("id", "")) + var call_button := Button.new() + call_button.text = str(option.get("label", call_id)) + call_button.toggle_mode = true + call_button.custom_minimum_size = Vector2(108.0, 32.0) + call_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + call_button.button_pressed = _draft_call_id == call_id + call_button.pressed.connect(_select_call_option.bind(call_id)) + UtilityPageStyle.apply_compact_ocean_button(call_button) + call_grid.add_child(call_button) func _select_voice_option(voice_id: String) -> void: @@ -555,6 +602,15 @@ func _select_speech_speed_option(speed_id: String) -> void: _play_voice_preview() +func _select_call_option(call_id: String) -> void: + if not VoiceProfilesType.is_valid_call(call_id): + return + _draft_call_id = call_id + _dirty = _draft_differs() + _refresh_options() + _refresh_actions() + + func _play_voice_preview() -> void: if _voice_preview_tween != null and _voice_preview_tween.is_valid(): _voice_preview_tween.kill() @@ -982,6 +1038,7 @@ func _apply() -> void: _allow_duplicate, _draft_voice_id, _draft_speech_speed_id, + _draft_call_id, ) @@ -1001,10 +1058,12 @@ func _load_persisted() -> void: _persisted_speech_speed_id = ( _service.get_persisted_speech_speed_id() ) + _persisted_call_id = _service.get_persisted_call_id() _draft_name = _persisted_name _draft_appearance = _persisted_appearance.duplicate(true) _draft_voice_id = _persisted_voice_id _draft_speech_speed_id = _persisted_speech_speed_id + _draft_call_id = _persisted_call_id TypewriterRevealType.set_characters_per_second( VoiceProfilesType.speed_for(_persisted_speech_speed_id) ) @@ -1045,6 +1104,7 @@ func _confirm_pending_action() -> void: _draft_appearance = CharacterCustomizationCatalog.default_snapshot() _draft_voice_id = VoiceProfilesType.DEFAULT_ID _draft_speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID + _draft_call_id = VoiceProfilesType.DEFAULT_CALL_ID _preview.apply_appearance_profile(_draft_appearance) _dirty = _draft_differs() _refresh_options() @@ -1060,6 +1120,7 @@ func _draft_differs() -> bool: or _draft_appearance != _persisted_appearance or _draft_voice_id != _persisted_voice_id or _draft_speech_speed_id != _persisted_speech_speed_id + or _draft_call_id != _persisted_call_id ) diff --git a/ui/settings/settings_bubble_page.gd b/ui/settings/settings_bubble_page.gd index 4710be9..dd01309 100644 --- a/ui/settings/settings_bubble_page.gd +++ b/ui/settings/settings_bubble_page.gd @@ -19,7 +19,7 @@ const ControllerFocusNavigationType = preload( var _cluster: BubbleCluster var _bubbles: Array[BubbleButton] = [] -var _focus_bubbles: Array[BubbleButton] = [] +var _focus_controls: Array[Control] = [] var _transition: Tween var _transition_generation: int = 0 var _resting_cluster_position: Vector2 = Vector2.ZERO @@ -33,9 +33,9 @@ func _ready() -> void: if bubble != null: _bubbles.append(bubble) for path: NodePath in focus_paths: - var bubble := get_node(path) as BubbleButton - if bubble != null: - _focus_bubbles.append(bubble) + var focus_control := get_node(path) as Control + if focus_control != null: + _focus_controls.append(focus_control) _cluster.configure(_bubbles) _configure_focus_order() resized.connect(_update_layout) @@ -173,13 +173,13 @@ func _update_layout() -> void: _cluster.position = _resting_cluster_position _cluster.size = field_size _cluster.apply_layout(field_size, compact) - ControllerFocusNavigationType.configure_spatial_neighbors(_focus_bubbles) + ControllerFocusNavigationType.configure_spatial_neighbors(_focus_controls) func _configure_focus_order() -> void: for bubble: BubbleButton in _bubbles: bubble.focus_mode = Control.FOCUS_NONE - ControllerFocusNavigationType.configure_spatial_neighbors(_focus_bubbles) + ControllerFocusNavigationType.configure_spatial_neighbors(_focus_controls) func _set_interactive(interactive: bool) -> void: @@ -188,11 +188,11 @@ func _set_interactive(interactive: bool) -> void: if interactive else Control.MOUSE_FILTER_IGNORE ) - for bubble: BubbleButton in _focus_bubbles: - bubble.focus_mode = ( + for focus_control: Control in _focus_controls: + focus_control.focus_mode = ( Control.FOCUS_ALL if interactive else Control.FOCUS_NONE ) - bubble.mouse_filter = ( + focus_control.mouse_filter = ( Control.MOUSE_FILTER_STOP if interactive else Control.MOUSE_FILTER_IGNORE diff --git a/ui/settings_panel.gd b/ui/settings_panel.gd index 640cc1d..857ce4b 100644 --- a/ui/settings_panel.gd +++ b/ui/settings_panel.gd @@ -5,6 +5,7 @@ const MAX_PANEL_SIZE: Vector2 = Vector2(960.0, 700.0) const PANEL_EDGE_MARGIN: float = 16.0 const PAGE_ROOT: StringName = &"root" const PAGE_DISPLAY: StringName = &"display" +const PAGE_SOUND: StringName = &"sound" const PAGE_CONTROLS: StringName = &"controls" const PAGE_ACCESSIBILITY: StringName = &"accessibility" const PAGE_DATA: StringName = &"data" @@ -40,6 +41,7 @@ enum PresentationMode { @onready var _root_page: SettingsBubblePage = %RootPage @onready var _display_page: SettingsBubblePage = %DisplayPage +@onready var _sound_page: SettingsBubblePage = %SoundPage @onready var _controls_page: SettingsBubblePage = %ControlsPage @onready var _accessibility_page: SettingsBubblePage = %AccessibilityPage @onready var _data_page: SettingsBubblePage = %DataPage @@ -50,12 +52,21 @@ enum PresentationMode { @onready var _chat_dock: BubbleButton = %ChatDock @onready var _chat_mode: BubbleButton = %ChatMode @onready var _paint_dock: BubbleButton = %PaintDock +@onready var _fullscreen_toggle: BubbleButton = %FullscreenToggle @onready var _mouse_value: BubbleButton = %MouseValue @onready var _controller_value: BubbleButton = %ControllerValue @onready var _invert_y_toggle: BubbleButton = %InvertYToggle @onready var _on_screen_keyboard_toggle: BubbleButton = %OnScreenKeyboardToggle @onready var _auto_click_toggle: BubbleButton = %AutoClickToggle @onready var _auto_click_interval: BubbleButton = %AutoClickIntervalValue +@onready var _master_volume_slider: HSlider = %MasterVolumeSlider +@onready var _music_volume_slider: HSlider = %MusicVolumeSlider +@onready var _effects_volume_slider: HSlider = %EffectsVolumeSlider +@onready var _environment_volume_slider: HSlider = %EnvironmentVolumeSlider +@onready var _master_volume_value: Label = %MasterVolumeValue +@onready var _music_volume_value: Label = %MusicVolumeValue +@onready var _effects_volume_value: Label = %EffectsVolumeValue +@onready var _environment_volume_value: Label = %EnvironmentVolumeValue @onready var _world_options: Array[BubbleButton] = [ %WorldLegible, @@ -86,6 +97,10 @@ var _mouse_sensitivity: float = 0.005 var _controller_sensitivity: float = 2.5 var _invert_camera_y: bool = false var _on_screen_keyboard_enabled: bool = false +var _master_volume: float = 1.0 +var _music_volume: float = 1.0 +var _effects_volume: float = 1.0 +var _environment_volume: float = 1.0 var _network_profile: NetworkProfilePreferences var _network_session: NetworkSession var _data_root: PlayerDataRoot @@ -111,11 +126,13 @@ func _ready() -> void: _pages = { PAGE_ROOT: _root_page, PAGE_DISPLAY: _display_page, + PAGE_SOUND: _sound_page, PAGE_CONTROLS: _controls_page, PAGE_ACCESSIBILITY: _accessibility_page, PAGE_DATA: _data_page, } %DisplayCategory.pressed.connect(_push_page.bind(PAGE_DISPLAY)) + %SoundCategory.pressed.connect(_push_page.bind(PAGE_SOUND)) %ControlsCategory.pressed.connect(_push_page.bind(PAGE_CONTROLS)) %AccessibilityCategory.pressed.connect( _push_page.bind(PAGE_ACCESSIBILITY) @@ -124,12 +141,14 @@ func _ready() -> void: %ApplySettingsButton.pressed.connect(_apply_settings) %RootBackButton.pressed.connect(close_panel) %DisplayBackButton.pressed.connect(handle_back) + %SoundBackButton.pressed.connect(handle_back) %ControlsBackButton.pressed.connect(handle_back) %ControllerMapping.pressed.connect(_open_controller_mapping) %AccessibilityBackButton.pressed.connect(handle_back) %DataBackButton.pressed.connect(handle_back) %RootBackButton.gui_input.connect(_on_back_bubble_gui_input) %DisplayBackButton.gui_input.connect(_on_back_bubble_gui_input) + %SoundBackButton.gui_input.connect(_on_back_bubble_gui_input) %ControlsBackButton.gui_input.connect(_on_back_bubble_gui_input) %AccessibilityBackButton.gui_input.connect(_on_back_bubble_gui_input) %DataBackButton.gui_input.connect(_on_back_bubble_gui_input) @@ -150,6 +169,7 @@ func _ready() -> void: _chat_dock.pressed.connect(_toggle_chat_dock) _chat_mode.pressed.connect(_toggle_chat_mode) _paint_dock.pressed.connect(_toggle_paint_dock) + _fullscreen_toggle.pressed.connect(_toggle_fullscreen) %MouseDecrease.pressed.connect(_adjust_mouse_sensitivity.bind(-1)) %MouseIncrease.pressed.connect(_adjust_mouse_sensitivity.bind(1)) _mouse_value.pressed.connect(_adjust_mouse_sensitivity.bind(1)) @@ -177,6 +197,18 @@ func _ready() -> void: _auto_click_interval.pressed.connect( _adjust_auto_click_interval.bind(1) ) + _master_volume_slider.value_changed.connect( + _on_audio_volume_changed.bind(&"master") + ) + _music_volume_slider.value_changed.connect( + _on_audio_volume_changed.bind(&"music") + ) + _effects_volume_slider.value_changed.connect( + _on_audio_volume_changed.bind(&"effects") + ) + _environment_volume_slider.value_changed.connect( + _on_audio_volume_changed.bind(&"environment") + ) _mouse_value.gui_input.connect( _on_continuous_value_input.bind(&"mouse") ) @@ -198,6 +230,7 @@ func _ready() -> void: _on_controller_mapping_panel_closed ) _style_data_page() + _style_sound_page() call_deferred("_refresh_panel_size") @@ -708,6 +741,10 @@ func _apply_settings() -> void: edited.controller_camera_sensitivity = _controller_sensitivity edited.invert_camera_y = _invert_camera_y edited.on_screen_keyboard_enabled = _on_screen_keyboard_enabled + edited.master_volume = _master_volume + edited.music_volume = _music_volume + edited.effects_volume = _effects_volume + edited.environment_volume = _environment_volume if _settings_manager.apply_settings(edited): if ( _presentation_mode == PresentationMode.TITLE_EMBEDDED @@ -730,6 +767,17 @@ func _load_controls() -> void: _controller_sensitivity = settings.controller_camera_sensitivity _invert_camera_y = settings.invert_camera_y _on_screen_keyboard_enabled = settings.on_screen_keyboard_enabled + _master_volume = settings.master_volume + _music_volume = settings.music_volume + _effects_volume = settings.effects_volume + _environment_volume = settings.environment_volume + _master_volume_slider.set_value_no_signal(_master_volume * 100.0) + _music_volume_slider.set_value_no_signal(_music_volume * 100.0) + _effects_volume_slider.set_value_no_signal(_effects_volume * 100.0) + _environment_volume_slider.set_value_no_signal( + _environment_volume * 100.0 + ) + _settings_manager.restore_audio_levels() _refresh_value_labels() @@ -752,6 +800,9 @@ func _refresh_value_labels() -> void: _paint_dock.text = ( "paint dock\n" + ("right" if settings.paint_dock_right else "left") ) + _fullscreen_toggle.text = ( + "fullscreen\n" + ("on" if settings.fullscreen_enabled else "off") + ) _mouse_value.text = "mouse\nsensitivity\n%.4f" % _mouse_sensitivity _controller_value.text = ( "controller\nsensitivity\n%.1f" % _controller_sensitivity @@ -771,6 +822,7 @@ func _refresh_value_labels() -> void: _auto_click_interval.text = ( "auto-click\ninterval\n%.2f s" % _auto_click_interval_value ) + _refresh_audio_value_labels() for index: int in _world_options.size(): _world_options[index].button_pressed = ( index + 1 == settings.world_pixel_size @@ -803,6 +855,49 @@ func _style_data_page() -> void: ) +func _style_sound_page() -> void: + UtilityPageStyle.apply_page(_sound_page) + var paper := _sound_page.get_node("Paper") as PanelContainer + paper.add_theme_stylebox_override( + "panel", UtilityPageStyle.panel_style() + ) + var content := _sound_page.get_node("Paper/Content") as VBoxContainer + for node: Node in content.find_children("*", "Label", true, false): + (node as Label).add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY + ) + + +func _on_audio_volume_changed(value: float, channel: StringName) -> void: + var linear_volume: float = clampf(value / 100.0, 0.0, 1.0) + match channel: + &"master": + _master_volume = linear_volume + &"music": + _music_volume = linear_volume + &"effects": + _effects_volume = linear_volume + &"environment": + _environment_volume = linear_volume + _refresh_audio_value_labels() + if _settings_manager != null: + _settings_manager.preview_audio_levels( + _master_volume, + _music_volume, + _effects_volume, + _environment_volume, + ) + + +func _refresh_audio_value_labels() -> void: + _master_volume_value.text = "%d%%" % roundi(_master_volume * 100.0) + _music_volume_value.text = "%d%%" % roundi(_music_volume * 100.0) + _effects_volume_value.text = "%d%%" % roundi(_effects_volume * 100.0) + _environment_volume_value.text = ( + "%d%%" % roundi(_environment_volume * 100.0) + ) + + func _set_world_pixelation(pixel_size: int) -> void: if _settings_manager == null: return @@ -849,6 +944,17 @@ func _toggle_chat_mode() -> void: _refresh_value_labels() +func _toggle_fullscreen() -> void: + if _settings_manager == null: + return + var edited: PlayerSettings = _settings_manager.current_settings.copy() + edited.fullscreen_enabled = not edited.fullscreen_enabled + if not _settings_manager.apply_settings(edited): + _feedback.text = "failed to save fullscreen setting." + return + _refresh_value_labels() + + func _toggle_paint_dock() -> void: if _settings_manager == null: return diff --git a/ui/settings_panel.tscn b/ui/settings_panel.tscn index e831674..4cf1681 100644 --- a/ui/settings_panel.tscn +++ b/ui/settings_panel.tscn @@ -41,8 +41,8 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("3_page") page_id = &"root" -bubble_paths = Array[NodePath]([NodePath("BubbleCluster/DisplayCategory"), NodePath("BubbleCluster/ControlsCategory"), NodePath("BubbleCluster/AccessibilityCategory"), NodePath("BubbleCluster/DataCategory"), NodePath("BubbleCluster/ApplySettingsButton"), NodePath("BubbleCluster/RootBackButton")]) -focus_paths = Array[NodePath]([NodePath("BubbleCluster/DisplayCategory"), NodePath("BubbleCluster/ControlsCategory"), NodePath("BubbleCluster/AccessibilityCategory"), NodePath("BubbleCluster/DataCategory"), NodePath("BubbleCluster/ApplySettingsButton"), NodePath("BubbleCluster/RootBackButton")]) +bubble_paths = Array[NodePath]([NodePath("BubbleCluster/DisplayCategory"), NodePath("BubbleCluster/SoundCategory"), NodePath("BubbleCluster/ControlsCategory"), NodePath("BubbleCluster/AccessibilityCategory"), NodePath("BubbleCluster/DataCategory"), NodePath("BubbleCluster/ApplySettingsButton"), NodePath("BubbleCluster/RootBackButton")]) +focus_paths = Array[NodePath]([NodePath("BubbleCluster/DisplayCategory"), NodePath("BubbleCluster/SoundCategory"), NodePath("BubbleCluster/ControlsCategory"), NodePath("BubbleCluster/AccessibilityCategory"), NodePath("BubbleCluster/DataCategory"), NodePath("BubbleCluster/ApplySettingsButton"), NodePath("BubbleCluster/RootBackButton")]) initial_focus_path = NodePath("BubbleCluster/DisplayCategory") back_focus_path = NodePath("BubbleCluster/RootBackButton") compact_maximum_layout_size = Vector2(544, 400) @@ -88,6 +88,18 @@ minimum_font_size = 17 maximum_font_size = 25 motion_phase = 1.45 +[node name="SoundCategory" parent="RootPage/BubbleCluster" instance=ExtResource("4_bubble")] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 0) +text = "sound" +neutral_size = Vector2(144, 136) +desktop_anchor = Vector2(100, 180) +compact_anchor = Vector2(90, 150) +compact_minimum_size = Vector2(118, 112) +minimum_font_size = 17 +maximum_font_size = 25 +motion_phase = 2.0 + [node name="AccessibilityCategory" parent="RootPage/BubbleCluster" instance=ExtResource("4_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) @@ -163,8 +175,8 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("3_page") page_id = &"display" -bubble_paths = Array[NodePath]([NodePath("BubbleCluster/WorldValue"), NodePath("BubbleCluster/WorldLegible"), NodePath("BubbleCluster/WorldCute"), NodePath("BubbleCluster/WorldRetro"), NodePath("BubbleCluster/WorldHardcore"), NodePath("BubbleCluster/WorldWtf"), NodePath("BubbleCluster/UIValue"), NodePath("BubbleCluster/UILegible"), NodePath("BubbleCluster/UICute"), NodePath("BubbleCluster/UIRetro"), NodePath("BubbleCluster/UIHardcore"), NodePath("BubbleCluster/UIWtf"), NodePath("BubbleCluster/ChatDock"), NodePath("BubbleCluster/ChatMode"), NodePath("BubbleCluster/PaintDock"), NodePath("BubbleCluster/DisplayBackButton")]) -focus_paths = Array[NodePath]([NodePath("BubbleCluster/WorldLegible"), NodePath("BubbleCluster/WorldCute"), NodePath("BubbleCluster/WorldRetro"), NodePath("BubbleCluster/WorldHardcore"), NodePath("BubbleCluster/WorldWtf"), NodePath("BubbleCluster/UILegible"), NodePath("BubbleCluster/UICute"), NodePath("BubbleCluster/UIRetro"), NodePath("BubbleCluster/UIHardcore"), NodePath("BubbleCluster/UIWtf"), NodePath("BubbleCluster/ChatDock"), NodePath("BubbleCluster/ChatMode"), NodePath("BubbleCluster/PaintDock"), NodePath("BubbleCluster/DisplayBackButton")]) +bubble_paths = Array[NodePath]([NodePath("BubbleCluster/WorldValue"), NodePath("BubbleCluster/WorldLegible"), NodePath("BubbleCluster/WorldCute"), NodePath("BubbleCluster/WorldRetro"), NodePath("BubbleCluster/WorldHardcore"), NodePath("BubbleCluster/WorldWtf"), NodePath("BubbleCluster/UIValue"), NodePath("BubbleCluster/UILegible"), NodePath("BubbleCluster/UICute"), NodePath("BubbleCluster/UIRetro"), NodePath("BubbleCluster/UIHardcore"), NodePath("BubbleCluster/UIWtf"), NodePath("BubbleCluster/ChatDock"), NodePath("BubbleCluster/ChatMode"), NodePath("BubbleCluster/PaintDock"), NodePath("BubbleCluster/FullscreenToggle"), NodePath("BubbleCluster/DisplayBackButton")]) +focus_paths = Array[NodePath]([NodePath("BubbleCluster/WorldLegible"), NodePath("BubbleCluster/WorldCute"), NodePath("BubbleCluster/WorldRetro"), NodePath("BubbleCluster/WorldHardcore"), NodePath("BubbleCluster/WorldWtf"), NodePath("BubbleCluster/UILegible"), NodePath("BubbleCluster/UICute"), NodePath("BubbleCluster/UIRetro"), NodePath("BubbleCluster/UIHardcore"), NodePath("BubbleCluster/UIWtf"), NodePath("BubbleCluster/ChatDock"), NodePath("BubbleCluster/ChatMode"), NodePath("BubbleCluster/PaintDock"), NodePath("BubbleCluster/FullscreenToggle"), NodePath("BubbleCluster/DisplayBackButton")]) initial_focus_path = NodePath("BubbleCluster/WorldRetro") back_focus_path = NodePath("BubbleCluster/DisplayBackButton") compact_maximum_layout_size = Vector2(544, 400) @@ -343,8 +355,8 @@ unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) text = "chat dock\nleft" neutral_size = Vector2(96, 96) -desktop_anchor = Vector2(105, 435) -compact_anchor = Vector2(76, 378) +desktop_anchor = Vector2(70, 435) +compact_anchor = Vector2(55, 378) compact_minimum_size = Vector2(82, 82) minimum_font_size = 12 maximum_font_size = 16 @@ -355,8 +367,8 @@ unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) text = "chat mode\ndesktop" neutral_size = Vector2(96, 96) -desktop_anchor = Vector2(275, 435) -compact_anchor = Vector2(225, 378) +desktop_anchor = Vector2(215, 435) +compact_anchor = Vector2(180, 378) compact_minimum_size = Vector2(82, 82) minimum_font_size = 12 maximum_font_size = 16 @@ -367,24 +379,215 @@ unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) text = "paint dock\nright" neutral_size = Vector2(96, 96) -desktop_anchor = Vector2(445, 435) -compact_anchor = Vector2(380, 378) +desktop_anchor = Vector2(360, 435) +compact_anchor = Vector2(305, 378) compact_minimum_size = Vector2(82, 82) minimum_font_size = 12 maximum_font_size = 16 motion_phase = 1.7 +[node name="FullscreenToggle" parent="DisplayPage/BubbleCluster" instance=ExtResource("4_bubble")] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 0) +text = "fullscreen\noff" +neutral_size = Vector2(104, 96) +desktop_anchor = Vector2(505, 435) +compact_anchor = Vector2(430, 378) +compact_minimum_size = Vector2(88, 82) +minimum_font_size = 11 +maximum_font_size = 15 +motion_phase = 1.85 + [node name="DisplayBackButton" parent="DisplayPage/BubbleCluster" instance=ExtResource("4_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) text = "back" neutral_size = Vector2(96, 90) -desktop_anchor = Vector2(615, 435) -compact_anchor = Vector2(530, 378) +desktop_anchor = Vector2(650, 435) +compact_anchor = Vector2(555, 378) compact_minimum_size = Vector2(82, 78) minimum_font_size = 13 maximum_font_size = 16 -motion_phase = 2.0 +motion_phase = 2.15 + +[node name="SoundPage" type="Control" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("3_page") +page_id = &"sound" +bubble_paths = Array[NodePath]([NodePath("BubbleCluster/SoundBackButton")]) +focus_paths = Array[NodePath]([NodePath("Paper/Content/VolumeGrid/MasterVolumeSlider"), NodePath("Paper/Content/VolumeGrid/MusicVolumeSlider"), NodePath("Paper/Content/VolumeGrid/EffectsVolumeSlider"), NodePath("Paper/Content/VolumeGrid/EnvironmentVolumeSlider"), NodePath("BubbleCluster/SoundBackButton")]) +initial_focus_path = NodePath("Paper/Content/VolumeGrid/MasterVolumeSlider") +back_focus_path = NodePath("BubbleCluster/SoundBackButton") +compact_maximum_layout_size = Vector2(544, 400) + +[node name="BubbleCluster" type="Control" parent="SoundPage"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 520.0 +script = ExtResource("5_cluster") +profile = ExtResource("6_profile") +desktop_reference_size = Vector2(720, 520) +compact_reference_size = Vector2(608, 448) + +[node name="Paper" type="PanelContainer" parent="SoundPage"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -310.0 +offset_top = -230.0 +offset_right = 310.0 +offset_bottom = 205.0 +grow_horizontal = 2 +grow_vertical = 2 +z_index = 1 + +[node name="Content" type="VBoxContainer" parent="SoundPage/Paper"] +layout_mode = 2 +theme_override_constants/separation = 18 + +[node name="Heading" type="Label" parent="SoundPage/Paper/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 28 +text = "sound" +horizontal_alignment = 1 + +[node name="Helper" type="Label" parent="SoundPage/Paper/Content"] +layout_mode = 2 +text = "Adjust the mix. Changes are saved when you apply settings." +horizontal_alignment = 1 + +[node name="VolumeGrid" type="GridContainer" parent="SoundPage/Paper/Content"] +layout_mode = 2 +theme_override_constants/h_separation = 16 +theme_override_constants/v_separation = 18 +columns = 3 + +[node name="MasterLabel" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +custom_minimum_size = Vector2(118, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "master" +vertical_alignment = 1 + +[node name="MasterVolumeSlider" type="HSlider" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(350, 42) +layout_mode = 2 +focus_mode = 2 +tooltip_text = "master volume" +max_value = 100.0 +step = 1.0 +value = 100.0 + +[node name="MasterVolumeValue" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(70, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="MusicLabel" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +custom_minimum_size = Vector2(118, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "music" +vertical_alignment = 1 + +[node name="MusicVolumeSlider" type="HSlider" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(350, 42) +layout_mode = 2 +focus_mode = 2 +tooltip_text = "music volume" +max_value = 100.0 +step = 1.0 +value = 100.0 + +[node name="MusicVolumeValue" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(70, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="EffectsLabel" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +custom_minimum_size = Vector2(118, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "effects" +vertical_alignment = 1 + +[node name="EffectsVolumeSlider" type="HSlider" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(350, 42) +layout_mode = 2 +focus_mode = 2 +tooltip_text = "effects volume" +max_value = 100.0 +step = 1.0 +value = 100.0 + +[node name="EffectsVolumeValue" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(70, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="EnvironmentLabel" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +custom_minimum_size = Vector2(118, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "environment" +vertical_alignment = 1 + +[node name="EnvironmentVolumeSlider" type="HSlider" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(350, 42) +layout_mode = 2 +focus_mode = 2 +tooltip_text = "environment volume" +max_value = 100.0 +step = 1.0 +value = 100.0 + +[node name="EnvironmentVolumeValue" type="Label" parent="SoundPage/Paper/Content/VolumeGrid"] +unique_name_in_owner = true +custom_minimum_size = Vector2(70, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="SoundBackButton" parent="SoundPage/BubbleCluster" instance=ExtResource("4_bubble")] +unique_name_in_owner = true +z_index = 4 +layout_mode = 0 +text = "back" +neutral_size = Vector2(96, 90) +desktop_anchor = Vector2(60, 460) +compact_anchor = Vector2(55, 410) +compact_minimum_size = Vector2(82, 78) +minimum_font_size = 13 +maximum_font_size = 16 +motion_phase = 5.0 [node name="ControlsPage" type="Control" parent="."] unique_name_in_owner = true diff --git a/world/rain_ambience.gd b/world/rain_ambience.gd index dd9900a..acea9fd 100644 --- a/world/rain_ambience.gd +++ b/world/rain_ambience.gd @@ -15,7 +15,7 @@ var _is_active: bool = false func _ready() -> void: - bus = &"SFX" + bus = &"Environment" var rain_stream := load(RAIN_STREAM_PATH) as AudioStreamOggVorbis var runtime_stream := ( rain_stream.duplicate() as AudioStreamOggVorbis diff --git a/world/shoreline_ambience.gd b/world/shoreline_ambience.gd index 959cb93..81e9c65 100644 --- a/world/shoreline_ambience.gd +++ b/world/shoreline_ambience.gd @@ -18,6 +18,7 @@ var _is_active := false func _ready() -> void: + _waves_audio.bus = &"Environment" _configure_audio_loop(_waves_audio.stream) _waves_audio.volume_db = -80.0 set_process(false)