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