use std::marker::PhantomData;
use bevy_app::{App, Plugin, Update};
use bevy_asset::AssetApp;
use bevy_ecs::schedule::IntoScheduleConfigs as _;
use crate::asset::{BrinkStoryAsset, InkbLoader, LineTablesAsset, ProgramAsset};
use crate::request::fulfill_flow_requests;
pub struct BrinkPlugin<M: Send + Sync + 'static = ()> {
_marker: PhantomData<fn() -> M>,
}
impl<M: Send + Sync + 'static> Default for BrinkPlugin<M> {
fn default() -> Self {
Self {
_marker: PhantomData,
}
}
}
impl<M: Send + Sync + 'static> Plugin for BrinkPlugin<M> {
fn build(&self, app: &mut App) {
if !app.is_plugin_added::<BrinkAssetsPlugin>() {
app.add_plugins(BrinkAssetsPlugin);
}
app.add_systems(Update, fulfill_flow_requests::<M>);
app.add_systems(Update, crate::transcript::refresh_transcripts::<M>);
app.add_systems(
Update,
crate::call::resolve_brink_calls::<M>.run_if(
bevy_ecs::schedule::common_conditions::any_with_component::<
crate::call::BrinkCallRequest<M>,
>,
),
);
app.add_systems(
Update,
crate::bindings::resolve_pending_externals::<M>
.run_if(crate::bindings::any_flow_awaiting_external::<M>),
);
app.add_systems(
Update,
crate::async_bind::poll_brink_tasks::<M>.run_if(
bevy_ecs::schedule::common_conditions::any_with_component::<
crate::async_bind::BrinkPendingTask<M>,
>,
),
);
app.init_resource::<crate::locale::BrinkCurrentLocale<M>>();
app.init_resource::<crate::locale::LocalizedTablesCache<M>>();
app.add_observer(crate::locale::on_locale_changed::<M>);
app.add_systems(Update, crate::locale::catch_up_loaded_locales::<M>);
#[cfg(feature = "dev")]
app.add_systems(Update, crate::replay::replay_on_reload::<M>);
#[cfg(debug_assertions)]
app.add_systems(Update, crate::request::warn_post_fulfillment_mutations::<M>);
}
}
pub struct BrinkAssetsPlugin;
impl Plugin for BrinkAssetsPlugin {
fn build(&self, app: &mut App) {
app.init_asset::<BrinkStoryAsset>();
app.init_asset::<ProgramAsset>();
app.init_asset::<LineTablesAsset>();
app.init_asset::<crate::locale::LocaleAsset>();
app.init_asset::<crate::brkt::TranscriptAsset>();
app.init_asset_loader::<InkbLoader>();
app.init_asset_loader::<crate::locale::InklLoader>();
app.init_asset_loader::<crate::brkt::BrktLoader>();
#[cfg(feature = "dev")]
app.init_asset_loader::<crate::source_loader::InkLoader>();
}
}