Skip to main content

codegen/
gen_aoe.rs

1//! Emission of `AoE` builder calls from manifest `AoE` definitions.
2
3use 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}