rocalc 0.3.1

一款用于计算洛克王国:世界精灵对决的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 {
        (37.0 * self.atk * self.pow / 41.0).round() / self.dfe
    }
}

/// # 复杂公式(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 {
    pub fn new(atk: f32, dfe: f32, pow: f32) -> Cfor {
        Cfor {
            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 bianfu = rocalc::Cfor::build(179.0, 176.0, 60.0)
    /// .prop(1.25)    // 本系加成
    /// .counter(0.5); // 克制加成
    /// ```
    pub fn build(atk: f32, dfe: f32, pow: f32) -> Cfor {
        Cfor::new(atk, dfe, pow)
    }

    /// 计算伤害
    ///
    /// # Example
    ///
    /// ```rust
    /// # // 例如179物攻的恶系精灵用60威力的恶系技能攻击176物防的光系精灵
    /// # let bianfu = rocalc::Cfor::build(179.0, 176.0, 60.0)
    /// # .prop(1.25)    // 本系加成
    /// # .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)
    }

    pub fn atk_buff(mut self, atk_buff: f32) -> Cfor {
        self.atk_buff = atk_buff;
        self
    }
    pub fn deal(mut self, deal: f32) -> Cfor {
        self.deal = deal;
        self
    }
    pub fn pow_appd(mut self, pow_appd: f32) -> Cfor {
        self.pow_appd = pow_appd;
        self
    }
    pub fn pow_buff(mut self, pow_buff: f32) -> Cfor {
        self.pow_buff = pow_buff;
        self
    }
    pub fn counter(mut self, counter: f32) -> Cfor {
        self.counter = counter;
        self
    }
    pub fn prop(mut self, prop: f32) -> Cfor {
        self.prop = prop;
        self
    }
    pub fn reduce(mut self, reduce: f32) -> Cfor {
        self.reduce = reduce;
        self
    }
    pub fn dfe_buff(mut self, dfe_buff: f32) -> Cfor {
        self.dfe_buff = dfe_buff;
        self
    }
}