From 00c2c08f069f4059d5486783c482ed3a03e66d43 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Sun, 8 Jun 2025 23:58:03 +0200 Subject: [PATCH] curver ability --- assets/all.headsdb.ron | 2 +- assets/models/projectiles/carrot.glb | Bin 0 -> 19764 bytes src/abilities/curver.rs | 199 +++++++++++++++++++++++++++ src/abilities/mod.rs | 6 + src/abilities/thrown.rs | 15 +- src/main.rs | 3 + src/player.rs | 2 +- src/utils/auto_rotate.rs | 17 +++ src/utils/mod.rs | 1 + 9 files changed, 229 insertions(+), 16 deletions(-) create mode 100644 assets/models/projectiles/carrot.glb create mode 100644 src/abilities/curver.rs create mode 100644 src/utils/auto_rotate.rs 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 0000000000000000000000000000000000000000..18a17e7862caf5cdc9b15fc0dcccf0004db1526a GIT binary patch literal 19764 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, + 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