overlord_event_system/async_handler/
talents.rs

1use 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    /// Apply completed talent: increment level and clear upgrade timer fields.
10    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        // Increment talent level.
42        state
43            .character_state
44            .talent_levels
45            .insert(talent_id, new_level);
46
47        // Clear upgrade timer fields.
48        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}