rocalc 0.3.0

一款用于计算洛克王国:世界精灵对决的Rust库
Documentation
use crate::core::stat::*;

/// 定义性格、六维面板和个体值,用于计算精灵的具体面板数值
#[derive(Debug, Copy, Clone)]
pub struct Tri{
    pub car: Car, // 性格
    pub rac: Six, // 六维面板
    pub ind: [(Panel, f32); 3], // 固定三个个体值
}

impl Tri {
    /// 创建Tri实例
    pub fn new(car:Car, rac: &Six, ind: &[(Panel, f32); 3]) -> Self {
        Self {
            car,
            rac: *rac,
            ind: *ind,
        }
    }

    /// 依次进行种族值修正、个体值修正、性格修正和常数修正,得到最终的面板数值
    pub fn cor(&self) -> Six {
        let mut dest_panel: Six = self.rac.clone();
        self.rac_cor(&mut dest_panel);
        self.ind_cor(&mut dest_panel);
        self.car_cor(&mut dest_panel);
        self.con_cor(&mut dest_panel);
        dest_panel
    }

    /// 种族值修正
    fn rac_cor(&self, panel: &mut Six) {
        
        macro_rules! cor_panel {
            ( $($field:ident),* ) => {
                $(
                    //self.rac.$field = 1.1 * self.rac.$field + 10.0; 
                    panel.$field = 1.1 * panel.$field + 10.0; 
                )*
            };
        }

        //self.rac.hp = 1.7 * self.rac.hp + 70.0; 
        panel.hp = 1.7 * panel.hp + 70.0; 
        cor_panel!(atk, dfe, m_atk, m_dfe, spd);
    }

    /// 个体值修正
    fn ind_cor(&self, panel: &mut Six) {
        for (ind_type, value) in &self.ind {
            match ind_type {
                Panel::Hp => panel.hp += value * 6.0 * 0.85,
                Panel::Atk => panel.atk += value * 6.0 * 0.55,
                Panel::MAtk => panel.m_atk += value * 6.0 * 0.55,
                Panel::Dfe => panel.dfe += value * 6.0 * 0.55,
                Panel::MDfe => panel.m_dfe += value * 6.0 * 0.55,
                Panel::Spd => panel.spd += value * 6.0 * 0.55,
            }
        }
    }

    /// 性格修正
    fn car_cor(&self, panel: &mut Six) {
        //let keys = get_key(&self.car);
        let keys = &self.car.get_key();
        {
            let plus = get_field_mut(panel, keys[0]);
            if let Some(p) = plus {
                *p *= 1.2;
            }
        }

        let sub = get_field_mut(panel, keys[1]);
            if let Some(s) = sub {
                *s *= 0.9;
            }
    }

    /// 常数修正
    fn con_cor(&self, panel: &mut Six) {
       macro_rules! apply_to_all {
           ( $($field:ident),* ) => {
               $(
                   panel.$field += 50.0; 
               )*
           };
       }
        panel.hp += 100.0;
        apply_to_all!(atk, dfe, m_atk, m_dfe, spd);
    }

}