use crate::core::*;
#[derive(Debug, Copy, Clone)]
pub struct Tri {
pub car: Car, pub rac: Six, pub ind: [(Panel, f32); 3], }
impl 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;
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),* ) => {
$(
panel.$field = 1.1 * panel.$field + 10.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 = &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);
}
}