Skip to content

Commit

Permalink
restructure!: Remove demon boss hitbox in favor of explosions
Browse files Browse the repository at this point in the history
  • Loading branch information
PraxTube committed Dec 19, 2023
1 parent c5c9c70 commit 95a2988
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 64 deletions.
9 changes: 5 additions & 4 deletions src/enemy/demon_boss/explosion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,26 +225,27 @@ fn spawn_strike_explosions(
let num = 5;
let dis = 100.0;
let delay = 0.1;
let offset = Vec3::new(0.0, -40.0, 0.0);
for i in 0..num {
let offset = if sprite.flip_x {
let dir = if sprite.flip_x {
Quat::from_rotation_z(PI * i as f32 / num as f32).mul_vec3(Vec3::X)
} else {
Quat::from_rotation_z(PI - PI * i as f32 / num as f32).mul_vec3(Vec3::X)
};
let pos = transform.translation + dis * offset;
let pos = transform.translation + dis * dir + offset;

commands.spawn(ExplosionDelayTimer {
timer: Timer::from_seconds(delay * i as f32, TimerMode::Once),
pos,
normal_explosion: false,
});

let offset = if sprite.flip_x {
let dir = if sprite.flip_x {
Quat::from_rotation_z(2.0 * PI - PI * i as f32 / num as f32).mul_vec3(Vec3::X)
} else {
Quat::from_rotation_z(PI + PI * i as f32 / num as f32).mul_vec3(Vec3::X)
};
let pos = transform.translation + dis * offset;
let pos = transform.translation + dis * dir + offset;

commands.spawn(ExplosionDelayTimer {
timer: Timer::from_seconds(delay * i as f32, TimerMode::Once),
Expand Down
2 changes: 1 addition & 1 deletion src/enemy/demon_boss/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ impl DemonBossRage {
impl Default for DemonBoss {
fn default() -> Self {
Self {
damage: 999.0,
damage: 2.0,
rage: DemonBossRage {
active: false,
rage_stack: 0,
Expand Down
15 changes: 3 additions & 12 deletions src/enemy/demon_boss/spawn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,6 @@ fn spawn_demon_boss(mut commands: Commands, assets: Res<GameAssets>) {
TransformBundle::from(Transform::from_translation(Vec3::new(0.0, -30.0, 0.0))),
))
.id();
let strike_hitbox = commands
.spawn((
DemonCollider,
DemonBossStrike::default(),
Sensor,
Collider::cuboid(25.0, 15.0),
CollisionGroups::default(),
TransformBundle::default(),
))
.id();

commands
.spawn((
Expand All @@ -65,8 +55,9 @@ fn spawn_demon_boss(mut commands: Commands, assets: Res<GameAssets>) {
Velocity::zero(),
DemonBoss::default(),
DemonBossStepsTimer::default(),
DemonBossStrike::default(),
Enemy { damage: 0.0 },
Health::new(100.0),
Health::new(10.0),
animator,
YSort(36.0 * SCALE * TRANSLATION_TO_PIXEL),
SpriteSheetBundle {
Expand All @@ -78,7 +69,7 @@ fn spawn_demon_boss(mut commands: Commands, assets: Res<GameAssets>) {
..default()
},
))
.push_children(&[shadow, collider, strike_hitbox]);
.push_children(&[shadow, collider]);
}

fn despawn_demon_boss(
Expand Down
3 changes: 3 additions & 0 deletions src/enemy/demon_boss/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@ fn switch_to_casting(
if demon_boss.state == DemonBossState::Casting {
return;
}
if demon_boss.state == DemonBossState::Striking {
return;
}

let dis = player_pos
.truncate()
Expand Down
55 changes: 11 additions & 44 deletions src/enemy/demon_boss/strike.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use bevy_trickfilm::prelude::*;

use crate::{utils::COLLISION_GROUPS_NONE, GameState};
use crate::GameState;

use super::{DemonBoss, DemonBossState};

pub const STRIKE_HITBOX_OFFSET: Vec3 = Vec3::new(100.0, -25.0, 0.0);
const STRIKE_HITBOX_START: f32 = 1.2;
const STRIKE_HITBOX_TIME: f32 = 0.2;
const ACTIVE_GROUPS: CollisionGroups = CollisionGroups::new(Group::ALL, Group::ALL);

#[derive(Component, Default)]
#[derive(Component)]
#[derive(Default)]
pub struct DemonBossStrike {
pub striked: bool,
pub spawned_explosions: bool,
Expand All @@ -22,6 +20,8 @@ pub struct StrikeCooldown {
timer: Timer,
}



fn spawn_strike_cooldown(
mut commands: Commands,
q_demon_boss: Query<&DemonBoss>,
Expand Down Expand Up @@ -56,15 +56,15 @@ fn despawn_strike_cooldown(
}
}

fn toggle_hitbox(
fn strike(
q_demon_boss: Query<(&DemonBoss, &AnimationPlayer2D)>,
mut q_strike_hitbox: Query<(&mut CollisionGroups, &mut DemonBossStrike)>,
mut q_strike_hitbox: Query<&mut DemonBossStrike>,
) {
let (demon_boss, animator) = match q_demon_boss.get_single() {
Ok(r) => r,
Err(_) => return,
};
let (mut collision_groups, mut strike) = match q_strike_hitbox.get_single_mut() {
let mut strike = match q_strike_hitbox.get_single_mut() {
Ok(r) => r,
Err(_) => return,
};
Expand All @@ -75,36 +75,8 @@ fn toggle_hitbox(
return;
}

if animator.elapsed() >= STRIKE_HITBOX_START
&& animator.elapsed() <= STRIKE_HITBOX_START + STRIKE_HITBOX_TIME
{
strike.striked = true;
*collision_groups = ACTIVE_GROUPS;
} else {
strike.striked = false;
*collision_groups = COLLISION_GROUPS_NONE;
}
}

fn update_hitbox_position(
q_demon_boss: Query<&TextureAtlasSprite, With<DemonBoss>>,
mut q_strike_hitbox: Query<&mut Transform, With<DemonBossStrike>>,
) {
let sprite = match q_demon_boss.get_single() {
Ok(r) => r,
Err(_) => return,
};
let mut transform = match q_strike_hitbox.get_single_mut() {
Ok(r) => r,
Err(_) => return,
};

let sign = if sprite.flip_x { 1.0 } else { -1.0 };
transform.translation = Vec3::new(
sign * STRIKE_HITBOX_OFFSET.x,
STRIKE_HITBOX_OFFSET.y,
STRIKE_HITBOX_OFFSET.z,
);
strike.striked = animator.elapsed() >= STRIKE_HITBOX_START
&& animator.elapsed() <= STRIKE_HITBOX_START + STRIKE_HITBOX_TIME;
}

pub struct DemonBossAttackPlugin;
Expand All @@ -113,12 +85,7 @@ impl Plugin for DemonBossAttackPlugin {
fn build(&self, app: &mut App) {
app.add_systems(
Update,
(
spawn_strike_cooldown,
despawn_strike_cooldown,
toggle_hitbox,
update_hitbox_position,
)
(spawn_strike_cooldown, despawn_strike_cooldown, strike)
.run_if(in_state(GameState::Gaming)),
);
}
Expand Down
5 changes: 2 additions & 3 deletions src/spell/phantasma.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;

use crate::player::Player;
use crate::GameState;
use crate::{player::Player, utils::COLLISION_GROUPS_NONE};

use super::{Spell, SpellCasted};

Expand All @@ -19,7 +19,6 @@ const PHANTASMA_COLOR: Color = Color::Rgba {
alpha: 0.5,
};
const DEFAULT_COLLISION_GROUPS: CollisionGroups = CollisionGroups::new(Group::ALL, Group::ALL);
const PHANTASMA_COLLISION_GROUPS: CollisionGroups = CollisionGroups::new(Group::NONE, Group::NONE);

#[derive(Component)]
struct PhantasmaTimer {
Expand Down Expand Up @@ -51,7 +50,7 @@ fn activate_phantasma(

for child in children {
if let Ok(mut c) = q_colliders.get_mut(*child) {
*c = PHANTASMA_COLLISION_GROUPS;
*c = COLLISION_GROUPS_NONE;
break;
};
}
Expand Down

0 comments on commit 95a2988

Please sign in to comment.