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
|
/*00*/(key:"angry demonstrator", ability:Thrown, ammo: 10, range:90, damage:25, projectile:"molotov"),
|
||||||
(key:"carnival knife thrower", range:60, ammo: 5, ),//1
|
/*01*/(key:"carnival knife thrower", range:60, ammo: 5 ),
|
||||||
(key:"chicago gangster", ability:Gun, ammo: 25, range:60),//2
|
/*02*/(key:"chicago gangster", ability:Gun, ammo: 25, range:60),
|
||||||
(key:"commando", ability:Gun, ammo: 26, range:60),//3
|
/*03*/(key:"commando", ability:Gun, ammo: 26, range:60, damage:12),
|
||||||
(key:"field medic"),//4
|
/*04*/(key:"field medic"),
|
||||||
(key:"geisha"),//5
|
/*05*/(key:"geisha"),
|
||||||
(key:"goblin", ability:Arrow, ammo: 5, range:90),//6
|
/*06*/(key:"goblin", ability:Arrow, ammo: 5, range:90, damage:50),
|
||||||
(key:"green grocer", range:60, ammo: 10, ),//7
|
/*07*/(key:"green grocer", range:60, ammo: 10, damage: 25),
|
||||||
(key:"highland hammer thrower", ability:Thrown, ammo: 10, range:80, projectile:"hammer"),//8
|
/*08*/(key:"highland hammer thrower", ability:Thrown, ammo: 10, damage: 25, range:80, projectile:"hammer"),
|
||||||
(key:"legionnaire", ability:Gun, ammo: 25, range:60),//9
|
/*09*/(key:"legionnaire", ability:Gun, ammo: 25, range:60, damage: 13),
|
||||||
(key:"mig pilot", ability:Gun, ammo: 5, range:60, controls:Plane),//10
|
/*10*/(key:"mig pilot", ability:Gun, ammo: 5, range:60, damage:100, controls:Plane),
|
||||||
(key:"nanny", ability:Thrown, range:60),//11
|
/*11*/(key:"nanny", ability:Thrown, range:60),
|
||||||
(key:"panic attack"),//12
|
/*12*/(key:"panic attack"),
|
||||||
(key:"salty sea dog"),//13
|
/*13*/(key:"salty sea dog"),
|
||||||
(key:"snow plough operator"),//14
|
/*14*/(key:"snow plough operator"),
|
||||||
(key:"soldier ant"),//15
|
/*15*/(key:"soldier ant"),
|
||||||
(key:"super market shopper", ability:Thrown, ammo: 10, range:80, projectile:"handbag"),//16
|
/*16*/(key:"super market shopper", ability:Thrown, ammo: 10, range:80, damage: 17, projectile:"handbag"),
|
||||||
(key:"troll", ability:Thrown, ammo: 10, range:80),//17
|
/*17*/(key:"troll", ability:Thrown, ammo: 10, range:80, damage: 17),
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use super::TriggerArrow;
|
use super::TriggerArrow;
|
||||||
use crate::{
|
use crate::{
|
||||||
GameState, billboards::Billboard, global_observer, hitpoints::Hit, loading_assets::GameAssets,
|
GameState, billboards::Billboard, global_observer, heads_database::HeadsDatabase,
|
||||||
physics_layers::GameLayer, sounds::PlaySound, utils::sprite_3d_animation::AnimationTimer,
|
hitpoints::Hit, loading_assets::GameAssets, physics_layers::GameLayer, sounds::PlaySound,
|
||||||
|
utils::sprite_3d_animation::AnimationTimer,
|
||||||
};
|
};
|
||||||
use avian3d::prelude::*;
|
use avian3d::prelude::*;
|
||||||
use bevy::{pbr::NotShadowCaster, prelude::*};
|
use bevy::{pbr::NotShadowCaster, prelude::*};
|
||||||
@@ -9,7 +10,9 @@ use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams};
|
|||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
struct ArrowProjectile;
|
struct ArrowProjectile {
|
||||||
|
damage: u32,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Resource)]
|
#[derive(Resource)]
|
||||||
struct ShotAssets {
|
struct ShotAssets {
|
||||||
@@ -38,6 +41,7 @@ fn on_trigger_arrow(
|
|||||||
trigger: Trigger<TriggerArrow>,
|
trigger: Trigger<TriggerArrow>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
query_transform: Query<&Transform>,
|
query_transform: Query<&Transform>,
|
||||||
|
heads_db: Res<HeadsDatabase>,
|
||||||
) {
|
) {
|
||||||
let state = trigger.0;
|
let state = trigger.0;
|
||||||
|
|
||||||
@@ -57,17 +61,18 @@ fn on_trigger_arrow(
|
|||||||
let mut t = Transform::from_translation(state.pos).with_rotation(rotation);
|
let mut t = Transform::from_translation(state.pos).with_rotation(rotation);
|
||||||
t.translation += (t.forward().as_vec3() * 2.) + (Vec3::Y * 0.6);
|
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(
|
fn update(
|
||||||
mut cmds: Commands,
|
mut cmds: Commands,
|
||||||
query: Query<(Entity, &Transform), With<ArrowProjectile>>,
|
query: Query<(Entity, &Transform, &ArrowProjectile)>,
|
||||||
spatial_query: SpatialQuery,
|
spatial_query: SpatialQuery,
|
||||||
assets: Res<ShotAssets>,
|
assets: Res<ShotAssets>,
|
||||||
mut sprite_params: Sprite3dParams,
|
mut sprite_params: Sprite3dParams,
|
||||||
) {
|
) {
|
||||||
for (e, t) in query.iter() {
|
for (e, t, arrow) in query.iter() {
|
||||||
let filter = SpatialQueryFilter::from_mask(LayerMask(
|
let filter = SpatialQueryFilter::from_mask(LayerMask(
|
||||||
GameLayer::Level.to_bits() | GameLayer::Npc.to_bits(),
|
GameLayer::Level.to_bits() | GameLayer::Npc.to_bits(),
|
||||||
));
|
));
|
||||||
@@ -80,7 +85,9 @@ fn update(
|
|||||||
&ShapeCastConfig::from_max_distance(150.),
|
&ShapeCastConfig::from_max_distance(150.),
|
||||||
&filter,
|
&filter,
|
||||||
) {
|
) {
|
||||||
cmds.entity(first_hit.entity).trigger(Hit { damage: 50 });
|
cmds.entity(first_hit.entity).trigger(Hit {
|
||||||
|
damage: arrow.damage,
|
||||||
|
});
|
||||||
|
|
||||||
cmds.spawn(
|
cmds.spawn(
|
||||||
Sprite3dBuilder {
|
Sprite3dBuilder {
|
||||||
|
|||||||
@@ -76,7 +76,9 @@ fn on_trigger_gun(
|
|||||||
GunProjectile {
|
GunProjectile {
|
||||||
time: time.elapsed_secs(),
|
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.)),
|
Collider::capsule_endpoints(0.5, Vec3::new(0., 0., 0.), Vec3::new(0., 0., -3.)),
|
||||||
CollisionLayers::new(
|
CollisionLayers::new(
|
||||||
LayerMask(GameLayer::Projectile.to_bits()),
|
LayerMask(GameLayer::Projectile.to_bits()),
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct Projectile {
|
pub struct Projectile {
|
||||||
pub damage: u32,
|
pub owner_head: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Event, Reflect)]
|
#[derive(Event, Reflect)]
|
||||||
@@ -93,6 +93,7 @@ fn enemy_hit(
|
|||||||
mut collision_event_reader: EventReader<CollisionStarted>,
|
mut collision_event_reader: EventReader<CollisionStarted>,
|
||||||
query_shot: Query<&Projectile>,
|
query_shot: Query<&Projectile>,
|
||||||
query_npc: Query<&EnemySpawn>,
|
query_npc: Query<&EnemySpawn>,
|
||||||
|
heads_db: Res<HeadsDatabase>,
|
||||||
) {
|
) {
|
||||||
for CollisionStarted(e1, e2) in collision_event_reader.read() {
|
for CollisionStarted(e1, e2) in collision_event_reader.read() {
|
||||||
if !query_shot.contains(*e1) && !query_shot.contains(*e2) {
|
if !query_shot.contains(*e1) && !query_shot.contains(*e2) {
|
||||||
@@ -108,9 +109,11 @@ fn enemy_hit(
|
|||||||
(*e2, query_shot.get(*e1))
|
(*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 });
|
commands.entity(enemy_entity).trigger(Hit { damage });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_trigger_state(
|
fn on_trigger_state(
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ use std::f32::consts::PI;
|
|||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
struct ThrownProjectile {
|
struct ThrownProjectile {
|
||||||
impact_animation: bool,
|
impact_animation: bool,
|
||||||
|
damage: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Component, Reflect)]
|
#[derive(Component, Reflect)]
|
||||||
@@ -126,6 +127,7 @@ fn on_trigger_thrown(
|
|||||||
Name::new("projectile-thrown"),
|
Name::new("projectile-thrown"),
|
||||||
ThrownProjectile {
|
ThrownProjectile {
|
||||||
impact_animation: explosion_animation,
|
impact_animation: explosion_animation,
|
||||||
|
damage: head.damage,
|
||||||
},
|
},
|
||||||
Collider::sphere(0.5),
|
Collider::sphere(0.5),
|
||||||
CollisionLayers::new(
|
CollisionLayers::new(
|
||||||
@@ -157,9 +159,14 @@ fn shot_collision(
|
|||||||
|
|
||||||
let shot_entity = if query_shot.contains(*e1) { *e1 } else { *e2 };
|
let shot_entity = if query_shot.contains(*e1) { *e1 } else { *e2 };
|
||||||
|
|
||||||
let Ok((shot_pos, animation)) = query_shot
|
let Ok((shot_pos, animation, damage)) =
|
||||||
.get(shot_entity)
|
query_shot.get(shot_entity).map(|(projectile, t)| {
|
||||||
.map(|(projectile, t)| (t.translation, projectile.impact_animation))
|
(
|
||||||
|
t.translation,
|
||||||
|
projectile.impact_animation,
|
||||||
|
projectile.damage,
|
||||||
|
)
|
||||||
|
})
|
||||||
else {
|
else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
@@ -169,7 +176,7 @@ fn shot_collision(
|
|||||||
commands.trigger(PlaySound::ThrowHit);
|
commands.trigger(PlaySound::ThrowHit);
|
||||||
|
|
||||||
commands.trigger(Explosion {
|
commands.trigger(Explosion {
|
||||||
damage: 20,
|
damage,
|
||||||
position: shot_pos,
|
position: shot_pos,
|
||||||
//TODO: should be around 1 grid in distance
|
//TODO: should be around 1 grid in distance
|
||||||
radius: 5.,
|
radius: 5.,
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ pub struct HeadStats {
|
|||||||
pub projectile: String,
|
pub projectile: String,
|
||||||
#[serde(default = "default_ammo")]
|
#[serde(default = "default_ammo")]
|
||||||
pub ammo: u32,
|
pub ammo: u32,
|
||||||
|
#[serde(default)]
|
||||||
|
pub damage: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_ammo() -> u32 {
|
fn default_ammo() -> u32 {
|
||||||
|
|||||||
Reference in New Issue
Block a user