rpg_base/rpg_components/src/config/experience.rs
2025-03-03 19:06:15 +01:00

66 lines
1.7 KiB
Rust

use engine::prelude::*;
use serde::{Deserialize, Serialize};
use crate::components::npc_type::NPCType;
create_settings_section!(
ExperienceCurveSettings,
"Curve",
{
exponential: f32,
square: f32,
linear: f32,
starting_point: f32,
},
Serialize, Deserialize,
);
create_settings_section!(
MobExperienceSettings,
"Mobs",
{
linear: f32,
starting_point: f32,
elite_multiplier: f32,
boss_multiplier: f32,
},
Serialize, Deserialize,
);
create_settings_container!(
ExperienceSettings,
{
mob_experience: MobExperienceSettings,
experience_curve: ExperienceCurveSettings,
},
Serialize, Deserialize,
);
impl ExperienceSettings {
pub fn player_experience_needed(&self, level: u32) -> u32 {
let exponential = self.experience_curve.exponential;
let square = self.experience_curve.square;
let linear = self.experience_curve.linear;
let base = self.experience_curve.starting_point;
let level = level as f32;
// x^exponential + square * x^2 + linear * x + base
(level.powf(exponential) + square * level * level + linear * level + base) as u32
}
pub fn mob_experience(&self, level: u32, npc_type: impl Into<NPCType>) -> u32 {
let linear = self.mob_experience.linear;
let base = self.mob_experience.starting_point;
let level = level as f32;
let mut exp = linear * level + base;
match npc_type.into() {
NPCType::Normal => (),
NPCType::Elite => exp *= self.mob_experience.elite_multiplier,
NPCType::Boss => exp *= self.mob_experience.boss_multiplier,
}
exp as u32
}
}