Merge remote-tracking branch 'refs/remotes/origin/master'
This commit is contained in:
@@ -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),
|
||||
])
|
||||
|
||||
@@ -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.,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user