Merge remote-tracking branch 'refs/remotes/origin/master'

This commit is contained in:
2025-04-18 23:48:53 +02:00
6 changed files with 54 additions and 33 deletions

View File

@@ -1,20 +1,20 @@
([
(key:"angry demonstrator", ability:Thrown, ammo: 10, range:90, projectile:"molotov"),//0
(key:"carnival knife thrower", range:60, ammo: 5, ),//1
(key:"chicago gangster", ability:Gun, ammo: 25, range:60),//2
(key:"commando", ability:Gun, ammo: 26, range:60),//3
(key:"field medic"),//4
(key:"geisha"),//5
(key:"goblin", ability:Arrow, ammo: 5, range:90),//6
(key:"green grocer", range:60, ammo: 10, ),//7
(key:"highland hammer thrower", ability:Thrown, ammo: 10, range:80, projectile:"hammer"),//8
(key:"legionnaire", ability:Gun, ammo: 25, range:60),//9
(key:"mig pilot", ability:Gun, ammo: 5, range:60, controls:Plane),//10
(key:"nanny", ability:Thrown, range:60),//11
(key:"panic attack"),//12
(key:"salty sea dog"),//13
(key:"snow plough operator"),//14
(key:"soldier ant"),//15
(key:"super market shopper", ability:Thrown, ammo: 10, range:80, projectile:"handbag"),//16
(key:"troll", ability:Thrown, ammo: 10, range:80),//17
/*00*/(key:"angry demonstrator", ability:Thrown, ammo: 10, range:90, damage:25, projectile:"molotov"),
/*01*/(key:"carnival knife thrower", range:60, ammo: 5 ),
/*02*/(key:"chicago gangster", ability:Gun, ammo: 25, range:60),
/*03*/(key:"commando", ability:Gun, ammo: 26, range:60, damage:12),
/*04*/(key:"field medic"),
/*05*/(key:"geisha"),
/*06*/(key:"goblin", ability:Arrow, ammo: 5, range:90, damage:50),
/*07*/(key:"green grocer", range:60, ammo: 10, damage: 25),
/*08*/(key:"highland hammer thrower", ability:Thrown, ammo: 10, damage: 25, range:80, projectile:"hammer"),
/*09*/(key:"legionnaire", ability:Gun, ammo: 25, range:60, damage: 13),
/*10*/(key:"mig pilot", ability:Gun, ammo: 5, range:60, damage:100, controls:Plane),
/*11*/(key:"nanny", ability:Thrown, range:60),
/*12*/(key:"panic attack"),
/*13*/(key:"salty sea dog"),
/*14*/(key:"snow plough operator"),
/*15*/(key:"soldier ant"),
/*16*/(key:"super market shopper", ability:Thrown, ammo: 10, range:80, damage: 17, projectile:"handbag"),
/*17*/(key:"troll", ability:Thrown, ammo: 10, range:80, damage: 17),
])

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 {

View File

@@ -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()),

View File

@@ -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,9 +109,11 @@ fn enemy_hit(
(*e2, query_shot.get(*e1))
};
let damage = projectile.map(|p| p.damage).unwrap_or_default();
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 });
}
}
}
fn on_trigger_state(

View File

@@ -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.,

View File

@@ -22,6 +22,8 @@ pub struct HeadStats {
pub projectile: String,
#[serde(default = "default_ammo")]
pub ammo: u32,
#[serde(default)]
pub damage: u32,
}
fn default_ammo() -> u32 {