use yog_data::kinds::Item;
use yog_data::with::RefTo;
yog_data::kind! {
Attribute = "attribute",
Effect = "effect",
Potion = "potion",
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct AttributeDef {
pub id: String,
pub default: f64,
pub min: f64,
pub max: f64,
}
#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq)]
pub enum EffectCategory {
Beneficial,
Harmful,
Neutral,
}
#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModifierOperation {
Add,
MultiplyBase,
MultiplyTotal,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct EffectModifier {
#[data(with = "RefTo<Attribute>")]
pub attribute: String,
pub amount: f64,
pub operation: ModifierOperation,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct EffectDef {
pub id: String,
pub category: EffectCategory,
pub color: u32,
#[data(default)]
pub modifiers: Vec<EffectModifier>,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct PotionEffect {
#[data(with = "RefTo<Effect>")]
pub effect: String,
pub duration: u32,
#[data(default)]
pub amplifier: u32,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct Brew {
#[data(with = "RefTo<Item>")]
pub from: String,
#[data(with = "RefTo<Item>")]
pub with: String,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct PotionDef {
pub id: String,
pub name: Option<String>,
pub effects: Vec<PotionEffect>,
#[data(default)]
pub brewed: Vec<Brew>,
}
#[cfg(test)]
mod tests {
use super::*;
use yog_data::Schema;
#[test]
fn effects_and_potions_cross_as_yog_data() {
let e = EffectDef {
id: "mymod:clarity".into(),
category: EffectCategory::Beneficial,
color: 0xc875ff,
modifiers: vec![EffectModifier { attribute: "mymod:grid_zoom".into(), amount: 0.25, operation: ModifierOperation::MultiplyTotal }],
};
let back = yog_data::read_bytes::<EffectDef>(&yog_data::binary::encode(&e.write())).unwrap();
assert_eq!(back, e);
assert_eq!(yog_data::text::to_string(&e.write()).contains("\"multiply_total\"") && yog_data::text::to_string(&e.write()).contains("\"beneficial\""), true, "{}", yog_data::text::to_string(&e.write()));
let p = PotionDef {
id: "mymod:clarity".into(),
name: None,
effects: vec![PotionEffect { effect: "mymod:clarity".into(), duration: 3600, amplifier: 0 }],
brewed: vec![Brew { from: "minecraft:awkward".into(), with: "mymod:dust".into() }],
};
assert_eq!(yog_data::read_bytes::<PotionDef>(&yog_data::binary::encode(&p.write())).unwrap(), p);
}
}