Skip to main content

wowlab_engine_application/game_data/
expected_stats.rs

1//! Player expected-stat lookup and target armor projection.
2
3use wowlab_engine_gamedata::ResolvedGameDataBuilder;
4use wowlab_engine_ports::{DataResolver, DynDataResolver, EngineError};
5use wowlab_types::data::ExpectedStatFlat;
6
7use super::CharacterContext;
8
9// #t(fn: rust_builder_param) this mutates the resolved-data accumulator; it is not a factory.
10pub(super) async fn resolve_expected_stats(
11    builder: &mut ResolvedGameDataBuilder,
12    resolver: &DynDataResolver<'_>,
13    character: &CharacterContext,
14    passives: &[wowlab_engine_domain::dbc::RankedPassive],
15) -> Result<(), EngineError> {
16    let expansion_id = i32::try_from(character.player_expansion_id).map_err(|error| {
17        EngineError::spec_construction(format!(
18            "player expansion id does not fit expected-stat resolver key: {error}"
19        ))
20    })?;
21    let stats = resolver
22        .get_expected_stats(expansion_id, i32::from(character.player_level))
23        .await
24        .map_err(|error| {
25            EngineError::spec_construction(format!("failed to resolve expected stats: {error}"))
26        })?;
27
28    apply_expected_stat_row(builder, &stats, passives);
29
30    Ok(())
31}
32
33// #t(fn: rust_builder_param) this mutates the resolved-data accumulator; it is not a factory.
34fn apply_expected_stat_row(
35    builder: &mut ResolvedGameDataBuilder,
36    stats: &ExpectedStatFlat,
37    passives: &[wowlab_engine_domain::dbc::RankedPassive],
38) {
39    apply_expected_stats(
40        builder,
41        f64::from(stats.creature_armor),
42        f64::from(stats.armor_constant),
43        passives,
44    );
45}
46
47// #t(fn: rust_builder_param) this mutates the resolved-data accumulator; it is not a factory.
48pub(super) fn apply_expected_stats(
49    builder: &mut ResolvedGameDataBuilder,
50    creature_armor: f64,
51    armor_constant: f64,
52    passives: &[wowlab_engine_domain::dbc::RankedPassive],
53) {
54    builder.set_armor_constant(armor_constant);
55    builder.set_creature_armor(creature_armor);
56    builder.set_target_armor_mult(wowlab_engine_domain::dbc::passive_target_armor_mult(
57        passives,
58    ));
59}