diff --git a/assets/all.headsdb.ron b/assets/all.headsdb.ron index 680e084..583a579 100644 --- a/assets/all.headsdb.ron +++ b/assets/all.headsdb.ron @@ -6,7 +6,7 @@ /*04*/(key:"field medic", ability:Medic, aps:20), /*05*/(key:"geisha"), /*06*/(key:"goblin", ability:Arrow, aps:2, ammo:5, range:90, damage:50), - /*07*/(key:"green grocer", range:60, ammo:10, damage:25), + /*07*/(key:"green grocer", ability:Curver, range:60, ammo:10, damage:25, projectile:"carrot"), /*08*/(key:"highland hammer thrower", ability:Thrown, aps:2, ammo:10, damage:25, range:80, projectile:"hammer"), /*09*/(key:"legionnaire", ability:Gun, aps:1.5, ammo:25, range:60, damage:13), /*10*/(key:"mig pilot", ability:Missile, ammo:5, range:60, damage:100, controls:Plane), diff --git a/assets/models/projectiles/carrot.glb b/assets/models/projectiles/carrot.glb new file mode 100644 index 0000000..18a17e7 Binary files /dev/null and b/assets/models/projectiles/carrot.glb differ diff --git a/src/abilities/curver.rs b/src/abilities/curver.rs new file mode 100644 index 0000000..6091bc1 --- /dev/null +++ b/src/abilities/curver.rs @@ -0,0 +1,199 @@ +use crate::{ + GameState, + abilities::TriggerCurver, + billboards::Billboard, + heads_database::HeadsDatabase, + hitpoints::Hit, + loading_assets::GameAssets, + physics_layers::GameLayer, + tb_entities::EnemySpawn, + utils::{auto_rotate::AutoRotation, global_observer, sprite_3d_animation::AnimationTimer}, +}; +use avian3d::prelude::*; +use bevy::{pbr::NotShadowCaster, prelude::*}; +use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams}; +use std::f32::consts::PI; + +const MAX_SHOT_AGES: f32 = 15.; + +#[derive(Component)] +struct CurverProjectile { + time: f32, + damage: u32, +} + +#[derive(Resource)] +struct ShotAssets { + image: Handle, + layout: Handle, +} + +pub fn plugin(app: &mut App) { + app.add_systems(OnEnter(GameState::Playing), setup); + app.add_systems( + Update, + (shot_collision, enemy_hit).run_if(in_state(GameState::Playing)), + ); + app.add_systems( + FixedUpdate, + (update, timeout).run_if(in_state(GameState::Playing)), + ); + + global_observer!(app, on_trigger_missile); +} + +fn setup(mut commands: Commands, assets: Res, mut sprite_params: Sprite3dParams) { + let layout = TextureAtlasLayout::from_grid(UVec2::splat(256), 7, 6, None, None); + let texture_atlas_layout = sprite_params.atlas_layouts.add(layout); + + commands.insert_resource(ShotAssets { + image: assets.impact_atlas.clone(), + layout: texture_atlas_layout, + }); +} + +fn on_trigger_missile( + trigger: Trigger, + mut commands: Commands, + query_transform: Query<&Transform>, + time: Res