configs/
tests_game_config.rs

1use essences::{
2    abilities::{AbilityCastType, AbilityFightUiVisibility, AbilityRarity, AbilityTemplate},
3    ability_presets, bundles, class,
4    currency::{Currency, CurrencyUnit},
5    dungeons::{DungeonTemplate, DungeonTip, RewardType},
6    effect::Effect,
7    entity::Coordinates,
8    fighting::{EntityTeam, EntityType, FightEntity, FightTemplate, FightType},
9    game::{
10        AbilitySlotsLevel, Chapter, CharacterLevel, EnemyReward, EntityAttribute, EntityTemplate,
11        PetSlotsLevel,
12    },
13    gatings::{CastleGating, Gatings, NavBarNavigation, SideBarNavigation},
14    generation::{
15        BotsSettings, PhotoGenerationSettings, UsernameGenerationSettings, UsersGeneratingSettings,
16    },
17    gift::{GiftTemplate, GiftType},
18    item_case::{
19        AutoChestSettings, InventoryLevel, ItemCaseRarityWeight, ItemCasesSettingsByLevel,
20    },
21    items::{Attribute, ItemAttributeSettings, ItemRarity, ItemTemplate, ItemType},
22    mail::{MailRepeatType, MailSendType, MailTemplate},
23    offers::{OfferTemplate, PaymentType, ShopTab, ShopTabConfig},
24    pets::{PetRarity, PetSecondaryStat, PetTemplate},
25    quest::{
26        QuestGroupType, QuestTemplate, QuestsProgressionPointSettings, QuestsProgressionSettings,
27    },
28    ratings::{RatingRangeReward, RatingSettings, RatingType},
29    referrals::ReferralLevelInfo,
30    skins::{ConfigSkin, SkinType, SkinsSettings},
31    vassals::VassalTaskTemplate,
32};
33
34use uuid::{Uuid, uuid};
35
36use enum_iterator::all;
37
38use crate::statue::{
39    StatueBonusGradeValue, StatueBonusGradeWeight, StatueBonusTypeConfig, StatueLevelConfig,
40    StatueRollCostConfig, StatueSettings,
41};
42use crate::validated_types::{
43    NonEmptyVec, NonZeroU64, PositiveF64, PositiveI32, PositiveI64, WeightMultiplier,
44};
45use crate::{
46    abilities::{
47        AbilityCaseCheckpointAbilityReward, AbilityCaseCheckpointReward, AbilityCaseEvolveRule,
48        AbilityCaseRarityWeight, AbilityCasesSettingsByLevel, AbilityLevel, BigRollShard,
49        Projectile,
50    },
51    ads_settings::{AdSpeedupConfig, AdsSettings, BirdAdConfig, BirdAdVariantWeight, BirdVariant},
52    afk_rewards::{
53        AfkRewardBonusType, AfkRewardBonusWeight, AfkRewardsByLevel, AfkRewardsSettings,
54        CurrencyRate,
55    },
56    buffs::{BuffEffect, BuffTemplate},
57    events::EventDescription,
58    fighting::{ArenaLeague, ArenaSettings, FightSettings, PvpSettings},
59    game_config::GameConfig,
60    game_settings::{DailyCurrencyReset, GameSettings},
61    matchmaking::{MatchmakingSettings, OpponentPositionSettings},
62    pets::{
63        PetBigRollShard, PetCaseCheckpointPetReward, PetCaseCheckpointReward, PetCaseRarityWeight,
64        PetCasesSettingsByLevel, PetLevel,
65    },
66    reports::ReportsSettings,
67    vassals::VassalsSettings,
68};
69use essences::statue::StatueBonusGrade;
70use essences::talent_tree::{
71    TalentAttributeBonus, TalentBackendModifier, TalentLevel, TalentPosition, TalentTemplate,
72    TalentTreeSettings, TalentUnlockCondition,
73};
74
75fn generate_attributes() -> Vec<Attribute> {
76    vec![
77        Attribute {
78            id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
79            name: i18n::I18nString::new(
80                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
81            ),
82            prefix: Some(i18n::I18nString::new(
83                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
84            )),
85            suffix: Some(i18n::I18nString::new(
86                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
87            )),
88            code: "hp".to_string(),
89            icon: "/hp_icon.webp".to_string(),
90            icon_path: "/hp_icon.webp".to_string(),
91            db_code: 0,
92            denominator: None,
93            is_percent: false,
94            calculation_script: "Random.randint(8, 14)".to_string(),
95            order: 0,
96            is_ui_visible: true,
97            description: i18n::I18nString::new(
98                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
99            ),
100        },
101        Attribute {
102            id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
103            name: i18n::I18nString::new(
104                "content.attributes.6ad485d7-9567-4b77-8ddc-a2418dd1dfe6:name",
105            ),
106            prefix: Some(i18n::I18nString::new(
107                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
108            )),
109            suffix: Some(i18n::I18nString::new(
110                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
111            )),
112            code: "damage".to_string(),
113            icon: "/damage_icon.webp".to_string(),
114            icon_path: "/damage_icon.webp".to_string(),
115            db_code: 1,
116            is_percent: false,
117            denominator: None,
118            calculation_script: "Random.randint(8, 14)".to_string(),
119            order: 1,
120            is_ui_visible: true,
121            description: i18n::I18nString::new(
122                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
123            ),
124        },
125        Attribute {
126            id: uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d"),
127            name: i18n::I18nString::new(
128                "content.attributes.3a6ec1c8-7494-43df-a345-d23e297b892d:name",
129            ),
130            prefix: Some(i18n::I18nString::new(
131                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
132            )),
133            suffix: Some(i18n::I18nString::new(
134                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
135            )),
136            code: "strength".to_string(),
137            icon: "/strength_icon.webp".to_string(),
138            icon_path: "/strength_icon.webp".to_string(),
139            db_code: 2,
140            is_percent: false,
141            denominator: None,
142            calculation_script: "Random.randint(8, 14)".to_string(),
143            order: 2,
144            is_ui_visible: true,
145            description: i18n::I18nString::new(
146                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
147            ),
148        },
149        Attribute {
150            id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
151            name: i18n::I18nString::new(
152                "content.attributes.42aea610-2ab7-41f7-95bf-5d6f00341ac9:name",
153            ),
154            prefix: Some(i18n::I18nString::new(
155                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
156            )),
157            suffix: Some(i18n::I18nString::new(
158                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
159            )),
160            code: "agility".to_string(),
161            icon: "/agility_icon.webp".to_string(),
162            icon_path: "/agility_icon.webp".to_string(),
163            db_code: 3,
164            is_percent: false,
165            denominator: None,
166            calculation_script: "Random.randint(8, 14)".to_string(),
167            order: 3,
168            is_ui_visible: true,
169            description: i18n::I18nString::new(
170                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
171            ),
172        },
173        Attribute {
174            id: uuid!("f82eb3fa-8a09-44fb-b8ed-979cc2db28f4"),
175            name: i18n::I18nString::new(
176                "content.attributes.f82eb3fa-8a09-44fb-b8ed-979cc2db28f4:name",
177            ),
178            prefix: Some(i18n::I18nString::new(
179                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
180            )),
181            suffix: Some(i18n::I18nString::new(
182                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
183            )),
184            code: "armor".to_string(),
185            icon: "/armor_icon.webp".to_string(),
186            icon_path: "/armor_icon.webp".to_string(),
187            db_code: 4,
188            is_percent: false,
189            denominator: None,
190            calculation_script: "Random.randint(8, 14)".to_string(),
191            order: 4,
192            is_ui_visible: false,
193            description: i18n::I18nString::new(
194                "content.attributes.45eca0a7-7430-487b-bd65-b796c6d88c08:name",
195            ),
196        },
197    ]
198}
199
200fn generate_item_cases_settings() -> Vec<ItemCasesSettingsByLevel> {
201    vec![
202        ItemCasesSettingsByLevel {
203            level: 1,
204            required_chapter_level: 0,
205            upgrade_cost: vec![],
206            upgrade_time_secs: 600,
207            rarity_weights: vec![
208                ItemCaseRarityWeight {
209                    rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
210                    weight: 512.0,
211                },
212                ItemCaseRarityWeight {
213                    rarity_id: uuid!("272f3e73-6b3e-43a0-88d6-d34bdaf5aeae"),
214                    weight: 256.0,
215                },
216                ItemCaseRarityWeight {
217                    rarity_id: uuid!("c45eed5f-ad7e-4af0-b0a5-46b311573bf4"),
218                    weight: 128.0,
219                },
220                ItemCaseRarityWeight {
221                    rarity_id: uuid!("a9a0575f-9d09-4118-b305-14e927817302"),
222                    weight: 64.0,
223                },
224                ItemCaseRarityWeight {
225                    rarity_id: uuid!("19e2db05-5f17-4d89-9732-924134056776"),
226                    weight: 32.0,
227                },
228                ItemCaseRarityWeight {
229                    rarity_id: uuid!("9d662020-0929-439b-8afa-f286b72070a9"),
230                    weight: 16.0,
231                },
232                ItemCaseRarityWeight {
233                    rarity_id: uuid!("363dded9-e5a4-4bb9-bde6-63037d808246"),
234                    weight: 8.0,
235                },
236                ItemCaseRarityWeight {
237                    rarity_id: uuid!("9e1842cc-4192-4332-8c13-0f901ca442a4"),
238                    weight: 4.0,
239                },
240                ItemCaseRarityWeight {
241                    rarity_id: uuid!("d59e98d8-fc7d-4b8b-9da0-a374400df154"),
242                    weight: 0.0,
243                },
244                ItemCaseRarityWeight {
245                    rarity_id: uuid!("c0d049eb-359e-4b1e-9de2-eda276043ea8"),
246                    weight: 0.0,
247                },
248            ],
249            auto_chest_settings: AutoChestSettings { max_batch_size: 2 },
250        },
251        ItemCasesSettingsByLevel {
252            level: 2,
253            required_chapter_level: 0,
254            upgrade_cost: vec![CurrencyUnit {
255                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
256                amount: 20,
257            }],
258            upgrade_time_secs: 600,
259            rarity_weights: vec![
260                ItemCaseRarityWeight {
261                    rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
262                    weight: 256.0,
263                },
264                ItemCaseRarityWeight {
265                    rarity_id: uuid!("272f3e73-6b3e-43a0-88d6-d34bdaf5aeae"),
266                    weight: 256.0,
267                },
268                ItemCaseRarityWeight {
269                    rarity_id: uuid!("c45eed5f-ad7e-4af0-b0a5-46b311573bf4"),
270                    weight: 128.0,
271                },
272                ItemCaseRarityWeight {
273                    rarity_id: uuid!("a9a0575f-9d09-4118-b305-14e927817302"),
274                    weight: 64.0,
275                },
276                ItemCaseRarityWeight {
277                    rarity_id: uuid!("19e2db05-5f17-4d89-9732-924134056776"),
278                    weight: 32.0,
279                },
280                ItemCaseRarityWeight {
281                    rarity_id: uuid!("9d662020-0929-439b-8afa-f286b72070a9"),
282                    weight: 16.0,
283                },
284                ItemCaseRarityWeight {
285                    rarity_id: uuid!("363dded9-e5a4-4bb9-bde6-63037d808246"),
286                    weight: 8.0,
287                },
288                ItemCaseRarityWeight {
289                    rarity_id: uuid!("9e1842cc-4192-4332-8c13-0f901ca442a4"),
290                    weight: 4.0,
291                },
292                ItemCaseRarityWeight {
293                    rarity_id: uuid!("d59e98d8-fc7d-4b8b-9da0-a374400df154"),
294                    weight: 0.0,
295                },
296                ItemCaseRarityWeight {
297                    rarity_id: uuid!("c0d049eb-359e-4b1e-9de2-eda276043ea8"),
298                    weight: 0.0,
299                },
300            ],
301            auto_chest_settings: AutoChestSettings { max_batch_size: 2 },
302        },
303        ItemCasesSettingsByLevel {
304            level: 3,
305            required_chapter_level: 5,
306            upgrade_cost: vec![CurrencyUnit {
307                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
308                amount: 20,
309            }],
310            upgrade_time_secs: 600,
311            rarity_weights: vec![
312                ItemCaseRarityWeight {
313                    rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
314                    weight: 256.0,
315                },
316                ItemCaseRarityWeight {
317                    rarity_id: uuid!("272f3e73-6b3e-43a0-88d6-d34bdaf5aeae"),
318                    weight: 256.0,
319                },
320                ItemCaseRarityWeight {
321                    rarity_id: uuid!("c45eed5f-ad7e-4af0-b0a5-46b311573bf4"),
322                    weight: 128.0,
323                },
324                ItemCaseRarityWeight {
325                    rarity_id: uuid!("a9a0575f-9d09-4118-b305-14e927817302"),
326                    weight: 64.0,
327                },
328                ItemCaseRarityWeight {
329                    rarity_id: uuid!("19e2db05-5f17-4d89-9732-924134056776"),
330                    weight: 32.0,
331                },
332                ItemCaseRarityWeight {
333                    rarity_id: uuid!("9d662020-0929-439b-8afa-f286b72070a9"),
334                    weight: 16.0,
335                },
336                ItemCaseRarityWeight {
337                    rarity_id: uuid!("363dded9-e5a4-4bb9-bde6-63037d808246"),
338                    weight: 8.0,
339                },
340                ItemCaseRarityWeight {
341                    rarity_id: uuid!("9e1842cc-4192-4332-8c13-0f901ca442a4"),
342                    weight: 4.0,
343                },
344                ItemCaseRarityWeight {
345                    rarity_id: uuid!("d59e98d8-fc7d-4b8b-9da0-a374400df154"),
346                    weight: 2.0,
347                },
348                ItemCaseRarityWeight {
349                    rarity_id: uuid!("c0d049eb-359e-4b1e-9de2-eda276043ea8"),
350                    weight: 1.0,
351                },
352            ],
353            auto_chest_settings: AutoChestSettings { max_batch_size: 3 },
354        },
355    ]
356}
357
358fn generate_game_settings() -> GameSettings {
359    GameSettings {
360        loyalty_decrease_script: "TimePassedSec * 4".to_string(),
361        character_power_calculate_script: "1".to_string(),
362        item_power_calculate_script: "10".to_string(),
363        item_price_calculation_expression: "Result.push(CurrencyUnit(uuid(\"b59b33a2-4d19-4e2c-9cea-e03ea15882a0\"), 10))".to_string(),
364        item_experience_calculation_expression: "50".to_string(),
365        required_attributes: vec![
366            uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
367            uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
368        ],
369        resist_task_id: uuid!("05e915bf-55fe-4419-bcf0-5f90833f17bd"),
370        hp_attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
371        time_skip_ticket_currency_id: uuid!("22297520-abb8-45b9-9fbb-c418b8001246"),
372        chest_upgrade_skip_ticket_skips_sec: 750,
373        chest_upgrade_skip_currency_id: uuid!("6c050b07-5282-4a23-8bbf-dabecd27cade"),
374        chest_upgrade_skip_currency_skips_sec: 400,
375        get_default_loop_task_id: "if CustomValues[\"loop_task\"] == 0 {uuid(\"305300e2-f432-4cbf-ad46-85386a9a9410\")} else {uuid(\"29540ca2-21f3-4f0e-a478-240adafed4e3\")}".to_string(),
376        fast_equip_abilities_script: "for ability in Abilities {if Result.len() == Slots {break;} Result.push(ability.template_id)}".to_string(),
377        fast_equip_pets_script: "for pet in Pets {if Result.len() == signed(Slots) {break;} Result.push(pet.template_id)}".to_string(),
378        ability_gacha: crate::game_settings::AbilityGachaSettings {
379            currency_id: uuid!("22297520-abb8-45b9-9fbb-c418b8001246"),
380            roll_price_in_diamonds: PositiveI64::new(2),
381            small_roll_cost: PositiveI64::new(3),
382            big_roll_cost: PositiveI64::new(10),
383            big_roll_bonus_drops: 1,
384            wishlist_slots: 5,
385            wishlist_weight_multiplier: WeightMultiplier::new(2.0),
386            slot_upgrade_currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
387            slot_max_level: PositiveI64::new(6),
388            slot_level_costs: vec![PositiveI64::new(100), PositiveI64::new(200), PositiveI64::new(300), PositiveI64::new(400), PositiveI64::new(500), PositiveI64::new(600)],
389            slot_level_bonus_levels: vec![0, 1, 2, 3, 4, 5, 6],
390        },
391        item_case_currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
392        initial_class_id: uuid!("5956e37c-ca7f-45cf-8bfb-49601dc9aca3"),
393        chat_message_ttl_secs: 3600,
394        currency_ids_to_show: vec![
395            uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
396            uuid!("22297520-abb8-45b9-9fbb-c418b8001246"),
397            uuid!("6c050b07-5282-4a23-8bbf-dabecd27cade"),
398        ],
399        auto_chest_pause_duration_ticks: 20,
400        arena_fight_template_id: uuid!("360fc654-dea1-4f5d-97af-249ab30608ac"),
401        vassal_fight_id: uuid!("b92c69a2-6544-4b83-809f-5af290b75473"),
402        fight_progress_tick: 1000,
403        db_power_update_frequency: 2,
404        deleted_user_username: "Deleted".to_owned(),
405        diamond_currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
406        username_change_cooldown_sec: 604800,
407        username_min_length: 3,
408        username_max_length: 32,
409        dungeons_keys_reset_amount: 2,
410        daily_currency_resets: vec![
411            DailyCurrencyReset {
412                currency_id: uuid!("6c050b07-5282-4a23-8bbf-dabecd27cade"),
413                reset_amount: 5,
414            },
415        ],
416        pet_gacha: crate::game_settings::PetGachaSettings {
417            currency_id: uuid!("22297520-abb8-45b9-9fbb-c418b8001246"),
418            roll_price_in_diamonds: PositiveI64::new(2),
419            small_roll_cost: PositiveI64::new(3),
420            big_roll_cost: PositiveI64::new(10),
421            big_roll_bonus_drops: 1,
422            wishlist_slots: 5,
423            wishlist_weight_multiplier: WeightMultiplier::new(2.0),
424        },
425        chest_item_choose_script: "if CharacterState.character.custom_values[\"use_chest_script\"] == 1 {some_uuid(uuid(\"8c7cdde1-e80b-4b40-a5d8-039bf39db419\"))} else {none_uuid()}".to_string(),
426        default_shop_tab: ShopTab::DailyDeals,
427    }
428}
429
430fn generate_ads_settings() -> AdsSettings {
431    AdsSettings {
432        chest_upgrade_speedup: AdSpeedupConfig {
433            speedup_seconds: 300,
434            cooldown_sec: 5,
435            daily_limit: 3,
436        },
437        talent_upgrade_speedup: AdSpeedupConfig {
438            speedup_seconds: 300,
439            cooldown_sec: 5,
440            daily_limit: 3,
441        },
442        free_ability_case_cooldown_sec: 86400,
443        skill_gacha_ad_daily_limit: 3,
444        skill_gacha_ad_rolls: 3,
445        pet_gacha_ad_daily_limit: 3,
446        pet_gacha_ad_rolls: 3,
447        afk_boost_ad_daily_limit: 1,
448        afk_boost_multiplier: 1.5,
449        daily_booster_ad_daily_limit: 1,
450        daily_booster_ad_buff_template_id: uuid!("b2c3d4e5-f6a7-8901-bcde-f12345678901"),
451        daily_booster_ad_buff_duration: 3600,
452        arena_refresh_ad_daily_limit: 3,
453        dungeon_raid_ad_daily_limit: 2,
454        bird_ad: BirdAdConfig {
455            daily_limit: 5,
456            cooldown_sec: 60,
457            post_show_cooldown_sec: 10,
458            flight_duration_sec: 8,
459            variants: vec![
460                BirdAdVariantWeight {
461                    variant_id: uuid!("d1e2f3a4-b5c6-7890-abcd-ef1234567891"),
462                    weight: 70,
463                },
464                BirdAdVariantWeight {
465                    variant_id: uuid!("d1e2f3a4-b5c6-7890-abcd-ef1234567892"),
466                    weight: 30,
467                },
468            ],
469        },
470    }
471}
472
473fn generate_item_rarities() -> Vec<ItemRarity> {
474    vec![
475        ItemRarity {
476            id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
477            name: i18n::I18nString::new(
478                "content.item_rarities.8c8acba2-67d3-40e0-ac62-2f7acce64ccc:name",
479            ),
480            rarity_icon: "2b51dc17-022f-404d-a31b-6a7fe1d8603a.png".to_string(),
481            rarity_icon_path: "2b51dc17-022f-404d-a31b-6a7fe1d8603a.png".to_string(),
482            text_color: "#E9E9D4".to_string(),
483            ribbon_icon: "".to_string(),
484            ribbon_icon_path: "".to_string(),
485            order: 1,
486        },
487        ItemRarity {
488            id: uuid!("272f3e73-6b3e-43a0-88d6-d34bdaf5aeae"),
489            name: i18n::I18nString::new(
490                "content.item_rarities.272f3e73-6b3e-43a0-88d6-d34bdaf5aeae:name",
491            ),
492            rarity_icon: "df3529d5-9a9a-4399-9f16-34ea61b66c93.png".to_string(),
493            rarity_icon_path: "df3529d5-9a9a-4399-9f16-34ea61b66c93.png".to_string(),
494            text_color: "#36DB89".to_string(),
495            ribbon_icon: "".to_string(),
496            ribbon_icon_path: "".to_string(),
497            order: 2,
498        },
499        ItemRarity {
500            id: uuid!("c45eed5f-ad7e-4af0-b0a5-46b311573bf4"),
501            name: i18n::I18nString::new(
502                "content.item_rarities.c45eed5f-ad7e-4af0-b0a5-46b311573bf4:name",
503            ),
504            rarity_icon: "28d57678-8db0-4870-9791-1899b7228f96.png".to_string(),
505            rarity_icon_path: "28d57678-8db0-4870-9791-1899b7228f96.png".to_string(),
506            text_color: "#399AE1".to_string(),
507            ribbon_icon: "".to_string(),
508            ribbon_icon_path: "".to_string(),
509            order: 3,
510        },
511        ItemRarity {
512            id: uuid!("a9a0575f-9d09-4118-b305-14e927817302"),
513            name: i18n::I18nString::new(
514                "content.item_rarities.a9a0575f-9d09-4118-b305-14e927817302:name",
515            ),
516            rarity_icon: "b08a1167-c58d-42a4-8230-576c3b69063c.png".to_string(),
517            rarity_icon_path: "b08a1167-c58d-42a4-8230-576c3b69063c.png".to_string(),
518            text_color: "#CC34E3".to_string(),
519            ribbon_icon: "".to_string(),
520            ribbon_icon_path: "".to_string(),
521            order: 4,
522        },
523        ItemRarity {
524            id: uuid!("19e2db05-5f17-4d89-9732-924134056776"),
525            name: i18n::I18nString::new(
526                "content.item_rarities.19e2db05-5f17-4d89-9732-924134056776:name",
527            ),
528            rarity_icon: "1edfd7ed-8945-4c95-8bd5-40ba9422d7c2.png".to_string(),
529            rarity_icon_path: "1edfd7ed-8945-4c95-8bd5-40ba9422d7c2.png".to_string(),
530            text_color: "#FDCA5B".to_string(),
531            ribbon_icon: "".to_string(),
532            ribbon_icon_path: "".to_string(),
533            order: 5,
534        },
535        ItemRarity {
536            id: uuid!("9d662020-0929-439b-8afa-f286b72070a9"),
537            name: i18n::I18nString::new(
538                "content.item_rarities.9d662020-0929-439b-8afa-f286b72070a9:name",
539            ),
540            rarity_icon: "60b73aa0-c1dd-4bac-9efe-ebc25030dbef.png".to_string(),
541            rarity_icon_path: "60b73aa0-c1dd-4bac-9efe-ebc25030dbef.png".to_string(),
542            text_color: "#F78B46".to_string(),
543            ribbon_icon: "".to_string(),
544            ribbon_icon_path: "".to_string(),
545            order: 6,
546        },
547        ItemRarity {
548            id: uuid!("363dded9-e5a4-4bb9-bde6-63037d808246"),
549            name: i18n::I18nString::new(
550                "content.item_rarities.363dded9-e5a4-4bb9-bde6-63037d808246:name",
551            ),
552            rarity_icon: "59126b12-2d5c-45f4-8f58-1283f6ba9ccd.png".to_string(),
553            rarity_icon_path: "59126b12-2d5c-45f4-8f58-1283f6ba9ccd.png".to_string(),
554            text_color: "#ED581D".to_string(),
555            ribbon_icon: "".to_string(),
556            ribbon_icon_path: "".to_string(),
557            order: 7,
558        },
559        ItemRarity {
560            id: uuid!("9e1842cc-4192-4332-8c13-0f901ca442a4"),
561            name: i18n::I18nString::new(
562                "content.item_rarities.9e1842cc-4192-4332-8c13-0f901ca442a4:name",
563            ),
564            rarity_icon: "5dbec395-33dd-43da-b35a-8d1262409c9d.png".to_string(),
565            rarity_icon_path: "5dbec395-33dd-43da-b35a-8d1262409c9d.png".to_string(),
566            text_color: "#FA91FF".to_string(),
567            ribbon_icon: "".to_string(),
568            ribbon_icon_path: "".to_string(),
569            order: 8,
570        },
571        ItemRarity {
572            id: uuid!("d59e98d8-fc7d-4b8b-9da0-a374400df154"),
573            name: i18n::I18nString::new(
574                "content.item_rarities.d59e98d8-fc7d-4b8b-9da0-a374400df154:name",
575            ),
576            rarity_icon: "0d0a6bfa-d2db-40bc-88c9-3bce4472e376.png".to_string(),
577            rarity_icon_path: "0d0a6bfa-d2db-40bc-88c9-3bce4472e376.png".to_string(),
578            text_color: "#5FECF3".to_string(),
579            ribbon_icon: "".to_string(),
580            ribbon_icon_path: "".to_string(),
581            order: 9,
582        },
583        ItemRarity {
584            id: uuid!("c0d049eb-359e-4b1e-9de2-eda276043ea8"),
585            name: i18n::I18nString::new(
586                "content.item_rarities.c0d049eb-359e-4b1e-9de2-eda276043ea8:name",
587            ),
588            rarity_icon: "b4e58214-77c1-45fa-a1ec-260c1e76b5cd.png".to_string(),
589            rarity_icon_path: "b4e58214-77c1-45fa-a1ec-260c1e76b5cd.png".to_string(),
590            text_color: "#E73636".to_string(),
591            ribbon_icon: "".to_string(),
592            ribbon_icon_path: "".to_string(),
593            order: 10,
594        },
595    ]
596}
597
598fn generate_effects() -> Vec<Effect> {
599    vec![
600        Effect {
601            id: uuid!("ccc47912-61c0-4efa-88f9-7911fa1b074f"),
602            name: i18n::I18nString::new(
603                "content.effects.ccc47912-61c0-4efa-88f9-7911fa1b074f:name",
604            ),
605            script: r#"if Entity.attributes["bloodleak"] != () {
606                        Result.push(OverlordEventDamage(Entity.id, unsigned(Entity.attributes["bloodleak"]), CustomEventData()));
607                        Result.push(OverlordEventEntityIncrAttribute(Entity.id, "bloodleak", -5));
608                    }"#.into(),
609            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
610            interval_ticks: Some(5000),
611            required_attributes: Some(vec!["bloodleak".to_string()]),
612            events_subscribe: None,
613            positive: false,
614            code: "".into(),
615            icon: "".into(),
616        },
617        Effect {
618            id: uuid!("3b136901-137c-47cc-8c7e-bc0ce387eb1c"),
619            name: i18n::I18nString::new(
620                "content.effects.3b136901-137c-47cc-8c7e-bc0ce387eb1c:name",
621            ),
622            script: r#"if type_of(Event) == "OverlordEventDamage" {
623                        if Event.entity_id == Entity.id {
624                            if Entity.hp - Event.damage < unsigned(5) {
625                                Result.push(OverlordEventHeal(Entity.id, unsigned(100)));
626                            }
627                        }
628                    }"#.into(),
629            icon_url: "8e991eae-e001-4a76-8238-277c38b35889.webp".to_string(),
630            interval_ticks: None,
631            required_attributes: None,
632            events_subscribe: Some(vec!["Damage".to_string()]),
633            positive: true,
634            code: "".into(),
635            icon: "".into(),
636        },
637        Effect {
638            id: uuid!("39f135d2-b930-42a7-abfa-f1ec49f3cc00"),
639            name: i18n::I18nString::new(
640                "content.effects.3b136901-137c-47cc-8c7e-bc0ce387eb1c:name",
641            ),
642            script: r#"if type_of(Event) == "OverlordEventEntityDeath" {
643                        Result.push(
644                            spawn_entity(
645                                uuid("0486f548-5040-4b70-b202-8b35a9880939"),
646                                Coordinates(Entity.coordinates.x + 1, Entity.coordinates.y + 1),
647                                EntityTeam("Enemy"),
648                                false,
649                                EntityAttributes(),
650                                Random
651                            )
652                        );
653                        Result.push(
654                            spawn_entity(
655                                uuid("0486f548-5040-4b70-b202-8b35a9880939"),
656                                Coordinates(Entity.coordinates.x + 1, Entity.coordinates.y + 2),
657                                EntityTeam("Enemy"),
658                                false,
659                                EntityAttributes(),
660                                Random
661                            )
662                        );
663                    }"#.into(),
664            icon_url: "8e991eae-e001-4a76-8238-277c38b35889.webp".to_string(),
665            interval_ticks: None,
666            required_attributes: None,
667            events_subscribe: Some(vec!["EntityDeath".to_string()]),
668            positive: true,
669            code: "".into(),
670            icon: "".into(),
671        },
672    ]
673}
674
675fn generate_start_ability_script() -> String {
676    r#"for entity in Fight.entities {
677        if entity.team.str != CasterEntity.team.str {
678            Result.push_attack(unsigned(0), unsigned(500), entity.id);
679            break;
680        }
681    }"#
682    .into()
683}
684
685fn generate_ability_script() -> String {
686    r#"Result.push(OverlordEventDamage(TargetEntity.id, unsigned(5), CustomEventData()));"#.into()
687}
688
689fn generate_abilities() -> Vec<AbilityTemplate> {
690    let start_script = generate_start_ability_script();
691    let ability_script = generate_ability_script();
692    vec![
693        AbilityTemplate {
694            id: uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac"),
695            is_fight_ui_visible: false,
696            fight_ui_visibility: AbilityFightUiVisibility::Hidden,
697            name: i18n::I18nString::new(
698                "content.abilities.da6c582b-7364-40bd-9b2d-946d8e20eaac:name",
699            ),
700            start_script: start_script.clone(),
701            script: ability_script.clone(),
702            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
703            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
704            cooldown: 10000,
705            is_gacha_ability: false,
706            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
707            description: i18n::I18nString::new(
708                "content.abilities.da6c582b-7364-40bd-9b2d-946d8e20eaac:description",
709            ),
710            description_values_script: Some("Result.push(1); Result.push(100)".to_string()),
711            vfx_object_path: "".into(),
712            cast_type: AbilityCastType::default(),
713        },
714        AbilityTemplate {
715            id: uuid!("7e584338-057d-41a2-a80e-8e2c76e98f6a"),
716            is_fight_ui_visible: true,
717            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
718            name: i18n::I18nString::new(
719                "content.abilities.7e584338-057d-41a2-a80e-8e2c76e98f6a:name",
720            ),
721            start_script: start_script.clone(),
722            script: ability_script.clone(),
723            icon_url: "8e991eae-e001-4a76-8238-277c38b35889.webp".to_string(),
724            icon_path: "8e991eae-e001-4a76-8238-277c38b35889.webp".to_string(),
725            cooldown: 30000,
726            is_gacha_ability: true,
727            rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
728            description: i18n::I18nString::new(
729                "content.abilities.7e584338-057d-41a2-a80e-8e2c76e98f6a:description",
730            ),
731            description_values_script: Some(
732                "Result.push(2); Result.push(200); Result.push(20000)".to_string(),
733            ),
734            vfx_object_path: "".into(),
735            cast_type: AbilityCastType::default(),
736        },
737        AbilityTemplate {
738            id: uuid!("487a23e5-7401-4c34-a6c6-2401f95249cf"),
739            is_fight_ui_visible: true,
740            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
741            name: i18n::I18nString::new(
742                "content.abilities.487a23e5-7401-4c34-a6c6-2401f95249cf:name",
743            ),
744            start_script: start_script.clone(),
745            script: ability_script.clone(),
746            icon_url: "2cd222a0-1a1a-42d2-b553-7d3754b08e0d.webp".to_string(),
747            icon_path: "2cd222a0-1a1a-42d2-b553-7d3754b08e0d.webp".to_string(),
748            cooldown: 15000,
749            is_gacha_ability: true,
750            rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
751            description: i18n::I18nString::new(
752                "content.abilities.487a23e5-7401-4c34-a6c6-2401f95249cf:description",
753            ),
754            description_values_script: Some("Result.push(3);".to_string()),
755            vfx_object_path: "".into(),
756            cast_type: AbilityCastType::default(),
757        },
758        AbilityTemplate {
759            id: uuid!("fd053ec6-8b23-4ba1-a31f-31b56d8c57bc"),
760            is_fight_ui_visible: true,
761            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
762            name: i18n::I18nString::new(
763                "content.abilities.fd053ec6-8b23-4ba1-a31f-31b56d8c57bc:name",
764            ),
765            start_script: start_script.clone(),
766            script: ability_script.clone(),
767            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
768            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
769            cooldown: 10000,
770            is_gacha_ability: true,
771            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
772            description: i18n::I18nString::new(
773                "content.abilities.fd053ec6-8b23-4ba1-a31f-31b56d8c57bc:description",
774            ),
775            description_values_script: None,
776            vfx_object_path: "".into(),
777            cast_type: AbilityCastType::default(),
778        },
779        AbilityTemplate {
780            id: uuid!("50260b1c-7748-49bf-a1ed-34d69d029697"),
781            is_fight_ui_visible: true,
782            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
783            name: i18n::I18nString::new(
784                "content.abilities.50260b1c-7748-49bf-a1ed-34d69d029697:name",
785            ),
786            start_script: start_script.clone(),
787            script: r#"
788                    Result.push(OverlordEventEntityIncrAttribute(TargetEntity.id, "bloodleak", 10));
789                    Result.push(OverlordEventEntityApplyEffect(TargetEntity.id, uuid("ccc47912-61c0-4efa-88f9-7911fa1b074f")));
790                    "#.into(),
791            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
792            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
793            cooldown: 10000,
794            is_gacha_ability: false,
795            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
796            description: i18n::I18nString::new(
797                "content.abilities.50260b1c-7748-49bf-a1ed-34d69d029697:description",
798            ),
799            description_values_script: Some("Result.push(5); Result.push(500)".to_string()),
800            vfx_object_path: "".into(),
801            cast_type: AbilityCastType::default(),
802        },
803        AbilityTemplate {
804            id: uuid!("41ee5532-a293-4f88-bfb6-5ffca1e57acc"),
805            is_fight_ui_visible: true,
806            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
807            name: i18n::I18nString::new(
808                "content.abilities.41ee5532-a293-4f88-bfb6-5ffca1e57acc:name",
809            ),
810            start_script: "Result.push_attack(unsigned(0), unsigned(500), CasterEntity.id);".into(),
811            script: r#"Result.push(OverlordEventEntityApplyEffect(Event.by_entity_id, uuid("3b136901-137c-47cc-8c7e-bc0ce387eb1c")));"#.into(),
812            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
813            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
814            cooldown: 10000,
815            is_gacha_ability: false,
816            rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
817            description: i18n::I18nString::new(
818                "content.abilities.41ee5532-a293-4f88-bfb6-5ffca1e57acc:description",
819            ),
820            description_values_script: Some("Result.push(6); Result.push(600)".to_string()),
821            vfx_object_path: "".into(),
822            cast_type: AbilityCastType::default(),
823        },
824        AbilityTemplate {
825            id: uuid!("9f8e7d6c-5b4a-3c2d-1e0f-9a8b7c6d5e4f"),
826            is_fight_ui_visible: true,
827            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
828            name: i18n::I18nString::new(
829                "content.abilities.9f8e7d6c-5b4a-3c2d-1e0f-9a8b7c6d5e4f:name",
830            ),
831            start_script: r#"for entity in Fight.entities {
832                if entity.team.str != CasterEntity.team.str {
833                    Result.push_attack(unsigned(0), unsigned(500), entity.id);
834                    break;
835                }
836            }"#
837            .into(),
838            script: ability_script.clone(),
839            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
840            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
841            cooldown: 0,
842            is_gacha_ability: true,
843            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
844            description: i18n::I18nString::new(
845                "content.abilities.9f8e7d6c-5b4a-3c2d-1e0f-9a8b7c6d5e4f:description",
846            ),
847            description_values_script: Some("Result.push(7); Result.push(700)".to_string()),
848            vfx_object_path: "".into(),
849            cast_type: AbilityCastType::default(),
850        },
851        AbilityTemplate {
852            id: uuid!("59e317c9-0108-4eb0-a41f-9d513b821542"),
853            is_fight_ui_visible: true,
854            fight_ui_visibility: AbilityFightUiVisibility::Class,
855            name: i18n::I18nString::new(
856                "content.abilities.59e317c9-0108-4eb0-a41f-9d513b821542:name",
857            ),
858            start_script: start_script.clone(),
859            script: ability_script.clone(),
860            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
861            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
862            cooldown: 10000000000000,
863            is_gacha_ability: false,
864            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
865            description: i18n::I18nString::new(
866                "content.abilities.59e317c9-0108-4eb0-a41f-9d513b821542:description",
867            ),
868            description_values_script: Some("Result.push(1); Result.push(100)".to_string()),
869            vfx_object_path: "".into(),
870            cast_type: AbilityCastType::default(),
871        },
872        AbilityTemplate {
873            id: uuid!("c9c291ea-8a10-4bab-99df-ff0dc40e66f6"),
874            is_fight_ui_visible: true,
875            fight_ui_visibility: AbilityFightUiVisibility::Slotted,
876            name: i18n::I18nString::new(
877                "content.abilities.fd053ec6-8b23-4ba1-a31f-31b56d8c57bc:name",
878            ),
879            start_script: start_script.clone(),
880            script: ability_script.clone(),
881            icon_url: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
882            icon_path: "18789966-dfbb-445a-8ec1-c55397604203.webp".to_string(),
883            cooldown: 0,
884            is_gacha_ability: true,
885            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
886            description: i18n::I18nString::new(
887                "content.abilities.fd053ec6-8b23-4ba1-a31f-31b56d8c57bc:description",
888            ),
889            description_values_script: None,
890            vfx_object_path: "".into(),
891            cast_type: AbilityCastType::default(),
892        },
893    ]
894}
895
896fn generate_ability_cases_settings() -> NonEmptyVec<AbilityCasesSettingsByLevel> {
897    NonEmptyVec::new(vec![
898        AbilityCasesSettingsByLevel {
899            level: 1,
900            opens_to_upgrade: 0,
901            is_boundary_level: false,
902            rarity_weights: vec![
903                AbilityCaseRarityWeight {
904                    rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
905                    weight: PositiveF64::new(256.0),
906                },
907                AbilityCaseRarityWeight {
908                    rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
909                    weight: PositiveF64::new(128.0),
910                },
911                AbilityCaseRarityWeight {
912                    rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
913                    weight: PositiveF64::new(64.0),
914                },
915            ],
916            checkpoints: vec![AbilityCaseCheckpointReward {
917                required_opens: 1,
918                currency_rewards: vec![],
919                ability_rewards: vec![AbilityCaseCheckpointAbilityReward {
920                    amount: 1,
921                    min_rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
922                }],
923            }],
924            allowed_wishlist_rarity_ids: vec![
925                uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
926                uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
927            ],
928            evolve_rules: vec![AbilityCaseEvolveRule {
929                from_rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
930                small_roll_tries: 1,
931                big_roll_tries: 1,
932                to_rarity_weights: vec![AbilityCaseRarityWeight {
933                    rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
934                    weight: PositiveF64::new(1.0),
935                }],
936            }],
937            big_roll_currency_rewards: vec![],
938            big_roll_shards: vec![
939                BigRollShard {
940                    min_rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
941                    count: 7,
942                },
943                BigRollShard {
944                    min_rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
945                    count: 3,
946                },
947                BigRollShard {
948                    min_rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
949                    count: 1,
950                },
951            ],
952        },
953        AbilityCasesSettingsByLevel {
954            level: 2,
955            opens_to_upgrade: 10,
956            is_boundary_level: false,
957            rarity_weights: vec![
958                AbilityCaseRarityWeight {
959                    rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
960                    weight: PositiveF64::new(256.0),
961                },
962                AbilityCaseRarityWeight {
963                    rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
964                    weight: PositiveF64::new(128.0),
965                },
966                AbilityCaseRarityWeight {
967                    rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
968                    weight: PositiveF64::new(64.0),
969                },
970            ],
971            checkpoints: vec![],
972            allowed_wishlist_rarity_ids: vec![uuid!("81b082cc-2736-4545-87d1-301f5de8951a")],
973            evolve_rules: vec![],
974            big_roll_currency_rewards: vec![],
975            big_roll_shards: vec![
976                BigRollShard {
977                    min_rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
978                    count: 7,
979                },
980                BigRollShard {
981                    min_rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
982                    count: 3,
983                },
984                BigRollShard {
985                    min_rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
986                    count: 1,
987                },
988            ],
989        },
990        AbilityCasesSettingsByLevel {
991            level: 3,
992            opens_to_upgrade: 20,
993            is_boundary_level: true,
994            rarity_weights: vec![],
995            checkpoints: vec![],
996            allowed_wishlist_rarity_ids: vec![],
997            evolve_rules: vec![],
998            big_roll_currency_rewards: vec![],
999            big_roll_shards: vec![],
1000        },
1001    ])
1002}
1003
1004fn generate_pet_rarities() -> Vec<PetRarity> {
1005    vec![
1006        PetRarity {
1007            id: uuid!("a0000000-0000-0000-0000-000000000001"),
1008            name: i18n::I18nString::Translated("Common Pet Rarity".to_string()),
1009            order: 1,
1010            color: "#ffffff".to_string(),
1011            bg_color: "#000000".to_string(),
1012            icon_path: "/pet_rarity_common.webp".to_string(),
1013            square_icon_path: "/pet_rarity_common.webp".to_string(),
1014        },
1015        PetRarity {
1016            id: uuid!("a0000000-0000-0000-0000-000000000002"),
1017            name: i18n::I18nString::Translated("Uncommon Pet Rarity".to_string()),
1018            order: 2,
1019            color: "#00ff00".to_string(),
1020            bg_color: "#003300".to_string(),
1021            icon_path: "/pet_rarity_uncommon.webp".to_string(),
1022            square_icon_path: "/pet_rarity_uncommon.webp".to_string(),
1023        },
1024    ]
1025}
1026
1027fn generate_pet_templates() -> Vec<PetTemplate> {
1028    vec![
1029        PetTemplate {
1030            id: uuid!("b0000000-0000-0000-0000-000000000001"),
1031            name: i18n::I18nString::Translated("Test Pet 1".to_string()),
1032            icon_path: "/pet1.webp".to_string(),
1033            spine_path: "/pet1_spine".to_string(),
1034            rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1035            stats: vec![
1036                PetSecondaryStat {
1037                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1038                    base_value: 100,
1039                    per_level_value: 10,
1040                },
1041                PetSecondaryStat {
1042                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1043                    base_value: 50,
1044                    per_level_value: 5,
1045                },
1046            ],
1047            active_ability_id: Some(uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac")),
1048            passive_ability_id: None,
1049            charge_rate_on_damage_dealt: 1000,
1050            charge_rate_on_damage_taken: 500,
1051            charge_rate_on_skill_use: 200,
1052            max_charge: 10000,
1053            is_gacha_pet: true,
1054        },
1055        PetTemplate {
1056            id: uuid!("b0000000-0000-0000-0000-000000000002"),
1057            name: i18n::I18nString::Translated("Test Pet 2".to_string()),
1058            icon_path: "/pet2.webp".to_string(),
1059            spine_path: "/pet2_spine".to_string(),
1060            rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1061            stats: vec![PetSecondaryStat {
1062                attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1063                base_value: 200,
1064                per_level_value: 20,
1065            }],
1066            active_ability_id: None,
1067            passive_ability_id: None,
1068            charge_rate_on_damage_dealt: 0,
1069            charge_rate_on_damage_taken: 0,
1070            charge_rate_on_skill_use: 0,
1071            max_charge: 0,
1072            is_gacha_pet: true,
1073        },
1074        PetTemplate {
1075            id: uuid!("b0000000-0000-0000-0000-000000000003"),
1076            name: i18n::I18nString::Translated("Test Pet 3 Uncommon".to_string()),
1077            icon_path: "/pet3.webp".to_string(),
1078            spine_path: "/pet3_spine".to_string(),
1079            rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1080            stats: vec![PetSecondaryStat {
1081                attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1082                base_value: 300,
1083                per_level_value: 30,
1084            }],
1085            active_ability_id: None,
1086            passive_ability_id: None,
1087            charge_rate_on_damage_dealt: 0,
1088            charge_rate_on_damage_taken: 0,
1089            charge_rate_on_skill_use: 0,
1090            max_charge: 0,
1091            is_gacha_pet: true,
1092        },
1093    ]
1094}
1095
1096fn generate_pet_levels() -> Vec<PetLevel> {
1097    vec![
1098        PetLevel {
1099            level: 2,
1100            rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1101            required_shards: 10,
1102        },
1103        PetLevel {
1104            level: 3,
1105            rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1106            required_shards: 20,
1107        },
1108        PetLevel {
1109            level: 2,
1110            rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1111            required_shards: 15,
1112        },
1113        PetLevel {
1114            level: 3,
1115            rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1116            required_shards: 30,
1117        },
1118    ]
1119}
1120
1121fn generate_pet_slots_levels() -> Vec<PetSlotsLevel> {
1122    vec![PetSlotsLevel {
1123        from_chapter_level: 1,
1124        pet_slots: 3,
1125    }]
1126}
1127
1128fn generate_pet_cases_settings() -> Vec<PetCasesSettingsByLevel> {
1129    // Pet rarity IDs from test config:
1130    // common   = a0000000-...-000000000001 (order 1, weight 256)
1131    // uncommon = a0000000-...-000000000002 (order 2, weight 128)
1132    vec![
1133        PetCasesSettingsByLevel {
1134            level: 1,
1135            opens_to_upgrade: 0,
1136            is_boundary_level: false,
1137            rarity_weights: vec![
1138                PetCaseRarityWeight {
1139                    rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1140                    weight: PositiveF64::new(256.0),
1141                },
1142                PetCaseRarityWeight {
1143                    rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1144                    weight: PositiveF64::new(128.0),
1145                },
1146            ],
1147            checkpoints: vec![PetCaseCheckpointReward {
1148                required_opens: 1,
1149                currency_rewards: vec![],
1150                pet_rewards: vec![PetCaseCheckpointPetReward {
1151                    amount: 1,
1152                    min_rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1153                }],
1154            }],
1155            allowed_wishlist_rarity_ids: vec![uuid!("a0000000-0000-0000-0000-000000000001")],
1156            big_roll_currency_rewards: vec![],
1157            big_roll_shards: vec![
1158                PetBigRollShard {
1159                    min_rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1160                    count: 8,
1161                },
1162                PetBigRollShard {
1163                    min_rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1164                    count: 3,
1165                },
1166            ],
1167        },
1168        PetCasesSettingsByLevel {
1169            level: 2,
1170            opens_to_upgrade: 10,
1171            is_boundary_level: false,
1172            rarity_weights: vec![
1173                PetCaseRarityWeight {
1174                    rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1175                    weight: PositiveF64::new(256.0),
1176                },
1177                PetCaseRarityWeight {
1178                    rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1179                    weight: PositiveF64::new(128.0),
1180                },
1181            ],
1182            checkpoints: vec![],
1183            allowed_wishlist_rarity_ids: vec![uuid!("a0000000-0000-0000-0000-000000000002")],
1184            big_roll_currency_rewards: vec![],
1185            big_roll_shards: vec![
1186                PetBigRollShard {
1187                    min_rarity_id: uuid!("a0000000-0000-0000-0000-000000000001"),
1188                    count: 8,
1189                },
1190                PetBigRollShard {
1191                    min_rarity_id: uuid!("a0000000-0000-0000-0000-000000000002"),
1192                    count: 3,
1193                },
1194            ],
1195        },
1196        PetCasesSettingsByLevel {
1197            level: 3,
1198            opens_to_upgrade: 20,
1199            is_boundary_level: true,
1200            rarity_weights: vec![],
1201            checkpoints: vec![],
1202            allowed_wishlist_rarity_ids: vec![],
1203            big_roll_currency_rewards: vec![],
1204            big_roll_shards: vec![],
1205        },
1206    ]
1207}
1208
1209fn generate_ability_rarities() -> Vec<AbilityRarity> {
1210    vec![
1211        AbilityRarity {
1212            id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
1213            name: i18n::I18nString::new(
1214                "content.ability_rarities.33a0af72-2390-4df9-bd4f-f66b27ed7792:name",
1215            ),
1216            order: 1,
1217            color: "#97ca7a".to_string(),
1218            bg_color: "#244026".to_string(),
1219            icon_url: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1220            icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1221            square_icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1222        },
1223        AbilityRarity {
1224            id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
1225            name: i18n::I18nString::new(
1226                "content.ability_rarities.6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e:name",
1227            ),
1228            order: 2,
1229            color: "#97ca7a".to_string(),
1230            bg_color: "#244026".to_string(),
1231            icon_url: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1232            icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1233            square_icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1234        },
1235        AbilityRarity {
1236            id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
1237            name: i18n::I18nString::new(
1238                "content.ability_rarities.81b082cc-2736-4545-87d1-301f5de8951a:name",
1239            ),
1240            order: 3,
1241            color: "#97ca7a".to_string(),
1242            bg_color: "#244026".to_string(),
1243            icon_url: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1244            icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1245            square_icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1246        },
1247        AbilityRarity {
1248            id: uuid!("88ed32be-33cd-43a5-88e1-65c078e6372d"),
1249            name: i18n::I18nString::new(
1250                "content.ability_rarities.88ed32be-33cd-43a5-88e1-65c078e6372d:name",
1251            ),
1252            order: 4,
1253            color: "#97ca7a".to_string(),
1254            bg_color: "#244026".to_string(),
1255            icon_url: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1256            icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1257            square_icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
1258        },
1259    ]
1260}
1261
1262fn generate_ability_levels() -> Vec<AbilityLevel> {
1263    vec![
1264        AbilityLevel {
1265            level: 1,
1266            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
1267            required_shards: 5,
1268        },
1269        AbilityLevel {
1270            level: 2,
1271            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
1272            required_shards: 10,
1273        },
1274        AbilityLevel {
1275            level: 3,
1276            rarity_id: uuid!("33a0af72-2390-4df9-bd4f-f66b27ed7792"),
1277            required_shards: 10,
1278        },
1279        AbilityLevel {
1280            level: 1,
1281            rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
1282            required_shards: 5,
1283        },
1284        AbilityLevel {
1285            level: 2,
1286            rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
1287            required_shards: 10,
1288        },
1289        AbilityLevel {
1290            level: 3,
1291            rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
1292            required_shards: 15,
1293        },
1294        AbilityLevel {
1295            level: 4,
1296            rarity_id: uuid!("6f0f1099-8ab1-4378-aea5-ac6bcbe6ec3e"),
1297            required_shards: 100,
1298        },
1299        AbilityLevel {
1300            level: 1,
1301            rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
1302            required_shards: 5,
1303        },
1304        AbilityLevel {
1305            level: 2,
1306            rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
1307            required_shards: 10,
1308        },
1309        AbilityLevel {
1310            level: 3,
1311            rarity_id: uuid!("81b082cc-2736-4545-87d1-301f5de8951a"),
1312            required_shards: 15,
1313        },
1314    ]
1315}
1316
1317fn generate_fight_settings() -> FightSettings {
1318    FightSettings {
1319        start_fight_delay_ticks_default: 2000,
1320        prepare_fight_win_delay_ticks_default: 1000,
1321        prepare_fight_lose_delay_ticks_default: 1000,
1322        end_fight_delay_ticks_default: 2000,
1323        player_start_position: Coordinates { x: 1, y: 1 },
1324        party_start_position: Coordinates { x: 1, y: 0 },
1325        power_adjust_script: "0".to_string(),
1326        pvp_enemy_start_position: Coordinates { x: 4, y: 1 },
1327    }
1328}
1329
1330fn generate_entities() -> Vec<EntityTemplate> {
1331    vec![
1332        EntityTemplate {
1333            id: uuid!("969f80ff-cf60-45e5-be6a-036911309ade"),
1334            name: "forest_goblin".into(),
1335            spine: "fe551450-4b55-4641-b376-a0184291fa05".into(),
1336            spine_skin_path: "Goblin:default".into(),
1337            spine_scale: 1,
1338            cast_time: 500,
1339            width: 1,
1340            ability_ids: vec![uuid!("50260b1c-7748-49bf-a1ed-34d69d029697")],
1341            attributes: vec![
1342                EntityAttribute {
1343                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1344                    value: 6,
1345                },
1346                EntityAttribute {
1347                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1348                    value: 5,
1349                },
1350                EntityAttribute {
1351                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1352                    value: 0,
1353                },
1354            ],
1355            rewards: vec![EnemyReward {
1356                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1357                from: 100,
1358                to: 100,
1359                drop_chance: 100.0,
1360            }],
1361        },
1362        EntityTemplate {
1363            id: uuid!("bcc325dd-dc9a-4c30-b3c7-bfefdeec9a5f"),
1364            name: "shadow_wolf".into(),
1365            spine: "".into(),
1366            spine_skin_path: "Goblin:default".into(),
1367            spine_scale: 1,
1368            cast_time: 500,
1369            width: 1,
1370            ability_ids: vec![uuid!("50260b1c-7748-49bf-a1ed-34d69d029697")],
1371            attributes: vec![
1372                EntityAttribute {
1373                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1374                    value: 4,
1375                },
1376                EntityAttribute {
1377                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1378                    value: 8,
1379                },
1380                EntityAttribute {
1381                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1382                    value: 1,
1383                },
1384            ],
1385            rewards: vec![EnemyReward {
1386                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1387                from: 100,
1388                to: 100,
1389                drop_chance: 100.0,
1390            }],
1391        },
1392        EntityTemplate {
1393            id: uuid!("94b110ce-a22c-461a-ab78-8a928ac1fad0"),
1394            name: "stone_giant".into(),
1395            spine: "".into(),
1396            spine_skin_path: "Goblin:default".into(),
1397            spine_scale: 1,
1398            cast_time: 500,
1399            width: 1,
1400            ability_ids: vec![uuid!("7e584338-057d-41a2-a80e-8e2c76e98f6a")],
1401            attributes: vec![
1402                EntityAttribute {
1403                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1404                    value: 10,
1405                },
1406                EntityAttribute {
1407                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1408                    value: 2,
1409                },
1410                EntityAttribute {
1411                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1412                    value: 5,
1413                },
1414            ],
1415            rewards: vec![EnemyReward {
1416                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1417                from: 100,
1418                to: 100,
1419                drop_chance: 100.0,
1420            }],
1421        },
1422        EntityTemplate {
1423            id: uuid!("d414698e-afbd-4cd8-a594-901e8dcef231"),
1424            name: "fire_dragon".into(),
1425            spine: "".into(),
1426            spine_skin_path: "Goblin:default".into(),
1427            spine_scale: 1,
1428            cast_time: 500,
1429            width: 1,
1430            ability_ids: vec![
1431                uuid!("487a23e5-7401-4c34-a6c6-2401f95249cf"),
1432                uuid!("fd053ec6-8b23-4ba1-a31f-31b56d8c57bc"),
1433            ],
1434            attributes: vec![
1435                EntityAttribute {
1436                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1437                    value: 45,
1438                },
1439                EntityAttribute {
1440                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1441                    value: 4,
1442                },
1443                EntityAttribute {
1444                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1445                    value: 7,
1446                },
1447            ],
1448            rewards: vec![EnemyReward {
1449                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1450                from: 100,
1451                to: 100,
1452                drop_chance: 100.0,
1453            }],
1454        },
1455        EntityTemplate {
1456            id: uuid!("447000b9-e155-4b74-82e3-df481ffc8136"),
1457            name: "phantom_assassin".into(),
1458            spine: "".into(),
1459            spine_skin_path: "Goblin:default".into(),
1460            spine_scale: 1,
1461            cast_time: 500,
1462            width: 1,
1463            ability_ids: vec![
1464                uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac"),
1465                uuid!("7e584338-057d-41a2-a80e-8e2c76e98f6a"),
1466                uuid!("50260b1c-7748-49bf-a1ed-34d69d029697"),
1467            ],
1468            attributes: vec![
1469                EntityAttribute {
1470                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1471                    value: 6,
1472                },
1473                EntityAttribute {
1474                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1475                    value: 10,
1476                },
1477                EntityAttribute {
1478                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1479                    value: 2,
1480                },
1481            ],
1482            rewards: vec![EnemyReward {
1483                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1484                from: 100,
1485                to: 100,
1486                drop_chance: 100.0,
1487            }],
1488        },
1489        EntityTemplate {
1490            id: uuid!("0195e7d2-5ae7-70e4-88ec-b9417813b007"),
1491            name: "mini_roshan".into(),
1492            spine: "".into(),
1493            spine_skin_path: "Goblin:default".into(),
1494            spine_scale: 1,
1495            cast_time: 500,
1496            width: 1,
1497            ability_ids: vec![
1498                uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac"),
1499                uuid!("7e584338-057d-41a2-a80e-8e2c76e98f6a"),
1500            ],
1501            attributes: vec![
1502                EntityAttribute {
1503                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1504                    value: 150,
1505                },
1506                EntityAttribute {
1507                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1508                    value: 150,
1509                },
1510                EntityAttribute {
1511                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1512                    value: 150,
1513                },
1514            ],
1515            rewards: vec![EnemyReward {
1516                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1517                from: 500,
1518                to: 500,
1519                drop_chance: 100.0,
1520            }],
1521        },
1522        EntityTemplate {
1523            id: uuid!("0195e7ce-ba97-7f6b-9ac6-0de3c160cde7"),
1524            name: "roshan".into(),
1525            spine: "".into(),
1526            spine_skin_path: "Goblin:default".into(),
1527            spine_scale: 1,
1528            cast_time: 500,
1529            width: 1,
1530            ability_ids: vec![
1531                uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac"),
1532                uuid!("7e584338-057d-41a2-a80e-8e2c76e98f6a"),
1533                uuid!("50260b1c-7748-49bf-a1ed-34d69d029697"),
1534            ],
1535            attributes: vec![
1536                EntityAttribute {
1537                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1538                    value: 300,
1539                },
1540                EntityAttribute {
1541                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1542                    value: 300,
1543                },
1544                EntityAttribute {
1545                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1546                    value: 300,
1547                },
1548            ],
1549            rewards: vec![EnemyReward {
1550                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1551                from: 1000,
1552                to: 1000,
1553                drop_chance: 100.0,
1554            }],
1555        },
1556        EntityTemplate {
1557            id: uuid!("0486f548-5040-4b70-b202-8b35a9880939"),
1558            name: "spawner".into(),
1559            spine: "".into(),
1560            spine_skin_path: "Goblin:default".into(),
1561            spine_scale: 1,
1562            cast_time: 500,
1563            width: 1,
1564            ability_ids: vec![],
1565            attributes: vec![
1566                EntityAttribute {
1567                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
1568                    value: 5,
1569                },
1570                EntityAttribute {
1571                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
1572                    value: 5,
1573                },
1574                EntityAttribute {
1575                    attribute_id: uuid!("42aea610-2ab7-41f7-95bf-5d6f00341ac9"),
1576                    value: 5,
1577                },
1578            ],
1579            rewards: vec![EnemyReward {
1580                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
1581                from: 1000,
1582                to: 1000,
1583                drop_chance: 100.0,
1584            }],
1585        },
1586    ]
1587}
1588
1589fn generate_fight_templates() -> Vec<FightTemplate> {
1590    vec![
1591        FightTemplate {
1592            id: uuid!("360fc654-dea1-4f5d-97af-249ab30608ac"),
1593            title: i18n::I18nString::new(
1594                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1595            ),
1596            power: Some(300),
1597            fight_entities: vec![FightEntity {
1598                entity_type: EntityType::PVPEntity,
1599                position: Coordinates { x: 3, y: 1 },
1600                has_big_hp_bar: false,
1601                team: EntityTeam::Enemy,
1602            }],
1603            background: "".into(),
1604            max_duration_ticks: 300000,
1605            starting_fx: "".to_string(),
1606            fight_type: FightType::ArenaPVP,
1607            waves_amount: 1,
1608            prepare_fight_script: "".into(),
1609            start_script: "".to_string(),
1610            prepare_fight_win_duration_ticks: None,
1611            prepare_fight_lose_duration_ticks: None,
1612            start_fight_delay_ticks: None,
1613            end_fight_delay_ticks: None,
1614            bundle_reward_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
1615            stop_on_win: false,
1616            stop_on_lose: false,
1617            show_vs_screen: false,
1618            show_stages: None,
1619            target_width_cells: 6,
1620        },
1621        FightTemplate {
1622            id: uuid!("b92c69a2-6544-4b83-809f-5af290b75473"),
1623            title: i18n::I18nString::new(
1624                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1625            ),
1626            power: Some(300),
1627            fight_entities: vec![FightEntity {
1628                entity_type: EntityType::PVPEntity,
1629                position: Coordinates { x: 3, y: 1 },
1630                has_big_hp_bar: false,
1631                team: EntityTeam::Enemy,
1632            }],
1633            background: "".into(),
1634            max_duration_ticks: 300000,
1635            starting_fx: "".to_string(),
1636            fight_type: FightType::VassalPVP,
1637            waves_amount: 1,
1638            prepare_fight_script: "".into(),
1639            start_script: "".to_string(),
1640            prepare_fight_win_duration_ticks: None,
1641            prepare_fight_lose_duration_ticks: None,
1642            start_fight_delay_ticks: None,
1643            end_fight_delay_ticks: None,
1644            bundle_reward_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
1645            stop_on_win: false,
1646            stop_on_lose: false,
1647            show_vs_screen: false,
1648            show_stages: None,
1649            target_width_cells: 6,
1650        },
1651        FightTemplate {
1652            id: uuid!("b9d46e46-e8aa-4f73-9b67-694f567f1c48"),
1653            title: i18n::I18nString::new(
1654                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1655            ),
1656            power: Some(300),
1657            fight_entities: vec![
1658                FightEntity {
1659                    entity_type: EntityType::PVEEntity {
1660                        entity_template_id: uuid!("969f80ff-cf60-45e5-be6a-036911309ade"),
1661                    },
1662                    position: Coordinates { x: 3, y: 1 },
1663                    has_big_hp_bar: false,
1664                    team: EntityTeam::Enemy,
1665                },
1666                FightEntity {
1667                    entity_type: EntityType::PVEEntity {
1668                        entity_template_id: uuid!("969f80ff-cf60-45e5-be6a-036911309ade"),
1669                    },
1670                    position: Coordinates { x: 3, y: 2 },
1671                    has_big_hp_bar: false,
1672                    team: EntityTeam::Enemy,
1673                },
1674            ],
1675            background: "".into(),
1676            max_duration_ticks: 300000,
1677            starting_fx: "".to_string(),
1678            fight_type: FightType::CampaignFight,
1679            waves_amount: 1,
1680            prepare_fight_script: "".into(),
1681            start_script: "".to_string(),
1682            prepare_fight_win_duration_ticks: None,
1683            prepare_fight_lose_duration_ticks: None,
1684            start_fight_delay_ticks: None,
1685            end_fight_delay_ticks: None,
1686            bundle_reward_id: None,
1687            stop_on_win: false,
1688            stop_on_lose: false,
1689            show_vs_screen: false,
1690            show_stages: None,
1691            target_width_cells: 6,
1692        },
1693        FightTemplate {
1694            id: uuid!("44ca267b-7b6f-4508-ac74-a17b9dbeed99"),
1695            title: i18n::I18nString::new(
1696                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1697            ),
1698            power: Some(300),
1699            fight_entities: vec![FightEntity {
1700                entity_type: EntityType::PVEEntity {
1701                    entity_template_id: uuid!("bcc325dd-dc9a-4c30-b3c7-bfefdeec9a5f"),
1702                },
1703                position: Coordinates { x: 3, y: 1 },
1704                has_big_hp_bar: false,
1705                team: EntityTeam::Enemy,
1706            }],
1707            background: "".into(),
1708            max_duration_ticks: 300000,
1709            starting_fx: "".to_string(),
1710            fight_type: FightType::CampaignFight,
1711            waves_amount: 1,
1712            prepare_fight_script: "".into(),
1713            start_script: "".to_string(),
1714            prepare_fight_win_duration_ticks: None,
1715            prepare_fight_lose_duration_ticks: None,
1716            start_fight_delay_ticks: None,
1717            end_fight_delay_ticks: None,
1718            bundle_reward_id: None,
1719            stop_on_win: false,
1720            stop_on_lose: false,
1721            show_vs_screen: false,
1722            show_stages: None,
1723            target_width_cells: 6,
1724        },
1725        FightTemplate {
1726            id: uuid!("26f23346-541f-4a74-9ae0-efc3523b0ebf"),
1727            title: i18n::I18nString::new(
1728                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1729            ),
1730            power: Some(300),
1731            fight_entities: vec![
1732                FightEntity {
1733                    entity_type: EntityType::PVEEntity {
1734                        entity_template_id: uuid!("bcc325dd-dc9a-4c30-b3c7-bfefdeec9a5f"),
1735                    },
1736                    position: Coordinates { x: 2, y: 1 },
1737                    has_big_hp_bar: false,
1738                    team: EntityTeam::Enemy,
1739                },
1740                FightEntity {
1741                    entity_type: EntityType::PVEEntity {
1742                        entity_template_id: uuid!("94b110ce-a22c-461a-ab78-8a928ac1fad0"),
1743                    },
1744                    position: Coordinates { x: 2, y: 2 },
1745                    has_big_hp_bar: true,
1746                    team: EntityTeam::Enemy,
1747                },
1748            ],
1749            background: "".into(),
1750            max_duration_ticks: 300000,
1751            starting_fx: "".to_string(),
1752            fight_type: FightType::CampaignBossFight,
1753            waves_amount: 1,
1754            prepare_fight_script: "".into(),
1755            start_script: "".to_string(),
1756            prepare_fight_win_duration_ticks: None,
1757            prepare_fight_lose_duration_ticks: None,
1758            start_fight_delay_ticks: None,
1759            end_fight_delay_ticks: None,
1760            bundle_reward_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
1761            stop_on_win: false,
1762            stop_on_lose: false,
1763            show_vs_screen: false,
1764            show_stages: None,
1765            target_width_cells: 6,
1766        },
1767        FightTemplate {
1768            id: uuid!("f32d7a64-23b4-4d3f-bc31-801ae0f9acda"),
1769            title: i18n::I18nString::new(
1770                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1771            ),
1772            power: Some(300),
1773            fight_entities: vec![
1774                FightEntity {
1775                    entity_type: EntityType::PVEEntity {
1776                        entity_template_id: uuid!("969f80ff-cf60-45e5-be6a-036911309ade"),
1777                    },
1778                    position: Coordinates { x: 3, y: 1 },
1779                    has_big_hp_bar: false,
1780                    team: EntityTeam::Enemy,
1781                },
1782                FightEntity {
1783                    entity_type: EntityType::PVEEntity {
1784                        entity_template_id: uuid!("94b110ce-a22c-461a-ab78-8a928ac1fad0"),
1785                    },
1786                    position: Coordinates { x: 3, y: 2 },
1787                    has_big_hp_bar: false,
1788                    team: EntityTeam::Enemy,
1789                },
1790            ],
1791            background: "".into(),
1792            max_duration_ticks: 300000,
1793            starting_fx: "".to_string(),
1794            fight_type: FightType::CampaignFight,
1795            waves_amount: 1,
1796            prepare_fight_script: "".into(),
1797            start_script: "Result.push(OverlordEventDamage(Fight.entities[0].id, unsigned(5), CustomEventData()))"
1798                .to_string(),
1799            prepare_fight_win_duration_ticks: None,
1800            prepare_fight_lose_duration_ticks: None,
1801            start_fight_delay_ticks: None,
1802            end_fight_delay_ticks: None,
1803            bundle_reward_id: None,
1804            stop_on_win: false,
1805            stop_on_lose: false,
1806            show_vs_screen: false,
1807            show_stages: None,
1808            target_width_cells: 6,
1809        },
1810        FightTemplate {
1811            id: uuid!("83f96aa7-1553-445f-b0d4-4bb1a13c68a1"),
1812            title: i18n::I18nString::new(
1813                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1814            ),
1815            power: Some(300),
1816            fight_entities: vec![
1817                FightEntity {
1818                    entity_type: EntityType::PVEEntity {
1819                        entity_template_id: uuid!("94b110ce-a22c-461a-ab78-8a928ac1fad0"),
1820                    },
1821                    position: Coordinates { x: 3, y: 1 },
1822                    has_big_hp_bar: false,
1823                    team: EntityTeam::Enemy,
1824                },
1825                FightEntity {
1826                    entity_type: EntityType::PVEEntity {
1827                        entity_template_id: uuid!("d414698e-afbd-4cd8-a594-901e8dcef231"),
1828                    },
1829                    position: Coordinates { x: 3, y: 2 },
1830                    has_big_hp_bar: false,
1831                    team: EntityTeam::Enemy,
1832                },
1833            ],
1834            background: "".into(),
1835            max_duration_ticks: 300000,
1836            starting_fx: "".to_string(),
1837            fight_type: FightType::CampaignFight,
1838            waves_amount: 1,
1839            prepare_fight_script: "".into(),
1840            start_script: "".to_string(),
1841            prepare_fight_win_duration_ticks: None,
1842            prepare_fight_lose_duration_ticks: None,
1843            start_fight_delay_ticks: None,
1844            end_fight_delay_ticks: None,
1845            bundle_reward_id: None,
1846            stop_on_win: false,
1847            stop_on_lose: false,
1848            show_vs_screen: false,
1849            show_stages: None,
1850            target_width_cells: 6,
1851        },
1852        FightTemplate {
1853            id: uuid!("a57fe553-3506-4211-a871-d199165a0f6a"),
1854            title: i18n::I18nString::new(
1855                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1856            ),
1857            power: Some(300),
1858            fight_entities: vec![
1859                FightEntity {
1860                    entity_type: EntityType::PVEEntity {
1861                        entity_template_id: uuid!("94b110ce-a22c-461a-ab78-8a928ac1fad0"),
1862                    },
1863                    position: Coordinates { x: 2, y: 1 },
1864                    has_big_hp_bar: false,
1865                    team: EntityTeam::Enemy,
1866                },
1867                FightEntity {
1868                    entity_type: EntityType::PVEEntity {
1869                        entity_template_id: uuid!("0195e7d2-5ae7-70e4-88ec-b9417813b007"),
1870                    },
1871                    position: Coordinates { x: 2, y: 2 },
1872                    has_big_hp_bar: true,
1873                    team: EntityTeam::Enemy,
1874                },
1875            ],
1876            background: "".into(),
1877            max_duration_ticks: 300000,
1878            starting_fx: "".to_string(),
1879            fight_type: FightType::CampaignBossFight,
1880            waves_amount: 1,
1881            prepare_fight_script: "".into(),
1882            start_script: "".to_string(),
1883            prepare_fight_win_duration_ticks: None,
1884            prepare_fight_lose_duration_ticks: None,
1885            start_fight_delay_ticks: None,
1886            end_fight_delay_ticks: None,
1887            bundle_reward_id: None,
1888            stop_on_win: false,
1889            stop_on_lose: false,
1890            show_vs_screen: false,
1891            show_stages: None,
1892            target_width_cells: 6,
1893        },
1894        FightTemplate {
1895            id: uuid!("c274b0bb-173e-49e3-9d36-2c32f1e2c8a1"),
1896            title: i18n::I18nString::new(
1897                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1898            ),
1899            power: Some(300),
1900            fight_entities: vec![FightEntity {
1901                entity_type: EntityType::PVEEntity {
1902                    entity_template_id: uuid!("d414698e-afbd-4cd8-a594-901e8dcef231"),
1903                },
1904                position: Coordinates { x: 3, y: 1 },
1905                has_big_hp_bar: false,
1906                team: EntityTeam::Enemy,
1907            }],
1908            background: "".into(),
1909            max_duration_ticks: 300000,
1910            starting_fx: "".to_string(),
1911            fight_type: FightType::CampaignFight,
1912            waves_amount: 1,
1913            prepare_fight_script: "".into(),
1914            start_script: "".to_string(),
1915            prepare_fight_win_duration_ticks: None,
1916            prepare_fight_lose_duration_ticks: None,
1917            start_fight_delay_ticks: None,
1918            end_fight_delay_ticks: None,
1919            bundle_reward_id: None,
1920            stop_on_win: true,
1921            stop_on_lose: false,
1922            show_vs_screen: false,
1923            show_stages: None,
1924            target_width_cells: 6,
1925        },
1926        FightTemplate {
1927            id: uuid!("d02ac74e-5ad2-49c2-9a3e-927194c62adf"),
1928            title: i18n::I18nString::new(
1929                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1930            ),
1931            power: Some(300),
1932            fight_entities: vec![
1933                FightEntity {
1934                    entity_type: EntityType::PVEEntity {
1935                        entity_template_id: uuid!("969f80ff-cf60-45e5-be6a-036911309ade"),
1936                    },
1937                    position: Coordinates { x: 3, y: 1 },
1938                    has_big_hp_bar: false,
1939                    team: EntityTeam::Enemy,
1940                },
1941                FightEntity {
1942                    entity_type: EntityType::PVEEntity {
1943                        entity_template_id: uuid!("bcc325dd-dc9a-4c30-b3c7-bfefdeec9a5f"),
1944                    },
1945                    position: Coordinates { x: 3, y: 2 },
1946                    has_big_hp_bar: false,
1947                    team: EntityTeam::Enemy,
1948                },
1949                FightEntity {
1950                    entity_type: EntityType::PVEEntity {
1951                        entity_template_id: uuid!("d414698e-afbd-4cd8-a594-901e8dcef231"),
1952                    },
1953                    position: Coordinates { x: 4, y: 1 },
1954                    has_big_hp_bar: false,
1955                    team: EntityTeam::Enemy,
1956                },
1957            ],
1958            background: "".into(),
1959            max_duration_ticks: 300000,
1960            starting_fx: "".to_string(),
1961            fight_type: FightType::CampaignFight,
1962            waves_amount: 1,
1963            prepare_fight_script: "".into(),
1964            start_script: "".to_string(),
1965            prepare_fight_win_duration_ticks: None,
1966            prepare_fight_lose_duration_ticks: None,
1967            start_fight_delay_ticks: None,
1968            end_fight_delay_ticks: None,
1969            bundle_reward_id: None,
1970            stop_on_win: false,
1971            stop_on_lose: true,
1972            show_vs_screen: false,
1973            show_stages: None,
1974            target_width_cells: 6,
1975        },
1976        FightTemplate {
1977            id: uuid!("1f2b6501-d76f-4ed9-a6b6-7057c3ee16dc"),
1978            title: i18n::I18nString::new(
1979                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
1980            ),
1981            power: Some(300),
1982            fight_entities: vec![
1983                FightEntity {
1984                    entity_type: EntityType::PVEEntity {
1985                        entity_template_id: uuid!("d414698e-afbd-4cd8-a594-901e8dcef231"),
1986                    },
1987                    position: Coordinates { x: 2, y: 1 },
1988                    has_big_hp_bar: false,
1989                    team: EntityTeam::Enemy,
1990                },
1991                FightEntity {
1992                    entity_type: EntityType::PVEEntity {
1993                        entity_template_id: uuid!("0195e7ce-ba97-7f6b-9ac6-0de3c160cde7"),
1994                    },
1995                    position: Coordinates { x: 2, y: 2 },
1996                    has_big_hp_bar: true,
1997                    team: EntityTeam::Enemy,
1998                },
1999            ],
2000            background: "".into(),
2001            max_duration_ticks: 300000,
2002            starting_fx: "".to_string(),
2003            fight_type: FightType::CampaignBossFight,
2004            waves_amount: 1,
2005            prepare_fight_script: "".into(),
2006            start_script: "".to_string(),
2007            prepare_fight_win_duration_ticks: None,
2008            prepare_fight_lose_duration_ticks: None,
2009            start_fight_delay_ticks: None,
2010            end_fight_delay_ticks: None,
2011            bundle_reward_id: None,
2012            stop_on_win: false,
2013            stop_on_lose: false,
2014            show_vs_screen: false,
2015            show_stages: None,
2016            target_width_cells: 6,
2017        },
2018        FightTemplate {
2019            id: uuid!("09207dc1-ef01-4222-8382-ee853770fc3d"),
2020            title: i18n::I18nString::new(
2021                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2022            ),
2023            power: Some(300),
2024            fight_entities: vec![
2025                FightEntity {
2026                    entity_type: EntityType::PVEEntity {
2027                        entity_template_id: uuid!("0486f548-5040-4b70-b202-8b35a9880939"),
2028                    },
2029                    position: Coordinates { x: 2, y: 1 },
2030                    has_big_hp_bar: false,
2031                    team: EntityTeam::Enemy,
2032                },
2033                FightEntity {
2034                    entity_type: EntityType::PVEEntity {
2035                        entity_template_id: uuid!("0486f548-5040-4b70-b202-8b35a9880939"),
2036                    },
2037                    position: Coordinates { x: 2, y: 2 },
2038                    has_big_hp_bar: true,
2039                    team: EntityTeam::Enemy,
2040                },
2041            ],
2042            background: "".into(),
2043            max_duration_ticks: 300000,
2044            starting_fx: "".to_string(),
2045            fight_type: FightType::CampaignBossFight,
2046            waves_amount: 1,
2047            prepare_fight_script: "".into(),
2048            start_script: r#"Result.push(OverlordEventEntityApplyEffect(Fight.player_id, uuid("39f135d2-b930-42a7-abfa-f1ec49f3cc00")));"#.to_string(),
2049            prepare_fight_win_duration_ticks: None,
2050            prepare_fight_lose_duration_ticks: None,
2051            start_fight_delay_ticks: None,
2052            end_fight_delay_ticks: None,
2053            bundle_reward_id: None,
2054            stop_on_win: false,
2055            stop_on_lose: false,
2056            show_vs_screen: false,
2057            show_stages: None,
2058            target_width_cells: 6,
2059        },
2060        FightTemplate {
2061            id: uuid!("669c9bac-7734-457a-8619-1c5b65802ac8"),
2062            title: i18n::I18nString::new(
2063                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2064            ),
2065            power: Some(300),
2066            fight_entities: vec![
2067                FightEntity {
2068                    entity_type: EntityType::PVEEntity {
2069                        entity_template_id: uuid!("0486f548-5040-4b70-b202-8b35a9880939"),
2070                    },
2071                    position: Coordinates { x: 2, y: 1 },
2072                    has_big_hp_bar: false,
2073                    team: EntityTeam::Enemy,
2074                },
2075            ],
2076            background: "".into(),
2077            max_duration_ticks: 300000,
2078            starting_fx: "".to_string(),
2079            fight_type: FightType::CampaignBossFight,
2080            waves_amount: 3,
2081            prepare_fight_script: r#"Result.push(spawn_entity(
2082                                        uuid("0486f548-5040-4b70-b202-8b35a9880939"),
2083                                        Coordinates(Fight.entities[0].coordinates.x + 1, Fight.entities[0].coordinates.y + 2),
2084                                        EntityTeam("Enemy"),
2085                                        false,
2086                                        EntityAttributes(),
2087                                        Random
2088                                    ))"#.into(),
2089            start_script: "".into(),
2090            prepare_fight_win_duration_ticks: None,
2091            prepare_fight_lose_duration_ticks: None,
2092            start_fight_delay_ticks: None,
2093            end_fight_delay_ticks: None,
2094            bundle_reward_id: None,
2095            stop_on_win: false,
2096            stop_on_lose: false,
2097            show_vs_screen: false,
2098            show_stages: None,
2099            target_width_cells: 6,
2100        },
2101        FightTemplate {
2102            id: uuid!("bceb9758-a0e1-4f4c-90e9-f841e412baa2"),
2103            title: i18n::I18nString::new(
2104                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2105            ),
2106            power: Some(300),
2107            fight_entities: vec![
2108                FightEntity {
2109                    entity_type: EntityType::PVEEntity {
2110                        entity_template_id: uuid!("0486f548-5040-4b70-b202-8b35a9880939"),
2111                    },
2112                    position: Coordinates { x: 2, y: 1 },
2113                    has_big_hp_bar: false,
2114                    team: EntityTeam::Enemy,
2115                },
2116            ],
2117            background: "".into(),
2118            max_duration_ticks: 300000,
2119            starting_fx: "".to_string(),
2120            fight_type: FightType::CampaignBossFight,
2121            waves_amount: 1,
2122            prepare_fight_script: "".into(),
2123            start_script: "".into(),
2124            prepare_fight_win_duration_ticks: Some(1),
2125            prepare_fight_lose_duration_ticks: Some(1),
2126            start_fight_delay_ticks: Some(1),
2127            end_fight_delay_ticks: Some(1),
2128            bundle_reward_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2129            stop_on_win: false,
2130            stop_on_lose: false,
2131            show_vs_screen: false,
2132            show_stages: None,
2133            target_width_cells: 6,
2134        },
2135        FightTemplate {
2136            id: uuid!("3ba961a4-6eab-4251-a048-1edef27da219"),
2137            title: i18n::I18nString::new(
2138                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2139            ),
2140            power: Some(300),
2141            fight_entities: vec![
2142                FightEntity {
2143                    entity_type: EntityType::PVEEntity {
2144                        entity_template_id: uuid!("0486f548-5040-4b70-b202-8b35a9880939"),
2145                    },
2146                    position: Coordinates { x: 2, y: 1 },
2147                    has_big_hp_bar: false,
2148                    team: EntityTeam::Enemy,
2149                },
2150            ],
2151            background: "".into(),
2152            max_duration_ticks: 300000,
2153            starting_fx: "".to_string(),
2154            fight_type: FightType::CampaignBossFight,
2155            waves_amount: 2,
2156            prepare_fight_script: "".into(),
2157            start_script: "".into(),
2158            prepare_fight_win_duration_ticks: Some(1),
2159            prepare_fight_lose_duration_ticks: Some(1),
2160            start_fight_delay_ticks: Some(1),
2161            end_fight_delay_ticks: Some(1),
2162            bundle_reward_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2163            stop_on_win: false,
2164            stop_on_lose: false,
2165            show_vs_screen: false,
2166            show_stages: None,
2167            target_width_cells: 6,
2168        }
2169    ]
2170}
2171
2172fn generate_dungeon_templates() -> Vec<DungeonTemplate> {
2173    vec![DungeonTemplate {
2174        id: uuid!("cfa28006-f242-47dc-9f69-e12587ea54fb"),
2175        title: i18n::I18nString::new("content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title"),
2176        description: i18n::I18nString::new(
2177            "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2178        ),
2179        key_currency_id: uuid!("85d98a50-510e-4853-b00a-84a51ad5cb50"),
2180        max_difficulty_level: 2,
2181        ui_background_path: "".to_string(),
2182        ui_banner_path: "".to_string(),
2183        tips: vec![
2184            DungeonTip {
2185                difficulty_level: 1,
2186                tip: i18n::I18nString::new(
2187                    "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2188                ),
2189            },
2190            DungeonTip {
2191                difficulty_level: 2,
2192                tip: i18n::I18nString::new(
2193                    "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2194                ),
2195            },
2196        ],
2197        fight_template_ids: vec![
2198            uuid!("bceb9758-a0e1-4f4c-90e9-f841e412baa2"),
2199            uuid!("bceb9758-a0e1-4f4c-90e9-f841e412baa2"),
2200        ],
2201        rewards_by_difficulty: vec![],
2202        main_reward: RewardType::Currency(uuid!("2ed77d25-cc1e-41ee-8f46-c4934ca8f684")),
2203        chapter_level_unlock: 2,
2204    }]
2205}
2206
2207fn generate_chapters() -> Vec<Chapter> {
2208    vec![
2209        Chapter {
2210            id: uuid!("9a51675f-9aa7-4f2b-9843-f2ce0cf8e6fd"),
2211            title: i18n::I18nString::new(
2212                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2213            ),
2214            level: 0,
2215            fight_ids: vec![
2216                uuid!("b9d46e46-e8aa-4f73-9b67-694f567f1c48"),
2217                uuid!("44ca267b-7b6f-4508-ac74-a17b9dbeed99"),
2218                uuid!("26f23346-541f-4a74-9ae0-efc3523b0ebf"),
2219            ],
2220        },
2221        Chapter {
2222            id: uuid!("a073ff29-425d-47d2-93e2-e254b5da3ec3"),
2223            title: i18n::I18nString::new(
2224                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2225            ),
2226            level: 1,
2227            fight_ids: vec![
2228                uuid!("f32d7a64-23b4-4d3f-bc31-801ae0f9acda"),
2229                uuid!("83f96aa7-1553-445f-b0d4-4bb1a13c68a1"),
2230                uuid!("a57fe553-3506-4211-a871-d199165a0f6a"),
2231            ],
2232        },
2233        Chapter {
2234            id: uuid!("35e6ccd4-7412-4910-ac1e-e6bdb6e1e1fb"),
2235            title: i18n::I18nString::new(
2236                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2237            ),
2238            level: 2,
2239            fight_ids: vec![
2240                uuid!("c274b0bb-173e-49e3-9d36-2c32f1e2c8a1"),
2241                uuid!("d02ac74e-5ad2-49c2-9a3e-927194c62adf"),
2242                uuid!("1f2b6501-d76f-4ed9-a6b6-7057c3ee16dc"),
2243            ],
2244        },
2245        Chapter {
2246            id: uuid!("fda76007-ff26-4a66-abef-0bd0f7ac3e60"),
2247            title: i18n::I18nString::new(
2248                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2249            ),
2250            level: 3,
2251            fight_ids: vec![uuid!("09207dc1-ef01-4222-8382-ee853770fc3d")],
2252        },
2253        Chapter {
2254            id: uuid!("e1c72dcf-017f-4d6b-8834-8e32f77c7534"),
2255            title: i18n::I18nString::new(
2256                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2257            ),
2258            level: 4,
2259            fight_ids: vec![uuid!("669c9bac-7734-457a-8619-1c5b65802ac8")],
2260        },
2261        Chapter {
2262            id: uuid!("de35b2ff-9330-4b1d-a268-5a82f7646936"),
2263            title: i18n::I18nString::new(
2264                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2265            ),
2266            level: 5,
2267            fight_ids: vec![uuid!("3ba961a4-6eab-4251-a048-1edef27da219")],
2268        },
2269    ]
2270}
2271
2272fn generate_character_levels() -> Vec<CharacterLevel> {
2273    vec![
2274        CharacterLevel {
2275            level: 1,
2276            required_experience: 0,
2277            attributes: vec![EntityAttribute {
2278                attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
2279                value: 10,
2280            }],
2281        },
2282        CharacterLevel {
2283            level: 2,
2284            required_experience: 10000,
2285            attributes: vec![EntityAttribute {
2286                attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
2287                value: 30,
2288            }],
2289        },
2290    ]
2291}
2292
2293fn generate_ability_slots_levels() -> Vec<AbilitySlotsLevel> {
2294    vec![
2295        AbilitySlotsLevel {
2296            from_chapter_level: 0,
2297            ability_slots: 2,
2298        },
2299        AbilitySlotsLevel {
2300            from_chapter_level: 2,
2301            ability_slots: 10,
2302        },
2303    ]
2304}
2305
2306fn generate_patron_levels() -> Vec<ReferralLevelInfo> {
2307    vec![
2308        ReferralLevelInfo {
2309            level: 1,
2310            required_experience: 0,
2311            lvlup_reward: vec![],
2312            daily_reward: vec![],
2313        },
2314        ReferralLevelInfo {
2315            level: 2,
2316            required_experience: 200,
2317            lvlup_reward: vec![CurrencyUnit {
2318                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2319                amount: 100,
2320            }],
2321            daily_reward: vec![CurrencyUnit {
2322                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2323                amount: 100,
2324            }],
2325        },
2326    ]
2327}
2328fn generate_quests() -> Vec<QuestTemplate> {
2329    vec![
2330        QuestTemplate {
2331            id: uuid!("e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5"),
2332            title: i18n::I18nString::new(
2333                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2334            ),
2335            description: i18n::I18nString::new(
2336                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2337            ),
2338            progress_script: r#"if Event.level == 1 { return 1; } else { return 2; };"#.into(),
2339            progress_target: 100,
2340            quest_group_type: QuestGroupType::Daily,
2341            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2342            progression_points: 70,
2343            starting: true,
2344            next_quest_ids: vec![],
2345            events_subscribe: vec!["NewCharacterLevel".to_string()],
2346            additional_quests_script: None,
2347            progress_if_inactive: false,
2348            screen_reference: None,
2349            code: None,
2350        },
2351        QuestTemplate {
2352            id: uuid!("4cf49879-8129-481c-b356-9e0f29335e84"),
2353            title: i18n::I18nString::new(
2354                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2355            ),
2356            description: i18n::I18nString::new(
2357                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2358            ),
2359            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2360            progress_target: 2,
2361            quest_group_type: QuestGroupType::Daily,
2362            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2363            progression_points: 70,
2364            starting: true,
2365            next_quest_ids: vec![],
2366            events_subscribe: vec!["PlayerNewItems".to_string()],
2367            additional_quests_script: None,
2368            progress_if_inactive: false,
2369            screen_reference: None,
2370            code: None,
2371        },
2372        QuestTemplate {
2373            id: uuid!("305300e2-f432-4cbf-ad46-85386a9a9410"),
2374            title: i18n::I18nString::new(
2375                "content.quests.305300e2-f432-4cbf-ad46-85386a9a9410:title",
2376            ),
2377            description: i18n::I18nString::new(
2378                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2379            ),
2380            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2381            progress_target: 2,
2382            quest_group_type: QuestGroupType::LoopTask,
2383            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2384            progression_points: 80,
2385            starting: false,
2386            next_quest_ids: vec![uuid!("305300e2-f432-4cbf-ad46-85386a9a9410")],
2387            events_subscribe: vec!["PlayerNewItems".to_string()],
2388            additional_quests_script: Some("Result.push(OverlordEventSetCustomValue(\"loop_task\", 1));
2389                                            Result.push(OverlordEventUpdateActiveLoopTaskId(uuid(\"29540ca2-21f3-4f0e-a478-240adafed4e3\")))".to_string()),
2390            progress_if_inactive: true,
2391            screen_reference: None,
2392            code: None,
2393        },
2394        QuestTemplate {
2395            id: uuid!("29540ca2-21f3-4f0e-a478-240adafed4e3"),
2396            title: i18n::I18nString::new(
2397                "content.quests.29540ca2-21f3-4f0e-a478-240adafed4e3:title",
2398            ),
2399            description: i18n::I18nString::new(
2400                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2401            ),
2402            progress_script: r#"Quest.current + 1"#.into(),
2403            progress_target: 3,
2404            quest_group_type: QuestGroupType::LoopTask,
2405            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2406            progression_points: 100,
2407            starting: false,
2408            next_quest_ids: vec![uuid!("29540ca2-21f3-4f0e-a478-240adafed4e3")],
2409            events_subscribe: vec!["PlayerNewItems".to_string()],
2410            additional_quests_script: Some("Result.push(OverlordEventSetCustomValue(\"loop_task\", 2));
2411                                            Result.push(OverlordEventUpdateActiveLoopTaskId(uuid(\"9d3d2428-af3c-409f-a580-593de0fd06cf\")))".to_string()),
2412            progress_if_inactive: false,
2413            screen_reference: None,
2414            code: None,
2415        },
2416        QuestTemplate {
2417            id: uuid!("9d3d2428-af3c-409f-a580-593de0fd06cf"),
2418            title: i18n::I18nString::new(
2419                "content.quests.29540ca2-21f3-4f0e-a478-240adafed4e3:title",
2420            ),
2421            description: i18n::I18nString::new(
2422                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2423            ),
2424            progress_script: r#"Quest.current + 1"#.into(),
2425            progress_target: 5,
2426            quest_group_type: QuestGroupType::LoopTask,
2427            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2428            progression_points: 100,
2429            starting: false,
2430            next_quest_ids: vec![uuid!("9d3d2428-af3c-409f-a580-593de0fd06cf")],
2431            events_subscribe: vec!["PlayerNewItems".to_string()],
2432            additional_quests_script: Some("Result.push(OverlordEventSetCustomValue(\"loop_task\", 0));
2433                                            Result.push(OverlordEventUpdateActiveLoopTaskId(uuid(\"305300e2-f432-4cbf-ad46-85386a9a9410\")))".to_string()),
2434            progress_if_inactive: true,
2435            screen_reference: None,
2436            code: None,
2437        },
2438        QuestTemplate {
2439            id: uuid!("fa166167-f172-424f-b10b-a661fa8895db"),
2440            title: i18n::I18nString::new(
2441                "content.quests.fa166167-f172-424f-b10b-a661fa8895db:title",
2442            ),
2443            description: i18n::I18nString::new(
2444                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2445            ),
2446            progress_script:
2447                r#"if Event.level == 1 { return 1; }; if Event.level == 2 { return 2; };"#.into(),
2448            progress_target: 2,
2449            quest_group_type: QuestGroupType::PatronLifetime,
2450            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2451            progression_points: 50,
2452            starting: true,
2453            next_quest_ids: vec![],
2454            events_subscribe: vec!["NewCharacterLevel".to_string()],
2455            additional_quests_script: None,
2456            progress_if_inactive: false,
2457            screen_reference: None,
2458            code: None,
2459        },
2460        QuestTemplate {
2461            id: uuid!("2cf76eea-5b4b-4258-9051-3d3188845c5e"),
2462            title: i18n::I18nString::new(
2463                "content.quests.fa166167-f172-424f-b10b-a661fa8895db:title",
2464            ),
2465            description: i18n::I18nString::new(
2466                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2467            ),
2468            progress_script:
2469                r#"if Quest.current == 0 { return 1; }; if Quest.current == 1 { return 2; };"#
2470                    .into(),
2471            progress_target: 2,
2472            quest_group_type: QuestGroupType::PatronLifetime,
2473            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2474            progression_points: 50,
2475            starting: true,
2476            next_quest_ids: vec![],
2477            events_subscribe: vec!["PlayerNewItems".to_string()],
2478            additional_quests_script: None,
2479            progress_if_inactive: false,
2480            screen_reference: None,
2481            code: None,
2482        },
2483        QuestTemplate {
2484            id: uuid!("78552c1c-5e8a-4f95-8f48-a5671051852e"),
2485            title: i18n::I18nString::new(
2486                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2487            ),
2488            description: i18n::I18nString::new(
2489                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2490            ),
2491            progress_script:
2492                r#"if Quest.current == 0 { return 1; }; if Quest.current == 1 { return 2; };"#
2493                    .into(),
2494            progress_target: 2,
2495            quest_group_type: QuestGroupType::PatronDaily,
2496            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2497            progression_points: 1000,
2498            starting: true,
2499            next_quest_ids: vec![],
2500            events_subscribe: vec!["PlayerNewItems".to_string()],
2501            additional_quests_script: None,
2502            progress_if_inactive: false,
2503            screen_reference: None,
2504            code: None,
2505        },
2506        QuestTemplate {
2507            id: uuid!("b16fea6d-6b9b-484c-b25b-8bec70234691"),
2508            title: i18n::I18nString::new(
2509                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2510            ),
2511            description: i18n::I18nString::new(
2512                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2513            ),
2514            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2515            progress_target: 2,
2516            quest_group_type: QuestGroupType::Hidden,
2517            bundle_id: None,
2518            progression_points: 0,
2519            starting: true,
2520            next_quest_ids: vec![uuid!("ce92f997-e41e-4cfe-9963-e100cc121289")],
2521            events_subscribe: vec!["PlayerNewItems".to_string()],
2522            additional_quests_script: None,
2523            progress_if_inactive: false,
2524            screen_reference: None,
2525            code: None,
2526        },
2527        QuestTemplate {
2528            id: uuid!("ce92f997-e41e-4cfe-9963-e100cc121289"),
2529            title: i18n::I18nString::new(
2530                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2531            ),
2532            description: i18n::I18nString::new(
2533                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2534            ),
2535            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2536            progress_target: 2,
2537            quest_group_type: QuestGroupType::Hidden,
2538            bundle_id: None,
2539            progression_points: 0,
2540            starting: false,
2541            next_quest_ids: vec![uuid!("db3c73c6-e300-42dd-be47-3f820ab8b095")],
2542            events_subscribe: vec!["PlayerNewItems".to_string()],
2543            additional_quests_script: None,
2544            progress_if_inactive: false,
2545            screen_reference: None,
2546            code: None,
2547        },
2548        QuestTemplate {
2549            id: uuid!("c3ae0d0c-a0c3-49f4-b538-fd19f388d0b2"),
2550            title: i18n::I18nString::new(
2551                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2552            ),
2553            description: i18n::I18nString::new(
2554                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2555            ),
2556            progress_script: r#"Quest.current + 1"#.into(),
2557            progress_target: 1,
2558            quest_group_type: QuestGroupType::Hidden,
2559            bundle_id: None,
2560            progression_points: 0,
2561            starting: true,
2562            next_quest_ids: vec![],
2563            events_subscribe: vec!["PlayerNewItems".to_string()],
2564            additional_quests_script: Some("Result.push(OverlordEventSetCustomValue(\"loop_task\", 0));
2565                                            Result.push(give_quests([
2566                                                uuid(\"305300e2-f432-4cbf-ad46-85386a9a9410\"),
2567                                                uuid(\"29540ca2-21f3-4f0e-a478-240adafed4e3\"),
2568                                                uuid(\"9d3d2428-af3c-409f-a580-593de0fd06cf\")
2569                                            ]));
2570                                            Result.push(OverlordEventUpdateActiveLoopTaskId(uuid(\"305300e2-f432-4cbf-ad46-85386a9a9410\")))".to_string()),
2571            progress_if_inactive: false,
2572            screen_reference: None,
2573            code: None,
2574        },
2575        QuestTemplate {
2576            id: uuid!("a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"),
2577            title: i18n::I18nString::new(
2578                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2579            ),
2580            description: i18n::I18nString::new(
2581                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2582            ),
2583            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2584            progress_target: 2,
2585            quest_group_type: QuestGroupType::Hidden,
2586            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2587            progression_points: 0,
2588            starting: false,
2589            next_quest_ids: vec![],
2590            events_subscribe: vec!["NewCharacterLevel".to_string()],
2591            additional_quests_script: None,
2592            progress_if_inactive: false,
2593            screen_reference: None,
2594            code: None,
2595        },
2596        QuestTemplate {
2597            id: uuid!("db3c73c6-e300-42dd-be47-3f820ab8b095"),
2598            title: i18n::I18nString::new(
2599                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2600            ),
2601            description: i18n::I18nString::new(
2602                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2603            ),
2604            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2605            progress_target: 2,
2606            quest_group_type: QuestGroupType::Lifetime,
2607            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2608            progression_points: 0,
2609            starting: false,
2610            next_quest_ids: vec![],
2611            events_subscribe: vec!["PlayerNewItems".to_string()],
2612            additional_quests_script: None,
2613            progress_if_inactive: false,
2614            screen_reference: None,
2615            code: None,
2616        },
2617        QuestTemplate {
2618            id: uuid!("d1986660-eb69-4051-a256-dbb1d8e5377f"),
2619            title: i18n::I18nString::new(
2620                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2621            ),
2622            description: i18n::I18nString::new(
2623                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2624            ),
2625            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2626            progress_target: 2,
2627            quest_group_type: QuestGroupType::Lifetime,
2628            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2629            progression_points: 0,
2630            starting: true,
2631            next_quest_ids: vec![],
2632            events_subscribe: vec!["PlayerNewItems".to_string()],
2633            additional_quests_script: None,
2634            progress_if_inactive: false,
2635            screen_reference: None,
2636            code: None,
2637        },
2638        // ========== Achievement quests (independent, all starting, no chaining) ==========
2639        // Achievement 1: "Sell 2 items"
2640        QuestTemplate {
2641            id: uuid!("a1000000-0000-0000-0000-000000000001"),
2642            title: i18n::I18nString::new(
2643                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2644            ),
2645            description: i18n::I18nString::new(
2646                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2647            ),
2648            progress_script: r#"if Quest.current == 0 { 1 } else { 2 }"#.into(),
2649            progress_target: 2,
2650            quest_group_type: QuestGroupType::Achievement,
2651            progression_points: 50,
2652            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2653            starting: true,
2654            next_quest_ids: vec![],
2655            events_subscribe: vec!["PlayerNewItems".to_string()],
2656            additional_quests_script: None,
2657            progress_if_inactive: false,
2658            screen_reference: None,
2659            code: None,
2660        },
2661        // Achievement 2: "Sell 3 items"
2662        QuestTemplate {
2663            id: uuid!("a1000000-0000-0000-0000-000000000002"),
2664            title: i18n::I18nString::new(
2665                "content.quests.e3bc23d8-2035-44d0-b8c1-bb1996ac6bc5:title",
2666            ),
2667            description: i18n::I18nString::new(
2668                "content.quests.78552c1c-5e8a-4f95-8f48-a5671051852e:title",
2669            ),
2670            progress_script: r#"Quest.current + 1"#.into(),
2671            progress_target: 3,
2672            quest_group_type: QuestGroupType::Achievement,
2673            progression_points: 50,
2674            bundle_id: Some(uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82")),
2675            starting: true,
2676            next_quest_ids: vec![],
2677            events_subscribe: vec!["PlayerNewItems".to_string()],
2678            additional_quests_script: None,
2679            progress_if_inactive: false,
2680            screen_reference: None,
2681            code: None,
2682        },
2683    ]
2684}
2685
2686fn generate_quests_progression_settings() -> QuestsProgressionSettings {
2687    QuestsProgressionSettings {
2688        daily: vec![
2689            QuestsProgressionPointSettings {
2690                points: 35,
2691                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 10))"#.into(),
2692            },
2693            QuestsProgressionPointSettings {
2694                points: 70,
2695                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 70))"#.into(),
2696            },
2697            QuestsProgressionPointSettings {
2698                points: 100,
2699                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 100))"#.into(),
2700            },
2701        ],
2702        weekly: vec![
2703            QuestsProgressionPointSettings {
2704                points: 30,
2705                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 100))"#.into(),
2706            },
2707            QuestsProgressionPointSettings {
2708                points: 60,
2709                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 500))"#.into(),
2710            },
2711            QuestsProgressionPointSettings {
2712                points: 100,
2713                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 1000))"#.into(),
2714            },
2715        ],
2716        achievement: vec![
2717            QuestsProgressionPointSettings {
2718                points: 50,
2719                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 10))"#.into(),
2720            },
2721            QuestsProgressionPointSettings {
2722                points: 100,
2723                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 50))"#.into(),
2724            },
2725            QuestsProgressionPointSettings {
2726                points: 200,
2727                reward_script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 100))"#.into(),
2728            },
2729        ],
2730    }
2731}
2732
2733fn generate_vassals_settings() -> VassalsSettings {
2734    VassalsSettings {
2735        vassal_reward_script:
2736            r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 42))"#.into(),
2737        suzerain_reward_script:
2738            r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 42))"#.into(),
2739        vassal_shield_duration_secs: 0,
2740    }
2741}
2742
2743fn generate_pvp_settings() -> PvpSettings {
2744    PvpSettings {
2745        max_matchmaking_opponents_count: 10,
2746        matchmaking_character_level_data: 2,
2747    }
2748}
2749
2750fn generate_vassal_tasks() -> Vec<VassalTaskTemplate> {
2751    vec![
2752        VassalTaskTemplate {
2753            id: uuid!("7b4a7bf5-01e0-4078-9cc1-52b742ed2b1e"),
2754            title: i18n::I18nString::new("content.vassal_tasks.7b4a7bf5-01e0-4078-9cc1-52b742ed2b1e:title"),
2755            duration_sec: 2,
2756            reward_script: r#"if GoodTask {Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 42))} else {Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 32))}"#.into(),
2757            loyalty_script: r#"if GoodTask {42} else {32}"#.into(),
2758        },
2759        VassalTaskTemplate {
2760            id: uuid!("05e915bf-55fe-4419-bcf0-5f90833f17bd"),
2761            title: i18n::I18nString::new("content.vassal_tasks.05e915bf-55fe-4419-bcf0-5f90833f17bd:title"),
2762            duration_sec: 10,
2763            reward_script: r#"if GoodTask {Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 0))} else {Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 42))}"#.into(),
2764            loyalty_script: r#"if GoodTask {0} else {42}"#.into(),
2765        },
2766    ]
2767}
2768
2769fn generate_gifts() -> Vec<GiftTemplate> {
2770    vec![
2771        GiftTemplate {
2772            id: uuid!("5e4b493e-78d2-45cd-931a-3d12ff669038"),
2773            gift_type: GiftType::VassalGift,
2774            price: vec![CurrencyUnit {
2775                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2776                amount: 50,
2777            }],
2778            reward: vec![CurrencyUnit {
2779                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2780                amount: 50,
2781            }],
2782            loyalty: 50,
2783        },
2784        GiftTemplate {
2785            id: uuid!("64e8ead6-44cf-4798-a18d-db648d598930"),
2786            gift_type: GiftType::GenericGift,
2787            price: vec![CurrencyUnit {
2788                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2789                amount: 50,
2790            }],
2791            reward: vec![CurrencyUnit {
2792                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2793                amount: 50,
2794            }],
2795            loyalty: 0,
2796        },
2797    ]
2798}
2799
2800fn generate_currencies() -> Vec<Currency> {
2801    vec![
2802        Currency {
2803            id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2804            name: i18n::I18nString::new(
2805                "content.currencies.b59b33a2-4d19-4e2c-9cea-e03ea15882a0:name",
2806            ),
2807            description: i18n::I18nString::new(
2808                "content.currencies.b59b33a2-4d19-4e2c-9cea-e03ea15882a0:name",
2809            ),
2810            icon_url: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
2811            icon_path: "e0bcf4ea-b2b5-47d6-9d76-985797a5a818.webp".to_string(),
2812        },
2813        Currency {
2814            id: uuid!("22297520-abb8-45b9-9fbb-c418b8001246"),
2815            name: i18n::I18nString::new(
2816                "content.currencies.22297520-abb8-45b9-9fbb-c418b8001246:name",
2817            ),
2818            description: i18n::I18nString::new(
2819                "content.currencies.22297520-abb8-45b9-9fbb-c418b8001246:name",
2820            ),
2821            icon_url: "b2446d1a-368d-4747-8b92-82a279bc6193.webp".to_string(),
2822            icon_path: "b2446d1a-368d-4747-8b92-82a279bc6193.webp".to_string(),
2823        },
2824        Currency {
2825            id: uuid!("6c050b07-5282-4a23-8bbf-dabecd27cade"),
2826            name: i18n::I18nString::new(
2827                "content.currencies.6c050b07-5282-4a23-8bbf-dabecd27cade:name",
2828            ),
2829            description: i18n::I18nString::new(
2830                "content.currencies.6c050b07-5282-4a23-8bbf-dabecd27cade:name",
2831            ),
2832            icon_url: "50a5cd4b-6b68-4e44-b4dd-9acb928bfea5.webp".to_string(),
2833            icon_path: "50a5cd4b-6b68-4e44-b4dd-9acb928bfea5.webp".to_string(),
2834        },
2835    ]
2836}
2837
2838fn generate_mail_templates() -> Vec<MailTemplate> {
2839    vec![
2840        MailTemplate {
2841            id: uuid!("f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1"),
2842            title: i18n::I18nString::new(
2843                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:title",
2844            ),
2845            message: i18n::I18nString::new(
2846                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:message",
2847            ),
2848            bundle_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2849            lifetime_secs: 86_400,
2850            send_type: MailSendType {
2851                scheduled_at: None,
2852                repeat: None,
2853            },
2854            restrictions: None,
2855            is_auto_send: true,
2856        },
2857        MailTemplate {
2858            id: uuid!("7216d615-6adc-46ab-b5af-4d8e26f38baf"),
2859            title: i18n::I18nString::new(
2860                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:title",
2861            ),
2862            message: i18n::I18nString::new(
2863                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:message",
2864            ),
2865            bundle_id: None,
2866            lifetime_secs: 86_400,
2867            send_type: MailSendType {
2868                scheduled_at: None,
2869                repeat: None,
2870            },
2871            restrictions: None,
2872            is_auto_send: true,
2873        },
2874        MailTemplate {
2875            id: uuid!("5dd4c42f-95af-4f10-8fa7-7f567686e756"),
2876            title: i18n::I18nString::new(
2877                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:title",
2878            ),
2879            message: i18n::I18nString::new(
2880                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:message",
2881            ),
2882            bundle_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2883            lifetime_secs: 86_400,
2884            send_type: MailSendType {
2885                scheduled_at: Some("2015-01-01-00-00-00".to_string()),
2886                repeat: Some(MailRepeatType::Daily),
2887            },
2888            restrictions: None,
2889            is_auto_send: true,
2890        },
2891        MailTemplate {
2892            id: uuid!("7b1d8c15-74c5-44d1-b7fb-bb027d5389c6"),
2893            title: i18n::I18nString::new(
2894                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:title",
2895            ),
2896            message: i18n::I18nString::new(
2897                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:message",
2898            ),
2899            bundle_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2900            lifetime_secs: 86_400,
2901            send_type: MailSendType {
2902                scheduled_at: Some("2015-01-01-00-00-00".to_string()),
2903                repeat: Some(MailRepeatType::Daily),
2904            },
2905            restrictions: None,
2906            is_auto_send: false,
2907        },
2908        MailTemplate {
2909            id: uuid!("98eea253-ac84-49ea-becb-4d5ef9c18b5c"),
2910            title: i18n::I18nString::new(
2911                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:title",
2912            ),
2913            message: i18n::I18nString::new(
2914                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:message",
2915            ),
2916            bundle_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2917            lifetime_secs: 86_400,
2918            send_type: MailSendType {
2919                scheduled_at: Some("2015-01-01-00-00-00".to_string()),
2920                repeat: Some(MailRepeatType::Daily),
2921            },
2922            restrictions: None,
2923            is_auto_send: false,
2924        },
2925        MailTemplate {
2926            id: uuid!("0042b76d-bfbe-4e02-a6a6-4881e229da88"),
2927            title: i18n::I18nString::new(
2928                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:title",
2929            ),
2930            message: i18n::I18nString::new(
2931                "content.mails.f3d6c5a1-2b4e-4c9a-9f61-8d2e9af2a1b1:message",
2932            ),
2933            bundle_id: Some(uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d")),
2934            lifetime_secs: 86_400,
2935            send_type: MailSendType {
2936                scheduled_at: Some("2015-01-01-00-00-00".to_string()),
2937                repeat: Some(MailRepeatType::Daily),
2938            },
2939            restrictions: None,
2940            is_auto_send: false,
2941        },
2942    ]
2943}
2944
2945fn generate_inventory_levels() -> Vec<InventoryLevel> {
2946    vec![InventoryLevel {
2947        from_chapter_level: 0,
2948        item_types: all::<ItemType>().collect(),
2949    }]
2950}
2951
2952fn generate_arena_settings() -> ArenaSettings {
2953    ArenaSettings {
2954        base_rating: 1000,
2955        win_rating_increase_script: "25".to_string(),
2956        lose_rating_increase_script: "-20".to_string(),
2957        matches_history_size: 5,
2958        leaderboard_size: 5,
2959        arena_tickets_currency_id: uuid!("6c050b07-5282-4a23-8bbf-dabecd27cade"),
2960        matchmaking_character_rating_delta: 30,
2961        pvp_cooldown_secs: 60,
2962        win_stars_increase: 1,
2963        lose_stars_decrease: -1,
2964        stars_reward_threshold: 3,
2965        stars_reward_bundle_id: uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d"),
2966        arena_ticket_buy_currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2967        arena_ticket_price: CurrencyUnit {
2968            currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
2969            amount: 100,
2970        },
2971        arena_matches_ttl_days: 30,
2972        rematch_max_rating_increase: 250,
2973        rematch_max_rating_decrease: -100,
2974        daily_stars_claims_limit: 2,
2975    }
2976}
2977
2978fn generate_arena_leagues() -> Vec<ArenaLeague> {
2979    vec![
2980        ArenaLeague {
2981            id: uuid!("842ce55f-c6b9-4d2f-b86b-6288529a8658"),
2982            name: i18n::I18nString::new(
2983                "content.arena.leagues.842ce55f-c6b9-4d2f-b86b-6288529a8658:name",
2984            ),
2985            min_rating: 0,
2986            max_rating: 999,
2987        },
2988        ArenaLeague {
2989            id: uuid!("d1936748-b14e-4a7a-b17d-aaf2d70e5077"),
2990            name: i18n::I18nString::new(
2991                "content.arena.leagues.d1936748-b14e-4a7a-b17d-aaf2d70e5077:name",
2992            ),
2993            min_rating: 1000,
2994            max_rating: 1999,
2995        },
2996        ArenaLeague {
2997            id: uuid!("1e69174c-5628-4a65-ba87-55ac6e31868f"),
2998            name: i18n::I18nString::new(
2999                "content.arena.leagues.1e69174c-5628-4a65-ba87-55ac6e31868f:name",
3000            ),
3001            min_rating: 2000,
3002            max_rating: 10000,
3003        },
3004    ]
3005}
3006
3007fn generate_matchmaking_settings() -> MatchmakingSettings {
3008    MatchmakingSettings {
3009        opponent_positions: vec![
3010            OpponentPositionSettings {
3011                min_rating_diff_percent: 15.0,
3012                max_rating_diff_percent: 20.0,
3013                max_rating_for_bots: 1000,
3014                bot_power_multiplier: 1.0,
3015            },
3016            OpponentPositionSettings {
3017                min_rating_diff_percent: -7.0,
3018                max_rating_diff_percent: 7.0,
3019                max_rating_for_bots: 1000,
3020                bot_power_multiplier: 1.0,
3021            },
3022            OpponentPositionSettings {
3023                min_rating_diff_percent: -7.0,
3024                max_rating_diff_percent: 7.0,
3025                max_rating_for_bots: 1000,
3026                bot_power_multiplier: 1.0,
3027            },
3028            OpponentPositionSettings {
3029                min_rating_diff_percent: -17.0,
3030                max_rating_diff_percent: -15.0,
3031                max_rating_for_bots: 1000,
3032                bot_power_multiplier: 1.0,
3033            },
3034        ],
3035        percentile_threshold: 30.0,
3036    }
3037}
3038
3039fn generate_event_descriptions() -> Vec<EventDescription> {
3040    vec![EventDescription {
3041        name: "NewCharacterLevel".to_string(),
3042        description: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3043        color: "#008000".to_string(),
3044        icon_url: "tmp".to_string(),
3045        bg_url: "tmp".to_string(),
3046        bg_path: "tmp".to_string(),
3047        text_url: "tmp".to_string(),
3048        effect_url: "tmp".to_string(),
3049        ttl_milliseconds: 2000,
3050    }]
3051}
3052
3053fn generate_classes() -> Vec<class::Class> {
3054    vec![
3055        class::Class {
3056            id: uuid!("00000000-0000-0000-0000-000000000000"),
3057            character_asset: "2f7d1e2e-0e33-4730-a3b6-de7122ed9044".to_string(),
3058            spine: "".into(),
3059            cast_time: 500,
3060            basic_abilities: vec![uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac")],
3061            starter_bundle_id: None,
3062            attributes: vec![],
3063            ability_rarity_id: uuid!("88ed32be-33cd-43a5-88e1-65c078e6372d"),
3064            tier: class::ClassTier::C,
3065            transitions: vec![],
3066            background_image_url: "".to_string(),
3067            icon_url: "".to_string(),
3068            description: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3069            name: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3070        },
3071        class::Class {
3072            id: uuid!("5956e37c-ca7f-45cf-8bfb-49601dc9aca3"),
3073            character_asset: "2f7d1e2e-0e33-4730-a3b6-de7122ed9044".to_string(),
3074            spine: "".into(),
3075            cast_time: 500,
3076            basic_abilities: vec![uuid!("da6c582b-7364-40bd-9b2d-946d8e20eaac")],
3077            starter_bundle_id: Some(uuid!("c86eed27-03d0-4c06-a6b2-e8688c09f7ed")),
3078            attributes: vec![
3079                class::ClassAttribute::EntityAttribute(EntityAttribute {
3080                    attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
3081                    value: 50,
3082                }),
3083                class::ClassAttribute::EntityAttribute(EntityAttribute {
3084                    attribute_id: uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"),
3085                    value: 20,
3086                }),
3087                class::ClassAttribute::ScriptAttributes(
3088                    r#"Result.push(EntityAttribute(uuid("45eca0a7-7430-487b-bd65-b796c6d88c08"), 20)); Result.push(EntityAttribute(uuid("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6"), 5))"#
3089                        .into(),
3090                ),
3091            ],
3092            ability_rarity_id: uuid!("88ed32be-33cd-43a5-88e1-65c078e6372d"),
3093            tier: class::ClassTier::A,
3094            transitions: vec![class::ClassTransition {
3095                class_id: uuid!("95d314ee-ce2c-4b10-a8bc-596b0f03ab8a"),
3096                cost: vec![CurrencyUnit {
3097                    currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3098                    amount: 20,
3099                }],
3100            }],
3101            background_image_url: "".to_string(),
3102            icon_url: "".to_string(),
3103            description: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3104            name: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3105        },
3106        class::Class {
3107            id: uuid!("95d314ee-ce2c-4b10-a8bc-596b0f03ab8a"),
3108            character_asset: "2f7d1e2e-0e33-4730-a3b6-de7122ed9044".to_string(),
3109            spine: "".into(),
3110            cast_time: 500,
3111            basic_abilities: vec![uuid!("59e317c9-0108-4eb0-a41f-9d513b821542"), uuid!("41ee5532-a293-4f88-bfb6-5ffca1e57acc")],
3112            starter_bundle_id: None,
3113            attributes: vec![],
3114            ability_rarity_id: uuid!("88ed32be-33cd-43a5-88e1-65c078e6372d"),
3115            tier: class::ClassTier::A,
3116            transitions: vec![],
3117            background_image_url: "".to_string(),
3118            icon_url: "".to_string(),
3119            description: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3120            name: i18n::I18nString::new("content.event.newcharacterlevel:name"),
3121        },
3122    ]
3123}
3124
3125fn generate_projectiles() -> Vec<Projectile> {
3126    vec![Projectile {
3127        id: uuid!("1ca53a04-5321-4d93-bdc4-55caed5ab83b"),
3128        start_script:
3129            r#"Result.animation_duration_ticks = unsigned(500); Result.projectile_data.add("damage", 300);"#
3130                .to_string(),
3131        script: "Result.push(OverlordEventDamage(TargetEntity.id, unsigned(5), CustomEventData()));".to_string(),
3132        vfx: "".to_string(),
3133    }]
3134}
3135
3136fn generate_basic_items() -> Vec<ItemTemplate> {
3137    vec![
3138        ItemTemplate {
3139            id: uuid!("176c4cc5-7b93-43b4-9f90-958e2791a8d6"),
3140            name: i18n::I18nString::new("content.items.176c4cc5-7b93-43b4-9f90-958e2791a8d6:name"),
3141            icon_url: "/leather_boots.png".to_string(),
3142            icon_path: "/leather_boots.png".to_string(),
3143            item_type: ItemType::Weapon,
3144            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3145            attributes_settings: ItemAttributeSettings {
3146                optional_attributes_count: 0,
3147                optional_attributes_ids: vec![],
3148            },
3149            skin_id: Some(uuid!("44d8fbed-9ec9-4a57-865a-59d32465a1f2")),
3150            exclude_from_mimic: false,
3151        },
3152        ItemTemplate {
3153            id: uuid!("9f86cff5-2ce6-4191-95cf-2271cc3686f5"),
3154            name: i18n::I18nString::new("content.items.9f86cff5-2ce6-4191-95cf-2271cc3686f5:name"),
3155            icon_url: "/iron_chestplate.png".to_string(),
3156            icon_path: "/iron_chestplate.png".to_string(),
3157            item_type: ItemType::Torso,
3158            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3159            attributes_settings: ItemAttributeSettings {
3160                optional_attributes_count: 0,
3161                optional_attributes_ids: vec![],
3162            },
3163            skin_id: Some(uuid!("a1b2c3d4-e5f6-7890-abcd-ef1234567890")),
3164            exclude_from_mimic: false,
3165        },
3166        ItemTemplate {
3167            id: uuid!("6779d933-1663-4d02-8e47-2bf8ce06aeee"),
3168            name: i18n::I18nString::new("content.items.6779d933-1663-4d02-8e47-2bf8ce06aeee:name"),
3169            icon_url: "/mask_of_fury.png".to_string(),
3170            icon_path: "/mask_of_fury.png".to_string(),
3171            item_type: ItemType::Head,
3172            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3173            attributes_settings: ItemAttributeSettings {
3174                optional_attributes_count: 0,
3175                optional_attributes_ids: vec![],
3176            },
3177            skin_id: None,
3178            exclude_from_mimic: false,
3179        },
3180        ItemTemplate {
3181            id: uuid!("a1b2c3d4-e5f6-7890-abcd-ef1234567891"),
3182            name: i18n::I18nString::new("content.items.a1b2c3d4-e5f6-7890-abcd-ef1234567891:name"),
3183            icon_url: "/simple_sword.png".to_string(),
3184            icon_path: "/simple_sword.png".to_string(),
3185            item_type: ItemType::Weapon,
3186            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3187            attributes_settings: ItemAttributeSettings {
3188                optional_attributes_count: 0,
3189                optional_attributes_ids: vec![],
3190            },
3191            skin_id: None,
3192            exclude_from_mimic: false,
3193        },
3194        ItemTemplate {
3195            id: uuid!("37108f62-1595-4e2d-8d51-708b96311511"),
3196            name: i18n::I18nString::new("content.items.37108f62-1595-4e2d-8d51-708b96311511:name"),
3197            icon_url: "/gloves_of_agility.png".to_string(),
3198            icon_path: "/gloves_of_agility.png".to_string(),
3199            item_type: ItemType::Legs,
3200            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3201            attributes_settings: ItemAttributeSettings {
3202                optional_attributes_count: 1,
3203                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3204            },
3205            skin_id: None,
3206            exclude_from_mimic: false,
3207        },
3208        ItemTemplate {
3209            id: uuid!("edee37e9-cfea-4406-b16e-64f5f3aed7c2"),
3210            name: i18n::I18nString::new("content.items.edee37e9-cfea-4406-b16e-64f5f3aed7c2:name"),
3211            icon_url: "/wizard_hat.png".to_string(),
3212            icon_path: "/wizard_hat.png".to_string(),
3213            item_type: ItemType::Shoulders,
3214            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3215            attributes_settings: ItemAttributeSettings {
3216                optional_attributes_count: 1,
3217                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3218            },
3219            skin_id: None,
3220            exclude_from_mimic: false,
3221        },
3222        ItemTemplate {
3223            id: uuid!("88ee0a22-b495-40bd-ad1b-132998a1cd37"),
3224            name: i18n::I18nString::new("content.items.88ee0a22-b495-40bd-ad1b-132998a1cd37:name"),
3225            icon_url: "/mystic_pants.png".to_string(),
3226            icon_path: "/mystic_pants.png".to_string(),
3227            item_type: ItemType::Boots,
3228            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3229            attributes_settings: ItemAttributeSettings {
3230                optional_attributes_count: 1,
3231                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3232            },
3233            skin_id: None,
3234            exclude_from_mimic: false,
3235        },
3236        ItemTemplate {
3237            id: uuid!("1eda3aa8-8868-4f77-8ac3-cb2c0b080f1d"),
3238            name: i18n::I18nString::new("content.items.1eda3aa8-8868-4f77-8ac3-cb2c0b080f1d:name"),
3239            icon_url: "/immortal_blade.png".to_string(),
3240            icon_path: "/immortal_blade.png".to_string(),
3241            item_type: ItemType::Gloves,
3242            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3243            attributes_settings: ItemAttributeSettings {
3244                optional_attributes_count: 1,
3245                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3246            },
3247            skin_id: None,
3248            exclude_from_mimic: false,
3249        },
3250        ItemTemplate {
3251            id: uuid!("255ad949-72cc-48dc-8129-30584a5a69b7"),
3252            name: i18n::I18nString::new("content.items.255ad949-72cc-48dc-8129-30584a5a69b7:name"),
3253            icon_url: "/divine_armor.png".to_string(),
3254            icon_path: "/divine_armor.png".to_string(),
3255            item_type: ItemType::Waist,
3256            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3257            attributes_settings: ItemAttributeSettings {
3258                optional_attributes_count: 1,
3259                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3260            },
3261            skin_id: None,
3262            exclude_from_mimic: false,
3263        },
3264        ItemTemplate {
3265            id: uuid!("32be4f79-5327-4118-9594-e67a3a97959d"),
3266            name: i18n::I18nString::new("content.items.32be4f79-5327-4118-9594-e67a3a97959d:name"),
3267            icon_url: "/ancient_crown.png".to_string(),
3268            icon_path: "/ancient_crown.png".to_string(),
3269            item_type: ItemType::Neck,
3270            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3271            attributes_settings: ItemAttributeSettings {
3272                optional_attributes_count: 1,
3273                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3274            },
3275            skin_id: None,
3276            exclude_from_mimic: false,
3277        },
3278        ItemTemplate {
3279            id: uuid!("8c7cdde1-e80b-4b40-a5d8-039bf39db419"),
3280            name: i18n::I18nString::new("content.items.8c7cdde1-e80b-4b40-a5d8-039bf39db419:name"),
3281            icon_url: "/godlike_scepter.png".to_string(),
3282            icon_path: "/godlike_scepter.png".to_string(),
3283            item_type: ItemType::Ring,
3284            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3285            attributes_settings: ItemAttributeSettings {
3286                optional_attributes_count: 1,
3287                optional_attributes_ids: vec![uuid!("3a6ec1c8-7494-43df-a345-d23e297b892d")],
3288            },
3289            skin_id: None,
3290            exclude_from_mimic: false,
3291        },
3292    ]
3293}
3294
3295fn generate_items(item_rarities: &[ItemRarity]) -> Vec<ItemTemplate> {
3296    let basic_items = generate_basic_items();
3297    let mut result = basic_items.clone();
3298    for rarity in &item_rarities[1..] {
3299        for item in &basic_items {
3300            result.push(ItemTemplate {
3301                id: Uuid::now_v7(),
3302                rarity_id: rarity.id,
3303                ..item.clone()
3304            });
3305        }
3306    }
3307    result
3308}
3309
3310fn generate_bundles() -> Vec<bundles::BundleRaw> {
3311    let first_steps = vec![
3312        bundles::BundleRawStep {
3313            item_type: bundles::BundleStepType::Currency,
3314            script:
3315                r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 80)); Result.push(CurrencyUnit(uuid("22297520-abb8-45b9-9fbb-c418b8001246"), 70));"#
3316                    .into(),
3317            has_pop_up: true,
3318        },
3319        bundles::BundleRawStep {
3320            item_type: bundles::BundleStepType::Ability,
3321            script:
3322                r#"Result.push(AbilityShard(uuid("7e584338-057d-41a2-a80e-8e2c76e98f6a"), 11)); Result.push(AbilityShard(uuid("487a23e5-7401-4c34-a6c6-2401f95249cf"), 1))"#
3323                    .into(),
3324            has_pop_up: true,
3325        },
3326        bundles::BundleRawStep {
3327            item_type: bundles::BundleStepType::Item,
3328            script: r#"Result.push(uuid("176c4cc5-7b93-43b4-9f90-958e2791a8d6"))"#.into(),
3329            has_pop_up: false,
3330        },
3331    ];
3332
3333    let second_steps = vec![
3334        bundles::BundleRawStep {
3335            item_type: bundles::BundleStepType::Currency,
3336            script:
3337                r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 50)); Result.push(CurrencyUnit(uuid("22297520-abb8-45b9-9fbb-c418b8001246"), 170));"#
3338                    .into(),
3339            has_pop_up: true,
3340        },
3341        bundles::BundleRawStep {
3342            item_type: bundles::BundleStepType::Ability,
3343            script:
3344                r#"Result.push(AbilityShard(uuid("7e584338-057d-41a2-a80e-8e2c76e98f6a"), 6)); Result.push(AbilityShard(uuid("487a23e5-7401-4c34-a6c6-2401f95249cf"), 18))"#
3345                    .into(),
3346            has_pop_up: true,
3347        },
3348        bundles::BundleRawStep {
3349            item_type: bundles::BundleStepType::Item,
3350            script: r#"Result.push(uuid("f86cff5-2ce6-4191-95cf-2271cc3686f5"))"#.into(),
3351            has_pop_up: false,
3352        },
3353    ];
3354
3355    let fourth_steps = vec![
3356        bundles::BundleRawStep {
3357            item_type: bundles::BundleStepType::Currency,
3358            script: r#"
3359                if Now - LastClaimAt > unsigned(8) {
3360                    Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 228));
3361                } else {
3362                    Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 111));
3363                }
3364                "#
3365            .into(),
3366            has_pop_up: true,
3367        },
3368        bundles::BundleRawStep {
3369            item_type: bundles::BundleStepType::Ability,
3370            script: "".into(),
3371            has_pop_up: false,
3372        },
3373        bundles::BundleRawStep {
3374            item_type: bundles::BundleStepType::Item,
3375            script: "".into(),
3376            has_pop_up: false,
3377        },
3378    ];
3379
3380    let all_at_once_steps = vec![
3381        bundles::BundleRawStep {
3382            item_type: bundles::BundleStepType::Currency,
3383            script:
3384                r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 100)); Result.push(CurrencyUnit(uuid("22297520-abb8-45b9-9fbb-c418b8001246"), 200));"#
3385                    .into(),
3386            has_pop_up: true,
3387        },
3388        bundles::BundleRawStep {
3389            item_type: bundles::BundleStepType::Ability,
3390            script:
3391                r#"Result.push(AbilityShard(uuid("7e584338-057d-41a2-a80e-8e2c76e98f6a"), 25)); Result.push(AbilityShard(uuid("487a23e5-7401-4c34-a6c6-2401f95249cf"), 10))"#
3392                    .into(),
3393            has_pop_up: false,
3394        },
3395        bundles::BundleRawStep {
3396            item_type: bundles::BundleStepType::Item,
3397            script: r#"Result.push(uuid("176c4cc5-7b93-43b4-9f90-958e2791a8d6"))"#.into(),
3398            has_pop_up: false,
3399        },
3400    ];
3401
3402    let basic_bundle = vec![bundles::BundleRawStep {
3403        item_type: bundles::BundleStepType::Currency,
3404        script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 100));"#
3405            .into(),
3406        has_pop_up: true,
3407    }];
3408
3409    let basic_bundle_no_popup = vec![bundles::BundleRawStep {
3410        item_type: bundles::BundleStepType::Currency,
3411        script: r#"Result.push(CurrencyUnit(uuid("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"), 100));"#
3412            .into(),
3413        has_pop_up: false,
3414    }];
3415
3416    vec![
3417        bundles::BundleRaw {
3418            id: uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d"),
3419            steps: first_steps,
3420            claim_mode: bundles::BundleClaimMode::Sequential,
3421        },
3422        bundles::BundleRaw {
3423            id: uuid!("e18fc101-6615-440c-9a1d-42f509986ccc"),
3424            steps: second_steps,
3425            claim_mode: bundles::BundleClaimMode::Sequential,
3426        },
3427        bundles::BundleRaw {
3428            id: uuid!("c86eed27-03d0-4c06-a6b2-e8688c09f7ed"),
3429            steps: vec![],
3430            claim_mode: bundles::BundleClaimMode::Sequential,
3431        },
3432        bundles::BundleRaw {
3433            id: uuid!("1ed77d25-cc1e-41ee-8f46-c4934ca8f684"),
3434            steps: fourth_steps,
3435            claim_mode: bundles::BundleClaimMode::Sequential,
3436        },
3437        bundles::BundleRaw {
3438            id: uuid!("a7f3b8e2-9c4d-4a5e-b6f1-d8e9c7a2b1f0"),
3439            steps: all_at_once_steps,
3440            claim_mode: bundles::BundleClaimMode::AllAtOnce,
3441        },
3442        bundles::BundleRaw {
3443            id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3444            steps: basic_bundle,
3445            claim_mode: bundles::BundleClaimMode::AllAtOnce,
3446        },
3447        bundles::BundleRaw {
3448            id: uuid!("9cc6c6e4-e87f-4443-99ce-2f88b2bdbe82"),
3449            steps: basic_bundle_no_popup,
3450            claim_mode: bundles::BundleClaimMode::AllAtOnce,
3451        },
3452    ]
3453}
3454
3455fn generate_ability_presets_settings() -> ability_presets::AbilityPresetsSettings {
3456    ability_presets::AbilityPresetsSettings {
3457        max_presets_count: 4,
3458        default_preset_name: i18n::I18nString::new("content.ability_presets.default_preseset:name"),
3459    }
3460}
3461
3462fn generate_bots_settings() -> BotsSettings {
3463    BotsSettings {
3464        bots_generation_script: r#"
3465            Result.set_level(1);
3466            Result.set_class_id(uuid("00000000-0000-0000-0000-000000000000"));
3467
3468            Result.push_item(UuidIntPair(uuid("176c4cc5-7b93-43b4-9f90-958e2791a8d6"), 1));
3469            Result.push_item(UuidIntPair(uuid("9f86cff5-2ce6-4191-95cf-2271cc3686f5"), 2));
3470            
3471            Result.push_ability(UuidIntPair(uuid("7e584338-057d-41a2-a80e-8e2c76e98f6a"), 1));
3472            
3473            Result.set_power(52);
3474        "#
3475        .to_string(),
3476        username_generation_settings: UsernameGenerationSettings {
3477            prefixes: vec!["Angry".to_string(), "Chubby".to_string()],
3478            suffixes: vec!["Lord".to_string(), "Queen".to_string()],
3479            template: "{prefix}{suffix} [bot]".to_string(),
3480        },
3481        photo_generation_settings: PhotoGenerationSettings {
3482            templates: vec!["img1".to_string(), "img2".to_string()],
3483        },
3484    }
3485}
3486
3487fn generate_reports_settings() -> ReportsSettings {
3488    ReportsSettings {
3489        ticket_categories: vec!["Technical support".to_string(), "Bug".to_string()],
3490        bug_categories: vec!["Bug".to_string()],
3491    }
3492}
3493
3494fn generate_afk_rewards_levels() -> Vec<AfkRewardsByLevel> {
3495    vec![AfkRewardsByLevel {
3496        chapter_level: 0,
3497        currency_rates: vec![CurrencyRate {
3498            currency_id: uuid!("2ed77d25-cc1e-41ee-8f46-c4934ca8f684"),
3499            rate_per_minute: PositiveF64::new(10.0),
3500        }],
3501        bonus_weights: NonEmptyVec::new(vec![
3502            AfkRewardBonusWeight {
3503                bonus_type: AfkRewardBonusType::Currency(uuid!(
3504                    "2ed77d25-cc1e-41ee-8f46-c4934ca8f684"
3505                )),
3506                weight: PositiveF64::new(1.0),
3507                count: PositiveI64::new(100),
3508            },
3509            AfkRewardBonusWeight {
3510                bonus_type: AfkRewardBonusType::Ability(uuid!(
3511                    "3ed77d25-cc1e-41ee-8f46-c4934ca8f684"
3512                )),
3513                weight: PositiveF64::new(0.5),
3514                count: PositiveI64::new(1),
3515            },
3516            AfkRewardBonusWeight {
3517                bonus_type: AfkRewardBonusType::Item(uuid!("4ed77d25-cc1e-41ee-8f46-c4934ca8f684")),
3518                weight: PositiveF64::new(0.5),
3519                count: PositiveI64::new(1),
3520            },
3521        ]),
3522    }]
3523}
3524
3525fn generate_afk_rewards_settings() -> AfkRewardsSettings {
3526    AfkRewardsSettings {
3527        bundle_id: uuid!("1ed77d25-cc1e-41ee-8f46-c4934ca8f684"),
3528        min_required_time_sec: 4,
3529        max_possible_time_sec: 8,
3530        bonus_calculation_rate_sec: NonZeroU64::new(60),
3531        instant_reward_duration_sec: 6,
3532        instant_reward_gems_prices: vec![50, 100, 150],
3533        afk_instant_ad_daily_limit: 2,
3534    }
3535}
3536
3537fn generate_users_generating_settings() -> UsersGeneratingSettings {
3538    UsersGeneratingSettings {
3539        username_generation_settings: UsernameGenerationSettings {
3540            prefixes: vec!["Big".to_string(), "Small".to_string()],
3541            suffixes: vec!["Egor".to_string(), "Danya".to_string()],
3542            template: "{prefix} {suffix}".to_string(),
3543        },
3544        photo_generation_settings: PhotoGenerationSettings {
3545            templates: vec!["img1".to_string(), "img2".to_string()],
3546        },
3547    }
3548}
3549
3550fn generate_skins() -> Vec<ConfigSkin> {
3551    vec![
3552        ConfigSkin {
3553            id: uuid!("59a4dd34-b395-436f-8f81-2fb36ee1b714"),
3554            name: i18n::I18nString::new("content.skins.59a4dd34-b395-436f-8f81-2fb36ee1b714:name"),
3555            unlock_description: Some(i18n::I18nString::Translated("Default face unlock".into())),
3556            code: "default_face".to_string(),
3557            skin_type: SkinType::Face,
3558            icon_url: "/skins/face_default.webp".to_string(),
3559            icon_path: "/skins/face_default.webp".to_string(),
3560            spine_path: "".to_string(),
3561            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3562            price: None,
3563            color: Some("".into()),
3564        },
3565        ConfigSkin {
3566            id: uuid!("44d8fbed-9ec9-4a57-865a-59d32465a1f2"),
3567            name: i18n::I18nString::new("content.skins.44d8fbed-9ec9-4a57-865a-59d32465a1f2:name"),
3568            unlock_description: Some(i18n::I18nString::Translated(
3569                "Default hairstyle unlock".into(),
3570            )),
3571            code: "default_hairstyle".to_string(),
3572            skin_type: SkinType::Hairstyle,
3573            icon_url: "/skins/hair_default.webp".to_string(),
3574            icon_path: "/skins/face_default.webp".to_string(),
3575            spine_path: "".to_string(),
3576            rarity_id: uuid!("272f3e73-6b3e-43a0-88d6-d34bdaf5aeae"),
3577            price: Some(vec![CurrencyUnit {
3578                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3579                amount: 100,
3580            }]),
3581            color: Some("".into()),
3582        },
3583        ConfigSkin {
3584            id: uuid!("a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
3585            name: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3586            unlock_description: Some(i18n::I18nString::Translated("Test armor unlock".into())),
3587            code: "test_armor".to_string(),
3588            skin_type: SkinType::Armor,
3589            icon_url: "/skins/armor_test.webp".to_string(),
3590            icon_path: "/skins/face_default.webp".to_string(),
3591            spine_path: "".to_string(),
3592            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3593            price: None,
3594            color: Some("".into()),
3595        },
3596        ConfigSkin {
3597            id: uuid!("c0ffee00-1234-5678-9abc-def012345678"),
3598            name: i18n::I18nString::Translated("Helmet".into()),
3599            unlock_description: Some(i18n::I18nString::Translated("Test helmet unlock".into())),
3600            code: "test_helmet".to_string(),
3601            skin_type: SkinType::Helmet,
3602            icon_url: "/skins/helmet_test.webp".to_string(),
3603            icon_path: "/skins/helmet_test.webp".to_string(),
3604            spine_path: "".to_string(),
3605            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3606            price: Some(vec![CurrencyUnit {
3607                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3608                amount: 200,
3609            }]),
3610            color: Some("".into()),
3611        },
3612        ConfigSkin {
3613            id: uuid!("a1b2c3d4-e5f6-7890-abcd-ef1234567892"),
3614            name: i18n::I18nString::Translated("Alt armor".into()),
3615            unlock_description: Some(i18n::I18nString::Translated("Alt armor unlock".into())),
3616            code: "test_armor_alt".to_string(),
3617            skin_type: SkinType::Armor,
3618            icon_url: "/skins/armor_alt.webp".to_string(),
3619            icon_path: "/skins/armor_alt.webp".to_string(),
3620            spine_path: "".to_string(),
3621            rarity_id: uuid!("8c8acba2-67d3-40e0-ac62-2f7acce64ccc"),
3622            price: None,
3623            color: Some("".into()),
3624        },
3625    ]
3626}
3627
3628fn generate_skins_settings() -> SkinsSettings {
3629    SkinsSettings {
3630        default_unlocked_skins: vec![uuid!("59a4dd34-b395-436f-8f81-2fb36ee1b714")],
3631        default_equipped_skins: vec![uuid!("a1b2c3d4-e5f6-7890-abcd-ef1234567890")],
3632    }
3633}
3634
3635fn generate_offers_templates() -> Vec<OfferTemplate> {
3636    vec![
3637        OfferTemplate {
3638            id: uuid!("0fab3fca-d35c-4fbd-8f95-4033e548be6f"),
3639            alias: "First Daily".to_string(),
3640            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3641            icon_path: String::new(),
3642            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3643            payment_type: PaymentType::InGameCurrency(vec![CurrencyUnit {
3644                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3645                amount: 50,
3646            }]),
3647            limit_of_buys: Some(3),
3648            buys_reset_seconds: None,
3649            limit_buy_text: None,
3650            events_subscribe: vec![],
3651            trigger_script: "true".to_string(),
3652            shop_tab: ShopTab::DailyDeals,
3653            enabled: true,
3654            flag_new: false,
3655            flag_sale: None,
3656            value: None,
3657            priority: 0,
3658        },
3659        OfferTemplate {
3660            id: uuid!("4af19145-037d-4d9b-b9a5-98e7d8c7b127"),
3661            alias: "Second Daily".to_string(),
3662            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3663            icon_path: String::new(),
3664            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3665            payment_type: PaymentType::InGameCurrency(vec![CurrencyUnit {
3666                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3667                amount: 50,
3668            }]),
3669            limit_of_buys: Some(1),
3670            buys_reset_seconds: None,
3671            limit_buy_text: None,
3672            events_subscribe: vec![],
3673            trigger_script: "true".to_string(),
3674            shop_tab: ShopTab::DailyDeals,
3675            enabled: true,
3676            flag_new: false,
3677            flag_sale: None,
3678            value: None,
3679            priority: 0,
3680        },
3681        OfferTemplate {
3682            id: uuid!("6fea60b3-db1c-4a20-a03c-94716a32afbc"),
3683            alias: "First triggered".to_string(),
3684            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3685            icon_path: String::new(),
3686            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3687            payment_type: PaymentType::InGameCurrency(vec![CurrencyUnit {
3688                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3689                amount: 50,
3690            }]),
3691            limit_of_buys: Some(2),
3692            buys_reset_seconds: Some(86400),
3693            limit_buy_text: None,
3694            events_subscribe: vec!["EnableAutoSell".to_string()],
3695            trigger_script: "true".to_string(),
3696            shop_tab: ShopTab::Resources,
3697            enabled: true,
3698            flag_new: false,
3699            flag_sale: None,
3700            value: None,
3701            priority: 0,
3702        },
3703        OfferTemplate {
3704            id: uuid!("11111111-1111-1111-1111-111111111111"),
3705            alias: "Disabled offer".to_string(),
3706            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3707            icon_path: String::new(),
3708            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3709            payment_type: PaymentType::InGameCurrency(vec![CurrencyUnit {
3710                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3711                amount: 50,
3712            }]),
3713            limit_of_buys: Some(1),
3714            buys_reset_seconds: Some(86400),
3715            limit_buy_text: None,
3716            events_subscribe: vec![],
3717            trigger_script: "true".to_string(),
3718            shop_tab: ShopTab::DailyDeals,
3719            enabled: false,
3720            flag_new: false,
3721            flag_sale: None,
3722            value: None,
3723            priority: 0,
3724        },
3725        OfferTemplate {
3726            id: uuid!("22222222-2222-2222-2222-222222222222"),
3727            alias: "Free offer".to_string(),
3728            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3729            icon_path: String::new(),
3730            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3731            payment_type: PaymentType::Free,
3732            limit_of_buys: Some(1),
3733            buys_reset_seconds: Some(86400),
3734            limit_buy_text: None,
3735            events_subscribe: vec!["EnableAutoChest".to_string()],
3736            trigger_script: "true".to_string(),
3737            shop_tab: ShopTab::DailyDeals,
3738            enabled: true,
3739            flag_new: false,
3740            flag_sale: None,
3741            value: None,
3742            priority: 0,
3743        },
3744        OfferTemplate {
3745            id: uuid!("33333333-3333-3333-3333-333333333333"),
3746            alias: "Ad offer".to_string(),
3747            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3748            icon_path: String::new(),
3749            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3750            payment_type: PaymentType::Ad,
3751            limit_of_buys: Some(1),
3752            buys_reset_seconds: Some(86400),
3753            limit_buy_text: None,
3754            events_subscribe: vec!["DisableAutoChest".to_string()],
3755            trigger_script: "true".to_string(),
3756            shop_tab: ShopTab::Diamonds,
3757            enabled: true,
3758            flag_new: false,
3759            flag_sale: None,
3760            value: None,
3761            priority: 0,
3762        },
3763        OfferTemplate {
3764            id: uuid!("0b5cfa47-43bf-46db-930d-1d4a975f17d9"),
3765            alias: "Cash offer".to_string(),
3766            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3767            icon_path: String::new(),
3768            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3769            payment_type: PaymentType::RealMoney,
3770            limit_of_buys: Some(1),
3771            buys_reset_seconds: Some(86400),
3772            limit_buy_text: None,
3773            events_subscribe: vec!["DisableCaseUpgradePopUp".to_string()],
3774            trigger_script: "true".to_string(),
3775            shop_tab: ShopTab::Diamonds,
3776            enabled: true,
3777            flag_new: false,
3778            flag_sale: None,
3779            value: None,
3780            priority: 0,
3781        },
3782        // Triggered by DisableAutoSell
3783        OfferTemplate {
3784            id: uuid!("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"),
3785            alias: "Chain start offer".to_string(),
3786            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3787            icon_path: String::new(),
3788            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3789            payment_type: PaymentType::InGameCurrency(vec![CurrencyUnit {
3790                currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3791                amount: 50,
3792            }]),
3793            limit_of_buys: Some(1),
3794            buys_reset_seconds: Some(86400),
3795            limit_buy_text: None,
3796            events_subscribe: vec!["DisableAutoSell".to_string()],
3797            trigger_script: "true".to_string(),
3798            shop_tab: ShopTab::Resources,
3799            enabled: true,
3800            flag_new: false,
3801            flag_sale: None,
3802            value: None,
3803            priority: 0,
3804        },
3805        // Unlimited offer: no buy limit, added manually via NewOffer in tests.
3806        // Has a fake events_subscribe entry so it is not auto-created at character init.
3807        OfferTemplate {
3808            id: uuid!("dddddddd-dddd-dddd-dddd-dddddddddddd"),
3809            alias: "Unlimited offer".to_string(),
3810            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3811            icon_path: String::new(),
3812            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3813            payment_type: PaymentType::Free,
3814            limit_of_buys: None,
3815            buys_reset_seconds: None,
3816            limit_buy_text: None,
3817            events_subscribe: vec!["_never".to_string()],
3818            trigger_script: "false".to_string(),
3819            shop_tab: ShopTab::DailyDeals,
3820            enabled: true,
3821            flag_new: false,
3822            flag_sale: None,
3823            value: None,
3824            priority: 0,
3825        },
3826        // Short-reset daily offer: auto-created, resets every 60 seconds (for reset tests)
3827        OfferTemplate {
3828            id: uuid!("eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee"),
3829            alias: "Short reset daily".to_string(),
3830            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3831            icon_path: String::new(),
3832            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3833            payment_type: PaymentType::Free,
3834            limit_of_buys: Some(1),
3835            buys_reset_seconds: Some(60),
3836            limit_buy_text: None,
3837            events_subscribe: vec![],
3838            trigger_script: "true".to_string(),
3839            shop_tab: ShopTab::DailyDeals,
3840            enabled: true,
3841            flag_new: false,
3842            flag_sale: None,
3843            value: None,
3844            priority: 0,
3845        },
3846        // Disabled triggered offer: subscribes to DisableAutoSell but must never be activated
3847        OfferTemplate {
3848            id: uuid!("cccccccc-cccc-cccc-cccc-cccccccccccc"),
3849            alias: "Disabled triggered offer".to_string(),
3850            title: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3851            icon_path: String::new(),
3852            reward_bundle_id: uuid!("8838388b-6f13-4dc8-b0d4-561d8fe84da8"),
3853            payment_type: PaymentType::Free,
3854            limit_of_buys: Some(1),
3855            buys_reset_seconds: Some(86400),
3856            limit_buy_text: None,
3857            events_subscribe: vec!["DisableAutoSell".to_string()],
3858            trigger_script: "true".to_string(),
3859            shop_tab: ShopTab::DailyDeals,
3860            enabled: false,
3861            flag_new: false,
3862            flag_sale: None,
3863            value: None,
3864            priority: 0,
3865        },
3866    ]
3867}
3868
3869fn generate_shop_tabs() -> Vec<ShopTabConfig> {
3870    vec![
3871        ShopTabConfig {
3872            tab: ShopTab::DailyDeals,
3873            name: i18n::I18nString::Translated("Daily Deals".to_string()),
3874        },
3875        ShopTabConfig {
3876            tab: ShopTab::Diamonds,
3877            name: i18n::I18nString::Translated("Diamonds".to_string()),
3878        },
3879        ShopTabConfig {
3880            tab: ShopTab::Resources,
3881            name: i18n::I18nString::Translated("Resources".to_string()),
3882        },
3883    ]
3884}
3885
3886fn generate_ratings_settings() -> Vec<RatingSettings> {
3887    vec![
3888        RatingSettings {
3889            id: uuid!("2a743358-aace-4404-8582-aae2c67bcb7b"),
3890            rating_type: RatingType::Arena,
3891            rating_range_rewards: vec![
3892                RatingRangeReward {
3893                    mail_template_id: Some(uuid!("98eea253-ac84-49ea-becb-4d5ef9c18b5c")),
3894                    diapason_start: 1,
3895                    diapason_end: Some(2),
3896                },
3897                RatingRangeReward {
3898                    mail_template_id: Some(uuid!("0042b76d-bfbe-4e02-a6a6-4881e229da88")),
3899                    diapason_start: 3,
3900                    diapason_end: Some(3),
3901                },
3902            ],
3903        },
3904        RatingSettings {
3905            id: uuid!("a4b3388c-6d77-437d-aa41-91c4850ab01a"),
3906            rating_type: RatingType::Power,
3907            rating_range_rewards: vec![],
3908        },
3909        RatingSettings {
3910            id: uuid!("998fa5ac-9bd6-4b19-a13a-2e8c7ad6fcbd"),
3911            rating_type: RatingType::PvE,
3912            rating_range_rewards: vec![],
3913        },
3914    ]
3915}
3916
3917fn generate_gatings() -> Gatings {
3918    Gatings {
3919        afk_rewards_button_unlock_chapter: 2,
3920        sidebar_navigation: SideBarNavigation {
3921            quests_button_unlock_chapter: 2,
3922            arena_button_unlock_chapter: 2,
3923            ratings_button_unlock_chapter: 2,
3924            mail_button_unlock_chapter: 2,
3925        },
3926        party_unlock_chapter: 2,
3927        navbar_navigation: NavBarNavigation {
3928            castle: CastleGating {
3929                statue_unlock_chapter: 2,
3930                ..Default::default()
3931            },
3932            ..Default::default()
3933        },
3934        ..Default::default()
3935    }
3936}
3937
3938pub fn generate_test_talents() -> Vec<TalentTemplate> {
3939    vec![
3940        TalentTemplate {
3941            id: uuid!("a1000000-0000-0000-0000-000000000001"),
3942            name: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3943            description: i18n::I18nString::new(
3944                "content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name",
3945            ),
3946            description_values_script: None,
3947            icon_url: String::new(),
3948            icon_path: String::new(),
3949            levels: vec![
3950                TalentLevel {
3951                    level: 1,
3952                    cost: CurrencyUnit {
3953                        currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3954                        amount: 100,
3955                    },
3956                    duration_sec: 10,
3957                    attribute_bonuses: vec![TalentAttributeBonus {
3958                        attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
3959                        value: 50,
3960                    }],
3961                    backend_modifiers: vec![],
3962                },
3963                TalentLevel {
3964                    level: 2,
3965                    cost: CurrencyUnit {
3966                        currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3967                        amount: 200,
3968                    },
3969                    duration_sec: 20,
3970                    attribute_bonuses: vec![TalentAttributeBonus {
3971                        attribute_id: uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08"),
3972                        value: 50,
3973                    }],
3974                    backend_modifiers: vec![],
3975                },
3976            ],
3977            unlock_condition: TalentUnlockCondition {
3978                required_talents: vec![],
3979                required_points: 0,
3980            },
3981            position: TalentPosition { col: 0, row: 0 },
3982        },
3983        TalentTemplate {
3984            id: uuid!("a1000000-0000-0000-0000-000000000002"),
3985            name: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
3986            description: i18n::I18nString::new(
3987                "content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name",
3988            ),
3989            description_values_script: None,
3990            icon_url: String::new(),
3991            icon_path: String::new(),
3992            levels: vec![
3993                TalentLevel {
3994                    level: 1,
3995                    cost: CurrencyUnit {
3996                        currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
3997                        amount: 150,
3998                    },
3999                    duration_sec: 30,
4000                    attribute_bonuses: vec![],
4001                    backend_modifiers: vec![TalentBackendModifier::TalentResearchSpeedPercent(
4002                        20.0,
4003                    )],
4004                },
4005                TalentLevel {
4006                    level: 2,
4007                    cost: CurrencyUnit {
4008                        currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
4009                        amount: 300,
4010                    },
4011                    duration_sec: 60,
4012                    attribute_bonuses: vec![],
4013                    backend_modifiers: vec![TalentBackendModifier::TalentResearchSpeedPercent(
4014                        20.0,
4015                    )],
4016                },
4017            ],
4018            unlock_condition: TalentUnlockCondition {
4019                required_talents: vec![uuid!("a1000000-0000-0000-0000-000000000001")],
4020                required_points: 0,
4021            },
4022            position: TalentPosition { col: 1, row: 0 },
4023        },
4024        // Long-duration talent for partial-skip tests (duration > skip_currency_skips_sec=900).
4025        TalentTemplate {
4026            id: uuid!("a1000000-0000-0000-0000-000000000003"),
4027            name: i18n::I18nString::new("content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name"),
4028            description: i18n::I18nString::new(
4029                "content.skins.a1b2c3d4-e5f6-7890-abcd-ef1234567890:name",
4030            ),
4031            description_values_script: None,
4032            icon_url: String::new(),
4033            icon_path: String::new(),
4034            levels: vec![TalentLevel {
4035                level: 1,
4036                cost: CurrencyUnit {
4037                    currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
4038                    amount: 100,
4039                },
4040                duration_sec: 2000,
4041                attribute_bonuses: vec![],
4042                backend_modifiers: vec![],
4043            }],
4044            unlock_condition: TalentUnlockCondition {
4045                required_talents: vec![],
4046                required_points: 0,
4047            },
4048            position: TalentPosition { col: 2, row: 0 },
4049        },
4050    ]
4051}
4052
4053fn generate_statue_bonus_grades() -> NonEmptyVec<StatueBonusGrade> {
4054    NonEmptyVec::new(vec![
4055        StatueBonusGrade {
4056            id: uuid!("a1000000-0000-0000-0000-000000000001"),
4057            name: i18n::I18nString::Translated("F".to_string()),
4058            color: "#808080".to_string(),
4059            order: 0,
4060        },
4061        StatueBonusGrade {
4062            id: uuid!("a1000000-0000-0000-0000-000000000002"),
4063            name: i18n::I18nString::Translated("D".to_string()),
4064            color: "#00aa00".to_string(),
4065            order: 1,
4066        },
4067        StatueBonusGrade {
4068            id: uuid!("a1000000-0000-0000-0000-000000000003"),
4069            name: i18n::I18nString::Translated("C".to_string()),
4070            color: "#0000ff".to_string(),
4071            order: 2,
4072        },
4073        StatueBonusGrade {
4074            id: uuid!("a1000000-0000-0000-0000-000000000009"),
4075            name: i18n::I18nString::Translated("SSS+".to_string()),
4076            color: "#ff0000".to_string(),
4077            order: 8,
4078        },
4079    ])
4080}
4081
4082fn generate_statue_settings() -> StatueSettings {
4083    StatueSettings {
4084        // statue currency
4085        currency_id: uuid!("b59b33a2-4d19-4e2c-9cea-e03ea15882a0"),
4086        roll_costs: NonEmptyVec::new(vec![
4087            StatueRollCostConfig {
4088                locked_count: 0,
4089                cost: PositiveI64::new(100),
4090            },
4091            StatueRollCostConfig {
4092                locked_count: 1,
4093                cost: PositiveI64::new(300),
4094            },
4095            StatueRollCostConfig {
4096                locked_count: 2,
4097                cost: PositiveI64::new(500),
4098            },
4099            StatueRollCostConfig {
4100                locked_count: 3,
4101                cost: PositiveI64::new(700),
4102            },
4103            StatueRollCostConfig {
4104                locked_count: 4,
4105                cost: PositiveI64::new(900),
4106            },
4107            StatueRollCostConfig {
4108                locked_count: 5,
4109                cost: PositiveI64::new(1200),
4110            },
4111        ]),
4112    }
4113}
4114
4115fn generate_statue_bonus_type_configs() -> NonEmptyVec<StatueBonusTypeConfig> {
4116    let grade_f = uuid!("a1000000-0000-0000-0000-000000000001");
4117    let grade_d = uuid!("a1000000-0000-0000-0000-000000000002");
4118    let grade_c = uuid!("a1000000-0000-0000-0000-000000000003");
4119    let grade_sss_plus = uuid!("a1000000-0000-0000-0000-000000000009");
4120    let attr_hp = uuid!("45eca0a7-7430-487b-bd65-b796c6d88c08");
4121    let attr_damage = uuid!("6ad485d7-9567-4b77-8ddc-a2418dd1dfe6");
4122
4123    NonEmptyVec::new(vec![
4124        StatueBonusTypeConfig {
4125            attribute_id: attr_hp,
4126            grade_values: NonEmptyVec::new(vec![
4127                StatueBonusGradeValue {
4128                    grade_id: grade_f,
4129                    value: PositiveI32::new(100),
4130                },
4131                StatueBonusGradeValue {
4132                    grade_id: grade_d,
4133                    value: PositiveI32::new(200),
4134                },
4135                StatueBonusGradeValue {
4136                    grade_id: grade_c,
4137                    value: PositiveI32::new(300),
4138                },
4139                StatueBonusGradeValue {
4140                    grade_id: grade_sss_plus,
4141                    value: PositiveI32::new(1200),
4142                },
4143            ]),
4144        },
4145        StatueBonusTypeConfig {
4146            attribute_id: attr_damage,
4147            grade_values: NonEmptyVec::new(vec![
4148                StatueBonusGradeValue {
4149                    grade_id: grade_f,
4150                    value: PositiveI32::new(100),
4151                },
4152                StatueBonusGradeValue {
4153                    grade_id: grade_d,
4154                    value: PositiveI32::new(200),
4155                },
4156                StatueBonusGradeValue {
4157                    grade_id: grade_c,
4158                    value: PositiveI32::new(300),
4159                },
4160                StatueBonusGradeValue {
4161                    grade_id: grade_sss_plus,
4162                    value: PositiveI32::new(1200),
4163                },
4164            ]),
4165        },
4166    ])
4167}
4168
4169fn generate_statue_level_configs() -> NonEmptyVec<StatueLevelConfig> {
4170    let grade_f = uuid!("a1000000-0000-0000-0000-000000000001");
4171    let grade_d = uuid!("a1000000-0000-0000-0000-000000000002");
4172    let grade_c = uuid!("a1000000-0000-0000-0000-000000000003");
4173    let grade_sss_plus = uuid!("a1000000-0000-0000-0000-000000000009");
4174
4175    NonEmptyVec::new(vec![
4176        StatueLevelConfig {
4177            level: 1,
4178            required_experience: 0,
4179            slot_count: NonZeroU64::new(3),
4180            sets_count: NonZeroU64::new(1),
4181            grade_weights: NonEmptyVec::new(vec![
4182                StatueBonusGradeWeight {
4183                    grade_id: grade_f,
4184                    weight: PositiveF64::new(5.0),
4185                },
4186                StatueBonusGradeWeight {
4187                    grade_id: grade_d,
4188                    weight: PositiveF64::new(3.0),
4189                },
4190                StatueBonusGradeWeight {
4191                    grade_id: grade_c,
4192                    weight: PositiveF64::new(2.0),
4193                },
4194            ]),
4195        },
4196        StatueLevelConfig {
4197            level: 2,
4198            required_experience: 200,
4199            slot_count: NonZeroU64::new(4),
4200            sets_count: NonZeroU64::new(2),
4201            grade_weights: NonEmptyVec::new(vec![
4202                StatueBonusGradeWeight {
4203                    grade_id: grade_f,
4204                    weight: PositiveF64::new(4.0),
4205                },
4206                StatueBonusGradeWeight {
4207                    grade_id: grade_d,
4208                    weight: PositiveF64::new(3.0),
4209                },
4210                StatueBonusGradeWeight {
4211                    grade_id: grade_c,
4212                    weight: PositiveF64::new(2.0),
4213                },
4214                StatueBonusGradeWeight {
4215                    grade_id: grade_sss_plus,
4216                    weight: PositiveF64::new(1.0),
4217                },
4218            ]),
4219        },
4220    ])
4221}
4222
4223pub fn generate_game_config_for_tests() -> GameConfig {
4224    let mut game_config = GameConfig {
4225        script_modules: vec![],
4226        attributes: generate_attributes(),
4227        item_cases_settings: generate_item_cases_settings(),
4228        game_settings: generate_game_settings(),
4229        ads_settings: generate_ads_settings(),
4230        items: vec![],
4231        item_rarities: generate_item_rarities(),
4232        skins: generate_skins(),
4233        skins_settings: generate_skins_settings(),
4234        effects: generate_effects(),
4235        abilities: generate_abilities(),
4236        ability_cases_settings: generate_ability_cases_settings(),
4237        ability_rarities: generate_ability_rarities(),
4238        ability_levels: generate_ability_levels(),
4239        fight_settings: generate_fight_settings(),
4240        entities: generate_entities(),
4241        fight_templates: generate_fight_templates(),
4242        dungeon_templates: generate_dungeon_templates(),
4243        chapters: generate_chapters(),
4244        character_levels: generate_character_levels(),
4245        ability_slots_levels: generate_ability_slots_levels(),
4246        patron_levels: generate_patron_levels(),
4247        quests: generate_quests(),
4248        quests_progression_settings: generate_quests_progression_settings(),
4249        vassals_settings: generate_vassals_settings(),
4250        vassal_tasks: generate_vassal_tasks(),
4251        pvp_settings: generate_pvp_settings(),
4252        gifts: generate_gifts(),
4253        currencies: generate_currencies(),
4254        inventory_levels: generate_inventory_levels(),
4255        arena_settings: generate_arena_settings(),
4256        arena_leagues: generate_arena_leagues(),
4257        matchmaking_settings: generate_matchmaking_settings(),
4258        event_descriptions: generate_event_descriptions(),
4259        classes: generate_classes(),
4260        projectiles: generate_projectiles(),
4261        mail_templates: generate_mail_templates(),
4262        bundles: generate_bundles(),
4263        ability_presets_settings: generate_ability_presets_settings(),
4264        bots_settings: generate_bots_settings(),
4265        reports_settings: generate_reports_settings(),
4266        afk_rewards_settings: generate_afk_rewards_settings(),
4267        afk_rewards_levels: generate_afk_rewards_levels(),
4268        users_generating_settings: generate_users_generating_settings(),
4269        tutorial_steps: vec![],
4270        chats_settings: vec![],
4271        offers_templates: generate_offers_templates(),
4272        shop_tabs: generate_shop_tabs(),
4273        ratings_settings: generate_ratings_settings(),
4274        cheat_scripts: vec![],
4275        test_player_scripts: vec![],
4276        gatings: generate_gatings(),
4277        pet_rarities: generate_pet_rarities(),
4278        pet_templates: generate_pet_templates(),
4279        pet_levels: generate_pet_levels(),
4280        pet_slots_levels: generate_pet_slots_levels(),
4281        pet_cases_settings: generate_pet_cases_settings(),
4282        talent_tree_settings: TalentTreeSettings {
4283            time_skip_ticket_skips_sec: 1800,
4284            skip_currency_id: uuid!("6c050b07-5282-4a23-8bbf-dabecd27cade"),
4285            skip_currency_skips_sec: 900,
4286        },
4287        talents: generate_test_talents(),
4288        statue_bonus_grades: generate_statue_bonus_grades(),
4289        statue_bonus_type_configs: generate_statue_bonus_type_configs(),
4290        statue_level_configs: generate_statue_level_configs(),
4291        statue_settings: generate_statue_settings(),
4292        buff_templates: vec![BuffTemplate {
4293            id: uuid!("b2c3d4e5-f6a7-8901-bcde-f12345678901"),
4294            title: i18n::I18nString::Translated("Daily Booster x1.5".to_string()),
4295            description: i18n::I18nString::Translated(
4296                "Exp and currency gain multiplied by 1.5 until end of day".to_string(),
4297            ),
4298            icon_path: String::new(),
4299            effect: BuffEffect::CurrencyExpBoost {
4300                multiplier: 1.5,
4301                currency_id: uuid!("00000000-0000-0000-0000-000000000000"),
4302            },
4303        }],
4304        bird_variants: vec![
4305            BirdVariant {
4306                id: uuid!("d1e2f3a4-b5c6-7890-abcd-ef1234567891"),
4307                spine_path: "/bird_variant_1".to_string(),
4308                bundle_id: uuid!("53e8ffaa-7ee4-4612-bbfc-bb157979ca8d"),
4309            },
4310            BirdVariant {
4311                id: uuid!("d1e2f3a4-b5c6-7890-abcd-ef1234567892"),
4312                spine_path: "/bird_variant_2".to_string(),
4313                bundle_id: uuid!("e18fc101-6615-440c-9a1d-42f509986ccc"),
4314            },
4315        ],
4316    };
4317
4318    game_config.items = generate_items(&game_config.item_rarities);
4319
4320    game_config
4321}