relaod mechanic

This commit is contained in:
2025-04-02 02:15:43 +08:00
parent 9aaa015bd6
commit 01f8128e5f
7 changed files with 82 additions and 16 deletions

View File

@@ -25,6 +25,8 @@ pub struct HeadState {
pub health_max: u32,
pub ammo: u32,
pub ammo_max: u32,
pub reload_duration: f32,
pub last_use: f32,
}
impl HeadState {
@@ -36,6 +38,8 @@ impl HeadState {
ammo,
ammo_max: ammo,
ability: HeadAbility::None,
reload_duration: 5.,
last_use: 0.,
}
}
@@ -61,12 +65,13 @@ impl ActiveHeads {
self.heads[self.current_slot]
}
pub fn use_ammo(&mut self) {
pub fn use_ammo(&mut self, time: f32) {
let Some(head) = &mut self.heads[self.current_slot] else {
error!("cannot use ammo of empty head");
return;
};
head.last_use = time;
head.ammo = head.ammo.saturating_sub(1);
}
@@ -77,6 +82,16 @@ impl ActiveHeads {
pub fn head(&self, slot: usize) -> Option<HeadState> {
self.heads[slot]
}
pub fn reloading(&self) -> bool {
for head in self.heads {
if head.map(|head| head.ammo == 0).unwrap_or(false) {
return true;
}
}
false
}
}
#[derive(Event, Reflect)]
@@ -103,6 +118,7 @@ pub fn plugin(app: &mut App) {
});
app.add_systems(OnEnter(GameState::Playing), setup);
app.add_systems(Update, reload.run_if(in_state(GameState::Playing)));
app.add_observer(on_select_active_head);
app.add_observer(on_swap_backpack);
@@ -117,6 +133,22 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.insert_resource(HeadsImages { heads });
}
fn reload(mut active: ResMut<ActiveHeads>, time: Res<Time>) {
if !active.reloading() {
return;
}
for head in active.heads.iter_mut() {
let Some(head) = head else {
continue;
};
if !head.has_ammo() && (head.last_use + head.reload_duration <= time.elapsed_secs()) {
head.ammo = head.ammo_max;
}
}
}
fn on_select_active_head(
trigger: Trigger<SelectActiveHead>,
mut commands: Commands,