mirror of
https://github.com/doukutsu-rs/doukutsu-rs
synced 2024-09-30 05:59:46 +00:00
127 lines
4.8 KiB
Rust
127 lines
4.8 KiB
Rust
|
use crate::caret::CaretType;
|
||
|
use crate::common::Direction;
|
||
|
use crate::inventory::Inventory;
|
||
|
use crate::player::{Player, TargetPlayer};
|
||
|
use crate::shared_game_state::SharedGameState;
|
||
|
use crate::weapon::bullet::BulletManager;
|
||
|
use crate::weapon::{Weapon, WeaponLevel};
|
||
|
|
||
|
impl Weapon {
|
||
|
pub(in crate::weapon) fn tick_spur(
|
||
|
&mut self,
|
||
|
player: &mut Player,
|
||
|
player_id: TargetPlayer,
|
||
|
inventory: &mut Inventory,
|
||
|
bullet_manager: &mut BulletManager,
|
||
|
state: &mut SharedGameState,
|
||
|
) {
|
||
|
const BULLETS: [u16; 6] = [44, 45, 46, 47, 48, 49];
|
||
|
|
||
|
let mut shoot = false;
|
||
|
let btype;
|
||
|
|
||
|
if player.controller.shoot() {
|
||
|
inventory.add_xp(if player.equip.has_turbocharge() { 3 } else { 2 }, player, state);
|
||
|
self.counter1 += 1;
|
||
|
|
||
|
if (self.counter1 / 2 % 2) != 0 {
|
||
|
match self.level {
|
||
|
WeaponLevel::Level1 => {
|
||
|
state.sound_manager.play_sfx(59);
|
||
|
}
|
||
|
WeaponLevel::Level2 => {
|
||
|
state.sound_manager.play_sfx(60);
|
||
|
}
|
||
|
WeaponLevel::Level3 => {
|
||
|
if let (_, _, false) = inventory.get_current_max_exp(&state.constants) {
|
||
|
state.sound_manager.play_sfx(61);
|
||
|
}
|
||
|
}
|
||
|
WeaponLevel::None => unreachable!(),
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if self.counter1 > 0 {
|
||
|
shoot = true;
|
||
|
self.counter1 = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if let (_, _, true) = inventory.get_current_max_exp(&state.constants) {
|
||
|
if self.counter2 == 0 {
|
||
|
self.counter2 = 1;
|
||
|
state.sound_manager.play_sfx(65);
|
||
|
}
|
||
|
} else {
|
||
|
self.counter2 = 0;
|
||
|
}
|
||
|
|
||
|
let level = self.level;
|
||
|
if !player.controller.shoot() {
|
||
|
inventory.reset_current_weapon_xp();
|
||
|
}
|
||
|
|
||
|
match level {
|
||
|
WeaponLevel::Level1 => {
|
||
|
btype = 6;
|
||
|
shoot = false;
|
||
|
}
|
||
|
WeaponLevel::Level2 => btype = 37,
|
||
|
WeaponLevel::Level3 => {
|
||
|
if self.counter2 == 1 {
|
||
|
btype = 39;
|
||
|
} else {
|
||
|
btype = 38;
|
||
|
}
|
||
|
}
|
||
|
WeaponLevel::None => unreachable!(),
|
||
|
}
|
||
|
|
||
|
if bullet_manager.count_bullets_multi(&BULLETS, player_id) > 0 || !(player.controller.trigger_shoot() || shoot) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if !self.consume_ammo(1) {
|
||
|
state.sound_manager.play_sfx(37);
|
||
|
} else {
|
||
|
match player.direction {
|
||
|
Direction::Left if player.up => {
|
||
|
bullet_manager.create_bullet(player.x - 0x200, player.y - 0x1000, btype, player_id, Direction::Up, &state.constants);
|
||
|
state.create_caret(player.x - 0x200, player.y - 0x1000, CaretType::Shoot, Direction::Left);
|
||
|
}
|
||
|
Direction::Right if player.up => {
|
||
|
bullet_manager.create_bullet(player.x + 0x200, player.y - 0x1000, btype, player_id, Direction::Up, &state.constants);
|
||
|
state.create_caret(player.x + 0x200, player.y - 0x1000, CaretType::Shoot, Direction::Left);
|
||
|
}
|
||
|
Direction::Left if player.down => {
|
||
|
bullet_manager.create_bullet(player.x - 0x200, player.y + 0x1000, btype, player_id, Direction::Bottom, &state.constants);
|
||
|
state.create_caret(player.x - 0x200, player.y + 0x1000, CaretType::Shoot, Direction::Left);
|
||
|
}
|
||
|
Direction::Right if player.down => {
|
||
|
bullet_manager.create_bullet(player.x + 0x200, player.y + 0x1000, btype, player_id, Direction::Bottom, &state.constants);
|
||
|
state.create_caret(player.x + 0x200, player.y + 0x1000, CaretType::Shoot, Direction::Left);
|
||
|
}
|
||
|
Direction::Left => {
|
||
|
bullet_manager.create_bullet(player.x - 0xc00, player.y + 0x600, btype, player_id, Direction::Left, &state.constants);
|
||
|
state.create_caret(player.x - 0xc00, player.y + 0x600, CaretType::Shoot, Direction::Left);
|
||
|
}
|
||
|
Direction::Right => {
|
||
|
bullet_manager.create_bullet(player.x + 0xc00, player.y + 0x600, btype, player_id, Direction::Right, &state.constants);
|
||
|
state.create_caret(player.x + 0xc00, player.y + 0x600, CaretType::Shoot, Direction::Right);
|
||
|
}
|
||
|
_ => {}
|
||
|
}
|
||
|
|
||
|
let sound = match btype {
|
||
|
6 => 49,
|
||
|
37 => 62,
|
||
|
38 => 63,
|
||
|
39 => 64,
|
||
|
_ => 0,
|
||
|
};
|
||
|
|
||
|
state.sound_manager.play_sfx(sound);
|
||
|
}
|
||
|
}
|
||
|
}
|