overlord_event_system/
quests.rs

1use configs::game_config::GameConfig;
2use essences::{
3    bundles::{BundleElement, BundleId},
4    character_state,
5    currency::{CurrencyUnit, from_es_currencies},
6    quest::{QuestInstance, QuestTemplate},
7};
8
9use crate::{
10    ScriptRunner, bundles::bundle_raw_step_to_element, event::OverlordEvent,
11    game_config_helpers::GameConfigLookup, state::OverlordState,
12};
13
14pub fn get_reward_from_currencies(
15    reward_script: &str,
16    character_state: &character_state::CharacterState,
17    script_runner: &ScriptRunner<OverlordEvent, OverlordState>,
18) -> Vec<CurrencyUnit> {
19    from_es_currencies(&script_runner.run_currencies_calculate(
20        |mut scope_setter| {
21            scope_setter.set_const("CharacterState", character_state.clone());
22            scope_setter
23        },
24        reward_script,
25    ))
26}
27
28pub fn get_reward_from_bundle(
29    bundle_id: Option<BundleId>,
30    character_state: &character_state::CharacterState,
31    script_runner: &ScriptRunner<OverlordEvent, OverlordState>,
32    game_config: &GameConfig,
33) -> Vec<BundleElement> {
34    let mut elements = vec![];
35
36    let Some(bundle_id) = bundle_id else {
37        return vec![];
38    };
39
40    let Some(bundle) = game_config.bundle(bundle_id) else {
41        tracing::error!(
42            "Couldn't find bundle with id = {}",
43            game_config.afk_rewards_settings.bundle_id
44        );
45        return vec![];
46    };
47
48    for step in &bundle.steps {
49        elements.push(bundle_raw_step_to_element(
50            step,
51            character_state,
52            script_runner,
53            game_config,
54        ));
55    }
56    elements
57}
58
59pub fn make_quest_instance(
60    quest: &QuestTemplate,
61    character_state: &character_state::CharacterState,
62    game_config: &GameConfig,
63    script_runner: &ScriptRunner<OverlordEvent, OverlordState>,
64) -> QuestInstance {
65    let reward =
66        get_reward_from_bundle(quest.bundle_id, character_state, script_runner, game_config);
67
68    QuestInstance {
69        id: quest.id,
70        current: 0,
71        reward,
72        is_claimed: false,
73    }
74}