fix(chat): support body and content fields in world and DM chat messages; feat(audio): add sound toggle switch and mute controls
checkpoint / checkpoint (push) Successful in 6m11s
checkpoint / checkpoint (push) Successful in 6m11s
This commit is contained in:
@@ -13,10 +13,16 @@ const STREAM_BELL: AudioStream = preload("res://assets/audio/bell.wav")
|
||||
const STREAM_DOOR: AudioStream = preload("res://assets/audio/door_open.wav")
|
||||
|
||||
const POOL_SIZE: int = 16
|
||||
const SETTINGS_FILE := "user://audio_settings.json"
|
||||
|
||||
signal sound_toggled(enabled: bool)
|
||||
|
||||
var _players: Array[AudioStreamPlayer] = []
|
||||
var _player_index: int = 0
|
||||
|
||||
## Whether sound effects and audio output are enabled.
|
||||
var sound_enabled: bool = true
|
||||
|
||||
## Number of active AudioStreamPlayers in the pool.
|
||||
var pool_size: int:
|
||||
get:
|
||||
@@ -26,12 +32,59 @@ var pool_size: int:
|
||||
func _ready() -> void:
|
||||
process_mode = Node.PROCESS_MODE_ALWAYS
|
||||
_init_pool()
|
||||
_load_settings()
|
||||
var tree := get_tree()
|
||||
if tree != null:
|
||||
tree.node_added.connect(_on_node_added)
|
||||
_hook_existing_buttons(tree.root)
|
||||
|
||||
|
||||
func _load_settings() -> void:
|
||||
if FileAccess.file_exists(SETTINGS_FILE):
|
||||
var file := FileAccess.open(SETTINGS_FILE, FileAccess.READ)
|
||||
if file != null:
|
||||
var text := file.get_as_text()
|
||||
var parsed = JSON.parse_string(text)
|
||||
if parsed is Dictionary and parsed.has("sound_enabled"):
|
||||
set_sound_enabled(bool(parsed["sound_enabled"]), false)
|
||||
return
|
||||
set_sound_enabled(true, false)
|
||||
|
||||
|
||||
func _save_settings() -> void:
|
||||
var file := FileAccess.open(SETTINGS_FILE, FileAccess.WRITE)
|
||||
if file != null:
|
||||
file.store_string(JSON.stringify({"sound_enabled": sound_enabled}))
|
||||
|
||||
|
||||
## Check whether sound is currently enabled.
|
||||
func is_sound_enabled() -> bool:
|
||||
return sound_enabled
|
||||
|
||||
|
||||
## Enable or disable sound output.
|
||||
func set_sound_enabled(enabled: bool, save: bool = true) -> void:
|
||||
sound_enabled = enabled
|
||||
if not sound_enabled:
|
||||
for player in _players:
|
||||
if player != null and is_instance_valid(player) and player.playing:
|
||||
player.stop()
|
||||
var master_idx := AudioServer.get_bus_index("Master")
|
||||
if master_idx >= 0:
|
||||
AudioServer.set_bus_mute(master_idx, not sound_enabled)
|
||||
if save:
|
||||
_save_settings()
|
||||
sound_toggled.emit(sound_enabled)
|
||||
|
||||
|
||||
## Toggle sound between ON and OFF. Returns new state.
|
||||
func toggle_sound() -> bool:
|
||||
set_sound_enabled(not sound_enabled)
|
||||
if sound_enabled:
|
||||
play_click()
|
||||
return sound_enabled
|
||||
|
||||
|
||||
func _init_pool() -> void:
|
||||
if not _players.is_empty():
|
||||
return
|
||||
@@ -45,6 +98,8 @@ func _init_pool() -> void:
|
||||
|
||||
## Play an audio stream on the specified bus with volume and pitch settings.
|
||||
func play_sound(stream: AudioStream, bus: String = "Master", volume_db: float = 0.0, pitch_scale: float = 1.0) -> AudioStreamPlayer:
|
||||
if not sound_enabled:
|
||||
return null
|
||||
if stream == null:
|
||||
return null
|
||||
if _players.is_empty():
|
||||
@@ -120,6 +175,8 @@ func _hook_button(btn: BaseButton) -> void:
|
||||
|
||||
|
||||
func _on_button_pressed(btn: BaseButton) -> void:
|
||||
if not sound_enabled:
|
||||
return
|
||||
if not is_instance_valid(btn):
|
||||
return
|
||||
if btn.is_in_group("no_click_sound"):
|
||||
|
||||
Reference in New Issue
Block a user