overlord_event_system/
quests.rs1use 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}