1
0
Fork 0
mirror of https://github.com/doukutsu-rs/doukutsu-rs synced 2024-09-30 05:59:46 +00:00
doukutsu-rs/src/weapon/spur.rs

127 lines
4.8 KiB
Rust
Raw Normal View History

2021-03-09 14:05:38 +00:00
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);
}
}
}