Every NPC is now aware of multiple players

This commit is contained in:
Alula 2020-12-03 22:06:26 +01:00
parent e540dfb297
commit f103e1aa2e
No known key found for this signature in database
GPG Key ID: 3E00485503A1D8BA
12 changed files with 136 additions and 92 deletions

View File

@ -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 {

View File

@ -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 {

View File

@ -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

View File

@ -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);

View File

@ -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 {

View File

@ -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(())
}
}

View File

@ -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;

View File

@ -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(()),
}?;

View File

@ -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(())
}

View File

@ -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;

View File

@ -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 {

View File

@ -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);