genshin-calc-core 0.5.12

Genshin Impact damage calculation engine
Documentation
const LEVEL_TABLE: [f64; 100] = [
    17.165606, 18.535048, 19.904854, 21.274902, 22.6454, 24.649612, 26.640642, 28.868587, 31.36768,
    34.143345, 37.201, 40.66, 44.446667, 48.56352, 53.74848, 59.081898, 64.420044, 69.72446,
    75.12314, 80.58478, 86.11203, 91.70374, 97.24463, 102.812645, 108.40956, 113.20169, 118.102905,
    122.97932, 129.72733, 136.29291, 142.67085, 149.02902, 155.41699, 161.8255, 169.10631,
    176.51808, 184.07274, 191.70952, 199.55692, 207.38205, 215.3989, 224.16566, 233.50217,
    243.35057, 256.06308, 268.5435, 281.52606, 295.01364, 309.0672, 323.6016, 336.75754, 350.5303,
    364.4827, 378.61917, 398.6004, 416.39825, 434.387, 452.95105, 472.60623, 492.8849, 513.56854,
    539.1032, 565.51056, 592.53876, 624.4434, 651.47015, 679.4968, 707.79407, 736.67145, 765.64026,
    794.7734, 824.67737, 851.1578, 877.74207, 914.2291, 946.74677, 979.4114, 1011.223, 1044.7917,
    1077.4437, 1109.9976, 1142.9766, 1176.3695, 1210.1844, 1253.8357, 1288.9528, 1325.4841,
    1363.4569, 1405.0974, 1446.8535, 1462.788, 1475.6956, 1497.9644, 1516.9423, 1561.468,
    1593.5062, 1621.0258, 1643.8679, 1662.1382, 1674.8092,
];

/// Returns the base reaction value for a given character level.
///
/// Used by transformative and lunar reaction calculations. Values are from
/// datamined level multiplier tables (Lv1-100).
///
/// Returns `None` if level is 0 or greater than 100.
pub fn reaction_base_value(level: u32) -> Option<f64> {
    if level == 0 || level > 100 {
        return None;
    }
    Some(LEVEL_TABLE[(level - 1) as usize])
}

#[cfg(test)]
mod tests {
    use super::*;

    const EPSILON: f64 = 1e-6;

    #[test]
    fn test_level_1() {
        assert!((reaction_base_value(1).unwrap() - 17.165606).abs() < EPSILON);
    }

    #[test]
    fn test_level_90() {
        assert!((reaction_base_value(90).unwrap() - 1446.8535).abs() < EPSILON);
    }

    #[test]
    fn test_level_100() {
        assert!((reaction_base_value(100).unwrap() - 1674.8092).abs() < EPSILON);
    }

    #[test]
    fn test_level_0_invalid() {
        assert_eq!(reaction_base_value(0), None);
    }

    #[test]
    fn test_level_101_invalid() {
        assert_eq!(reaction_base_value(101), None);
    }
}