damage per head (#32)

This commit is contained in:
extrawurst
2025-04-18 23:48:44 +02:00
committed by GitHub
parent 72b88cc9a4
commit 7cb2475d9b
9 changed files with 75 additions and 51 deletions

View File

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