overlord_event_system/
cases.rs

1use super::{ScriptRunner, event::OverlordEvent, state::OverlordState};
2use crate::game_config_helpers::GameConfigLookup;
3use configs::game_config;
4use essences::{currency::from_es_currencies, items};
5use event_system::script::runner::ScriptRandom;
6
7pub fn try_finalize_item(
8    item: &mut items::Item,
9    game_config: &game_config::GameConfig,
10    script_runner: &ScriptRunner<OverlordEvent, OverlordState>,
11) -> Result<(), String> {
12    let price = script_runner.run_currencies_calculate(
13        |mut scope_setter| {
14            scope_setter.set_const("Item", item.clone());
15            scope_setter.set_const("Random", ScriptRandom::from_entropy());
16            scope_setter
17        },
18        &game_config.game_settings.item_price_calculation_expression,
19    );
20
21    item.price = from_es_currencies(&price);
22
23    let Ok(experience) = script_runner.run_expression::<i64>(
24        |mut scope_setter| {
25            scope_setter.set_const("Item", item.clone());
26            scope_setter.set_const("Random", ScriptRandom::from_entropy());
27            scope_setter
28        },
29        &game_config
30            .game_settings
31            .item_experience_calculation_expression,
32    ) else {
33        return Err("Couldn't calculate items experience".to_string());
34    };
35
36    item.experience = experience;
37
38    let item_clone = item.clone();
39
40    for attribute in &mut item.attributes {
41        let calculation_script = game_config
42            .attribute(attribute.attr_id)
43            .map(|attr| &attr.calculation_script)
44            .unwrap_or_else(|| {
45                panic!(
46                    "Attribute with id = {} couldnt be found in config",
47                    attribute.attr_id
48                )
49            });
50        let Ok(attribute_value) = script_runner.run_expression::<i64>(
51            |mut scope_setter| {
52                scope_setter.set_const("AttributesQuantity", item_clone.attributes.len() as i64);
53                scope_setter.set_const("Item", item_clone.clone());
54                scope_setter.set_const("Random", ScriptRandom::from_entropy());
55                scope_setter
56            },
57            calculation_script,
58        ) else {
59            return Err(format!(
60                "Couldn't calculate attribute with id = {} value",
61                attribute.attr_id
62            ));
63        };
64
65        attribute.value = attribute_value as i32;
66    }
67
68    Ok(())
69}