rocalc 0.3.0

一款用于计算洛克王国:世界精灵对决的Rust库
Documentation
//! 此模块包含一些计算相关的函数

/// # 简单公式(Simple formula)
///
/// 允许你快速计算
#[derive(Debug)]
pub struct Sfor {
    /// 基础攻击力
    pub atk: f32,
    /// 基础防御力
    pub dfe: f32,
    /// 技能**显示威力**,与基础威力不同,显示威力已自动计算本系加成,克制加成,攻击力加成等各种加成,但一些特殊效果如应对倍率需要自己进一步计算
    ///
    /// 注意!技能显示威力经过计算后会显示为整数,但实际计算可能是某浮点数,因此计算结果可能有个位数的误差
    pub pow: f32,
}

impl Sfor {
    /// 简易公式计算伤害
    ///
    /// # Example
    ///
    /// ```rust
    /// let my_sfor = rocalc::Sfor{
    ///     atk: 140.0,
    ///     dfe: 112.0,
    ///     pow: 220.0,
    /// };
    ///
    /// my_sfor.cal(); // 最终造成伤害
    /// 
    pub fn cal(&self) -> f32 {
        let dmg = (37.0 * self.atk * self.pow / 41.0).round() / self.dfe;
        return dmg;
    }
}

/// # 复杂公式(Complex formula)
///
/// 允许你高度自定义各种参数进行计算
#[derive(Debug)]
pub struct Cfor {
    /// 基础攻击力
    pub atk: f32, // 攻击力
    /// 基础防御力
    pub dfe: f32, // 防御力
    /// 技能基础威力,注意不能含任何加成
    pub pow: f32, // 技能基础威力
    /// 应对倍率,如偷袭:应对3倍伤害,此值取取3.0
    ///
    /// 默认为1.0
    pub deal: f32, // 应对倍率(技能效果)
    /// 技能威力附加,如破罐破摔的技能效果为退化后加60技能威力,此值取60.0
    ///
    /// 默认为0.0
    pub pow_appd: f32, // 技能威力附加(技能效果)
    /// 攻击力加成,如魔法增效:+70%的魔法攻击,此值取1.7
    ///
    /// 默认为1.0
    pub atk_buff: f32, // 攻击加成
    /// 防御力加成,如泥浆铠甲:+60%的物理防御,此值取1.6
    ///
    /// 默认为1.0
    pub dfe_buff: f32, // 防御加成
    /// 技能威力加成,如放晴:技能威力+50%,此值取1.5
    ///
    /// 默认为1.0
    pub pow_buff: f32, // 技能威力加成
    /// 本系加成,若有则固定取1.25
    ///
    /// 默认为1.0
    pub prop: f32, // 本系加成,若有取1.25
    /// 克制加成,若有则取2.0或3.0;
    /// 若抵抗则取0.5或0.25
    ///
    /// 默认为1.0
    pub counter: f32, // 克制加成,若有取2.0或3.0 
    /// 减伤加成,如纤维化:减伤70%,此值取0.7
    ///
    /// 默认为0.0
    pub reduce: f32, // 减伤
}

impl Cfor {
    /// 创建复杂公式,输入攻击值、防御值和技能威力,剩余值为默认
    ///
    /// # Example
    /// 
    /// ```rust
    /// // 例如179物攻的恶系精灵用60威力的恶系技能攻击176物防的光系精灵
    /// let mut bianfu = rocalc::Cfor::new(179.0, 176.0, 60.0);
    ///
    /// // 考虑本系加成和抵抗伤害
    /// bianfu.prop = 1.25;
    /// bianfu.counter = 0.5;
    /// ```
    pub fn new(atk: f32, dfe:f32, pow:f32) -> Self {
        Self {
            atk,
            dfe,
            pow,
            deal: 1.0,
            pow_appd: 0.0,
            atk_buff: 1.0,
            dfe_buff: 1.0,
            pow_buff: 1.0,
            prop: 1.0,
            counter: 1.0,
            reduce: 0.0,
        }
    }

    /// 计算伤害
    ///
    /// # Example
    ///
    /// ```rust
    /// # // 例如179物攻的恶系精灵用60威力的恶系技能攻击176物防的光系精灵
    /// # let mut bianfu = rocalc::Cfor::new(179.0, 176.0, 60.0);
    /// #
    /// # // 考虑本系加成和抵抗伤害
    /// # bianfu.prop = 1.25;
    /// # bianfu.counter = 0.5;
    /// bianfu.cal(); // 计算伤害
    /// ```
    pub fn cal(&self) -> f32 {
        (37.0 * (self.atk * self.atk_buff) * (self.pow * self.deal + self.pow_appd) * self.pow_buff * self.prop * self.counter * (1.0 - self.reduce)).round() / 41.0 / (self.dfe * self.dfe_buff)
    }

}