overlord_event_system/async_handler/
auto_chest.rs

1use crate::{
2    async_handler::handler::OverlordAsyncEventHandler, event::OverlordEvent,
3    game_config_helpers::GameConfigLookup, state::OverlordState,
4};
5
6use essences::autochest::{AutoChestFilter, AutoChestFilterId};
7use event_system::{event::EventPluginized, system::EventHandleResult};
8
9impl OverlordAsyncEventHandler {
10    pub fn handle_enable_auto_chest(
11        &self,
12        mut state: OverlordState,
13    ) -> EventHandleResult<OverlordEvent, OverlordState> {
14        let game_config = self.game_config.get();
15
16        let events = if !state.character_state.character.auto_chest_enabled {
17            state.character_state.character.auto_chest_enabled = true;
18
19            vec![EventPluginized::delayed(
20                OverlordEvent::AutoChestOpenItemCase {
21                    batch_size: state.auto_chest.batch_size,
22                },
23                game_config.game_settings.auto_chest_pause_duration_ticks,
24            )]
25        } else {
26            vec![]
27        };
28
29        EventHandleResult::ok_events(state, events)
30    }
31
32    pub fn handle_disable_auto_chest(
33        &self,
34        mut state: OverlordState,
35    ) -> EventHandleResult<OverlordEvent, OverlordState> {
36        state.character_state.character.auto_chest_enabled = false;
37
38        EventHandleResult::ok(state)
39    }
40
41    pub fn handle_enable_auto_chest_filter(
42        &self,
43        filter_id: AutoChestFilterId,
44        mut state: OverlordState,
45    ) -> EventHandleResult<OverlordEvent, OverlordState> {
46        let Some(filter) = state.auto_chest.filters.iter().find(|f| f.id == filter_id) else {
47            tracing::error!(
48                "Tried enabling auto_chest filter with id = {}, but didnt find it in state",
49                filter_id
50            );
51            return EventHandleResult::fail(state);
52        };
53
54        state.character_state.character.last_filter_used_id = Some(filter.id);
55
56        state.auto_chest.active_filter = Some(filter.clone());
57
58        EventHandleResult::ok(state)
59    }
60
61    pub fn handle_disable_auto_chest_filter(
62        &self,
63        mut state: OverlordState,
64    ) -> EventHandleResult<OverlordEvent, OverlordState> {
65        state.auto_chest.active_filter = None;
66
67        EventHandleResult::ok(state)
68    }
69
70    pub fn handle_enable_auto_chest_power_compare(
71        &self,
72        mut state: OverlordState,
73    ) -> EventHandleResult<OverlordEvent, OverlordState> {
74        state.auto_chest.power_compare_enabled = true;
75
76        EventHandleResult::ok(state)
77    }
78
79    pub fn handle_disable_auto_chest_power_compare(
80        &self,
81        mut state: OverlordState,
82    ) -> EventHandleResult<OverlordEvent, OverlordState> {
83        state.auto_chest.power_compare_enabled = false;
84
85        EventHandleResult::ok(state)
86    }
87
88    pub fn handle_update_auto_chest_batch_size(
89        &self,
90        batch_size: i64,
91        mut state: OverlordState,
92    ) -> EventHandleResult<OverlordEvent, OverlordState> {
93        let game_config = self.game_config.get();
94        let Some(item_case_settings) = game_config
95            .item_case_settings_by_level(state.character_state.character.item_case_level)
96        else {
97            tracing::error!(
98                "No item case settings for level = {}",
99                state.character_state.character.item_case_level
100            );
101            return EventHandleResult::fail(state);
102        };
103
104        if batch_size > item_case_settings.auto_chest_settings.max_batch_size {
105            tracing::error!(
106                "Batch size = {}, is bigger than max = {}",
107                batch_size,
108                item_case_settings.auto_chest_settings.max_batch_size,
109            );
110            return EventHandleResult::fail(state);
111        }
112        state.auto_chest.batch_size = batch_size;
113
114        EventHandleResult::ok(state)
115    }
116
117    pub fn handle_new_auto_chest_filter(
118        &self,
119        filter: AutoChestFilter,
120        mut state: OverlordState,
121    ) -> EventHandleResult<OverlordEvent, OverlordState> {
122        let game_config = self.game_config.get();
123
124        if state.auto_chest.filters.iter().any(|f| f.id == filter.id) {
125            tracing::error!(
126                "Auto_chest filter with id = {}, already in state",
127                filter.id
128            );
129            return EventHandleResult::fail(state);
130        }
131
132        if let Err(e) = filter.validate(
133            state.character_state.character.current_chapter_level,
134            &game_config.attributes,
135            &game_config.gatings.autochest,
136        ) {
137            tracing::error!("Filter {:?},\n Didn't pass validation: {:?}", filter, e);
138            return EventHandleResult::fail(state);
139        }
140
141        state.auto_chest.filters.push(filter);
142
143        EventHandleResult::ok(state)
144    }
145
146    pub fn handle_update_auto_chest_filter(
147        &self,
148        updated_filter: AutoChestFilter,
149        mut state: OverlordState,
150    ) -> EventHandleResult<OverlordEvent, OverlordState> {
151        let game_config = self.game_config.get();
152
153        let Some(old_filter) = state
154            .auto_chest
155            .filters
156            .iter_mut()
157            .find(|f| f.id == updated_filter.id)
158        else {
159            tracing::error!(
160                "Tried updating auto_chest filter with id = {}, but didn't find it in state",
161                updated_filter.id
162            );
163            return EventHandleResult::fail(state);
164        };
165
166        if let Err(e) = updated_filter.validate(
167            state.character_state.character.current_chapter_level,
168            &game_config.attributes,
169            &game_config.gatings.autochest,
170        ) {
171            tracing::error!(
172                "Filter {:?}, didn't pass validation = {:?}",
173                updated_filter,
174                e
175            );
176            return EventHandleResult::fail(state);
177        }
178
179        *old_filter = updated_filter.clone();
180
181        EventHandleResult::ok(state)
182    }
183
184    pub fn handle_remove_auto_chest_filter(
185        &self,
186        filter_id: AutoChestFilterId,
187        mut state: OverlordState,
188    ) -> EventHandleResult<OverlordEvent, OverlordState> {
189        let Some(filter_position) = state
190            .auto_chest
191            .filters
192            .iter()
193            .position(|filter| filter.id == filter_id)
194        else {
195            tracing::error!(
196                "Tried removing filter with id = {}, but didn't find it in state",
197                filter_id
198            );
199            return EventHandleResult::fail(state);
200        };
201
202        if state.character_state.character.last_filter_used_id == Some(filter_id) {
203            state.character_state.character.last_filter_used_id = None;
204        }
205
206        state.auto_chest.filters.remove(filter_position);
207
208        EventHandleResult::ok(state)
209    }
210}