From 3242513612fec10046f72ffad6af499f10ae10e4 Mon Sep 17 00:00:00 2001 From: DRuppFv Date: Mon, 1 Apr 2024 21:24:50 -0300 Subject: [PATCH 1/9] making shooting pressable --- src/core/elements/musket.rs | 3 ++- src/core/player/state.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/elements/musket.rs b/src/core/elements/musket.rs index 00fcbc134f..6906b058a5 100644 --- a/src/core/elements/musket.rs +++ b/src/core/elements/musket.rs @@ -184,6 +184,7 @@ fn update( // If the item is being used let item_used = items_used.remove(entity).is_some(); if item_used && musket.cooldown.finished() { + musket.cooldown = Timer::new(*cooldown, TimerMode::Once); // Empty if musket.ammo.eq(&0) { audio_center.play_sound(*empty_shoot_sound, *empty_shoot_sound_volume); @@ -191,7 +192,7 @@ fn update( } // Reset fire cooldown and subtract ammo - musket.cooldown = Timer::new(*cooldown, TimerMode::Once); + // musket.cooldown = Timer::new(*cooldown, TimerMode::Once); musket.ammo = musket.ammo.saturating_sub(1).clamp(0, musket.ammo); audio_center.play_sound(*shoot_sound, *shoot_sound_volume); diff --git a/src/core/player/state.rs b/src/core/player/state.rs index 0a23147ab6..3ce45eb470 100644 --- a/src/core/player/state.rs +++ b/src/core/player/state.rs @@ -125,7 +125,7 @@ fn use_drop_or_grab_items_system(id: Ustr) -> StaticSystem<(), ()> { } // If we are using an item - if control.shoot_just_pressed && inventory.is_some() { + if control.shoot_pressed && inventory.is_some() { commands.add(PlayerCommand::use_item(player_ent)); } } From 7058b4bde00957a6201efe2a606f8cf64e99b1af Mon Sep 17 00:00:00 2001 From: DRuppFv Date: Mon, 1 Apr 2024 21:30:10 -0300 Subject: [PATCH 2/9] update weapons system to new shooting --- src/core/elements/buss.rs | 5 +++-- src/core/elements/musket.rs | 4 ++-- src/core/elements/periscope.rs | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/core/elements/buss.rs b/src/core/elements/buss.rs index 251bbfc0a2..bd74f0b210 100644 --- a/src/core/elements/buss.rs +++ b/src/core/elements/buss.rs @@ -188,14 +188,15 @@ fn update( // If the item is being used let item_used = items_used.remove(entity).is_some(); if item_used && buss.cooldown.finished() { + // Reset fire cooldown + buss.cooldown = Timer::new(*cooldown, TimerMode::Once); // Empty if buss.ammo.eq(&0) { audio_center.play_sound(*empty_shoot_sound, *empty_shoot_sound_volume); continue; } - // Reset fire cooldown and subtract ammo - buss.cooldown = Timer::new(*cooldown, TimerMode::Once); + // Subtract ammo buss.ammo = buss.ammo.saturating_sub(1).clamp(0, buss.ammo); audio_center.play_sound(*shoot_sound, *shoot_sound_volume); diff --git a/src/core/elements/musket.rs b/src/core/elements/musket.rs index 6906b058a5..edb36d6839 100644 --- a/src/core/elements/musket.rs +++ b/src/core/elements/musket.rs @@ -184,6 +184,7 @@ fn update( // If the item is being used let item_used = items_used.remove(entity).is_some(); if item_used && musket.cooldown.finished() { + // Reset fire cooldown musket.cooldown = Timer::new(*cooldown, TimerMode::Once); // Empty if musket.ammo.eq(&0) { @@ -191,8 +192,7 @@ fn update( continue; } - // Reset fire cooldown and subtract ammo - // musket.cooldown = Timer::new(*cooldown, TimerMode::Once); + // Subtract ammo musket.ammo = musket.ammo.saturating_sub(1).clamp(0, musket.ammo); audio_center.play_sound(*shoot_sound, *shoot_sound_volume); diff --git a/src/core/elements/periscope.rs b/src/core/elements/periscope.rs index 820f7e8927..909a4b0038 100644 --- a/src/core/elements/periscope.rs +++ b/src/core/elements/periscope.rs @@ -186,14 +186,15 @@ fn update( // If the item is being used let item_used = items_used.remove(entity).is_some(); if item_used && periscope.cooldown.finished() { + // Reset fire cooldown + periscope.cooldown = Timer::new(*cooldown, TimerMode::Once); // Empty if periscope.ammo.eq(&0) { audio_center.play_sound(*empty_shoot_sound, *empty_shoot_sound_volume); continue; } - // Reset fire cooldown and subtract ammo - periscope.cooldown = Timer::new(*cooldown, TimerMode::Once); + // Subtract ammo periscope.ammo = periscope.ammo.saturating_sub(1).clamp(0, periscope.ammo); audio_center.play_sound(*shoot_sound, *shoot_sound_volume); From cb7b69c5fa23bff9be82a625182e7c90f7b4042b Mon Sep 17 00:00:00 2001 From: DRuppFv Date: Mon, 1 Apr 2024 22:47:44 -0300 Subject: [PATCH 3/9] machinegun fully coded --- .../bullet/machine_gun.bullet.yaml | 11 + .../bullet/machine_gun_bullet.atlas.yaml | 4 + .../machine_gun/bullet/machine_gun_bullet.png | Bin 0 -> 239 bytes .../machine_gun/explosion/bullet_hit_dull.ogg | Bin 0 -> 4984 bytes .../explosion/explosion.atlas.yaml | 4 + .../item/machine_gun/explosion/explosion.png | Bin 0 -> 380 bytes .../item/machine_gun/machine_gun.atlas.yaml | 4 + .../item/machine_gun/machine_gun.element.yaml | 3 +- .../elements/item/machine_gun/machine_gun.png | Bin 0 -> 745 bytes .../item/machine_gun/machine_gun.yaml | 25 ++ .../item/machine_gun/shoot/gun_empty.ogg | Bin 0 -> 4934 bytes .../shoot/machine_gun_shoot.atlas.yaml | 4 + .../shoot/machine_gun_shooting.png | Bin 0 -> 735 bytes .../elements/item/machine_gun/shoot/shoot.ogg | Bin 0 -> 37156 bytes assets/game.yaml | 1 + assets/map/levels/level_7.map.yaml | 2 +- src/core/elements.rs | 4 +- src/core/elements/machine_gun.rs | 298 ++++++++++++++++++ 18 files changed, 357 insertions(+), 3 deletions(-) create mode 100644 assets/elements/item/machine_gun/bullet/machine_gun.bullet.yaml create mode 100644 assets/elements/item/machine_gun/bullet/machine_gun_bullet.atlas.yaml create mode 100644 assets/elements/item/machine_gun/bullet/machine_gun_bullet.png create mode 100644 assets/elements/item/machine_gun/explosion/bullet_hit_dull.ogg create mode 100644 assets/elements/item/machine_gun/explosion/explosion.atlas.yaml create mode 100644 assets/elements/item/machine_gun/explosion/explosion.png create mode 100644 assets/elements/item/machine_gun/machine_gun.atlas.yaml create mode 100644 assets/elements/item/machine_gun/machine_gun.png create mode 100644 assets/elements/item/machine_gun/machine_gun.yaml create mode 100644 assets/elements/item/machine_gun/shoot/gun_empty.ogg create mode 100644 assets/elements/item/machine_gun/shoot/machine_gun_shoot.atlas.yaml create mode 100644 assets/elements/item/machine_gun/shoot/machine_gun_shooting.png create mode 100644 assets/elements/item/machine_gun/shoot/shoot.ogg create mode 100644 src/core/elements/machine_gun.rs diff --git a/assets/elements/item/machine_gun/bullet/machine_gun.bullet.yaml b/assets/elements/item/machine_gun/bullet/machine_gun.bullet.yaml new file mode 100644 index 0000000000..3323344009 --- /dev/null +++ b/assets/elements/item/machine_gun/bullet/machine_gun.bullet.yaml @@ -0,0 +1,11 @@ +lifetime: 1.0 +speed: 600 +body_diameter: 15 +atlas: ./machine_gun_bullet.atlas.yaml + +explosion_fps: 12 +explosion_frames: 3 +explosion_volume: 0.025 +explosion_lifetime: 0.4 +explosion_sound: ../explosion/bullet_hit_dull.ogg +explosion_atlas: ../explosion/explosion.atlas.yaml diff --git a/assets/elements/item/machine_gun/bullet/machine_gun_bullet.atlas.yaml b/assets/elements/item/machine_gun/bullet/machine_gun_bullet.atlas.yaml new file mode 100644 index 0000000000..9fea56ab06 --- /dev/null +++ b/assets/elements/item/machine_gun/bullet/machine_gun_bullet.atlas.yaml @@ -0,0 +1,4 @@ +image: ./machine_gun_bullet.png +tile_size: [15, 15] +rows: 1 +columns: 1 diff --git a/assets/elements/item/machine_gun/bullet/machine_gun_bullet.png b/assets/elements/item/machine_gun/bullet/machine_gun_bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..72ab91e9315af5ab36f194290631d4e6dd7a63a0 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^{2S9~HA*&|6_|0OclB|}z@Qs9tHmEI>^m)bLhp!2qCrC*$0oHYB5kJ` jau~92sikmi+rY@sFBNR%#BFB)bTosftDnm{r-UW|Fy&WX literal 0 HcmV?d00001 diff --git a/assets/elements/item/machine_gun/explosion/bullet_hit_dull.ogg b/assets/elements/item/machine_gun/explosion/bullet_hit_dull.ogg new file mode 100644 index 0000000000000000000000000000000000000000..572186bf98047085e26ed45dc1d5ab510c325f06 GIT binary patch literal 4984 zcmahMdpy%!|K~oE=GthA+OkPy+GLe7xsJJvpW9llD_Mk@sMk~3Tpr1znJG=-v7)F5 zrQ)p~BIJ^cl02o5O6jJH>OGt4ecr#`^Etos`~JSybH3;MJ?H!L+`iohQiOiA?cUjM zW#Fz;YIX{X6%u#Fhwb3V5DE^JvKIvHw^5M4FDZD+B!4xTq>OTAw*9&m<@-O{0i`)L z^8wX8G;tfrX4P8jRRl{*8M_I1STW(dB3SXZfEW&lgf&DN)nw<6usJ~mmAUs)`^|m| zkR1eJI4E-`3CDnsG_vXHS=vKq+a zVouksF)^VFK&9e9%|gI8E^aOk)R=?Js*`&P&1JZ_u4f@)?VA8vUX`3%c&H9QDpfmj z3f-y!D(nI@Z$yAkUl69*U8_SmbH4q=+6M|b%-gk_qh zqvG4~r;1al<`w0o*;XAE7dqv`x)+rfwAO19nvt7VR5jCmqDj&K_7r)%kXP#$#ICBN zQ}GfZT|@3a6X1J$Rl|r}Z<*$>O#CTvyoP!CoI6cqTLVF!Z_vHk#{ccp=x%MSw+`ql z`>aTPK8`S#H6Y>!UQA&OrZHzyhC%n0{^GaEgfXJ2?+MNh2U?ZIGyAPj1c*A znP5YqSUqQXyt&q3-0om*-?8v~OZ3#W_11IjBf`D64S?;3HwF+i=r9z z+@S*2&`iq6KRQ!QzC;}eS|?bB7c9jKMs0F1u6B`a=8&DLEF-fX<8nrA1Q=HVc86el zvZ(xM;j^R1%}>i&Af${%*0N3}WmP0)l_%v)WC|jWipnbrSG1pearx}?|JUcq0~`ZE z2^i;ij58hMNC$x2yZbd|-bMdKz&OTRblf4%t+7|v7C6*DVeZiQu>laIdF#AhM=zSD zgYBoUgnd@_(;fSL;Q!ZXeMFiraICs4VS9o&omB-nl!?lMHe6ZpfCqW3Y@idDDjr7? z!jH7l37a)}xh;1fSC7IwLgiSzEb;y`>{Qvi=Wju_zxAZkGQ=AQBBHri>&o znFU;Cz&6HAS|69o%x8`GvjS&W%vLFPWX8R(o;J|W?Sr`^Qts2E(L*1B7#9|$1p~f; zv`5J?!wZjl!`xvZGZ=_1j0s+QzbR(Jx#;krjWy?%X*xHZw_pxgUv8ou;SNtM+Wcs3 zIXe?Fo{PWQbthlzzlGCdcUYBbS6bIH7_5o zPXjX;KN8Ih_-%Azw#h1i%K);~olR#qT!~9a-w1ME6%9d(?l`5i^hyNuSQ$d`#hcwJ znR+~M6yW)}^kx*llZ-dy(CzURX>|HQ6fc*&9Lw>b;z}f5RJRho)E-}*Mi1Iq)n6EN zki@?egp<^HQ4dx~j2LW^Q#PedoF^cgNrZAjC)vD+2aZs1&;?oGTLQ>tSY8fQ%~T?w zx??4%&F0nl!Z1J>4BFYya)g7Evv629WJGmak$&nd1lN*=R(dq1b4jrgsX;ICA zDk_x#W(8Df*;9ckA1att*b01q05z%_sB$Anz32x4!Hr4)s$#02N-2>m%XGqV*qa97 zXRGRrHsj}v_Zx&)HOh=*Zwjb~WX2CQfaB1k`e|WMWkbs#JG$Y0A*ZLJF388dK{l%f zl|ar^Bd-Unyv2)}T~!yv$R=m}FrHNhRI#f+00L0uMkUpw*g2#Rg+XTkfgM#nR>*lp z7#s9qlP;pzz(x>IH6{%Q)sK=EI3AV@4}iQ^l;yp$DV3mFLdhhImk|+!F|ja9SK;A3L@_rE!YoG?w77OKSKq0Z{jyD^;iSWHd zi(79UdWj&jjO7@RebF6r7%q2M&I5Cq%ozu75(r=r;I=>tU;;m+^!ds$^=ZLG*dJg- ztdRhwjHjN78{Fwu;)>5KvH@Jw1LdELdB=a*l7xiP)I6@p$Xt3kzzi~O8z@J912 zK!OQ^%9C$*LtnA@EdaHUS|iyBp+| z&p}dME9wTrD#bi6I<>0BC>+F;G^ny#TDTs>tpU4|Jcy?5Sa~ym)73bWOJ@_LL7Z2O z1=6re()a@&@;=Gm>lLrYi4|uOZfw?7{JieI! z`np;u1nuT2K@O>h)>LAO^m9}f%2ta|hfI)RV1vaV55cklHyT{dI4oU`)3QfkBYxr} z!t6Odb%{{$gAddZR^!D$7U1Yqxhz5kJ^O{j%PLzr6_5P|N%%-APR0j(i?j#B4=?}3 z34Y<|^q)AeRX_NIbXQPI)a|m&dOi1nD*V`TSl)=_G8gFhvl` zE9|NGbi(F#laqKK4bwDJPL`=+NsFIb3%J;k$`As$z|zjkQVG)3LT*%}nAyeFg6h^j zBHe{(p`4+X4`~zhA>e>hqOngBAXvW8ZOtatFPTKoo@Ev zZ{?y=x|-~V0s_0g0D@XoklMXyr}Ueu&Ka$0E}$9)tqr=S23<2%bZ{VM94@K8-uq}; zK?f8mKbo?#vK#_&2q`Pee{YoA4Cjcl-y0boGaQOTS`t=bKwG+cb@%n=j;00&hWY~I z2>)o0@B=U};fc7k&V8;fV;23x|ermrup|OIw<^Z9J~BGaQc+PSJE5?Rkm{JF7^a zXVZ1|j@anxb^V65N@SRv7=8im48|keU*u>&dXS>)%=WP+*StTvcUhP8jPF@}P~Cj5 zY3QVaJF||V9C89}YEI?%-cXQ0%d7)!b>a|5m|$9nbIAnm$I=EP7v? zb>!GNx-m`x;{%6pX#HH~k$}&oM$KOEk4?Ig97aUlKvgBa@PGa7#hJun>4wmRT?JO^ z1JwCwx4`2r;hrqLTGPHRbpx^A%ix)bWue0*%md%X4*ve=^`LPGx2S{7@LW3a?h)?( zGc*Prp_^;hIpSwKwY90rX7Y2x=@Sc$nSC}on&&hP%{-C9RU_Y%#Y0nXGb=JaJEvF- zpn5|R_G%q$iaLDiTGIMUZE0W9$gK~mO3)86(@mvxS7Ac~E@Q#IzcS~<{1Q)_Acfq&ns;A~ zS9ti@H&(e1t+{_-_(@OVON-~wA&2fx#FV&L0j}F^!QQZ9D)xKQCU%DNtsPS=gm@Wt z(WFQN4#HSw!IJTE`%e5_q+XBIJ>JQ6XZf2VdCs9ok0wf6?kUz(R?Zp@>aM`$^i zsX_m`yK9T)nUR+dUoI>U)MZ*PFr!I+6UVrdK3#H1*z2U;7FPg8IacS7MjqvVdN*`2 zihX0tR^t0TW2E4#qpt?WzrD{RR&1QN=24?nPy893ZlbZ_#Yk+vfy3hUX;zfFoDS$= zqJ7M+CtY{i0#t9~91-olDH)PIRX6T$_!QoE?zU)FG!!}gs&z73XL`$`*~K2FXQG+3 zlOD@W2aTj|pL%Dj(w;srR9hB7RB2Awee$gIxl?rK)!}YR61Z|V=xjN896c&VA$%yE@fv3lsI zOMa)&1p1EiDtj6y?rHvg=6T*jKc+DHPIFm6qLQ?TLN}ABa-}Tz;dKE(USs3DTj%1LJD6JsY zx0a*s3zXY8ZJB@Z+&Xgehvz%K>c@tE-}UbNliY(_#=rK&v{;*78Xh^DSoY8<*=9N~ zX0g8hK9T2(2Yp+Q&ersNa@ZW#wl(KV!Ml`4+M%=h8p)wPtDkrCyTZO0YMRAaA#_T= zixC!#DC9BUqPI=&e7n_Uqn@12n<#vX4(?0b!vln|sn;nZ zAOBkZ`P0-C!_78$?Ib~c-+;XjvtqfwKk0SS)fMAkM~@cdjdKS|b({`LuXviaemP8D z@ean3j?OGNMJmYem^^*5a;x;~^z}D24IidW@4u}UM_yvm_mC;(*r(XYTW>cjwv9=`Z%{Px$Hc3Q5R9J=WnLQGMFc5{`W@v3Zloz1!3><*M16XhX&S1j@Jd};CGiwzGha~*H zAQ8S6@_=s$WH*8Us;a(YA|j!&KAw+@H}i13PReZRQUTy}&M0}VYyilMsyEMhLP%sM zV4&ExNY{h*9e2^xrCN!;F;>VB84NlX86)!((j(Q%8X{`UxvNKK;L8k6@eotTt%f-= zeNyL2Nl~f+rcHAftelh)fGc9^-~V4Q?6*o)l|5Bcn)>F~H}G%lLdonx$s{9`{T*$W zluVKl%I0*==u(@y)M!FkZ&bS!WeJE`-y8P2QAC7YhsUVvV`SzU! zs+)EWOF~LAJ1`p~maTQ07U_p>iKILBmZmOssg8Uf!J7z)UDKWt@Vy-Z0QcLAvMd_A ar}PH(N^AVu^-f*@0000Px%qe(5@$hn+~p@g)yy6 zF9P&O8zHCu4TjA#0KoOL$Sk*^`|mf;RJmk5f~3yIKKi3ZZFWwDgzKW6llU_c#lI&f zV=IkBJI3<6$|XrYw@pA@$R*q+T10?zl9o;AWruLA&vf#ZGhyn-=3lmn@;YGcg}$hm zA{yArNKS%@yyA)owy|2Qm1q-H?x0e_Npu+WaO&S+GH`M=WD;$YZ=%dpkQ7StX))E) z)_W7%i@IJ%(t=l1IItC5_dE(zce$n_eBXVkh~6&xJqE9jugaTDYYwOVGes>ejXIdO}=1ZZrXS(dChr6S?474s7g(pvoBC;=lB1%U!i?)*) z;j6_O-!6{qjbZvi(!?O=ODzgi?dUhNj!^Y b{u}-Ry}Diu1hVu-00000NkvXXu0mjfk40j? literal 0 HcmV?d00001 diff --git a/assets/elements/item/machine_gun/machine_gun.yaml b/assets/elements/item/machine_gun/machine_gun.yaml new file mode 100644 index 0000000000..a25cfc699c --- /dev/null +++ b/assets/elements/item/machine_gun/machine_gun.yaml @@ -0,0 +1,25 @@ +atlas: ./machine_gun.atlas.yaml + +max_ammo: 10 +cooldown: 100ms +empty_cooldown: 600ms +bullet_meta: ./bullet/machine_gun.bullet.yaml +bullet_spread: 0.1 + +shoot_fps: 15 +shoot_frames: 3 +shoot_lifetime: 0.2 +shoot_sound_volume: 0.1 +shoot_sound: ./shoot/shoot.ogg +empty_shoot_sound_volume: 0.1 +empty_shoot_sound: ./shoot/gun_empty.ogg +shoot_atlas: ./shoot/machine_gun_shoot.atlas.yaml + +bounciness: 0.3 +can_rotate: true +body_size: [32, 8] +fin_anim: grab_2 +angular_velocity: 0.1 +throw_velocity: 360 +grab_offset: [23, 0] +kickback: 0 diff --git a/assets/elements/item/machine_gun/shoot/gun_empty.ogg b/assets/elements/item/machine_gun/shoot/gun_empty.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5e4e182a5935e774ce9f5fbd975d7b79ea234471 GIT binary patch literal 4934 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�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 KbR_Zrd;A|;P_4ND literal 0 HcmV?d00001 diff --git a/assets/game.yaml b/assets/game.yaml index 68048afe0d..3d402e730f 100644 --- a/assets/game.yaml +++ b/assets/game.yaml @@ -346,6 +346,7 @@ core: - /elements/item/jellyfish/jellyfish.element.yaml - /elements/item/kick_bomb/kick_bomb.element.yaml - /elements/item/mine/mine.element.yaml + - /elements/item/machine_gun/machine_gun.element.yaml - /elements/item/musket/musket.element.yaml - /elements/item/buss/buss.element.yaml - /elements/item/periscope/periscope.element.yaml diff --git a/assets/map/levels/level_7.map.yaml b/assets/map/levels/level_7.map.yaml index 7b15a1b797..98cfa1b29a 100644 --- a/assets/map/levels/level_7.map.yaml +++ b/assets/map/levels/level_7.map.yaml @@ -1173,7 +1173,7 @@ layers: - pos: - 216.0 - 310.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/machine_gun/machine_gun.element.yaml - pos: - 248.0 - 438.5 diff --git a/src/core/elements.rs b/src/core/elements.rs index e15734337c..c6e30753e3 100644 --- a/src/core/elements.rs +++ b/src/core/elements.rs @@ -16,6 +16,7 @@ pub mod grenade; pub mod jellyfish; pub mod kick_bomb; pub mod mine; +pub mod machine_gun; pub mod musket; pub mod periscope; pub mod player_spawner; @@ -31,7 +32,7 @@ pub mod urchin; pub mod prelude { pub use super::{ buss::*, crab::*, crate_item::*, decoration::*, fish_school::*, grenade::*, jellyfish::*, - kick_bomb::*, mine::*, musket::*, periscope::*, player_spawner::*, slippery::*, + kick_bomb::*, mine::*, musket::*, periscope::*, player_spawner::*, slippery::*, machine_gun::*, slippery_seaweed::*, snail::*, spike::*, sproinger::*, stomp_boots::*, sword::*, urchin::*, *, }; @@ -316,6 +317,7 @@ install_plugins!( jellyfish, kick_bomb, mine, + machine_gun, musket, buss, player_spawner, diff --git a/src/core/elements/machine_gun.rs b/src/core/elements/machine_gun.rs new file mode 100644 index 0000000000..ea970ba9e5 --- /dev/null +++ b/src/core/elements/machine_gun.rs @@ -0,0 +1,298 @@ +use crate::prelude::*; + +#[derive(HasSchema, Default, Debug, Clone)] +#[type_data(metadata_asset("machine_gun"))] +#[repr(C)] +pub struct MachineGunMeta { + pub grab_offset: Vec2, + pub fin_anim: Ustr, + + pub body_size: Vec2, + pub bounciness: f32, + pub can_rotate: bool, + pub throw_velocity: f32, + pub angular_velocity: f32, + pub atlas: Handle, + + pub max_ammo: u32, + pub cooldown: Duration, + pub empty_cooldown: Duration, + pub bullet_meta: Handle, + pub bullet_spread: f32, + pub kickback: f32, + + pub shoot_fps: f32, + pub shoot_lifetime: f32, + pub shoot_frames: u32, + pub shoot_sound_volume: f64, + pub empty_shoot_sound_volume: f64, + pub shoot_atlas: Handle, + pub shoot_sound: Handle, + pub empty_shoot_sound: Handle, +} + +pub fn game_plugin(game: &mut Game) { + MachineGunMeta::register_schema(); + game.init_shared_resource::(); +} + +pub fn session_plugin(session: &mut Session) { + session + .stages + .add_system_to_stage(CoreStage::PreUpdate, hydrate) + .add_system_to_stage(CoreStage::PostUpdate, update); +} + +#[derive(Clone, Debug, HasSchema, Default)] +pub struct MachineGun { + pub ammo: u32, + pub cooldown: Timer, + pub empty_cooldown: Timer, +} + +fn hydrate( + game_meta: Root, + mut entities: ResMutInit, + mut hydrated: CompMut, + mut element_handles: CompMut, + assets: Res, + mut machine_guns: CompMut, + mut atlas_sprites: CompMut, + mut bodies: CompMut, + mut transforms: CompMut, + mut items: CompMut, + mut item_throws: CompMut, + mut item_grabs: CompMut, + mut respawn_points: CompMut, + mut spawner_manager: SpawnerManager, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + let spawner_entities = entities + .iter_with_bitset(¬_hydrated_bitset) + .collect::>(); + + for spawner_ent in spawner_entities { + let transform = *transforms.get(spawner_ent).unwrap(); + let element_handle = *element_handles.get(spawner_ent).unwrap(); + let element_meta = assets.get(element_handle.0); + + if let Ok(MachineGunMeta { + atlas, + fin_anim, + grab_offset, + max_ammo, + body_size, + can_rotate, + bounciness, + throw_velocity, + angular_velocity, + .. + }) = assets.get(element_meta.data).try_cast_ref() + { + hydrated.insert(spawner_ent, MapElementHydrated); + + let entity = entities.create(); + items.insert(entity, Item); + item_throws.insert( + entity, + ItemThrow::strength(*throw_velocity) + .with_spin(*angular_velocity) + .with_system(machine_gun_drop(entity, *max_ammo)), + ); + item_grabs.insert( + entity, + ItemGrab { + fin_anim: *fin_anim, + sync_animation: false, + grab_offset: *grab_offset, + }, + ); + machine_guns.insert( + entity, + MachineGun { + ammo: *max_ammo, + cooldown: Timer::new(Duration::from_millis(0), TimerMode::Once), + empty_cooldown: Timer::new(Duration::from_millis(0), TimerMode::Once), + }, + ); + atlas_sprites.insert(entity, AtlasSprite::new(*atlas)); + respawn_points.insert(entity, DehydrateOutOfBounds(spawner_ent)); + transforms.insert(entity, transform); + element_handles.insert(entity, element_handle); + hydrated.insert(entity, MapElementHydrated); + bodies.insert( + entity, + KinematicBody { + shape: ColliderShape::Rectangle { size: *body_size }, + has_mass: true, + has_friction: true, + can_rotate: *can_rotate, + bounciness: *bounciness, + gravity: game_meta.core.physics.gravity, + ..default() + }, + ); + spawner_manager.create_spawner(spawner_ent, vec![entity]) + } + } +} + +fn update( + entities: Res, + mut commands: Commands, + element_handles: Comp, + assets: Res, + + mut machine_guns: CompMut, + transforms: CompMut, + mut sprites: CompMut, + mut audio_center: ResMut, + + player_inventories: PlayerInventories, + mut items_used: CompMut, + items_dropped: CompMut, + time: Res