1use yog_data::kinds::Item;
5use yog_data::with::RefTo;
6
7yog_data::kind! {
10 Attribute = "attribute",
11 Effect = "effect",
12 Potion = "potion",
13}
14
15#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
19pub struct AttributeDef {
20 pub id: String,
21 pub default: f64,
23 pub min: f64,
24 pub max: f64,
25}
26
27#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq)]
30pub enum EffectCategory {
31 Beneficial,
32 Harmful,
33 Neutral,
34}
35
36#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq)]
38pub enum ModifierOperation {
39 Add,
41 MultiplyBase,
43 MultiplyTotal,
45}
46
47#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
50pub struct EffectModifier {
51 #[data(with = "RefTo<Attribute>")]
53 pub attribute: String,
54 pub amount: f64,
55 pub operation: ModifierOperation,
56}
57
58#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
62pub struct EffectDef {
63 pub id: String,
64 pub category: EffectCategory,
65 pub color: u32,
67 #[data(default)]
68 pub modifiers: Vec<EffectModifier>,
69}
70
71#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
73pub struct PotionEffect {
74 #[data(with = "RefTo<Effect>")]
76 pub effect: String,
77 pub duration: u32,
79 #[data(default)]
81 pub amplifier: u32,
82}
83
84#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
86pub struct Brew {
87 #[data(with = "RefTo<Potion>")]
89 pub from: String,
90 #[data(with = "RefTo<Item>")]
92 pub with: String,
93}
94
95#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
99pub struct PotionDef {
100 pub id: String,
101 pub name: Option<String>,
104 pub effects: Vec<PotionEffect>,
105 #[data(default)]
106 pub brewed: Vec<Brew>,
107}
108
109#[cfg(test)]
110mod tests {
111 use super::*;
112 use yog_data::Schema;
113
114 #[test]
115 fn effects_and_potions_cross_as_yog_data() {
116 let e = EffectDef {
117 id: "mymod:clarity".into(),
118 category: EffectCategory::Beneficial,
119 color: 0xc875ff,
120 modifiers: vec![EffectModifier { attribute: "mymod:grid_zoom".into(), amount: 0.25, operation: ModifierOperation::MultiplyTotal }],
121 };
122 let back = yog_data::read_bytes::<EffectDef>(&yog_data::binary::encode(&e.write())).unwrap();
123 assert_eq!(back, e);
124 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()));
125 let p = PotionDef {
126 id: "mymod:clarity".into(),
127 name: None,
128 effects: vec![PotionEffect { effect: "mymod:clarity".into(), duration: 3600, amplifier: 0 }],
129 brewed: vec![Brew { from: "minecraft:awkward".into(), with: "mymod:dust".into() }],
130 };
131 assert_eq!(yog_data::read_bytes::<PotionDef>(&yog_data::binary::encode(&p.write())).unwrap(), p);
132 }
133}