damage per head (#32)
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
use super::TriggerArrow;
|
||||
use crate::{
|
||||
GameState, billboards::Billboard, global_observer, hitpoints::Hit, loading_assets::GameAssets,
|
||||
physics_layers::GameLayer, sounds::PlaySound, utils::sprite_3d_animation::AnimationTimer,
|
||||
GameState, billboards::Billboard, global_observer, heads_database::HeadsDatabase,
|
||||
hitpoints::Hit, loading_assets::GameAssets, physics_layers::GameLayer, sounds::PlaySound,
|
||||
utils::sprite_3d_animation::AnimationTimer,
|
||||
};
|
||||
use avian3d::prelude::*;
|
||||
use bevy::{pbr::NotShadowCaster, prelude::*};
|
||||
@@ -9,7 +10,9 @@ use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams};
|
||||
use std::f32::consts::PI;
|
||||
|
||||
#[derive(Component)]
|
||||
struct ArrowProjectile;
|
||||
struct ArrowProjectile {
|
||||
damage: u32,
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
struct ShotAssets {
|
||||
@@ -38,6 +41,7 @@ fn on_trigger_arrow(
|
||||
trigger: Trigger<TriggerArrow>,
|
||||
mut commands: Commands,
|
||||
query_transform: Query<&Transform>,
|
||||
heads_db: Res<HeadsDatabase>,
|
||||
) {
|
||||
let state = trigger.0;
|
||||
|
||||
@@ -57,17 +61,18 @@ fn on_trigger_arrow(
|
||||
let mut t = Transform::from_translation(state.pos).with_rotation(rotation);
|
||||
t.translation += (t.forward().as_vec3() * 2.) + (Vec3::Y * 0.6);
|
||||
|
||||
commands.spawn((Name::new("projectile-arrow"), ArrowProjectile, t));
|
||||
let damage = heads_db.head_stats(state.head).damage;
|
||||
commands.spawn((Name::new("projectile-arrow"), ArrowProjectile { damage }, t));
|
||||
}
|
||||
|
||||
fn update(
|
||||
mut cmds: Commands,
|
||||
query: Query<(Entity, &Transform), With<ArrowProjectile>>,
|
||||
query: Query<(Entity, &Transform, &ArrowProjectile)>,
|
||||
spatial_query: SpatialQuery,
|
||||
assets: Res<ShotAssets>,
|
||||
mut sprite_params: Sprite3dParams,
|
||||
) {
|
||||
for (e, t) in query.iter() {
|
||||
for (e, t, arrow) in query.iter() {
|
||||
let filter = SpatialQueryFilter::from_mask(LayerMask(
|
||||
GameLayer::Level.to_bits() | GameLayer::Npc.to_bits(),
|
||||
));
|
||||
@@ -80,7 +85,9 @@ fn update(
|
||||
&ShapeCastConfig::from_max_distance(150.),
|
||||
&filter,
|
||||
) {
|
||||
cmds.entity(first_hit.entity).trigger(Hit { damage: 50 });
|
||||
cmds.entity(first_hit.entity).trigger(Hit {
|
||||
damage: arrow.damage,
|
||||
});
|
||||
|
||||
cmds.spawn(
|
||||
Sprite3dBuilder {
|
||||
|
||||
@@ -76,7 +76,9 @@ fn on_trigger_gun(
|
||||
GunProjectile {
|
||||
time: time.elapsed_secs(),
|
||||
},
|
||||
Projectile { damage: 10 },
|
||||
Projectile {
|
||||
owner_head: state.head,
|
||||
},
|
||||
Collider::capsule_endpoints(0.5, Vec3::new(0., 0., 0.), Vec3::new(0., 0., -3.)),
|
||||
CollisionLayers::new(
|
||||
LayerMask(GameLayer::Projectile.to_bits()),
|
||||
|
||||
@@ -20,7 +20,7 @@ use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Projectile {
|
||||
pub damage: u32,
|
||||
pub owner_head: usize,
|
||||
}
|
||||
|
||||
#[derive(Event, Reflect)]
|
||||
@@ -93,6 +93,7 @@ fn enemy_hit(
|
||||
mut collision_event_reader: EventReader<CollisionStarted>,
|
||||
query_shot: Query<&Projectile>,
|
||||
query_npc: Query<&EnemySpawn>,
|
||||
heads_db: Res<HeadsDatabase>,
|
||||
) {
|
||||
for CollisionStarted(e1, e2) in collision_event_reader.read() {
|
||||
if !query_shot.contains(*e1) && !query_shot.contains(*e2) {
|
||||
@@ -108,8 +109,10 @@ fn enemy_hit(
|
||||
(*e2, query_shot.get(*e1))
|
||||
};
|
||||
|
||||
let damage = projectile.map(|p| p.damage).unwrap_or_default();
|
||||
commands.entity(enemy_entity).trigger(Hit { damage });
|
||||
if let Ok(head) = projectile.map(|p| p.owner_head) {
|
||||
let damage = heads_db.head_stats(head).damage;
|
||||
commands.entity(enemy_entity).trigger(Hit { damage });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ use std::f32::consts::PI;
|
||||
#[derive(Component)]
|
||||
struct ThrownProjectile {
|
||||
impact_animation: bool,
|
||||
damage: u32,
|
||||
}
|
||||
|
||||
#[derive(Component, Reflect)]
|
||||
@@ -126,6 +127,7 @@ fn on_trigger_thrown(
|
||||
Name::new("projectile-thrown"),
|
||||
ThrownProjectile {
|
||||
impact_animation: explosion_animation,
|
||||
damage: head.damage,
|
||||
},
|
||||
Collider::sphere(0.5),
|
||||
CollisionLayers::new(
|
||||
@@ -157,9 +159,14 @@ fn shot_collision(
|
||||
|
||||
let shot_entity = if query_shot.contains(*e1) { *e1 } else { *e2 };
|
||||
|
||||
let Ok((shot_pos, animation)) = query_shot
|
||||
.get(shot_entity)
|
||||
.map(|(projectile, t)| (t.translation, projectile.impact_animation))
|
||||
let Ok((shot_pos, animation, damage)) =
|
||||
query_shot.get(shot_entity).map(|(projectile, t)| {
|
||||
(
|
||||
t.translation,
|
||||
projectile.impact_animation,
|
||||
projectile.damage,
|
||||
)
|
||||
})
|
||||
else {
|
||||
continue;
|
||||
};
|
||||
@@ -169,7 +176,7 @@ fn shot_collision(
|
||||
commands.trigger(PlaySound::ThrowHit);
|
||||
|
||||
commands.trigger(Explosion {
|
||||
damage: 20,
|
||||
damage,
|
||||
position: shot_pos,
|
||||
//TODO: should be around 1 grid in distance
|
||||
radius: 5.,
|
||||
|
||||
Reference in New Issue
Block a user