#![deny(missing_docs)]
pub mod buff_types;
pub mod damage;
pub mod em;
pub mod enemy;
pub mod error;
pub mod level_table;
pub mod lunar;
pub mod moonsign;
pub mod reaction;
pub mod resonance;
pub mod stat_profile;
pub mod stats;
pub mod team;
pub mod transformative;
pub mod types;
pub use buff_types::BuffableStat;
pub use damage::{DamageInput, DamageResult, calculate_damage, collect_flat_dmg};
pub use em::{amplifying_em_bonus, catalyze_em_bonus, lunar_em_bonus, transformative_em_bonus};
pub use enemy::{
Enemy, EnemyDebuffs, apply_debuffs_to_enemy, apply_enemy_debuffs, superconduct_debuff,
};
pub use error::CalcError;
pub use level_table::reaction_base_value;
pub use lunar::{LunarInput, LunarResult, calculate_lunar};
pub use moonsign::{
LunarContribution, MoonsignBenediction, MoonsignContext, MoonsignLevel, MoonsignTalentEffect,
MoonsignTalentEnhancement, NonMoonsignLunarBuff, apply_moonsign_enhancements,
calculate_lunar_team, calculate_non_moonsign_bonus, determine_moonsign_level,
non_moonsign_scaling, resolve_moonsign_context, select_non_moonsign_buff,
};
pub use reaction::{Reaction, ReactionCategory, determine_reaction};
pub use resonance::{
ElementalResonance, determine_resonances, resonance_buffs, resonance_conditional_buffs,
};
pub use stat_profile::{StatProfile, combine_stats};
pub use stats::Stats;
pub use team::{
BuffTarget, DamageContext, ResolvedBuff, TeamMember, TeamResolveResult, apply_buffs_to_profile,
resolve_team_stats, resolve_team_stats_detailed,
};
pub use transformative::{TransformativeInput, TransformativeResult, calculate_transformative};
pub use types::{DamageType, Element, ScalingStat, WeaponType};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_public_api_usage_example() {
let stats = Stats {
hp: 20000.0,
atk: 2000.0,
def: 800.0,
elemental_mastery: 100.0,
crit_rate: 0.75,
crit_dmg: 1.50,
energy_recharge: 1.20,
dmg_bonus: 0.466,
..Default::default()
};
let input = DamageInput {
character_level: 90,
stats,
talent_multiplier: 1.76,
scaling_stat: ScalingStat::Atk,
damage_type: DamageType::Skill,
element: Some(Element::Pyro),
reaction: None,
reaction_bonus: 0.0,
flat_dmg: 0.0,
};
let enemy = Enemy {
level: 90,
resistance: 0.10,
def_reduction: 0.0,
def_ignore: 0.0,
};
let result = calculate_damage(&input, &enemy).unwrap();
assert!(result.non_crit > 0.0);
assert!(result.crit > result.non_crit);
assert!(result.average > result.non_crit);
assert!(result.average < result.crit);
}
}