wowlab_engine_application/game_data/
expected_stats.rs1use wowlab_engine_gamedata::ResolvedGameDataBuilder;
4use wowlab_engine_ports::{DataResolver, DynDataResolver, EngineError};
5use wowlab_types::data::ExpectedStatFlat;
6
7use super::CharacterContext;
8
9pub(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
33fn 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
47pub(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}