bevy_mortar_bond 0.4.0

Bevy integration plug-in for mortar language
Documentation
//! # audio.rs
//!
//! # audio.rs 文件
//!
//! ## Module Overview
//!
//! ## 模块概述
//!
//! Contains the optional audio bridge for Mortar dialogue events. It interprets
//! `play_sound` gameplay events emitted by the dialogue layer and, when enabled, spawns Bevy audio
//! players using the configured playback policy.
//!
//! 包含 Mortar 对话事件到音频系统的可选桥接。它会解释对话层发出的 `play_sound`
//! 游戏事件,并在启用时按照配置好的播放策略生成 Bevy 音频播放器。

use crate::MortarGameEvent;
use bevy::prelude::*;

/// Configures how Mortar handles `play_sound` events.
///
/// 配置 Mortar 如何处理 `play_sound` 事件。
#[derive(Resource, Clone, Copy)]
pub struct MortarAudioSettings {
    /// Whether the runtime should automatically spawn [`AudioPlayer`]s for `play_sound`.
    ///
    /// 是否自动为 `play_sound` 事件创建 [`AudioPlayer`]。
    pub auto_play_sound_events: bool,
    /// Playback configuration applied to auto-spawned audio players.
    ///
    /// 自动播放的音频所使用的播放配置。
    pub playback_settings: PlaybackSettings,
}

impl Default for MortarAudioSettings {
    fn default() -> Self {
        Self {
            auto_play_sound_events: true,
            playback_settings: PlaybackSettings::DESPAWN,
        }
    }
}

pub(crate) fn auto_play_sound_events(
    settings: Res<MortarAudioSettings>,
    mut events: MessageReader<MortarGameEvent>,
    asset_server: Res<AssetServer>,
    mut commands: Commands,
) {
    if !settings.auto_play_sound_events {
        return;
    }

    for event in events.read() {
        if event.name != "play_sound" {
            continue;
        }

        if let Some(path) = event.args.first() {
            let audio_handle = asset_server.load::<AudioSource>(path.clone());
            commands.spawn((AudioPlayer::new(audio_handle), settings.playback_settings));
        }
    }
}