use yog_data::kinds::Item;
use yog_data::with::RefTo;
yog_data::kind! {
Attribute = yog_ids::kind::ATTRIBUTE,
Effect = yog_ids::kind::EFFECT,
Potion = yog_ids::kind::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);
let text = yog_data::text::to_string(&e.write());
assert!(
text.contains("\"multiply_total\"") && text.contains("\"beneficial\""),
"{text}"
);
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
);
}
}