From f103e1aa2e22e0985779f92baf92c8363c87763a Mon Sep 17 00:00:00 2001 From: Alula Date: Thu, 3 Dec 2020 22:06:26 +0100 Subject: [PATCH] Every NPC is now aware of multiple players --- src/npc/chaco.rs | 3 +- src/npc/first_cave.rs | 12 ++-- src/npc/grasstown.rs | 4 +- src/npc/igor.rs | 7 ++- src/npc/maze.rs | 6 +- src/npc/mimiga_village.rs | 7 ++- src/npc/misc.rs | 127 ++++++++++++++++++++++++-------------- src/npc/mod.rs | 38 ++++++------ src/npc/quote.rs | 10 +-- src/npc/sue.rs | 3 +- src/npc/toroko.rs | 3 +- src/scene/game_scene.rs | 8 +-- 12 files changed, 136 insertions(+), 92 deletions(-) diff --git a/src/npc/chaco.rs b/src/npc/chaco.rs index c81f768..21505ec 100644 --- a/src/npc/chaco.rs +++ b/src/npc/chaco.rs @@ -7,7 +7,7 @@ use crate::player::Player; use crate::shared_game_state::SharedGameState; impl NPC { - pub(crate) fn tick_n093_chaco(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n093_chaco(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -22,6 +22,7 @@ impl NPC { self.anim_num = 1; } + let player = self.get_closest_player_mut(players); if (self.x - player.x).abs() < 32 * 0x200 && self.y - 32 * 0x200 < player.y && self.y + 16 * 0x200 > player.y { diff --git a/src/npc/first_cave.rs b/src/npc/first_cave.rs index c696add..9c19b5c 100644 --- a/src/npc/first_cave.rs +++ b/src/npc/first_cave.rs @@ -7,15 +7,14 @@ use crate::player::Player; use crate::shared_game_state::SharedGameState; impl NPC { - pub(crate) fn tick_n059_eye_door(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { - self.npc_flags.set_event_when_touched(true); - + pub(crate) fn tick_n059_eye_door(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { self.action_num = 1; } + let player = self.get_closest_player_mut(players); if self.x - (64 * 0x200) < player.x && self.x + (64 * 0x200) > player.x && self.y - (64 * 0x200) < player.y @@ -36,6 +35,7 @@ impl NPC { } } 3 => { + let player = self.get_closest_player_mut(players); if !(self.x - (64 * 0x200) < player.x && self.x + (64 * 0x200) > player.x && self.y - (64 * 0x200) < player.y @@ -67,7 +67,7 @@ impl NPC { } - pub(crate) fn tick_n064_first_cave_critter(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n064_first_cave_critter(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -77,6 +77,7 @@ impl NPC { self.anim_rect = state.constants.npc.n064_first_cave_critter[self.anim_num as usize + if self.direction == Direction::Right { 3 } else { 0 }]; } + let player = self.get_closest_player_mut(players); if self.x > player.x { self.direction = Direction::Left; } else { @@ -180,7 +181,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n065_first_cave_bat(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n065_first_cave_bat(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -199,6 +200,7 @@ impl NPC { } } 2 => { + let player = self.get_closest_player_mut(players); if self.x > player.x { self.direction = Direction::Left; } else { diff --git a/src/npc/grasstown.rs b/src/npc/grasstown.rs index d545f58..478b727 100644 --- a/src/npc/grasstown.rs +++ b/src/npc/grasstown.rs @@ -504,7 +504,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n094_kulala(&mut self, state: &SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n094_kulala(&mut self, state: &SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 => { self.anim_num = 4; @@ -587,6 +587,8 @@ impl NPC { self.vel_x += self.direction.vector_x() * 0x80; } else { + let player = self.get_closest_player_mut(players); + self.vel_x2 = 50; self.direction = if self.x > player.x { Direction::Left diff --git a/src/npc/igor.rs b/src/npc/igor.rs index 7564dfd..5ca1780 100644 --- a/src/npc/igor.rs +++ b/src/npc/igor.rs @@ -87,7 +87,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n088_igor_boss(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n088_igor_boss(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -112,6 +112,7 @@ impl NPC { } } 2 | 3 => { + let player = self.get_closest_player_mut(players); if self.action_num == 2 { self.action_num = 3; self.action_counter = 0; @@ -226,6 +227,7 @@ impl NPC { self.action_num = 10; self.action_counter = 0; + let player = self.get_closest_player_mut(players); self.direction = if player.x < self.x { Direction::Left } else { Direction::Right }; } @@ -273,12 +275,13 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n089_igor_dead(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n089_igor_dead(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { self.action_num = 1; + let player = self.get_closest_player_mut(players); self.direction = if self.x > player.x { Direction::Left } else { Direction::Right }; let mut npc = NPCMap::create_npc(4, &state.npc_table); diff --git a/src/npc/maze.rs b/src/npc/maze.rs index 1b40b17..85949b5 100644 --- a/src/npc/maze.rs +++ b/src/npc/maze.rs @@ -1,7 +1,7 @@ +use ggez::GameResult; use num_traits::{abs, clamp}; use crate::common::Direction; -use ggez::GameResult; use crate::npc::NPC; use crate::player::Player; use crate::shared_game_state::SharedGameState; @@ -14,7 +14,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n361_gaudi_dashing(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n361_gaudi_dashing(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -23,6 +23,7 @@ impl NPC { self.action_num = 1; } + let player = self.get_closest_player_mut(players); if (self.direction == Direction::Right && player.x > self.x + 272 * 0x200 && player.x < self.x + 288 * 0x200) || (self.direction == Direction::Left && player.x < self.x - 272 * 0x200 && player.x > self.x - 288 * 0x200) { self.action_num = 10; @@ -37,6 +38,7 @@ impl NPC { self.damage = 5; } + let player = self.get_closest_player_mut(players); if self.x > player.x { self.direction = Direction::Left; } else { diff --git a/src/npc/mimiga_village.rs b/src/npc/mimiga_village.rs index 6040bae..ba5d859 100644 --- a/src/npc/mimiga_village.rs +++ b/src/npc/mimiga_village.rs @@ -1,9 +1,9 @@ use std::cmp::Ordering; +use ggez::GameResult; use num_traits::{abs, clamp}; use crate::common::Direction; -use ggez::GameResult; use crate::npc::NPC; use crate::player::Player; use crate::shared_game_state::SharedGameState; @@ -154,7 +154,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n075_kanpachi(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n075_kanpachi(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { if self.action_num == 0 { self.action_num = 1; self.anim_num = 0; @@ -162,6 +162,7 @@ impl NPC { } if self.action_num == 1 { + let player = self.get_closest_player_mut(players); if (self.x - (48 * 0x200) < player.x) && (self.x + (48 * 0x200) > player.x) && (self.y - (48 * 0x200) < player.y) && (self.y + (48 * 0x200) > player.y) { self.anim_num = 1; @@ -471,7 +472,7 @@ impl NPC { self.y += 16 * 0x200; self.anim_rect = state.constants.npc.n091_mimiga_cage; } - + Ok(()) } } diff --git a/src/npc/misc.rs b/src/npc/misc.rs index f2ff665..ba380d8 100644 --- a/src/npc/misc.rs +++ b/src/npc/misc.rs @@ -1,9 +1,9 @@ +use ggez::GameResult; use num_traits::{abs, clamp}; use num_traits::real::Real; use crate::caret::CaretType; use crate::common::Direction; -use ggez::GameResult; use crate::npc::{NPC, NPCMap}; use crate::player::Player; use crate::shared_game_state::SharedGameState; @@ -557,12 +557,13 @@ impl NPC { } - pub(crate) fn tick_n072_sprinkler(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n072_sprinkler(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { if self.direction == Direction::Left { self.anim_counter = (self.anim_counter + 1) % 4; self.anim_num = self.anim_counter / 2; self.anim_rect = state.constants.npc.n072_sprinkler[self.anim_num as usize]; + let player = self.get_closest_player_mut(players); if self.anim_num % 2 == 0 && (player.x - self.x).abs() < 480 * 0x200 { self.action_counter = self.action_counter.wrapping_add(1); @@ -662,7 +663,7 @@ impl NPC { self.anim_num = 1; } } - _ =>{ } + _ => {} } let dir_offset = if self.direction == Direction::Left { 0 } else { 3 }; @@ -691,7 +692,8 @@ impl NPC { } { - if abs(players[0].x - self.x) < 480 * 0x200 && abs(players[0].y - self.y) < 240 * 0x200 + let player = self.get_closest_player_mut(players); + if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 && state.game_rng.range(0..5) == 1 { let mut particle = NPCMap::create_npc(199, &state.npc_table); particle.cond.set_alive(true); @@ -723,7 +725,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n097_fan_up(&mut self, state: &mut SharedGameState, player: &mut Player) -> GameResult { + pub(crate) fn tick_n097_fan_up(&mut self, state: &mut SharedGameState, mut players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 && self.direction == Direction::Right { @@ -742,18 +744,27 @@ impl NPC { } } - if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 - && state.game_rng.range(0..5) == 1 { - let mut particle = NPCMap::create_npc(199, &state.npc_table); - particle.cond.set_alive(true); - particle.direction = Direction::Up; - particle.x = self.x + (state.game_rng.range(-8..8) * 0x200) as isize; - particle.y = self.y; - state.new_npcs.push(particle); + { + let player = self.get_closest_player_mut(players); + if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 + && state.game_rng.range(0..5) == 1 { + let mut particle = NPCMap::create_npc(199, &state.npc_table); + particle.cond.set_alive(true); + particle.direction = Direction::Up; + particle.x = self.x + (state.game_rng.range(-8..8) * 0x200) as isize; + particle.y = self.y; + state.new_npcs.push(particle); + } } - if abs(player.x - self.x) < 8 * 0x200 && player.y < self.y && player.y > self.y - 96 * 0x200 { - player.vel_y -= 0x88; + for player in players.iter_mut() { + if !player.cond.alive() || player.cond.hidden() { + continue; + } + + if abs(player.x - self.x) < 8 * 0x200 && player.y < self.y && player.y > self.y - 96 * 0x200 { + player.vel_y -= 0x88; + } } } _ => {} @@ -766,7 +777,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n098_fan_right(&mut self, state: &mut SharedGameState, player: &mut Player) -> GameResult { + pub(crate) fn tick_n098_fan_right(&mut self, state: &mut SharedGameState, mut players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 && self.direction == Direction::Right { @@ -785,19 +796,24 @@ impl NPC { } } - if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 - && state.game_rng.range(0..5) == 1 { - let mut particle = NPCMap::create_npc(199, &state.npc_table); - particle.cond.set_alive(true); - particle.direction = Direction::Right; - particle.x = self.x; - particle.y = self.y + (state.game_rng.range(-8..8) * 0x200) as isize; - state.new_npcs.push(particle); + { + let player = self.get_closest_player_mut(players); + if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 + && state.game_rng.range(0..5) == 1 { + let mut particle = NPCMap::create_npc(199, &state.npc_table); + particle.cond.set_alive(true); + particle.direction = Direction::Right; + particle.x = self.x; + particle.y = self.y + (state.game_rng.range(-8..8) * 0x200) as isize; + state.new_npcs.push(particle); + } } - if abs(player.y - self.y) < 8 * 0x200 && player.x > self.x && player.x < self.x + 96 * 0x200 { - player.vel_x += 0x88; - player.cond.set_increase_acceleration(true); + for player in players.iter_mut() { + if abs(player.y - self.y) < 8 * 0x200 && player.x > self.x && player.x < self.x + 96 * 0x200 { + player.vel_x += 0x88; + player.cond.set_increase_acceleration(true); + } } } _ => {} @@ -810,7 +826,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n099_fan_down(&mut self, state: &mut SharedGameState, player: &mut Player) -> GameResult { + pub(crate) fn tick_n099_fan_down(&mut self, state: &mut SharedGameState, mut players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 && self.direction == Direction::Right { @@ -829,18 +845,23 @@ impl NPC { } } - if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 - && state.game_rng.range(0..5) == 1 { - let mut particle = NPCMap::create_npc(199, &state.npc_table); - particle.cond.set_alive(true); - particle.direction = Direction::Bottom; - particle.x = self.x + (state.game_rng.range(-8..8) * 0x200) as isize; - particle.y = self.y; - state.new_npcs.push(particle); + { + let player = self.get_closest_player_mut(players); + if abs(player.x - self.x) < 480 * 0x200 && abs(player.y - self.y) < 240 * 0x200 + && state.game_rng.range(0..5) == 1 { + let mut particle = NPCMap::create_npc(199, &state.npc_table); + particle.cond.set_alive(true); + particle.direction = Direction::Bottom; + particle.x = self.x + (state.game_rng.range(-8..8) * 0x200) as isize; + particle.y = self.y; + state.new_npcs.push(particle); + } } - if abs(player.x - self.x) < 8 * 0x200 && player.y > self.y && player.y < self.y + 96 * 0x200 { - player.vel_y -= 0x88; + for player in players.iter_mut() { + if abs(player.x - self.x) < 8 * 0x200 && player.y > self.y && player.y < self.y + 96 * 0x200 { + player.vel_y -= 0x88; + } } } _ => {} @@ -882,7 +903,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n114_press(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n114_press(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -898,7 +919,7 @@ impl NPC { } 10 => { self.anim_counter += 1; - if self.anim_counter > 2{ + if self.anim_counter > 2 { self.anim_counter = 0; self.anim_num += 1; if self.anim_num > 2 { @@ -906,12 +927,14 @@ impl NPC { } } - if player.y > self.y { - self.npc_flags.set_solid_hard(false); - self.damage = 127; - } else { - self.npc_flags.set_solid_hard(true); - self.damage = 0; + for player in players.iter() { + if player.y > self.y { + self.npc_flags.set_solid_hard(false); + self.damage = 127; + } else { + self.npc_flags.set_solid_hard(true); + self.damage = 0; + } } if self.flags.hit_bottom_wall() { @@ -953,7 +976,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n149_horizontal_moving_block(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n149_horizontal_moving_block(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 => { self.x += 8 * 0x200; @@ -966,6 +989,7 @@ impl NPC { 10 => { self.npc_flags.set_rear_and_top_not_hurt(false); self.damage = 0; + let player = self.get_closest_player_mut(players); if (player.x < self.x + 25 * 0x200) && (player.x > self.x - 25 * 16 * 0x200) && (player.y < self.y + 25 * 0x200) && (player.y > self.y - 25 * 0x200) { self.action_num = 11; @@ -998,6 +1022,7 @@ impl NPC { state.new_npcs.push(npc); } } else { + let player = self.get_closest_player_mut(players); if player.flags.hit_left_wall() { self.npc_flags.set_rear_and_top_not_hurt(true); self.damage = 100; @@ -1013,6 +1038,7 @@ impl NPC { self.npc_flags.set_rear_and_top_not_hurt(false); self.damage = 0; + let player = self.get_closest_player_mut(players); if (player.x > self.x - 25 * 0x200) && (player.x < self.x + 25 * 16 * 0x200) && (player.y < self.y + 25 * 0x200) && (player.y > self.y - 25 * 0x200) { self.action_num = 21; @@ -1045,6 +1071,7 @@ impl NPC { state.new_npcs.push(npc); } } else { + let player = self.get_closest_player_mut(players); if player.flags.hit_right_wall() { self.npc_flags.set_rear_and_top_not_hurt(true); self.damage = 100; @@ -1070,7 +1097,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n157_vertical_moving_block(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n157_vertical_moving_block(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 => { self.x += 8 * 0x200; @@ -1083,6 +1110,7 @@ impl NPC { 10 => { self.npc_flags.set_rear_and_top_not_hurt(false); self.damage = 0; + let player = self.get_closest_player_mut(players); if (player.y < self.y + 25 * 0x200) && (player.y > self.y - 25 * 16 * 0x200) && (player.x < self.x + 25 * 0x200) && (player.x > self.x - 25 * 0x200) { self.action_num = 11; @@ -1115,6 +1143,7 @@ impl NPC { state.new_npcs.push(npc); } } else { + let player = self.get_closest_player_mut(players); if player.flags.hit_top_wall() { self.npc_flags.set_rear_and_top_not_hurt(true); self.damage = 100; @@ -1130,6 +1159,7 @@ impl NPC { self.npc_flags.set_rear_and_top_not_hurt(false); self.damage = 0; + let player = self.get_closest_player_mut(players); if (player.y > self.y - 25 * 0x200) && (player.y < self.y + 25 * 16 * 0x200) && (player.x < self.x + 25 * 0x200) && (player.x > self.x - 25 * 0x200) { self.action_num = 21; @@ -1162,6 +1192,7 @@ impl NPC { state.new_npcs.push(npc); } } else { + let player = self.get_closest_player_mut(players); if player.flags.hit_bottom_wall() { self.npc_flags.set_rear_and_top_not_hurt(true); self.damage = 100; diff --git a/src/npc/mod.rs b/src/npc/mod.rs index 76b99f8..e1d5d24 100644 --- a/src/npc/mod.rs +++ b/src/npc/mod.rs @@ -209,29 +209,29 @@ impl GameEntity<([&mut Player; 2], &BTreeMap>, &mut Stage)> fo 39 => self.tick_n039_save_sign(state), 40 => self.tick_n040_santa(state, players), 41 => self.tick_n041_busted_door(state), - 42 => self.tick_n042_sue(state, players[0], map), + 42 => self.tick_n042_sue(state, players, map), 43 => self.tick_n043_chalkboard(state), 46 => self.tick_n046_hv_trigger(players), 52 => self.tick_n052_sitting_blue_robot(state), 55 => self.tick_n055_kazuma(state), 58 => self.tick_n058_basu(state, players), - 59 => self.tick_n059_eye_door(state, players[0]), - 60 => self.tick_n060_toroko(state, players[0]), + 59 => self.tick_n059_eye_door(state, players), + 60 => self.tick_n060_toroko(state, players), 61 => self.tick_n061_king(state), 62 => self.tick_n062_kazuma_computer(state), 63 => self.tick_n063_toroko_stick(state), - 64 => self.tick_n064_first_cave_critter(state, players[0]), - 65 => self.tick_n065_first_cave_bat(state, players[0]), + 64 => self.tick_n064_first_cave_critter(state, players), + 65 => self.tick_n065_first_cave_bat(state, players), 66 => self.tick_n066_misery_bubble(state, map), 67 => self.tick_n067_misery_floating(state), 68 => self.tick_n068_balrog_running(state, players), 69 => self.tick_n069_pignon(state), 70 => self.tick_n070_sparkle(state), 71 => self.tick_n071_chinfish(state), - 72 => self.tick_n072_sprinkler(state, players[0]), + 72 => self.tick_n072_sprinkler(state, players), 73 => self.tick_n073_water_droplet(state, stage), 74 => self.tick_n074_jack(state), - 75 => self.tick_n075_kanpachi(state, players[0]), + 75 => self.tick_n075_kanpachi(state, players), 76 => self.tick_n076_flowers(), 77 => self.tick_n077_yamashita(state), 78 => self.tick_n078_pot(state), @@ -244,17 +244,17 @@ impl GameEntity<([&mut Player; 2], &BTreeMap>, &mut Stage)> fo 85 => self.tick_n085_terminal(state, players), 86 => self.tick_n086_missile_pickup(state), 87 => self.tick_n087_heart_pickup(state), - 88 => self.tick_n088_igor_boss(state, players[0]), - 89 => self.tick_n089_igor_dead(state, players[0]), + 88 => self.tick_n088_igor_boss(state, players), + 89 => self.tick_n089_igor_dead(state, players), 91 => self.tick_n091_mimiga_cage(state), 92 => self.tick_n092_sue_at_pc(state), - 93 => self.tick_n093_chaco(state, players[0]), - 94 => self.tick_n094_kulala(state, players[0]), + 93 => self.tick_n093_chaco(state, players), + 94 => self.tick_n094_kulala(state, players), 95 => self.tick_n095_jelly(state), 96 => self.tick_n096_fan_left(state, players), - 97 => self.tick_n097_fan_up(state, players[0]), - 98 => self.tick_n098_fan_right(state, players[0]), - 99 => self.tick_n099_fan_down(state, players[0]), + 97 => self.tick_n097_fan_up(state, players), + 98 => self.tick_n098_fan_right(state, players), + 99 => self.tick_n099_fan_down(state, players), 100 => self.tick_n100_grate(state), 101 => self.tick_n101_malco_screen(state), 102 => self.tick_n102_malco_computer_wave(state), @@ -268,12 +268,12 @@ impl GameEntity<([&mut Player; 2], &BTreeMap>, &mut Stage)> fo 110 => self.tick_n110_puchi(state, players), 111 => self.tick_n111_quote_teleport_out(state, players), 112 => self.tick_n112_quote_teleport_in(state, players), - 114 => self.tick_n114_press(state, players[0]), + 114 => self.tick_n114_press(state, players), 129 => self.tick_n129_fireball_snake_trail(state), - 149 => self.tick_n149_horizontal_moving_block(state, players[0]), - 150 => self.tick_n150_quote(state, players[0]), + 149 => self.tick_n149_horizontal_moving_block(state, players), + 150 => self.tick_n150_quote(state, players), 154 => self.tick_n154_gaudi_dead(state), - 157 => self.tick_n157_vertical_moving_block(state, players[0]), + 157 => self.tick_n157_vertical_moving_block(state, players), 192 => self.tick_n192_scooter(state), 193 => self.tick_n193_broken_scooter(state), 194 => self.tick_n194_broken_blue_robot(state), @@ -282,7 +282,7 @@ impl GameEntity<([&mut Player; 2], &BTreeMap>, &mut Stage)> fo 298 => self.tick_n298_intro_doctor(state), 299 => self.tick_n299_intro_balrog_misery(state), 300 => self.tick_n300_intro_demon_crown(state), - 361 => self.tick_n361_gaudi_dashing(state, players[0]), + 361 => self.tick_n361_gaudi_dashing(state, players), _ => Ok(()), }?; diff --git a/src/npc/quote.rs b/src/npc/quote.rs index 2c46443..7df1ff9 100644 --- a/src/npc/quote.rs +++ b/src/npc/quote.rs @@ -130,13 +130,14 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n150_quote(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n150_quote(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 => { self.action_num = 1; self.anim_num = 0; if self.tsc_direction > 10 { + let player = &players[state.textscript_vm.executor_player.index()]; self.x = player.x; self.y = player.y; @@ -276,10 +277,9 @@ impl NPC { self.anim_rect.bottom = self.anim_rect.top + self.action_counter / 4; } - if player.equip.has_mimiga_mask() { - self.anim_rect.top += 32; - self.anim_rect.bottom += 32; - } + let offset = players[state.textscript_vm.executor_player.index()].get_texture_offset(); + self.anim_rect.top += offset; + self.anim_rect.bottom += offset; Ok(()) } diff --git a/src/npc/sue.rs b/src/npc/sue.rs index 135676b..c053e1b 100644 --- a/src/npc/sue.rs +++ b/src/npc/sue.rs @@ -10,7 +10,7 @@ use crate::player::Player; use crate::shared_game_state::SharedGameState; impl NPC { - pub fn tick_n042_sue(&mut self, state: &mut SharedGameState, player: &Player, map: &BTreeMap>) -> GameResult { + pub fn tick_n042_sue(&mut self, state: &mut SharedGameState, players: [&mut Player; 2], map: &BTreeMap>) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -182,6 +182,7 @@ impl NPC { self.vel_x = self.direction.vector_x() * 0x400; + let player = self.get_closest_player_mut(players); if self.x < player.x - 8 * 0x200 { self.direction = Direction::Right; self.action_num = 0; diff --git a/src/npc/toroko.rs b/src/npc/toroko.rs index ced7bb8..80c42bd 100644 --- a/src/npc/toroko.rs +++ b/src/npc/toroko.rs @@ -7,7 +7,7 @@ use crate::player::Player; use crate::shared_game_state::SharedGameState; impl NPC { - pub(crate) fn tick_n060_toroko(&mut self, state: &mut SharedGameState, player: &Player) -> GameResult { + pub(crate) fn tick_n060_toroko(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { match self.action_num { 0 | 1 => { if self.action_num == 0 { @@ -23,6 +23,7 @@ impl NPC { self.anim_num = 1; } + let player = self.get_closest_player_mut(players); if (self.x - (16 * 0x200) < player.x) && (self.x + (16 * 0x200) > player.x) && (self.y - (16 * 0x200) < player.y) && (self.y + (16 * 0x200) > player.y) { if self.x > player.x { diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index c5975c5..d3bdd3c 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -1052,10 +1052,10 @@ impl GameScene { match self.frame.update_target { UpdateTarget::Player => { if !self.player2.cond.hidden() - && abs(self.player1.target_x - self.player2.x) < 200 * 0x200 - && abs(self.player1.target_y - self.player2.y) < 160 * 0x200 { - self.frame.target_x = (self.player1.target_x + self.player2.target_x) / 2; - self.frame.target_y = (self.player1.target_y + self.player2.target_y) / 2; + && abs(self.player1.x - self.player2.x) < 240 * 0x200 + && abs(self.player1.y - self.player2.y) < 200 * 0x200 { + self.frame.target_x = (self.player1.target_x * 2 + self.player2.target_x) / 3; + self.frame.target_y = (self.player1.target_y * 2 + self.player2.target_y) / 3; self.frame.target_x = clamp(self.frame.target_x, self.player1.x - 0x8000, self.player1.x + 0x8000); self.frame.target_y = clamp(self.frame.target_y, self.player1.y, self.player1.y);