From 33a2a73f33d02274915c712ca71430a1b301ee3b Mon Sep 17 00:00:00 2001 From: Gabriel Momoh <53819287+TheGemDev@users.noreply.github.com> Date: Mon, 22 Apr 2024 23:33:27 +0100 Subject: [PATCH] Added a a gun select system (#214) * add intro transition * added new phone removed old phone assets * add controller support * added weapon wheel --- src/assets/weapons/icons/ammo_machinegun.png | Bin 0 -> 1271 bytes .../weapons/icons/ammo_machinegunLauncher.png | Bin 0 -> 1391 bytes src/assets/weapons/icons/ammo_pistol.png | Bin 0 -> 1085 bytes src/assets/weapons/icons/ammo_rocket.png | Bin 0 -> 4153 bytes .../weapons/icons/ammo_rocketModern.png | Bin 0 -> 2264 bytes src/assets/weapons/icons/ammo_shotgun.png | Bin 0 -> 1061 bytes src/assets/weapons/icons/ammo_sniper.png | Bin 0 -> 1874 bytes src/assets/weapons/icons/ammo_uzi.png | Bin 0 -> 937 bytes src/assets/weapons/icons/bar.png | Bin 0 -> 3668 bytes .../weapons/icons/flamethrower_long.png | Bin 0 -> 7152 bytes .../weapons/icons/flamethrower_short.png | Bin 0 -> 6741 bytes src/assets/weapons/icons/grenade.png | Bin 0 -> 2902 bytes src/assets/weapons/icons/grenadeFlash.png | Bin 0 -> 2607 bytes src/assets/weapons/icons/grenadeSmoke.png | Bin 0 -> 2973 bytes src/assets/weapons/icons/grenadeVintage.png | Bin 0 -> 4251 bytes src/assets/weapons/icons/knifeRound_sharp.png | Bin 0 -> 2773 bytes .../weapons/icons/knifeRound_smooth.png | Bin 0 -> 3202 bytes src/assets/weapons/icons/knife_sharp.png | Bin 0 -> 3168 bytes src/assets/weapons/icons/knife_smooth.png | Bin 0 -> 2923 bytes src/assets/weapons/icons/machinegun.png | Bin 0 -> 6743 bytes .../weapons/icons/machinegunLauncher.png | Bin 0 -> 7996 bytes src/assets/weapons/icons/pistol.png | Bin 0 -> 3624 bytes src/assets/weapons/icons/pistolSilencer.png | Bin 0 -> 4250 bytes src/assets/weapons/icons/rocketlauncher.png | Bin 0 -> 13833 bytes .../weapons/icons/rocketlauncherModern.png | Bin 0 -> 9528 bytes src/assets/weapons/icons/shotgun.png | Bin 0 -> 5444 bytes src/assets/weapons/icons/shotgunShort.png | Bin 0 -> 4944 bytes src/assets/weapons/icons/sniper.png | Bin 0 -> 11209 bytes src/assets/weapons/icons/uzi.png | Bin 0 -> 4281 bytes src/assets/weapons/icons/uziLong.png | Bin 0 -> 5448 bytes src/assets/weapons/icons/uziLongSilencer.png | Bin 0 -> 6327 bytes src/assets/weapons/icons/uziSilencer.png | Bin 0 -> 4844 bytes .../extendedvariables.json | 1225 ++++++ src/eventsFunctionsExtensions/gamepads.json | 3551 +++++++++++++++++ src/eventsFunctionsExtensions/references.json | 152 + src/externalEvents/game.json | 7 + src/externalEvents/player.json | 112 +- src/externalEvents/weaponselect.json | 165 + src/externalEvents/weaponwheel.json | 577 +++ src/externalLayouts/weaponselect.json | 36 + src/externalLayouts/weaponwheel.json | 53 + src/game.json | 240 +- src/layouts/city.json | 2118 ++++++++-- 43 files changed, 7894 insertions(+), 342 deletions(-) create mode 100644 src/assets/weapons/icons/ammo_machinegun.png create mode 100644 src/assets/weapons/icons/ammo_machinegunLauncher.png create mode 100644 src/assets/weapons/icons/ammo_pistol.png create mode 100644 src/assets/weapons/icons/ammo_rocket.png create mode 100644 src/assets/weapons/icons/ammo_rocketModern.png create mode 100644 src/assets/weapons/icons/ammo_shotgun.png create mode 100644 src/assets/weapons/icons/ammo_sniper.png create mode 100644 src/assets/weapons/icons/ammo_uzi.png create mode 100644 src/assets/weapons/icons/bar.png create mode 100644 src/assets/weapons/icons/flamethrower_long.png create mode 100644 src/assets/weapons/icons/flamethrower_short.png create mode 100644 src/assets/weapons/icons/grenade.png create mode 100644 src/assets/weapons/icons/grenadeFlash.png create mode 100644 src/assets/weapons/icons/grenadeSmoke.png create mode 100644 src/assets/weapons/icons/grenadeVintage.png create mode 100644 src/assets/weapons/icons/knifeRound_sharp.png create mode 100644 src/assets/weapons/icons/knifeRound_smooth.png create mode 100644 src/assets/weapons/icons/knife_sharp.png create mode 100644 src/assets/weapons/icons/knife_smooth.png create mode 100644 src/assets/weapons/icons/machinegun.png create mode 100644 src/assets/weapons/icons/machinegunLauncher.png create mode 100644 src/assets/weapons/icons/pistol.png create mode 100644 src/assets/weapons/icons/pistolSilencer.png create mode 100644 src/assets/weapons/icons/rocketlauncher.png create mode 100644 src/assets/weapons/icons/rocketlauncherModern.png create mode 100644 src/assets/weapons/icons/shotgun.png create mode 100644 src/assets/weapons/icons/shotgunShort.png create mode 100644 src/assets/weapons/icons/sniper.png create mode 100644 src/assets/weapons/icons/uzi.png create mode 100644 src/assets/weapons/icons/uziLong.png create mode 100644 src/assets/weapons/icons/uziLongSilencer.png create mode 100644 src/assets/weapons/icons/uziSilencer.png create mode 100644 src/eventsFunctionsExtensions/extendedvariables.json create mode 100644 src/eventsFunctionsExtensions/gamepads.json create mode 100644 src/eventsFunctionsExtensions/references.json create mode 100644 src/externalEvents/weaponselect.json create mode 100644 src/externalEvents/weaponwheel.json create mode 100644 src/externalLayouts/weaponselect.json create mode 100644 src/externalLayouts/weaponwheel.json diff --git a/src/assets/weapons/icons/ammo_machinegun.png b/src/assets/weapons/icons/ammo_machinegun.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0969e7ddeb41beb2b6db15f55284b6af581a33 GIT binary patch literal 1271 zcmV;^z-A@tKXzk2{t=B^V0(XYM=9b@5;pS8BOA1i>qK2v{WZf+(QrqUAe2$h$D5{GdAgHER^ zfX-=J6&CXn^ZUJQI}zn7xL`@I*hy1Fzro0<8yJg}P^0X1B)Scn;ohRFix za#vT^;)027xSct;2Q|Rybb`A%HDxr>YY$66adGj}{r!E@=9NX}*>v%j5(EK6&jM63 zMJilV*YJh}scP%qp1pIMR2(c43Gn!cdxBat5@b%t8vFKAM}-7cSJxgk7=HVEb=AUE z@FF4v_wXBPsNiyEw{Rb-tvx(FZM^4l**OFy5fqiY9yj~`$`z#qRen|T=A>cbFE>G` zAH9*3$cR`h%pr34lms=N)5z!N=a`57Kq)X_XD7}6+{tk3u?UjV)6;Waf^<4v2b`nT za+EtXlmj9}i{t_UFZF8j4!!=6?9d_M5ellwYFTER8_paegR-*OWWK>^?joLBEX&!` z_4TjI6qS`ld#mJ1)zNSu0UY;-8(u&;6>xaFiIjs{?q23Oah)Tn-6c0yTwkf0d$6bf!} z_t2+IIw3(Y2hY(GHOf1oR35x}^VcvE?%oq4^apBEgQG!avzl2`Q}ZznQG`OMmuD}Z z2<~7WN+cruIp(dQNpnb|zJuCvX$w`B)LUraf8jZ>#lC{pDO= hWiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1ix%VNn18 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/ammo_machinegunLauncher.png b/src/assets/weapons/icons/ammo_machinegunLauncher.png new file mode 100644 index 0000000000000000000000000000000000000000..37cf065724995c7f95a88fdce2f9ad0880a3e9a3 GIT binary patch literal 1391 zcmV-#1(5oQP)Ec8*ZbcfZh8v2&tsSGb zs1ijeX%Yy_^8&U38{0V824jPBo~FkI#H(zB6O$>Yj3a zrTG5+yZ_uBk#y3q**yD)&9?B@qJ44LVzK;gGR=-&Qz|dk{hzD3wY6T7CVYPX3PrXy zDW6Nx&Q6wgi+L*Yy^v3n%jNX6wtiFpTu@U}(~CnxLt`Gdi#CG+ITj1c*-VlF8QLji z8Jw1J$1|f*e-H0J6ZYM;>y2jf46UxXX=8m&P9|akR4nG`V82L*2SwW3D+u6rY>Rqs z-TLU6FqKL*WM5n$|JsTi-;Pi!wauyJsxTa+%g^ORJVFx_<9|NAR?V&TqoaRE9d;W9 z{Ht;z5k*=8w!gnqh3)U{K&_lfC&=qv&a`!QzFhW02LSx z3`r(qv>xz1QQr9ZgBsZNAG<%*>!+(Qq**CE)EyjC2Uv;&;hlb!`m-9?FTK6JI%$%S zCP$=gez8W`K?w$Uj$0-c4b$-Oa8C`audnZc*<_>@@3I`)To+MO$&vwky9MDSV2200 z!Vq>^n4s57_iJEx?x@Wc%Pe_4kI@!F8B&1>aFAO zMuU#53v=XNc2Q_^gJNt#GO;acm&>Lpn@x!W#gRyegZgP~?BPk+=WSQsQ>%aTPESqH zoW(?TyOkT)LmM1Zkl^3$4a0Ksa6i$#B)qYB(h0*gMPlTvGG;R!c}iurlAOm!hl+O^bmBOqj5nuYn;T+Gu7* zzaWMl$~2l^Z93hQsF!cm!*vM>7#u@CRUIvZ00s=fP!1?-XlQt;?(*f9H?)IVk7?E* zYPQNSq*-a&qcl${!*kROFdlfTfFaGnL9G)o>@gqL49a3gXqu$$;Hc9Yi1%8t94=T&_IRxH8N z>9|m4v6z+w3W2tF{0bAixIcC|S-o9sV|-qi zx6q7H+E?DV@!`?_|DpTJ$jC5Z*r5*l%*_oP@cSst^}{e%)=_XHAm$f$|Jo|KI8cAT zs=c~`1_lNkk~H~*|F76}I2JQJQiWh(t*{jiWqGV}u~;O@TQ{G{B=hN1VmBU-7Px(K z94O0s?O&uRT7$0_K51!r^NS9}+0Lt1FLWprXA}zMS)8t}?sE#I@_hMzMyc#M-__lH zPI>d@1-`$-=Ut`pr;F|F-@XOVe>)&s9`bVAivR!sEp$a#bW?9;ba!ELWdLG%E@EtN xZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1hK;m4*NS literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/ammo_pistol.png b/src/assets/weapons/icons/ammo_pistol.png new file mode 100644 index 0000000000000000000000000000000000000000..906e2cc6e852c60cdffaf4e0fb053889afbed5a4 GIT binary patch literal 1085 zcmV-D1j74?P)`~|MKfFIF2ZY?1$qL7NJZPW^os45`@0<~(=LMRaL8M|IGc5*>P znkKYPz)8kVQZGrGiPv~v5~tE?sPDsWxd2X4{PF~J>7!5Io}Yj4S3Dl!;68%gZW9i>E&g3Q zs9>=&$ns|P{fif0JpzYsk6iWnmLMM6hFmtq=b}!(AGY~LvZ-r6mxk-tht3{>Mx*hU zU|lwAp&Ro{$(zeT%#S5R28JiQHtudDlbaln8k7v!)@{4slfCH z==g9@HAh_sHwQr~OtG`sY(q@22-75$a+*SOPIhb_oe%mEQEq<{B)4B z6g`qnd!?)VY<~o8tOw!SJ3m}t7p`1+%k6fy7rnp2#zqL}^%0A1^AwTwbY-#74i=<$ z(!G1r>At?f*O}&n%WvGZSyL4B$D8Xod@r-5VxG@LY02j@z4I8M^LSsvWBdXe)#=6- zy$jqe{yxP_s`LH%M+dJizbDhkJSr*()~oEBkvpGHPEJl?CHKOD$KmyQ&62cakt9hM z2(8@>hr^CwFlhI!`0ReaSr-001p?MObuGZ)S9NVRB^v zVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjf Dw8;$$ literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/ammo_rocket.png b/src/assets/weapons/icons/ammo_rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..9344d1d45c35d730202d2353824f5e6ec7e3f8d5 GIT binary patch literal 4153 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/ammo_shotgun.png b/src/assets/weapons/icons/ammo_shotgun.png new file mode 100644 index 0000000000000000000000000000000000000000..62564532908769c08508528955d5ac48bb3a2e5c GIT binary patch literal 1061 zcmV+=1ls$FP)4|2YH&bjBiX=qT6Yt7BZ#*U7T>n$xUH=2#c zMuWlB)Y;j26QAS%_%j#`P54fOdJK+?J)fWd#oF!5OeDfGNiGpeBw`H5#RCTiv8`xy zhhft1!bO(x474QQMA@XqVqgm5ST*~1iwLJ7{#D)9GQCTAJWPAedaCD@LH&P*or zV+}YoGWPP%rU(Cklfp3wxxJDgev+`R?w)yBcuVI^OPbuE5T=0>p|4 zs8&UgWdX|k2^<}zferelKC}6$2DDggZ=DW19K`k@ol4NvE0r>-C_+^h=_2?n6!Mh^ z2CPps;D~L);C4A69*kRZU~Nsd;a zRAr?irJ7BHkMWlK`>l^^HMVYeRy82fRLoH{B25Ga{64HIs(d)m?S_-S94XQ*T+X0(vEu zCcs@Io;GBF0Fyx1s6l5|SEG{nm zroaxP@z&Jz^rwZzg_)(LrLRt>^Yg~W#*D|~ncCXg{1OQGzB3H-joi<;-L9WAv$G%Z z%k>{2g{xb@bXs8m001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7 fP)Z)9b1s0M%T00000NkvXXu0mjf(r4|e literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/ammo_sniper.png b/src/assets/weapons/icons/ammo_sniper.png new file mode 100644 index 0000000000000000000000000000000000000000..03d3afa225c58a6f083f4651036dd686f73d8603 GIT binary patch literal 1874 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 LNkvXXu0mjf=R~oe literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/bar.png b/src/assets/weapons/icons/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..7298f83be63a0e97b0c47c978a7b640302a4c970 GIT binary patch literal 3668 zcmeHK@lP6896!2c(=KlNX$8AZ*JW7~7Y#dE!Ym~<66=!LWnGE7PHmJs8$@a$gK!|E z`(?|h{fUvY>Md;+lU5}wR$?8{WCi0h&Pw+RX59@!;B!B)~vKO2D^SkxF%c=fm z3|cfrSNJhf=<}v&hVf)DAEq~%wtS~)#?%7Ff`mDZz#)7$Pf?VNHY`BvMBSYDnG#y- z&SWw(326_gnZH+f5DaO zvD?J7GJguob{_)(6SryH z93d5R;4I{j2hL>G_0-{T_zxZ=nSIX`noTC8<@_F^ z3<$#9MI=4Woy6^pcT*x~e3qu^r@6X0R2&KxFDE8Y&>6zNmCv&>UbJN%W|)UA<3eba z*xR*wU-q^u0|68*Sv8Uu!=QHsCLaAePV9Zm11ugDNr8P>SeYNQ`xRzi(MB7!ad;{< zJ0h){!3|dGaMgoFweZVCZ3Qw zp|}d#xZ(&YV8qvpF_EyS9oZUjnbwO=a8bqV7~H)q8MlN7rIy4uO0@ZIQ%jkb4q0d0 Jd~5&B{{WexjHv(s literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/flamethrower_long.png b/src/assets/weapons/icons/flamethrower_long.png new file mode 100644 index 0000000000000000000000000000000000000000..833edf6d51f897da53f98ec5a0914792a80afc48 GIT binary patch literal 7152 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 AxBvhE literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/grenadeFlash.png b/src/assets/weapons/icons/grenadeFlash.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfcea9eb87dd73183e24d3f4caccbb8789a9ffd GIT binary patch literal 2607 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 OkmXGq^ZFYevHu5y|JYRk literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/grenadeSmoke.png b/src/assets/weapons/icons/grenadeSmoke.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63dd36079dd6059bdd4eba80f380dfe5030cb3 GIT binary patch literal 2973 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 TA6SD600000NkvXXu0mjfL|u9D literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/grenadeVintage.png b/src/assets/weapons/icons/grenadeVintage.png new file mode 100644 index 0000000000000000000000000000000000000000..dd129eac0b9683247b8fcf3e7214ad603f1f56cc GIT binary patch literal 4251 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/knifeRound_sharp.png b/src/assets/weapons/icons/knifeRound_sharp.png new file mode 100644 index 0000000000000000000000000000000000000000..ff01891cc9f820aa620e5d17b29832574e1274de GIT binary patch literal 2773 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/knife_sharp.png b/src/assets/weapons/icons/knife_sharp.png new file mode 100644 index 0000000000000000000000000000000000000000..13518f8b8d3fb7bfdf15a996c4166b759c4ed7fa GIT binary patch literal 3168 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/knife_smooth.png b/src/assets/weapons/icons/knife_smooth.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc2aa5b02cdea3f69177d33d7ccaf0eeca0cdc7 GIT binary patch literal 2923 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/pistolSilencer.png b/src/assets/weapons/icons/pistolSilencer.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8ee5c7fa59e56c7307d15f48edbcbb0ea4f01f GIT binary patch literal 4250 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

~(gwj7%v>Ta{{5CLkVF5h z#RrJj>)Hhmba4pB#0D(QUtM#X^u9j+en@4uH7RxK^H^H6RUR!t*WviJF{gjERK#;A?&x%7L|0_1U`X$4v>sg?sNU*kCWnv zl3IJSi+=@)6&u7(N?t8n$ZD1k#MoU5q4Fy^dx3Fz;wKDlE_jOabC6GP!KiS9ugN(- z|Ko&G{_za;-V=cB#j+*47NRN_IJtWdcbs}qllMf}st|7YbrZ(Ivmj{x`aFbzx7s}r z$(G-LraG!8&JTBWP5pKtO>KbVdGCF?Ji;gP@3gV^VTgU}(S9fQX&pN_kWO-L0LaQ- za|d?+L>eFsAlRBis_d%9JgV?{iM3y`;shVOCU{t%+ zQNju_6%!L+O==gRsKRN{9zMpbS7?DiP9TwycF&*hUJj{kyMIZHC7MK^n4Y$doBiHh zcw2;Ukz<-7Q(zVk8=K1~-%B4KIkOz5LBgAB+#kBhoEWIqikd4cFE4Vvo!iM>6T28k zKMM?)4-p7?*h{dlHRGcUVf8T=o;$X&P_3Cd<#%GE5M^qVVohwEo+skc50nq3Hy|s_q?}v9F;eF5Jc0*^5Q_uK7=gYdv64gFziH+ZVVQRzQ_uXc-@>?WVy;8PN@Tk zC?xhVIb#(HQQ}V4_O_l*oj>CfoWx@q2Lsv4I2v|)dl6&X$pYJ@vHb{uA?T*MhlW(pVp17%tq3bPlalrRKijb^7326%K!O1M&1jt zY_j~?wX=UTdVIoZb@a6bsq42ou5=L1_&o?39p%8T@yP!FF2I6>e%{K{tb~Y_>1VCDNznfQsy1DJ literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/shotgun.png b/src/assets/weapons/icons/shotgun.png new file mode 100644 index 0000000000000000000000000000000000000000..13031d16fe59197db8d9852e82d8539172a963c1 GIT binary patch literal 5444 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 u?E5HxUw-}`kdN~BT~@r>B#XlgP-%rm3mZ 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 O0000hjg)+3d_zNoiSmd3jY$&F=0N1ZQw?U?045 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/uzi.png b/src/assets/weapons/icons/uzi.png new file mode 100644 index 0000000000000000000000000000000000000000..8e648ed64a99ef67721f794aaf37b889e8b246a2 GIT binary patch literal 4281 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/uziLong.png b/src/assets/weapons/icons/uziLong.png new file mode 100644 index 0000000000000000000000000000000000000000..75dd5716a2245f265a733b3d7404bad9c50196c4 GIT binary patch literal 5448 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 literal 0 HcmV?d00001 diff --git a/src/assets/weapons/icons/uziSilencer.png b/src/assets/weapons/icons/uziSilencer.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca6fa7a8392ef8144bbcdb02a3ddb7b1febdc42 GIT binary patch literal 4844 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 4) {\r", + " console.error('Parameter gamepad identifier in expression: \"Pressure on a gamepad trigger\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (trigger != \"LT\" && trigger != \"RT\" && trigger != \"L2\" && trigger != \"R2\") {\r", + " console.error('Parameter trigger is not valid in expression: \"Pressure on a gamepad trigger\"');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "switch (trigger) {\r", + " case 'LT':\r", + " case 'L2':\r", + " eventsFunctionContext.returnValue = gamepad.buttons[6].value;\r", + " break;\r", + "\r", + " case 'RT':\r", + " case 'R2':\r", + " eventsFunctionContext.returnValue = gamepad.buttons[7].value;\r", + " break;\r", + "\r", + " default:\r", + " eventsFunctionContext.returnValue = -1;\r", + " break;\r", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Trigger button", + "name": "trigger", + "supplementaryInformation": "[\"LT\",\"RT\",\"L2\",\"R2\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the force of gamepad stick (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "the gamepad _PARAM1_ _PARAM2_ stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a stick force\"');\r", + " return;\r", + "}\r", + "\r", + "if (stick !== \"LEFT\" && stick !== \"RIGHT\") {\r", + " console.error('Parameter stick is not valid in expression: \"Value of a stick force\"');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " eventsFunctionContext.returnValue = gdjs.evtTools.common.clamp(Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId)) + Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId)), 0, 1);\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " eventsFunctionContext.returnValue = gdjs.evtTools.common.clamp(Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId)) + Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId)), 0, 1);\r", + " break;\r", + "\r", + " default:\r", + " eventsFunctionContext.returnValue = -1;\r", + " break;\r", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Get the rotation value of a gamepad stick.\nIf the deadzone value is high, the angle value is rounded to main axes, left, left, up, down.\nAn zero deadzone value give a total freedom on the angle value.", + "fullName": "Value of a stick rotation (deprecated)", + "functionType": "Expression", + "name": "StickRotationValue", + "private": true, + "sentence": "Player _PARAM1_ push axis _PARAM2_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Gamepads::StickAngle(GetArgumentAsNumber(\"player_ID\"), GetArgumentAsString(\"stick\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle of a gamepad stick.\nIf the deadzone value is high, the angle value is rounded to main axes, left, left, up, down.\nAn zero deadzone value give a total freedom on the angle value.", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a stick rotation\"');\r", + " return;\r", + "}\r", + "if (stick !== \"LEFT\" && stick !== \"RIGHT\") {\r", + " console.error('Parameter stick is not valid in expression: \"Value of a stick rotation\"');\r", + " return;\r", + "}\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.axisToAngle(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId), gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId));\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.axisToAngle(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId), gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId));\r", + " break;\r", + "\r", + " default:\r", + " eventsFunctionContext.returnValue = -1;\r", + " break;\r", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Get the value of axis of a gamepad stick.", + "fullName": "Value of a gamepad axis (deprecated)", + "functionType": "Expression", + "name": "AxisValue", + "private": true, + "sentence": "Player _PARAM1_ push axis _PARAM2_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "const direction = eventsFunctionContext.getArgument(\"direction\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "if (stick != \"LEFT\" && stick != \"RIGHT\") {\r", + " console.error('Parameter stick is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "if (direction != \"UP\" && direction != \"DOWN\" && direction != \"LEFT\" && direction != \"RIGHT\" && direction != \"HORIZONTAL\" && direction != \"VERTICAL\") {\r", + " console.error('Parameter direction is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let parameterError = false;\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " switch (direction) {\r", + " case 'LEFT':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId);\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId);\r", + " }\r", + " break;\r", + "\r", + " case 'UP':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId);\r", + " }\r", + " break;\r", + "\r", + " case 'DOWN':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId);\r", + " }\r", + " break;\r", + "\r", + " case \"HORIZONTAL\":\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId);\r", + " break;\r", + "\r", + " case \"VERTICAL\":\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId);\r", + " break;\r", + "\r", + " default:\r", + " break;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " switch (direction) {\r", + " case 'LEFT':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId);\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId);\r", + " }\r", + " break;\r", + "\r", + " case 'UP':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId);\r", + " }\r", + " break;\r", + "\r", + " case 'DOWN':\r", + " if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId);\r", + " }\r", + " break;\r", + "\r", + " case \"HORIZONTAL\":\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId);\r", + " break;\r", + "\r", + " case \"VERTICAL\":\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId);\r", + " break;\r", + "\r", + " default:\r", + " break;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " break;\r", + "}\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"Horizontal\",\"Vertical\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the gamepad stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"Gamepad\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"Stick\").toLowerCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "if (stick != \"left\" && stick != \"right\") {\r", + " console.error('Parameter stick is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "const axisIndex = stick === 'right' ? 2 : 0;\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[axisIndex], playerId);\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Gamepad", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "Stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the gamepad stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"Gamepad\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"Stick\").toLowerCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "if (stick != \"left\" && stick != \"right\") {\r", + " console.error('Parameter stick is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\r", + "}\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "const axisIndex = stick === 'right' ? 3 : 1;\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[axisIndex], playerId);\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Gamepad", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "Stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Test if a button is released on a gamepad. Buttons can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Other: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".", + "fullName": "Gamepad button released", + "functionType": "Condition", + "name": "C_Button_released", + "sentence": "Button _PARAM2_ of gamepad _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const button = eventsFunctionContext.getArgument(\"button\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Gamepad button released\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (button === \"\") {\r", + " console.error('Parameter button is not valid in condition: \"Gamepad button released\"');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let buttonId;\r", + "\r", + "switch (button) {\r", + " case 'A':\r", + " case 'CROSS':\r", + " buttonId = 0;\r", + " break;\r", + " case 'B':\r", + " case 'CIRCLE':\r", + " buttonId = 1;\r", + " break;\r", + " case 'X':\r", + " case 'SQUARE':\r", + " buttonId = 2;\r", + " break;\r", + " case 'Y':\r", + " case 'TRIANGLE':\r", + " buttonId = 3;\r", + " break;\r", + " case 'LB':\r", + " case 'L1':\r", + " buttonId = 4;\r", + " break;\r", + " case 'RB':\r", + " case 'R1':\r", + " buttonId = 5;\r", + " break;\r", + " case 'LT':\r", + " case 'L2':\r", + " buttonId = 6;\r", + " break;\r", + " case 'RT':\r", + " case 'R2':\r", + " buttonId = 7;\r", + " break;\r", + "\r", + " case 'UP':\r", + " buttonId = 12;\r", + " break;\r", + " case 'DOWN':\r", + " buttonId = 13;\r", + " break;\r", + " case 'LEFT':\r", + " buttonId = 14;\r", + " break;\r", + " case 'RIGHT':\r", + " buttonId = 15;\r", + " break;\r", + "\r", + " case 'BACK':\r", + " case 'SHARE':\r", + " buttonId = 8;\r", + " break;\r", + " case 'START':\r", + " case 'OPTIONS':\r", + " buttonId = 9;\r", + " break;\r", + "\r", + " case 'CLICK_STICK_LEFT':\r", + " buttonId = 10;\r", + " break;\r", + " case 'CLICK_STICK_RIGHT':\r", + " buttonId = 11;\r", + " break;\r", + "\r", + " //PS4\r", + " case 'PS_BUTTON':\r", + " buttonId = 16;\r", + " break;\r", + " case 'CLICK_TOUCHPAD':\r", + " buttonId = 17;\r", + " break;\r", + "\r", + " default:\r", + " console.error('The button: ' + button + ' in condition: \"Gamepad button released\" is not valid.');\r", + " break;\r", + "}\r", + "\r", + "if (buttonId === undefined) {\r", + " console.error('There is no buttons valid in condition: \"Gamepad button released\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "if (gamepad.buttons == null || gamepad.buttons[buttonId] == null) {\r", + " console.error('Buttons on the gamepad are not accessible in condition: \"Gamepad button released\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "//Define default value on pressed button or use previous value\r", + "gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] || { pressed: false };\r", + "\r", + "//Get state of button at previous frame\r", + "const previousStateButton = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed;\r", + "\r", + "//When previousStateButton is true and actual button state is not pressed\r", + "//Player have release the button\r", + "if (previousStateButton === true && gamepad.buttons[buttonId].pressed === false) {\r", + " // Save the last button used for the player \r", + " gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + " gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = true;\r", + " eventsFunctionContext.returnValue = true;\r", + "\r", + "} else {\r", + " gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = false;\r", + " eventsFunctionContext.returnValue = false;\r", + "}\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Name of the button", + "name": "button", + "supplementaryInformation": "[\"A\",\"Cross\",\"B\",\"Circle\",\"X\",\"Square\",\"Y\",\"Triangle\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"Up\",\"Down\",\"Left\",\"Right\",\"Back\",\"Share\",\"Start\",\"Options\",\"Click_Stick_Left\",\"Click_Stick_Right\",\"PS_Button\",\"Click_Touchpad\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the index of the last pressed button of a gamepad.", + "fullName": "Last pressed button (id)", + "functionType": "Expression", + "name": "LastButtonID", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "//Player id is not valid\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in expression: \"Last pressed button (id)\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "\r", + "//Return the last button used by the player\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].lastButtonUsed;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if any button is pressed on a gamepad.", + "fullName": "Any gamepad button pressed", + "functionType": "Condition", + "name": "C_Any_Button_pressed", + "sentence": "Any button of gamepad _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Any gamepad button pressed\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let buttonId;\r", + "for (let i = 0; i < gamepad.buttons.length; i++) { //For each buttons\r", + " if (gamepad.buttons[i].pressed) { //One of them is pressed\r", + " buttonId = i; //Save the button pressed\r", + " break;\r", + " }\r", + "}\r", + "\r", + "if (buttonId === undefined) {\r", + " // No buttons are pressed.\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "if (gamepad.buttons == null || gamepad.buttons[buttonId] == null) {\r", + " console.error('Buttons on the gamepad are not accessible in condition: \"Any gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "//When a button is pressed, save the button in lastButtonUsed for each players\r", + "if (gamepad.buttons[buttonId].pressed) gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + "eventsFunctionContext.returnValue = gamepad.buttons[buttonId].pressed;\r", + "\r", + "\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the last button pressed. \nButtons for Xbox and PS4 can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Both: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".", + "fullName": "Last pressed button (string)", + "functionType": "StringExpression", + "name": "LastButtonString", + "sentence": "Button _PARAM2_ of gamepad _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const controllerType = eventsFunctionContext.getArgument(\"controller_type\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in string expression: \"Last pressed button (LastButtonString)\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (controllerType === \"\") {\r", + " console.error('Parameter controller type is not valid in string expression: \"Last pressed button (LastButtonString)\"');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "if (gamepad !== null) { //Gamepad exist\r", + " //Get last btn id\r", + " const lastButtonUsedID = gdjs._extensionController.players[playerId].lastButtonUsed;\r", + "\r", + " //Return last button as string \r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getInputString(controllerType, lastButtonUsedID);\r", + "\r", + "} else { //Gamepad dosen't exist\r", + " console.error('Your controller is not supported or the gamepad wasn\\'t detected in string expression: \"Last pressed button (LastButtonString)\"');\r", + " eventsFunctionContext.returnValue = \"Gamepad not connected\";\r", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Controller type", + "name": "controller_type", + "supplementaryInformation": "[\"Xbox\",\"PS4\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the number of gamepads.", + "fullName": "Gamepad count", + "functionType": "Expression", + "name": "GamepadCount", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get the last activated controller\r", + "const controllerId = gdjs._extensionController.lastActiveController;\r", + "\r", + "// Check if controller is active\r", + "const gamepad = gamepads[controllerId];\r", + "if (gamepad == null) {\r", + " eventsFunctionContext.returnValue = 0;\r", + "} else {\r", + " // Return active controller id\r", + " eventsFunctionContext.returnValue = controllerId + 1;\r", + "}\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if a button is pressed on a gamepad. \nButtons can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Other: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".", + "fullName": "Gamepad button pressed", + "functionType": "Condition", + "name": "C_Button_pressed", + "sentence": "Button _PARAM2_ of gamepad _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const button = eventsFunctionContext.getArgument(\"button\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Gamepad button pressed\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (button === \"\") {\r", + " console.error('Parameter button is not valid in condition: \"Gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let buttonId;\r", + "\r", + "switch (button) {\r", + " case 'A':\r", + " case 'CROSS':\r", + " buttonId = 0;\r", + " break;\r", + " case 'B':\r", + " case 'CIRCLE':\r", + " buttonId = 1;\r", + " break;\r", + " case 'X':\r", + " case 'SQUARE':\r", + " buttonId = 2;\r", + " break;\r", + " case 'Y':\r", + " case 'TRIANGLE':\r", + " buttonId = 3;\r", + " break;\r", + " case 'LB':\r", + " case 'L1':\r", + " buttonId = 4;\r", + " break;\r", + " case 'RB':\r", + " case 'R1':\r", + " buttonId = 5;\r", + " break;\r", + " case 'LT':\r", + " case 'L2':\r", + " buttonId = 6;\r", + " break;\r", + " case 'RT':\r", + " case 'R2':\r", + " buttonId = 7;\r", + " break;\r", + "\r", + " case 'UP':\r", + " buttonId = 12;\r", + " break;\r", + " case 'DOWN':\r", + " buttonId = 13;\r", + " break;\r", + " case 'LEFT':\r", + " buttonId = 14;\r", + " break;\r", + " case 'RIGHT':\r", + " buttonId = 15;\r", + " break;\r", + "\r", + " case 'BACK':\r", + " case 'SHARE':\r", + " buttonId = 8;\r", + " break;\r", + " case 'START':\r", + " case 'OPTIONS':\r", + " buttonId = 9;\r", + " break;\r", + "\r", + " case 'CLICK_STICK_LEFT':\r", + " buttonId = 10;\r", + " break;\r", + " case 'CLICK_STICK_RIGHT':\r", + " buttonId = 11;\r", + " break;\r", + "\r", + " //PS4\r", + " case 'PS_BUTTON':\r", + " buttonId = 16;\r", + " break;\r", + " case 'CLICK_TOUCHPAD':\r", + " buttonId = 17;\r", + " break;\r", + "\r", + " default:\r", + " console.error('The button: ' + button + ' in condition: \"Gamepad button pressed\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + "}\r", + "\r", + "\r", + "\r", + "if (buttonId === undefined) {\r", + " console.error('There is no buttons valid in condition: \"Gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "if (gamepad.buttons == null || gamepad.buttons[buttonId] == null) {\r", + " console.error('Buttons on the gamepad are not accessible in condition: \"Gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "//When a button is pressed, save the button in lastButtonUsed for each players\r", + "if (gamepad.buttons[buttonId].pressed) gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + "eventsFunctionContext.returnValue = gamepad.buttons[buttonId].pressed;\r", + "\r", + "\r", + "\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Name of the button", + "name": "button", + "supplementaryInformation": "[\"A\",\"Cross\",\"B\",\"Circle\",\"X\",\"Square\",\"Y\",\"Triangle\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"Up\",\"Down\",\"Left\",\"Right\",\"Back\",\"Share\",\"Start\",\"Options\",\"Click_Stick_Left\",\"Click_Stick_Right\",\"PS_Button\",\"Click_Touchpad\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the value of the deadzone applied to a gamepad sticks, between 0 and 1.", + "fullName": "Gamepad deadzone for sticks", + "functionType": "Expression", + "name": "Deadzone", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in expression: \"Gamepad deadzone for sticks\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "///Return the deadzone value for a given player\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].deadzone;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set the deadzone for sticks of the gamepad. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved). Deadzone is between 0 and 1, and is by default 0.2.", + "fullName": "Set gamepad deadzone for sticks", + "functionType": "Action", + "name": "A_Set_deadzone", + "sentence": "Set deadzone for sticks on gamepad: _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const newDeadzone = eventsFunctionContext.getArgument(\"deadzone\");\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in action: \"Set gamepad deadzone for sticks\", is not valid, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "\r", + "// clamp the newDeadzone in range [0, 1].\r", + "// https://github.com/4ian/GDevelop-extensions/pull/33#issuecomment-618224857\r", + "gdjs._extensionController.players[playerId].deadzone = gdjs.evtTools.common.clamp(newDeadzone, 0, 1);\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Deadzone for sticks, 0.2 by default (0 to 1)", + "name": "deadzone", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a stick of a gamepad is pushed in a given direction.", + "fullName": "Gamepad stick pushed (axis)", + "functionType": "Condition", + "name": "C_Axis_pushed", + "sentence": "_PARAM2_ stick of gamepad _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "const direction = eventsFunctionContext.getArgument(\"direction\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Gamepad stick pushed (axis)\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (stick != \"LEFT\" && stick != \"RIGHT\") {\r", + " console.error('Parameter stick in condition: \"Gamepad stick pushed (axis)\", is not valid, must be LEFT or RIGHT');\r", + " return;\r", + "}\r", + "if (direction != \"UP\" && direction != \"DOWN\" && direction != \"LEFT\" && direction != \"RIGHT\" && direction != \"ANY\") {\r", + " console.error('Parameter deadzone in condition: \"Gamepad stick pushed (axis)\", is not valid, must be UP, DOWN, LEFT or RIGHT');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) {\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "\r", + "//Define in onFirstSceneLoaded function\r", + "const getNormalizedAxisValue = gdjs._extensionController.getNormalizedAxisValue;\r", + "\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " switch (direction) {\r", + " case 'LEFT':\r", + " if (getNormalizedAxisValue(gamepad.axes[0], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " if (getNormalizedAxisValue(gamepad.axes[0], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'UP':\r", + " if (getNormalizedAxisValue(gamepad.axes[1], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'DOWN':\r", + " if (getNormalizedAxisValue(gamepad.axes[1], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'ANY':\r", + " if ( getNormalizedAxisValue(gamepad.axes[0], playerId) < 0\r", + " || getNormalizedAxisValue(gamepad.axes[0], playerId) > 0\r", + " || getNormalizedAxisValue(gamepad.axes[1], playerId) < 0 \r", + " || getNormalizedAxisValue(gamepad.axes[1], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " console.error('The value Direction on stick Left on the condition: \"Gamepad stick pushed (axis)\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " switch (direction) {\r", + " case 'LEFT':\r", + " if (getNormalizedAxisValue(gamepad.axes[2], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " if (getNormalizedAxisValue(gamepad.axes[2], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'UP':\r", + " if (getNormalizedAxisValue(gamepad.axes[3], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'DOWN':\r", + " if (getNormalizedAxisValue(gamepad.axes[3], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'ANY':\r", + " if ( getNormalizedAxisValue(gamepad.axes[2], playerId) < 0\r", + " || getNormalizedAxisValue(gamepad.axes[2], playerId) > 0\r", + " || getNormalizedAxisValue(gamepad.axes[3], playerId) < 0 \r", + " || getNormalizedAxisValue(gamepad.axes[3], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " console.error('The value Direction on stick Right on the condition: \"Gamepad stick pushed (axis)\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " console.error('The value Stick on the condition: \"Gamepad stick pushed (axis)\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + "}\r", + "\r", + "eventsFunctionContext.returnValue = false;\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Stick: \"Left\" or \"Right\"", + "name": "stick", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"Any\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the number of connected gamepads.", + "fullName": "Connected gamepads number", + "functionType": "Expression", + "name": "ConnectedGamepadsCount", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "// Gamepads can be disconnected and become null, so we have to filter them.\r", + "eventsFunctionContext.returnValue = Object.keys(gamepads).filter(key => !!gamepads[key]).length;\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Return a string containing informations about the specified gamepad.", + "fullName": "Gamepad type", + "functionType": "StringExpression", + "name": "GamepadType", + "sentence": "Player _PARAM1_ use _PARAM2_ controller", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameter", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in string expression: \"Gamepad type\", is not valid number, must be between 0 and 4');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "eventsFunctionContext.returnValue = (gamepad && gamepad.id) ? gamepad.id : \"No information for player \" + (playerId + 1)", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the specified gamepad has the specified information in its description. Useful to know if the gamepad is a Xbox or PS4 controller.", + "fullName": "Gamepad type", + "functionType": "Condition", + "name": "C_Controller_type", + "sentence": "Gamepad _PARAM1_ is a _PARAM2_ controller", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;", + "const controllerType = eventsFunctionContext.getArgument(\"controller_type\").toUpperCase();", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in condition: \"Gamepad type\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "if (controllerType === \"\") {", + " console.error('Parameter type in condition: \"Gamepad type\", is not a string.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "", + "if (controllerType == \"XBOX\") {", + " eventsFunctionContext.returnValue = gdjs._extensionController.isXbox(gamepad);", + "} else {", + " eventsFunctionContext.returnValue = gamepad ? gamepad.id.toUpperCase().indexOf(controllerType) !== -1 : false;", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + }, + { + "description": "Type: \"Xbox\", \"PS4\", \"Steam\" or \"PS3\" (among other)", + "name": "controller_type", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a gamepad is connected.", + "fullName": "Gamepad connected", + "functionType": "Condition", + "name": "C_Controller_X_is_connected", + "sentence": "Gamepad _PARAM1_ is plugged and connected", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameter", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in condition: \"Gamepad connected\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "", + "// If gamepad was disconnected it will be null (so this will return false)", + "// If gamepad was never connected it will be undefined (so this will return false)", + "eventsFunctionContext.returnValue = !!gamepads[playerId];" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Generate a vibration on the specified controller. Might only work if the game is running in a recent web browser.", + "fullName": "Gamepad vibration", + "functionType": "Action", + "name": "A_Vibrate_controller", + "sentence": "Make gamepad _PARAM1_ vibrate for _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */", + "//Vibration work only on game in browser.", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;", + "const duration = eventsFunctionContext.getArgument(\"Duration\") || 1;", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in action: \"Gamepad connected\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "if (gamepad && gamepad.vibrationActuator) {", + " gamepad.vibrationActuator.playEffect(\"dual-rumble\", {", + " startDelay: 0,", + " duration: duration * 1000,", + " weakMagnitude: 1.0,", + " strongMagnitude: 1.0", + " });", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "type": "expression" + }, + { + "description": "Time of the vibration, in seconds (optional, default value is 1)", + "name": "Duration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Generate an advanced vibration on the specified controller. Incompatible with Firefox.", + "fullName": "Advanced gamepad vibration", + "functionType": "Action", + "name": "A_Advanced_Vibration_Controller", + "sentence": "Make gamepad _PARAM1_ vibrate for _PARAM2_ seconds with the vibration magnitude of _PARAM3_ and _PARAM4_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */", + "//Vibration work only on game in browser.", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;", + "const duration = eventsFunctionContext.getArgument(\"Duration\") || 1;", + "const strongRumbleMagnitude = eventsFunctionContext.getArgument(\"StrongMagnitude\");", + "const weakRumbleMagnitude = eventsFunctionContext.getArgument(\"WeakMagnitude\");", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in action: \"Advanced gamepad vibration\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "if (weakRumbleMagnitude < 0 || weakRumbleMagnitude > 1) {", + " console.error('Parameter weakRumble identifier in action: \"Advanced gamepad vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "if (strongRumbleMagnitude < 0 || strongRumbleMagnitude > 1) {", + " console.error('Parameter strongRumble identifier in action: \"Advanced gamepad vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug the controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "if (gamepad && gamepad.vibrationActuator) {", + " gamepad.vibrationActuator.playEffect(\"dual-rumble\", {", + " startDelay: 0,", + " duration: duration * 1000,", + " weakMagnitude: weakRumbleMagnitude,", + " strongMagnitude: strongRumbleMagnitude", + " });", + "}", + "", + "gdjs._extensionController.players[playerId].rumble.duration = duration;", + "gdjs._extensionController.players[playerId].rumble.elapsedTime = 0;", + "gdjs._extensionController.players[playerId].rumble.weakMagnitude = weakRumbleMagnitude;", + "gdjs._extensionController.players[playerId].rumble.strongMagnitude = strongRumbleMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "type": "expression" + }, + { + "description": "Time of the vibration, in seconds (optional, default value is 1)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Strong rumble magnitude (from 0 to 1)", + "name": "StrongMagnitude", + "type": "expression" + }, + { + "description": "Weak rumble magnitude (from 0 to 1)", + "name": "WeakMagnitude", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change a vibration on the specified controller. Incompatible with Firefox.", + "fullName": "Change gamepad active vibration", + "functionType": "Action", + "name": "A_Change_Vibration_Magnitude", + "sentence": "Change the vibration magnitude of _PARAM2_ & _PARAM3_ on gamepad _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */", + "//Vibration work only on game in browser.", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;", + "const elapsedTime = gdjs._extensionController.players[playerId].rumble.elapsedTime || 0;", + "const originalDuration = gdjs._extensionController.players[playerId].rumble.duration || 1;", + "const strongRumbleMagnitude = eventsFunctionContext.getArgument(\"StrongMagnitude\");", + "const weakRumbleMagnitude = eventsFunctionContext.getArgument(\"WeakMagnitude\");", + "", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in action: \"Change gamepad active vibration\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "if (weakRumbleMagnitude < 0 || weakRumbleMagnitude > 1) {", + " console.error('Parameter weakRumble identifier in action: \"Change gamepad active vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "if (strongRumbleMagnitude < 0 || strongRumbleMagnitude > 1) {", + " console.error('Parameter strongRumble identifier in action: \"Change gamepad active vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug the controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "if (originalDuration - elapsedTime <= 0) return;", + "", + "if (gamepad && gamepad.vibrationActuator) {", + " gamepad.vibrationActuator.playEffect(\"dual-rumble\", {", + " startDelay: 0,", + " duration: 1000 * (originalDuration - elapsedTime),", + " weakMagnitude: weakRumbleMagnitude,", + " strongMagnitude: strongRumbleMagnitude", + " });", + "}", + "", + "gdjs._extensionController.players[playerId].rumble.weakMagnitude = weakRumbleMagnitude;", + "gdjs._extensionController.players[playerId].rumble.strongMagnitude = strongRumbleMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "type": "expression" + }, + { + "description": "Strong rumble magnitude (from 0 to 1)", + "name": "StrongMagnitude", + "type": "expression" + }, + { + "description": "Weak rumble magnitude (from 0 to 1)", + "name": "WeakMagnitude", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onFirstSceneLoaded", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Define an new private object javascript for the gamepad extension\r", + "gdjs._extensionController = {\r", + " players: {\r", + " 0: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " 1: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " 2: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " 3: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " },\r", + " lastActiveController: -1, // Last active controller\r", + " controllerButtonNames: { //Map associating controller button ids to button names\r", + " \"XBOX\": {\r", + " 0: \"A\",\r", + " 1: \"B\",\r", + " 2: \"X\",\r", + " 3: \"Y\",\r", + " 4: \"LB\",\r", + " 5: \"RB\",\r", + " 6: \"LT\",\r", + " 7: \"RT\",\r", + " 8: \"BACK\",\r", + " 9: \"START\",\r", + " 10: \"CLICK_STICK_LEFT\",\r", + " 11: \"CLICK_STICK_RIGHT\",\r", + " 12: \"UP\",\r", + " 13: \"DOWN\",\r", + " 14: \"LEFT\",\r", + " 15: \"RIGHT\",\r", + " 16: \"NONE\",\r", + " 17: \"NONE\"\r", + " },\r", + " \"PS4\": {\r", + " 0: \"CROSS\",\r", + " 1: \"CIRCLE\",\r", + " 2: \"SQUARE\",\r", + " 3: \"TRIANGLE\",\r", + " 4: \"L1\",\r", + " 5: \"R1\",\r", + " 6: \"L2\",\r", + " 7: \"R2\",\r", + " 8: \"SHARE\",\r", + " 9: \"OPTIONS\",\r", + " 10: \"CLICK_STICK_LEFT\",\r", + " 11: \"CLICK_STICK_RIGHT\",\r", + " 12: \"UP\",\r", + " 13: \"DOWN\",\r", + " 14: \"LEFT\",\r", + " 15: \"RIGHT\",\r", + " 16: \"PS_BUTTON\",\r", + " 17: \"CLICK_TOUCHPAD\"\r", + " }\r", + " }\r", + "};\r", + "\r", + "gdjs._extensionController.getInputString = function (type, buttonId) {\r", + " const controllerButtonNames = gdjs._extensionController.controllerButtonNames;\r", + " if (controllerButtonNames[type] !== undefined) {\r", + " return controllerButtonNames[type][buttonId];\r", + " }\r", + "\r", + " return \"UNKNOWN_BUTTON\";\r", + "}\r", + "\r", + "gdjs._extensionController.axisToAngle = function (deltaX, deltaY) {\r", + " const rad = Math.atan2(deltaY, deltaX);\r", + " const deg = rad * (180 / Math.PI);\r", + " return deg;\r", + "}\r", + "\r", + "gdjs._extensionController.isXbox = function (gamepad) {\r", + " return (gamepad ? (\r", + " gamepad.id.toUpperCase().indexOf(\"XBOX\") !== -1\r", + " // \"XINPUT\" cannot be used to check if it is a xbox controller is just a generic\r", + " // name reported in Firefox corresponding to the driver being used by the controller\r", + " // https://gamefaqs.gamespot.com/boards/916373-pc/73341312?page=1\r", + " ) : false);\r", + "}\r", + "\r", + "//Returns the new value taking into account the dead zone for the player_ID given\r", + "gdjs._extensionController.getNormalizedAxisValue = function (v, player_ID) {\r", + " // gdjs._extensionController = gdjs._extensionController || { deadzone: 0.2 };\r", + "\r", + " // Anything smaller than this is assumed to be 0,0\r", + " const DEADZONE = gdjs._extensionController.players[player_ID].deadzone;\r", + "\r", + " if (Math.abs(v) < DEADZONE) {\r", + " // In the dead zone, set to 0\r", + " v = 0;\r", + "\r", + " if (v == null) {\r", + " return 0;\r", + " } else {\r", + " return v;\r", + " }\r", + "\r", + " } else {\r", + " // We're outside the dead zone, but we'd like to smooth\r", + " // this value out so it still runs nicely between 0..1.\r", + " // That is, we don't want it to jump suddenly from 0 to\r", + " // DEADZONE.\r", + "\r", + " // Remap v from\r", + " // DEADZONE..1 to 0..(1-DEADZONE)\r", + " // or from\r", + " // -1..-DEADZONE to -(1-DEADZONE)..0\r", + "\r", + " v = v - Math.sign(v) * DEADZONE;\r", + "\r", + " // Remap v from\r", + " // 0..(1-DEADZONE) to 0..1\r", + " // or from\r", + " // -(1-DEADZONE)..0 to -1..0\r", + "\r", + " return v / (1 - DEADZONE);\r", + " }\r", + "};" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Each time a player press a button i save the last button pressed for the next frame", + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameter", + "let countPlayers = Object.keys(gdjs._extensionController.players).length;", + "", + "//Repeat for each players", + "for (let i = 0; i < countPlayers; i++) {", + " let gamepad = gamepads[i]; // Get the gamepad of the player", + "", + " //We have to keep this condition because if the user hasn't plugged in his controller yet, we can't get the controller in the gamepad variable.", + " if (gamepad == null) {", + " continue;", + " }", + "", + " for (let b = 0; b < Object.keys(gamepad.buttons).length; b++) { //For each buttons", + " if (gamepad.buttons[b].pressed) { //One of them is pressed", + " gdjs._extensionController.players[i].lastButtonUsed = b; //Save the button pressed", + "", + " //Save the state of the button for the next frame.", + " gdjs._extensionController.players[i].previousFrameStateButtons[b] = { pressed: true };", + "", + " // Update Last Active Controller", + " gdjs._extensionController.lastActiveController = i;", + " } else {", + " gdjs._extensionController.players[i].previousFrameStateButtons[b] = { pressed: false };", + " }", + " }", + "", + "", + " gdjs._extensionController.players[i].rumble.elapsedTime += runtimeScene.getElapsedTime(runtimeScene) / 1000;", + " if (", + " gdjs._extensionController.players[i].rumble.duration - gdjs._extensionController.players[i].rumble.elapsedTime <= 0 &&", + " (gdjs._extensionController.players[i].rumble.weakMagnitude || gdjs._extensionController.players[i].rumble.strongMagnitude)", + " ) {", + " gdjs._extensionController.players[i].rumble.weakMagnitude = 0;", + " gdjs._extensionController.players[i].rumble.strongMagnitude = 0;", + " }", + "", + "", + "}", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if any button is released on a gamepad.", + "fullName": "Any gamepad button released", + "functionType": "Condition", + "name": "C_any_button_released", + "sentence": "Any button of gamepad _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + "\tconsole.error('Parameter gamepad identifier in condition: \"Any gamepad button released\", is not valid number, must be between 0 and 4.');\r", + "\treturn;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "for (let buttonId = 0; buttonId < gamepad.buttons.length; buttonId++) { //For each buttons on current frame.\r", + "\r", + "\tif (buttonId === undefined) {\r", + "\t\teventsFunctionContext.returnValue = false;\r", + "\t\treturn;\r", + "\t}\r", + "\r", + "\t//Get previous value or define value by default for the current button\r", + "\tgdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] || { pressed: false };\r", + "\r", + "\t//Get state of the button at previous frame\r", + "\tconst previousStateButtonIsPressed = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed;\r", + "\r", + "\t//Get the state of the button on the current frame.\r", + "\tconst currentFrameStateButtonIsPressed = gamepad.buttons[buttonId].pressed;\r", + "\r", + "\t//When previousStateButtonIsPressed is true and actual button state is not pressed\r", + "\t//Player have release the button\r", + "\tif (previousStateButtonIsPressed === true && currentFrameStateButtonIsPressed === false) {\r", + "\t\tgdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = true;\r", + "\t\teventsFunctionContext.returnValue = true;\r", + "\t\t//break;\r", + "\t\treturn;\r", + "\t} else {\r", + "\t\t//The player didn't released the button yet, the previous frame state is still true\r", + "\t\tgdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = false;\r", + "\t\teventsFunctionContext.returnValue = false;\r", + "\t}\r", + "\r", + "\tif (currentFrameStateButtonIsPressed) gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + "}\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the strength of the weak vibration motor on the gamepad of a player.", + "fullName": "Weak rumble magnitude", + "functionType": "Expression", + "name": "WeakVibrationMagnitude", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].rumble.weakMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the strength of the strong vibration motor on the gamepad of a player.", + "fullName": "Strong rumble magnitude", + "functionType": "Expression", + "name": "StrongVibrationMagnitude", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].rumble.strongMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Control a platformer character with a gamepad.", + "fullName": "Platformer gamepad mapper", + "name": "PlatformerGamepadMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Controller_X_is_connected" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyUseArrows" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Up\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Down\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyUseLeftStick" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyUseRightStick" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"A or Cross\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"A\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"B or Circle\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"B\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"X or Square\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"X\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Y or Triangle\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Y\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"LB or L1\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"LB\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"RB or R1\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"RB\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"LT or L2\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"LT\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyJumpButton" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"RT or R2\"" + ] + }, + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"RT\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Gamepads::PlatformerGamepadMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "1", + "type": "Number", + "label": "Gamepad identifier (1, 2, 3 or 4)", + "description": "", + "group": "", + "extraInformation": [], + "name": "GamepadIdentifier" + }, + { + "value": "true", + "type": "Boolean", + "label": "Use directional pad", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "UseArrows" + }, + { + "value": "true", + "type": "Boolean", + "label": "Use left stick", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "UseLeftStick" + }, + { + "value": "", + "type": "Boolean", + "label": "Use right stick", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "UseRightStick" + }, + { + "value": "A or Cross", + "type": "Choice", + "label": "Jump button", + "description": "", + "group": "Controls", + "extraInformation": [ + "A or Cross", + "B or Circle", + "X or Square", + "Y or Triangle", + "LB or L1", + "RB or R1", + "LT or L2", + "RT or R2" + ], + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a gamepad.", + "fullName": "Top-down gamepad mapper", + "name": "TopDownGamepadMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Controller_X_is_connected" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyUseArrows" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Up\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Down\"", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyUseLeftStick" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::TopDownGamepadMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "Gamepads::StickRotationValue(Object.Behavior::PropertyGamepadIdentifier(), \"Left\")", + "Gamepads::StickForce(Object.Behavior::PropertyGamepadIdentifier(), \"Left\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::TopDownGamepadMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "Gamepads::StickRotationValue(Object.Behavior::PropertyGamepadIdentifier(), \"Left\")", + "sign(Gamepads::StickForce(Object.Behavior::PropertyGamepadIdentifier(), \"Left\"))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::TopDownGamepadMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Left\"", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::PlatformerGamepadMapper::PropertyUseRightStick" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::TopDownGamepadMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "Gamepads::StickRotationValue(Object.Behavior::PropertyGamepadIdentifier(), \"Right\")", + "Gamepads::StickForce(Object.Behavior::PropertyGamepadIdentifier(), \"Right\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::TopDownGamepadMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "sign(Gamepads::StickForce(Object.Behavior::PropertyGamepadIdentifier(), \"Right\"))", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::TopDownGamepadMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyGamepadIdentifier()", + "\"Right\"", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Gamepads::TopDownGamepadMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "description": "", + "group": "", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Gamepad identifier (1, 2, 3 or 4)", + "description": "", + "group": "", + "extraInformation": [], + "name": "GamepadIdentifier" + }, + { + "value": "true", + "type": "Boolean", + "label": "Use directional pad", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "UseArrows" + }, + { + "value": "true", + "type": "Boolean", + "label": "Use left stick", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "UseLeftStick" + }, + { + "value": "", + "type": "Boolean", + "label": "Use right stick", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "UseRightStick" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "description": "", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] +} \ No newline at end of file diff --git a/src/eventsFunctionsExtensions/references.json b/src/eventsFunctionsExtensions/references.json new file mode 100644 index 00000000..e4feb313 --- /dev/null +++ b/src/eventsFunctionsExtensions/references.json @@ -0,0 +1,152 @@ +{ + "author": "Arthur Pacaud (arthuro555)", + "category": "", + "extensionNamespace": "", + "fullName": "Variables/References", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXZhcmlhYmxlLWJveCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOSAzSDVDMy45IDMgMyAzLjkgMyA1VjE5QzMgMjAuMSAzLjkgMjEgNSAyMUgxOUMyMC4xIDIxIDIxIDIwLjEgMjEgMTlWNUMyMSAzLjkgMjAuMSAzIDE5IDNNNy40IDE4QzUuOSAxNi41IDUgMTQuMyA1IDEyUzUuOSA3LjUgNy40IDZMOSA2LjdDNy43IDcuOSA3IDkuOSA3IDEyUzcuNyAxNi4xIDkgMTcuM0w3LjQgMThNMTIuNyAxNUwxMS45IDEzTDEwLjUgMTVIOUwxMS4zIDExLjlMMTAgOUgxMS4zTDEyLjEgMTFMMTMuNSA5SDE1TDEyLjggMTJMMTQuMSAxNUgxMi43TTE2LjYgMThMMTUgMTcuM0MxNi4zIDE2IDE3IDE0LjEgMTcgMTJTMTYuMyA3LjkgMTUgNi43TDE2LjYgNkMxOC4xIDcuNSAxOSA5LjcgMTkgMTJTMTguMSAxNi41IDE2LjYgMThaIiAvPjwvc3ZnPg==", + "name": "References", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/variable-box.svg", + "shortDescription": "Adds references and pointers for variables.", + "version": "1.0.0", + "description": "Adds actions to use references (variable that redirect any read/write to another variable) and pointers (unique numbers identifying a variable that can be resolved to a reference). Some usages are for callback variables in events based functions (getting a variable with a fixed name referring to a variable with a name passed as parameter), pointers to make advanced data structures like linked lists, and getting a top level variable dynamically.", + "origin": { + "identifier": "References", + "name": "gdevelop-extension-store" + }, + "tags": [ + "advanced", + "variables", + "reference", + "pointer", + "ref", + "memory", + "callback" + ], + "authorIds": [ + "ZgrsWuRTAkXgeuPV9bo0zuEcA2w1" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Transforms a scene variable into a reference to another scene variable.", + "fullName": "Create reference to scene variable", + "functionType": "Action", + "name": "CreateReference", + "sentence": "Make variable _PARAM1_ a reference to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const reference = eventsFunctionContext.getArgument(\"reference\");", + "const source = eventsFunctionContext.getArgument(\"source\");", + "", + "// Override each method ", + "for (let func of Object.getOwnPropertyNames(gdjs.Variable.prototype))", + " reference[func] = gdjs.Variable.prototype[func].bind(source);", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "The scene variable to turn into a reference", + "name": "reference", + "type": "scenevar" + }, + { + "description": "The scene variable the reference will refer to", + "name": "source", + "type": "scenevar" + } + ], + "objectGroups": [] + }, + { + "description": "Transforms a scene variable into a reference to a global variable.", + "fullName": "Create reference to global variable", + "functionType": "Action", + "name": "CreateGlobalReference", + "sentence": "Make variable _PARAM1_ a reference to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const reference = eventsFunctionContext.getArgument(\"reference\");", + "const source = eventsFunctionContext.getArgument(\"source\");", + "", + "// Override each method ", + "for (let func of Object.getOwnPropertyNames(gdjs.Variable.prototype))", + " reference[func] = gdjs.Variable.prototype[func].bind(source);", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "The scene variable to turn into a reference", + "name": "reference", + "type": "scenevar" + }, + { + "description": "The global variable the reference will refer to", + "name": "source", + "type": "globalvar" + } + ], + "objectGroups": [] + }, + { + "description": "Transforms a scene variable into a reference to an object's variable.", + "fullName": "Create reference to object variable", + "functionType": "Action", + "name": "CreateObjectReference", + "sentence": "Make variable _PARAM2_ a reference to variable _PARAM3_ of _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const reference = eventsFunctionContext.getArgument(\"reference\");", + "const source = eventsFunctionContext.getArgument(\"source\");", + "", + "console.log(reference, source)", + "", + "// Override each method ", + "for (let func of Object.getOwnPropertyNames(gdjs.Variable.prototype))", + " reference[func] = gdjs.Variable.prototype[func].bind(source);", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "The object that possesses the variable to refer to", + "name": "Object", + "type": "objectList" + }, + { + "description": "The scene variable to turn into a reference", + "name": "reference", + "type": "scenevar" + }, + { + "description": "The object variable the reference will refer to", + "name": "source", + "type": "objectvar" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] +} \ No newline at end of file diff --git a/src/externalEvents/game.json b/src/externalEvents/game.json index 8f33fd7e..bcd0a186 100644 --- a/src/externalEvents/game.json +++ b/src/externalEvents/game.json @@ -13,6 +13,13 @@ "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ + { + "type": "BuiltinCommonInstructions::Link", + "include": { + "includeConfig": 0 + }, + "target": "WeaponWheel" + }, { "type": "BuiltinCommonInstructions::Link", "include": { diff --git a/src/externalEvents/player.json b/src/externalEvents/player.json index 7b828e28..c3141048 100644 --- a/src/externalEvents/player.json +++ b/src/externalEvents/player.json @@ -1719,11 +1719,31 @@ "conditions": [ { "type": { - "value": "KeyPressed" + "value": "BuiltinCommonInstructions::Or" }, - "parameters": [ - "", - "a" + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "a" + ] + }, + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "1", + "\"Left\"", + "\"Left\"", + "" + ] + } ] } ], @@ -1747,11 +1767,31 @@ "conditions": [ { "type": { - "value": "KeyPressed" + "value": "BuiltinCommonInstructions::Or" }, - "parameters": [ - "", - "d" + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "d" + ] + }, + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "1", + "\"Left\"", + "\"Right\"", + "" + ] + } ] } ], @@ -1775,11 +1815,31 @@ "conditions": [ { "type": { - "value": "KeyPressed" + "value": "BuiltinCommonInstructions::Or" }, - "parameters": [ - "", - "w" + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "w" + ] + }, + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "1", + "\"Left\"", + "\"Up\"", + "" + ] + } ] } ], @@ -1803,11 +1863,31 @@ "conditions": [ { "type": { - "value": "KeyPressed" + "value": "BuiltinCommonInstructions::Or" }, - "parameters": [ - "", - "s" + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "s" + ] + }, + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "1", + "\"Left\"", + "\"Down\"", + "" + ] + } ] } ], diff --git a/src/externalEvents/weaponselect.json b/src/externalEvents/weaponselect.json new file mode 100644 index 00000000..d1dfdaac --- /dev/null +++ b/src/externalEvents/weaponselect.json @@ -0,0 +1,165 @@ +{ + "associatedLayout": "City", + "lastChangeTimeStamp": 0, + "name": "WeaponSelect", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Select", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "bar", + "Resizable", + "=", + "SceneWindowWidth() + 4" + ] + }, + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "icons", + "Scale", + "=", + "0.8" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ExtendedVariables::CopyGlobalVariableToScene" + }, + "parameters": [ + "", + "\"Player.Weapons.Active\"", + "\"Player.Weapons.Active\"", + "yes", + "" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "Player.Weapons.Active", + "\"info\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::ForEachChildVariable", + "iterableVariableName": "Player.Weapons.Active", + "valueIteratorVariableName": "child", + "keyIteratorVariableName": "i", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "Player.Weapons.Active[VariableString(i)]", + "True" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "icons", + "bar.CenterX() + Player.WeaponWheel.adder", + "bar.CenterY()", + "\"UI\"" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "icons", + "Animation", + "=", + "VariableString(i)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Player.WeaponWheel.adder", + "+", + "300" + ] + }, + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "VariableString(child)", + "\"info\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + } + ] +} \ No newline at end of file diff --git a/src/externalEvents/weaponwheel.json b/src/externalEvents/weaponwheel.json new file mode 100644 index 00000000..9ab65b40 --- /dev/null +++ b/src/externalEvents/weaponwheel.json @@ -0,0 +1,577 @@ +{ + "associatedLayout": "City", + "lastChangeTimeStamp": 0, + "name": "WeaponWheel", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Select", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "bar", + "Resizable", + "=", + "SceneWindowWidth() + 4" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"WeaponWheel\"", + "0", + "0", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Tab" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "WeaponWheel", + "" + ] + }, + { + "type": { + "value": "MontreSouris" + }, + "parameters": [ + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Tween::TweenBehavior::AddObjectPositionXTween2" + }, + "parameters": [ + "weaponWheelSticker", + "Tween", + "\"weaponWheelStickerAlign\"", + "SceneWindowWidth()/2 - weaponWheelSticker.Width()/2", + "\"easeOutQuad\"", + "0.5", + "" + ] + }, + { + "type": { + "value": "Tween::TweenNumberEffectPropertyTween" + }, + "parameters": [ + "", + "\"weaponWheelFade\"", + "20", + "", + "\"weaponwhe\"", + "\"blur\"", + "\"easeOutQuad\"", + "0.5" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectOpacityTween2" + }, + "parameters": [ + "bar", + "Tween", + "\"bar\"", + "255", + "\"linear\"", + "0.1", + "" + ] + }, + { + "type": { + "value": "MontreSouris" + }, + "parameters": [ + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "KeyPressed" + }, + "parameters": [ + "", + "Tab" + ] + } + ], + "actions": [ + { + "type": { + "value": "CacheSouris" + }, + "parameters": [ + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Tween::TweenNumberEffectPropertyTween" + }, + "parameters": [ + "", + "\"weaponWheelFade\"", + "0", + "", + "\"weaponwhe\"", + "\"blur\"", + "\"easeInQuad\"", + "0.3" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectPositionXTween2" + }, + "parameters": [ + "weaponWheelSticker", + "Tween", + "\"weaponWheelStickerAlign\"", + "SceneWindowWidth()/2 - weaponWheelSticker.Width()/2 + 50", + "\"easeOutQuad\"", + "0.3", + "" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectOpacityTween2" + }, + "parameters": [ + "bar", + "Tween", + "\"bar\"", + "0", + "\"linear\"", + "0.3", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.2" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "WeaponWheel" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisSurObjet" + }, + "parameters": [ + "icons", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Tween::TweenBehavior::AddObjectScaleTween3" + }, + "parameters": [ + "icons", + "Tween", + "\"weaponWheelHoverScale\"", + "1", + "\"easeInQuad\"", + "0.05", + "", + "yes" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectAngleTween2" + }, + "parameters": [ + "icons", + "Tween", + "\"weaponWheelHoverRotate\"", + "0.8", + "\"easeInQuad\"", + "0.05", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "icons", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Tween::TweenBehavior::AddObjectScaleTween3" + }, + "parameters": [ + "icons", + "Tween", + "\"weaponWheelHoverScale\"", + "1.2", + "\"easeInQuad\"", + "0.2", + "", + "yes" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectAngleTween2" + }, + "parameters": [ + "icons", + "Tween", + "\"weaponWheelHoverRotate\"", + "-45", + "\"easeInQuad\"", + "0.2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::ForEachChildVariable", + "iterableVariableName": "Player.Weapons.Active", + "valueIteratorVariableName": "child", + "keyIteratorVariableName": "i", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "Player.Weapons.Active[VariableString(i)].active", + "True" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "Player.Weapons.Slot.current", + "<", + "Player.Weapons.Slot.max" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "icons", + "weaponWheelSticker.CenterX() + Player.WeaponWheel.adder", + "bar.CenterY()", + "\"UI\"" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Player.WeaponWheel.adder", + "+", + "icons.Width() + 50" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "weaponWheelSticker", + "Resizable", + "=", + "Player.WeaponWheel.adder" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetHeight" + }, + "parameters": [ + "weaponWheelSticker", + "Resizable", + "=", + "bar.Height()" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "icons", + "Animation", + "=", + "VariableString(i)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Player.Weapons.Slot.current", + "+", + "Player.Weapons.Active[VariableString(i)].slot" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "icons", + "Sticker", + "weaponWheelSticker", + "" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectPositionXTween2" + }, + "parameters": [ + "weaponWheelSticker", + "Tween", + "\"weaponWheelStickerAlign\"", + "SceneWindowWidth()/2 - weaponWheelSticker.Width()/2 + 50", + "\"linear\"", + "0.5", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "weaponWheelSticker" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "WeaponWheel" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "icons", + "=", + "", + "" + ] + }, + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "Player.Weapons.Selected", + "=", + "icons.Animation::Name()" + ] + }, + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "AmmoText", + "Text", + "=", + "Player.Weapons.Selected" + ] + } + ] + } + ], + "parameters": [] + } + ] +} \ No newline at end of file diff --git a/src/externalLayouts/weaponselect.json b/src/externalLayouts/weaponselect.json new file mode 100644 index 00000000..30575f7d --- /dev/null +++ b/src/externalLayouts/weaponselect.json @@ -0,0 +1,36 @@ +{ + "associatedLayout": "City", + "name": "WeaponSelect", + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 201, + "keepRatio": true, + "layer": "UI", + "name": "bar", + "persistentUuid": "b2b01e97-40ff-4a40-847f-b389514ffb53", + "width": 1920, + "x": -2, + "y": 757, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.3895856273827297, + "windowMask": false + } +} \ No newline at end of file diff --git a/src/externalLayouts/weaponwheel.json b/src/externalLayouts/weaponwheel.json new file mode 100644 index 00000000..3bce1796 --- /dev/null +++ b/src/externalLayouts/weaponwheel.json @@ -0,0 +1,53 @@ +{ + "associatedLayout": "City", + "name": "WeaponWheel", + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 201, + "keepRatio": true, + "layer": "UI", + "name": "bar", + "persistentUuid": "b2b01e97-40ff-4a40-847f-b389514ffb53", + "width": 1920, + "x": -2, + "y": 757, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0.9901477832512315, + "height": 201, + "keepRatio": true, + "layer": "UI", + "name": "weaponWheelSticker", + "persistentUuid": "8a24af66-24b2-4908-9964-b239b8e905a7", + "width": 63.36945812807882, + "x": 736, + "y": 757, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 2.756660758663872, + "windowMask": false + } +} \ No newline at end of file diff --git a/src/game.json b/src/game.json index 2b899a12..8df86eab 100644 --- a/src/game.json +++ b/src/game.json @@ -2266,6 +2266,222 @@ "name": "assets/phone/wallpaper/4.png", "smoothed": true, "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/uziSilencer.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/uziSilencer.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/uziLongSilencer.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/uziLongSilencer.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/uziLong.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/uziLong.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/uzi.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/uzi.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/sniper.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/sniper.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/shotgunShort.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/shotgunShort.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/shotgun.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/shotgun.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/rocketlauncherModern.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/rocketlauncherModern.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/rocketlauncher.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/rocketlauncher.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/pistolSilencer.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/pistolSilencer.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/pistol.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/pistol.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/machinegunLauncher.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/machinegunLauncher.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/machinegun.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/machinegun.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/knifeRound_smooth.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/knifeRound_smooth.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/knifeRound_sharp.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/knifeRound_sharp.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/knife_smooth.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/knife_smooth.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/knife_sharp.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/knife_sharp.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/grenadeVintage.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/grenadeVintage.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/grenadeSmoke.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/grenadeSmoke.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/grenadeFlash.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/grenadeFlash.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/grenade.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/grenade.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/flamethrower_short.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/flamethrower_short.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/flamethrower_long.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/flamethrower_long.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/weapons/icons/bar.png", + "kind": "image", + "metadata": "", + "name": "assets/weapons/icons/bar.png", + "smoothed": true, + "userAdded": true } ], "resourceFolders": [] @@ -2414,11 +2630,11 @@ ] }, { - "folded": true, "name": "Player", "type": "structure", "children": [ { + "folded": true, "name": "Customisation", "persistentUuid": "6f3e9e87-d6f3-44d0-a02a-6c8089850a4a", "type": "structure", @@ -2446,6 +2662,7 @@ ] }, { + "folded": true, "name": "debug", "type": "structure", "children": [ @@ -2463,6 +2680,7 @@ ] }, { + "folded": true, "name": "Game", "type": "structure", "children": [ @@ -2612,9 +2830,25 @@ { "__REFERENCE_TO_SPLIT_OBJECT": true, "referenceTo": "/externalEvents/debug" + }, + { + "__REFERENCE_TO_SPLIT_OBJECT": true, + "referenceTo": "/externalEvents/weaponwheel" } ], "eventsFunctionsExtensions": [ + { + "__REFERENCE_TO_SPLIT_OBJECT": true, + "referenceTo": "/eventsFunctionsExtensions/extendedvariables" + }, + { + "__REFERENCE_TO_SPLIT_OBJECT": true, + "referenceTo": "/eventsFunctionsExtensions/references" + }, + { + "__REFERENCE_TO_SPLIT_OBJECT": true, + "referenceTo": "/eventsFunctionsExtensions/gamepads" + }, { "__REFERENCE_TO_SPLIT_OBJECT": true, "referenceTo": "/eventsFunctionsExtensions/spritemasking" @@ -2692,6 +2926,10 @@ { "__REFERENCE_TO_SPLIT_OBJECT": true, "referenceTo": "/externalLayouts/phone" + }, + { + "__REFERENCE_TO_SPLIT_OBJECT": true, + "referenceTo": "/externalLayouts/weaponwheel" } ], "externalSourceFiles": [] diff --git a/src/layouts/city.json b/src/layouts/city.json index e5b9e9fa..2cd2f251 100644 --- a/src/layouts/city.json +++ b/src/layouts/city.json @@ -18,7 +18,7 @@ "gridColor": 10401023, "gridAlpha": 0.8, "snap": false, - "zoomFactor": 0.24113360125461827, + "zoomFactor": 0.3250014140240832, "windowMask": false }, "objectsGroups": [ @@ -66,64 +66,23 @@ "name": "Fences" } ] + }, + { + "name": "WeaponWheel", + "objects": [ + { + "name": "icons" + }, + { + "name": "bar" + }, + { + "name": "weaponWheelSticker" + } + ] } ], "variables": [ - { - "name": "fade", - "type": "string", - "value": "" - }, - { - "name": "walk_in_west", - "type": "string", - "value": "" - }, - { - "name": "walk_in_north", - "type": "string", - "value": "" - }, - { - "name": "separate", - "type": "string", - "value": "" - }, - { - "name": "walk_in_south", - "type": "string", - "value": "" - }, - { - "name": "walk_in_east", - "type": "string", - "value": "" - }, - { - "name": "basketball", - "type": "string", - "value": "" - }, - { - "name": "phone", - "type": "string", - "value": "" - }, - { - "name": "using_phone", - "type": "string", - "value": "" - }, - { - "name": "phone_time", - "type": "string", - "value": "" - }, - { - "name": "Died_effects_tween", - "type": "string", - "value": "" - }, { "folded": true, "name": "DebugVariables", @@ -167,6 +126,223 @@ "value": false } ] + }, + { + "name": "Player", + "type": "structure", + "children": [ + { + "name": "WeaponWheel", + "type": "structure", + "children": [ + { + "folded": true, + "name": "adder", + "type": "number", + "value": 0 + } + ] + }, + { + "name": "Weapons", + "persistentUuid": "156e00a8-0565-4399-b01a-2d67f7dd2aea", + "type": "structure", + "children": [ + { + "name": "Active", + "type": "structure", + "children": [ + { + "name": "pistolSilencer", + "persistentUuid": "ca505ad0-64b4-44ee-b4b4-20ba640dd356", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": true + }, + { + "name": "slot", + "type": "number", + "value": 1 + } + ] + }, + { + "name": "rocketLauncher", + "persistentUuid": "a8cbcdb0-769a-42ec-97ba-2d4452a2f44c", + "type": "structure", + "children": [ + { + "name": "active", + "type": "boolean", + "value": false + }, + { + "name": "slot", + "type": "number", + "value": 2 + } + ] + }, + { + "name": "rocketLauncherModern", + "persistentUuid": "c25e6f18-b9d3-4077-badd-9e7fe02d7289", + "type": "structure", + "children": [ + { + "name": "active", + "type": "boolean", + "value": false + }, + { + "folded": true, + "name": "slot", + "type": "number", + "value": 2 + } + ] + }, + { + "name": "shotgunLong", + "persistentUuid": "1ea7f09e-67e9-446c-b924-8b7841d8c706", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": true + }, + { + "folded": true, + "name": "slot", + "type": "number", + "value": 1 + } + ] + }, + { + "name": "sniper", + "persistentUuid": "fd26e664-81a2-41e1-b99d-eb5b6f68fd1f", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": false + }, + { + "folded": true, + "name": "slot", + "type": "number", + "value": 2 + } + ] + }, + { + "name": "uzi", + "persistentUuid": "8042baed-2539-4ca7-a163-86635a6c0c14", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": false + }, + { + "folded": true, + "name": "slot", + "type": "number", + "value": 1 + } + ] + }, + { + "name": "uziLong", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": false + }, + { + "name": "slot", + "type": "number", + "value": 1 + } + ] + }, + { + "name": "uziLongSilencer", + "persistentUuid": "f1e60af4-7996-42a0-b4ec-fa7e985445ea", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": true + }, + { + "folded": true, + "name": "slot", + "type": "number", + "value": 1 + } + ] + }, + { + "name": "uziSilencer", + "type": "structure", + "children": [ + { + "folded": true, + "name": "active", + "type": "boolean", + "value": false + }, + { + "name": "slot", + "type": "number", + "value": 1 + } + ] + } + ] + }, + { + "folded": true, + "name": "Selected", + "type": "string", + "value": "" + }, + { + "name": "Slot", + "type": "structure", + "children": [ + { + "folded": true, + "name": "current", + "type": "number", + "value": 0 + }, + { + "name": "max", + "type": "number", + "value": 4 + } + ] + } + ] + } + ] } ], "instances": [ @@ -53905,26 +54081,6 @@ "stringProperties": [], "initialVariables": [] }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "UI", - "name": "weapon_icons", - "persistentUuid": "e1f10fa7-78d4-4f19-91f7-1e2a6439f087", - "width": 0, - "x": 1823, - "y": 32, - "zOrder": 12643489, - "numberProperties": [ - { - "name": "animation", - "value": 2 - } - ], - "stringProperties": [], - "initialVariables": [] - }, { "angle": 0, "customSize": true, @@ -54786,6 +54942,22 @@ "value": "shadow" } ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "UI", + "name": "AmmoText", + "persistentUuid": "1d0de529-1976-49aa-995b-d6a7e22f8a7c", + "width": 0, + "x": 1671, + "y": 19, + "zOrder": 12643570, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] } ], "objects": [ @@ -57486,7 +57658,18 @@ "underlined": false, "variables": [], "effects": [], - "behaviors": [], + "behaviors": [ + { + "bottomEdgeAnchor": 0, + "leftEdgeAnchor": 0, + "name": "Anchor", + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 0, + "type": "AnchorBehavior::AnchorBehavior", + "useLegacyBottomAndRightAnchors": false + } + ], "string": "Ammo: [number]", "font": "", "textAlignment": "", @@ -60079,6 +60262,7 @@ "value": "" }, { + "folded": true, "name": "Movement", "type": "structure", "children": [ @@ -60224,6 +60408,7 @@ ] }, { + "folded": true, "name": "Phone", "type": "structure", "children": [ @@ -60234,6 +60419,28 @@ "value": false } ] + }, + { + "name": "Weapons", + "type": "structure", + "children": [ + { + "name": "Active", + "type": "structure", + "children": [ + { + "name": "uziLong", + "type": "boolean", + "value": false + }, + { + "name": "uziSilencer", + "type": "boolean", + "value": false + } + ] + } + ] } ], "effects": [ @@ -61635,254 +61842,1503 @@ ] } ] - } - ], - "objectsFolderStructure": { - "folderName": "__ROOT", - "children": [ - { - "folderName": "UI", - "children": [ - { - "folderName": "weapon", - "children": [ - { - "objectName": "NewObject" - }, - { - "objectName": "weapon_icons" - } - ] - }, - { - "folderName": "phone", - "children": [ - { - "objectName": "Thumb" - }, - { - "objectName": "phoneIcons" - }, - { - "objectName": "phoneFrame" - }, - { - "objectName": "phoneMask" - }, - { - "objectName": "phoneWallpaper" - }, - { - "objectName": "phone_battery" - }, - { - "objectName": "Pointer" - }, - { - "objectName": "phone_time" - }, - { - "objectName": "phone_wifi" - } - ] - }, - { - "folderName": "debug", - "children": [ - { - "objectName": "Wheel_info" - }, - { - "objectName": "weaponholding" - }, - { - "objectName": "reloading" - }, - { - "objectName": "debugToggle" - }, - { - "objectName": "debugText" - }, - { - "objectName": "AmmoText" - } - ] - }, - { - "objectName": "crosshair" - } - ] - }, - { - "folderName": "Environment", - "children": [ - { - "folderName": "particles", - "children": [ - { - "objectName": "green_leaves_particle" - }, - { - "objectName": "brown_leaves_particle" - } - ] - }, - { - "folderName": "sports", - "children": [ - { - "folderName": "basketball", - "children": [ - { - "objectName": "sports_equipments" - }, - { - "objectName": "ground_elements" - }, - { - "objectName": "sports_equipments_movable" - } - ] - } - ] - }, - { - "folderName": "props", - "children": [ - { - "objectName": "trash_movable" - }, - { - "objectName": "deco" - }, - { - "objectName": "Fences" - }, - { - "objectName": "road_block" - }, - { - "objectName": "foliage" - } - ] - } - ] - }, - { - "folderName": "Player", - "children": [ - { - "objectName": "Body" - }, - { - "objectName": "Leg" - }, - { - "objectName": "Hand" - } - ] - }, - { - "folderName": "Land", - "children": [ - { - "objectName": "beach_sand_2" - }, - { - "objectName": "sand_1" - }, - { - "objectName": "beach_sand_1" - }, - { - "objectName": "sand_2" - }, - { - "objectName": "concrete_1" - }, - { - "objectName": "sand" - }, - { - "objectName": "grass_tiled" - }, - { - "objectName": "grass" - } - ] - }, - { - "folderName": "Road", - "children": [ - { - "objectName": "road_3" - }, - { - "objectName": "road_4" - }, - { - "objectName": "bridge" - }, - { - "objectName": "road_2" - }, - { - "objectName": "road_1" - }, - { - "objectName": "road" - } - ] - }, - { - "folderName": "Weapons", - "children": [ - { - "folderName": "particles", - "children": [ - { - "objectName": "shooting_effect_sniper" - }, - { - "objectName": "shooting_effect" - }, - { - "objectName": "shooting_effect_rocket" - }, - { - "objectName": "bullet_destroy_pistol" - }, - { - "objectName": "bullet_destroy_sniper" - }, - { - "objectName": "bullet_destroy_machine" - }, - { - "objectName": "bullet_destroy_rocket" - } - ] - }, - { - "folderName": "type", - "children": [ - { - "folderName": "melee", - "children": [ - { - "objectName": "mele1" + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "icons", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": false, + "IsDestroyedWithParent": false + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ], + "animations": [ + { + "name": "uziSilencer", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/uziSilencer.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 85, + "y": 65 }, - { - "objectName": "mele2" - } - ] - }, - { - "folderName": "gun", - "children": [ - { - "objectName": "gun1" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "uziLongSilencer", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/uziLongSilencer.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 121.5, + "y": 64.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "uziLong", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/uziLong.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 85, + "y": 65 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "uzi", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/uzi.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 52.5, + "y": 65 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "sniper", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/sniper.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 200.5, + "y": 54.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "shotgunShort", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/shotgunShort.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 98, + "y": 26 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "shotgun", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/shotgun.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 97.5, + "y": 26 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "rocketLauncherModern", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/rocketlauncherModern.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 152.5, + "y": 65 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "rocketLauncher", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/rocketlauncher.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 199.5, + "y": 71 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "pistolSilencer", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/pistolSilencer.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 79.5, + "y": 45 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "pistol", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/pistol.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 57.5, + "y": 45 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/machinegunLauncher.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 116, + "y": 51.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/machinegun.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 116.5, + "y": 52 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/knifeRound_smooth.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.5, + "y": 68.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/knifeRound_sharp.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 17.5, + "y": 68 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/knife_smooth.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 17.5, + "y": 69 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/knife_sharp.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15, + "y": 68.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/grenadeVintage.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19.5, + "y": 74 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/grenadeSmoke.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 18.5, + "y": 38.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/grenadeFlash.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 17.5, + "y": 38.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/grenade.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 22.5, + "y": 34 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/flamethrower_short.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 106.5, + "y": 41 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/flamethrower_long.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 114, + "y": 40.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 169, + "y": 1 + }, + { + "x": 169, + "y": 129 + }, + { + "x": 0, + "y": 129 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "bar", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets/weapons/icons/bar.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 112, + "y": 0 + }, + { + "x": 1807, + "y": 0 + }, + { + "x": 1807, + "y": 296 + }, + { + "x": 112, + "y": 296 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "weaponWheelSticker", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ], + "animations": [ + { + "name": "hidden_separate", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "assets\\sprite_objects\\hidden_separate-1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "folderName": "UI", + "children": [ + { + "folderName": "weapon", + "children": [ + { + "objectName": "NewObject" + }, + { + "objectName": "weapon_icons" + } + ] + }, + { + "folderName": "phone", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "phoneIcons" + }, + { + "objectName": "phoneFrame" + }, + { + "objectName": "phoneMask" + }, + { + "objectName": "phoneWallpaper" + }, + { + "objectName": "phone_battery" + }, + { + "objectName": "Pointer" + }, + { + "objectName": "phone_time" + }, + { + "objectName": "phone_wifi" + } + ] + }, + { + "folderName": "debug", + "children": [ + { + "objectName": "Wheel_info" + }, + { + "objectName": "weaponholding" + }, + { + "objectName": "reloading" + }, + { + "objectName": "debugToggle" + }, + { + "objectName": "debugText" + }, + { + "objectName": "AmmoText" + } + ] + }, + { + "objectName": "crosshair" + } + ] + }, + { + "folderName": "Environment", + "children": [ + { + "folderName": "particles", + "children": [ + { + "objectName": "green_leaves_particle" + }, + { + "objectName": "brown_leaves_particle" + } + ] + }, + { + "folderName": "sports", + "children": [ + { + "folderName": "basketball", + "children": [ + { + "objectName": "sports_equipments" + }, + { + "objectName": "ground_elements" + }, + { + "objectName": "sports_equipments_movable" + } + ] + } + ] + }, + { + "folderName": "props", + "children": [ + { + "objectName": "trash_movable" + }, + { + "objectName": "deco" + }, + { + "objectName": "Fences" + }, + { + "objectName": "road_block" + }, + { + "objectName": "foliage" + } + ] + } + ] + }, + { + "folderName": "Player", + "children": [ + { + "objectName": "Body" + }, + { + "objectName": "Leg" + }, + { + "objectName": "Hand" + } + ] + }, + { + "folderName": "Land", + "children": [ + { + "objectName": "beach_sand_2" + }, + { + "objectName": "sand_1" + }, + { + "objectName": "beach_sand_1" + }, + { + "objectName": "sand_2" + }, + { + "objectName": "concrete_1" + }, + { + "objectName": "sand" + }, + { + "objectName": "grass_tiled" + }, + { + "objectName": "grass" + } + ] + }, + { + "folderName": "Road", + "children": [ + { + "objectName": "road_3" + }, + { + "objectName": "road_4" + }, + { + "objectName": "bridge" + }, + { + "objectName": "road_2" + }, + { + "objectName": "road_1" + }, + { + "objectName": "road" + } + ] + }, + { + "folderName": "Weapons", + "children": [ + { + "folderName": "Icons", + "children": [ + { + "objectName": "icons" + }, + { + "objectName": "bar" + } + ] + }, + { + "folderName": "particles", + "children": [ + { + "objectName": "shooting_effect_sniper" + }, + { + "objectName": "shooting_effect" + }, + { + "objectName": "shooting_effect_rocket" + }, + { + "objectName": "bullet_destroy_pistol" + }, + { + "objectName": "bullet_destroy_sniper" + }, + { + "objectName": "bullet_destroy_machine" + }, + { + "objectName": "bullet_destroy_rocket" + } + ] + }, + { + "folderName": "type", + "children": [ + { + "folderName": "melee", + "children": [ + { + "objectName": "mele1" + }, + { + "objectName": "mele2" + } + ] + }, + { + "folderName": "gun", + "children": [ + { + "objectName": "gun1" }, { "objectName": "gun3" @@ -61972,6 +63428,9 @@ }, { "objectName": "hidden_separate" + }, + { + "objectName": "weaponWheelSticker" } ] } @@ -62009,7 +63468,6 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "folded": true, "name": "Links", "source": "", "type": "BuiltinCommonInstructions::Group", @@ -62428,6 +63886,16 @@ }, "stringParameters": {}, "booleanParameters": {} + }, + { + "effectType": "TiltShift", + "name": "weaponwhe", + "doubleParameters": { + "blur": 0, + "gradientBlur": 0 + }, + "stringParameters": {}, + "booleanParameters": {} } ] },