1use crate::prelude::*;
2
3use crate::{
4 abilities::AbilityId, currency::CurrencyId, fighting::FightTemplateId, items::AttributeId,
5};
6
7#[declare]
8pub type EntityTemplateId = Uuid;
9
10#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
11pub struct EntityAttribute {
12 #[schemars(schema_with = "attribute_link_id_schema")]
13 pub attribute_id: AttributeId,
14 #[schemars(title = "Значение атрибута")]
15 pub value: u64,
16}
17
18#[derive(Debug, serde::Deserialize)]
19pub struct CharacterQuery {
20 pub character_id: String,
21}
22
23#[derive(Clone, Debug, Serialize, Deserialize, Tsify, JsonSchema)]
24pub struct EnemyReward {
25 #[schemars(title = "Id валюты награды", schema_with = "currency_link_id_schema")]
26 pub currency_id: CurrencyId,
27 #[schemars(title = "Минимальная награда")]
28 pub from: i64,
29 #[schemars(title = "Максимальная награда")]
30 pub to: i64,
31 #[schemars(
32 title = "Шанс выпадения",
33 description = "Шанс выпадения валюты от 0 до 100"
34 )]
35 pub drop_chance: f64,
36}
37
38impl PartialEq for EnemyReward {
39 fn eq(&self, other: &Self) -> bool {
40 self.currency_id == other.currency_id && self.from == other.from && self.to == other.to
41 }
42}
43
44impl Eq for EnemyReward {}
45
46#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
47pub struct EntityTemplate {
48 #[schemars(schema_with = "id_schema")]
49 pub id: EntityTemplateId,
50 #[schemars(title = "Имя врага")]
51 pub name: String,
52 #[schemars(title = "Спайн", schema_with = "aa_entity_spine_schema")]
53 pub spine: String,
54 #[schemars(title = "Визуал", schema_with = "asset_unit_spine_skin")]
55 pub spine_skin_path: String,
56 #[schemars(title = "Размер спайна врага")]
57 pub spine_scale: u64,
58 #[schemars(title = "Время каста")]
59 pub cast_time: u64,
60 #[schemars(title = "Атрибуты врага", description = "Набор атрибутов врага")]
61 pub attributes: Vec<EntityAttribute>,
62 #[schemars(
63 title = "Id способностей",
64 description = "Набор id способностей врага",
65 schema_with = "ability_link_id_array_schema"
66 )]
67 pub ability_ids: Vec<AbilityId>,
68 #[schemars(title = "Ширина врага в клетках")]
69 pub width: i8,
70 #[schemars(title = "Награда за убийство врага")]
71 pub rewards: Vec<EnemyReward>,
72
73 #[schemars(
74 title = "Является ли боссом",
75 description = "Босс-сущность (entity_template_is_boss): влияет на босс-таланты и HP-бар."
76 )]
77 #[serde(default)]
78 pub is_boss: bool,
79}
80
81#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
82pub struct Chapter {
83 #[schemars(schema_with = "id_schema")]
84 pub id: Uuid,
85 #[schemars(title = "Порядковый номер уровня")]
86 pub level: i64,
87 #[schemars(
88 title = "Набор id битв",
89 description = "Набор битв на уровне",
90 schema_with = "fight_template_link_id_array_schema"
91 )]
92 pub fight_ids: Vec<FightTemplateId>,
93 #[schemars(title = "Название боя")]
94 pub title: i18n::I18nString,
95}
96
97#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
98pub struct CharacterLevel {
99 #[schemars(title = "Уровень игрока")]
100 pub level: i64,
101 #[schemars(title = "Слотов способностей на уровне (для генерации оппонентов)")]
102 pub ability_slots: u64,
103 #[schemars(
104 title = "Минимальный опыт для получения",
105 description = "Минимальный опыт игрока для получения уровня"
106 )]
107 pub required_experience: i64,
108 #[schemars(
109 title = "Базовые аттрибуты игрока на уровне",
110 description = "Базовые аттрибуты игрока, которые выдаются на этом уровне"
111 )]
112 pub attributes: Vec<EntityAttribute>,
113}
114
115#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
116pub struct AbilitySlotsLevel {
117 #[schemars(title = "Минимальный уровень главы")]
118 pub from_chapter_level: i64,
119 #[schemars(title = "Сколько слотов абилок открыто на уровне")]
120 pub ability_slots: u64,
121}
122
123#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
124pub struct PetSlotsLevel {
125 #[schemars(title = "Минимальный уровень главы")]
126 pub from_chapter_level: i64,
127 #[schemars(title = "Сколько слотов петов открыто на уровне")]
128 pub pet_slots: u64,
129}