From c9f17e413068d5261c197761df3f745a6b522c83 Mon Sep 17 00:00:00 2001 From: extrawurst <776816+extrawurst@users.noreply.github.com> Date: Sun, 27 Apr 2025 23:03:18 +0200 Subject: [PATCH] simple missile ability and sound (#38) --- assets/all.headsdb.ron | 2 +- assets/models/projectiles/missile.glb | Bin 0 -> 14688 bytes assets/sfx/abilities/missile-explosion.ogg | Bin 0 -> 32698 bytes src/abilities/missile.rs | 224 +++++++++++++++++++++ src/abilities/mod.rs | 6 + src/loading_assets.rs | 3 + src/sounds.rs | 2 + 7 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 assets/models/projectiles/missile.glb create mode 100644 assets/sfx/abilities/missile-explosion.ogg create mode 100644 src/abilities/missile.rs diff --git a/assets/all.headsdb.ron b/assets/all.headsdb.ron index 0ac7730..6d74dd1 100644 --- a/assets/all.headsdb.ron +++ b/assets/all.headsdb.ron @@ -9,7 +9,7 @@ /*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), + /*10*/(key:"mig pilot", ability:Missile, ammo: 5, range:60, damage:100, controls:Plane), /*11*/(key:"nanny", ability:Thrown, range:60), /*12*/(key:"panic attack"), /*13*/(key:"salty sea dog"), diff --git a/assets/models/projectiles/missile.glb b/assets/models/projectiles/missile.glb new file mode 100644 index 0000000000000000000000000000000000000000..740df1ada63e5b2dac20c6476629d9a2b79d1204 GIT binary patch literal 14688 zcmds8d3038(ytDLHTc37!X8FIzzNJ`At8`S0tuT5K@u>EK(--7CkvAVf{0v{$0~xN zsK^o?$SMc{G$_j;C?JpRAs`PCQ1}D^39?7jS9SaLolck`;T-+vyT{vAUAOx8tLo~m z3Fn=cVN2}o0RYL}0IJsj=${ZjV7wtEFVC892pex0W3}gH=42bf3;~@@2BRUvnr*eG zmz>n%0LzoHOv?b#W_MH5bd^L`tCZnlyh$+Nu>KYPiHivc% z4hji2x-fP{sC;`$cAibF3^fKAO-}Z-g4CSMbj&Hsnl}phCK$&X(ne+4((P8vcc^I? z1(RAZa-`KhB-1*UXTj%cbgAR=t??sAsvCvD(lpkZoso}NL8ia}WKXeY&@KiBb?b^# za!AOxXQpH7<^W=I1IAbXb$Fqsu0iGF3+Nge`q2179}=F~6cVhZBk~O;0y*8lhpjhv zHFqr^k2%;BBunZdVYUU%p*|ffBA0HKA8jY}6q2!e*u5ZO=@x@uK9W+T*PGDK=YX+Mt|*j8S<1 z@xyq$W!%_1B~5J~cxCM3yRhL7r>5jtd*#@2?1|RG`~o}Hal9cjJKc(vGfkL)C%~3F zDkTmZ1NM)&sD!8R{;H;41^GE6N1{__Q?SvHo>P!&vnJqOOE-k&+Y798c=9K<% zE7yiiiuz1mPJulQ0jcHi&ZN2We#AZbvaFPh-kCP)ZeiU*0`L-HiOUsLd#bOa#yxVpe9Bm7i2@?UI|Ff!R1a4)zgRLhVUgl55Y*%FNFkBM{VWz^j*% zk9{SzAfN2x4Fls7`X%;@AD|{QAbwC>R4jHJqaiUSsaJgbpy&}MLm2iS+SW|GP8c24 zn%5B5Ou)uB!7nlppl81U_{*R~07ORN8_9LW;nc}a5BZRt9%YB*uj#_BuSL7=k85Ro z9n&2S`d7q}W0Sd5UB;I&AA+ODp!o<)-Htds{*N<0cc31%)KnWK>?EDrUasuTDzCPd#~^cYf9}IEIWNYh;*hV5$$j`f%XZnH>wKSOd|8)$WM0&9pLk7WOqsWW zUH9i}^*TmU?#St=z=i&L-Szqk-j1<`okGWT4%GGfRpmP)KhG)-?G^H>I^l31omaPGF1kP0d5(Oo z&Wk==mwh-U=S3Yk6!mP#nB0f+R?lk4@-KfBlYN zJo>qMK-c{BbEVCxXE-<}(ETGFeSjolsIO|5{kiV4x2tZ%cKcH9ay&@N9kJT~td_|7VehUur7kN3?mXE>d|6uQR)=u;38#DvG8gK)569%Z z7#rGoj@-v3uj)hivOm{(jxxTi%RVwM>N|;7tA&cM)l09h%q9DC{lVT|feZ2Vy6g8> z;Aq%-3~1MRg^zY7RUfCnen({d2XxI}=8fWi|DSarKI#fe(oK?`bYUl-NPN9_I(VpfJj{;n_ujw^f_Q>=A`6Dh?*I0BRG72`KyZn{6}!k^BGu#+zA!e7l@ z^HDK1A7LkdVV7})Zj#mtF5xe82^={Fp$mUkn1t^RNB9ezvs8-;@d#e=?^A{Fw12M& zop9ch?5d9cb|bs$qv^sr%gR@|Sk>5kE&% zMgO_e&UQTC_y~78fmOzfK9nbD`Btja{!00})Dcdpj923$YO1fw`!JpMSE{c|oxmhs zH~OR9o5b4jDi(PgmP?MOGG6t&mTy&bk*|UZK57h#s+QLu%B%6wvMTjw7x)oqQ(V}ISJ++Xyv`5n z$+%pN{lWf0Y!B}Fn$@fIzZI*Z6AFLyGl$d4^apu04B7|nDd(f+z&})q{RqB=0%T3!hNlvqH`!q{Y_WAHn+T62TJlVifnn74? z@!e}N#r_Miowy=Cf#Wszpo+)kG!1{6j^o=txE$W$ji#fdA|ce1wsLi%d;^~HQwVZOKU`xcC^4Dr6ecQ?jQXU>_k$d}i5vbO(1 z`fB(jIgZ!dugl@lxue(wuE67UoQ&t0>MNwLhEI~?B%S}S8mEX4V*|=r;0nAgvyu^~ z6yumA$r1~xNm!g zF&qxRc(N7B4)~h1yu7u1g#_UHKv4`-&zW!g6t$MTk0^-YgX_SNRJRWP=0D9`G+B0hoRHFq9<--Pj!Ow#a^@cwcfueo#3 z?!>!zatLxUd^xVb6F61IuIAx)Q z+Y2#HfwNM(uRLGE^KBo6F>qXgM}3WOsE;^hp@vVt69Q+YcJDbJ#dY!Ia21c^c0k>v zqi1_Hd)q~TLt)VhLJXC05u9mU1Zp%ahyrA-#zr-V$>@b&WobPnZw>0Z#j z30x5$|K0J%yy*8xNC0lfUtk?)V7YoY?-|DxcmjvtFK_Ms;V-j_kLlrkF)-blcc`^d{K|YH6&?XOPiCV7x0^~`Dt^K zw5A9palfZYn$zD2G$*+XC2^8$g>(9iqB%*LC!?hGB+0)}o0FtD#Y5leAxU$x(?c>@ zi@QjZG^bc;F5(xqIcW34Z!{-K^RxKUUO6;Lb3biPay|Odcak(O(dHy+4(PAOhf>6& z=A+HmYu^=3(wzKgPSO`~4x>)82qnc#bCE*_oYO7lu(8OhybN1Uyiq&dY!bCP>C zJ4u=!*5)MrBIy4cz`z6FYET2JgC~xjP!sAvEvSuSZKw;6ffv-nu^#*b8h|&{$FV*% z1RrPwjd5%YO~4nLLNjO%EubZiEuj^(20v&626!CWLOW;=PvH0jbbyY~37!Na_(Nyt z0wyryXodg?gdhlpt`GvD&<(<%JC5C<2X3zg(~E>C=n1_b8e(vaf!@#u`a(bG4^KfX z#K8cF$1xrT!qYGa5+D%;MPsgfCzh?1nGlE7*hM9@q=};A_|q|Aqr_5Dvj%ID+F5_zxU~Z{Qdl zhZFEEoP__vDI8D1cW@fMhcj>%&cP4xBbTSWQ-k)nc`Atj+4O z$CwwZhhshV57vNrv-&vJXAPMTYs4Dk*qAk8&6qE1ieppOoV8*tSW6sRvewMN{8$?t z+px!3d)Ah7j#U0Dzd#xaB9HE`TzN!gErhm9=M^uk3KC!;+t>b;x{g()%BtvAiB<+cYCB zV%WATo0mQHPP=*QZvJxQ#>^|Br#qM3`SsSR3HK+SJG0ob_3{@x?tFea_vKGd6`Z^L zp{4AOW#XS(R^Iqw-_oIBQ~&TewczlA%PU&n{N|a6+ncW+FZ(0t`jNXe?{x9`sqD8y zw@Ux0)w2^Uy&m5>;`wjx-Tv`J=_}P=h1~X|p(teHfxAhc)?6~x&r|vSe(;ZJ3tLSF zk0$WNv522H&-X0Gy%_|{qAzE^adpnIh{ya7dZhWALh^Ut->}%PZhD5Y<=7d!k2kQj z{)=in59`~m@lRJiJa*;OWc$Lud$n51xOdU_3Iwpe z<{g`jelXx#>yQoMSBmSW?}G^o-ZY-w&~T+!Zdu!_9?FL`l08gs9P;S-;&^tl$!m}8 z9Cm8S2l=1a&3o%)UER}i;ZF^^)cm+<>pjaWIjtfovl z^;}?w#@7<7*$(t6?BP*#?pk%nv62ATdbaBc?*s6A^x-f#{>=)Q_{vLx-j5#{lXiSk zkf-Alh%9!LlzA#U-W@pmV*fXe-krZ>)t*Cf%M)rSJ%-!Pdq)1e_qb9YR@L{MeTYH8 zb<=>A{_~mR+n^({5R`J`Qa>Nh$RCF zz7{wn-5gR-OSu8CaDSlE{XZKMZ@tv{aB*C>U>Mo=t8qPi8o}XaTaT?w0%OcV>#f;G zMqRy>e01x!LB(IrS<-Cm*WeS*)-P)FU4ZhXcNg>-HshXu25SPwDX&M}-m8AyUiRDL zGpadKZFd`v`NVX;`|2;l{F=j>Hp83xJ$tD1!U>;QW1sYxTW?r6BXu?^tr~18ZaD3&na%7cUh+uJda|%x%%cA9 zcYqaMm+EeKW<>Usy0NVnpShg9Zrzj@O3rL`E+dg*74VR?N0>4Ucg zINlFXK5g?<)8wG~_e$Es0=C!u_<#%Nrp#)rWSqD*HDT9@nIX$ZbZ!D3$)AmG_kEk_ zfI83Z&fYxCUa!b&{op4zjIIsF>|>i6z_Fz1anX=Gdd>28VC7f+Z3YjRIW%}}^~m5M zsSWEx(s!#f2ZzJ4(1PXDZ9Yowu8uD+{H*cI%S#3yUCaIV9jdwabe-N)R(UDW2aflK zZ+}R<`g9C<_Z|_fbeXvi?tZ-{WK8wyaEcXg2fyZyc}>7pb8nf4VuPW>VSP)#%XOic t*~T%)80Dibu(!tg3!eXfo&Rid;{*8j{aIr^!j=vFVg^L7>zVxO{{WzN)ouU) literal 0 HcmV?d00001 diff --git a/assets/sfx/abilities/missile-explosion.ogg b/assets/sfx/abilities/missile-explosion.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f1eafd91f47d051b216cd293f5c67c3fc9533eb9 GIT binary patch literal 32698 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 literal 0 HcmV?d00001 diff --git a/src/abilities/missile.rs b/src/abilities/missile.rs new file mode 100644 index 0000000..50b9e69 --- /dev/null +++ b/src/abilities/missile.rs @@ -0,0 +1,224 @@ +use super::TriggerMissile; +use crate::{ + GameState, + billboards::Billboard, + heads_database::HeadsDatabase, + hitpoints::Hit, + loading_assets::GameAssets, + physics_layers::GameLayer, + sounds::PlaySound, + utils::{global_observer, sprite_3d_animation::AnimationTimer}, +}; +use avian3d::prelude::*; +use bevy::{pbr::NotShadowCaster, prelude::*}; +use bevy_polyline::prelude::*; +use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams}; +use std::f32::consts::PI; + +const MAX_SHOT_AGES: f32 = 5.; + +#[derive(Component)] +struct MissileProjectile { + time: f32, + damage: u32, +} + +#[derive(Event, Debug)] +struct Explosion { + position: Vec3, + radius: 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, update, timeout).run_if(in_state(GameState::Playing)), + ); + + global_observer!(app, on_trigger_missile); + global_observer!(app, on_explosion); +} + +fn on_explosion( + explosion: Trigger, + mut commands: Commands, + spatial_query: SpatialQuery, +) { + let explosion = explosion.event(); + let intersections = { + spatial_query.shape_intersections( + &Collider::sphere(explosion.radius), + explosion.position, + Quat::default(), + &SpatialQueryFilter::default().with_mask(LayerMask( + GameLayer::Npc.to_bits() | GameLayer::Player.to_bits(), + )), + ) + }; + + for entity in intersections.iter() { + if let Some(mut e) = commands.get_entity(*entity) { + e.trigger(Hit { + damage: explosion.damage, + }); + } + } +} + +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