overlord_event_system/async_handler/
talents.rs1use crate::{
2 async_handler::handler::OverlordAsyncEventHandler, event::OverlordEvent,
3 game_config_helpers::GameConfigLookup, state::OverlordState,
4};
5
6use event_system::system::EventHandleResult;
7
8impl OverlordAsyncEventHandler {
9 pub fn handle_claim_talent_research(
11 &self,
12 mut state: OverlordState,
13 ) -> EventHandleResult<OverlordEvent, OverlordState> {
14 let game_config = self.game_config.get();
15
16 let Some(talent_id) = state.character_state.character.talent_upgrading_id else {
17 tracing::error!("ClaimTalentResearch: no talent upgrade in progress");
18 return EventHandleResult::fail(state);
19 };
20
21 let Some(talent_template) = game_config.talent(talent_id) else {
22 tracing::error!("ClaimTalentResearch: talent not found id={talent_id}");
23 return EventHandleResult::fail(state);
24 };
25
26 let current_level = state
27 .character_state
28 .talent_levels
29 .get(&talent_id)
30 .copied()
31 .unwrap_or(0);
32 let new_level = current_level + 1;
33
34 if talent_template.levels.iter().all(|l| l.level != new_level) {
35 tracing::error!(
36 "ClaimTalentResearch: no level config for talent={talent_id} level={new_level}"
37 );
38 return EventHandleResult::fail(state);
39 }
40
41 state
43 .character_state
44 .talent_levels
45 .insert(talent_id, new_level);
46
47 state.character_state.character.talent_upgrading_id = None;
49 state.character_state.character.talent_upgrade_finish_at = None;
50
51 EventHandleResult::ok(state)
52 }
53}