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