1use proc_macro2::TokenStream;
4use quote::quote;
5use wowlab_manifest_schema::{AoeDef, ManifestSpellDef};
6
7use crate::rust_source::{lit_f64, lit_int};
8
9pub(crate) fn apply_aoe(mut expression: TokenStream, def: &ManifestSpellDef) -> TokenStream {
10 expression = quote!(#expression.apply_aoe_from_data(data));
11
12 if let Some(aoe) = &def.aoe {
13 expression = emit_aoe_overrides(expression, aoe);
14 }
15
16 expression
17}
18
19fn emit_aoe_overrides(mut expression: TokenStream, aoe: &AoeDef) -> TokenStream {
20 if let Some(targets) = aoe.max_targets {
21 let targets = lit_int(targets);
22
23 expression = quote!(#expression.max_targets(#targets));
24 }
25
26 if let Some(targets) = aoe.reduced_aoe_targets {
27 let targets = lit_int(targets);
28
29 expression = quote!(#expression.reduced_aoe_targets(#targets));
30 }
31
32 if let Some(targets) = aoe.full_amount_targets {
33 let targets = lit_int(targets);
34
35 expression = quote!(#expression.full_amount_targets(#targets));
36 }
37
38 if let Some(multiplier) = aoe.base_aoe_multiplier {
39 let multiplier = lit_f64(multiplier);
40
41 expression = quote!(#expression.base_aoe_multiplier(#multiplier));
42 }
43
44 if let Some(multiplier) = aoe.chain_multiplier {
45 let multiplier = lit_f64(multiplier);
46
47 expression = quote! {
48 #expression
49 .chain_multiplier(#multiplier)
50 .chain_targeting(true)
51 };
52 }
53
54 if aoe.split.unwrap_or(false) {
55 expression = quote!(#expression.split_damage());
56 }
57
58 expression
59}