From 92bc887663675a63aee4193f256489a05f0e5ce7 Mon Sep 17 00:00:00 2001 From: dawnDus <96957561+dawndus@users.noreply.github.com> Date: Sat, 20 Aug 2022 18:43:48 -0400 Subject: [PATCH] Fixed order of operations for bullets (Fixes #131) --- src/npc/ai/hell.rs | 11 +++++------ src/scene/game_scene.rs | 32 ++++++++++++++++++-------------- src/weapon/bullet.rs | 26 +++++++++++++------------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/npc/ai/hell.rs b/src/npc/ai/hell.rs index ebfdb10..6dcd525 100644 --- a/src/npc/ai/hell.rs +++ b/src/npc/ai/hell.rs @@ -778,27 +778,26 @@ impl NPC { npc.x = self.x + 0x800; npc.y = self.y; - // Same as Egg Corridor? Bomb match self.action_counter { 0 => { npc.tsc_direction = 0; - let _ = npc_list.spawn(0x100, npc); + let _ = npc_list.spawn(0x180, npc); } 50 => { npc.tsc_direction = 1; - let _ = npc_list.spawn(0x100, npc); + let _ = npc_list.spawn(0x180, npc); } 100 => { npc.tsc_direction = 2; - let _ = npc_list.spawn(0x100, npc); + let _ = npc_list.spawn(0x180, npc); } 150 => { npc.tsc_direction = 3; - let _ = npc_list.spawn(0x100, npc); + let _ = npc_list.spawn(0x180, npc); } 200 => { npc.tsc_direction = 4; - let _ = npc_list.spawn(0x100, npc); + let _ = npc_list.spawn(0x180, npc); } 250 => { self.hit_bounds.right = 0x6000; diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index f8b49c1..2e4d545 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -1420,9 +1420,26 @@ impl GameScene { self.tick_npc_splash(state); } + self.bullet_manager.tick_map_collisions(state, &self.npc_list, &mut self.stage); + self.tick_npc_bullet_collissions(state); - self.bullet_manager.tick_bullets(state, [&self.player1, &self.player2], &self.npc_list, &mut self.stage); + if state.control_flags.control_enabled() { + self.inventory_player1.tick_weapons( + state, + &mut self.player1, + TargetPlayer::Player1, + &mut self.bullet_manager, + ); + self.inventory_player2.tick_weapons( + state, + &mut self.player2, + TargetPlayer::Player2, + &mut self.bullet_manager, + ); + } + + self.bullet_manager.tick_bullets(state, [&self.player1, &self.player2], &self.npc_list); state.tick_carets(); match self.frame.update_target { @@ -1490,19 +1507,6 @@ impl GameScene { self.frame.update(state, &self.stage); if state.control_flags.control_enabled() { - self.inventory_player1.tick_weapons( - state, - &mut self.player1, - TargetPlayer::Player1, - &mut self.bullet_manager, - ); - self.inventory_player2.tick_weapons( - state, - &mut self.player2, - TargetPlayer::Player2, - &mut self.bullet_manager, - ); - self.hud_player1.tick(state, (&self.player1, &mut self.inventory_player1))?; self.hud_player2.tick(state, (&self.player2, &mut self.inventory_player2))?; self.boss_life_bar.tick(state, (&self.npc_list, &self.boss))?; diff --git a/src/weapon/bullet.rs b/src/weapon/bullet.rs index d5b2c35..9a6af8b 100644 --- a/src/weapon/bullet.rs +++ b/src/weapon/bullet.rs @@ -47,26 +47,14 @@ impl BulletManager { self.bullets.push(bullet); } - pub fn tick_bullets( - &mut self, - state: &mut SharedGameState, - players: [&Player; 2], - npc_list: &NPCList, - stage: &mut Stage, - ) { + pub fn tick_bullets(&mut self, state: &mut SharedGameState, players: [&Player; 2], npc_list: &NPCList) { let mut i = 0; while i < self.bullets.len() { { let bullet = unsafe { self.bullets.get_unchecked_mut(i) }; i += 1; - if bullet.life < 1 { - bullet.cond.set_alive(false); - continue; - } - bullet.tick(state, players, npc_list, &mut self.new_bullets); - bullet.tick_map_collisions(state, npc_list, stage); } for bullet in &mut self.new_bullets { @@ -79,6 +67,18 @@ impl BulletManager { self.bullets.retain(|b| !b.is_dead()); } + pub fn tick_map_collisions(&mut self, state: &mut SharedGameState, npc_list: &NPCList, stage: &mut Stage) { + let mut i = 0; + while i < self.bullets.len() { + { + let bullet = unsafe { self.bullets.get_unchecked_mut(i) }; + i += 1; + + bullet.tick_map_collisions(state, npc_list, stage); + } + } + } + pub fn count_bullets(&self, btype: u16, player_id: TargetPlayer) -> usize { self.bullets.iter().filter(|b| b.owner == player_id && b.btype == btype).count() }