use bevy::prelude::*;
#[derive(Component, Debug, Clone)]
pub struct PowerBar {
pub current: f32,
pub max: f32,
pub base_max: f32,
pub is_knocked_out: bool,
}
impl Default for PowerBar {
fn default() -> Self {
Self {
current: 100.0,
max: 100.0,
base_max: 100.0,
is_knocked_out: false,
}
}
}
impl PowerBar {
pub fn new(max_power: f32) -> Self {
Self {
current: max_power,
max: max_power,
base_max: max_power,
is_knocked_out: false,
}
}
pub fn spend(&mut self, amount: f32) -> bool {
if self.is_knocked_out || self.current <= amount {
return false;
}
self.current -= amount;
true
}
pub fn add(&mut self, amount: f32) {
if !self.is_knocked_out {
self.current = (self.current + amount).min(self.max);
}
}
pub fn revive(&mut self, power_amount: f32) {
if self.is_knocked_out {
self.is_knocked_out = false;
self.current = power_amount.min(self.max);
}
}
pub fn percentage(&self) -> f32 {
if self.max > 0.0 {
self.current / self.max
} else {
0.0
}
}
}
#[derive(Component, Debug, Clone)]
pub struct PowerLevel {
pub level: u32,
pub experience: f32,
pub experience_to_next: f32,
}
impl Default for PowerLevel {
fn default() -> Self {
Self {
level: 1,
experience: 0.0,
experience_to_next: 100.0,
}
}
}
impl PowerLevel {
pub fn level_up(&mut self) -> f32 {
self.level += 1;
self.experience = 0.0;
self.experience_to_next *= 1.5;
let bonus = 5.0
+ (self.level as f32 - 44.0).clamp(0., 1.0) * 3.0
+ (self.level as f32 - 64.0).clamp(0., 1.0) * 4.0
+ (self.level as f32 - 84.0).clamp(0., 1.0) * -4.0
+ (self.level as f32 - 104.0).clamp(0., 1.0) * -3.0;
bonus
}
pub fn add_experience(&mut self, amount: f32) -> bool {
self.experience += amount;
if self.experience >= self.experience_to_next {
return true;
}
false
}
}
#[derive(Component, Debug, Clone)]
pub struct PowerRegeneration {
pub time_since_spend: f32,
pub regen_delay: f32,
pub current_rate: f32,
pub base_rate: f32,
pub max_rate: f32,
pub ramp_speed: f32,
pub is_active: bool,
}
impl Default for PowerRegeneration {
fn default() -> Self {
Self {
time_since_spend: 0.0,
regen_delay: 2.5,
current_rate: 0.0,
base_rate: 5.0,
max_rate: 20.0,
ramp_speed: 2.0,
is_active: false,
}
}
}
impl PowerRegeneration {
pub fn reset(&mut self) {
self.time_since_spend = 0.0;
self.current_rate = 0.0;
self.is_active = false;
}
pub fn update(&mut self, delta: f32) {
self.time_since_spend += delta;
if self.time_since_spend >= self.regen_delay {
self.is_active = true;
if self.current_rate < self.max_rate {
self.current_rate =
(self.current_rate + self.ramp_speed * delta).min(self.max_rate);
if self.current_rate == 0.0 {
self.current_rate = self.base_rate;
}
}
}
}
pub fn get_regen_amount(&self, delta: f32) -> f32 {
if self.is_active {
self.current_rate * delta
} else {
0.0
}
}
}