wowlab_engine_content/
composition.rs1use 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(¶ms.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, ¶ms.game_data, &precombat)?;
74 register_external_buffs(built, ¶ms.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;