use yog_sync::LazyLock;
use yog_data::Schema;
use yog_data::kinds::Item;
use yog_data::with::RefTo;
mod from_yui;
pub use from_yui::{compile, is_recipe_layout};
#[derive(Debug, Clone, PartialEq, Schema)]
pub struct RecipeLayout {
pub kinds: Vec<String>,
pub size: [f32; 2],
#[data(default)]
pub parts: Vec<LayoutPart>,
}
#[derive(Debug, Clone, PartialEq, Schema)]
#[data(tag = "type")]
pub enum LayoutPart {
Image {
source: String,
uv: [f32; 4],
#[data(default)]
at: [f32; 2],
},
Slots {
slot: String,
at: Vec<[f32; 2]>,
#[data(default)]
frame: bool,
},
Result {
at: [f32; 2],
#[data(default)]
frame: bool,
},
Count { at: [f32; 2] },
Item {
#[data(with = "RefTo<Item>")]
item: String,
at: [f32; 2],
},
Block {
block: String,
at: [f32; 2],
#[data(default = "icon_px")]
size: f32,
},
Text { text: String, at: [f32; 2] },
}
pub static BUILT_IN: LazyLock<Vec<RecipeLayout>> = LazyLock::new(|| {
yog_data::built_in(
"yog-formats' built-in recipe layouts",
include_str!("../../../assets/layouts.ydata"),
)
});
pub fn find<'a>(own: &'a [RecipeLayout], kind: &str) -> Option<&'a RecipeLayout> {
own.iter()
.chain(BUILT_IN.iter())
.find(|l| l.kinds.iter().any(|k| k == kind))
}
pub fn game_kinds() -> impl Iterator<Item = &'static str> {
BUILT_IN
.iter()
.flat_map(|l| l.kinds.iter().map(String::as_str))
}
pub const ICON_PX: f32 = yog_ids::units::ITEM_PIXELS as f32;
fn icon_px() -> f32 {
ICON_PX
}