Every NPC is now aware of multiple players
This commit is contained in:
parent
e540dfb297
commit
f103e1aa2e
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(())
|
||||
}
|
||||
}
|
||||
|
|
127
src/npc/misc.rs
127
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;
|
||||
|
|
|
@ -209,29 +209,29 @@ impl GameEntity<([&mut Player; 2], &BTreeMap<u16, RefCell<NPC>>, &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<u16, RefCell<NPC>>, &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<u16, RefCell<NPC>>, &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<u16, RefCell<NPC>>, &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(()),
|
||||
}?;
|
||||
|
||||
|
|
|
@ -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(())
|
||||
}
|
||||
|
|
|
@ -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<u16, RefCell<NPC>>) -> GameResult {
|
||||
pub fn tick_n042_sue(&mut self, state: &mut SharedGameState, players: [&mut Player; 2], map: &BTreeMap<u16, RefCell<NPC>>) -> 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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue