use df_ls_core::{AllowEmpty, Any, Choose, Reference, ReferenceTo};
use df_ls_syntax_analysis::TokenDeserialize;
use serde::{Deserialize, Serialize};
use crate::{
AllEnum, AnyHardStoneEnum, AppGeneticModelEnum, AppModTypeEnum, BodyPartTypeEnum,
BpAppModifersEnum, BpCriteriaTokenArg, BpRelationEnum, CdiTokenArg, ColorToken,
ItemReferenceArg, MaterialTokenArgWithLocalCreatureMat, NoEndEnum, NormalEnum, PositionEnum,
RootEnum, ShapeToken, SingularOrPluralEnum, StylingEnum, TimescaleEnum, TissueModifierEnum,
};
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct CanDoInteraction {
#[token_de(token = "CAN_DO_INTERACTION", on_duplicate_to_parent, primary_token)]
pub reference: Option<Reference>,
#[token_de(token = "CDI")]
pub cdi: Vec<CdiTokenArg>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct ExtraButcherObject {
#[token_de(token = "EXTRA_BUTCHER_OBJECT", on_duplicate_to_parent, primary_token)]
pub reference: Option<BpCriteriaTokenArg>,
#[token_de(token = "EBO_ITEM")]
pub ebo_item: Option<EboItem>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct EboItem {
#[token_de(token = "EBO_ITEM", on_duplicate_to_parent, primary_token)]
pub reference: Option<(
ItemReferenceArg,
Choose<AnyHardStoneEnum, MaterialTokenArgWithLocalCreatureMat>,
)>,
#[token_de(token = "EBO_SHAPE")]
pub ebo_shape: Option<ReferenceTo<ShapeToken>>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct BodyAppearanceModifier {
#[token_de(
token = "BODY_APPEARANCE_MODIFIER",
on_duplicate_to_parent,
primary_token
)]
pub body_appearance_modifier: Option<(AppModTypeEnum, u32, u32, u32, u32, u32, u32, u32)>,
#[token_de(token = "APP_MOD_DESC_RANGE")]
pub app_mod_desc_range: Option<(u32, u32, u32, u32, u32, u32)>,
#[token_de(token = "APP_MOD_GENETIC_MODEL")]
pub app_mod_genetic_model: Option<AppGeneticModelEnum>,
#[token_de(token = "APP_MOD_IMPORTANCE")]
pub app_mod_importance: Option<u32>,
#[token_de(token = "APP_MOD_NOUN")]
pub app_mod_noun: Option<(String, SingularOrPluralEnum)>,
#[token_de(token = "APP_MOD_RATE")]
pub app_mod_rate: Option<(
u32,
TimescaleEnum,
u32,
u32,
u32,
u32,
Choose<NoEndEnum, (u32, u32)>,
)>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct SetBpGroup {
#[token_de(token = "SET_BP_GROUP", on_duplicate_to_parent, primary_token)]
pub set_bp_group: Option<BpCriteriaTokenArg>,
#[token_de(token = "PLUS_BP_GROUP")]
pub plus_bp_group: Vec<BpCriteriaTokenArg>,
#[token_de(token = "BP_APPEARANCE_MODIFIER")]
pub bp_appearance_modifier: Vec<BpAppearanceModifier>,
#[token_de(token = "BP_ADD_TYPE")]
pub bp_add_type: Option<BodyPartTypeEnum>,
#[token_de(token = "BP_REMOVE_TYPE")]
pub bp_remove_type: Option<BodyPartTypeEnum>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct BpAppearanceModifier {
#[token_de(
token = "BP_APPEARANCE_MODIFIER",
on_duplicate_to_parent,
primary_token
)]
pub bp_appearance_modifier: Option<(BpAppModifersEnum, u32, u32, u32, u32, u32, u32, u32)>,
#[token_de(token = "APP_MOD_DESC_RANGE")]
pub app_mod_desc_range: Option<(u32, u32, u32, u32, u32, u32)>,
#[token_de(token = "APP_MOD_GENETIC_MODEL")]
pub app_mod_genetic_model: Option<AppGeneticModelEnum>,
#[token_de(token = "APP_MOD_IMPORTANCE")]
pub app_mod_importance: Option<u32>,
#[token_de(token = "APP_MOD_NOUN")]
pub app_mod_noun: Option<(String, SingularOrPluralEnum)>,
#[token_de(token = "APP_MOD_RATE")]
pub app_mod_rate: Option<(
u32,
TimescaleEnum,
u32,
u32,
u32,
u32,
Choose<NoEndEnum, (u32, u32)>,
)>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct SetTlGroup {
#[token_de(token = "SET_TL_GROUP", on_duplicate_to_parent, primary_token)]
pub set_tl_group: Option<(BpCriteriaTokenArg, Reference)>,
#[token_de(token = "PLUS_TL_GROUP")]
pub plus_tl_group: Vec<(BpCriteriaTokenArg, Reference)>,
#[token_de(token = "TL_COLOR_MODIFIER")]
pub tl_color_modifier: Vec<TlColorModifier>,
#[token_de(token = "TISSUE_LAYER_APPEARANCE_MODIFIER")]
pub tissue_layer_appearance_modifier: Vec<TissueLayerAppearanceModifier>,
#[token_de(token = "TISSUE_STYLE_UNIT")]
pub tissue_style_unit: Option<TissueStyleUnit>,
#[token_de(token = "SHEARABLE_TISSUE_LAYER")]
pub shearable_tissue_layer: Option<(TissueModifierEnum, u32)>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct TissueLayerAppearanceModifier {
#[token_de(
token = "TISSUE_LAYER_APPEARANCE_MODIFIER",
on_duplicate_to_parent,
primary_token
)]
pub tissue_layer_appearance_modifier:
Option<(TissueModifierEnum, u32, u32, u32, u32, u32, u32, u32)>,
#[token_de(token = "APP_MOD_DESC_RANGE")]
pub app_mod_desc_range: Option<(u32, u32, u32, u32, u32, u32)>,
#[token_de(token = "APP_MOD_GENETIC_MODEL")]
pub app_mod_genetic_model: Option<AppGeneticModelEnum>,
#[token_de(token = "APP_MOD_IMPORTANCE")]
pub app_mod_importance: Option<u32>,
#[token_de(token = "APP_MOD_NOUN")]
pub app_mod_noun: Option<(String, SingularOrPluralEnum)>,
#[token_de(token = "APP_MOD_RATE")]
pub app_mod_rate: Option<(
u32,
TimescaleEnum,
u32,
u32,
u32,
u32,
Choose<NoEndEnum, (u32, u32)>,
)>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct TlColorModifier {
#[token_de(token = "TL_COLOR_MODIFIER", on_duplicate_to_parent, primary_token)]
pub tl_color_modifier: Option<(Vec<(ReferenceTo<ColorToken>, u32)>,)>,
#[token_de(token = "TLCM_GENETIC_MODEL")]
pub tlcm_genetic_model: Option<()>,
#[token_de(token = "TLCM_IMPORTANCE")]
pub tlcm_importance: Option<u32>,
#[token_de(token = "TLCM_NOUN")]
pub tlcm_noun: Option<(String, SingularOrPluralEnum)>,
#[token_de(token = "TLCM_TIMING")]
pub tlcm_timing: Option<(RootEnum, u32, u32, u32, u32)>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct TissueStyleUnit {
#[token_de(token = "TISSUE_STYLE_UNIT", on_duplicate_to_parent, primary_token)]
pub tissue_style_unit: Option<(Reference, StylingEnum)>,
#[token_de(token = "TSU_NOUN")]
pub tsu_noun: Option<(String, SingularOrPluralEnum)>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct TissueLayer {
#[token_de(token = "TISSUE_LAYER", on_duplicate_to_parent, primary_token)]
pub tissue_layer: Option<(
BpCriteriaTokenArg,
Reference,
// TODO: investigate how all these tokens dealing with selecting tissues and BPs actually work,
// this is too many edge cases, it's ridiculous.
Option<
Choose<
NormalEnum,
Choose<PositionEnum, (BpRelationEnum, BpCriteriaTokenArg, Option<u8>)>,
>,
>,
)>,
#[token_de(token = "PLUS_TISSUE_LAYER")]
pub plus_tissue_layer: Vec<(Reference, BpCriteriaTokenArg)>,
#[token_de(token = "SET_LAYER_TISSUE")]
pub set_layer_tissue: Vec<Reference>,
#[token_de(token = "TL_CONNECTS")]
pub tl_connects: Option<()>,
#[token_de(token = "TL_HEALING_RATE")]
pub tl_healing_rate: Option<u32>,
#[token_de(token = "TL_MAJOR_ARTERIES")]
pub tl_major_arteries: Option<()>,
#[token_de(token = "TL_PAIN_RECEPTORS")]
pub tl_pain_receptors: Option<u32>,
#[token_de(token = "TL_RELATIVE_THICKNESS")]
pub tl_relative_thickness: Option<u32>,
#[token_de(token = "TL_VASCULAR")]
pub tl_vascular: Option<u32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct SelectTissueLayer {
#[token_de(token = "SELECT_TISSUE_LAYER", on_duplicate_to_parent, primary_token)]
pub select_tissue_layer: Option<
Choose<
(AllEnum, Option<(BpCriteriaTokenArg, Option<PositionEnum>)>),
(Reference, BpCriteriaTokenArg, Option<PositionEnum>),
>,
>,
#[token_de(token = "PLUS_TISSUE_LAYER")] pub plus_tissue_layer: Vec<(Reference, BpCriteriaTokenArg)>,
#[token_de(token = "SET_LAYER_TISSUE")]
pub set_layer_tissue: Vec<Reference>,
#[token_de(token = "TL_CONNECTS")]
pub tl_connects: Option<()>,
#[token_de(token = "TL_HEALING_RATE")]
pub tl_healing_rate: Option<u32>,
#[token_de(token = "TL_MAJOR_ARTERIES")]
pub tl_major_arteries: Option<()>,
#[token_de(token = "TL_PAIN_RECEPTORS")]
pub tl_pain_receptors: Option<u32>,
#[token_de(token = "TL_RELATIVE_THICKNESS")]
pub tl_relative_thickness: Option<u32>,
#[token_de(token = "TL_VASCULAR")]
pub tl_vascular: Option<u32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, TokenDeserialize, PartialEq, Eq)]
pub struct CreatureCvConvertTag {
#[token_de(token = "CV_CONVERT_TAG", on_duplicate_to_parent, primary_token)]
pub cv_convert_tag: Option<()>,
#[token_de(token = "CVCT_MASTER")]
pub cvct_master: Option<
AllowEmpty<(
Reference, // TODO: ref can be name of any token that nests under CREATURE
Option<(Vec<Any>,)>,
)>,
>,
#[token_de(token = "CVCT_TARGET")]
pub cvct_target: Option<(Vec<Any>,)>,
#[token_de(token = "CVCT_REPLACEMENT")]
pub cvct_replacement: Option<(Vec<Any>,)>,
}