Skip to main content

wowlab_engine_content/
composition.rs

1//! Canonical composition of generated combat systems with shared and specialization content.
2
3use wowlab_engine_combat::{BuiltCombatSystem, CombatHandler};
4use wowlab_engine_ports::{EngineError, HandlerParams};
5
6use crate::{
7    racials::racial_spec,
8    raid_buffs::{
9        PrecombatBuffSpec, augment_rune_spec, bloodlust_spec, flask_spec, register_external_buffs,
10        register_precombat_buffs, tempered_potion_spec,
11    },
12    weapon_enchants::register_weapon_enchant_procs,
13};
14
15#[derive(Debug)]
16pub(crate) struct ContentHandlerParts {
17    built: BuiltCombatSystem,
18}
19
20impl ContentHandlerParts {
21    pub(crate) fn into_built(self) -> BuiltCombatSystem {
22        self.built
23    }
24
25    pub(crate) fn into_handler(self) -> CombatHandler {
26        CombatHandler::from_built(self.built)
27    }
28}
29
30pub(crate) fn compose_handler<T>(
31    build_system: for<'a> fn(&HandlerParams<'a>) -> Result<BuiltCombatSystem, EngineError>,
32    params: &HandlerParams<'_>,
33    finish: impl FnOnce(ContentHandlerParts, &HandlerParams<'_>) -> Result<T, EngineError>,
34) -> Result<T, EngineError> {
35    let mut system = build_system(params)?;
36
37    register_shared_content(&mut system, params)?;
38
39    finish(ContentHandlerParts { built: system }, params)
40}
41
42fn register_shared_content(
43    built: &mut BuiltCombatSystem,
44    params: &HandlerParams<'_>,
45) -> Result<(), EngineError> {
46    built.state.config.bugs = wowlab_engine_ports::resolve_bug_toggles(&params.bugs)?;
47    built.state.config.cast_latency = params.cast_latency;
48    built.state.config.raid_events = params.raid_events.to_vec();
49    built.state.config.external_buffs = params.external_buffs.to_vec();
50
51    let mut precombat = Vec::<PrecombatBuffSpec>::new();
52
53    if params.bloodlust {
54        precombat.push(bloodlust_spec());
55    }
56
57    if params.pre_pot_tempered {
58        precombat.push(tempered_potion_spec());
59    }
60
61    if params.flask {
62        precombat.push(flask_spec());
63    }
64
65    if params.augment_rune {
66        precombat.push(augment_rune_spec());
67    }
68
69    if let Some(racial) = racial_spec(params.race) {
70        precombat.push(racial);
71    }
72
73    register_precombat_buffs(built, &params.game_data, &precombat)?;
74    register_external_buffs(built, &params.game_data, params.external_buffs)?;
75    register_weapon_enchant_procs(built, params.weapon_enchant_procs)?;
76
77    crate::expansion_traits::register(built, params)
78}
79
80#[cfg(test)]
81mod tests;