use yog_event::{client, content, entity, game, media};
use super::duties::provide;
fn localized(text: &str, key: Option<&str>) -> String {
key.and_then(crate::api::machine::translate)
.unwrap_or_else(|| text.to_owned())
}
fn mods() -> Vec<game::ModInfo> {
let infos = crate::globals::MOD_INFOS.lock().clone();
let mut out: Vec<game::ModInfo> = infos
.iter()
.map(|m| game::ModInfo {
source: yog_ids::mod_source::YOG.to_owned(),
id: m.id.clone(),
name: localized(&m.name, m.name_key.as_deref()),
version: m.version.clone(),
authors: m.authors.join(", "),
description: localized(&m.description, m.description_key.as_deref()),
})
.collect();
out.extend(super::call(&game::PlatformMods {}).unwrap_or_default());
out
}
pub(crate) fn register() {
provide::<content::Register>(|r| {
crate::api::fns::register_blob(
&mut crate::mods::handlers::handlers_write(),
&r.kind,
r.id.clone(),
&r.data,
);
true
});
provide::<game::Mods>(|_| mods());
provide::<game::ModLoaded>(|m| crate::api::machine::mod_loaded(&m.id));
provide::<media::Png>(png);
provide::<client::EntityData>(|d| {
crate::game::entity_data::client_get(&d.uuid, &d.key)
.map(|bytes| entity::DataValue { bytes })
});
crate::video::provide_services();
}
fn png(p: &media::Png) -> media::PngBytes {
match yog_media::yimage::to_png(&p.yimage) {
Ok(png) => media::PngBytes { png },
Err(e) => {
yog_logging::warn!("a texture the game asked for: {e}");
media::PngBytes::default()
}
}
}